ZGlmZiAtLWdpdCBhL3Byb2dyYW1zL01ha2VmaWxlLmluIGIvcHJvZ3JhbXMvTWFrZWZpbGUuaW4KaW5kZXggYTBjNDdjNy4uNWE3M2EwOSAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvTWFrZWZpbGUuaW4KKysrIGIvcHJvZ3JhbXMvTWFrZWZpbGUuaW4KQEAgLTE3LDYgKzE3LDcgQEAKIAl1bmluc3RhbGxlciBcCiAJdmlldyBcCiAJd2NtZCBcCisJd2luZWNvbnNvbGUgXAogCXdpbmVtaW5lIFwKIAl3aW5ldGVzdCBcCiAJd2luaGVscCBcCmRpZmYgLS1naXQgYS9wcm9ncmFtcy93aW5lY29uc29sZS8uY3ZzaWdub3JlIGIvcHJvZ3JhbXMvd2luZWNvbnNvbGUvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDkwNGE5Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvd2luZWNvbnNvbGUvLmN2c2lnbm9yZQpAQCAtMCwwICsxLDMgQEAKK01ha2VmaWxlCit3aW5lY29uc29sZS5zcGVjLmMKK3dpbmVjb25zb2xlX3Jlcy5yZXMKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3dpbmVjb25zb2xlL01ha2VmaWxlLmluIGIvcHJvZ3JhbXMvd2luZWNvbnNvbGUvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcyZGU4ZgotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3dpbmVjb25zb2xlL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMTkgQEAKK0VYVFJBREVGUyA9IC1EU1RSSUNUIC1EVU5JQ09ERQorVE9QU1JDRElSID0gQHRvcF9zcmNkaXJACitUT1BPQkpESVIgPSAuLi8uLgorU1JDRElSICAgID0gQHNyY2RpckAKK1ZQQVRIICAgICA9IEBzcmNkaXJACitNT0RVTEUgICAgPSB3aW5lY29uc29sZQorCitDX1NSQ1MgPSBcCisJZGlhbG9nLmMgXAorCXVzZXIuYyBcCisgICAgICAgIHdpbmVjb25zb2xlLmMKKworUkNfU1JDUyA9IFwKKyAgICAgICAgd2luZWNvbnNvbGVfcmVzLnJjCisKK0BNQUtFX1BST0dfUlVMRVNACisKKworIyMjIERlcGVuZGVuY2llczoKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3dpbmVjb25zb2xlL2RpYWxvZy5jIGIvcHJvZ3JhbXMvd2luZWNvbnNvbGUvZGlhbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyMjBhYwotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3dpbmVjb25zb2xlL2RpYWxvZy5jCkBAIC0wLDAgKzEsNTE1IEBACisvKiBkaWFsb2cgbWFuYWdlbWVudCBmb3Igd2luZWNvbnNvbGUKKyAqIChjKSAyMDAxIEVyaWMgUG91ZWNoCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAid2luZWNvbl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29tbWN0cmwuaCIKKyNpbmNsdWRlICJwcnNodC5oIgorCisvKiBGSVhNRTogc28gZmFyLCBwYXJ0IG9mIHRoZSBjb2RlIGlzIG1hZGUgaW4gQVNDSUkgYmVjYXVzZSB0aGUgVW5jb2RlIHByb3BlcnR5IHNoZWV0IGZ1bmN0aW9ucworICogYXJlIG5vdCBpbXBsZW1lbnRlZCB5ZXQKKyAqLworc3RydWN0IGRpYWxvZ19pbmZvIAoreworICAgIHN0cnVjdCBpbm5lcl9kYXRhKglkYXRhOwkJLyogcG9pbnRlciB0byBjdXJyZW50IHdpbmVjb24gaW5mbyAqLworICAgIEhXTkQJCWhEbGc7CQkvKiBoYW5kbGUgdG8gd2luZG93IGRpYWxvZyAqLworICAgIGludAkJCW5Gb250OwkJLyogbnVtYmVyIG9mIGZvbnQgc2l6ZSBpbiBzaXplIExCICovCisgICAgc3RydWN0IGZvbnRfaW5mbyAKKyAgICB7CisJVEVYVE1FVFJJQwkJdG07CisJTE9HRk9OVAkJCWxmOworICAgIH0gCQkJKmZvbnQ7CQkvKiBhcnJheSBvZiBuRm9udC4gaW5kZXggc3luYydlZCB3aXRoIFNJWkUgTEIgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlXQ1VTRVJfT3B0aW9uRGxnUHJvYworICoKKyAqIERpYWxvZyBwcm9wIGZvciB0aGUgb3B0aW9uIHByb3BlcnR5IHNoZWV0CisgKi8KK3N0YXRpYyBCT09MIFdJTkFQSSBXQ1VTRVJfT3B0aW9uRGxnUHJvYyhIV05EIGhEbGcsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIHN0cnVjdCBkaWFsb2dfaW5mbyoJCWRpOworICAgIHVuc2lnbmVkIAkJCWlkYzsKKyAgICAKKyAgICBzd2l0Y2ggKG1zZykgCisgICAgeworICAgIGNhc2UgV01fSU5JVERJQUxPRzoKKwlkaSA9IChzdHJ1Y3QgZGlhbG9nX2luZm8qKSgoUFJPUFNIRUVUUEFHRUEqKWxQYXJhbSktPmxQYXJhbTsKKwlkaS0+aERsZyA9IGhEbGc7CisJU2V0V2luZG93TG9uZ0EoaERsZywgRFdMX1VTRVIsIChEV09SRClkaSk7CisJaWYgKGRpLT5kYXRhLT5jdXJzb3Jfc2l6ZSA8IDMzKQkJaWRjID0gSURDX09QVF9DVVJTT1JfU01BTEw7CisJZWxzZSBpZiAoZGktPmRhdGEtPmN1cnNvcl9zaXplIDwgNjYpCWlkYyA9IElEQ19PUFRfQ1VSU09SX01FRElVTTsKKwllbHNlCQkJCQlpZGMgPSBJRENfT1BUX0NVUlNPUl9MQVJHRTsKKwlTZW5kRGxnSXRlbU1lc3NhZ2UoaERsZywgaWRjLCBCTV9TRVRDSEVDSywgQlNUX0NIRUNLRUQsIDBMKTsKKwlTZXREbGdJdGVtSW50KGhEbGcsIElEQ19PUFRfSElTVF9TSVpFLCBXSU5FQ09OX0dldEhpc3RvcnlTaXplKGRpLT5kYXRhLT5oQ29uSW4pLCAgRkFMU0UpOworCWlmIChXSU5FQ09OX0dldEhpc3RvcnlNb2RlKGRpLT5kYXRhLT5oQ29uSW4pKQorCSAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaERsZywgSURDX09QVF9ISVNUX0RPVUJMRSwgQk1fU0VUQ0hFQ0ssIEJTVF9DSEVDS0VELCAwTCk7CisJcmV0dXJuIEZBTFNFOyAvKiBiZWNhdXNlIHdlIHNldCB0aGUgZm9jdXMgKi8KKyAgICBjYXNlIFdNX0NPTU1BTkQ6CisJYnJlYWs7CisgICAgY2FzZSBXTV9OT1RJRlk6CisgICAgeworCU5NSERSKglubWhkciA9IChOTUhEUiopbFBhcmFtOworCisJZGkgPSAoc3RydWN0IGRpYWxvZ19pbmZvKilHZXRXaW5kb3dMb25nQShoRGxnLCBEV0xfVVNFUik7CisJc3dpdGNoIChubWhkci0+Y29kZSkgCisJeworCWNhc2UgUFNOX1NFVEFDVElWRToKKwkgICAgLyogbmVlZGVkIGluIHByb3BzaGVldCB0byBrZWVwIHByb3Blcmx5IHRoZSBzZWxlY3RlZCByYWRpbyBidXR0b24KKwkgICAgICogb3RoZXJ3aXNlLCB0aGUgZm9jdXMgd291bGQgYmUgc2V0IHRvIHRoZSBmaXJzdCB0YWIgc3RvcCBpbiB0aGUKKwkgICAgICogcHJvcHNoZWV0LCB3aGljaCB3b3VsZCBhbHdheXMgYWN0aXZhdGUgdGhlIGZpcnN0IHJhZGlvIGJ1dHRvbgorCSAgICAgKi8KKwkgICAgaWYgKElzRGxnQnV0dG9uQ2hlY2tlZChoRGxnLCBJRENfT1BUX0NVUlNPUl9TTUFMTCkgPT0gQlNUX0NIRUNLRUQpIAorCQlpZGMgPSBJRENfT1BUX0NVUlNPUl9TTUFMTDsKKwkgICAgZWxzZSBpZiAoSXNEbGdCdXR0b25DaGVja2VkKGhEbGcsIElEQ19PUFRfQ1VSU09SX01FRElVTSkgPT0gQlNUX0NIRUNLRUQpCisJCWlkYyA9IElEQ19PUFRfQ1VSU09SX01FRElVTTsKKwkgICAgZWxzZQorCQlpZGMgPSBJRENfT1BUX0NVUlNPUl9MQVJHRTsKKwkgICAgUG9zdE1lc3NhZ2UoaERsZywgV01fTkVYVERMR0NUTCwgKFdQQVJBTSlHZXREbGdJdGVtKGhEbGcsIGlkYyksIFRSVUUpOworCSAgICBicmVhazsKKwljYXNlIFBTTl9BUFBMWToKKwl7CisJICAgIGludAkJY3Vyc19zaXplOworCSAgICBpbnQJCWhpc3Rfc2l6ZTsKKwkgICAgQk9PTAlkb25lOworCisJICAgIGlmIChJc0RsZ0J1dHRvbkNoZWNrZWQoaERsZywgSURDX09QVF9DVVJTT1JfU01BTEwpID09IEJTVF9DSEVDS0VEKQljdXJzX3NpemUgPSAzMzsKKwkgICAgZWxzZSBpZiAoSXNEbGdCdXR0b25DaGVja2VkKGhEbGcsIElEQ19PUFRfQ1VSU09SX01FRElVTSkgPT0gQlNUX0NIRUNLRUQpIGN1cnNfc2l6ZSA9IDY2OworCSAgICBlbHNlIGN1cnNfc2l6ZSA9IDk5OworCSAgICBpZiAoY3Vyc19zaXplICE9IGRpLT5kYXRhLT5jdXJzb3Jfc2l6ZSkKKwkgICAgeworCQlDT05TT0xFX0NVUlNPUl9JTkZPIGNpbmZvOworCQljaW5mby5kd1NpemUgPSBjdXJzX3NpemU7CisJCWNpbmZvLmJWaXNpYmxlID0gZGktPmRhdGEtPmN1cnNvcl92aXNpYmxlOworCQlTZXRDb25zb2xlQ3Vyc29ySW5mbyhkaS0+ZGF0YS0+aENvbk91dCwgJmNpbmZvKTsKKwkgICAgfQorCSAgICBoaXN0X3NpemUgPSBHZXREbGdJdGVtSW50KGhEbGcsIElEQ19PUFRfSElTVF9TSVpFLCAmZG9uZSwgRkFMU0UpOworCSAgICBpZiAoZG9uZSkgV0lORUNPTl9TZXRIaXN0b3J5U2l6ZShkaS0+ZGF0YS0+aENvbkluLCBoaXN0X3NpemUpOworCSAgICBTZXRXaW5kb3dMb25nKGhEbGcsIERXTF9NU0dSRVNVTFQsIFBTTlJFVF9OT0VSUk9SKTsKKwkgICAgV0lORUNPTl9TZXRIaXN0b3J5TW9kZShkaS0+ZGF0YS0+aENvbkluLCAKKwkJCQkgICBJc0RsZ0J1dHRvbkNoZWNrZWQoaERsZywgSURDX09QVF9ISVNUX0RPVUJMRSkgJiBCU1RfQ0hFQ0tFRCk7CisJICAgIHJldHVybiBUUlVFOworCX0KKwlkZWZhdWx0OgorCSAgICByZXR1cm4gRkFMU0U7CisJfQorCWJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorCXJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlXQ1VTRVJfRm9udFByZXZpZXdQcm9jCisgKgorICogV2luZG93IHByb2MgZm9yIGZvbnQgcHJldmlld2VyIGluIGZvbnQgcHJvcGVydHkgc2hlZXQKKyAqLworc3RhdGljIExSRVNVTFQgV0lOQVBJIFdDVVNFUl9Gb250UHJldmlld1Byb2MoSFdORCBoV25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBzd2l0Y2ggKG1zZykKKyAgICB7CisgICAgY2FzZSBXTV9QQUlOVDoKKyAgICB7CisJUEFJTlRTVFJVQ1QJcHM7CisJaW50CQlmb250X2lkeDsKKwlpbnQJCXNpemVfaWR4OworCXN0cnVjdCBkaWFsb2dfaW5mbyoJZGk7CisKKwlkaSA9IChzdHJ1Y3QgZGlhbG9nX2luZm8qKUdldFdpbmRvd0xvbmcoR2V0UGFyZW50KGhXbmQpLCBEV0xfVVNFUik7CisJQmVnaW5QYWludChoV25kLCAmcHMpOworCQorCWZvbnRfaWR4ID0gU2VuZERsZ0l0ZW1NZXNzYWdlKGRpLT5oRGxnLCBJRENfRk5UX0xJU1RfRk9OVCwgTEJfR0VUQ1VSU0VMLCAwTCwgMEwpOworCXNpemVfaWR4ID0gU2VuZERsZ0l0ZW1NZXNzYWdlKGRpLT5oRGxnLCBJRENfRk5UX0xJU1RfU0laRSwgTEJfR0VUQ1VSU0VMLCAwTCwgMEwpOworCisJaWYgKGZvbnRfaWR4ID49IDAgJiYgc2l6ZV9pZHggPj0gMCAmJiBzaXplX2lkeCA8IGRpLT5uRm9udCkKKwl7CisJICAgIEhGT05UCWhGb250LCBoT2xkRm9udDsKKwkgICAgV0NIQVIJYnVmMVsyNTZdOworCSAgICBXQ0hBUglidWYyWzI1Nl07CisJICAgIGludAkJbGVuMSwgbGVuMjsKKworCSAgICBoRm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdCgmZGktPmZvbnRbc2l6ZV9pZHhdLmxmKTsKKwkgICAgbGVuMSA9IExvYWRTdHJpbmcoR2V0TW9kdWxlSGFuZGxlKE5VTEwpLCBJRFNfRk5UX1BSRVZJRVdfMSwgCisJCQkgICAgICBidWYxLCBzaXplb2YoYnVmMSkgLyBzaXplb2YoV0NIQVIpKTsKKwkgICAgbGVuMiA9IExvYWRTdHJpbmcoR2V0TW9kdWxlSGFuZGxlKE5VTEwpLCBJRFNfRk5UX1BSRVZJRVdfMiwKKwkJCSAgICAgIGJ1ZjIsIHNpemVvZihidWYyKSAvIHNpemVvZihXQ0hBUikpOworCSAgICBpZiAoaEZvbnQgJiYgbGVuMSkKKwkgICAgeworCQloT2xkRm9udCA9IFNlbGVjdE9iamVjdChwcy5oZGMsIGhGb250KTsKKwkJU2V0QmtDb2xvcihwcy5oZGMsIFJHQigweDAwLCAweDAwLCAweDAwKSk7CisJCVNldFRleHRDb2xvcihwcy5oZGMsIFJHQigweEZGLCAweEZGLCAweEZGKSk7CisJCVRleHRPdXQocHMuaGRjLCAwLCAwLCBidWYxLCBsZW4xKTsKKwkJaWYgKGxlbjIpCisJCSAgICBUZXh0T3V0KHBzLmhkYywgMCwgZGktPmZvbnRbc2l6ZV9pZHhdLnRtLnRtSGVpZ2h0LCBidWYyLCBsZW4yKTsKKwkJU2VsZWN0T2JqZWN0KHBzLmhkYywgaE9sZEZvbnQpOworCQlEZWxldGVPYmplY3QoaEZvbnQpOworCSAgICB9CisJfQorCUVuZFBhaW50KGhXbmQsICZwcyk7CisJYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisJcmV0dXJuIERlZldpbmRvd1Byb2MoaFduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgfQorICAgIHJldHVybiAwTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCWZvbnRfZW51bQorICoKKyAqCisgKi8KK3N0YXRpYyBpbnQgQ0FMTEJBQ0sgZm9udF9lbnVtX3NpemUyKGNvbnN0IExPR0ZPTlQqIGxmLCBjb25zdCBURVhUTUVUUklDKiB0bSwgCisJCQkJICAgIERXT1JEIEZvbnRUeXBlLCBMUEFSQU0gbFBhcmFtKQoreworICAgIHN0cnVjdCBkaWFsb2dfaW5mbyoJZGkgPSAoc3RydWN0IGRpYWxvZ19pbmZvKilsUGFyYW07CisKKyAgICBpZiAoV0NVU0VSX1ZhbGlkYXRlRm9udE1ldHJpYyhkaS0+ZGF0YSwgdG0pKQorICAgIHsKKwlkaS0+bkZvbnQrKzsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgQ0FMTEJBQ0sgZm9udF9lbnVtKGNvbnN0IExPR0ZPTlQqIGxmLCBjb25zdCBURVhUTUVUUklDKiB0bSwgCisJCQkgICAgICBEV09SRCBGb250VHlwZSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBzdHJ1Y3QgZGlhbG9nX2luZm8qCWRpID0gKHN0cnVjdCBkaWFsb2dfaW5mbyopbFBhcmFtOworICAgIEhEQwloZGM7CisKKyAgICBpZiAoV0NVU0VSX1ZhbGlkYXRlRm9udChkaS0+ZGF0YSwgbGYpICYmIChoZGMgPSBHZXREQyhkaS0+aERsZykpKQorICAgIHsKKwlkaS0+bkZvbnQgPSAwOworCUVudW1Gb250RmFtaWxpZXMoaGRjLCBsZi0+bGZGYWNlTmFtZSwgZm9udF9lbnVtX3NpemUyLCAoTFBBUkFNKWRpKTsKKwlpZiAoZGktPm5Gb250KQorCXsKKwkgICAgaW50IGlkeDsKKwkgICAgaWR4ID0gU2VuZERsZ0l0ZW1NZXNzYWdlKGRpLT5oRGxnLCBJRENfRk5UX0xJU1RfRk9OVCwgTEJfQUREU1RSSU5HLCAKKwkJCQkgICAgIDAsIChMUEFSQU0pbGYtPmxmRmFjZU5hbWUpOworCX0KKwlSZWxlYXNlREMoZGktPmhEbGcsIGhkYyk7CisgICAgfQorICAgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJZm9udF9lbnVtX3NpemUKKyAqCisgKgorICovCitzdGF0aWMgaW50IENBTExCQUNLIGZvbnRfZW51bV9zaXplKGNvbnN0IExPR0ZPTlQqIGxmLCBjb25zdCBURVhUTUVUUklDKiB0bSwgCisJCQkJICAgRFdPUkQgRm9udFR5cGUsIExQQVJBTSBsUGFyYW0pCit7CisgICAgc3RydWN0IGRpYWxvZ19pbmZvKglkaSA9IChzdHJ1Y3QgZGlhbG9nX2luZm8qKWxQYXJhbTsKKworICAgIGlmIChXQ1VTRVJfVmFsaWRhdGVGb250TWV0cmljKGRpLT5kYXRhLCB0bSkpCisgICAgeworCVdDSEFSCWJ1ZlszMl07CisJV0NIQVIJZm10W10gPSB7JyUnLCdsJywnZCcsMH07CisJaW50CWlkeDsKKworCS8qIHdlIHdhbnQgdGhlIHN0cmluZyB0byBiZSBzb3J0ZWQgd2l0aCBhIG51bWVyaWMgb3JkZXIsIG5vdCBhIGxleGljb2dyYXBoaWMuLi4KKwkgKiBkbyB0aGUgam9iIGJ5IGhhbmQuLi4gZ2V0IHdoZXJlIHRvIGluc2VydCB0aGUgbmV3IHN0cmluZworCSAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgZGktPm5Gb250ICYmIHRtLT50bUhlaWdodCA+IGRpLT5mb250W2lkeF0udG0udG1IZWlnaHQ7IGlkeCsrKTsKKwl3c3ByaW50ZlcoYnVmLCBmbXQsIHRtLT50bUhlaWdodCk7CisJU2VuZERsZ0l0ZW1NZXNzYWdlKGRpLT5oRGxnLCBJRENfRk5UX0xJU1RfU0laRSwgTEJfSU5TRVJUU1RSSU5HLCBpZHgsIChMUEFSQU0pYnVmKTsKKworCS8qIG5vdyBncm93IG91ciBhcnJheXMgYW5kIGluc2VydCB0byB2YWx1ZXMgYXQgdGhlIHNhbWUgaW5kZXggdGhhbiBpbiB0aGUgbGlzdCBib3ggKi8KKwlkaS0+Zm9udCA9IEhlYXBSZUFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGRpLT5mb250LCBzaXplb2YoKmRpLT5mb250KSAqIChkaS0+bkZvbnQgKyAxKSk7CisJaWYgKGlkeCAhPSBkaS0+bkZvbnQpCisJICAgIG1lbW1vdmUoJmRpLT5mb250W2lkeCArIDFdLCAmZGktPmZvbnRbaWR4XSwgKGRpLT5uRm9udCAtIGlkeCkgKiBzaXplb2YoKmRpLT5mb250KSk7CisJZGktPmZvbnRbaWR4XS50bSA9ICp0bTsKKwlkaS0+Zm9udFtpZHhdLmxmID0gKmxmOworCWRpLT5uRm9udCsrOworCisgICAgfQorICAgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJc2VsZWN0X2ZvbnQKKyAqCisgKgorICovCitzdGF0aWMgQk9PTCAgc2VsZWN0X2ZvbnQoc3RydWN0IGRpYWxvZ19pbmZvKiBkaSkKK3sKKyAgICBpbnQJCWlkeCA9IFNlbmREbGdJdGVtTWVzc2FnZShkaS0+aERsZywgSURDX0ZOVF9MSVNUX1NJWkUsIExCX0dFVENVUlNFTCwgMEwsIDBMKTsKKyAgICBXQ0hBUglidWZbMjU2XTsKKyAgICBXQ0hBUglmbXRbMTI4XTsKKworICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBkaS0+bkZvbnQpCisJcmV0dXJuIEZBTFNFOworCisgICAgTG9hZFN0cmluZyhHZXRNb2R1bGVIYW5kbGUoTlVMTCksIElEU19GTlRfRElTUExBWSwgZm10LCBzaXplb2YoZm10KSAvIHNpemVvZihXQ0hBUikpOworICAgIHdzcHJpbnRmVyhidWYsIGZtdCwgZGktPmZvbnRbaWR4XS50bS50bU1heENoYXJXaWR0aCwgZGktPmZvbnRbaWR4XS50bS50bUhlaWdodCk7CisKKyAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoZGktPmhEbGcsIElEQ19GTlRfRk9OVF9JTkZPLCBXTV9TRVRURVhULCAwLCAoTFBBUkFNKWJ1Zik7CisgICAgSW52YWxpZGF0ZVJlY3QoR2V0RGxnSXRlbShkaS0+aERsZywgSURDX0ZOVF9QUkVWSUVXKSwgTlVMTCwgVFJVRSk7CisgICAgVXBkYXRlV2luZG93KEdldERsZ0l0ZW0oZGktPmhEbGcsIElEQ19GTlRfUFJFVklFVykpOworICAgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJZmlsbF9saXN0X3NpemUKKyAqCisgKiBmaWxscyB0aGUgc2l6ZSBsaXN0IGJveCBhY2NvcmRpbmcgdG8gc2VsZWN0ZWQgZmFtaWx5IGluIGZvbnQgTEIKKyAqLworc3RhdGljIEJPT0wgIGZpbGxfbGlzdF9zaXplKHN0cnVjdCBkaWFsb2dfaW5mbyogZGksIEJPT0wgZG9Jbml0KQoreworICAgIEhEQyAJaGRjOworICAgIGludAkJaWR4OworICAgIFdDSEFSCWxmRmFjZU5hbWVbTEZfRkFDRVNJWkVdOworCisgICAgaWR4ID0gU2VuZERsZ0l0ZW1NZXNzYWdlKGRpLT5oRGxnLCBJRENfRk5UX0xJU1RfRk9OVCwgTEJfR0VUQ1VSU0VMLCAwTCwgMEwpOworICAgIGlmIChpZHggPCAwKSByZXR1cm4gRkFMU0U7CisgICAgCisgICAgaGRjID0gR2V0REMoZGktPmhEbGcpOworICAgIGlmICghaGRjKSByZXR1cm4gRkFMU0U7CisKKyAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoZGktPmhEbGcsIElEQ19GTlRfTElTVF9GT05ULCBMQl9HRVRURVhULCBpZHgsIChMUEFSQU0pbGZGYWNlTmFtZSk7CisgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGRpLT5oRGxnLCBJRENfRk5UX0xJU1RfU0laRSwgTEJfUkVTRVRDT05URU5ULCAwTCwgMEwpOworICAgIGlmIChkaS0+Zm9udCkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGktPmZvbnQpOworICAgIGRpLT5uRm9udCA9IDA7CisgICAgZGktPmZvbnQgPSBOVUxMOworCisgICAgRW51bUZvbnRGYW1pbGllcyhoZGMsIGxmRmFjZU5hbWUsIGZvbnRfZW51bV9zaXplLCAoTFBBUkFNKWRpKTsKKyAgICBSZWxlYXNlREMoZGktPmhEbGcsIGhkYyk7CisKKyAgICBpZiAoZG9Jbml0KQorICAgIHsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGRpLT5uRm9udDsgaWR4KyspCisJeworCSAgICBpZiAobWVtY21wKCZkaS0+ZGF0YS0+bG9nRm9udCwgJmRpLT5mb250W2lkeF0ubGYsIHNpemVvZihMT0dGT05UKSkgPT0gMCkKKwkJYnJlYWs7CisJfQorCWlmIChpZHggPT0gZGktPm5Gb250KSBpZHggPSAwOworICAgIH0KKyAgICBlbHNlCisJaWR4ID0gMDsKKyAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoZGktPmhEbGcsIElEQ19GTlRfTElTVF9TSVpFLCBMQl9TRVRDVVJTRUwsIGlkeCwgMEwpOworICAgIHNlbGVjdF9mb250KGRpKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCWZpbGxfbGlzdF9mb250CisgKgorICogRmlsbHMgdGhlIGZvbnQgTEIKKyAqLworc3RhdGljIEJPT0wgZmlsbF9saXN0X2ZvbnQoc3RydWN0IGRpYWxvZ19pbmZvKiBkaSkKK3sKKyAgICBIREMgaGRjOworCisgICAgaGRjID0gR2V0REMoZGktPmhEbGcpOworICAgIGlmICghaGRjKSByZXR1cm4gRkFMU0U7CisKKyAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoZGktPmhEbGcsIElEQ19GTlRfTElTVF9GT05ULCBMQl9SRVNFVENPTlRFTlQsIDBMLCAwTCk7CisgICAgRW51bUZvbnRGYW1pbGllcyhoZGMsIE5VTEwsIGZvbnRfZW51bSwgKExQQVJBTSlkaSk7CisgICAgUmVsZWFzZURDKGRpLT5oRGxnLCBoZGMpOworICAgIGlmIChTZW5kRGxnSXRlbU1lc3NhZ2UoZGktPmhEbGcsIElEQ19GTlRfTElTVF9GT05ULCBMQl9TRUxFQ1RTVFJJTkcsIAorCQkJICAgKFdQQVJBTSktMSwgKExQQVJBTSlkaS0+ZGF0YS0+bG9nRm9udC5sZkZhY2VOYW1lKSA9PSBMQl9FUlIpCisJU2VuZERsZ0l0ZW1NZXNzYWdlKGRpLT5oRGxnLCBJRENfRk5UX0xJU1RfRk9OVCwgTEJfU0VUQ1VSU0VMLCAwTCwgMEwpOworICAgIGZpbGxfbGlzdF9zaXplKGRpLCBUUlVFKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCVdDVVNFUl9Gb250RGxnUHJvYworICoKKyAqIERpYWxvZyBwcm9jIGZvciB0aGUgRm9udCBwcm9wZXJ0eSBzaGVldAorICovCitzdGF0aWMgQk9PTCBXSU5BUEkgV0NVU0VSX0ZvbnREbGdQcm9jKEhXTkQgaERsZywgVUlOVCBtc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgc3RydWN0IGRpYWxvZ19pbmZvKgkJZGk7CisKKyAgICBzd2l0Y2ggKG1zZykgCisgICAgeworICAgIGNhc2UgV01fSU5JVERJQUxPRzoKKwlkaSA9IChzdHJ1Y3QgZGlhbG9nX2luZm8qKSgoUFJPUFNIRUVUUEFHRUEqKWxQYXJhbSktPmxQYXJhbTsKKwlkaS0+aERsZyA9IGhEbGc7CisJU2V0V2luZG93TG9uZyhoRGxnLCBEV0xfVVNFUiwgKERXT1JEKWRpKTsKKwlmaWxsX2xpc3RfZm9udChkaSk7CisJYnJlYWs7CisgICAgY2FzZSBXTV9DT01NQU5EOgorCWRpID0gKHN0cnVjdCBkaWFsb2dfaW5mbyopR2V0V2luZG93TG9uZyhoRGxnLCBEV0xfVVNFUik7CisJc3dpdGNoIChMT1dPUkQod1BhcmFtKSkgCisJeworCWNhc2UgSURDX0ZOVF9MSVNUX0ZPTlQ6CQorCSAgICBpZiAoSElXT1JEKHdQYXJhbSkgPT0gTEJOX1NFTENIQU5HRSkKKwkgICAgeworCQlmaWxsX2xpc3Rfc2l6ZShkaSwgRkFMU0UpOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgSURDX0ZOVF9MSVNUX1NJWkU6CQorCSAgICBpZiAoSElXT1JEKHdQYXJhbSkgPT0gTEJOX1NFTENIQU5HRSkKKwkgICAgeworCQlzZWxlY3RfZm9udChkaSk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorCWJyZWFrOworICAgIGNhc2UgV01fTk9USUZZOgorICAgIHsKKwlOTUhEUioJbm1oZHIgPSAoTk1IRFIqKWxQYXJhbTsKKworCWRpID0gKHN0cnVjdCBkaWFsb2dfaW5mbyopR2V0V2luZG93TG9uZyhoRGxnLCBEV0xfVVNFUik7CisJc3dpdGNoIChubWhkci0+Y29kZSkgCisJeworCWNhc2UgUFNOX0FQUExZOgorCXsKKwkgICAgaW50IGlkeCA9IFNlbmREbGdJdGVtTWVzc2FnZShkaS0+aERsZywgSURDX0ZOVF9MSVNUX1NJWkUsIExCX0dFVENVUlNFTCwgMEwsIDBMKTsKKworCSAgICBpZiAoaWR4ID49IDAgJiYgaWR4IDwgZGktPm5Gb250KQorCSAgICB7CisJCVdDVVNFUl9TZXRGb250KGRpLT5kYXRhLCAmZGktPmZvbnRbaWR4XS5sZiwgJmRpLT5mb250W2lkeF0udG0pOworCSAgICB9CisJICAgIFNldFdpbmRvd0xvbmcoaERsZywgRFdMX01TR1JFU1VMVCwgUFNOUkVUX05PRVJST1IpOworCSAgICByZXR1cm4gVFJVRTsKKwl9CisJZGVmYXVsdDoKKwkgICAgcmV0dXJuIEZBTFNFOworCX0KKwlicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJV0NVU0VSX0NvbmZpZ0RsZ1Byb2MKKyAqCisgKiBEaWFsb2cgcHJvYyBmb3IgdGhlIGNvbmZpZyBwcm9wZXJ0eSBzaGVldAorICovCitzdGF0aWMgQk9PTCBXSU5BUEkgV0NVU0VSX0NvbmZpZ0RsZ1Byb2MoSFdORCBoRGxnLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBzdHJ1Y3QgZGlhbG9nX2luZm8qCQlkaTsKKworICAgIHN3aXRjaCAobXNnKSAKKyAgICB7CisgICAgY2FzZSBXTV9JTklURElBTE9HOgorCWRpID0gKHN0cnVjdCBkaWFsb2dfaW5mbyopKChQUk9QU0hFRVRQQUdFQSopbFBhcmFtKS0+bFBhcmFtOworCWRpLT5oRGxnID0gaERsZzsKKwlTZXRXaW5kb3dMb25nKGhEbGcsIERXTF9VU0VSLCAoRFdPUkQpZGkpOworCVNldERsZ0l0ZW1JbnQoaERsZywgSURDX0NORl9TQl9XSURUSCwgICBkaS0+ZGF0YS0+c2Jfd2lkdGgsICAgRkFMU0UpOworCVNldERsZ0l0ZW1JbnQoaERsZywgSURDX0NORl9TQl9IRUlHSFQsICBkaS0+ZGF0YS0+c2JfaGVpZ2h0LCAgRkFMU0UpOworCVNldERsZ0l0ZW1JbnQoaERsZywgSURDX0NORl9XSU5fV0lEVEgsICBkaS0+ZGF0YS0+d2luX3dpZHRoLCAgRkFMU0UpOworCVNldERsZ0l0ZW1JbnQoaERsZywgSURDX0NORl9XSU5fSEVJR0hULCBkaS0+ZGF0YS0+d2luX2hlaWdodCwgRkFMU0UpOworCWJyZWFrOworICAgIGNhc2UgV01fQ09NTUFORDoKKwlkaSA9IChzdHJ1Y3QgZGlhbG9nX2luZm8qKUdldFdpbmRvd0xvbmcoaERsZywgRFdMX1VTRVIpOworCXN3aXRjaCAoTE9XT1JEKHdQYXJhbSkpIAorCXsKKwl9CisJYnJlYWs7CisgICAgY2FzZSBXTV9OT1RJRlk6CisgICAgeworCU5NSERSKglubWhkciA9IChOTUhEUiopbFBhcmFtOworCisJZGkgPSAoc3RydWN0IGRpYWxvZ19pbmZvKilHZXRXaW5kb3dMb25nKGhEbGcsIERXTF9VU0VSKTsKKwlzd2l0Y2ggKG5taGRyLT5jb2RlKSAKKwl7CisJY2FzZSBQU05fQVBQTFk6CisJeworCSAgICBDT09SRAlzYjsKKwkgICAgU01BTExfUkVDVAlwb3M7CisJICAgIEJPT0wJc3Rfdywgc3RfaDsKKworCSAgICBzYi5YID0gR2V0RGxnSXRlbUludChoRGxnLCBJRENfQ05GX1NCX1dJRFRILCAgJnN0X3csIEZBTFNFKTsKKwkgICAgc2IuWSA9IEdldERsZ0l0ZW1JbnQoaERsZywgSURDX0NORl9TQl9IRUlHSFQsICZzdF9oLCBGQUxTRSk7CisJICAgIGlmIChzdF93ICYmIHN0X2ggJiYgKHNiLlggIT0gZGktPmRhdGEtPnNiX3dpZHRoIHx8IHNiLlkgIT0gZGktPmRhdGEtPnNiX2hlaWdodCkpCisJICAgIHsKKwkJU2V0Q29uc29sZVNjcmVlbkJ1ZmZlclNpemUoZGktPmRhdGEtPmhDb25PdXQsIHNiKTsKKwkgICAgfQorCisJICAgIHBvcy5SaWdodCAgPSBHZXREbGdJdGVtSW50KGhEbGcsIElEQ19DTkZfV0lOX1dJRFRILCAgJnN0X3csIEZBTFNFKTsKKwkgICAgcG9zLkJvdHRvbSA9IEdldERsZ0l0ZW1JbnQoaERsZywgSURDX0NORl9XSU5fSEVJR0hULCAmc3RfaCwgRkFMU0UpOworCSAgICBpZiAoc3RfdyAmJiBzdF9oICYmIAorCQkocG9zLlJpZ2h0ICE9IGRpLT5kYXRhLT53aW5fd2lkdGggfHwgcG9zLkJvdHRvbSAhPSBkaS0+ZGF0YS0+d2luX2hlaWdodCkpCisJICAgIHsKKwkJcG9zLkxlZnQgPSBwb3MuVG9wID0gMDsKKwkJcG9zLlJpZ2h0LS07IHBvcy5Cb3R0b20tLTsKKwkJU2V0Q29uc29sZVdpbmRvd0luZm8oZGktPmRhdGEtPmhDb25PdXQsIEZBTFNFLCAmcG9zKTsKKwkgICAgfQorCisJICAgIFNldFdpbmRvd0xvbmcoaERsZywgRFdMX01TR1JFU1VMVCwgUFNOUkVUX05PRVJST1IpOworCSAgICByZXR1cm4gVFJVRTsKKwl9CisJZGVmYXVsdDoKKwkgICAgcmV0dXJuIEZBTFNFOworCX0KKwlicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJV0NVU0VSX0dldFByb3BlcnRpZXMKKyAqCisgKiBSdW5zIHRoZSBkaWFsb2cgYm94IHRvIHNldCB1cCB0aGUgd2luY29uc29sZSBvcHRpb25zCisgKi8KK0JPT0wgV0NVU0VSX0dldFByb3BlcnRpZXMoc3RydWN0IGlubmVyX2RhdGEqIGRhdGEpCit7CisgICAgSFBST1BTSEVFVFBBR0UJcHNQYWdlWzNdOworICAgIFBST1BTSEVFVFBBR0VBCXBzcDsKKyAgICBQUk9QU0hFRVRIRUFERVJBCXBzSGVhZDsKKyAgICBXTkRDTEFTUwkJd25kY2xhc3M7CisgICAgc3RhdGljIFdDSEFSCXN6Rm50UHJldmlld1tdID0geydXJywnaScsJ24nLCdlJywnQycsJ28nLCduJywnRicsJ28nLCduJywndCcsJ1AnLCdyJywnZScsJ3YnLCdpJywnZScsJ3cnLDB9OworICAgIHN0cnVjdCBkaWFsb2dfaW5mbwlkaTsKKworICAgIEluaXRDb21tb25Db250cm9scygpOworCisgICAgZGkuZGF0YSA9IGRhdGE7CisgICAgZGkubkZvbnQgPSAwOworICAgIGRpLmZvbnQgPSBOVUxMOworCisgICAgd25kY2xhc3Muc3R5bGUgICAgICAgICA9IDA7CisgICAgd25kY2xhc3MubHBmblduZFByb2MgICA9IFdDVVNFUl9Gb250UHJldmlld1Byb2M7CisgICAgd25kY2xhc3MuY2JDbHNFeHRyYSAgICA9IDA7CisgICAgd25kY2xhc3MuY2JXbmRFeHRyYSAgICA9IDA7CisgICAgd25kY2xhc3MuaEluc3RhbmNlICAgICA9IEdldE1vZHVsZUhhbmRsZShOVUxMKTsKKyAgICB3bmRjbGFzcy5oSWNvbiAgICAgICAgID0gMDsKKyAgICB3bmRjbGFzcy5oQ3Vyc29yICAgICAgID0gTG9hZEN1cnNvcigwLCBJRENfQVJST1cpOworICAgIHduZGNsYXNzLmhickJhY2tncm91bmQgPSBHZXRTdG9ja09iamVjdChCTEFDS19CUlVTSCk7CisgICAgd25kY2xhc3MubHBzek1lbnVOYW1lICA9IE5VTEw7CisgICAgd25kY2xhc3MubHBzekNsYXNzTmFtZSA9IHN6Rm50UHJldmlldzsKKyAgICBSZWdpc3RlckNsYXNzKCZ3bmRjbGFzcyk7CisKKyAgICBtZW1zZXQoJnBzcCwgMCwgc2l6ZW9mKHBzcCkpOworICAgIHBzcC5kd1NpemUgPSBzaXplb2YocHNwKTsKKyAgICBwc3AuZHdGbGFncyA9IDA7CisgICAgcHNwLmhJbnN0YW5jZSA9IHduZGNsYXNzLmhJbnN0YW5jZTsKKyAgICBwc3AubFBhcmFtID0gKExQQVJBTSkmZGk7CisKKyAgICBwc3AudS5wc3pUZW1wbGF0ZSA9IE1BS0VJTlRSRVNPVVJDRUEoSUREX09QVElPTik7CisgICAgcHNwLnBmbkRsZ1Byb2MgPSBXQ1VTRVJfT3B0aW9uRGxnUHJvYzsKKyAgICBwc1BhZ2VbMF0gPSBDcmVhdGVQcm9wZXJ0eVNoZWV0UGFnZUEoJnBzcCk7CisKKyAgICBwc3AudS5wc3pUZW1wbGF0ZSA9IE1BS0VJTlRSRVNPVVJDRUEoSUREX0ZPTlQpOworICAgIHBzcC5wZm5EbGdQcm9jID0gV0NVU0VSX0ZvbnREbGdQcm9jOworICAgIHBzUGFnZVsxXSA9IENyZWF0ZVByb3BlcnR5U2hlZXRQYWdlQSgmcHNwKTsKKworICAgIHBzcC51LnBzelRlbXBsYXRlID0gTUFLRUlOVFJFU09VUkNFQShJRERfQ09ORklHKTsKKyAgICBwc3AucGZuRGxnUHJvYyA9IFdDVVNFUl9Db25maWdEbGdQcm9jOworICAgIHBzUGFnZVsyXSA9IENyZWF0ZVByb3BlcnR5U2hlZXRQYWdlQSgmcHNwKTsKKworICAgIG1lbXNldCgmcHNIZWFkLCAwLCBzaXplb2YocHNIZWFkKSk7CisgICAgcHNIZWFkLmR3U2l6ZSA9IHNpemVvZihwc0hlYWQpOworICAgIHBzSGVhZC5wc3pDYXB0aW9uID0gIlNldHVwIjsKKyAgICBwc0hlYWQublBhZ2VzID0gMzsKKyAgICBwc0hlYWQuaHduZFBhcmVudCA9IGRhdGEtPmhXbmQ7CisgICAgcHNIZWFkLnUzLnBocGFnZSA9IHBzUGFnZTsKKyAKKyAgICBQcm9wZXJ0eVNoZWV0QSgmcHNIZWFkKTsKKworICAgIHJldHVybiBUUlVFOworfQorCmRpZmYgLS1naXQgYS9wcm9ncmFtcy93aW5lY29uc29sZS91c2VyLmMgYi9wcm9ncmFtcy93aW5lY29uc29sZS91c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyNWM2NgotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3dpbmVjb25zb2xlL3VzZXIuYwpAQCAtMCwwICsxLDk1NyBAQAorLyoKKyAqIGEgR1VJIGFwcGxpY2F0aW9uIGZvciBkaXNwbGF5aW5nIGEgY29uc29sZQorICoJVVNFUjMyIGJhY2sgZW5kCisgKiBDb3B5cmlnaHQgMjAwMSBFcmljIFBvdWVjaAorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIndpbmVjb25fcHJpdmF0ZS5oIgorCisvKiBtYXBwaW5nIGNvbnNvbGUgY29sb3JzIHRvIFJHQiB2YWx1ZXMgKi8KK3N0YXRpYwlDT0xPUlJFRgljb2xvcl9tYXBbMTZdID0gCit7CisgICAgUkdCKDB4MDAsIDB4MDAsIDB4MDApLCBSR0IoMHgwMCwgMHgwMCwgMHg4MCksIFJHQigweDAwLCAweDgwLCAweDAwKSwgUkdCKDB4MDAsIDB4ODAsIDB4ODApLAorICAgIFJHQigweDgwLCAweDAwLCAweDAwKSwgUkdCKDB4ODAsIDB4MDAsIDB4ODApLCBSR0IoMHg4MCwgMHg4MCwgMHgwMCksIFJHQigweDgwLCAweDgwLCAweDgwKSwKKyAgICBSR0IoMHgwMCwgMHgwMCwgMHgwMCksIFJHQigweDAwLCAweDAwLCAweEZGKSwgUkdCKDB4MDAsIDB4RkYsIDB4MDApLCBSR0IoMHgwMCwgMHhGRiwgMHhGRiksCisgICAgUkdCKDB4RkYsIDB4MDAsIDB4MDApLCBSR0IoMHhGRiwgMHgwMCwgMHhGRiksIFJHQigweEZGLCAweEZGLCAweDAwKSwgUkdCKDB4RkYsIDB4RkYsIDB4RkYpLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCVdDVVNFUl9GaWxsTWVtREMKKyAqCisgKiBGaWxscyB0aGUgTWVtIERDIHdpdGggY3VycmVudCBjZWxscyB2YWx1ZXMKKyAqLworc3RhdGljIHZvaWQgV0NVU0VSX0ZpbGxNZW1EQyhjb25zdCBzdHJ1Y3QgaW5uZXJfZGF0YSogZGF0YSwgaW50IHVwZF90cCwgaW50IHVwZF9ibSkKK3sKKyAgICB1bnNpZ25lZAkJaSwgaiwgazsKKyAgICBDSEFSX0lORk8qCQljZWxsOworICAgIEhGT05UCQloT2xkRm9udDsKKyAgICBXT1JECQlhdHRyOworICAgIFdDSEFSKgkJbGluZTsKKworICAgIGlmICghKGxpbmUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGF0YS0+c2Jfd2lkdGggKiBzaXplb2YoV0NIQVIpKSkpCisgICAge1RyYWNlKDAsICJPT01cbiIpOyByZXR1cm47fQorCisgICAgaE9sZEZvbnQgPSBTZWxlY3RPYmplY3QoZGF0YS0+aE1lbURDLCBkYXRhLT5oRm9udCk7CisgICAgZm9yIChqID0gdXBkX3RwOyBqIDw9IHVwZF9ibTsgaisrKQorICAgIHsKKwljZWxsID0gJmRhdGEtPmNlbGxzW2ogKiBkYXRhLT5zYl93aWR0aF07CisJZm9yIChpID0gMDsgaSA8IGRhdGEtPndpbl93aWR0aDsgaSsrKQorCXsKKwkgICAgYXR0ciA9IGNlbGxbaV0uQXR0cmlidXRlczsKKwkgICAgU2V0QmtDb2xvcihkYXRhLT5oTWVtREMsIGNvbG9yX21hcFthdHRyICYgMHgwRl0pOworCSAgICBTZXRUZXh0Q29sb3IoZGF0YS0+aE1lbURDLCBjb2xvcl9tYXBbKGF0dHIgPj4gNCkgJiAweDBGXSk7CisJICAgIGZvciAoayA9IGk7IGsgPCBkYXRhLT53aW5fd2lkdGggJiYgY2VsbFtrXS5BdHRyaWJ1dGVzID09IGF0dHI7IGsrKykKKwkgICAgeworCQlsaW5lW2sgLSBpXSA9IGNlbGxba10uQ2hhci5Vbmljb2RlQ2hhcjsKKwkgICAgfQorCSAgICBUZXh0T3V0KGRhdGEtPmhNZW1EQywgaSAqIGRhdGEtPmNlbGxfd2lkdGgsIGogKiBkYXRhLT5jZWxsX2hlaWdodCwgCisJCSAgICBsaW5lLCBrIC0gaSk7CisJICAgIGkgPSBrIC0gMTsKKwl9CisgICAgfQorICAgIFNlbGVjdE9iamVjdChkYXRhLT5oTWVtREMsIGhPbGRGb250KTsKKyAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBsaW5lKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCVdDVVNFUl9OZXdCaXRtYXAKKyAqCisgKiBFaXRoZXIgdGhlIGZvbnQgZ2VvbWV0cnkgb3IgdGhlIHNiIGdlb21ldHJ5IGhhcyBjaGFuZ2VkLiB3ZSBuZWVkIHRvIHJlY3JlYXRlIHRoZQorICogYml0bWFwIGdlb21ldHJ5CisgKi8KK3N0YXRpYyB2b2lkIFdDVVNFUl9OZXdCaXRtYXAoc3RydWN0IGlubmVyX2RhdGEqIGRhdGEsIEJPT0wgZmlsbCkKK3sKKyAgICBIQklUTUFQCWhuZXcsIGhvbGQ7CisKKyAgICBpZiAoIWRhdGEtPnNiX3dpZHRoIHx8ICFkYXRhLT5zYl9oZWlnaHQpCisJcmV0dXJuOworICAgIGhuZXcgPSBDcmVhdGVDb21wYXRpYmxlQml0bWFwKGRhdGEtPmhNZW1EQywgCisJCQkJICBkYXRhLT5zYl93aWR0aCAgKiBkYXRhLT5jZWxsX3dpZHRoLCAKKwkJCQkgIGRhdGEtPnNiX2hlaWdodCAqIGRhdGEtPmNlbGxfaGVpZ2h0KTsKKyAgICBob2xkID0gU2VsZWN0T2JqZWN0KGRhdGEtPmhNZW1EQywgaG5ldyk7CisKKyAgICBpZiAoZGF0YS0+aEJpdG1hcCkKKyAgICB7CisJaWYgKGhvbGQgPT0gZGF0YS0+aEJpdG1hcCkKKwkgICAgRGVsZXRlT2JqZWN0KGRhdGEtPmhCaXRtYXApOworCWVsc2UKKwkgICAgVHJhY2UoMCwgImxlYWtcbiIpOworICAgIH0KKyAgICBkYXRhLT5oQml0bWFwID0gaG5ldzsKKyAgICBpZiAoZmlsbCkKKwlXQ1VTRVJfRmlsbE1lbURDKGRhdGEsIDAsIGRhdGEtPnNiX2hlaWdodCAtIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJV0NVU0VSX1Jlc2l6ZVNjcmVlbkJ1ZmZlcgorICoKKyAqCisgKi8KK3N0YXRpYyB2b2lkIFdDVVNFUl9SZXNpemVTY3JlZW5CdWZmZXIoc3RydWN0IGlubmVyX2RhdGEqIGRhdGEpCit7CisgICAgV0NVU0VSX05ld0JpdG1hcChkYXRhLCBGQUxTRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlXQ1VTRVJfUG9zQ3Vyc29yCisgKgorICogU2V0IGEgbmV3IHBvc2l0aW9uIGZvciB0aGUgY3Vyc29yCisgKi8KK3N0YXRpYyB2b2lkCVdDVVNFUl9Qb3NDdXJzb3IoY29uc3Qgc3RydWN0IGlubmVyX2RhdGEqIGRhdGEpCit7CisgICAgaWYgKGRhdGEtPmhXbmQgIT0gR2V0Rm9jdXMoKSB8fCAhZGF0YS0+Y3Vyc29yX3Zpc2libGUpIHJldHVybjsKKworICAgIFNldENhcmV0UG9zKChkYXRhLT5jdXJzb3IuWCAtIGRhdGEtPndpbl9wb3MuWCkgKiBkYXRhLT5jZWxsX3dpZHRoLCAKKwkJKGRhdGEtPmN1cnNvci5ZIC0gZGF0YS0+d2luX3Bvcy5ZKSAqIGRhdGEtPmNlbGxfaGVpZ2h0KTsKKyAgICBTaG93Q2FyZXQoZGF0YS0+aFduZCk7IAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJV0NVU0VSX1NoYXBlQ3Vyc29yCisgKgorICogU2V0cyBhIG5ldyBzaGFwZSBmb3IgdGhlIGN1cnNvcgorICovCit2b2lkCVdDVVNFUl9TaGFwZUN1cnNvcihzdHJ1Y3QgaW5uZXJfZGF0YSogZGF0YSwgaW50IHNpemUsIGludCB2aXMsIEJPT0wgZm9yY2UpCit7CisgICAgaWYgKGZvcmNlIHx8IHNpemUgIT0gZGF0YS0+Y3Vyc29yX3NpemUpCisgICAgeworCWlmIChkYXRhLT5jdXJzb3JfdmlzaWJsZSAmJiBkYXRhLT5oV25kID09IEdldEZvY3VzKCkpIERlc3Ryb3lDYXJldCgpOworCWlmIChkYXRhLT5jdXJzb3JfYml0bWFwKSBEZWxldGVPYmplY3QoZGF0YS0+Y3Vyc29yX2JpdG1hcCk7CisJZGF0YS0+Y3Vyc29yX2JpdG1hcCA9IChIQklUTUFQKTA7CisJaWYgKHNpemUgIT0gMTAwKQorCXsKKwkgICAgaW50CQl3MTZiOyAvKiBudW1iZXIgb2YgYnlldHMgcGVyIHJvdywgYWxpZ25lZCBvbiB3b3JkIHNpemUgKi8KKwkgICAgQllURSoJcHRyOworCSAgICBpbnQJCWksIGosIG5ibDsKKworCSAgICB3MTZiID0gKChkYXRhLT5jZWxsX3dpZHRoICsgMTUpICYgfjE1KSAvIDg7CisJICAgIHB0ciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCB3MTZiICogZGF0YS0+Y2VsbF9oZWlnaHQpOworCSAgICBpZiAoIXB0cikge1RyYWNlKDAsICJPT01cbiIpOyByZXR1cm47fQorCSAgICBuYmwgPSBtYXgoKGRhdGEtPmNlbGxfaGVpZ2h0ICogc2l6ZSkgLyAxMDAsIDEpOworCSAgICBmb3IgKGogPSBkYXRhLT5jZWxsX2hlaWdodCAtIG5ibDsgaiA8IGRhdGEtPmNlbGxfaGVpZ2h0OyBqKyspCisJICAgIHsKKwkJZm9yIChpID0gMDsgaSA8IGRhdGEtPmNlbGxfd2lkdGg7IGkrKykKKwkJeworCQkgICAgcHRyW3cxNmIgKiBqICsgKGkgLyA4KV0gfD0gMHg4MCA+PiAoaSAmIDcpOworCQl9CisJICAgIH0KKwkgICAgZGF0YS0+Y3Vyc29yX2JpdG1hcCA9IENyZWF0ZUJpdG1hcChkYXRhLT5jZWxsX3dpZHRoLCBkYXRhLT5jZWxsX2hlaWdodCwgMSwgMSwgcHRyKTsKKwkgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcHRyKTsKKwl9CisJZGF0YS0+Y3Vyc29yX3NpemUgPSBzaXplOworCWRhdGEtPmN1cnNvcl92aXNpYmxlID0gLTE7CisgICAgfQorCisgICAgdmlzID0gKHZpcykgPyBUUlVFIDogRkFMU0U7CisgICAgaWYgKGZvcmNlIHx8IHZpcyAhPSBkYXRhLT5jdXJzb3JfdmlzaWJsZSkKKyAgICB7CisJZGF0YS0+Y3Vyc29yX3Zpc2libGUgPSB2aXM7CisJaWYgKGRhdGEtPmhXbmQgPT0gR2V0Rm9jdXMoKSkKKwl7CisJICAgIGlmICh2aXMpCisJICAgIHsKKwkJQ3JlYXRlQ2FyZXQoZGF0YS0+aFduZCwgZGF0YS0+Y3Vyc29yX2JpdG1hcCwgZGF0YS0+Y2VsbF93aWR0aCwgZGF0YS0+Y2VsbF9oZWlnaHQpOworCQlXQ1VTRVJfUG9zQ3Vyc29yKGRhdGEpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlEZXN0cm95Q2FyZXQoKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlJTkVDT05fQ29tcHV0ZVBvc2l0aW9ucworICoKKyAqIFJlY29tcHV0ZXMgYWxsIHRoZSBjb21wb25lbnRzIChtYWlubHkgc2Nyb2xsIGJhcnMpIHBvc2l0aW9ucworICovCit2b2lkCVdDVVNFUl9Db21wdXRlUG9zaXRpb25zKHN0cnVjdCBpbm5lcl9kYXRhKiBkYXRhKQoreworICAgIFJFQ1QJCXI7CisgICAgaW50CQkJZHgsIGR5OworCisgICAgLyogY29tcHV0ZSB3aW5kb3cgc2l6ZSBmcm9tIGRlc2lyZWQgY2xpZW50IHNpemUgKi8KKyAgICByLmxlZnQgPSByLnRvcCA9IDA7CisgICAgci5yaWdodCA9IGRhdGEtPndpbl93aWR0aCAqIGRhdGEtPmNlbGxfd2lkdGg7CisgICAgci5ib3R0b20gPSBkYXRhLT53aW5faGVpZ2h0ICogZGF0YS0+Y2VsbF9oZWlnaHQ7CisKKyAgICBpZiAoSXNSZWN0RW1wdHkoJnIpKQorICAgIHsKKwlTaG93V2luZG93KGRhdGEtPmhXbmQsIFNXX0hJREUpOworCXJldHVybjsKKyAgICB9CisKKyAgICBBZGp1c3RXaW5kb3dSZWN0KCZyLCBHZXRXaW5kb3dMb25nKGRhdGEtPmhXbmQsIEdXTF9TVFlMRSksIEZBTFNFKTsKKworICAgIGR4ID0gZHkgPSAwOworICAgIGlmIChkYXRhLT5zYl93aWR0aCA+IGRhdGEtPndpbl93aWR0aCkKKyAgICB7CisJZHkgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZSFNDUk9MTCk7CisJU2V0U2Nyb2xsUmFuZ2UoZGF0YS0+aFduZCwgU0JfSE9SWiwgMCwgZGF0YS0+c2Jfd2lkdGggLSBkYXRhLT53aW5fd2lkdGgsIEZBTFNFKTsKKwlTZXRTY3JvbGxQb3MoZGF0YS0+aFduZCwgU0JfSE9SWiwgMCwgRkFMU0UpOyAvKiBGSVhNRSAqLworCVNob3dTY3JvbGxCYXIoZGF0YS0+aFduZCwgU0JfSE9SWiwgVFJVRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJU2hvd1Njcm9sbEJhcihkYXRhLT5oV25kLCBTQl9IT1JaLCBGQUxTRSk7CisgICAgfQorCisgICAgaWYgKGRhdGEtPnNiX2hlaWdodCA+IGRhdGEtPndpbl9oZWlnaHQpCisgICAgeworCWR4ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFZTQ1JPTEwpOworCVNldFNjcm9sbFJhbmdlKGRhdGEtPmhXbmQsIFNCX1ZFUlQsIDAsIGRhdGEtPnNiX2hlaWdodCAtIGRhdGEtPndpbl9oZWlnaHQsIEZBTFNFKTsKKwlTZXRTY3JvbGxQb3MoZGF0YS0+aFduZCwgU0JfVkVSVCwgMCwgRkFMU0UpOyAvKiBGSVhNRSAqLworCVNob3dTY3JvbGxCYXIoZGF0YS0+aFduZCwgU0JfVkVSVCwgVFJVRSk7CisgICAgfQkKKyAgICBlbHNlCisgICAgeworCVNob3dTY3JvbGxCYXIoZGF0YS0+aFduZCwgU0JfVkVSVCwgRkFMU0UpOworICAgIH0KKworICAgIFNldFdpbmRvd1BvcyhkYXRhLT5oV25kLCAwLCAwLCAwLCByLnJpZ2h0IC0gci5sZWZ0ICsgZHgsIHIuYm90dG9tIC0gci50b3AgKyBkeSwKKwkJIFNXUF9OT01PVkV8U1dQX05PWk9SREVSfFNXUF9TSE9XV0lORE9XKTsKKyAgICBXQ1VTRVJfU2hhcGVDdXJzb3IoZGF0YSwgZGF0YS0+Y3Vyc29yX3NpemUsIGRhdGEtPmN1cnNvcl92aXNpYmxlLCBUUlVFKTsKKyAgICBXQ1VTRVJfUG9zQ3Vyc29yKGRhdGEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJV0NVU0VSX1NldFRpdGxlCisgKgorICogU2V0cyB0aGUgdGl0bGUgdG8gdGhlIHdpbmUgY29uc29sZQorICovCitzdGF0aWMgdm9pZAlXQ1VTRVJfU2V0VGl0bGUoY29uc3Qgc3RydWN0IGlubmVyX2RhdGEqIGRhdGEpCit7CisgICAgV0NIQVIJYnVmZmVyWzI1Nl07CQorCisgICAgaWYgKFdJTkVDT05fR2V0Q29uc29sZVRpdGxlKGRhdGEtPmhDb25JbiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpCisJU2V0V2luZG93VGV4dChkYXRhLT5oV25kLCBidWZmZXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJV0NVU0VSX1NldEZvbnQKKyAqCisgKgorICovCitCT09MCVdDVVNFUl9TZXRGb250KHN0cnVjdCBpbm5lcl9kYXRhKiBkYXRhLCBjb25zdCBMT0dGT05UKiBsb2dmb250LCBjb25zdCBURVhUTUVUUklDKiB0bSkKK3sKKyAgICBpZiAoIW1lbWNtcChsb2dmb250LCAmZGF0YS0+bG9nRm9udCwgc2l6ZW9mKExPR0ZPTlQpKSkgcmV0dXJuIFRSVUU7CisgICAgaWYgKGRhdGEtPmhGb250KSBEZWxldGVPYmplY3QoZGF0YS0+aEZvbnQpOworICAgIGRhdGEtPmhGb250ID0gQ3JlYXRlRm9udEluZGlyZWN0KGxvZ2ZvbnQpOworICAgIGlmICghZGF0YS0+aEZvbnQpIHtUcmFjZSgwLCAid3JvbmcgZm9udFxuIik7cmV0dXJuIEZBTFNFO30KKyAgICBkYXRhLT5jZWxsX3dpZHRoID0gdG0tPnRtTWF4Q2hhcldpZHRoOyAvKiBmb250IGlzIGZpeGVkIEF2ZyA9PSBNYXggKi8KKyAgICBkYXRhLT5jZWxsX2hlaWdodCA9IHRtLT50bUhlaWdodDsKKyAgICBkYXRhLT5sb2dGb250ID0gKmxvZ2ZvbnQ7CisgICAgV0NVU0VSX0NvbXB1dGVQb3NpdGlvbnMoZGF0YSk7CisgICAgV0NVU0VSX05ld0JpdG1hcChkYXRhLCBUUlVFKTsKKyAgICBJbnZhbGlkYXRlUmVjdChkYXRhLT5oV25kLCBOVUxMLCBGQUxTRSk7CisgICAgVXBkYXRlV2luZG93KGRhdGEtPmhXbmQpOworICAgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJV0NVU0VSX0dldENlbGwKKyAqCisgKiBHZXQgYSBjZWxsIGZyb20gdGhlIGEgcmVsYXRpdmUgY29vcmRpbmF0ZSBpbiB3aW5kb3cgKHRha2VzIGludG8KKyAqIGFjY291bnQgdGhlIHNjcm9sbGluZykKKyAqLworc3RhdGljIENPT1JECVdDVVNFUl9HZXRDZWxsKGNvbnN0IHN0cnVjdCBpbm5lcl9kYXRhKiBkYXRhLCBMUEFSQU0gbFBhcmFtKQoreworICAgIENPT1JECWM7CisKKyAgICBjLlggPSBkYXRhLT53aW5fcG9zLlggKyAoc2hvcnQpTE9XT1JEKGxQYXJhbSkgLyBkYXRhLT5jZWxsX3dpZHRoOworICAgIGMuWSA9IGRhdGEtPndpbl9wb3MuWSArIChzaG9ydClISVdPUkQobFBhcmFtKSAvIGRhdGEtPmNlbGxfaGVpZ2h0OworCisgICAgcmV0dXJuIGM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlXQ1VTRVJfR2V0U2VsZWN0aW9uUmVjdAorICoKKyAqIEdldCB0aGUgc2VsZWN0aW9uIHJlY3RhbmdsZQorICovCitzdGF0aWMgdm9pZAlXQ1VTRVJfR2V0U2VsZWN0aW9uUmVjdChjb25zdCBzdHJ1Y3QgaW5uZXJfZGF0YSogZGF0YSwgTFBSRUNUIHIpCit7CisgICAgci0+bGVmdCAgID0gKG1pbihkYXRhLT5zZWxlY3RQdDEuWCwgZGF0YS0+c2VsZWN0UHQyLlgpICAgICkgKiBkYXRhLT5jZWxsX3dpZHRoOworICAgIHItPnRvcCAgICA9IChtaW4oZGF0YS0+c2VsZWN0UHQxLlksIGRhdGEtPnNlbGVjdFB0Mi5ZKSAgICApICogZGF0YS0+Y2VsbF9oZWlnaHQ7CisgICAgci0+cmlnaHQgID0gKG1heChkYXRhLT5zZWxlY3RQdDEuWCwgZGF0YS0+c2VsZWN0UHQyLlgpICsgMSkgKiBkYXRhLT5jZWxsX3dpZHRoOworICAgIHItPmJvdHRvbSA9IChtYXgoZGF0YS0+c2VsZWN0UHQxLlksIGRhdGEtPnNlbGVjdFB0Mi5ZKSArIDEpICogZGF0YS0+Y2VsbF9oZWlnaHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlXQ1VTRVJfU2V0U2VsZWN0aW9uCisgKgorICoKKyAqLworc3RhdGljIHZvaWQJV0NVU0VSX1NldFNlbGVjdGlvbihjb25zdCBzdHJ1Y3QgaW5uZXJfZGF0YSogZGF0YSwgSERDIGhSZWZEQykKK3sKKyAgICBIREMJCWhEQzsKKyAgICBSRUNUCXI7CisKKyAgICBXQ1VTRVJfR2V0U2VsZWN0aW9uUmVjdChkYXRhLCAmcik7CisgICAgaERDID0gaFJlZkRDID8gaFJlZkRDIDogR2V0REMoZGF0YS0+aFduZCk7CisgICAgaWYgKGhEQykKKyAgICB7CisJaWYgKGRhdGEtPmhXbmQgPT0gR2V0Rm9jdXMoKSAmJiBkYXRhLT5jdXJzb3JfdmlzaWJsZSkKKwkgICAgSGlkZUNhcmV0KGRhdGEtPmhXbmQpOworCUludmVydFJlY3QoaERDLCAmcik7CisJaWYgKGhEQyAhPSBoUmVmREMpCisJICAgIFJlbGVhc2VEQyhkYXRhLT5oV25kLCBoREMpOworCWlmIChkYXRhLT5oV25kID09IEdldEZvY3VzKCkgJiYgZGF0YS0+Y3Vyc29yX3Zpc2libGUpCisJICAgIFNob3dDYXJldChkYXRhLT5oV25kKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlXQ1VTRVJfTW92ZVNlbGVjdGlvbgorICoKKyAqCisgKi8KK3N0YXRpYyB2b2lkCVdDVVNFUl9Nb3ZlU2VsZWN0aW9uKHN0cnVjdCBpbm5lcl9kYXRhKiBkYXRhLCBDT09SRCBkc3QsIEJPT0wgZmluYWwpCit7CisgICAgUkVDVAlyOworICAgIEhEQwkJaERDOworCisgICAgV0NVU0VSX0dldFNlbGVjdGlvblJlY3QoZGF0YSwgJnIpOworICAgIGhEQyA9IEdldERDKGRhdGEtPmhXbmQpOworICAgIGlmIChoREMpCisgICAgeworCWlmIChkYXRhLT5oV25kID09IEdldEZvY3VzKCkgJiYgZGF0YS0+Y3Vyc29yX3Zpc2libGUpCisJICAgIEhpZGVDYXJldChkYXRhLT5oV25kKTsKKwlJbnZlcnRSZWN0KGhEQywgJnIpOworICAgIH0KKyAgICBkYXRhLT5zZWxlY3RQdDIgPSBkc3Q7CisgICAgaWYgKGhEQykKKyAgICB7CisJV0NVU0VSX0dldFNlbGVjdGlvblJlY3QoZGF0YSwgJnIpOworCUludmVydFJlY3QoaERDLCAmcik7CisJUmVsZWFzZURDKGRhdGEtPmhXbmQsIGhEQyk7CisJaWYgKGRhdGEtPmhXbmQgPT0gR2V0Rm9jdXMoKSAmJiBkYXRhLT5jdXJzb3JfdmlzaWJsZSkKKwkgICAgU2hvd0NhcmV0KGRhdGEtPmhXbmQpOworICAgIH0KKyAgICBpZiAoZmluYWwpCisgICAgeworCVJlbGVhc2VDYXB0dXJlKCk7CisJZGF0YS0+aGFzU2VsZWN0aW9uID0gVFJVRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlXQ1VTRVJfQ29weVNlbGVjdGlvblRvQ2xpcGJvYXJkCisgKgorICogQ29waWVzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbnRvIHRoZSBjbGlwYm9hcmQKKyAqLworc3RhdGljIHZvaWQJV0NVU0VSX0NvcHlTZWxlY3Rpb25Ub0NsaXBib2FyZChjb25zdCBzdHJ1Y3QgaW5uZXJfZGF0YSogZGF0YSkKK3sKKyAgICBIQU5ETEUJaE1lbTsKKyAgICBMUFdTVFIJcDsKKyAgICB1bnNpZ25lZAl3LCBoOworCisgICAgdyA9IGFicyhkYXRhLT5zZWxlY3RQdDEuWCAtIGRhdGEtPnNlbGVjdFB0Mi5YKSArIDI7CisgICAgaCA9IGFicyhkYXRhLT5zZWxlY3RQdDEuWSAtIGRhdGEtPnNlbGVjdFB0Mi5ZKSArIDE7CisKKyAgICBpZiAoIU9wZW5DbGlwYm9hcmQoZGF0YS0+aFduZCkpIHJldHVybjsKKyAgICBFbXB0eUNsaXBib2FyZCgpOworCisgICAgaE1lbSA9IEdsb2JhbEFsbG9jKEdNRU1fTU9WRUFCTEUsICh3ICogaCAtIDEpICogc2l6ZW9mKFdDSEFSKSk7CisgICAgaWYgKGhNZW0gJiYgKHAgPSBHbG9iYWxMb2NrKGhNZW0pKSkKKyAgICB7CisJQ09PUkQJYzsKKwlpbnQJeTsKKworCWMuWCA9IGRhdGEtPndpbl9wb3MuWCArIG1pbihkYXRhLT5zZWxlY3RQdDEuWCwgZGF0YS0+c2VsZWN0UHQyLlgpOworCWMuWSA9IGRhdGEtPndpbl9wb3MuWSArIG1pbihkYXRhLT5zZWxlY3RQdDEuWSwgZGF0YS0+c2VsZWN0UHQyLlkpOworCQorCWZvciAoeSA9IDA7IHkgPCBoOyB5KyssIGMuWSsrKQorCXsKKwkgICAgUmVhZENvbnNvbGVPdXRwdXRDaGFyYWN0ZXIoZGF0YS0+aENvbk91dCwgJnBbeSAqIHddLCB3IC0gMSwgYywgTlVMTCk7CisJICAgIGlmICh5IDwgaCAtIDEpIHBbeSAqIHcgKyB3IC0gMV0gPSAnXG4nOworCX0KKwlHbG9iYWxVbmxvY2soaE1lbSk7CisJU2V0Q2xpcGJvYXJkRGF0YShDRl9VTklDT0RFVEVYVCwgaE1lbSk7CisgICAgfQorICAgIENsb3NlQ2xpcGJvYXJkKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlXQ1VTRVJfUGFzdGVGcm9tQ2xpcGJvYXJkCisgKgorICoKKyAqLworc3RhdGljIHZvaWQJV0NVU0VSX1Bhc3RlRnJvbUNsaXBib2FyZChzdHJ1Y3QgaW5uZXJfZGF0YSogZGF0YSkKK3sKKyAgICBIQU5ETEUJaDsKKyAgICBXQ0hBUioJcHRyOworCisgICAgaWYgKCFPcGVuQ2xpcGJvYXJkKGRhdGEtPmhXbmQpKSByZXR1cm47CisgICAgaCA9IEdldENsaXBib2FyZERhdGEoQ0ZfVU5JQ09ERVRFWFQpOworICAgIGlmIChoICYmIChwdHIgPSBHbG9iYWxMb2NrKGgpKSkKKyAgICB7CisJaW50CQlpLCBsZW4gPSBHbG9iYWxTaXplKGgpIC8gc2l6ZW9mKFdDSEFSKTsKKwlJTlBVVF9SRUNPUkQJaXJbMl07CisJRFdPUkQJCW47CisJU0hPUlQJCXNoOworCisJaXJbMF0uRXZlbnRUeXBlID0gS0VZX0VWRU5UOworCWlyWzBdLkV2ZW50LktleUV2ZW50LndSZXBlYXRDb3VudCA9IDA7CisJaXJbMF0uRXZlbnQuS2V5RXZlbnQuZHdDb250cm9sS2V5U3RhdGUgPSAwOworCWlyWzBdLkV2ZW50LktleUV2ZW50LmJLZXlEb3duID0gVFJVRTsKKworCS8qIGdlbmVyYXRlIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IHJlY29yZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJeworCSAgICAvKiBGSVhNRTogdGhlIG1vZGlmeWluZyBrZXlzIGFyZSBub3QgZ2VuZXJhdGVkIChzaGlmdCwgY3RybC4uLikgKi8KKwkgICAgc2ggPSBWa0tleVNjYW4ocHRyW2ldKTsKKwkgICAgaXJbMF0uRXZlbnQuS2V5RXZlbnQud1ZpcnR1YWxLZXlDb2RlID0gTE9CWVRFKHNoKTsKKwkgICAgaXJbMF0uRXZlbnQuS2V5RXZlbnQud1ZpcnR1YWxTY2FuQ29kZSA9IE1hcFZpcnR1YWxLZXkoTE9CWVRFKHNoKSwgMCk7CisJICAgIGlyWzBdLkV2ZW50LktleUV2ZW50LnVDaGFyLlVuaWNvZGVDaGFyID0gcHRyW2ldOworCSAgICAKKwkgICAgaXJbMV0gPSBpclswXTsKKwkgICAgaXJbMV0uRXZlbnQuS2V5RXZlbnQuYktleURvd24gPSBGQUxTRTsKKwkgICAgCisJICAgIFdyaXRlQ29uc29sZUlucHV0KGRhdGEtPmhDb25JbiwgaXIsIDIsICZuKTsKKwl9CisJR2xvYmFsVW5sb2NrKGgpOworICAgIH0KKyAgICBDbG9zZUNsaXBib2FyZCgpOworfQorCitzdGF0aWMgdm9pZCBXQ1VTRVJfUmVmcmVzaChjb25zdCBzdHJ1Y3QgaW5uZXJfZGF0YSogZGF0YSwgaW50IHRwLCBpbnQgYm0pCit7CisgICAgaWYgKGRhdGEtPndpbl9wb3MuWSA8PSBibSAmJiBkYXRhLT53aW5fcG9zLlkgKyBkYXRhLT53aW5faGVpZ2h0ID49IHRwKQorICAgIHsKKwlSRUNUCXI7CisKKwlyLmxlZnQgICA9IDA7CisJci5yaWdodCAgPSBkYXRhLT53aW5fd2lkdGggKiBkYXRhLT5jZWxsX3dpZHRoOworCXIudG9wICAgID0gKHRwIC0gZGF0YS0+d2luX3Bvcy5ZKSAqIGRhdGEtPmNlbGxfaGVpZ2h0OworCXIuYm90dG9tID0gKGJtIC0gZGF0YS0+d2luX3Bvcy5ZICsgMSkgKiBkYXRhLT5jZWxsX2hlaWdodDsKKwlJbnZhbGlkYXRlUmVjdChkYXRhLT5oV25kLCAmciwgRkFMU0UpOworCVdDVVNFUl9GaWxsTWVtREMoZGF0YSwgdHAsIGJtKTsKKwlVcGRhdGVXaW5kb3coZGF0YS0+aFduZCk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJV0NVU0VSX1BhaW50CisgKgorICoKKyAqLworc3RhdGljIHZvaWQJV0NVU0VSX1BhaW50KGNvbnN0IHN0cnVjdCBpbm5lcl9kYXRhKiBkYXRhKQoreworICAgIFBBSU5UU1RSVUNUCQlwczsKKworICAgIEJlZ2luUGFpbnQoZGF0YS0+aFduZCwgJnBzKTsKKyAgICBCaXRCbHQocHMuaGRjLCAwLCAwLCBkYXRhLT53aW5fd2lkdGggKiBkYXRhLT5jZWxsX3dpZHRoLCBkYXRhLT53aW5faGVpZ2h0ICogZGF0YS0+Y2VsbF9oZWlnaHQsCisJICAgZGF0YS0+aE1lbURDLCBkYXRhLT53aW5fcG9zLlggKiBkYXRhLT5jZWxsX3dpZHRoLCBkYXRhLT53aW5fcG9zLlkgKiBkYXRhLT5jZWxsX2hlaWdodCwKKwkgICBTUkNDT1BZKTsKKyAgICBpZiAoZGF0YS0+aGFzU2VsZWN0aW9uKQorCVdDVVNFUl9TZXRTZWxlY3Rpb24oZGF0YSwgcHMuaGRjKTsKKyAgICBFbmRQYWludChkYXRhLT5oV25kLCAmcHMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJV0NVU0VSX1Njcm9sbAorICoKKyAqCisgKi8KK3N0YXRpYyB2b2lkIFdDVVNFUl9TY3JvbGwoc3RydWN0IGlubmVyX2RhdGEqIGRhdGEsIGludCBwb3MsIEJPT0wgaG9yeikKK3sKKyAgICBpZiAoaG9yeikKKyAgICB7CisJU2V0U2Nyb2xsUG9zKGRhdGEtPmhXbmQsIFNCX0hPUlosIHBvcywgVFJVRSk7CisJZGF0YS0+d2luX3Bvcy5YID0gcG9zOworCUludmFsaWRhdGVSZWN0KGRhdGEtPmhXbmQsIE5VTEwsIEZBTFNFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlTZXRTY3JvbGxQb3MoZGF0YS0+aFduZCwgU0JfVkVSVCwgcG9zLCBUUlVFKTsKKwlkYXRhLT53aW5fcG9zLlkgPSBwb3M7CisgICAgfQorICAgIEludmFsaWRhdGVSZWN0KGRhdGEtPmhXbmQsIE5VTEwsIEZBTFNFKTsKK30KKworc3RydWN0IGZvbnRfY2hvb3NlciB7CisgICAgc3RydWN0IGlubmVyX2RhdGEqCWRhdGE7CisgICAgaW50CQkJZG9uZTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlXQ1VTRVJfVmFsaWRhdGVGb250TWV0cmljCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBmb250IGRlc2NyaWJlZCBpbiB0bSBpcyB1c2FibGUgYXMgYSBmb250IGZvciB0aGUgcmVuZGVyZXIKKyAqLworQk9PTAlXQ1VTRVJfVmFsaWRhdGVGb250TWV0cmljKGNvbnN0IHN0cnVjdCBpbm5lcl9kYXRhKiBkYXRhLCBjb25zdCBURVhUTUVUUklDKiB0bSkKK3sKKyAgICByZXR1cm4gdG0tPnRtTWF4Q2hhcldpZHRoICogZGF0YS0+d2luX3dpZHRoIDwgR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTikgJiYKKwl0bS0+dG1IZWlnaHQgKiBkYXRhLT53aW5faGVpZ2h0IDwgR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTikgJiYKKwkhdG0tPnRtSXRhbGljICYmICF0bS0+dG1VbmRlcmxpbmVkICYmICF0bS0+dG1TdHJ1Y2tPdXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlXQ1VTRVJfVmFsaWRhdGVGb250CisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBmb250IGZhbWlseSBkZXNjcmliZWQgaW4gbGYgaXMgdXNhYmxlIGFzIGEgZm9udCBmb3IgdGhlIHJlbmRlcmVyCisgKi8KK0JPT0wJV0NVU0VSX1ZhbGlkYXRlRm9udChjb25zdCBzdHJ1Y3QgaW5uZXJfZGF0YSogZGF0YSwgY29uc3QgTE9HRk9OVCogbGYpCit7CisgICAgcmV0dXJuIChsZi0+bGZQaXRjaEFuZEZhbWlseSAmIDMpID09IEZJWEVEX1BJVENIICYmIChsZi0+bGZQaXRjaEFuZEZhbWlseSAmIDB4RjApID09IEZGX01PREVSTjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCWdldF9maXJzdF9mb250X2VudW1fMgorICoJCWdldF9maXJzdF9mb250X2VudW0KKyAqCisgKiBIZWxwZXIgZnVuY3Rpb25zIHRvIGdldCBhIGRlY2VudCBmb250IGZvciB0aGUgcmVuZGVyZXIKKyAqLworc3RhdGljIGludCBDQUxMQkFDSyBnZXRfZmlyc3RfZm9udF9lbnVtXzIoY29uc3QgTE9HRk9OVCogbGYsIGNvbnN0IFRFWFRNRVRSSUMqIHRtLCAKKwkJCQkJICBEV09SRCBGb250VHlwZSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBzdHJ1Y3QgZm9udF9jaG9vc2VyKglmYyA9IChzdHJ1Y3QgZm9udF9jaG9vc2VyKilsUGFyYW07CisKKyAgICBpZiAoV0NVU0VSX1ZhbGlkYXRlRm9udE1ldHJpYyhmYy0+ZGF0YSwgdG0pKQorICAgIHsKKwlXQ1VTRVJfU2V0Rm9udChmYy0+ZGF0YSwgbGYsIHRtKTsKKwlmYy0+ZG9uZSA9IDE7CisJcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IENBTExCQUNLIGdldF9maXJzdF9mb250X2VudW0oY29uc3QgTE9HRk9OVCogbGYsIGNvbnN0IFRFWFRNRVRSSUMqIHRtLCAKKwkJCQkJRFdPUkQgRm9udFR5cGUsIExQQVJBTSBsUGFyYW0pCit7CisgICAgc3RydWN0IGZvbnRfY2hvb3NlcioJZmMgPSAoc3RydWN0IGZvbnRfY2hvb3NlciopbFBhcmFtOworCisgICAgaWYgKFdDVVNFUl9WYWxpZGF0ZUZvbnQoZmMtPmRhdGEsIGxmKSkKKyAgICB7CisJRW51bUZvbnRGYW1pbGllcyhmYy0+ZGF0YS0+aE1lbURDLCBsZi0+bGZGYWNlTmFtZSwgZ2V0X2ZpcnN0X2ZvbnRfZW51bV8yLCBsUGFyYW0pOworCXJldHVybiAhZmMtPmRvbmU7IC8qIHdlIGp1c3QgbmVlZCB0aGUgZmlyc3QgbWF0Y2hpbmcgb25lLi4uICovCisgICAgfQorICAgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJV0NVU0VSX0NyZWF0ZQorICoKKyAqIENyZWF0ZXMgdGhlIHdpbmRvdyBmb3IgdGhlIHJlbmRlcmluZworICovCitzdGF0aWMgTFJFU1VMVCBXQ1VTRVJfQ3JlYXRlKEhXTkQgaFduZCwgTFBDUkVBVEVTVFJVQ1QgbHBjcykKK3sKKyAgICBzdHJ1Y3QgaW5uZXJfZGF0YSoJZGF0YTsKKyAgICBITUVOVQkJaE1lbnU7CisgICAgSE1FTlUJCWhTdWJNZW51OworICAgIFdDSEFSCQlidWZmWzI1Nl07CisgICAgSElOU1RBTkNFCQloSW5zdGFuY2UgPSBHZXRNb2R1bGVIYW5kbGUoTlVMTCk7CisKKyAgICBkYXRhID0gbHBjcy0+bHBDcmVhdGVQYXJhbXM7CisgICAgU2V0V2luZG93TG9uZyhoV25kLCAwTCwgKERXT1JEKWRhdGEpOworICAgIGRhdGEtPmhXbmQgPSBoV25kOworCisgICAgZGF0YS0+Y3Vyc29yX3NpemUgPSAxMDE7IC8qIGludmFsaWQgdmFsdWUsIHdpbGwgdHJpZ2dlciBhIGNvbXBsZXRlIGNsZWFudXAgKi8KKyAgICAvKiBGSVhNRTogZXJyb3IgaGFuZGxpbmcgJiBtZW1vcnkgY2xlYW51cCAqLworICAgIGhTdWJNZW51ID0gQ3JlYXRlTWVudSgpOworICAgIGlmICghaFN1Yk1lbnUpIHJldHVybiAwOworCisgICAgaE1lbnUgPSBHZXRTeXN0ZW1NZW51KGhXbmQsIEZBTFNFKTsKKyAgICBpZiAoIWhNZW51KSByZXR1cm4gMDsKKworICAgIExvYWRTdHJpbmcoaEluc3RhbmNlLCBJRFNfTUFSSywgYnVmZiwgc2l6ZW9mKGJ1ZmYpIC8gc2l6ZW9mKFdDSEFSKSk7CisgICAgSW5zZXJ0TWVudShoU3ViTWVudSwgLTEsIE1GX0JZUE9TSVRJT058TUZfU1RSSU5HLCBJRFNfTUFSSywgYnVmZik7CisgICAgTG9hZFN0cmluZyhoSW5zdGFuY2UsIElEU19DT1BZLCBidWZmLCBzaXplb2YoYnVmZikgLyBzaXplb2YoV0NIQVIpKTsKKyAgICBJbnNlcnRNZW51KGhTdWJNZW51LCAtMSwgTUZfQllQT1NJVElPTnxNRl9TVFJJTkcsIElEU19DT1BZLCBidWZmKTsKKyAgICBMb2FkU3RyaW5nKGhJbnN0YW5jZSwgSURTX1BBU1RFLCBidWZmLCBzaXplb2YoYnVmZikgLyBzaXplb2YoV0NIQVIpKTsKKyAgICBJbnNlcnRNZW51KGhTdWJNZW51LCAtMSwgTUZfQllQT1NJVElPTnxNRl9TVFJJTkcsIElEU19QQVNURSwgYnVmZik7CisgICAgTG9hZFN0cmluZyhoSW5zdGFuY2UsIElEU19TRUxFQ1RBTEwsIGJ1ZmYsIHNpemVvZihidWZmKSAvIHNpemVvZihXQ0hBUikpOworICAgIEluc2VydE1lbnUoaFN1Yk1lbnUsIC0xLCBNRl9CWVBPU0lUSU9OfE1GX1NUUklORywgSURTX1NFTEVDVEFMTCwgYnVmZik7CisgICAgTG9hZFN0cmluZyhoSW5zdGFuY2UsIElEU19TQ1JPTEwsIGJ1ZmYsIHNpemVvZihidWZmKSAvIHNpemVvZihXQ0hBUikpOworICAgIEluc2VydE1lbnUoaFN1Yk1lbnUsIC0xLCBNRl9CWVBPU0lUSU9OfE1GX1NUUklORywgSURTX1NDUk9MTCwgYnVmZik7CisgICAgTG9hZFN0cmluZyhoSW5zdGFuY2UsIElEU19TRUFSQ0gsIGJ1ZmYsIHNpemVvZihidWZmKSAvIHNpemVvZihXQ0hBUikpOworICAgIEluc2VydE1lbnUoaFN1Yk1lbnUsIC0xLCBNRl9CWVBPU0lUSU9OfE1GX1NUUklORywgSURTX1NFQVJDSCwgYnVmZik7CisKKyAgICBJbnNlcnRNZW51KGhNZW51LCAtMSwgTUZfQllQT1NJVElPTnxNRl9TRVBBUkFUT1IsIDAsIE5VTEwpOworICAgIExvYWRTdHJpbmcoaEluc3RhbmNlLCBJRFNfRURJVCwgYnVmZiwgc2l6ZW9mKGJ1ZmYpIC8gc2l6ZW9mKFdDSEFSKSk7CisgICAgSW5zZXJ0TWVudShoTWVudSwgLTEsIE1GX0JZUE9TSVRJT058TUZfU1RSSU5HfE1GX1BPUFVQLCAoVUlOVF9QVFIpaFN1Yk1lbnUsIGJ1ZmYpOworICAgIExvYWRTdHJpbmcoaEluc3RhbmNlLCBJRFNfREVGQVVMVCwgYnVmZiwgc2l6ZW9mKGJ1ZmYpIC8gc2l6ZW9mKFdDSEFSKSk7CisgICAgSW5zZXJ0TWVudShoTWVudSwgLTEsIE1GX0JZUE9TSVRJT058TUZfU1RSSU5HLCBJRFNfREVGQVVMVCwgYnVmZik7CisgICAgTG9hZFN0cmluZyhoSW5zdGFuY2UsIElEU19QUk9QRVJUWSwgYnVmZiwgc2l6ZW9mKGJ1ZmYpIC8gc2l6ZW9mKFdDSEFSKSk7CisgICAgSW5zZXJ0TWVudShoTWVudSwgLTEsIE1GX0JZUE9TSVRJT058TUZfU1RSSU5HLCBJRFNfUFJPUEVSVFksIGJ1ZmYpOworCisgICAgZGF0YS0+aE1lbURDID0gQ3JlYXRlQ29tcGF0aWJsZURDKDApOworICAgIGlmICghZGF0YS0+aE1lbURDKSB7VHJhY2UoMCwgIm5vIG1lbSBkY1xuIik7cmV0dXJuIDA7fQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlXQ1VTRVJfU2V0TWVudURldGFpbHMKKyAqCisgKiBHcmF5cyAvIHVuZ3JheXMgdGhlIG1lbnUgaXRlbXMgYWNjb3JkaW5nIHRvIHRoZWlyIHN0YXRlCisgKi8KK3N0YXRpYyB2b2lkCVdDVVNFUl9TZXRNZW51RGV0YWlscyhjb25zdCBzdHJ1Y3QgaW5uZXJfZGF0YSogZGF0YSkKK3sKKyAgICBITUVOVQkJaE1lbnUgPSBHZXRTeXN0ZW1NZW51KGRhdGEtPmhXbmQsIEZBTFNFKTsKKworICAgIGlmICghaE1lbnUpIHtUcmFjZSgwLCAiSXNzdWUgaW4gZ2V0dGluZyBtZW51IGJpdHNcbiIpO3JldHVybjt9CisKKyAgICAvKiBGSVhNRTogc2V0IHRoZSB2YXJpb3VzIG1lbnUgaXRlbXMgdG8gdGhlaXIgc3RhdGUgKGlmIGtub3duKSAqLworICAgIEVuYWJsZU1lbnVJdGVtKGhNZW51LCBJRFNfREVGQVVMVCwgTUZfQllDT01NQU5EfE1GX0dSQVlFRCk7CisKKyAgICBFbmFibGVNZW51SXRlbShoTWVudSwgSURTX01BUkssIE1GX0JZQ09NTUFORHxNRl9HUkFZRUQpOworICAgIEVuYWJsZU1lbnVJdGVtKGhNZW51LCBJRFNfQ09QWSwgTUZfQllDT01NQU5EfChkYXRhLT5oYXNTZWxlY3Rpb24gPyBNRl9FTkFCTEVEIDogTUZfR1JBWUVEKSk7CisgICAgRW5hYmxlTWVudUl0ZW0oaE1lbnUsIElEU19QQVNURSwgCisJCSAgIE1GX0JZQ09NTUFORHwoSXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUoQ0ZfVU5JQ09ERVRFWFQpIAorCQkJCSA/IE1GX0VOQUJMRUQgOiBNRl9HUkFZRUQpKTsKKyAgICAvKiBTZWxlY3QgYWxsOiBhbHdheXMgYWN0aXZlICovCisgICAgRW5hYmxlTWVudUl0ZW0oaE1lbnUsIElEU19TQ1JPTEwsIE1GX0JZQ09NTUFORHxNRl9HUkFZRUQpOworICAgIEVuYWJsZU1lbnVJdGVtKGhNZW51LCBJRFNfU0VBUkNILCBNRl9CWUNPTU1BTkR8TUZfR1JBWUVEKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCVdDVVNFUl9HZW5lcmF0ZUlucHV0UmVjb3JkCisgKgorICogZ2VuZXJhdGVzIGlucHV0X3JlY29yZCBmcm9tIHdpbmRvd3MgV01fS0VZVVAvV01fS0VZRE9XTiBtZXNzYWdlcworICovCitzdGF0aWMgdm9pZCAgICBXQ1VTRVJfR2VuZXJhdGVJbnB1dFJlY29yZChzdHJ1Y3QgaW5uZXJfZGF0YSogZGF0YSwgQk9PTCBkb3duLCAKKwkJCQkJICAgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSwgQk9PTCBzeXMpCit7CisgICAgSU5QVVRfUkVDT1JECWlyOworICAgIERXT1JECQluOworICAgIFdDSEFSCQlidWZbMl07CisgICAgQllURQkJa2V5U3RhdGVbMjU2XTsKKyAgICBzdGF0aWMJV0NIQVIJbGFzdDsgLyoga2VlcCBsYXN0IGNoYXIgc2VlbiBhcyBmZWVkIGZvciBrZXkgdXAgbWVzc2FnZSAqLworCisgICAgaXIuRXZlbnRUeXBlID0gS0VZX0VWRU5UOworICAgIGlyLkV2ZW50LktleUV2ZW50LmJLZXlEb3duID0gZG93bjsKKyAgICBpci5FdmVudC5LZXlFdmVudC53UmVwZWF0Q291bnQgPSBMT1dPUkQobFBhcmFtKTsKKyAgICBpci5FdmVudC5LZXlFdmVudC53VmlydHVhbEtleUNvZGUgPSB3UGFyYW07CisgICAgCisgICAgaXIuRXZlbnQuS2V5RXZlbnQud1ZpcnR1YWxTY2FuQ29kZSA9IEhJV09SRChsUGFyYW0pICYgMHhGRjsKKyAgICBHZXRLZXlib2FyZFN0YXRlKGtleVN0YXRlKTsKKyAgICAKKyAgICBpci5FdmVudC5LZXlFdmVudC51Q2hhci5Vbmljb2RlQ2hhciA9IDA7CisgICAgaXIuRXZlbnQuS2V5RXZlbnQuZHdDb250cm9sS2V5U3RhdGUgPSAwOworICAgIGlmIChsUGFyYW0gJiAoMUwgPDwgMjQpKQkJaXIuRXZlbnQuS2V5RXZlbnQuZHdDb250cm9sS2V5U3RhdGUgfD0gRU5IQU5DRURfS0VZOworICAgIGlmIChrZXlTdGF0ZVtWS19TSElGVF0gICAgJiAweDgwKQlpci5FdmVudC5LZXlFdmVudC5kd0NvbnRyb2xLZXlTdGF0ZSB8PSBTSElGVF9QUkVTU0VEOworICAgIGlmIChrZXlTdGF0ZVtWS19DT05UUk9MXSAgJiAweDgwKQlpci5FdmVudC5LZXlFdmVudC5kd0NvbnRyb2xLZXlTdGF0ZSB8PSBMRUZUX0NUUkxfUFJFU1NFRDsgLyogRklYTUU6IGdvdHRhIGNob29zZSBvbmUgKi8KKyAgICBpZiAoa2V5U3RhdGVbVktfTENPTlRST0xdICYgMHg4MCkJaXIuRXZlbnQuS2V5RXZlbnQuZHdDb250cm9sS2V5U3RhdGUgfD0gTEVGVF9DVFJMX1BSRVNTRUQ7CisgICAgaWYgKGtleVN0YXRlW1ZLX1JDT05UUk9MXSAmIDB4ODApCWlyLkV2ZW50LktleUV2ZW50LmR3Q29udHJvbEtleVN0YXRlIHw9IFJJR0hUX0NUUkxfUFJFU1NFRDsKKyAgICBpZiAoc3lzKQkJCQlpci5FdmVudC5LZXlFdmVudC5kd0NvbnRyb2xLZXlTdGF0ZSB8PSBMRUZUX0FMVF9QUkVTU0VEOyAvKiBGSVhNRTogZ290dGEgY2hvb3NlIG9uZSAqLworICAgIGlmIChrZXlTdGF0ZVtWS19MTUVOVV0gICAgJiAweDgwKQlpci5FdmVudC5LZXlFdmVudC5kd0NvbnRyb2xLZXlTdGF0ZSB8PSBMRUZUX0FMVF9QUkVTU0VEOworICAgIGlmIChrZXlTdGF0ZVtWS19STUVOVV0gICAgJiAweDgwKQlpci5FdmVudC5LZXlFdmVudC5kd0NvbnRyb2xLZXlTdGF0ZSB8PSBSSUdIVF9BTFRfUFJFU1NFRDsKKyAgICBpZiAoa2V5U3RhdGVbVktfQ0FQSVRBTF0gICYgMHgwMSkJaXIuRXZlbnQuS2V5RXZlbnQuZHdDb250cm9sS2V5U3RhdGUgfD0gQ0FQU0xPQ0tfT047CSAgICAKKyAgICBpZiAoa2V5U3RhdGVbVktfTlVNTE9DS10gICYgMHgwMSkJaXIuRXZlbnQuS2V5RXZlbnQuZHdDb250cm9sS2V5U3RhdGUgfD0gTlVNTE9DS19PTjsKKyAgICBpZiAoa2V5U3RhdGVbVktfU0NST0xMXSAgICYgMHgwMSkJaXIuRXZlbnQuS2V5RXZlbnQuZHdDb250cm9sS2V5U3RhdGUgfD0gU0NST0xMTE9DS19PTjsKKworICAgIGlmIChkYXRhLT5oYXNTZWxlY3Rpb24gJiYgaXIuRXZlbnQuS2V5RXZlbnQuZHdDb250cm9sS2V5U3RhdGUgPT0gMCAmJiAKKwlpci5FdmVudC5LZXlFdmVudC53VmlydHVhbEtleUNvZGUgPT0gVktfUkVUVVJOKQorICAgIHsKKwlkYXRhLT5oYXNTZWxlY3Rpb24gPSBGQUxTRTsKKwlXQ1VTRVJfU2V0U2VsZWN0aW9uKGRhdGEsIDApOworCVdDVVNFUl9Db3B5U2VsZWN0aW9uVG9DbGlwYm9hcmQoZGF0YSk7CisJcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBpZiAoIShpci5FdmVudC5LZXlFdmVudC5kd0NvbnRyb2xLZXlTdGF0ZSAmIEVOSEFOQ0VEX0tFWSkpCisgICAgeworCWlmIChkb3duKQorCXsKKwkgICAgc3dpdGNoIChUb1VuaWNvZGUod1BhcmFtLCBISVdPUkQobFBhcmFtKSwga2V5U3RhdGUsIGJ1ZiwgMiwgMCkpCisJICAgIHsKKwkgICAgY2FzZSAyOgorCQkvKiBGSVhNRS4uLiBzaG91bGQgZ2VuZXJhdGUgdHdvIGV2ZW50cy4uLiAqLworCQkvKiBmYWxsIHRocnUgKi8KKwkgICAgY2FzZSAxOgkKKwkJbGFzdCA9IGJ1ZlswXTsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCWxhc3QgPSAwOworCQlicmVhazsKKwkgICAgfQorCX0KKwlpci5FdmVudC5LZXlFdmVudC51Q2hhci5Vbmljb2RlQ2hhciA9IGxhc3Q7IC8qIEZJWE1FIEhBQ0tZLi4uIGFuZCBidWdneSAnY296IGl0IHNob3VsZCBiZSBhIHN0YWNrLCBub3QgYSBzaW5nbGUgdmFsdWUgKi8KKwlpZiAoIWRvd24pIGxhc3QgPSAwOworICAgIH0KKworICAgIFdyaXRlQ29uc29sZUlucHV0KGRhdGEtPmhDb25JbiwgJmlyLCAxLCAmbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlXQ1VTRVJfUHJvYworICoKKyAqCisgKi8KK3N0YXRpYyBMUkVTVUxUIENBTExCQUNLIFdDVVNFUl9Qcm9jKEhXTkQgaFduZCwgVUlOVCB1TXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIHN0cnVjdCBpbm5lcl9kYXRhKglkYXRhID0gKHN0cnVjdCBpbm5lcl9kYXRhKilHZXRXaW5kb3dMb25nKGhXbmQsIDApOworCisgICAgc3dpdGNoICh1TXNnKQorICAgIHsKKyAgICBjYXNlIFdNX0NSRUFURToKKyAgICAgICAgcmV0dXJuIFdDVVNFUl9DcmVhdGUoaFduZCwgKExQQ1JFQVRFU1RSVUNUKWxQYXJhbSk7CisgICAgY2FzZSBXTV9ERVNUUk9ZOgorCWRhdGEtPmhXbmQgPSAwOworCVBvc3RRdWl0TWVzc2FnZSgwKTsKKwlicmVhazsKKyAgICBjYXNlIFdNX1BBSU5UOgorCVdDVVNFUl9QYWludChkYXRhKTsKKwlicmVhazsKKyAgICBjYXNlIFdNX0tFWURPV046CisgICAgY2FzZSBXTV9LRVlVUDoKKwlXQ1VTRVJfR2VuZXJhdGVJbnB1dFJlY29yZChkYXRhLCB1TXNnID09IFdNX0tFWURPV04sIHdQYXJhbSwgbFBhcmFtLCBGQUxTRSk7CisJYnJlYWs7CisgICAgY2FzZSBXTV9TWVNLRVlET1dOOgorICAgIGNhc2UgV01fU1lTS0VZVVA6CisJV0NVU0VSX0dlbmVyYXRlSW5wdXRSZWNvcmQoZGF0YSwgdU1zZyA9PSBXTV9TWVNLRVlET1dOLCB3UGFyYW0sIGxQYXJhbSwgVFJVRSk7CisJYnJlYWs7CisgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjoKKwkvKiBFUFAgaWYgKHdQYXJhbSAhPSBNS19MQlVUVE9OKSAqLworCWlmIChkYXRhLT5oYXNTZWxlY3Rpb24pCisJeworCSAgICBkYXRhLT5oYXNTZWxlY3Rpb24gPSBGQUxTRTsKKwl9CisJZWxzZQorCXsKKwkgICAgZGF0YS0+c2VsZWN0UHQxID0gZGF0YS0+c2VsZWN0UHQyID0gV0NVU0VSX0dldENlbGwoZGF0YSwgbFBhcmFtKTsKKwkgICAgU2V0Q2FwdHVyZShkYXRhLT5oV25kKTsKKwl9CisJV0NVU0VSX1NldFNlbGVjdGlvbihkYXRhLCAwKTsKKwlicmVhazsKKyAgICBjYXNlIFdNX01PVVNFTU9WRToKKwkvKiBFUFAgaWYgKHdQYXJhbSAhPSBNS19MQlVUVE9OKSAqLworICAgICAgICBpZiAoR2V0Q2FwdHVyZSgpID09IGRhdGEtPmhXbmQpCisJeworCSAgICBXQ1VTRVJfTW92ZVNlbGVjdGlvbihkYXRhLCBXQ1VTRVJfR2V0Q2VsbChkYXRhLCBsUGFyYW0pLCBGQUxTRSk7CisJfQorCWJyZWFrOworICAgIGNhc2UgV01fTEJVVFRPTlVQOgorCS8qIEVQUCBpZiAod1BhcmFtICE9IE1LX0xCVVRUT04pICovCisgICAgICAgIGlmIChHZXRDYXB0dXJlKCkgPT0gZGF0YS0+aFduZCkKKwl7CisJICAgIFdDVVNFUl9Nb3ZlU2VsZWN0aW9uKGRhdGEsIFdDVVNFUl9HZXRDZWxsKGRhdGEsIGxQYXJhbSksIFRSVUUpOworCX0KKwlicmVhazsKKyAgICBjYXNlIFdNX1NFVEZPQ1VTOgorCWlmIChkYXRhLT5jdXJzb3JfdmlzaWJsZSkKKwl7CisJICAgIENyZWF0ZUNhcmV0KGRhdGEtPmhXbmQsIGRhdGEtPmN1cnNvcl9iaXRtYXAsIGRhdGEtPmNlbGxfd2lkdGgsIGRhdGEtPmNlbGxfaGVpZ2h0KTsgCisJICAgIFdDVVNFUl9Qb3NDdXJzb3IoZGF0YSk7CisJfQorICAgICAgICBicmVhazsgCisgICAgY2FzZSBXTV9LSUxMRk9DVVM6IAorCWlmIChkYXRhLT5jdXJzb3JfdmlzaWJsZSkKKwkgICAgRGVzdHJveUNhcmV0KCk7IAorCWJyZWFrOworICAgIGNhc2UgV01fSFNDUk9MTDogCisgICAgICAgIHsKKwkgICAgaW50CXBvcyA9IGRhdGEtPndpbl9wb3MuWDsKKworCSAgICBzd2l0Y2ggKExPV09SRCh3UGFyYW0pKSAKKwkgICAgeyAKKyAgICAgICAgICAgIGNhc2UgU0JfUEFHRVVQOiAJcG9zIC09IDg7IAkJYnJlYWs7IAorICAgICAgICAgICAgY2FzZSBTQl9QQUdFRE9XTjogCXBvcyArPSA4OyAJCWJyZWFrOyAKKyAgICAgICAgICAgIGNhc2UgU0JfTElORVVQOiAJcG9zLS07CQkJYnJlYWs7CisJICAgIGNhc2UgU0JfTElORURPV046IAlwb3MrKzsJIAkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNCX1RIVU1CVFJBQ0s6IHBvcyA9IEhJV09SRCh3UGFyYW0pOwlicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IAkJCQkJYnJlYWs7CisJICAgIH0gCisJICAgIGlmIChwb3MgPCAwKSBwb3MgPSAwOworCSAgICBpZiAocG9zID4gZGF0YS0+c2Jfd2lkdGggLSBkYXRhLT53aW5fd2lkdGgpIHBvcyA9IGRhdGEtPnNiX3dpZHRoIC0gZGF0YS0+d2luX3dpZHRoOworCSAgICBpZiAocG9zICE9IGRhdGEtPndpbl9wb3MuWCkKKwkgICAgeworCQlTY3JvbGxXaW5kb3coaFduZCwgKGRhdGEtPndpbl9wb3MuWCAtIHBvcykgKiBkYXRhLT5jZWxsX3dpZHRoLCAwLCBOVUxMLCBOVUxMKTsKKwkJZGF0YS0+d2luX3Bvcy5YID0gcG9zOworCQlTZXRTY3JvbGxQb3MoaFduZCwgU0JfSE9SWiwgcG9zLCBUUlVFKTsgCisJCVVwZGF0ZVdpbmRvdyhoV25kKTsgCisJCVdDVVNFUl9Qb3NDdXJzb3IoZGF0YSk7CisJCVdJTkVDT05fTm90aWZ5V2luZG93Q2hhbmdlKGRhdGEpOworCSAgICB9CisgICAgICAgIH0gCisJYnJlYWs7CisgICAgY2FzZSBXTV9WU0NST0xMOiAKKyAgICAgICAgeworCSAgICBpbnQJcG9zID0gZGF0YS0+d2luX3Bvcy5ZOworCisJICAgIHN3aXRjaCAoTE9XT1JEKHdQYXJhbSkpIAorCSAgICB7IAorICAgICAgICAgICAgY2FzZSBTQl9QQUdFVVA6IAlwb3MgLT0gODsgCQlicmVhazsgCisgICAgICAgICAgICBjYXNlIFNCX1BBR0VET1dOOiAJcG9zICs9IDg7IAkJYnJlYWs7IAorICAgICAgICAgICAgY2FzZSBTQl9MSU5FVVA6IAlwb3MtLTsJCQlicmVhazsKKwkgICAgY2FzZSBTQl9MSU5FRE9XTjogCXBvcysrOwkgCQlicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0JfVEhVTUJUUkFDSzogcG9zID0gSElXT1JEKHdQYXJhbSk7CWJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogCQkJCQlicmVhazsKKwkgICAgfSAKKwkgICAgaWYgKHBvcyA8IDApIHBvcyA9IDA7CisJICAgIGlmIChwb3MgPiBkYXRhLT5zYl9oZWlnaHQgLSBkYXRhLT53aW5faGVpZ2h0KSBwb3MgPSBkYXRhLT5zYl9oZWlnaHQgLSBkYXRhLT53aW5faGVpZ2h0OworCSAgICBpZiAocG9zICE9IGRhdGEtPndpbl9wb3MuWSkKKwkgICAgeworCQlTY3JvbGxXaW5kb3coaFduZCwgMCwgKGRhdGEtPndpbl9wb3MuWSAtIHBvcykgKiBkYXRhLT5jZWxsX2hlaWdodCwgTlVMTCwgTlVMTCk7CisJCWRhdGEtPndpbl9wb3MuWSA9IHBvczsKKwkJU2V0U2Nyb2xsUG9zKGhXbmQsIFNCX1ZFUlQsIHBvcywgVFJVRSk7IAorCQlVcGRhdGVXaW5kb3coaFduZCk7IAorCQlXQ1VTRVJfUG9zQ3Vyc29yKGRhdGEpOworCQlXSU5FQ09OX05vdGlmeVdpbmRvd0NoYW5nZShkYXRhKTsKKwkgICAgfQorICAgICAgICB9IAorCWJyZWFrOworICAgIGNhc2UgV01fU1lTQ09NTUFORDoKKwlzd2l0Y2ggKHdQYXJhbSkKKwl7CisJY2FzZSBJRFNfREVGQVVMVDoKKwkgICAgVHJhY2UoMCwgInVuaGFuZGxlZCB5ZXQgY29tbWFuZDogJXhcbiIsIHdQYXJhbSk7CisJICAgIGJyZWFrOworCWNhc2UgSURTX1BST1BFUlRZOgorCSAgICBXQ1VTRVJfR2V0UHJvcGVydGllcyhkYXRhKTsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDogCisJICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKGhXbmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKKwl9CisJYnJlYWs7CisgICAgY2FzZSBXTV9SQlVUVE9ORE9XTjoKKwlXQ1VTRVJfR2V0UHJvcGVydGllcyhkYXRhKTsKKwlicmVhazsgICAgCisgICAgY2FzZSBXTV9DT01NQU5EOgorCXN3aXRjaCAod1BhcmFtKQorCXsKKwljYXNlIElEU19NQVJLOgorCSAgICBnb3RvIG5peTsKKwljYXNlIElEU19DT1BZOgorCSAgICBkYXRhLT5oYXNTZWxlY3Rpb24gPSBGQUxTRTsKKwkgICAgV0NVU0VSX1NldFNlbGVjdGlvbihkYXRhLCAwKTsKKwkgICAgV0NVU0VSX0NvcHlTZWxlY3Rpb25Ub0NsaXBib2FyZChkYXRhKTsKKwkgICAgYnJlYWs7CisJY2FzZSBJRFNfUEFTVEU6CisJICAgIFdDVVNFUl9QYXN0ZUZyb21DbGlwYm9hcmQoZGF0YSk7CisJICAgIGJyZWFrOworCWNhc2UgSURTX1NFTEVDVEFMTDoKKwkgICAgZGF0YS0+c2VsZWN0UHQxLlggPSBkYXRhLT5zZWxlY3RQdDEuWSA9IDA7CisJICAgIGRhdGEtPnNlbGVjdFB0Mi5YID0gKGRhdGEtPnNiX3dpZHRoIC0gMSkgKiBkYXRhLT5jZWxsX3dpZHRoOworCSAgICBkYXRhLT5zZWxlY3RQdDIuWSA9IChkYXRhLT5zYl9oZWlnaHQgLSAxKSAqIGRhdGEtPmNlbGxfaGVpZ2h0OworCSAgICBXQ1VTRVJfU2V0U2VsZWN0aW9uKGRhdGEsIDApOworCSAgICBkYXRhLT5oYXNTZWxlY3Rpb24gPSBUUlVFOworCSAgICBicmVhazsKKwljYXNlIElEU19TQ1JPTEw6CisJY2FzZSBJRFNfU0VBUkNIOgorCW5peToKKwkgICAgVHJhY2UoMCwgInVuaGFuZGxlZCB5ZXQgY29tbWFuZDogJXhcbiIsIHdQYXJhbSk7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6IAorCSAgICByZXR1cm4gRGVmV2luZG93UHJvYyhoV25kLCB1TXNnLCB3UGFyYW0sIGxQYXJhbSk7CisJfQorCWJyZWFrOworICAgIGNhc2UgV01fSU5JVE1FTlVQT1BVUDoKKwlpZiAoIUhJV09SRChsUGFyYW0pKQlyZXR1cm4gRGVmV2luZG93UHJvYyhoV25kLCB1TXNnLCB3UGFyYW0sIGxQYXJhbSk7CisJV0NVU0VSX1NldE1lbnVEZXRhaWxzKGRhdGEpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJcmV0dXJuIERlZldpbmRvd1Byb2MoaFduZCwgdU1zZywgd1BhcmFtLCBsUGFyYW0pOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCVdDVVNFUl9EZWxldGVCYWNrZW5kCisgKgorICoKKyAqLwordm9pZCBXQ1VTRVJfRGVsZXRlQmFja2VuZChzdHJ1Y3QgaW5uZXJfZGF0YSogZGF0YSkKK3sKKyAgICBpZiAoZGF0YS0+aFduZCkJCURlc3Ryb3lXaW5kb3coZGF0YS0+aFduZCk7CisgICAgaWYgKGRhdGEtPmhGb250KQkJRGVsZXRlT2JqZWN0KGRhdGEtPmhGb250KTsKKyAgICBpZiAoZGF0YS0+Y3Vyc29yX2JpdG1hcCkJRGVsZXRlT2JqZWN0KGRhdGEtPmN1cnNvcl9iaXRtYXApOworICAgIGlmIChkYXRhLT5oTWVtREMpCQlEZWxldGVEQyhkYXRhLT5oTWVtREMpOworICAgIGlmIChkYXRhLT5oQml0bWFwKQkJRGVsZXRlT2JqZWN0KGRhdGEtPmhCaXRtYXApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJV0NVU0VSX01haW5Mb29wCisgKgorICoKKyAqLworc3RhdGljIGludCBXQ1VTRVJfTWFpbkxvb3Aoc3RydWN0IGlubmVyX2RhdGEqIGRhdGEpCit7CisgICAgTVNHCQltc2c7CisKKyAgICBmb3IgKDs7KSAKKyAgICB7CisJc3dpdGNoIChNc2dXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDEsICZkYXRhLT5oU3luY2hybywgRkFMU0UsIElORklOSVRFLCBRU19BTExJTlBVVCkpCisJeworCWNhc2UgV0FJVF9PQkpFQ1RfMDoKKwkgICAgaWYgKCFXSU5FQ09OX0dyYWJDaGFuZ2VzKGRhdGEpKQorCQlQb3N0UXVpdE1lc3NhZ2UoMCk7CisJICAgIGJyZWFrOworCWNhc2UgV0FJVF9PQkpFQ1RfMCsxOgorCSAgICBzd2l0Y2ggKEdldE1lc3NhZ2UoJm1zZywgMCwgMCwgMCkpCisJICAgIHsKKwkgICAgY2FzZSAtMTogLyogdGhlIGV2ZW50IGhhbmRsZSBiZWNhbWUgaW52YWxpZCwgc28gZXhpdCAqLworCQlyZXR1cm4gLTE7CisJICAgIGNhc2UgMDogLyogV01fUVVJVCBoYXMgYmVlbiBwb3N0ZWQgKi8KKwkJcmV0dXJuIDA7CisJICAgIGRlZmF1bHQ6CisJCURpc3BhdGNoTWVzc2FnZSgmbXNnKTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgVHJhY2UoMCwgImdvdCBwYlxuIik7CisJICAgIC8qIGVyciAqLworCSAgICBicmVhazsKKwl9CisgICAgfQkKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCVdDVVNFUl9Jbml0QmFja2VuZAorICoKKyAqIEluaXRpYWxpc2F0aW9uIHBhcnQgSUk6IGNyZWF0aW9uIG9mIHdpbmRvdy4KKyAqCisgKi8KK0JPT0wgV0NVU0VSX0luaXRCYWNrZW5kKHN0cnVjdCBpbm5lcl9kYXRhKiBkYXRhKQoreworICAgIHN0YXRpYyBXQ0hBUiB3Q2xhc3NOYW1lW10gPSB7J1cnLCdpJywnbicsJ2UnLCdDJywnbycsJ24nLCdzJywnbycsJ2wnLCdlJywnQycsJ2wnLCdhJywncycsJ3MnLDB9OworCisgICAgV05EQ0xBU1MJCXduZGNsYXNzOworICAgIHN0cnVjdCBmb250X2Nob29zZXIgZmM7CisKKyAgICBkYXRhLT5mbk1haW5Mb29wID0gV0NVU0VSX01haW5Mb29wOworICAgIGRhdGEtPmZuUG9zQ3Vyc29yID0gV0NVU0VSX1Bvc0N1cnNvcjsKKyAgICBkYXRhLT5mblNoYXBlQ3Vyc29yID0gV0NVU0VSX1NoYXBlQ3Vyc29yOworICAgIGRhdGEtPmZuQ29tcHV0ZVBvc2l0aW9ucyA9IFdDVVNFUl9Db21wdXRlUG9zaXRpb25zOworICAgIGRhdGEtPmZuUmVmcmVzaCA9IFdDVVNFUl9SZWZyZXNoOworICAgIGRhdGEtPmZuUmVzaXplU2NyZWVuQnVmZmVyID0gV0NVU0VSX1Jlc2l6ZVNjcmVlbkJ1ZmZlcjsKKyAgICBkYXRhLT5mblNldFRpdGxlID0gV0NVU0VSX1NldFRpdGxlOworICAgIGRhdGEtPmZuU2Nyb2xsID0gV0NVU0VSX1Njcm9sbDsKKyAgICBkYXRhLT5mbkRlbGV0ZUJhY2tlbmQgPSBXQ1VTRVJfRGVsZXRlQmFja2VuZDsKKworICAgIHduZGNsYXNzLnN0eWxlICAgICAgICAgPSAwOworICAgIHduZGNsYXNzLmxwZm5XbmRQcm9jICAgPSBXQ1VTRVJfUHJvYzsKKyAgICB3bmRjbGFzcy5jYkNsc0V4dHJhICAgID0gMDsKKyAgICB3bmRjbGFzcy5jYlduZEV4dHJhICAgID0gc2l6ZW9mKERXT1JEKTsKKyAgICB3bmRjbGFzcy5oSW5zdGFuY2UgICAgID0gR2V0TW9kdWxlSGFuZGxlKE5VTEwpOworICAgIHduZGNsYXNzLmhJY29uICAgICAgICAgPSBMb2FkSWNvbigwLCBJRElfV0lOTE9HTyk7CisgICAgd25kY2xhc3MuaEN1cnNvciAgICAgICA9IExvYWRDdXJzb3IoMCwgSURDX0FSUk9XKTsKKyAgICB3bmRjbGFzcy5oYnJCYWNrZ3JvdW5kID0gR2V0U3RvY2tPYmplY3QoQkxBQ0tfQlJVU0gpOworICAgIHduZGNsYXNzLmxwc3pNZW51TmFtZSAgPSBOVUxMOworICAgIHduZGNsYXNzLmxwc3pDbGFzc05hbWUgPSB3Q2xhc3NOYW1lOworICAKKyAgICBSZWdpc3RlckNsYXNzKCZ3bmRjbGFzcyk7CisKKyAgICBDcmVhdGVXaW5kb3cod25kY2xhc3MubHBzekNsYXNzTmFtZSwgTlVMTCwKKwkJIFdTX09WRVJMQVBQRUR8V1NfQ0FQVElPTnxXU19TWVNNRU5VfFdTX1RISUNLRlJBTUV8V1NfTUlOSU1JWkVCT1h8V1NfSFNDUk9MTHxXU19WU0NST0xMLCAKKwkJIENXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsIDAsIDAsIDAsIDAsIHduZGNsYXNzLmhJbnN0YW5jZSwgZGF0YSk7ICAgCisgICAgaWYgKCFkYXRhLT5oV25kKSByZXR1cm4gRkFMU0U7CisKKyAgICAvKiBmb3JjZSB1cGRhdGUgb2YgY3VycmVudCBkYXRhICovCisgICAgV0lORUNPTl9HcmFiQ2hhbmdlcyhkYXRhKTsKKworICAgIC8qIHRyeSB0byBmaW5kIGFuIGFjY2VwdGFibGUgZm9udCAqLworICAgIGZjLmRhdGEgPSBkYXRhOworICAgIGZjLmRvbmUgPSAwOworICAgIEVudW1Gb250RmFtaWxpZXMoZGF0YS0+aE1lbURDLCBOVUxMLCBnZXRfZmlyc3RfZm9udF9lbnVtLCAoTFBBUkFNKSZmYyk7CisKKyAgICByZXR1cm4gZmMuZG9uZTsKK30KKworCisKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3dpbmVjb25zb2xlL3dpbmVjb25fcHJpdmF0ZS5oIGIvcHJvZ3JhbXMvd2luZWNvbnNvbGUvd2luZWNvbl9wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0NDE2NAotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3dpbmVjb25zb2xlL3dpbmVjb25fcHJpdmF0ZS5oCkBAIC0wLDAgKzEsNzUgQEAKKyNpbmNsdWRlIDx3aW5iYXNlLmg+CisjaW5jbHVkZSA8d2luZ2RpLmg+CisjaW5jbHVkZSA8d2ludXNlci5oPgorI2luY2x1ZGUgPHdpbmNvbi5oPgorCisjaW5jbHVkZSAid2luZWNvbnNvbGVfcmVzLmgiCisKK3N0cnVjdCBpbm5lcl9kYXRhIHsKKyAgICB1bnNpZ25lZAkJc2Jfd2lkdGg7CS8qIGFjdGl2ZSBzY3JlZW4gYnVmZmVyIHdpZHRoICovCisgICAgdW5zaWduZWQJCXNiX2hlaWdodDsJLyogYWN0aXZlIHNjcmVlbiBidWZmZXIgaGVpZ2h0ICovCisgICAgQ0hBUl9JTkZPKgkJY2VsbHM7CQkvKiBsb2NhbCBjb3B5IG9mIGNlbGxzIChzYl93aWR0aCAqIHNiX2hlaWdodCkgKi8KKyAgICBDT09SRAkJd2luX3BvczsJLyogcG9zaXRpb24gKGluIGNlbGxzKSBvZiB2aXNpYmxlIHBhcnQgb2Ygc2NyZWVuIGJ1ZmZlciBpbiB3aW5kb3cgKi8KKyAgICB1bnNpZ25lZAkJd2luX3dpZHRoOwkvKiBzaXplIChpbiBjZWxscykgb2YgdmlzaWJsZSBwYXJ0IG9mIHdpbmRvdyAod2lkdGggJiBoZWlnaHQpICovCisgICAgdW5zaWduZWQJCXdpbl9oZWlnaHQ7CisKKyAgICBDT09SRAkJY3Vyc29yOwkJLyogcG9zaXRpb24gaW4gY2VsbHMgb2YgY3Vyc29yICovCisgICAgaW50CQkJY3Vyc29yX3Zpc2libGU7CisgICAgaW50CQkJY3Vyc29yX3NpemU7CS8qIGluICUgb2YgY2VsbCBoZWlnaHQgKi8KKworICAgIEhBTkRMRQkJaENvbkluOwkJLyogY29uc29sZSBpbnB1dCBoYW5kbGUgKi8KKyAgICBIQU5ETEUJCWhDb25PdXQ7CS8qIHNjcmVlbiBidWZmZXIgaGFuZGxlOiBoYXMgdG8gYmUgY2hhbmdlZCB3aGVuIGFjdGl2ZSBzYiBjaGFuZ2VzICovCisgICAgSEFORExFCQloU3luY2hybzsJLyogd2FpdGFibGUgaGFuZGxlIHNpZ25hbGxlZCBieSBzZXJ2ZXIgd2hlbiBzb21ldGhpbmcgaW4gc2VydmVyIGhhcyBiZWVuIG1vZGlmaWVkICovCisKKyAgICBpbnQJCQkoKmZuTWFpbkxvb3ApKHN0cnVjdCBpbm5lcl9kYXRhKiBkYXRhKTsKKyAgICB2b2lkCQkoKmZuUG9zQ3Vyc29yKShjb25zdCBzdHJ1Y3QgaW5uZXJfZGF0YSogZGF0YSk7CisgICAgdm9pZAkJKCpmblNoYXBlQ3Vyc29yKShzdHJ1Y3QgaW5uZXJfZGF0YSogZGF0YSwgaW50IHNpemUsIGludCB2aXMsIEJPT0wgZm9yY2UpOworICAgIHZvaWQJCSgqZm5Db21wdXRlUG9zaXRpb25zKShzdHJ1Y3QgaW5uZXJfZGF0YSogZGF0YSk7CisgICAgdm9pZAkJKCpmblJlZnJlc2gpKGNvbnN0IHN0cnVjdCBpbm5lcl9kYXRhKiBkYXRhLCBpbnQgdHAsIGludCBibSk7CisgICAgdm9pZAkJKCpmblJlc2l6ZVNjcmVlbkJ1ZmZlcikoc3RydWN0IGlubmVyX2RhdGEqIGRhdGEpOworICAgIHZvaWQJCSgqZm5TZXRUaXRsZSkoY29uc3Qgc3RydWN0IGlubmVyX2RhdGEqIGRhdGEpOworICAgIHZvaWQJCSgqZm5TY3JvbGwpKHN0cnVjdCBpbm5lcl9kYXRhKiBkYXRhLCBpbnQgcG9zLCBCT09MIGhvcnopOworICAgIHZvaWQJCSgqZm5EZWxldGVCYWNrZW5kKShzdHJ1Y3QgaW5uZXJfZGF0YSogZGF0YSk7CisKKyAgICAvKiB0aGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgb25seSB1c2VyIGJ5IHRoZSBVU0VSIGJhY2tlbmQgKHNob3VsZCBiZSBoaWRkZW4gaW4gdXNlcikgKi8KKyAgICBIV05ECQloV25kOwkJLyogaGFuZGxlIHRvIHdpbmRvd3MgZm9yIHJlbmRlcmluZyAqLworICAgIEhGT05UCQloRm9udDsJCS8qIGZvbnQgdXNlZCBmb3IgcmVuZGVyaW5nLCB1c3VhbGx5IGZpeGVkICovCisgICAgTE9HRk9OVAkJbG9nRm9udDsJLyogbG9nRm9udCBkc2NyaXB0aW9uIGZvciB1c2VkIGhGb250ICovCisgICAgdW5zaWduZWQJCWNlbGxfd2lkdGg7CS8qIHdpZHRoIGluIHBpeGVscyBvZiBhIGNoYXJhY3RlciAqLwkKKyAgICB1bnNpZ25lZAkJY2VsbF9oZWlnaHQ7CS8qIGhlaWdodCBpbiBwaXhlbHMgb2YgYSBjaGFyYWN0ZXIgKi8KKyAgICBIREMJCQloTWVtREM7CQkvKiBtZW1vcnkgREMgaG9sZGluZyB0aGUgYml0bWFwIGJlbG93ICovCisgICAgSEJJVE1BUAkJaEJpdG1hcDsJLyogYml0bWFwIG9mIGRpc3BsYXkgd2luZG93IGNvbnRlbnQgKi8KKworICAgIEhCSVRNQVAJCWN1cnNvcl9iaXRtYXA7ICAvKiBiaXRtYXAgdXNlZCBmb3IgdGhlIGNhcmV0ICovCisgICAgQk9PTAkJaGFzU2VsZWN0aW9uOwkvKiBhIHJlY3Rhbmd1bGFyIG1vdXNlIHNlbGVjdGlvbiBoYXMgdGFrZW4gcGxhY2UgKi8KKyAgICBDT09SRAkJc2VsZWN0UHQxOwkvKiBzdGFydCAoYW5kIGVuZCkgcG9pbnQgb2YgYSBtb3VzZSBzZWxlY3Rpb24gKi8KKyAgICBDT09SRAkJc2VsZWN0UHQyOworfTsKKworIyAgaWZkZWYgX19HTlVDX18KK2V4dGVybiB2b2lkICBYVHJhY2VyKGludCBsZXZlbCwgY29uc3QgY2hhciogZm9ybWF0LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLDIsMykpKTsKKyMgIGVsc2UKK2V4dGVybiB2b2lkICBYVHJhY2VyKGludCBsZXZlbCwgY29uc3QgY2hhciogZm9ybWF0LCAuLi4pOworIyAgZW5kaWYKKyNpZiAwCisvKiBUcmFjZSBtb2RlICovCisjICBkZWZpbmUgVHJhY2UgWFRyYWNlcgorI2Vsc2UKKy8qIG5vbiB0cmFjZSBtb2RlICovCisjICBkZWZpbmUgVHJhY2UgKDEpID8gKHZvaWQpMCA6IFhUcmFjZXIKKyNlbmRpZgorCitleHRlcm4gdm9pZCBXSU5FQ09OX05vdGlmeVdpbmRvd0NoYW5nZShzdHJ1Y3QgaW5uZXJfZGF0YSogZGF0YSk7CitleHRlcm4gaW50ICBXSU5FQ09OX0dldEhpc3RvcnlTaXplKEhBTkRMRSBoQ29uSW4pOworZXh0ZXJuIEJPT0wgV0lORUNPTl9TZXRIaXN0b3J5U2l6ZShIQU5ETEUgaENvbkluLCBpbnQgc2l6ZSk7CitleHRlcm4gaW50ICBXSU5FQ09OX0dldEhpc3RvcnlNb2RlKEhBTkRMRSBoQ29uSW4pOworZXh0ZXJuIEJPT0wgV0lORUNPTl9TZXRIaXN0b3J5TW9kZShIQU5ETEUgaENvbkluLCBpbnQgbW9kZSk7CitleHRlcm4gQk9PTCBXSU5FQ09OX0dldENvbnNvbGVUaXRsZShIQU5ETEUgaENvbkluLCBXQ0hBUiogYnVmZmVyLCBzaXplX3QgbGVuKTsKK2V4dGVybiB2b2lkIFdJTkVDT05fRmV0Y2hDZWxscyhzdHJ1Y3QgaW5uZXJfZGF0YSogZGF0YSwgaW50IHVwZF90cCwgaW50IHVwZF9ibSk7CitleHRlcm4gaW50ICBXSU5FQ09OX0dyYWJDaGFuZ2VzKHN0cnVjdCBpbm5lcl9kYXRhKiBkYXRhKTsKKworZXh0ZXJuIEJPT0wgV0NVU0VSX0dldFByb3BlcnRpZXMoc3RydWN0IGlubmVyX2RhdGEqKTsKK2V4dGVybiBCT09MIFdDVVNFUl9TZXRGb250KHN0cnVjdCBpbm5lcl9kYXRhKiBkYXRhLCBjb25zdCBMT0dGT05UKiBmb250LCBjb25zdCBURVhUTUVUUklDKiB0bSk7CitleHRlcm4gQk9PTCBXQ1VTRVJfVmFsaWRhdGVGb250KGNvbnN0IHN0cnVjdCBpbm5lcl9kYXRhKiBkYXRhLCBjb25zdCBMT0dGT05UKiBsZik7CitleHRlcm4gQk9PTCBXQ1VTRVJfVmFsaWRhdGVGb250TWV0cmljKGNvbnN0IHN0cnVjdCBpbm5lcl9kYXRhKiBkYXRhLCBjb25zdCBURVhUTUVUUklDKiB0bSk7CitleHRlcm4gQk9PTCBXQ1VTRVJfSW5pdEJhY2tlbmQoc3RydWN0IGlubmVyX2RhdGEqIGRhdGEpOwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvd2luZWNvbnNvbGUvd2luZWNvbnNvbGUuYyBiL3Byb2dyYW1zL3dpbmVjb25zb2xlL3dpbmVjb25zb2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiYTU4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3dpbmVjb25zb2xlL3dpbmVjb25zb2xlLmMKQEAgLTAsMCArMSw0NzkgQEAKKy8qCisgKiBhbiBhcHBsaWNhdGlvbiBmb3IgZGlzcGxheWluZyBXaW4zMiBjb25zb2xlCisgKgorICogQ29weXJpZ2h0IDIwMDEgRXJpYyBQb3VlY2gKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx3aW5lL3NlcnZlci5oPgorI2luY2x1ZGUgIndpbmVjb25fcHJpdmF0ZS5oIgorCitzdGF0aWMgaW50IHRyYWNlX2xldmVsID0gMTsKK3ZvaWQgICAgICBYVHJhY2VyKGludCBsZXZlbCwgY29uc3QgY2hhciogZm9ybWF0LCAuLi4pCit7CisgICAgY2hhciAgICAgICAgYnVmWzEwMjRdOworICAgIHZhX2xpc3QgICAgIHZhbGlzdDsKKyAgICBpbnQgICAgICAgICBsZW47CisKKyAgICBpZiAobGV2ZWwgPiB0cmFjZV9sZXZlbCkgcmV0dXJuOworCisgICAgdmFfc3RhcnQodmFsaXN0LCBmb3JtYXQpOworICAgIGxlbiA9IHd2c25wcmludGZBKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCwgdmFsaXN0KTsKKyAgICB2YV9lbmQodmFsaXN0KTsKKyAKKyAgICBpZiAobGVuIDw9IC0xKSAKKyAgICB7CisgICAgICAgIGxlbiA9IHNpemVvZihidWYpIC0gMTsKKyAgICAgICAgYnVmW2xlbl0gPSAwOworICAgICAgICBidWZbbGVuIC0gMV0gPSBidWZbbGVuIC0gMl0gPSBidWZbbGVuIC0gM10gPSAnLic7CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCBidWYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJV0lORUNPTl9GZXRjaENlbGxzCisgKgorICogdXBkYXRlcyB0aGUgbG9jYWwgY29weSBvZiBjZWxscyAoYmFuZCB0byB1cGRhdGUpCisgKi8KK3ZvaWQJV0lORUNPTl9GZXRjaENlbGxzKHN0cnVjdCBpbm5lcl9kYXRhKiBkYXRhLCBpbnQgdXBkX3RwLCBpbnQgdXBkX2JtKQoreworICAgIGludAkJc3RlcDsKKyAgICBpbnQJCWosIG5yOworCisgICAgc3RlcCA9IFJFUVVFU1RfTUFYX1ZBUl9TSVpFIC8gKGRhdGEtPnNiX3dpZHRoICogNCk7CisKKyAgICBmb3IgKGogPSB1cGRfdHA7IGogPD0gdXBkX2JtOyBqICs9IHN0ZXApCisgICAgeworCW5yID0gbWluKHN0ZXAsIHVwZF9ibSAtIGogKyAxKTsKKwlTRVJWRVJfU1RBUlRfVkFSX1JFUSggcmVhZF9jb25zb2xlX291dHB1dCwgNCAqIG5yICogZGF0YS0+c2Jfd2lkdGggKQorCXsKKwkgICAgcmVxLT5oYW5kbGUgICAgICAgPSAoaGFuZGxlX3QpZGF0YS0+aENvbk91dDsKKwkgICAgcmVxLT54ICAgICAgICAgICAgPSAwOworCSAgICByZXEtPnkgICAgICAgICAgICA9IGo7CisJICAgIHJlcS0+dyAgICAgICAgICAgID0gZGF0YS0+c2Jfd2lkdGg7CisJICAgIHJlcS0+aCAgICAgICAgICAgID0gbnI7CisJICAgIGlmICghU0VSVkVSX0NBTExfRVJSKCkpCisJICAgIHsKKwkJaWYgKGRhdGEtPnNiX3dpZHRoICE9IHJlcS0+ZWZmX3cgfHwgbnIgIT0gcmVxLT5lZmZfaCkgCisJCSAgICBUcmFjZSgwLCAicGIgaGVyZS4uLiB3cm9uZyBlZmZfdyAlZC8lZCBvciBlZmZfaCAlZC8lZFxuIiwgCisJCQkgIHJlcS0+ZWZmX3csIGRhdGEtPnNiX3dpZHRoLCByZXEtPmVmZl9oLCBucik7CisJCW1lbWNweSgmZGF0YS0+Y2VsbHNbaiAqIGRhdGEtPnNiX3dpZHRoXSwgc2VydmVyX2RhdGFfcHRyKHJlcSksIAorCQkgICAgICAgNCAqIG5yICogZGF0YS0+c2Jfd2lkdGgpOworCSAgICB9CisJfQorCVNFUlZFUl9FTkRfVkFSX1JFUTsKKyAgICB9CisgICAgZGF0YS0+Zm5SZWZyZXNoKGRhdGEsIHVwZF90cCwgdXBkX2JtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCVdJTkVDT05fTm90aWZ5V2luZG93Q2hhbmdlCisgKgorICogSW5mb3JtIHNlcnZlciB0aGF0IHZpc2libGUgd2luZG93IG9uIHNiIGhhcyBjaGFuZ2VkCisgKi8KK3ZvaWQJV0lORUNPTl9Ob3RpZnlXaW5kb3dDaGFuZ2Uoc3RydWN0IGlubmVyX2RhdGEqIGRhdGEpCit7CisgICAgU0VSVkVSX1NUQVJUX1JFUSggc2V0X2NvbnNvbGVfb3V0cHV0X2luZm8gKQorICAgIHsKKwlyZXEtPmhhbmRsZSAgICAgICA9IChoYW5kbGVfdClkYXRhLT5oQ29uT3V0OworCXJlcS0+d2luX2xlZnQgICAgID0gZGF0YS0+d2luX3Bvcy5YOworCXJlcS0+d2luX3RvcCAgICAgID0gZGF0YS0+d2luX3Bvcy5ZOworCXJlcS0+d2luX3JpZ2h0ICAgID0gZGF0YS0+d2luX3Bvcy5YICsgZGF0YS0+d2luX3dpZHRoIC0gMTsKKwlyZXEtPndpbl9ib3R0b20gICA9IGRhdGEtPndpbl9wb3MuWSArIGRhdGEtPndpbl9oZWlnaHQgLSAxOworCXJlcS0+bWFzayAgICAgICAgID0gU0VUX0NPTlNPTEVfT1VUUFVUX0lORk9fRElTUExBWV9XSU5ET1c7CisJaWYgKCFTRVJWRVJfQ0FMTF9FUlIoKSkKKwl7CisJfQorICAgIH0KKyAgICBTRVJWRVJfRU5EX1JFUTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCVdJTkVDT05fR2V0SGlzdG9yeVNpemUKKyAqCisgKgorICovCitpbnQJV0lORUNPTl9HZXRIaXN0b3J5U2l6ZShIQU5ETEUgaENvbkluKQoreworICAgIGludAlyZXQgPSAwOworCisgICAgU0VSVkVSX1NUQVJUX1JFUShnZXRfY29uc29sZV9pbnB1dF9pbmZvKQorICAgIHsKKwlyZXEtPmhhbmRsZSA9IChoYW5kbGVfdCloQ29uSW47CisJaWYgKCFTRVJWRVJfQ0FMTF9FUlIoKSkgcmV0ID0gcmVxLT5oaXN0b3J5X3NpemU7CisgICAgfQorICAgIFNFUlZFUl9FTkRfUkVROworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlXSU5FQ09OX1NldEhpc3RvcnlTaXplCisgKgorICoKKyAqLworQk9PTAlXSU5FQ09OX1NldEhpc3RvcnlTaXplKEhBTkRMRSBoQ29uSW4sIGludCBzaXplKQoreworICAgIEJPT0wJcmV0OworCisgICAgU0VSVkVSX1NUQVJUX1JFUShzZXRfY29uc29sZV9pbnB1dF9pbmZvKQorICAgIHsKKwlyZXEtPmhhbmRsZSA9IChoYW5kbGVfdCloQ29uSW47CisJcmVxLT5tYXNrID0gU0VUX0NPTlNPTEVfSU5QVVRfSU5GT19ISVNUT1JZX1NJWkU7CisJcmVxLT5oaXN0b3J5X3NpemUgPSBzaXplOworCXJldCA9ICFTRVJWRVJfQ0FMTF9FUlIoKTsKKyAgICB9CisgICAgU0VSVkVSX0VORF9SRVE7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJV0lORUNPTl9HZXRIaXN0b3J5TW9kZQorICoKKyAqCisgKi8KK2ludAlXSU5FQ09OX0dldEhpc3RvcnlNb2RlKEhBTkRMRSBoQ29uSW4pCit7CisgICAgaW50CXJldCA9IDA7CisKKyAgICBTRVJWRVJfU1RBUlRfUkVRKGdldF9jb25zb2xlX2lucHV0X2luZm8pCisgICAgeworCXJlcS0+aGFuZGxlID0gKGhhbmRsZV90KWhDb25JbjsKKwlpZiAoIVNFUlZFUl9DQUxMX0VSUigpKSByZXQgPSByZXEtPmhpc3RvcnlfbW9kZTsKKyAgICB9CisgICAgU0VSVkVSX0VORF9SRVE7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCVdJTkVDT05fU2V0SGlzdG9yeU1vZGUKKyAqCisgKgorICovCitCT09MCVdJTkVDT05fU2V0SGlzdG9yeU1vZGUoSEFORExFIGhDb25JbiwgaW50IG1vZGUpCit7CisgICAgQk9PTAlyZXQ7CisKKyAgICBTRVJWRVJfU1RBUlRfUkVRKHNldF9jb25zb2xlX2lucHV0X2luZm8pCisgICAgeworCXJlcS0+aGFuZGxlID0gKGhhbmRsZV90KWhDb25JbjsKKwlyZXEtPm1hc2sgPSBTRVRfQ09OU09MRV9JTlBVVF9JTkZPX0hJU1RPUllfTU9ERTsKKwlyZXEtPmhpc3RvcnlfbW9kZSA9IG1vZGU7CisJcmV0ID0gIVNFUlZFUl9DQUxMX0VSUigpOworICAgIH0KKyAgICBTRVJWRVJfRU5EX1JFUTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJV0lORUNPTl9HZXRDb25zb2xlVGl0bGUKKyAqCisgKgorICovCitCT09MCVdJTkVDT05fR2V0Q29uc29sZVRpdGxlKEhBTkRMRSBoQ29uSW4sIFdDSEFSKiBidWZmZXIsIHNpemVfdCBsZW4pCit7CisgICAgQk9PTAlyZXQ7CisgICAgRFdPUkQgCXNpemUgPSAwOworCisgICAgU0VSVkVSX1NUQVJUX1ZBUl9SRVEoZ2V0X2NvbnNvbGVfaW5wdXRfaW5mbywgc2l6ZW9mKGJ1ZmZlcikpCisgICAgeworCXJlcS0+aGFuZGxlID0gKGhhbmRsZV90KWhDb25JbjsKKyAgICAgICAgaWYgKChyZXQgPSAhU0VSVkVSX0NBTExfRVJSKCkpKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplID0gbWluKGxlbiAtIHNpemVvZihXQ0hBUiksIHNlcnZlcl9kYXRhX3NpemUocmVxKSk7CisgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLCBzZXJ2ZXJfZGF0YV9wdHIocmVxKSwgc2l6ZSk7CisgICAgICAgICAgICBidWZmZXJbc2l6ZSAvIHNpemVvZihXQ0hBUildID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBTRVJWRVJfRU5EX1ZBUl9SRVE7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCVdJTkVDT05fR3JhYkNoYW5nZXMKKyAqCisgKiBBIGNoYW5nZSBvY2N1cnMsIHRyeSB0byBmaWd1cmUgb3V0IHdoaWNoCisgKi8KK2ludAlXSU5FQ09OX0dyYWJDaGFuZ2VzKHN0cnVjdCBpbm5lcl9kYXRhKiBkYXRhKQoreworICAgIHN0cnVjdCBjb25zb2xlX3JlbmRlcmVyX2V2ZW50CWV2dHNbMTZdOworICAgIGludAlpLCBudW07CisgICAgSEFORExFIGg7CisKKyAgICBTRVJWRVJfU1RBUlRfVkFSX1JFUSggZ2V0X2NvbnNvbGVfcmVuZGVyZXJfZXZlbnRzLCBzaXplb2YoZXZ0cykgKQorICAgIHsKKwlyZXEtPmhhbmRsZSAgICAgICA9IChoYW5kbGVfdClkYXRhLT5oU3luY2hybzsKKwlpZiAoIVNFUlZFUl9DQUxMX0VSUigpKQorCXsKKwkgICAgbnVtID0gc2VydmVyX2RhdGFfc2l6ZShyZXEpOworCSAgICBtZW1jcHkoZXZ0cywgc2VydmVyX2RhdGFfcHRyKHJlcSksIG51bSk7CisJICAgIG51bSAvPSBzaXplb2YoZXZ0c1swXSk7CisJfQorCWVsc2UgbnVtID0gMDsKKyAgICB9CisgICAgU0VSVkVSX0VORF9WQVJfUkVROworICAgIGlmICghbnVtKSB7VHJhY2UoMCwgImhtbSByZW5kZXJlciBzaWduYWxlZCBidXQgbm8gZXZlbnRzIGF2YWlsYWJsZVxuIik7IHJldHVybiAxO30KKyAgICAKKyAgICAvKiBGSVhNRTogc2hvdWxkIGRvIHNvbWUgZXZlbnQgY29tcHJlc3Npb24gaGVyZSAoY3Vyc29yIHBvcywgdXBkYXRlKSAqLworICAgIFRyYWNlKDEsICJDaGFuZ2Ugbm90aWZpY2F0aW9uOiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKyAgICB7CisJc3dpdGNoIChldnRzW2ldLmV2ZW50KQorCXsKKwljYXNlIENPTlNPTEVfUkVOREVSRVJfVElUTEVfRVZFTlQ6CisJICAgIGRhdGEtPmZuU2V0VGl0bGUoZGF0YSk7CisJICAgIGJyZWFrOworCWNhc2UgQ09OU09MRV9SRU5ERVJFUl9BQ1RJVkVfU0JfRVZFTlQ6CisJICAgIFNFUlZFUl9TVEFSVF9SRVEoIG9wZW5fY29uc29sZSApCisJICAgIHsKKwkJcmVxLT5mcm9tICAgID0gKGludClkYXRhLT5oQ29uSW47CisJCXJlcS0+YWNjZXNzICA9IEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEU7CisJCXJlcS0+c2hhcmUgICA9IEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEU7CisJCXJlcS0+aW5oZXJpdCA9IEZBTFNFOworCQloID0gU0VSVkVSX0NBTExfRVJSKCkgPyAwIDogKEhBTkRMRSlyZXEtPmhhbmRsZTsKKwkgICAgfQorCSAgICBTRVJWRVJfRU5EX1JFUTsKKwkgICAgVHJhY2UoMSwgIiBhY3RpdmUoJWQpIiwgKGludCloKTsKKwkgICAgaWYgKGgpCisJICAgIHsKKwkJQ2xvc2VIYW5kbGUoZGF0YS0+aENvbk91dCk7CisJCWRhdGEtPmhDb25PdXQgPSBoOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgQ09OU09MRV9SRU5ERVJFUl9TQl9SRVNJWkVfRVZFTlQ6CisJICAgIGlmIChkYXRhLT5zYl93aWR0aCAhPSBldnRzW2ldLnUucmVzaXplLndpZHRoIHx8IAorCQlkYXRhLT5zYl9oZWlnaHQgIT0gZXZ0c1tpXS51LnJlc2l6ZS5oZWlnaHQpCisJICAgIHsKKwkJVHJhY2UoMSwgIiByZXNpemUoJWQsJWQpIiwgZXZ0c1tpXS51LnJlc2l6ZS53aWR0aCwgZXZ0c1tpXS51LnJlc2l6ZS5oZWlnaHQpOworCQlkYXRhLT5zYl93aWR0aCAgPSBldnRzW2ldLnUucmVzaXplLndpZHRoOworCQlkYXRhLT5zYl9oZWlnaHQgPSBldnRzW2ldLnUucmVzaXplLmhlaWdodDsKKwkJCisJCWRhdGEtPmNlbGxzID0gSGVhcFJlQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgZGF0YS0+Y2VsbHMsCisJCQkJCSAgZGF0YS0+c2Jfd2lkdGggKiBkYXRhLT5zYl9oZWlnaHQgKiBzaXplb2YoQ0hBUl9JTkZPKSk7CisJCWlmICghZGF0YS0+Y2VsbHMpIHtUcmFjZSgwLCAiT09NXG4iKTsgZXhpdCgwKTt9CisJCWRhdGEtPmZuUmVzaXplU2NyZWVuQnVmZmVyKGRhdGEpOworCQlkYXRhLT5mbkNvbXB1dGVQb3NpdGlvbnMoZGF0YSk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBDT05TT0xFX1JFTkRFUkVSX1VQREFURV9FVkVOVDoKKwkgICAgVHJhY2UoMSwgIiB1cGRhdGUoJWQsJWQpIiwgZXZ0c1tpXS51LnVwZGF0ZS50b3AsIGV2dHNbaV0udS51cGRhdGUuYm90dG9tKTsKKwkgICAgV0lORUNPTl9GZXRjaENlbGxzKGRhdGEsIGV2dHNbaV0udS51cGRhdGUudG9wLCBldnRzW2ldLnUudXBkYXRlLmJvdHRvbSk7CisJICAgIGJyZWFrOworCWNhc2UgQ09OU09MRV9SRU5ERVJFUl9DVVJTT1JfUE9TX0VWRU5UOgorCSAgICBpZiAoZXZ0c1tpXS51LmN1cnNvcl9wb3MueCAhPSBkYXRhLT5jdXJzb3IuWCB8fCBldnRzW2ldLnUuY3Vyc29yX3Bvcy55ICE9IGRhdGEtPmN1cnNvci5ZKQorCSAgICB7CQorCQlkYXRhLT5jdXJzb3IuWCA9IGV2dHNbaV0udS5jdXJzb3JfcG9zLng7CisJCWRhdGEtPmN1cnNvci5ZID0gZXZ0c1tpXS51LmN1cnNvcl9wb3MueTsKKwkJZGF0YS0+Zm5Qb3NDdXJzb3IoZGF0YSk7CisJCVRyYWNlKDEsICIgY3Vycy1wb3MoJWQsJWQpIixldnRzW2ldLnUuY3Vyc29yX3Bvcy54LCBldnRzW2ldLnUuY3Vyc29yX3Bvcy55KTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIENPTlNPTEVfUkVOREVSRVJfQ1VSU09SX0dFT01fRVZFTlQ6CisJICAgIGlmIChldnRzW2ldLnUuY3Vyc29yX2dlb20uc2l6ZSAhPSBkYXRhLT5jdXJzb3Jfc2l6ZSB8fCAKKwkJZXZ0c1tpXS51LmN1cnNvcl9nZW9tLnZpc2libGUgIT0gZGF0YS0+Y3Vyc29yX3Zpc2libGUpCisJICAgIHsKKwkJZGF0YS0+Zm5TaGFwZUN1cnNvcihkYXRhLCBldnRzW2ldLnUuY3Vyc29yX2dlb20uc2l6ZSwgCisJCQkJICAgIGV2dHNbaV0udS5jdXJzb3JfZ2VvbS52aXNpYmxlLCBGQUxTRSk7CisJCVRyYWNlKDEsICIgY3Vycy1nZW9tKCVkLCVkKSIsIAorCQkgICAgICBldnRzW2ldLnUuY3Vyc29yX2dlb20uc2l6ZSwgZXZ0c1tpXS51LmN1cnNvcl9nZW9tLnZpc2libGUpOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgQ09OU09MRV9SRU5ERVJFUl9ESVNQTEFZX0VWRU5UOgorCSAgICBpZiAoZXZ0c1tpXS51LmRpc3BsYXkubGVmdCAhPSBkYXRhLT53aW5fcG9zLlgpCisJICAgIHsKKwkJZGF0YS0+Zm5TY3JvbGwoZGF0YSwgZXZ0c1tpXS51LmRpc3BsYXkubGVmdCwgVFJVRSk7CisJCWRhdGEtPmZuUG9zQ3Vyc29yKGRhdGEpOworCQlUcmFjZSgxLCAiIGgtc2Nyb2xsKCVkKSIsIGV2dHNbaV0udS5kaXNwbGF5LmxlZnQpOworCSAgICB9CisJICAgIGlmIChldnRzW2ldLnUuZGlzcGxheS50b3AgIT0gZGF0YS0+d2luX3Bvcy5ZKQorCSAgICB7CisJCWRhdGEtPmZuU2Nyb2xsKGRhdGEsIGV2dHNbaV0udS5kaXNwbGF5LnRvcCwgRkFMU0UpOworCQlkYXRhLT5mblBvc0N1cnNvcihkYXRhKTsKKwkJVHJhY2UoMSwgIiB2LXNjcm9sbCglZCkiLCBldnRzW2ldLnUuZGlzcGxheS50b3ApOworCSAgICB9CisJICAgIGlmIChldnRzW2ldLnUuZGlzcGxheS53aWR0aCAhPSBkYXRhLT53aW5fd2lkdGggfHwgCisJCWV2dHNbaV0udS5kaXNwbGF5LmhlaWdodCAhPSBkYXRhLT53aW5faGVpZ2h0KQorCSAgICB7CisJCVRyYWNlKDEsICIgd2luLXNpemUoJWQsJWQpIiwgZXZ0c1tpXS51LmRpc3BsYXkud2lkdGgsIGV2dHNbaV0udS5kaXNwbGF5LmhlaWdodCk7CisJCWRhdGEtPndpbl93aWR0aCA9IGV2dHNbaV0udS5kaXNwbGF5LndpZHRoOworCQlkYXRhLT53aW5faGVpZ2h0ID0gZXZ0c1tpXS51LmRpc3BsYXkuaGVpZ2h0OworCQlkYXRhLT5mbkNvbXB1dGVQb3NpdGlvbnMoZGF0YSk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBDT05TT0xFX1JFTkRFUkVSX0VYSVRfRVZFTlQ6CisJICAgIFRyYWNlKDEsICIuIEV4aXQhIVxuIik7CisJICAgIHJldHVybiAwOworCWRlZmF1bHQ6CisJICAgIFRyYWNlKDAsICJVbmtub3duIGV2ZW50IHR5cGUgKCVkKVxuIiwgZXZ0c1tpXS5ldmVudCk7CisJfQorICAgIH0KKworICAgIFRyYWNlKDEsICIuIERvbmVcbiIpOworICAgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJV0lORUNPTl9EZWxldGUKKyAqCisgKiBEZXN0cm95IHdpbmVjb25zb2xlIGludGVybmFsIGRhdGEKKyAqLworc3RhdGljIHZvaWQgV0lORUNPTl9EZWxldGUoc3RydWN0IGlubmVyX2RhdGEqIGRhdGEpCit7CisgICAgaWYgKCFkYXRhKSByZXR1cm47CisKKyAgICBpZiAoZGF0YS0+aENvbkluKQkJQ2xvc2VIYW5kbGUoZGF0YS0+aENvbkluKTsKKyAgICBpZiAoZGF0YS0+aENvbk91dCkJCUNsb3NlSGFuZGxlKGRhdGEtPmhDb25PdXQpOworICAgIGlmIChkYXRhLT5oU3luY2hybykJCUNsb3NlSGFuZGxlKGRhdGEtPmhTeW5jaHJvKTsKKyAgICBpZiAoZGF0YS0+Y2VsbHMpCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkYXRhLT5jZWxscyk7CisgICAgZGF0YS0+Zm5EZWxldGVCYWNrZW5kKGRhdGEpOworICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRhdGEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJV0lORUNPTl9Jbml0CisgKgorICogSW5pdGlhbGlzYXRpb24gcGFydCBJLiBDcmVhdGlvbiBvZiBzZXJ2ZXIgb2JqZWN0IChjb25zb2xlIGlucHV0IGFuZAorICogYWN0aXZlIHNjcmVlbiBidWZmZXIpCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW5uZXJfZGF0YSogV0lORUNPTl9Jbml0KEhJTlNUQU5DRSBoSW5zdCwgdm9pZCogcGlkKQoreworICAgIHN0cnVjdCBpbm5lcl9kYXRhKglkYXRhID0gTlVMTDsKKyAgICBEV09SRAkJcmV0OworICAgIFdDSEFSCQlzelRpdGxlW10gPSB7J1cnLCdpJywnbicsJ2UnLCcgJywnYycsJ28nLCduJywncycsJ28nLCdsJywnZScsMH07CisgICAgc2l6ZV90CQlsZW47CisKKyAgICBkYXRhID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZigqZGF0YSkpOworICAgIGlmICghZGF0YSkgcmV0dXJuIDA7CisKKyAgICAvKiB0aGUgaGFuZGxlcyBoZXJlIGFyZSBjcmVhdGVkIHdpdGhvdXQgdGhlIHdoaXN0bGVzIGFuZCBiZWxscyByZXF1aXJlZCBieSBjb25zb2xlCisgICAgICogKG1haW5seSBiZWNhdXNlIHdpbmVjb25zb2xlIGRvZXNuJ3QgbmVlZCBpdCkKKyAgICAgKiAtIHRoZXJlIGFyZSBub3QgaW5oZXJpdGFibGUKKyAgICAgKiAtIGhDb25JbiBpcyBub3Qgc3luY2hyb25pemFibGUKKyAgICAgKi8KKyAgICBTRVJWRVJfU1RBUlRfUkVRKGFsbG9jX2NvbnNvbGUpCisgICAgeworICAgICAgICByZXEtPmFjY2VzcyAgPSBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFOworICAgICAgICByZXEtPmluaGVyaXQgPSBGQUxTRTsKKwlyZXEtPnBpZCAgICAgPSBwaWQ7CisgICAgICAgIHJldCA9ICFTRVJWRVJfQ0FMTF9FUlIoKTsKKyAgICAgICAgZGF0YS0+aENvbkluID0gKEhBTkRMRSlyZXEtPmhhbmRsZV9pbjsKKwlkYXRhLT5oU3luY2hybyA9IChIQU5ETEUpcmVxLT5ldmVudDsKKyAgICB9CisgICAgU0VSVkVSX0VORF9SRVE7CisgICAgaWYgKCFyZXQpIGdvdG8gZXJyb3I7CisKKyAgICBsZW4gPSBsc3RybGVuVyhzelRpdGxlKSAqIHNpemVvZihXQ0hBUik7CisgICAgbGVuID0gbWluKGxlbiwgUkVRVUVTVF9NQVhfVkFSX1NJWkUpOworCisgICAgU0VSVkVSX1NUQVJUX1ZBUl9SRVEoc2V0X2NvbnNvbGVfaW5wdXRfaW5mbywgbGVuKQorICAgIHsKKwlyZXEtPmhhbmRsZSA9IChoYW5kbGVfdClkYXRhLT5oQ29uSW47CisgICAgICAgIHJlcS0+bWFzayA9IFNFVF9DT05TT0xFX0lOUFVUX0lORk9fVElUTEU7CisgICAgICAgIG1lbWNweShzZXJ2ZXJfZGF0YV9wdHIocmVxKSwgc3pUaXRsZSwgbGVuKTsKKyAgICAgICAgcmV0ID0gIVNFUlZFUl9DQUxMX0VSUigpOworICAgIH0KKyAgICBTRVJWRVJfRU5EX1ZBUl9SRVE7CisKKyAgICBpZiAocmV0KSAKKyAgICB7ICAgIAorCVNFUlZFUl9TVEFSVF9SRVEoY3JlYXRlX2NvbnNvbGVfb3V0cHV0KQorCXsKKwkgICAgcmVxLT5oYW5kbGVfaW4gPSAoaGFuZGxlX3QpZGF0YS0+aENvbkluOworCSAgICByZXEtPmFjY2VzcyAgICA9IEdFTkVSSUNfV1JJVEV8R0VORVJJQ19SRUFEOworCSAgICByZXEtPnNoYXJlICAgICA9IEZJTEVfU0hBUkVfUkVBRHxGSUxFX1NIQVJFX1dSSVRFOworCSAgICByZXEtPmluaGVyaXQgICA9IEZBTFNFOworCSAgICBkYXRhLT5oQ29uT3V0ICA9IChIQU5ETEUpKFNFUlZFUl9DQUxMX0VSUigpID8gMCA6IHJlcS0+aGFuZGxlX291dCk7CisJfQorCVNFUlZFUl9FTkRfUkVROworCWlmIChkYXRhLT5oQ29uT3V0KSByZXR1cm4gZGF0YTsKKyAgICB9CisKKyBlcnJvcjoKKyAgICBXSU5FQ09OX0RlbGV0ZShkYXRhKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCVdJTkVDT05fU3Bhd24KKyAqCisgKiBTcGF3biB0aGUgY2hpbGQgcHJvY2Vzc3VzIHdoZW4gaW52b2tlZCB3aXRoIHdpbmVjb25zb2xlIGZvbyBiYXIKKyAqLworc3RhdGljIEJPT0wgV0lORUNPTl9TcGF3bihzdHJ1Y3QgaW5uZXJfZGF0YSogZGF0YSwgTFBDU1RSIGxwQ21kTGluZSkKK3sKKyAgICBQUk9DRVNTX0lORk9STUFUSU9OCWluZm87CisgICAgU1RBUlRVUElORk8JCXN0YXJ0dXA7CisgICAgTFBXU1RSCQlwdHIgPSBHZXRDb21tYW5kTGluZSgpOyAvKiB3ZSdyZSB1bmljb2RlLi4uICovCisgICAgQk9PTAkJZG9uZTsKKworICAgIC8qIHdlJ3JlIGluIHRoZSBjYXNlIHdpbmVjb25zb2xlIDxleGU+IDxvcHRpb25zPi4uLiBzcGF3biB0aGUgbmV3IHByb2Nlc3MgKi8KKyAgICBtZW1zZXQoJnN0YXJ0dXAsIDAsIHNpemVvZihzdGFydHVwKSk7CisgICAgc3RhcnR1cC5jYiAgICAgICAgICA9IHNpemVvZihzdGFydHVwKTsKKyAgICBzdGFydHVwLmR3RmxhZ3MgICAgID0gU1RBUlRGX1VTRVNIT1dXSU5ET1d8U1RBUlRGX1VTRVNUREhBTkRMRVM7CisgICAgc3RhcnR1cC53U2hvd1dpbmRvdyA9IFNXX1NIT1dOT1JNQUw7CisKKyAgICAvKiB0aGUgYXR0cmlidXRlcyBvZiB3aW5lY29uc29sZSdzIGhhbmRsZXMgYXJlIG5vdCBhZGVxdWF0ZSBmb3IgaW5oZXJpdGFuY2UsIHNvCisgICAgICogZ2V0IHRoZW0gd2l0aCB0aGUgY29ycmVjdCBhdHRyaWJ1dGVzIGJlZm9yZSBwcm9jZXNzIGNyZWF0aW9uCisgICAgICovCisgICAgaWYgKCFEdXBsaWNhdGVIYW5kbGUoR2V0Q3VycmVudFByb2Nlc3MoKSwgZGF0YS0+aENvbkluLCAgR2V0Q3VycmVudFByb2Nlc3MoKSwKKwkJCSAmc3RhcnR1cC5oU3RkSW5wdXQsIEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFfFNZTkNIUk9OSVpFLCBUUlVFLCAwKSB8fAorCSFEdXBsaWNhdGVIYW5kbGUoR2V0Q3VycmVudFByb2Nlc3MoKSwgZGF0YS0+aENvbk91dCwgR2V0Q3VycmVudFByb2Nlc3MoKSwgCisJCQkgJnN0YXJ0dXAuaFN0ZE91dHB1dCwgR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEUsIFRSVUUsIDApIHx8CisJIUR1cGxpY2F0ZUhhbmRsZShHZXRDdXJyZW50UHJvY2VzcygpLCBkYXRhLT5oQ29uT3V0LCBHZXRDdXJyZW50UHJvY2VzcygpLCAKKwkJCSAgICAgJnN0YXJ0dXAuaFN0ZEVycm9yLCBHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURSwgVFJVRSwgMCkpCisgICAgeworCVRyYWNlKDAsICJjYW4ndCBkdXAgaGFuZGxlc1xuIik7CisJLyogbm8gbmVlZCB0byBkZWxldGUgaGFuZGxlcywgd2UncmUgZXhpdGluZyB0aGUgcHJvZ3JhbW0gYW55d2F5ICovCisJcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIHdlIGNvdWxkIGhhdmUgc2V2ZXJhbCAnICcgaW4gcHJvY2VzcyBjb21tYW5kIGxpbmUuLi4gc28gdHJ5IGZpcnN0IHNwYWNlLi4uCisgICAgICogRklYTUU6CisgICAgICogdGhlIGNvcnJlY3Qgd2F5IHdvdWxkIGJlIHRvIGNoZWNrIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGxlZnQgcGFydCBvZiBwdHIKKyAgICAgKiAodG8gYmUgYSBmaWxlKQorICAgICAqLworICAgIHdoaWxlICgqcHRyICYmICpwdHIrKyAhPSAnICcpOworCisgICAgZG9uZSA9ICpwdHIgJiYgQ3JlYXRlUHJvY2VzcyhOVUxMLCBwdHIsIE5VTEwsIE5VTEwsIFRSVUUsIDBMLCBOVUxMLCBOVUxMLCAmc3RhcnR1cCwgJmluZm8pOworICAgIAorICAgIC8qIHdlIG5vIGxvbmdlciBuZWVkIHRoZSBoYW5kbGVzIHBhc3NlZCB0byB0aGUgY2hpbGQgZm9yIHRoZSBjb25zb2xlICovCisgICAgQ2xvc2VIYW5kbGUoc3RhcnR1cC5oU3RkSW5wdXQpOworICAgIENsb3NlSGFuZGxlKHN0YXJ0dXAuaFN0ZE91dHB1dCk7CisgICAgQ2xvc2VIYW5kbGUoc3RhcnR1cC5oU3RkRXJyb3IpOworCisgICAgcmV0dXJuIGRvbmU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlXSU5FQ09OX1dpbk1haW4KKyAqCisgKiB3aW5lY29uc29sZSBjYW4gZWl0aGVyIGJlIHN0YXJ0ZWQgYXM6CisgKgl3aW5lY29uc29sZSA8aW50PgkJdXNlZCB3aGVuIGEgbmV3IGNvbnNvbGUgaXMgY3JlYXRlZCAoQWxsb2NDb25zb2xlKQorICoJd2luZWNvbnNvbGUgPHBnbT4gPGFyZ3VtZW50cz4JdXNlZCB0byBzdGFydCB0aGUgcHJvZ3JhbSA8cGdtPiBmcm9tIHRoZSBjb21tYW5kIGxpbmUgaW4KKyAqCQkJCQlhIGZyZXNobHkgY3JlYXRlZCBjb25zb2xlCisgKi8KK2ludCBQQVNDQUwgV0lORUNPTl9XaW5NYWluKEhJTlNUQU5DRSBoSW5zdCwgSElOU1RBTkNFIGhQcmV2LCBMUENTVFIgbHBDbWRMaW5lLCBVSU5UIG5DbWRTaG93KQoreworICAgIHN0cnVjdCBpbm5lcl9kYXRhKglkYXRhOworICAgIGludAkJCXJldCA9IDE7CisgICAgdW5zaWduZWQJCWV2dDsKKworICAgIC8qIGNhc2Ugb2Ygd2luZWNvbnNvbGUgPGV2dD4sIHNpZ25hbCBwcm9jZXNzIHRoYXQgY3JlYXRlZCB1cyB0aGF0IHdlJ3JlIHVwIGFuZCBydW5uaW5nICovCisgICAgaWYgKHNzY2FuZihscENtZExpbmUsICIlZCIsICZldnQpID09IDEpCisgICAgeworICAgICAgICBpZiAoIShkYXRhID0gV0lORUNPTl9Jbml0KGhJbnN0LCAwKSkpIHJldHVybiAwOworCXJldCA9IFNldEV2ZW50KChIQU5ETEUpZXZ0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKCEoZGF0YSA9IFdJTkVDT05fSW5pdChoSW5zdCwgKHZvaWQqKUdldEN1cnJlbnRQcm9jZXNzSWQoKSkpKSByZXR1cm4gMDsKKwlyZXQgPSBXSU5FQ09OX1NwYXduKGRhdGEsIGxwQ21kTGluZSk7CisgICAgfQorCisgICAgaWYgKHJldCAmJiBXQ1VTRVJfSW5pdEJhY2tlbmQoZGF0YSkpCisgICAgeworCXJldCA9IGRhdGEtPmZuTWFpbkxvb3AoZGF0YSk7CisgICAgfQorICAgIFdJTkVDT05fRGVsZXRlKGRhdGEpOworCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3dpbmVjb25zb2xlL3dpbmVjb25zb2xlLnNwZWMgYi9wcm9ncmFtcy93aW5lY29uc29sZS93aW5lY29uc29sZS5zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YzY1NDQKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy93aW5lY29uc29sZS93aW5lY29uc29sZS5zcGVjCkBAIC0wLDAgKzEsMTIgQEAKK25hbWUJd2luZWNvbnNvbGUKK21vZGUJZ3VpZXhlCit0eXBlCXdpbjMyCitpbml0CVdJTkVDT05fV2luTWFpbgorcnNyYyAgICB3aW5lY29uc29sZV9yZXMucmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKK2ltcG9ydCAtZGVsYXkgY29tY3RsMzIKK2ltcG9ydCAgZ2RpMzIuZGxsCitpbXBvcnQgIHVzZXIzMi5kbGwKKyNpbXBvcnQJYWR2YXBpMzIuZGxsCitpbXBvcnQJa2VybmVsMzIuZGxsCitpbXBvcnQJbnRkbGwuZGxsCmRpZmYgLS1naXQgYS9wcm9ncmFtcy93aW5lY29uc29sZS93aW5lY29uc29sZV9Fbi5yYyBiL3Byb2dyYW1zL3dpbmVjb25zb2xlL3dpbmVjb25zb2xlX0VuLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYjZmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy93aW5lY29uc29sZS93aW5lY29uc29sZV9Fbi5yYwpAQCAtMCwwICsxLDcwIEBACitMQU5HVUFHRSBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfREVGQVVMVAorCitTVFJJTkdUQUJMRSBMQU5HVUFHRSBMQU5HX05FVVRSQUwsIFNVQkxBTkdfTkVVVFJBTAorQkVHSU4KK0lEU19FRElULAkJIiZFZGl0IgorSURTX0RFRkFVTFQsCQkiJkRlZmF1bHQiCitJRFNfUFJPUEVSVFksCQkiJlByb3BlcnR5IgorSURTX01BUkssCQkiJk1hcmsiCitJRFNfQ09QWSwJCSImQ29weSIKK0lEU19QQVNURSwJCSImUGFzdGUiCitJRFNfU0VMRUNUQUxMLAkJIiZTZWxlY3QgYWxsIgorSURTX1NDUk9MTCwJCSJTYyZyb2xsIgorSURTX1NFQVJDSCwJCSJTJmVhcmNoIgorSURTX0ZOVF9ESVNQTEFZLAkiRWFjaCBjaGFyYWN0ZXIgaXMgJWxkIHBpeGVscyB3aWRlIG9uICVsZCBwaXhlbHMgaGlnaCIKK0lEU19GTlRfUFJFVklFV18xLAkiVGhpcyBpcyBhIHRlc3QiCitJRFNfRk5UX1BSRVZJRVdfMiwJIiIKK0VORAorCitJRERfT1BUSU9OIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMTQwLCAxMDUgTEFOR1VBR0UgTEFOR19ORVVUUkFMLCBTVUJMQU5HX05FVVRSQUwKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICIgT3B0aW9ucyAiCitGT05UIDgsICJIZWx2IgoreworCUdST1VQQk9YICJDdXJzb3Igc2l6ZSIsIC0xLCAxMCwgMTEsIDEyMCwgNDQsIEJTX0dST1VQQk9YCisJQVVUT1JBRElPQlVUVE9OICImU21hbGwiLCBJRENfT1BUX0NVUlNPUl9TTUFMTCwgMTQsIDIzLCA4NCwgMTAsIFdTX1RBQlNUT1AKKwlBVVRPUkFESU9CVVRUT04gIiZNZWRpdW0iLCBJRENfT1BUX0NVUlNPUl9NRURJVU0sIDE0LCAzMywgODQsIDEwLCBXU19UQUJTVE9QCisJQVVUT1JBRElPQlVUVE9OICImTGFyZ2UiLCBJRENfT1BUX0NVUlNPUl9MQVJHRSwgMTQsIDQzLCA4NCwgMTAsIFdTX1RBQlNUT1AKKworCUdST1VQQk9YICJDb21tYW5kIGhpc3RvcnkiLCAtMSwgMTAsIDU3LCAxODAsIDM1LCBCU19HUk9VUEJPWAorCUxURVhUICImTnVtYmVycyBvZiByZWNhbGxlZCBjb21tYW5kcyA6IiwgLTEsIDE0LCA2NywgNzgsIDE4CisJRURJVFRFWFQgSURDX09QVF9ISVNUX1NJWkUsIDkyLCA2OSwgMzEsIDEyLCBXU19UQUJTVE9QfFdTX0JPUkRFUnxFU19OVU1CRVIKKwlDT05UUk9MICIiLCBJRENfT1BUX0hJU1RfU0laRV9VRCwgIm1zY3Rsc191cGRvd24zMiIsIFVEU19TRVRCVUREWUlOVHxVRFNfQUxJR05SSUdIVHxVRFNfQVVUT0JVRERZfFVEU19BUlJPV0tFWVN8VURTX05PVEhPVVNBTkRTLCAwLCAwLCAwLCAwCisJQVVUT0NIRUNLQk9YICImUmVtb3ZlIGRvdWJsZXMiLCBJRENfT1BUX0hJU1RfRE9VQkxFLCAxMzAsIDY3LCA1MCwgMTgsIFdTX1RBQlNUT1B8QlNfTVVMVElMSU5FCit9CisKK0lERF9GT05UIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMTQwLCAxMDUgTEFOR1VBR0UgTEFOR19ORVVUUkFMLCBTVUJMQU5HX05FVVRSQUwKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICIgRm9udCAiCitGT05UIDgsICJIZWx2IgoreworCUxURVhUICImRm9udCIsIC0xLCA1LCA1LCAyNCwgOAorCUxJU1RCT1ggSURDX0ZOVF9MSVNUX0ZPTlQsIDUsMTgsMTA5LDQyLCBMQlNfU09SVHxXU19WU0NST0xMCisJTFRFWFQgIiZTaXplIiwgLTEsIDEyOCwgNSwgNjAsIDgKKwlMSVNUQk9YIElEQ19GTlRfTElTVF9TSVpFLCAxMjgsIDE4LCA1MCwgNjAsIFdTX1ZTQ1JPTEwKKwlDT05UUk9MICIiLCBJRENfRk5UX1BSRVZJRVcsICJXaW5lQ29uRm9udFByZXZpZXciLCAwTCwgNSw2MCwxMDksNDAKKwlMVEVYVCAiIiwgSURDX0ZOVF9GT05UX0lORk8sIDEyOCwgNzYsIDgwLCAxOAorfQorCitJRERfQ09ORklHIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMTQwLCAxMDUgTEFOR1VBR0UgTEFOR19ORVVUUkFMLCBTVUJMQU5HX05FVVRSQUwKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICIgQ29uZmlndXJhdGlvbiAiCitGT05UIDgsICJIZWx2IgoreworCUdST1VQQk9YICJCdWZmZXIgem9uZSIsIC0xLCAxMCwgMTEsIDExMCwgNDIsIEJTX0dST1VQQk9YCisJTFRFWFQgIiZXaWR0aCA6IiwgLTEsIDE0LCAyNSwgNTQsIDkKKwlFRElUVEVYVCBJRENfQ05GX1NCX1dJRFRILCA3OCwgMjMsIDM2LCAxMiwgV1NfVEFCU1RPUHxXU19CT1JERVJ8RVNfTlVNQkVSCisJQ09OVFJPTCAiIiwgSURDX0NORl9TQl9XSURUSF9VRCwgIm1zY3Rsc191cGRvd24zMiIsIFVEU19TRVRCVUREWUlOVHxVRFNfQUxJR05SSUdIVHxVRFNfQVVUT0JVRERZfFVEU19BUlJPV0tFWVN8VURTX05PVEhPVVNBTkRTLCAwLCAwLCAwLCAwCisJTFRFWFQgIiZIZWlnaHQgOiIsIC0xLCAxNCwgMzksIDU0LCA5CisJRURJVFRFWFQgSURDX0NORl9TQl9IRUlHSFQsIDc4LCAzNywgMzYsIDEyLCBXU19UQUJTVE9QfFdTX0JPUkRFUnxFU19OVU1CRVIKKwlDT05UUk9MICIiLCBJRENfQ05GX1NCX0hFSUdIVF9VRCwgIm1zY3Rsc191cGRvd24zMiIsIFVEU19TRVRCVUREWUlOVHxVRFNfQUxJR05SSUdIVHxVRFNfQVVUT0JVRERZfFVEU19BUlJPV0tFWVN8VURTX05PVEhPVVNBTkRTLCAwLCAwLCAwLCAwCisKKwlHUk9VUEJPWCAiV2luZG93IHNpemUiLCAtMSwgMTAsIDU1LCAxMTAsIDQyCisJTFRFWFQgIlcmaWR0aCA6IiwgLTEsIDE0LCA2OSwgNTQsIDkKKwlFRElUVEVYVCBJRENfQ05GX1dJTl9XSURUSCwgNzgsIDY3LCAzNiwgMTIsIFdTX1RBQlNUT1B8V1NfQk9SREVSfEVTX05VTUJFUgorCUNPTlRST0wgIiIsIElEQ19DTkZfV0lOX1dJRFRIX1VELCAibXNjdGxzX3VwZG93bjMyIiwgVURTX1NFVEJVRERZSU5UfFVEU19BTElHTlJJR0hUfFVEU19BVVRPQlVERFl8VURTX0FSUk9XS0VZU3xVRFNfTk9USE9VU0FORFMsIDAsIDAsIDAsIDAKKwlMVEVYVCAiSCZlaWdodCA6IiwgLTEsIDE0LCA4MywgNTQsIDkKKwlFRElUVEVYVCBJRENfQ05GX1dJTl9IRUlHSFQsIDc4LCA4MSwgMzYsIDEyLCBXU19UQUJTVE9QfFdTX0JPUkRFUnxFU19OVU1CRVIKKwlDT05UUk9MICIiLCBJRENfQ05GX1dJTl9IRUlHSFRfVUQsICJtc2N0bHNfdXBkb3duMzIiLCBVRFNfU0VUQlVERFlJTlR8VURTX0FMSUdOUklHSFR8VURTX0FVVE9CVUREWXxVRFNfQVJST1dLRVlTfFVEU19OT1RIT1VTQU5EUywgMCwgMCwgMCwgMAorfQorCmRpZmYgLS1naXQgYS9wcm9ncmFtcy93aW5lY29uc29sZS93aW5lY29uc29sZV9Gci5yYyBiL3Byb2dyYW1zL3dpbmVjb25zb2xlL3dpbmVjb25zb2xlX0ZyLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YTc4NDEKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy93aW5lY29uc29sZS93aW5lY29uc29sZV9Gci5yYwpAQCAtMCwwICsxLDcyIEBACitMQU5HVUFHRSBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfREVGQVVMVAorCitTVFJJTkdUQUJMRSBMQU5HVUFHRSBMQU5HX0ZSRU5DSCwgU1VCTEFOR19ORVVUUkFMCitCRUdJTgorSURTX0VESVQsCQkiJkVkaXRlciIKK0lEU19ERUZBVUxULAkJIlBhciAmZOlmYXV0IgorSURTX1BST1BFUlRZLAkJIiZQcm9wcmnpdOlzIgorSURTX01BUkssCQkiJk1hcnF1ZXIiCitJRFNfQ09QWSwJCSImQ29waWVyIgorSURTX1BBU1RFLAkJIkMmb2xsZXIiCitJRFNfU0VMRUNUQUxMLAkJIiZT6WxlY3Rpb25uZXIgdG91dCIKK0lEU19TQ1JPTEwsCQkiJkTpZmlsZXIiCitJRFNfU0VBUkNILAkJIkMmaGVyY2hlciIKK0lEU19GTlRfRElTUExBWSwJIkNoYXF1ZSBjYXJhY3TocmUgYSAlbGQgcG9pbnRzIGVuIGxhcmdldXIgZXQgJWxkIHBvaW50cyBlbiBoYXV0ZXVyIgorSURTX0ZOVF9QUkVWSUVXXzEsCSJDZWNpIGVzdCB1biB0ZXN0IgorSURTX0ZOVF9QUkVWSUVXXzIsCSLp6OD06yIKK0VORAorCitJRERfT1BUSU9OIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMTQwLCAxMDUgTEFOR1VBR0UgTEFOR19GUkVOQ0gsIFNVQkxBTkdfTkVVVFJBTAorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIiBPcHRpb25zICIKK0ZPTlQgOCwgIkhlbHYiCit7CisJR1JPVVBCT1ggIlRhaWxsZSBkdSBjdXJzZXVyIiwgLTEsIDEwLCAxMSwgMTIwLCA0NCwgQlNfR1JPVVBCT1gKKwlBVVRPUkFESU9CVVRUT04gIiZQZXRpdCIsIElEQ19PUFRfQ1VSU09SX1NNQUxMLCAxNCwgMjMsIDg0LCAxMCwgV1NfVEFCU1RPUAorCUFVVE9SQURJT0JVVFRPTiAiJk1veWVuIiwgSURDX09QVF9DVVJTT1JfTUVESVVNLCAxNCwgMzMsIDg0LCAxMCwgV1NfVEFCU1RPUAorCUFVVE9SQURJT0JVVFRPTiAiJkdyYW5kIiwgSURDX09QVF9DVVJTT1JfTEFSR0UsIDE0LCA0MywgODQsIDEwLCBXU19UQUJTVE9QCisKKwlHUk9VUEJPWCAiSGlzdG9yaXF1ZSBkZXMgY29tbWFuZGVzIiwgLTEsIDEwLCA1NywgMTgwLCAzNSwgQlNfR1JPVVBCT1gKKwlMVEVYVCAiJlRhaWxsZSBkZSBsYSBt6W1vaXJlIHRhbXBvbiA6IiwgLTEsIDE0LCA2NywgNzgsIDE4CisJRURJVFRFWFQgSURDX09QVF9ISVNUX1NJWkUsIDkyLCA2OSwgMzEsIDEyLCBXU19UQUJTVE9QfFdTX0JPUkRFUnxFU19OVU1CRVIKKwlDT05UUk9MICIiLCBJRENfT1BUX0hJU1RfU0laRV9VRCwgIm1zY3Rsc191cGRvd24zMiIsIFVEU19TRVRCVUREWUlOVHxVRFNfQUxJR05SSUdIVHxVRFNfQVVUT0JVRERZfFVEU19BUlJPV0tFWVN8VURTX05PVEhPVVNBTkRTLCAwLCAwLCAwLCAwCisJQVVUT0NIRUNLQk9YICImU3VwcHJpbWVyIGxlcyBkb3VibG9ucyIsIElEQ19PUFRfSElTVF9ET1VCTEUsIDEzMCwgNjcsIDUwLCAxOCwgV1NfVEFCU1RPUHxCU19NVUxUSUxJTkUKK30KKworSUREX0ZPTlQgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAxNDAsIDEwNSBMQU5HVUFHRSBMQU5HX0ZSRU5DSCwgU1VCTEFOR19ORVVUUkFMCitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiIFBvbGljZSAiCitGT05UIDgsICJIZWx2IgoreworCUxURVhUICImUG9saWNlIiwgLTEsIDUsIDUsIDI0LCA4CisJTElTVEJPWCBJRENfRk5UX0xJU1RfRk9OVCwgNSwgMTgsIDEwOSwgNDIsIExCU19TT1JUfFdTX1ZTQ1JPTEwKKwlMVEVYVCAiJlRhaWxsZSIsIC0xLCAxMjgsIDUsIDYwLCA4CisJTElTVEJPWCBJRENfRk5UX0xJU1RfU0laRSwgMTI4LCAxOCwgNTAsIDYwLCBXU19WU0NST0xMCisJQ09OVFJPTCAiIiwgSURDX0ZOVF9QUkVWSUVXLCAiV2luZUNvbkZvbnRQcmV2aWV3IiwgMEwsIDUsIDYwLCAxMDksIDQwCisJTFRFWFQgIiIsIElEQ19GTlRfRk9OVF9JTkZPLCAxMjgsIDc2LCA4MCwgMTgKK30KKworSUREX0NPTkZJRyBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDE0MCwgMTA1IExBTkdVQUdFIExBTkdfRlJFTkNILCBTVUJMQU5HX05FVVRSQUwKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICIgQ29uZmlndXJhdGlvbiAiCitGT05UIDgsICJIZWx2IgoreworCUdST1VQQk9YICJUYWlsbGUgbeltb2lyZSB0YW1wb24g6WNyYW4iLCAtMSwgMTAsIDExLCAxMTAsIDQyLCBCU19HUk9VUEJPWAorCUxURVhUICImTGFyZ2V1ciA6IiwgLTEsIDE0LCAyNSwgNTQsIDkKKwlFRElUVEVYVCBJRENfQ05GX1NCX1dJRFRILCA3OCwgMjMsIDM2LCAxMiwgV1NfVEFCU1RPUHxXU19CT1JERVJ8RVNfTlVNQkVSCisJQ09OVFJPTCAiIiwgSURDX0NORl9TQl9XSURUSF9VRCwgIm1zY3Rsc191cGRvd24zMiIsIFVEU19TRVRCVUREWUlOVHxVRFNfQUxJR05SSUdIVHxVRFNfQVVUT0JVRERZfFVEU19BUlJPV0tFWVN8VURTX05PVEhPVVNBTkRTLCAwLCAwLCAwLCAwCisJTFRFWFQgIkhhJnV0ZXVyIDoiLCAtMSwgMTQsIDM5LCA1NCwgOQorCUVESVRURVhUIElEQ19DTkZfU0JfSEVJR0hULCA3OCwgMzcsIDM2LCAxMiwgV1NfVEFCU1RPUHxXU19CT1JERVJ8RVNfTlVNQkVSCisJQ09OVFJPTCAiIiwgSURDX0NORl9TQl9IRUlHSFRfVUQsICJtc2N0bHNfdXBkb3duMzIiLCBVRFNfU0VUQlVERFlJTlR8VURTX0FMSUdOUklHSFR8VURTX0FVVE9CVUREWXxVRFNfQVJST1dLRVlTfFVEU19OT1RIT1VTQU5EUywgMCwgMCwgMCwgMAorCisJR1JPVVBCT1ggIlRhaWxsZSBkZSBsYSBmZW7qdHJlIiwgLTEsIDEwLCA1NSwgMTEwLCA0MgorCUxURVhUICJMYSZyZ2V1ciA6IiwgLTEsIDE0LCA2OSwgNTQsIDkKKwlFRElUVEVYVCBJRENfQ05GX1dJTl9XSURUSCwgNzgsIDY3LCAzNiwgMTIsIFdTX1RBQlNUT1B8V1NfQk9SREVSfEVTX05VTUJFUgorCUNPTlRST0wgIiIsIElEQ19DTkZfV0lOX1dJRFRIX1VELCAibXNjdGxzX3VwZG93bjMyIiwgVURTX1NFVEJVRERZSU5UfFVEU19BTElHTlJJR0hUfFVEU19BVVRPQlVERFl8VURTX0FSUk9XS0VZU3xVRFNfTk9USE9VU0FORFMsIDAsIDAsIDAsIDAKKwlMVEVYVCAiSGF1JnRldXIgOiIsIC0xLCAxNCwgODMsIDU0LCA5CisJRURJVFRFWFQgSURDX0NORl9XSU5fSEVJR0hULCA3OCwgODEsIDM2LCAxMiwgV1NfVEFCU1RPUHxXU19CT1JERVJ8RVNfTlVNQkVSCisJQ09OVFJPTCAiIiwgSURDX0NORl9XSU5fSEVJR0hUX1VELCAibXNjdGxzX3VwZG93bjMyIiwgVURTX1NFVEJVRERZSU5UfFVEU19BTElHTlJJR0hUfFVEU19BVVRPQlVERFl8VURTX0FSUk9XS0VZU3xVRFNfTk9USE9VU0FORFMsIDAsIDAsIDAsIDAKK30KKworCisKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3dpbmVjb25zb2xlL3dpbmVjb25zb2xlX3Jlcy5oIGIvcHJvZ3JhbXMvd2luZWNvbnNvbGUvd2luZWNvbnNvbGVfcmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdjOGNiYQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3dpbmVjb25zb2xlL3dpbmVjb25zb2xlX3Jlcy5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qIHdpbmVjb25zb2xlIHJlc291cmNlIGRlZmluaXRpb25zICovCisKKy8qIHN0cmluZ3MgKi8KKyNkZWZpbmUgSURTX0VESVQJCTB4MTAwCisjZGVmaW5lIElEU19ERUZBVUxUCQkweDEwMQorI2RlZmluZSBJRFNfUFJPUEVSVFkJCTB4MTAyCisKKyNkZWZpbmUgSURTX01BUksJCTB4MTEwCisjZGVmaW5lIElEU19DT1BZCQkweDExMQorI2RlZmluZSBJRFNfUEFTVEUJCTB4MTEyCisjZGVmaW5lIElEU19TRUxFQ1RBTEwJCTB4MTEzCisjZGVmaW5lIElEU19TQ1JPTEwJCTB4MTE0CisjZGVmaW5lIElEU19TRUFSQ0gJCTB4MTE1CisKKyNkZWZpbmUgSURTX0ZOVF9ESVNQTEFZCQkweDIwMAorI2RlZmluZSBJRFNfRk5UX1BSRVZJRVdfMQkweDIwMQorI2RlZmluZSBJRFNfRk5UX1BSRVZJRVdfMgkweDIwMgorCisjZGVmaW5lIElERF9PUFRJT04JCTB4MDEwMAorI2RlZmluZSBJRERfRk9OVAkJMHgwMjAwCisjZGVmaW5lIElERF9DT05GSUcJCTB4MDMwMAorCisvKiBkaWFsb2cgYm94ZXMgKi8KKyNkZWZpbmUgSURDX09QVF9DVVJTT1JfU01BTEwJMHgwMTAxCisjZGVmaW5lIElEQ19PUFRfQ1VSU09SX01FRElVTQkweDAxMDIKKyNkZWZpbmUgSURDX09QVF9DVVJTT1JfTEFSR0UJMHgwMTAzCisjZGVmaW5lIElEQ19PUFRfSElTVF9TSVpFCTB4MDEwNAorI2RlZmluZSBJRENfT1BUX0hJU1RfU0laRV9VRAkweDAxMDUKKyNkZWZpbmUgSURDX09QVF9ISVNUX0RPVUJMRQkweDAxMDYKKworI2RlZmluZSBJRENfRk5UX0xJU1RfRk9OVAkweDAyMDEKKyNkZWZpbmUgSURDX0ZOVF9MSVNUX1NJWkUJMHgwMjAyCisjZGVmaW5lIElEQ19GTlRfRk9OVF9JTkZPCTB4MDIwMworI2RlZmluZSBJRENfRk5UX1BSRVZJRVcJCTB4MDIwNAorCisjZGVmaW5lIElEQ19DTkZfU0JfV0lEVEgJMHgwMzAxCisjZGVmaW5lIElEQ19DTkZfU0JfV0lEVEhfVUQJMHgwMzAyCisjZGVmaW5lIElEQ19DTkZfU0JfSEVJR0hUCTB4MDMwMworI2RlZmluZSBJRENfQ05GX1NCX0hFSUdIVF9VRAkweDAzMDQKKyNkZWZpbmUgSURDX0NORl9XSU5fV0lEVEgJMHgwMzA1CisjZGVmaW5lIElEQ19DTkZfV0lOX1dJRFRIX1VECTB4MDMwNgorI2RlZmluZSBJRENfQ05GX1dJTl9IRUlHSFQJMHgwMzA3CisjZGVmaW5lIElEQ19DTkZfV0lOX0hFSUdIVF9VRAkweDAzMDgKKwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvd2luZWNvbnNvbGUvd2luZWNvbnNvbGVfcmVzLnJjIGIvcHJvZ3JhbXMvd2luZWNvbnNvbGUvd2luZWNvbnNvbGVfcmVzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYmM0MGMKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy93aW5lY29uc29sZS93aW5lY29uc29sZV9yZXMucmMKQEAgLTAsMCArMSw4IEBACisjaW5jbHVkZSAid2luZGVmLmgiCisjaW5jbHVkZSAid2ludXNlci5oIgorI2luY2x1ZGUgIndpbm5scy5oIgorI2luY2x1ZGUgImNvbW1jdHJsLmgiCisjaW5jbHVkZSAid2luZWNvbnNvbGVfcmVzLmgiCisKKyNpbmNsdWRlICJ3aW5lY29uc29sZV9Fbi5yYyIKKyNpbmNsdWRlICJ3aW5lY29uc29sZV9Gci5yYyIK