ZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mZHJtL2Z4X2NyeXB0LmggYi9jb3JlL2luY2x1ZGUvZmRybS9meF9jcnlwdC5oCmluZGV4IGY4MjA5OTkuLmY0ZjliOWUgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mZHJtL2Z4X2NyeXB0LmgKKysrIGIvY29yZS9pbmNsdWRlL2Zkcm0vZnhfY3J5cHQuaApAQCAtMTYsNyArMTYsNyBAQAogdm9pZCBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayh1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplLCBjb25zdCB1aW50OF90KiBrZXksIEZYX0RXT1JEIGtleWxlbik7CiB2b2lkIENSWVBUX0FyY0ZvdXJTZXR1cCh2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBrZXksIEZYX0RXT1JEIGxlbmd0aCk7CiB2b2lkIENSWVBUX0FyY0ZvdXJDcnlwdCh2b2lkKiBjb250ZXh0LCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplKTsKLXZvaWQgQ1JZUFRfQUVTU2V0S2V5KHZvaWQqIGNvbnRleHQsIEZYX0RXT1JEIGJsb2NrbGVuLCBjb25zdCB1aW50OF90KiBrZXksIEZYX0RXT1JEIGtleWxlbiwgRlhfQk9PTCBiRW5jcnlwdCk7Cit2b2lkIENSWVBUX0FFU1NldEtleSh2b2lkKiBjb250ZXh0LCBGWF9EV09SRCBibG9ja2xlbiwgY29uc3QgdWludDhfdCoga2V5LCBGWF9EV09SRCBrZXlsZW4sIGJvb2wgYkVuY3J5cHQpOwogdm9pZCBDUllQVF9BRVNTZXRJVih2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBpdik7CiB2b2lkIENSWVBUX0FFU0RlY3J5cHQodm9pZCogY29udGV4dCwgdWludDhfdCogZGVzdCwgY29uc3QgdWludDhfdCogc3JjLCBGWF9EV09SRCBzaXplKTsKIHZvaWQgQ1JZUFRfQUVTRW5jcnlwdCh2b2lkKiBjb250ZXh0LCB1aW50OF90KiBkZXN0LCBjb25zdCB1aW50OF90KiBzcmMsIEZYX0RXT1JEIHNpemUpOwpAQCAtNDAsNyArNDAsNyBAQAogdm9pZCBDUllQVF9TSEE1MTJVcGRhdGUodm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSk7CiB2b2lkIENSWVBUX1NIQTUxMkZpbmlzaCh2b2lkKiBjb250ZXh0LCB1aW50OF90IGRpZ2VzdFs2NF0pOwogdm9pZCBDUllQVF9TSEE1MTJHZW5lcmF0ZShjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplLCB1aW50OF90IGRpZ2VzdFs2NF0pOwotdm9pZCBDUllQVF9TZXRQdWJLZXlEZWNyeXB0b3IoRlhfQk9PTCAoKmZ1bmMpKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCB1aW50OF90KiBkYXRhX2J1ZiwgRlhfRFdPUkQmIGRhdGFfbGVuKSk7Cit2b2lkIENSWVBUX1NldFB1YktleURlY3J5cHRvcihib29sICgqZnVuYykoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIHVpbnQ4X3QqIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9sZW4pKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgKaW5kZXggNTg3N2UxMS4uYjZmOGRlMCAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oCkBAIC02MCw5ICs2MCw5IEBACiAKICAgICB2b2lkIEluaXRSZW5kZXJNb2R1bGUoKTsKIAotICAgIHZvaWQgU2V0RG93bmxvYWRDYWxsYmFjayhGWF9CT09MICgqY2FsbGJhY2spKGNvbnN0IEZYX0NIQVIqIG1vZHVsZV9uYW1lKSk7CisgICAgdm9pZCBTZXREb3dubG9hZENhbGxiYWNrKGJvb2wgKCpjYWxsYmFjaykoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpKTsKIAotICAgIEZYX0JPT0wgRG93bmxvYWRNb2R1bGUoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpOworICAgIGJvb2wgRG93bmxvYWRNb2R1bGUoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpOwogCiAgICAgdm9pZCBOb3RpZnlNb2R1bGVBdmFpbGFibGUoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpOwogCkBAIC0xMTAsNyArMTEwLDcgQEAKICAgICBub25zdGQ6OnVuaXF1ZV9wdHI8SVBERl9SZW5kZXJNb2R1bGU+IG1fcFJlbmRlck1vZHVsZTsKICAgICBub25zdGQ6OnVuaXF1ZV9wdHI8SVBERl9QYWdlTW9kdWxlPiBtX3BQYWdlTW9kdWxlOwogCi0gICAgRlhfQk9PTCAoKm1fcERvd25sb2FkQ2FsbGJhY2spKGNvbnN0IEZYX0NIQVIqIG1vZHVsZV9uYW1lKTsKKyAgICBib29sICgqbV9wRG93bmxvYWRDYWxsYmFjaykoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpOwogCiAgICAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0ciBtX1NlY3VyaXR5SGFuZGxlck1hcDsKIApkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9vYmplY3RzLmggYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX29iamVjdHMuaAppbmRleCA0NWI3Y2M2Li44ZDk1NGZmIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX29iamVjdHMuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX29iamVjdHMuaApAQCAtNTcsOSArNTcsOSBAQAogICAgICAgICByZXR1cm4gbV9HZW5OdW07CiAgICAgfQogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNJZGVudGljYWwoQ1BERl9PYmplY3QqIHBPYmopIGNvbnN0OworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzSWRlbnRpY2FsKENQREZfT2JqZWN0KiBwT2JqKSBjb25zdDsKIAotICAgIENQREZfT2JqZWN0KiAgICAgICAgICAgICAgICAgICAgICAgIENsb25lKEZYX0JPT0wgYkRpcmVjdCA9IEZBTFNFKSBjb25zdDsKKyAgICBDUERGX09iamVjdCogICAgICAgICAgICAgICAgICAgICAgICBDbG9uZShib29sIGJEaXJlY3QgPSBmYWxzZSkgY29uc3Q7CiAKICAgICBDUERGX09iamVjdCogICAgICAgICAgICAgICAgICAgICAgICBDbG9uZVJlZihDUERGX0luZGlyZWN0T2JqZWN0cyogcE9ianMpIGNvbnN0OwogCkBAIC04OCw5ICs4OCw5IEBACiAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXREaXJlY3RUeXBlKCkgY29uc3Q7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc01vZGlmaWVkKCkgY29uc3QKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc01vZGlmaWVkKCkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIHByb3RlY3RlZDoKICAgICBDUERGX09iamVjdChGWF9EV09SRCB0eXBlKSA6IG1fVHlwZSh0eXBlKSwgbV9PYmpOdW0oMCksIG1fR2VuTnVtKDApIHsgfQpAQCAtMTA4LDI3ICsxMDgsMjcgQEAKICAgICBmcmllbmQgY2xhc3MJCQlDUERGX1N5bnRheFBhcnNlcjsKIHByaXZhdGU6CiAgICAgQ1BERl9PYmplY3QoY29uc3QgQ1BERl9PYmplY3QmIHNyYykge30KLSAgICBDUERGX09iamVjdCogQ2xvbmVJbnRlcm5hbChGWF9CT09MIGJEaXJlY3QsIENGWF9NYXBQdHJUb1B0ciogdmlzaXRlZCkgY29uc3Q7CisgICAgQ1BERl9PYmplY3QqIENsb25lSW50ZXJuYWwoYm9vbCBiRGlyZWN0LCBDRlhfTWFwUHRyVG9QdHIqIHZpc2l0ZWQpIGNvbnN0OwogfTsKIGNsYXNzIENQREZfQm9vbGVhbiA6IHB1YmxpYyBDUERGX09iamVjdAogewogcHVibGljOgogCi0gICAgc3RhdGljIENQREZfQm9vbGVhbioJQ3JlYXRlKEZYX0JPT0wgdmFsdWUpCisgICAgc3RhdGljIENQREZfQm9vbGVhbioJQ3JlYXRlKGJvb2wgdmFsdWUpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IENQREZfQm9vbGVhbih2YWx1ZSk7CiAgICAgfQogCiAgICAgQ1BERl9Cb29sZWFuKCkgOiBDUERGX09iamVjdChQREZPQkpfQk9PTEVBTiksIG1fYlZhbHVlKGZhbHNlKSB7IH0KLSAgICBDUERGX0Jvb2xlYW4oRlhfQk9PTCB2YWx1ZSkgOiBDUERGX09iamVjdChQREZPQkpfQk9PTEVBTiksIG1fYlZhbHVlKHZhbHVlKSB7IH0KKyAgICBDUERGX0Jvb2xlYW4oYm9vbCB2YWx1ZSkgOiBDUERGX09iamVjdChQREZPQkpfQk9PTEVBTiksIG1fYlZhbHVlKHZhbHVlKSB7IH0KIAotICAgIEZYX0JPT0wJCQkJCUlkZW50aWNhbChDUERGX0Jvb2xlYW4qIHBPdGhlcikgY29uc3QKKyAgICBib29sCQkJCQlJZGVudGljYWwoQ1BERl9Cb29sZWFuKiBwT3RoZXIpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iVmFsdWUgPT0gcE90aGVyLT5tX2JWYWx1ZTsKICAgICB9CiBwcm90ZWN0ZWQ6CiAKLSAgICBGWF9CT09MCQkJCQltX2JWYWx1ZTsKKyAgICBib29sCQkJCQltX2JWYWx1ZTsKICAgICBmcmllbmQgY2xhc3MJCQlDUERGX09iamVjdDsKIH07CiBjbGFzcyBDUERGX051bWJlciA6IHB1YmxpYyBDUERGX09iamVjdApAQCAtMTUwLDE0ICsxNTAsMTQgQEAKICAgICAgICAgcmV0dXJuIG5ldyBDUERGX051bWJlcihzdHIpOwogICAgIH0KIAotICAgIHN0YXRpYyBDUERGX051bWJlcioJCUNyZWF0ZShGWF9CT09MIGJJbnRlZ2VyLCB2b2lkKiBwRGF0YSkKKyAgICBzdGF0aWMgQ1BERl9OdW1iZXIqCQlDcmVhdGUoYm9vbCBiSW50ZWdlciwgdm9pZCogcERhdGEpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IENQREZfTnVtYmVyKGJJbnRlZ2VyLCBwRGF0YSk7CiAgICAgfQogCiAgICAgQ1BERl9OdW1iZXIoKSA6IENQREZfT2JqZWN0KFBERk9CSl9OVU1CRVIpLCBtX2JJbnRlZ2VyKGZhbHNlKSwgbV9JbnRlZ2VyKDApIHsgfQogCi0gICAgQ1BERl9OdW1iZXIoRlhfQk9PTCBiSW50ZWdlciwgdm9pZCogcERhdGEpOworICAgIENQREZfTnVtYmVyKGJvb2wgYkludGVnZXIsIHZvaWQqIHBEYXRhKTsKIAogICAgIENQREZfTnVtYmVyKGludCB2YWx1ZSk7CiAKQEAgLTE2NSwxMyArMTY1LDEzIEBACiAKICAgICBDUERGX051bWJlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7CiAKLSAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9OdW1iZXIqIHBPdGhlcikgY29uc3Q7CisgICAgYm9vbAkJCQkJSWRlbnRpY2FsKENQREZfTnVtYmVyKiBwT3RoZXIpIGNvbnN0OwogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXRTdHJpbmcoKSBjb25zdDsKIAogICAgIHZvaWQJCQkJCVNldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7CiAKLSAgICBGWF9CT09MCQkJCQlJc0ludGVnZXIoKSBjb25zdAorICAgIGJvb2wJCQkJCUlzSW50ZWdlcigpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iSW50ZWdlcjsKICAgICB9CkBAIC0xOTksNyArMTk5LDcgQEAKICAgICB9CiBwcm90ZWN0ZWQ6CiAKLSAgICBGWF9CT09MCQkJCQltX2JJbnRlZ2VyOworICAgIGJvb2wJCQkJCW1fYkludGVnZXI7CiAKICAgICB1bmlvbiB7CiAKQEAgLTIxMyw3ICsyMTMsNyBAQAogewogcHVibGljOgogCi0gICAgc3RhdGljIENQREZfU3RyaW5nKgkJQ3JlYXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsIEZYX0JPT0wgYkhleCA9IEZBTFNFKQorICAgIHN0YXRpYyBDUERGX1N0cmluZyoJCUNyZWF0ZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLCBib29sIGJIZXggPSBmYWxzZSkKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgQ1BERl9TdHJpbmcoc3RyLCBiSGV4KTsKICAgICB9CkBAIC0yMjMsOSArMjIzLDkgQEAKICAgICAgICAgcmV0dXJuIG5ldyBDUERGX1N0cmluZyhzdHIpOwogICAgIH0KIAotICAgIENQREZfU3RyaW5nKCkgOiBDUERGX09iamVjdChQREZPQkpfU1RSSU5HKSwgbV9iSGV4KEZBTFNFKSB7IH0KKyAgICBDUERGX1N0cmluZygpIDogQ1BERl9PYmplY3QoUERGT0JKX1NUUklORyksIG1fYkhleChmYWxzZSkgeyB9CiAKLSAgICBDUERGX1N0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLCBGWF9CT09MIGJIZXggPSBGQUxTRSkKKyAgICBDUERGX1N0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLCBib29sIGJIZXggPSBmYWxzZSkKICAgICAgICAgOiBDUERGX09iamVjdChQREZPQkpfU1RSSU5HKSwgbV9TdHJpbmcoc3RyKSwgbV9iSGV4KGJIZXgpIHsKICAgICB9CiAKQEAgLTIzNiwxMiArMjM2LDEyIEBACiAgICAgICAgIHJldHVybiBtX1N0cmluZzsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9TdHJpbmcqIHBPdGhlcikgY29uc3QKKyAgICBib29sCQkJCQlJZGVudGljYWwoQ1BERl9TdHJpbmcqIHBPdGhlcikgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX1N0cmluZyA9PSBwT3RoZXItPm1fU3RyaW5nOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJCUlzSGV4KCkgY29uc3QKKyAgICBib29sCQkJCQlJc0hleCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iSGV4OwogICAgIH0KQEAgLTI0OSw3ICsyNDksNyBAQAogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCQltX1N0cmluZzsKIAotICAgIEZYX0JPT0wJCQkJCW1fYkhleDsKKyAgICBib29sCQkJCQltX2JIZXg7CiAgICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9PYmplY3Q7CiB9OwogY2xhc3MgQ1BERl9OYW1lIDogcHVibGljIENQREZfT2JqZWN0CkBAIC0yODAsNyArMjgwLDcgQEAKICAgICAgICAgcmV0dXJuIG1fTmFtZTsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9OYW1lKiBwT3RoZXIpIGNvbnN0CisgICAgYm9vbAkJCQkJSWRlbnRpY2FsKENQREZfTmFtZSogcE90aGVyKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fTmFtZSA9PSBwT3RoZXItPm1fTmFtZTsKICAgICB9CkBAIC0zNzgsNyArMzc4LDcgQEAKICAgICAgICAgQWRkTnVtYmVyKHZhbHVlKTsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9BcnJheSogcE90aGVyKSBjb25zdDsKKyAgICBib29sCQkJCQlJZGVudGljYWwoQ1BERl9BcnJheSogcE90aGVyKSBjb25zdDsKIHByb3RlY3RlZDoKIAogICAgIH5DUERGX0FycmF5KCk7CkBAIC00MTksNyArNDE5LDcgQEAKIAogICAgIGludAkJCQkJCUdldEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGludCBkZWZhdWx0X2ludCkgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJCQlHZXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBGWF9CT09MIGJEZWZhdWx0ID0gRkFMU0UpIGNvbnN0OworICAgIGJvb2wJCQkJCUdldEJvb2xlYW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGJvb2wgYkRlZmF1bHQgPSBmYWxzZSkgY29uc3Q7CiAKICAgICBGWF9GTE9BVAkJCQlHZXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OwogCkBAIC00MzksNyArNDM5LDcgQEAKICAgICB9CiAKIAotICAgIEZYX0JPT0wJCQkJCUtleUV4aXN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdDsKKyAgICBib29sCQkJCQlLZXlFeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3Q7CiAKICAgICBGWF9QT1NJVElPTgkJCQlHZXRTdGFydFBvcygpIGNvbnN0OwogCkBAIC00NzgsNyArNDc4LDcgQEAKIAogICAgIHZvaWQJCQkJCVNldEF0TWF0cml4KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpOwogCi0gICAgdm9pZAkJCQkJU2V0QXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBGWF9CT09MIGJWYWx1ZSk7CisgICAgdm9pZAkJCQkJU2V0QXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBib29sIGJWYWx1ZSk7CiAKIAogCkBAIC00ODcsNyArNDg3LDcgQEAKIAogICAgIHZvaWQJCQkJCVJlcGxhY2VLZXkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvbGRrZXksIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmV3a2V5KTsKIAotICAgIEZYX0JPT0wJCQkJCUlkZW50aWNhbChDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSBjb25zdDsKKyAgICBib29sCQkJCQlJZGVudGljYWwoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgY29uc3Q7CiAKICAgICBpbnQJCQkJCQlHZXRDb3VudCgpIGNvbnN0CiAgICAgewpAQCAtNTE5LDE1ICs1MTksMTUgQEAKICAgICAgICAgcmV0dXJuIG1fcERpY3Q7CiAgICAgfQogCi0gICAgdm9pZAkJCQkJU2V0RGF0YShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgRlhfQk9PTCBiQ29tcHJlc3NlZCwgRlhfQk9PTCBiS2VlcEJ1Zik7CisgICAgdm9pZAkJCQkJU2V0RGF0YShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgYm9vbCBiQ29tcHJlc3NlZCwgYm9vbCBiS2VlcEJ1Zik7CiAKICAgICB2b2lkCQkJCQlJbml0U3RyZWFtKHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKIAogICAgIHZvaWQJCQkJCUluaXRTdHJlYW0oSUZYX0ZpbGVSZWFkICpwRmlsZSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CiAKLSAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9TdHJlYW0qIHBPdGhlcikgY29uc3Q7CisgICAgYm9vbAkJCQkJSWRlbnRpY2FsKENQREZfU3RyZWFtKiBwT3RoZXIpIGNvbnN0OwogCi0gICAgQ1BERl9TdHJlYW1GaWx0ZXIqCQlHZXRTdHJlYW1GaWx0ZXIoRlhfQk9PTCBiUmF3ID0gRkFMU0UpIGNvbnN0OworICAgIENQREZfU3RyZWFtRmlsdGVyKgkJR2V0U3RyZWFtRmlsdGVyKGJvb2wgYlJhdyA9IGZhbHNlKSBjb25zdDsKIAogCiAKQEAgLTUzNiwxNSArNTM2LDE1IEBACiAgICAgICAgIHJldHVybiBtX2R3U2l6ZTsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCQlSZWFkUmF3RGF0YShGWF9GSUxFU0laRSBzdGFydF9wb3MsIHVpbnQ4X3QqIHBCdWYsIEZYX0RXT1JEIGJ1Zl9zaXplKSBjb25zdDsKKyAgICBib29sCQkJCQlSZWFkUmF3RGF0YShGWF9GSUxFU0laRSBzdGFydF9wb3MsIHVpbnQ4X3QqIHBCdWYsIEZYX0RXT1JEIGJ1Zl9zaXplKSBjb25zdDsKIAogCi0gICAgRlhfQk9PTAkJCQkJSXNNZW1vcnlCYXNlZCgpIGNvbnN0CisgICAgYm9vbAkJCQkJSXNNZW1vcnlCYXNlZCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9HZW5OdW0gPT0gKEZYX0RXT1JEKSAtIDE7CiAgICAgfQogCi0gICAgQ1BERl9TdHJlYW0qCQkJQ2xvbmUoRlhfQk9PTCBiRGlyZWN0LCBGUERGX0xQRkNsb25lU3RyZWFtQ2FsbGJhY2sgbHBmQ2FsbGJhY2ssIHZvaWQqIHBVc2VyRGF0YSkgY29uc3Q7CisgICAgQ1BERl9TdHJlYW0qCQkJQ2xvbmUoYm9vbCBiRGlyZWN0LCBGUERGX0xQRkNsb25lU3RyZWFtQ2FsbGJhY2sgbHBmQ2FsbGJhY2ssIHZvaWQqIHBVc2VyRGF0YSkgY29uc3Q7CiBwcm90ZWN0ZWQ6CiAKICAgICB+Q1BERl9TdHJlYW0oKTsKQEAgLTU3OSw4ICs1NzksOCBAQAogCiAgICAgfkNQREZfU3RyZWFtQWNjKCk7CiAKLSAgICB2b2lkCQkJCQlMb2FkQWxsRGF0YShjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiUmF3QWNjZXNzID0gRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUgPSAwLCBGWF9CT09MIGJJbWFnZUFjYyA9IEZBTFNFKTsKKyAgICB2b2lkCQkJCQlMb2FkQWxsRGF0YShjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwgYm9vbCBiUmF3QWNjZXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUgPSAwLCBib29sIGJJbWFnZUFjYyA9IGZhbHNlKTsKIAogICAgIGNvbnN0IENQREZfU3RyZWFtKgkJR2V0U3RyZWFtKCkgY29uc3QKICAgICB7CkBAIC02MTMsNyArNjEzLDcgQEAKIAogICAgIEZYX0RXT1JECQkJCW1fZHdTaXplOwogCi0gICAgRlhfQk9PTAkJCQkJbV9iTmV3QnVmOworICAgIGJvb2wJCQkJCW1fYk5ld0J1ZjsKIAogICAgIENGWF9CeXRlU3RyaW5nCQkJbV9JbWFnZURlY29kZXI7CiAKQEAgLTY5MSw3ICs2OTEsNyBAQAogCiAgICAgdm9pZAkJCQkJU2V0UmVmKENQREZfSW5kaXJlY3RPYmplY3RzKiBwRG9jLCBGWF9EV09SRCBvYmpudW0pOwogCi0gICAgRlhfQk9PTAkJCQkJSWRlbnRpY2FsKENQREZfUmVmZXJlbmNlKiBwT3RoZXIpIGNvbnN0CisgICAgYm9vbAkJCQkJSWRlbnRpY2FsKENQREZfUmVmZXJlbmNlKiBwT3RoZXIpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9SZWZPYmpOdW0gPT0gcE90aGVyLT5tX1JlZk9iak51bTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oCmluZGV4IGJkOGI1YzkuLjJmYzlkZTggMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oCkBAIC0yOCwxMiArMjgsMTIgQEAKIGNsYXNzIENQREZfUGFnZU9iamVjdHMKIHsKIHB1YmxpYzoKLSAgICBDUERGX1BhZ2VPYmplY3RzKEZYX0JPT0wgYlJlbGVhc2VNZW1iZXJzID0gVFJVRSk7CisgICAgQ1BERl9QYWdlT2JqZWN0cyhib29sIGJSZWxlYXNlTWVtYmVycyA9IHRydWUpOwogICAgIH5DUERGX1BhZ2VPYmplY3RzKCk7CiAKICAgICB2b2lkCQkJCUNvbnRpbnVlUGFyc2UoSUZYX1BhdXNlKiBwUGF1c2UpOwogCi0gICAgRlhfQk9PTAkJCQlJc1BhcnNlZCgpIGNvbnN0CisgICAgYm9vbAkJCQlJc1BhcnNlZCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9QYXJzZVN0YXRlID09IENPTlRFTlRfUEFSU0VEOwogICAgIH0KQEAgLTc2LDcgKzc2LDcgQEAKIAogICAgIHZvaWQJCQkJVHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCk7CiAKLSAgICBGWF9CT09MCQkJCUJhY2tncm91bmRBbHBoYU5lZWRlZCgpIGNvbnN0CisgICAgYm9vbAkJCQlCYWNrZ3JvdW5kQWxwaGFOZWVkZWQoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYkJhY2tncm91bmRBbHBoYU5lZWRlZDsKICAgICB9CkBAIC0xMDYsOCArMTA2LDggQEAKICAgICB2b2lkICAgICAgICAgICAgICAgIENsZWFyQ2FjaGVPYmplY3RzKCk7CiAKICAgICBDRlhfUHRyTGlzdAkJCW1fT2JqZWN0TGlzdDsKLSAgICBGWF9CT09MCQkJCW1fYkJhY2tncm91bmRBbHBoYU5lZWRlZDsKLSAgICBGWF9CT09MCQkJCW1fYlJlbGVhc2VNZW1iZXJzOworICAgIGJvb2wJCQkJbV9iQmFja2dyb3VuZEFscGhhTmVlZGVkOworICAgIGJvb2wJCQkJbV9iUmVsZWFzZU1lbWJlcnM7CiAgICAgQ1BERl9Db250ZW50UGFyc2VyKgltX3BQYXJzZXI7CiAgICAgUGFyc2VTdGF0ZQkJCW1fUGFyc2VTdGF0ZTsKIH07CkBAIC0xMjAsMTEgKzEyMCwxMSBAQAogCiAgICAgfkNQREZfUGFnZSgpOwogCi0gICAgdm9pZAkJCQlMb2FkKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QsIEZYX0JPT0wgYlBhZ2VDYWNoZSA9IFRSVUUpOworICAgIHZvaWQJCQkJTG9hZChDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0LCBib29sIGJQYWdlQ2FjaGUgPSB0cnVlKTsKIAotICAgIHZvaWQJCQkJU3RhcnRQYXJzZShDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMgPSBOVUxMLCBGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UpOworICAgIHZvaWQJCQkJU3RhcnRQYXJzZShDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMgPSBOVUxMLCBib29sIGJSZVBhcnNlID0gZmFsc2UpOwogCi0gICAgdm9pZAkJCQlQYXJzZUNvbnRlbnQoQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zID0gTlVMTCwgRlhfQk9PTCBiUmVQYXJzZSA9IEZBTFNFKTsKKyAgICB2b2lkCQkJCVBhcnNlQ29udGVudChDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMgPSBOVUxMLCBib29sIGJSZVBhcnNlID0gZmFsc2UpOwogCiAgICAgdm9pZAkJCQlHZXREaXNwbGF5TWF0cml4KENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCwgaW50IHhQb3MsIGludCB5UG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeFNpemUsIGludCB5U2l6ZSwgaW50IGlSb3RhdGUpIGNvbnN0OwpAQCAtMTc3LDEzICsxNzcsMTMgQEAKIAogICAgIENQREZfUGFyc2VPcHRpb25zKCk7CiAKLSAgICBGWF9CT09MCQkJCW1fYlRleHRPbmx5OworICAgIGJvb2wJCQkJbV9iVGV4dE9ubHk7CiAKLSAgICBGWF9CT09MCQkJCW1fYk1hcmtlZENvbnRlbnQ7CisgICAgYm9vbAkJCQltX2JNYXJrZWRDb250ZW50OwogCi0gICAgRlhfQk9PTAkJCQltX2JTZXBhcmF0ZUZvcm07CisgICAgYm9vbAkJCQltX2JTZXBhcmF0ZUZvcm07CiAKLSAgICBGWF9CT09MCQkJCW1fYkRlY29kZUlubGluZUltYWdlOworICAgIGJvb2wJCQkJbV9iRGVjb2RlSW5saW5lSW1hZ2U7CiB9OwogY2xhc3MgQ1BERl9Gb3JtIDogcHVibGljIENQREZfUGFnZU9iamVjdHMKIHsKQEAgLTIwNiw3ICsyMDYsNyBAQAogcHVibGljOgogICAgIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZShDUERGX1BhZ2UqIHBQYWdlKTsKICAgICB+Q1BERl9QYWdlQ29udGVudEdlbmVyYXRlKCk7Ci0gICAgRlhfQk9PTCBJbnNlcnRQYWdlT2JqZWN0KENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmplY3QpOworICAgIGJvb2wgSW5zZXJ0UGFnZU9iamVjdChDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqZWN0KTsKICAgICB2b2lkIEdlbmVyYXRlQ29udGVudCgpOwogICAgIHZvaWQgVHJhbnNmb3JtQ29udGVudChDRlhfTWF0cml4JiBtYXRyaXgpOwogcHJvdGVjdGVkOgpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmggYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaAppbmRleCA3MzU0MGEzLi5jMTQwZGU2IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaApAQCAtODgsNyArODgsNyBAQAogICAgICAgICBtX3BPYmplY3QtPkFwcGVuZFJlY3QobGVmdCwgYm90dG9tLCByaWdodCwgdG9wKTsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCUlzUmVjdCgpIGNvbnN0CisgICAgYm9vbAkJCQlJc1JlY3QoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcE9iamVjdC0+SXNSZWN0KCk7CiAgICAgfQpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAKICAgICBDRlhfRmxvYXRSZWN0CQlHZXRDbGlwQm94KCkgY29uc3Q7CiAKLSAgICB2b2lkCQkJCUFwcGVuZFBhdGgoQ1BERl9QYXRoIHBhdGgsIGludCB0eXBlLCBGWF9CT09MIGJBdXRvTWVyZ2UpOworICAgIHZvaWQJCQkJQXBwZW5kUGF0aChDUERGX1BhdGggcGF0aCwgaW50IHR5cGUsIGJvb2wgYkF1dG9NZXJnZSk7CiAKICAgICB2b2lkCQkJCURlbGV0ZVBhdGgoaW50IGxheWVyX2luZGV4KTsKIApAQCAtMjkyLDE1ICsyOTIsMTUgQEAKIAogICAgIGludAkJCQkJbV9SZW5kZXJJbnRlbnQ7CiAKLSAgICBGWF9CT09MCQkJCW1fU3Ryb2tlQWRqdXN0OworICAgIGJvb2wJCQkJbV9TdHJva2VBZGp1c3Q7CiAKLSAgICBGWF9CT09MCQkJCW1fQWxwaGFTb3VyY2U7CisgICAgYm9vbAkJCQltX0FscGhhU291cmNlOwogCi0gICAgRlhfQk9PTAkJCQltX1RleHRLbm9ja291dDsKKyAgICBib29sCQkJCW1fVGV4dEtub2Nrb3V0OwogCi0gICAgRlhfQk9PTAkJCQltX1N0cm9rZU9QOworICAgIGJvb2wJCQkJbV9TdHJva2VPUDsKIAotICAgIEZYX0JPT0wJCQkJbV9GaWxsT1A7CisgICAgYm9vbAkJCQltX0ZpbGxPUDsKIAogICAgIGludAkJCQkJbV9PUE1vZGU7CiAKQEAgLTMyNSw3ICszMjUsNyBAQAogICAgICAgICByZXR1cm4gbV9wT2JqZWN0ID8gbV9wT2JqZWN0LT5tX0JsZW5kVHlwZSA6IEZYRElCX0JMRU5EX05PUk1BTDsKICAgICB9CiAKLSAgICBpbnQJCQkJCUdldEFscGhhKEZYX0JPT0wgYlN0cm9rZSkgY29uc3QKKyAgICBpbnQJCQkJCUdldEFscGhhKGJvb2wgYlN0cm9rZSkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BPYmplY3QgPyBGWFNZU19yb3VuZCgoYlN0cm9rZSA/IG1fcE9iamVjdC0+bV9TdHJva2VBbHBoYSA6IG1fcE9iamVjdC0+bV9GaWxsQWxwaGEpICogMjU1KSA6IDI1NTsKICAgICB9CkBAIC0zNjIsNyArMzYyLDcgQEAKICAgICAgICAgcmV0dXJuIG1fcFBhcmFtOwogICAgIH0KIAotICAgIGlubGluZSBGWF9CT09MCQlIYXNNQ0lEKCkgY29uc3Q7CisgICAgaW5saW5lIGJvb2wJCUhhc01DSUQoKSBjb25zdDsKIAogICAgIGlubGluZSB2b2lkCQkJU2V0TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkKICAgICB7CkBAIC00MDIsNyArNDAyLDcgQEAKIAogICAgIGludAkJCQkJR2V0TUNJRCgpIGNvbnN0OwogCi0gICAgdm9pZAkJCQlBZGRNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBGWF9CT09MIGJEaWN0TmVlZENsb25lKTsKKyAgICB2b2lkCQkJCUFkZE1hcmsoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIENQREZfRGljdGlvbmFyeSogcERpY3QsIGJvb2wgYkRpY3ROZWVkQ2xvbmUpOwogCiAgICAgdm9pZAkJCQlEZWxldGVMYXN0TWFyaygpOwogcHJpdmF0ZToKQEAgLTQxOCw5ICs0MTgsOSBAQAogICAgICAgICByZXR1cm4gbV9wT2JqZWN0ID8gbV9wT2JqZWN0LT5HZXRNQ0lEKCkgOiAtMTsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCUhhc01hcmsoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBtYXJrKSBjb25zdDsKKyAgICBib29sCQkJCUhhc01hcmsoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBtYXJrKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQkJTG9va3VwTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG1hcmssIENQREZfRGljdGlvbmFyeSomIHBEaWN0KSBjb25zdDsKKyAgICBib29sCQkJCUxvb2t1cE1hcmsoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBtYXJrLCBDUERGX0RpY3Rpb25hcnkqJiBwRGljdCkgY29uc3Q7CiB9OwogCiAjZGVmaW5lIFBERlBBR0VfVEVYVCAgICAgMQpAQCAtNDYxLDcgKzQ2MSw3IEBACiAKICAgICB2b2lkCQkJCVJlbW92ZUNsaXBQYXRoKCk7CiAKLSAgICB2b2lkCQkJCUFwcGVuZENsaXBQYXRoKENQREZfUGF0aCBwYXRoLCBpbnQgdHlwZSwgRlhfQk9PTCBiQXV0b01lcmdlKTsKKyAgICB2b2lkCQkJCUFwcGVuZENsaXBQYXRoKENQREZfUGF0aCBwYXRoLCBpbnQgdHlwZSwgYm9vbCBiQXV0b01lcmdlKTsKIAogICAgIHZvaWQJCQkJQ29weUNsaXBQYXRoKENQREZfUGFnZU9iamVjdCogcE9iaik7CiAKQEAgLTYyOSw3ICs2MjksNyBAQAogCiAgICAgaW50CQkJCQltX0ZpbGxUeXBlOwogCi0gICAgRlhfQk9PTAkJCQltX2JTdHJva2U7CisgICAgYm9vbAkJCQltX2JTdHJva2U7CiAKICAgICBDRlhfQWZmaW5lTWF0cml4CW1fTWF0cml4OwogCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaAppbmRleCBhODU2NDMzLi43YTQzOTQ3IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgKQEAgLTg2LDkgKzg2LDkgQEAKIAogICAgIGludAkJCQkJCUdldFBhZ2VJbmRleChGWF9EV09SRCBvYmpudW0pOwogCi0gICAgRlhfRFdPUkQJCQkJR2V0VXNlclBlcm1pc3Npb25zKEZYX0JPT0wgYkNoZWNrUmV2aXNpb24gPSBGQUxTRSkgY29uc3Q7CisgICAgRlhfRFdPUkQJCQkJR2V0VXNlclBlcm1pc3Npb25zKGJvb2wgYkNoZWNrUmV2aXNpb24gPSBmYWxzZSkgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJCQlJc093bmVyKCkgY29uc3Q7CisgICAgYm9vbAkJCQkJSXNPd25lcigpIGNvbnN0OwogCiAKIApAQCAtMTEyLDE0ICsxMTIsMTQgQEAKICAgICB2b2lkCQkJCQlDbGVhclJlbmRlckZvbnQoKTsKIAogCi0gICAgRlhfQk9PTAkJCQkJSXNGb3JtU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgRlhfQk9PTCYgYkZvcm0pIGNvbnN0OworICAgIGJvb2wJCQkJCUlzRm9ybVN0cmVhbShGWF9EV09SRCBvYmpudW0sIGJvb2wmIGJGb3JtKSBjb25zdDsKIAogICAgIC8vIHxwRm9udERpY3R8IG11c3Qgbm90IGJlIG51bGwuCiAgICAgQ1BERl9Gb250KiBMb2FkRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCk7CiAKICAgICBDUERGX0NvbG9yU3BhY2UqCQlMb2FkQ29sb3JTcGFjZShDUERGX09iamVjdCogcENTT2JqLCBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMgPSBOVUxMKTsKIAotICAgIENQREZfUGF0dGVybioJCQlMb2FkUGF0dGVybihDUERGX09iamVjdCogcE9iaiwgRlhfQk9PTCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogbWF0cml4ID0gTlVMTCk7CisgICAgQ1BERl9QYXR0ZXJuKgkJCUxvYWRQYXR0ZXJuKENQREZfT2JqZWN0KiBwT2JqLCBib29sIGJTaGFkaW5nLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBtYXRyaXggPSBOVUxMKTsKIAogICAgIENQREZfSW1hZ2UqCQkJCUxvYWRJbWFnZUYoQ1BERl9PYmplY3QqIHBPYmopOwogCkBAIC0xMjksMTcgKzEyOSwxNyBAQAogCiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwogCi0gICAgQ1BERl9Gb250KgkJCQlBZGRXaW5kb3dzRm9udChMT0dGT05UQSogcExvZ0ZvbnQsIEZYX0JPT0wgYlZlcnQsIEZYX0JPT0wgYlRyYW5zbGF0ZU5hbWUgPSBGQUxTRSk7Ci0gICAgQ1BERl9Gb250KgkJCQlBZGRXaW5kb3dzRm9udChMT0dGT05UVyogcExvZ0ZvbnQsIEZYX0JPT0wgYlZlcnQsIEZYX0JPT0wgYlRyYW5zbGF0ZU5hbWUgPSBGQUxTRSk7CisgICAgQ1BERl9Gb250KgkJCQlBZGRXaW5kb3dzRm9udChMT0dGT05UQSogcExvZ0ZvbnQsIGJvb2wgYlZlcnQsIGJvb2wgYlRyYW5zbGF0ZU5hbWUgPSBmYWxzZSk7CisgICAgQ1BERl9Gb250KgkJCQlBZGRXaW5kb3dzRm9udChMT0dGT05UVyogcExvZ0ZvbnQsIGJvb2wgYlZlcnQsIGJvb2wgYlRyYW5zbGF0ZU5hbWUgPSBmYWxzZSk7CiAjZW5kaWYKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgIENQREZfRm9udCogICAgICAgICAgICAgIEFkZE1hY0ZvbnQoQ1RGb250UmVmIHBGb250LCBGWF9CT09MIGJWZXJ0LCBGWF9CT09MIGJUcmFuc2xhdGVOYW1lID0gRkFMU0UpOworICAgIENQREZfRm9udCogICAgICAgICAgICAgIEFkZE1hY0ZvbnQoQ1RGb250UmVmIHBGb250LCBib29sIGJWZXJ0LCBib29sIGJUcmFuc2xhdGVOYW1lID0gZmFsc2UpOwogI2VuZGlmCiAKICAgICBDUERGX0ZvbnQqCQkJCUFkZFN0YW5kYXJkRm9udChjb25zdCBGWF9DSEFSKiBmb250LCBDUERGX0ZvbnRFbmNvZGluZyogcEVuY29kaW5nKTsKIAogCi0gICAgQ1BERl9Gb250KgkJCQlBZGRGb250KENGWF9Gb250KiBwRm9udCwgaW50IGNoYXJzZXQsIEZYX0JPT0wgYlZlcnQpOworICAgIENQREZfRm9udCoJCQkJQWRkRm9udChDRlhfRm9udCogcEZvbnQsIGludCBjaGFyc2V0LCBib29sIGJWZXJ0KTsKIAogICAgIHZvaWQJCQkJCUNyZWF0ZU5ld0RvYygpOwogCkBAIC0xNjEsNyArMTYxLDcgQEAKICAgICBDRlhfQnl0ZVN0cmluZwkJCW1fSUQyOwogCiAKLSAgICBGWF9CT09MCQkJCQltX2JMaW5lYXJpemVkOworICAgIGJvb2wJCQkJCW1fYkxpbmVhcml6ZWQ7CiAKICAgICBGWF9EV09SRAkJCQltX2R3Rmlyc3RQYWdlTm87CiAKQEAgLTE3Miw4ICsxNzIsOCBAQAogICAgIGludAkJCQkJCV9HZXRQYWdlQ291bnQoKSBjb25zdDsKICAgICBDUERGX0RpY3Rpb25hcnkqCQlfRmluZFBERlBhZ2UoQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXMsIGludCBpUGFnZSwgaW50IG5QYWdlc1RvR28sIGludCBsZXZlbCk7CiAgICAgaW50CQkJCQkJX0ZpbmRQYWdlSW5kZXgoQ1BERl9EaWN0aW9uYXJ5KiBwTm9kZSwgRlhfRFdPUkQmIHNraXBfY291bnQsIEZYX0RXT1JEIG9iam51bSwgaW50JiBpbmRleCwgaW50IGxldmVsID0gMCk7Ci0gICAgRlhfQk9PTAkJCQkJSXNDb250ZW50VXNlZEVsc2V3aGVyZShGWF9EV09SRCBvYmpudW0sIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0KTsKLSAgICBGWF9CT09MCQkJCQlDaGVja09DR1Zpc2libGUoQ1BERl9EaWN0aW9uYXJ5KiBwT0NHLCBGWF9CT09MIGJQcmludGluZyk7CisgICAgYm9vbAkJCQkJSXNDb250ZW50VXNlZEVsc2V3aGVyZShGWF9EV09SRCBvYmpudW0sIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0KTsKKyAgICBib29sCQkJCQlDaGVja09DR1Zpc2libGUoQ1BERl9EaWN0aW9uYXJ5KiBwT0NHLCBib29sIGJQcmludGluZyk7CiAgICAgQ1BERl9Eb2NQYWdlRGF0YSoJCUdldFZhbGlkYXRlUGFnZURhdGEoKTsKICAgICBDUERGX0RvY1JlbmRlckRhdGEqCQlHZXRWYWxpZGF0ZVJlbmRlckRhdGEoKTsKICAgICBmcmllbmQgY2xhc3MJCQlDUERGX0NyZWF0b3I7CkBAIC0yMDQsMTQgKzIwNCwxNCBAQAogCiAgICAgQ0ZYX0J5dGVTdHJpbmdDCQlHZXRXb3JkKCk7CiAKLSAgICBGWF9CT09MCQkJCVNlYXJjaFRva2VuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4pOworICAgIGJvb2wJCQkJU2VhcmNoVG9rZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbik7CiAKLSAgICBGWF9CT09MCQkJCVNraXBXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4pOworICAgIGJvb2wJCQkJU2tpcFdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbik7CiAKLSAgICBGWF9CT09MCQkJCUZpbmRUYWdQYWlyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RhcnRfdG9rZW4sIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZW5kX3Rva2VuLAorICAgIGJvb2wJCQkJRmluZFRhZ1BhaXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdGFydF90b2tlbiwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBlbmRfdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgc3RhcnRfcG9zLCBGWF9EV09SRCYgZW5kX3Bvcyk7CiAKLSAgICBGWF9CT09MCQkJCUZpbmRUYWdQYXJhbShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRva2VuLCBpbnQgblBhcmFtcyk7CisgICAgYm9vbAkJCQlGaW5kVGFnUGFyYW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbiwgaW50IG5QYXJhbXMpOwogCiAgICAgRlhfRFdPUkQJCQlHZXRQb3MoKQogICAgIHsKQEAgLTI1Miw3ICsyNTIsNyBAQAogICAgICAgICBtX1BvcyA9IHBvczsKICAgICB9CiAKLSAgICBDUERGX09iamVjdCoJCUdldE9iamVjdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsIEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBzdHJ1Y3QgUEFSU0VfQ09OVEVYVCogcENvbnRleHQgPSBOVUxMLCBGWF9CT09MIGJEZWNyeXB0ID0gVFJVRSk7CisgICAgQ1BERl9PYmplY3QqCQlHZXRPYmplY3QoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpMaXN0LCBGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgc3RydWN0IFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0ID0gTlVMTCwgYm9vbCBiRGVjcnlwdCA9IHRydWUpOwogCiAKICAgICBDUERGX09iamVjdCoJCUdldE9iamVjdEJ5U3RyaWN0KENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqTGlzdCwgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIHN0cnVjdCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCA9IE5VTEwpOwpAQCAtMjcxLDkgKzI3MSw5IEBACiAKICAgICB2b2lkCQkJCVRvTmV4dFdvcmQoKTsKIAotICAgIEZYX0JPT0wJCQkJU2VhcmNoV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmQsIEZYX0JPT0wgYldob2xlV29yZCwgRlhfQk9PTCBiRm9yd2FyZCwgRlhfRklMRVNJWkUgbGltaXQpOworICAgIGJvb2wJCQkJU2VhcmNoV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmQsIGJvb2wgYldob2xlV29yZCwgYm9vbCBiRm9yd2FyZCwgRlhfRklMRVNJWkUgbGltaXQpOwogCi0gICAgaW50CQkJCQlTZWFyY2hNdWx0aVdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB3b3JkcywgRlhfQk9PTCBiV2hvbGVXb3JkLCBGWF9GSUxFU0laRSBsaW1pdCk7CisgICAgaW50CQkJCQlTZWFyY2hNdWx0aVdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB3b3JkcywgYm9vbCBiV2hvbGVXb3JkLCBGWF9GSUxFU0laRSBsaW1pdCk7CiAKICAgICBGWF9GSUxFU0laRQkJCUZpbmRUYWcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWcsIEZYX0ZJTEVTSVpFIGxpbWl0KTsKIApAQCAtMjgyLDI3ICsyODIsMjcgQEAKICAgICAgICAgbV9wQ3J5cHRvSGFuZGxlciA9IHBDcnlwdG9IYW5kbGVyOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJSXNFbmNyeXB0ZWQoKQorICAgIGJvb2wJCQkJSXNFbmNyeXB0ZWQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcENyeXB0b0hhbmRsZXIgIT0gTlVMTDsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCUdldENoYXJBdChGWF9GSUxFU0laRSBwb3MsIHVpbnQ4X3QmIGNoKTsKKyAgICBib29sCQkJCUdldENoYXJBdChGWF9GSUxFU0laRSBwb3MsIHVpbnQ4X3QmIGNoKTsKIAotICAgIEZYX0JPT0wJCQkJUmVhZEJsb2NrKHVpbnQ4X3QqIHBCdWYsIEZYX0RXT1JEIHNpemUpOworICAgIGJvb2wJCQkJUmVhZEJsb2NrKHVpbnQ4X3QqIHBCdWYsIEZYX0RXT1JEIHNpemUpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCUdldE5leHRXb3JkKEZYX0JPT0wmIGJJc051bWJlcik7CisgICAgQ0ZYX0J5dGVTdHJpbmcJCUdldE5leHRXb3JkKGJvb2wmIGJJc051bWJlcik7CiBwcm90ZWN0ZWQ6CiAgICAgc3RhdGljIGNvbnN0IGludCBrUGFyc2VyTWF4UmVjdXJzaW9uRGVwdGggPSA2NDsKICAgICBzdGF0aWMgaW50IHNfQ3VycmVudFJlY3Vyc2lvbkRlcHRoOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCUdldE5leHRDaGFyKHVpbnQ4X3QmIGNoKTsKKyAgICB2aXJ0dWFsIGJvb2wJCQkJR2V0TmV4dENoYXIodWludDhfdCYgY2gpOwogCi0gICAgRlhfQk9PTAkJCQlHZXRDaGFyQXRCYWNrd2FyZChGWF9GSUxFU0laRSBwb3MsIHVpbnQ4X3QmIGNoKTsKKyAgICBib29sCQkJCUdldENoYXJBdEJhY2t3YXJkKEZYX0ZJTEVTSVpFIHBvcywgdWludDhfdCYgY2gpOwogCiAgICAgdm9pZAkJCQlHZXROZXh0V29yZCgpOwogCi0gICAgRlhfQk9PTAkJCQlJc1dob2xlV29yZChGWF9GSUxFU0laRSBzdGFydHBvcywgRlhfRklMRVNJWkUgbGltaXQsIGNvbnN0IHVpbnQ4X3QqIHRhZywgRlhfRFdPUkQgdGFnbGVuKTsKKyAgICBib29sCQkJCUlzV2hvbGVXb3JkKEZYX0ZJTEVTSVpFIHN0YXJ0cG9zLCBGWF9GSUxFU0laRSBsaW1pdCwgY29uc3QgdWludDhfdCogdGFnLCBGWF9EV09SRCB0YWdsZW4pOwogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCVJlYWRTdHJpbmcoKTsKIApAQCAtMzEyLDcgKzMxMiw3IEBACiAKICAgICBGWF9GSUxFU0laRQkJCW1fUG9zOwogCi0gICAgRlhfQk9PTAkJCQltX2JGaWxlU3RyZWFtOworICAgIGJvb2wJCQkJbV9iRmlsZVN0cmVhbTsKIAogICAgIGludAkJCQkJbV9NZXRhZGF0YU9iam51bTsKIApAQCAtMzM0LDcgKzMzNCw3IEBACiAKICAgICBGWF9EV09SRAkJCW1fV29yZFNpemU7CiAKLSAgICBGWF9CT09MCQkJCW1fYklzTnVtYmVyOworICAgIGJvb2wJCQkJbV9iSXNOdW1iZXI7CiAKICAgICBGWF9GSUxFU0laRQkJCW1fZHdXb3JkUG9zOwogICAgIGZyaWVuZCBjbGFzcwkJQ1BERl9QYXJzZXI7CkBAIC0zNDUsNyArMzQ1LDcgQEAKICNkZWZpbmUgUERGUEFSU0VfTk9TVFJFQU0JMgogc3RydWN0IFBBUlNFX0NPTlRFWFQgewogCi0gICAgRlhfQk9PTAkJbV9GbGFnczsKKyAgICBib29sCQltX0ZsYWdzOwogCiAgICAgRlhfRklMRVNJWkUJbV9EaWN0U3RhcnQ7CiAKQEAgLTM2OSwxNSArMzY5LDE1IEBACiAgICAgQ1BERl9QYXJzZXIoKTsKICAgICB+Q1BERl9QYXJzZXIoKTsKIAotICAgIEZYX0RXT1JECQkJU3RhcnRQYXJzZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgRlhfQk9PTCBiUmVQYXJzZSA9IEZBTFNFKTsKLSAgICBGWF9EV09SRAkJCVN0YXJ0UGFyc2UoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UpOwotICAgIEZYX0RXT1JECQkJU3RhcnRQYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlLCBGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UsIEZYX0JPT0wgYk93bkZpbGVSZWFkID0gVFJVRSk7CisgICAgRlhfRFdPUkQJCQlTdGFydFBhcnNlKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBib29sIGJSZVBhcnNlID0gZmFsc2UpOworICAgIEZYX0RXT1JECQkJU3RhcnRQYXJzZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUsIGJvb2wgYlJlUGFyc2UgPSBmYWxzZSk7CisgICAgRlhfRFdPUkQJCQlTdGFydFBhcnNlKElGWF9GaWxlUmVhZCogcEZpbGUsIGJvb2wgYlJlUGFyc2UgPSBmYWxzZSwgYm9vbCBiT3duRmlsZVJlYWQgPSB0cnVlKTsKIAotICAgIHZvaWQJCQkJQ2xvc2VQYXJzZXIoRlhfQk9PTCBiUmVQYXJzZSA9IEZBTFNFKTsKKyAgICB2b2lkCQkJCUNsb3NlUGFyc2VyKGJvb2wgYlJlUGFyc2UgPSBmYWxzZSk7CiAKLSAgICBGWF9EV09SRAlHZXRQZXJtaXNzaW9ucyhGWF9CT09MIGJDaGVja1JldmlzaW9uID0gRkFMU0UpOworICAgIEZYX0RXT1JECUdldFBlcm1pc3Npb25zKGJvb2wgYkNoZWNrUmV2aXNpb24gPSBmYWxzZSk7CiAKLSAgICBGWF9CT09MCQlJc093bmVyKCk7CisgICAgYm9vbAkJSXNPd25lcigpOwogCiAgICAgdm9pZAkJCQlTZXRQYXNzd29yZChjb25zdCBGWF9DSEFSKiBwYXNzd29yZCkKICAgICB7CkBAIC0zOTksNyArMzk5LDcgQEAKICAgICAgICAgcmV0dXJuIG1fU3ludGF4Lm1fcENyeXB0b0hhbmRsZXI7CiAgICAgfQogCi0gICAgdm9pZAkJCQlTZXRTZWN1cml0eUhhbmRsZXIoQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIsIEZYX0JPT0wgYkZvcmNlZCA9IEZBTFNFKTsKKyAgICB2b2lkCQkJCVNldFNlY3VyaXR5SGFuZGxlcihDUERGX1NlY3VyaXR5SGFuZGxlciogcFNlY3VyaXR5SGFuZGxlciwgYm9vbCBiRm9yY2VkID0gZmFsc2UpOwogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCUdldFJlY2lwaWVudCgpCiAgICAgewpAQCAtNDM1LDcgKzQzNSw3IEBACiAgICAgICAgIHJldHVybiBtX3BFbmNyeXB0RGljdDsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCUlzRW5jcnlwdGVkKCkKKyAgICBib29sCQkJCUlzRW5jcnlwdGVkKCkKICAgICB7CiAgICAgICAgIHJldHVybiBHZXRFbmNyeXB0RGljdCgpICE9IE5VTEw7CiAgICAgfQpAQCAtNDQzLDcgKzQ0Myw3IEBACiAKICAgICBDUERGX09iamVjdCoJCVBhcnNlSW5kaXJlY3RPYmplY3QoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpMaXN0LCBGWF9EV09SRCBvYmpudW0sIFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0ID0gTlVMTCkgOwogICAgIEZYX0RXT1JECQkJR2V0TGFzdE9iak51bSgpOwotICAgIEZYX0JPT0wJCQkJSXNGb3JtU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgRlhfQk9PTCYgYkZvcm0pOworICAgIGJvb2wJCQkJSXNGb3JtU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgYm9vbCYgYkZvcm0pOwogCiAgICAgRlhfRklMRVNJWkUJCQlHZXRPYmplY3RPZmZzZXQoRlhfRFdPUkQgb2JqbnVtKTsKIApAQCAtNDU2LDEyICs0NTYsMTIgQEAKIAogICAgIHZvaWQJCQkJR2V0SW5kaXJlY3RCaW5hcnkoRlhfRFdPUkQgb2JqbnVtLCB1aW50OF90KiYgcEJ1ZmZlciwgRlhfRFdPUkQmIHNpemUpOwogCi0gICAgRlhfQk9PTAkJCQlHZXRGaWxlU3RyZWFtT3B0aW9uKCkKKyAgICBib29sCQkJCUdldEZpbGVTdHJlYW1PcHRpb24oKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fU3ludGF4Lm1fYkZpbGVTdHJlYW07CiAgICAgfQogCi0gICAgdm9pZAkJCQlTZXRGaWxlU3RyZWFtT3B0aW9uKEZYX0JPT0wgYikKKyAgICB2b2lkCQkJCVNldEZpbGVTdHJlYW1PcHRpb24oYm9vbCBiKQogICAgIHsKICAgICAgICAgbV9TeW50YXgubV9iRmlsZVN0cmVhbSA9IGI7CiAgICAgfQpAQCAtNDc2LDcgKzQ3Niw3IEBACiAgICAgICAgIHJldHVybiBtX0ZpbGVWZXJzaW9uOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJSXNYUmVmU3RyZWFtKCkgY29uc3QKKyAgICBib29sCQkJCUlzWFJlZlN0cmVhbSgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iWFJlZlN0cmVhbTsKICAgICB9CkBAIC00ODYsNyArNDg2LDcgQEAKICAgICBDUERGX09iamVjdCoJCVBhcnNlSW5kaXJlY3RPYmplY3RBdEJ5U3RyaWN0KENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqTGlzdCwgRlhfRklMRVNJWkUgcG9zLCBGWF9EV09SRCBvYmpudW0sCiAgICAgICAgICAgICBzdHJ1Y3QgUEFSU0VfQ09OVEVYVCogcENvbnRleHQsIEZYX0ZJTEVTSVpFICpwUmVzdWx0UG9zKTsKIAotICAgIEZYX0RXT1JECQkJU3RhcnRBc3luUGFyc2UoSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhfQk9PTCBiUmVQYXJzZSA9IEZBTFNFLCBGWF9CT09MIGJPd25GaWxlUmVhZCA9IFRSVUUpOworICAgIEZYX0RXT1JECQkJU3RhcnRBc3luUGFyc2UoSUZYX0ZpbGVSZWFkKiBwRmlsZSwgYm9vbCBiUmVQYXJzZSA9IGZhbHNlLCBib29sIGJPd25GaWxlUmVhZCA9IHRydWUpOwogCiAgICAgRlhfRFdPUkQJCQlHZXRGaXJzdFBhZ2VObygpCiAgICAgewpAQCAtNDk2LDMwICs0OTYsMzAgQEAKICAgICBDUERGX0RvY3VtZW50KgkJbV9wRG9jdW1lbnQ7CiAKICAgICBDUERGX1N5bnRheFBhcnNlcgltX1N5bnRheDsKLSAgICBGWF9CT09MCQkJCW1fYk93bkZpbGVSZWFkOworICAgIGJvb2wJCQkJbV9iT3duRmlsZVJlYWQ7CiAgICAgQ1BERl9PYmplY3QqCQlQYXJzZURpcmVjdChDUERGX09iamVjdCogcE9iaik7CiAKLSAgICBGWF9CT09MCQkJCUxvYWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcyk7CisgICAgYm9vbAkJCQlMb2FkQWxsQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MpOwogCi0gICAgRlhfQk9PTAkJCQlMb2FkQWxsQ3Jvc3NSZWZWNShGWF9GSUxFU0laRSBwb3MpOworICAgIGJvb2wJCQkJTG9hZEFsbENyb3NzUmVmVjUoRlhfRklMRVNJWkUgcG9zKTsKIAotICAgIEZYX0JPT0wJCQkJTG9hZENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLCBGWF9GSUxFU0laRSBzdHJlYW1wb3MsIEZYX0JPT0wgYlNraXAsIEZYX0JPT0wgYkZpcnN0KTsKKyAgICBib29sCQkJCUxvYWRDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywgRlhfRklMRVNJWkUgc3RyZWFtcG9zLCBib29sIGJTa2lwLCBib29sIGJGaXJzdCk7CiAKLSAgICBGWF9CT09MCQkJCUxvYWRDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHBvcywgRlhfRklMRVNJWkUmIHByZXYsIEZYX0JPT0wgYk1haW5YUmVmKTsKKyAgICBib29sCQkJCUxvYWRDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHBvcywgRlhfRklMRVNJWkUmIHByZXYsIGJvb2wgYk1haW5YUmVmKTsKIAogICAgIENQREZfRGljdGlvbmFyeSoJTG9hZFRyYWlsZXJWNCgpOwogCi0gICAgRlhfQk9PTAkJCQlSZWJ1aWxkQ3Jvc3NSZWYoKTsKKyAgICBib29sCQkJCVJlYnVpbGRDcm9zc1JlZigpOwogCiAgICAgRlhfRFdPUkQJCQlTZXRFbmNyeXB0SGFuZGxlcigpOwogCiAgICAgdm9pZAkJCQlSZWxlYXNlRW5jcnlwdEhhbmRsZXIoKTsKIAotICAgIEZYX0JPT0wJCQkJTG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywgRlhfRFdPUkQgZHdPYmpDb3VudCk7CisgICAgYm9vbAkJCQlMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLCBGWF9EV09SRCBkd09iakNvdW50KTsKIAotICAgIEZYX0JPT0wJCQkJTG9hZExpbmVhcml6ZWRDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywgRlhfRFdPUkQgZHdPYmpDb3VudCk7CisgICAgYm9vbAkJCQlMb2FkTGluZWFyaXplZENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLCBGWF9EV09SRCBkd09iakNvdW50KTsKIAotICAgIEZYX0JPT0wJCQkJTG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHBvcyk7CisgICAgYm9vbAkJCQlMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjUoRlhfRklMRVNJWkUgcG9zKTsKIAogICAgIEZYX0RXT1JECQkJTG9hZExpbmVhcml6ZWRNYWluWFJlZlRhYmxlKCk7CiAKQEAgLTUyNyw3ICs1MjcsNyBAQAogCiAgICAgQ1BERl9TdHJlYW1BY2MqCQlHZXRPYmplY3RTdHJlYW0oRlhfRFdPUkQgbnVtYmVyKTsKIAotICAgIEZYX0JPT0wJCQkJSXNMaW5lYXJpemVkRmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLCBGWF9EV09SRCBvZmZzZXQpOworICAgIGJvb2wJCQkJSXNMaW5lYXJpemVkRmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLCBGWF9EV09SRCBvZmZzZXQpOwogCiAKIApAQCAtNTQwLDEyICs1NDAsMTIgQEAKIAogICAgIEZYX0ZJTEVTSVpFCQkJbV9MYXN0WFJlZk9mZnNldDsKIAotICAgIEZYX0JPT0wJCQkJbV9iWFJlZlN0cmVhbTsKKyAgICBib29sCQkJCW1fYlhSZWZTdHJlYW07CiAKIAogICAgIENQREZfU2VjdXJpdHlIYW5kbGVyKgltX3BTZWN1cml0eUhhbmRsZXI7CiAKLSAgICBGWF9CT09MCQkJCQltX2JGb3JjZVVzZVNlY3VyaXR5SGFuZGxlcjsKKyAgICBib29sCQkJCQltX2JGb3JjZVVzZVNlY3VyaXR5SGFuZGxlcjsKIAogICAgIENGWF9CeXRlU3RyaW5nCQkJbV9ic1JlY2lwaWVudDsKIApAQCAtNTYyLDcgKzU2Miw3IEBACiAgICAgQ0ZYX1dvcmRBcnJheQkJbV9PYmpWZXJzaW9uOwogICAgIENGWF9BcnJheVRlbXBsYXRlPENQREZfRGljdGlvbmFyeSAqPgltX1RyYWlsZXJzOwogCi0gICAgRlhfQk9PTAkJCQltX2JWZXJzaW9uVXBkYXRlZDsKKyAgICBib29sCQkJCW1fYlZlcnNpb25VcGRhdGVkOwogCiAgICAgQ1BERl9PYmplY3QqCQltX3BMaW5lYXJpemVkOwogCkBAIC01ODIsMTcgKzU4MiwxNyBAQAogCiAgICAgdmlydHVhbCB+Q1BERl9TZWN1cml0eUhhbmRsZXIoKSB7fQogCi0gICAgdmlydHVhbCBGWF9CT09MCQlPbkluaXQoQ1BERl9QYXJzZXIqIHBQYXJzZXIsIENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0KSA9IDA7CisgICAgdmlydHVhbCBib29sCQlPbkluaXQoQ1BERl9QYXJzZXIqIHBQYXJzZXIsIENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0KSA9IDA7CiAKICAgICB2aXJ0dWFsIEZYX0RXT1JECUdldFBlcm1pc3Npb25zKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlJc093bmVyKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJSXNPd25lcigpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0Q3J5cHRJbmZvKGludCYgY2lwaGVyLCBjb25zdCB1aW50OF90KiYgYnVmZmVyLCBpbnQmIGtleWxlbikgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJR2V0Q3J5cHRJbmZvKGludCYgY2lwaGVyLCBjb25zdCB1aW50OF90KiYgYnVmZmVyLCBpbnQmIGtleWxlbikgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlJc01ldGFkYXRhRW5jcnlwdGVkKCkKKyAgICB2aXJ0dWFsIGJvb2wJCUlzTWV0YWRhdGFFbmNyeXB0ZWQoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIHZpcnR1YWwgQ1BERl9DcnlwdG9IYW5kbGVyKglDcmVhdGVDcnlwdG9IYW5kbGVyKCkgPSAwOwpAQCAtNjA5LDE0ICs2MDksMTQgQEAKICAgICBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCk7CiAKICAgICB2aXJ0dWFsIH5DUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlPbkluaXQoQ1BERl9QYXJzZXIqIHBQYXJzZXIsIENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0KTsKKyAgICB2aXJ0dWFsIGJvb2wJCU9uSW5pdChDUERGX1BhcnNlciogcFBhcnNlciwgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpOwogICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0UGVybWlzc2lvbnMoKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzT3duZXIoKQorICAgIHZpcnR1YWwgYm9vbAkJSXNPd25lcigpCiAgICAgewogICAgICAgICByZXR1cm4gbV9iT3duZXI7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0Q3J5cHRJbmZvKGludCYgY2lwaGVyLCBjb25zdCB1aW50OF90KiYgYnVmZmVyLCBpbnQmIGtleWxlbik7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlJc01ldGFkYXRhRW5jcnlwdGVkKCk7CisgICAgdmlydHVhbCBib29sCQlHZXRDcnlwdEluZm8oaW50JiBjaXBoZXIsIGNvbnN0IHVpbnQ4X3QqJiBidWZmZXIsIGludCYga2V5bGVuKTsKKyAgICB2aXJ0dWFsIGJvb2wJCUlzTWV0YWRhdGFFbmNyeXB0ZWQoKTsKICAgICB2aXJ0dWFsIENQREZfQ3J5cHRvSGFuZGxlcioJQ3JlYXRlQ3J5cHRvSGFuZGxlcigpOwogICAgIHZpcnR1YWwgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlciogR2V0U3RhbmRhcmRIYW5kbGVyKCkKICAgICB7CkBAIC02NDEsOCArNjQxLDggQEAKICAgICAgICAgcmV0dXJuIG1fUmV2aXNpb247CiAgICAgfQogCi0gICAgaW50CQkJCQlDaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsIEZYX0JPT0wgYk93bmVyLCB1aW50OF90KiBrZXkpOwotICAgIGludAkJCQkJQ2hlY2tQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgcGFzc19zaXplLCBGWF9CT09MIGJPd25lciwgdWludDhfdCoga2V5LCBpbnQga2V5X2xlbik7CisgICAgaW50CQkJCQlDaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsIGJvb2wgYk93bmVyLCB1aW50OF90KiBrZXkpOworICAgIGludAkJCQkJQ2hlY2tQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgcGFzc19zaXplLCBib29sIGJPd25lciwgdWludDhfdCoga2V5LCBpbnQga2V5X2xlbik7CiBwcml2YXRlOgogCiAgICAgaW50CQkJCQltX1ZlcnNpb247CkBAIC02NTMsMjIgKzY1MywyMiBAQAogCiAgICAgQ1BERl9EaWN0aW9uYXJ5KgltX3BFbmNyeXB0RGljdDsKIAotICAgIEZYX0JPT0wJCQkJTG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpOwotICAgIEZYX0JPT0wJCQkJTG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIEZYX0RXT1JEIHR5cGUsIGludCYgY2lwaGVyLCBpbnQmIGtleV9sZW4pOworICAgIGJvb2wJCQkJTG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpOworICAgIGJvb2wJCQkJTG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIEZYX0RXT1JEIHR5cGUsIGludCYgY2lwaGVyLCBpbnQmIGtleV9sZW4pOwogCi0gICAgRlhfQk9PTAkJCQlDaGVja1VzZXJQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgcGFzc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSWdub3JlRW5jcnlwdE1ldGEsIHVpbnQ4X3QqIGtleSwgaW50MzJfdCBrZXlfbGVuKTsKKyAgICBib29sCQkJCUNoZWNrVXNlclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJZ25vcmVFbmNyeXB0TWV0YSwgdWludDhfdCoga2V5LCBpbnQzMl90IGtleV9sZW4pOwogCi0gICAgRlhfQk9PTAkJCQlDaGVja093bmVyUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwgdWludDhfdCoga2V5LCBpbnQzMl90IGtleV9sZW4pOwotICAgIEZYX0JPT0wJCQkJQUVTMjU2X0NoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHNpemUsIEZYX0JPT0wgYk93bmVyLCB1aW50OF90KiBrZXkpOwotICAgIHZvaWQJCQkJQUVTMjU2X1NldFBhc3N3b3JkKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgc2l6ZSwgRlhfQk9PTCBiT3duZXIsIGNvbnN0IHVpbnQ4X3QqIGtleSk7Ci0gICAgdm9pZAkJCQlBRVMyNTZfU2V0UGVybXMoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIEZYX0RXT1JEIHBlcm1pc3Npb24sIEZYX0JPT0wgYkVuY3J5cHRNZXRhZGF0YSwgY29uc3QgdWludDhfdCoga2V5KTsKKyAgICBib29sCQkJCUNoZWNrT3duZXJQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgcGFzc19zaXplLCB1aW50OF90KiBrZXksIGludDMyX3Qga2V5X2xlbik7CisgICAgYm9vbAkJCQlBRVMyNTZfQ2hlY2tQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgc2l6ZSwgYm9vbCBiT3duZXIsIHVpbnQ4X3QqIGtleSk7CisgICAgdm9pZAkJCQlBRVMyNTZfU2V0UGFzc3dvcmQoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBzaXplLCBib29sIGJPd25lciwgY29uc3QgdWludDhfdCoga2V5KTsKKyAgICB2b2lkCQkJCUFFUzI1Nl9TZXRQZXJtcyhDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgRlhfRFdPUkQgcGVybWlzc2lvbiwgYm9vbCBiRW5jcnlwdE1ldGFkYXRhLCBjb25zdCB1aW50OF90KiBrZXkpOwogICAgIHZvaWQJCQkJT25DcmVhdGUoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIENQREZfQXJyYXkqIHBJZEFycmF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdXNlcl9wYXNzLCBGWF9EV09SRCB1c2VyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBvd25lcl9wYXNzLCBGWF9EV09SRCBvd25lcl9zaXplLCBGWF9CT09MIGJEZWZhdWx0LCBGWF9EV09SRCB0eXBlKTsKLSAgICBGWF9CT09MCQkJCUNoZWNrU2VjdXJpdHkoaW50MzJfdCBrZXlfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIG93bmVyX3Bhc3MsIEZYX0RXT1JEIG93bmVyX3NpemUsIGJvb2wgYkRlZmF1bHQsIEZYX0RXT1JEIHR5cGUpOworICAgIGJvb2wJCQkJQ2hlY2tTZWN1cml0eShpbnQzMl90IGtleV9sZW4pOwogCi0gICAgRlhfQk9PTAkJCQltX2JPd25lcjsKKyAgICBib29sCQkJCW1fYk93bmVyOwogCiAgICAgRlhfRFdPUkQJCQltX1Blcm1pc3Npb25zOwogCkBAIC02ODQsMjAgKzY4NCwyMCBAQAogCiAgICAgdmlydHVhbCB+Q1BERl9DcnlwdG9IYW5kbGVyKCkge30KIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJSW5pdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCUluaXQoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIENQREZfU2VjdXJpdHlIYW5kbGVyKiBwU2VjdXJpdHlIYW5kbGVyKSA9IDA7CiAKICAgICB2aXJ0dWFsIEZYX0RXT1JECURlY3J5cHRHZXRTaXplKEZYX0RXT1JEIHNyY19zaXplKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQqCURlY3J5cHRTdGFydChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlEZWNyeXB0U3RyZWFtKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJRGVjcnlwdFN0cmVhbSh2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVjcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJRGVjcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikgPSAwOwogCiAKICAgICB2aXJ0dWFsIEZYX0RXT1JECUVuY3J5cHRHZXRTaXplKEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgdmVyc2lvbiwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJRW5jcnlwdENvbnRlbnQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCB2ZXJzaW9uLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICB2aXJ0dWFsIGJvb2wJCUVuY3J5cHRDb250ZW50KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgdmVyc2lvbiwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgPSAwOwogCiAgICAgdm9pZAkJCQlEZWNyeXB0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgdmVyc2lvbiwgQ0ZYX0J5dGVTdHJpbmcmIHN0cik7CkBAIC03MTAsMjIgKzcxMCwyMiBAQAogCiAgICAgdmlydHVhbCB+Q1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXIoKTsKIAotICAgIEZYX0JPT0wJCQkJSW5pdChpbnQgY2lwaGVyLCBjb25zdCB1aW50OF90KiBrZXksIGludCBrZXlsZW4pOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJSW5pdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIpOworICAgIGJvb2wJCQkJSW5pdChpbnQgY2lwaGVyLCBjb25zdCB1aW50OF90KiBrZXksIGludCBrZXlsZW4pOworICAgIHZpcnR1YWwgYm9vbAkJSW5pdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIpOwogICAgIHZpcnR1YWwgRlhfRFdPUkQJRGVjcnlwdEdldFNpemUoRlhfRFdPUkQgc3JjX3NpemUpOwogICAgIHZpcnR1YWwgdm9pZCoJRGVjcnlwdFN0YXJ0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURlY3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURlY3J5cHRGaW5pc2godm9pZCogY29udGV4dCwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOworICAgIHZpcnR1YWwgYm9vbAkJRGVjcnlwdFN0cmVhbSh2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOworICAgIHZpcnR1YWwgYm9vbAkJRGVjcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CiAgICAgdmlydHVhbCBGWF9EV09SRAlFbmNyeXB0R2V0U2l6ZShGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIHZlcnNpb24sIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuY3J5cHRDb250ZW50KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgdmVyc2lvbiwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgdmlydHVhbCBib29sCQlFbmNyeXB0Q29udGVudChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIHZlcnNpb24sIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOwogcHJvdGVjdGVkOgogCi0gICAgdmlydHVhbCB2b2lkCQlDcnlwdEJsb2NrKEZYX0JPT0wgYkVuY3J5cHQsIEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICB2aXJ0dWFsIHZvaWQJCUNyeXB0QmxvY2soYm9vbCBiRW5jcnlwdCwgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci0gICAgdmlydHVhbCB2b2lkKglDcnlwdFN0YXJ0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBGWF9CT09MIGJFbmNyeXB0KTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNyeXB0U3RyZWFtKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZiwgRlhfQk9PTCBiRW5jcnlwdCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlDcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZiwgRlhfQk9PTCBiRW5jcnlwdCk7CisgICAgdmlydHVhbCB2b2lkKglDcnlwdFN0YXJ0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBib29sIGJFbmNyeXB0KTsKKyAgICB2aXJ0dWFsIGJvb2wJCUNyeXB0U3RyZWFtKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZiwgYm9vbCBiRW5jcnlwdCk7CisgICAgdmlydHVhbCBib29sCQlDcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZiwgYm9vbCBiRW5jcnlwdCk7CiAKICAgICB1aW50OF90CQkJCW1fRW5jcnlwdEtleVszMl07CiAKQEAgLTc1NSw3ICs3NTUsNyBAQAogQ0ZYX0J5dGVTdHJpbmcgUERGX05hbWVEZWNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvcmlnKTsKIENGWF9CeXRlU3RyaW5nIFBERl9OYW1lRGVjb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcmlnKTsKIENGWF9CeXRlU3RyaW5nIFBERl9OYW1lRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcmlnKTsKLUNGWF9CeXRlU3RyaW5nIFBERl9FbmNvZGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNyYywgRlhfQk9PTCBiSGV4ID0gRkFMU0UpOworQ0ZYX0J5dGVTdHJpbmcgUERGX0VuY29kZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3JjLCBib29sIGJIZXggPSBmYWxzZSk7CiBDRlhfV2lkZVN0cmluZyBQREZfRGVjb2RlVGV4dChjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwID0gTlVMTCk7CiBpbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgUERGX0RlY29kZVRleHQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzdHIsIENGWF9DaGFyTWFwKiBwQ2hhck1hcCA9IE5VTEwpIHsKICAgICByZXR1cm4gUERGX0RlY29kZVRleHQoKGNvbnN0IHVpbnQ4X3QqKWJzdHIuY19zdHIoKSwgYnN0ci5HZXRMZW5ndGgoKSwgcENoYXJNYXApOwpAQCAtNzY5LDEyICs3NjksMTIgQEAKIHsKIHB1YmxpYzoKICAgICBzdGF0aWMgQ0ZERl9Eb2N1bWVudCogQ3JlYXRlTmV3RG9jKCk7Ci0gICAgc3RhdGljIENGREZfRG9jdW1lbnQqIFBhcnNlRmlsZShJRlhfRmlsZVJlYWQgKnBGaWxlLCBGWF9CT09MIGJPd25GaWxlID0gRkFMU0UpOworICAgIHN0YXRpYyBDRkRGX0RvY3VtZW50KiBQYXJzZUZpbGUoSUZYX0ZpbGVSZWFkICpwRmlsZSwgYm9vbCBiT3duRmlsZSA9IGZhbHNlKTsKICAgICBzdGF0aWMgQ0ZERl9Eb2N1bWVudCogUGFyc2VNZW1vcnkoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUpOwogCiAgICAgfkNGREZfRG9jdW1lbnQoKTsKIAotICAgIEZYX0JPT0wJCQkJCVdyaXRlQnVmKENGWF9CeXRlVGV4dEJ1ZiYgYnVmKSBjb25zdDsKKyAgICBib29sCQkJCQlXcml0ZUJ1ZihDRlhfQnl0ZVRleHRCdWYmIGJ1ZikgY29uc3Q7CiAKICAgICBDUERGX0RpY3Rpb25hcnkqCQlHZXRSb290KCkgY29uc3QKICAgICB7CkBAIC03ODUsMTAgKzc4NSwxMCBAQAogcHJvdGVjdGVkOgogCiAgICAgQ0ZERl9Eb2N1bWVudCgpOwotICAgIHZvaWQJUGFyc2VTdHJlYW0oSUZYX0ZpbGVSZWFkICpwRmlsZSwgRlhfQk9PTCBiT3duRmlsZSk7CisgICAgdm9pZAlQYXJzZVN0cmVhbShJRlhfRmlsZVJlYWQgKnBGaWxlLCBib29sIGJPd25GaWxlKTsKICAgICBDUERGX0RpY3Rpb25hcnkqCQltX3BSb290RGljdDsKICAgICBJRlhfRmlsZVJlYWQqCQkJbV9wRmlsZTsKLSAgICBGWF9CT09MCQkJCQltX2JPd25GaWxlOworICAgIGJvb2wJCQkJCW1fYk93bkZpbGU7CiB9OwogCiBDRlhfV2lkZVN0cmluZwlGUERGX0ZpbGVTcGVjX0dldFdpbjMyUGF0aChjb25zdCBDUERGX09iamVjdCogcEZpbGVTcGVjKTsKQEAgLTgxNiw3ICs4MTYsNyBAQAogewogcHVibGljOgogICAgIHZpcnR1YWwgfklGWF9GaWxlQXZhaWwoKSB7IH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0RhdGFBdmFpbCggRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9EV09SRCBzaXplKSA9IDA7CisgICAgdmlydHVhbCBib29sCQkJSXNEYXRhQXZhaWwoIEZYX0ZJTEVTSVpFIG9mZnNldCwgRlhfRFdPUkQgc2l6ZSkgPSAwOwogfTsKIGNsYXNzIElGWF9Eb3dubG9hZEhpbnRzCiB7CkBAIC04MzksMTAgKzgzOSwxMCBAQAogICAgIElGWF9GaWxlQXZhaWwqIEdldEZpbGVBdmFpbCgpIGNvbnN0IHsgcmV0dXJuIG1fcEZpbGVBdmFpbDsgfQogICAgIElGWF9GaWxlUmVhZCogR2V0RmlsZVJlYWQoKSBjb25zdCB7IHJldHVybiBtX3BGaWxlUmVhZDsgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSA9IDA7CisgICAgdmlydHVhbCBib29sCQkJSXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkCQkJU2V0RG9jdW1lbnQoQ1BERl9Eb2N1bWVudCogcERvYykgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzUGFnZUF2YWlsKGludCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzTGluZWFyaXplZCgpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQlJc1BhZ2VBdmFpbChpbnQgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQlJc0xpbmVhcml6ZWQoKSA9IDA7CiAgICAgdmlydHVhbCBpbnQzMl90CQlJc0Zvcm1BdmFpbChJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKSA9IDA7CiAgICAgdmlydHVhbCBpbnQzMl90CQlJc0xpbmVhcml6ZWRQREYoKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkCQkJCUdldExpbmVhcml6ZWRNYWluWFJlZkluZm8oRlhfRklMRVNJWkUgKnBQb3MsIEZYX0RXT1JEICpwU2l6ZSkgPSAwOwpAQCAtODU5LDcgKzg1OSw3IEBACiAKICAgICB2b2lkIEFkZE9iak51bShGWF9EV09SRCBkd09iak51bSk7CiAKLSAgICBGWF9CT09MIEZpbmQoRlhfRFdPUkQgZHdPYmpOdW0pOworICAgIGJvb2wgRmluZChGWF9EV09SRCBkd09iak51bSk7CiAKICAgICB2b2lkIFJlbW92ZUFsbCgpCiAgICAgewpAQCAtODY3LDcgKzg2Nyw3IEBACiAgICAgfQogcHJvdGVjdGVkOgogCi0gICAgRlhfQk9PTCBCaW5hcnlTZWFyY2goRlhfRFdPUkQgdmFsdWUsIGludCAmaU5leHQpOworICAgIGJvb2wgQmluYXJ5U2VhcmNoKEZYX0RXT1JEIHZhbHVlLCBpbnQgJmlOZXh0KTsKIHByb3RlY3RlZDoKIAogICAgIENGWF9EV29yZEFycmF5CQkJbV9udW1iZXJfYXJyYXk7CmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3JlbmRlci5oIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZW5kZXIuaAppbmRleCBmMzU5MDA5Li4zN2U4YTU0IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3JlbmRlci5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVuZGVyLmgKQEAgLTMzLDkgKzMzLDkgQEAKIAogICAgIHZpcnR1YWwgfklQREZfT0NDb250ZXh0KCkge30KIAotICAgIHZpcnR1YWwgRlhfQk9PTAlDaGVja09DR1Zpc2libGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwT0NHKSA9IDA7CisgICAgdmlydHVhbCBib29sCUNoZWNrT0NHVmlzaWJsZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBPQ0cpID0gMDsKIAotICAgIEZYX0JPT0wgQ2hlY2tPYmplY3RWaXNpYmxlKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaik7CisgICAgYm9vbCBDaGVja09iamVjdFZpc2libGUoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqKTsKIH07CiAjZGVmaW5lIFJFTkRFUl9DT0xPUl9OT1JNQUwJCTAKICNkZWZpbmUgUkVOREVSX0NPTE9SX0dSQVkJCTEKQEAgLTg5LDEwICs4OSwxMCBAQAogCiAgICAgQ1BERl9SZW5kZXJDb250ZXh0KCk7CiAKLSAgICB2b2lkCQkJQ3JlYXRlKENQREZfUGFnZSogcFBhZ2UsIEZYX0JPT0wgYkZpcnN0TGF5ZXIgPSBUUlVFKTsKKyAgICB2b2lkCQkJQ3JlYXRlKENQREZfUGFnZSogcFBhZ2UsIGJvb2wgYkZpcnN0TGF5ZXIgPSB0cnVlKTsKIAogICAgIHZvaWQJCQlDcmVhdGUoQ1BERl9Eb2N1bWVudCogcERvYyA9IE5VTEwsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwUGFnZUNhY2hlID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMgPSBOVUxMLCBGWF9CT09MIGJGaXJzdExheWVyID0gVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzID0gTlVMTCwgYm9vbCBiRmlyc3RMYXllciA9IHRydWUpOwogCiAgICAgfkNQREZfUmVuZGVyQ29udGV4dCgpOwogCkBAIC0xMjYsNyArMTI2LDcgQEAKIAogICAgIENGWF9BcnJheVRlbXBsYXRlPHN0cnVjdCBfUERGX1JlbmRlckl0ZW0+CW1fQ29udGVudExpc3Q7CiAKLSAgICBGWF9CT09MCQkJCQltX2JGaXJzdExheWVyOworICAgIGJvb2wJCQkJCW1fYkZpcnN0TGF5ZXI7CiAKICAgICB2b2lkCQkJUmVuZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENQREZfUGFnZU9iamVjdCogcFN0b3BPYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwRmluYWxNYXRyaXgpOwpAQCAtMTkyLDE3ICsxOTIsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyA9IE5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogCi0gICAgc3RhdGljIEZYX0JPT0wJRHJhd1RleHRQYXRoKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcENoYXJQb3MsCisgICAgc3RhdGljIGJvb2wJRHJhd1RleHRQYXRoKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250LCBGWF9GTE9BVCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJVc2VyLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsX2FyZ2IsIEZYX0FSR0Igc3Ryb2tlX2FyZ2IsIENGWF9QYXRoRGF0YSogcENsaXBwaW5nUGF0aCwgaW50IG5GbGFnID0gMCk7CiAKLSAgICBzdGF0aWMgRlhfQk9PTAlEcmF3Tm9ybWFsVGV4dChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBpbnQgbkNoYXJzLCBGWF9EV09SRCogcENoYXJDb2RlcywgRlhfRkxPQVQqIHBDaGFyUG9zLAorICAgIHN0YXRpYyBib29sCURyYXdOb3JtYWxUZXh0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHQyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxfYXJnYiwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7CiAKLSAgICBzdGF0aWMgRlhfQk9PTAlEcmF3VHlwZTNUZXh0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcENoYXJQb3MsCisgICAgc3RhdGljIGJvb2wJRHJhd1R5cGUzVGV4dChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBpbnQgbkNoYXJzLCBGWF9EV09SRCogcENoYXJDb2RlcywgRlhfRkxPQVQqIHBDaGFyUG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHQyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbF9hcmdiKTsKIH07CkBAIC0yMTUsNyArMjE1LDcgQEAKICAgICAgICAgbV9uVGltZUNvdW50ID0gMDsKICAgICAgICAgbV9uQ2FjaGVTaXplID0gMDsKICAgICAgICAgbV9wQ3VySW1hZ2VDYWNoZSA9IE5VTEw7Ci0gICAgICAgIG1fYkN1ckZpbmRDYWNoZSA9IEZBTFNFOworICAgICAgICBtX2JDdXJGaW5kQ2FjaGUgPSBmYWxzZTsKICAgICAgICAgbV9wQ3VySW1hZ2VDYWNoZXMgPSBOVUxMOwogICAgIH0KICAgICB+Q1BERl9QYWdlUmVuZGVyQ2FjaGUoKQpAQCAtMjM4LDcgKzIzOCw3IEBACiAgICAgfQogCiAgICAgdm9pZAkJCQlHZXRDYWNoZWRCaXRtYXAoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIENGWF9ESUJTb3VyY2UqJiBwQml0bWFwLCBDRlhfRElCU291cmNlKiYgcE1hc2ssIEZYX0RXT1JEJiBNYXR0ZUNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdGRDUyA9IGZhbHNlLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIGJvb2wgYkxvYWRNYXNrID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMgPSBOVUxMLCBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCA9IDAsIGludDMyX3QgZG93bnNhbXBsZUhlaWdodCA9IDApOwogCiAgICAgdm9pZAkJCQlSZXNldEJpdG1hcChDUERGX1N0cmVhbSogcFN0cmVhbSwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwKTsKQEAgLTI0OSwxMSArMjQ5LDExIEBACiAgICAgfQogICAgIENGWF9NYXBQdHJUb1B0cgkJbV9JbWFnZUNhY2hlczsKIHB1YmxpYzoKLSAgICBGWF9CT09MCQkJCVN0YXJ0R2V0Q2FjaGVkQml0bWFwKENQREZfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsCi0gICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsCisgICAgYm9vbAkJCQlTdGFydEdldENhY2hlZEJpdG1hcChDUERGX1N0cmVhbSogcFN0cmVhbSwgYm9vbCBiU3RkQ1MgPSBmYWxzZSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLAorICAgICAgICAgICAgYm9vbCBiTG9hZE1hc2sgPSBmYWxzZSwgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMgPSBOVUxMLAogICAgICAgICAgICAgaW50MzJfdCBkb3duc2FtcGxlV2lkdGggPSAwLCBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQgPSAwKTsKIAotICAgIEZYX0JPT0wJCQkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIGJvb2wJCQkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwogICAgIENQREZfSW1hZ2VDYWNoZSoJbV9wQ3VySW1hZ2VDYWNoZTsKICAgICBDRlhfUHRyQXJyYXkqICAgICAgIG1fcEN1ckltYWdlQ2FjaGVzOwogcHJvdGVjdGVkOgpAQCAtMjYyLDcgKzI2Miw3IEBACiAKICAgICBGWF9EV09SRAkJCW1fblRpbWVDb3VudDsKICAgICBGWF9EV09SRAkJCW1fbkNhY2hlU2l6ZTsKLSAgICBGWF9CT09MCQkJCW1fYkN1ckZpbmRDYWNoZTsKKyAgICBib29sCQkJCW1fYkN1ckZpbmRDYWNoZTsKIH07CiBjbGFzcyBDUERGX1JlbmRlckNvbmZpZwogewpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZXNvdXJjZS5oIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZXNvdXJjZS5oCmluZGV4IDVjOGNjODUuLmM2MDczN2QgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVzb3VyY2UuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3Jlc291cmNlLmgKQEAgLTExNiw3ICsxMTYsNyBAQAogICAgICAgICByZXR1cm4gbV9GbGFnczsKICAgICB9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc1ZlcnRXcml0aW5nKCljb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wJCQlJc1ZlcnRXcml0aW5nKCljb25zdDsKIAogCiAKQEAgLTE0MiwxNCArMTQyLDE0IEBACiAgICAgfQogCiAKLSAgICBGWF9CT09MCQkJCQlJc0VtYmVkZGVkKCkgY29uc3QKKyAgICBib29sCQkJCQlJc0VtYmVkZGVkKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX0ZvbnRUeXBlID09IFBERkZPTlRfVFlQRTMgfHwgbV9wRm9udEZpbGUgIT0gTlVMTDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QKKyAgICB2aXJ0dWFsIGJvb2wJCQlJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIENQREZfU3RyZWFtQWNjKgkJCUdldEZvbnRGaWxlKCkgY29uc3QKQEAgLTE2Miw3ICsxNjIsNyBAQAogICAgICAgICByZXR1cm4gbV9wRm9udERpY3Q7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCQkJSXNTdGFuZGFyZEZvbnQoKSBjb25zdDsKKyAgICBib29sCQkJCQlJc1N0YW5kYXJkRm9udCgpIGNvbnN0OwogCiAgICAgRlhGVF9GYWNlCQkJCUdldEZhY2UoKSBjb25zdAogICAgIHsKQEAgLTE5OSw3ICsxOTksNyBAQAogCiAKIAotICAgIHZpcnR1YWwgaW50CQkJCUdseXBoRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9CT09MICpwVmVydEdseXBoID0gTlVMTCkgPSAwOworICAgIHZpcnR1YWwgaW50CQkJCUdseXBoRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlLCBib29sICpwVmVydEdseXBoID0gTlVMTCkgPSAwOwogICAgIHZpcnR1YWwgaW50CQkJCUdseXBoRnJvbUNoYXJDb2RlRXh0KEZYX0RXT1JEIGNoYXJjb2RlKQogICAgIHsKICAgICAgICAgcmV0dXJuIEdseXBoRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKQEAgLTI2NSwxMSArMjY1LDExIEBACiBwcm90ZWN0ZWQ6CiAgICAgZXhwbGljaXQgQ1BERl9Gb250KGludCBmb250dHlwZSk7CiAKLSAgICBGWF9CT09MCQkJCQlJbml0aWFsaXplKCk7CisgICAgYm9vbAkJCQkJSW5pdGlhbGl6ZSgpOwogCi0gICAgRlhfQk9PTAkJCQkJTG9hZCgpOworICAgIGJvb2wJCQkJCUxvYWQoKTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCV9Mb2FkKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCV9Mb2FkKCkgPSAwOwogCiAgICAgdmlydHVhbCBGWF9XQ0hBUgkJX1VuaWNvZGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0ID0gMDsKIApAQCAtMjc4LDcgKzI3OCw3IEBACiAgICAgdm9pZAkJCQkJTG9hZFVuaWNvZGVNYXAoKTsKIAogICAgIHZvaWQJCQkJCUxvYWRQREZFbmNvZGluZyhDUERGX09iamVjdCogcEVuY29kaW5nLCBpbnQmIGlCYXNlRW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nKiYgcENoYXJOYW1lcywgRlhfQk9PTCBiRW1iZWRkZWQsIEZYX0JPT0wgYlRydWVUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcqJiBwQ2hhck5hbWVzLCBib29sIGJFbWJlZGRlZCwgYm9vbCBiVHJ1ZVR5cGUpOwogCiAgICAgdm9pZAkJCQkJTG9hZEZvbnREZXNjcmlwdG9yKENQREZfRGljdGlvbmFyeSopOwogCkBAIC0yOTgsNyArMjk4LDcgQEAKIAogICAgIENQREZfVG9Vbmljb2RlTWFwKgkJbV9wVG9Vbmljb2RlTWFwOwogCi0gICAgRlhfQk9PTAkJCQkJbV9iVG9Vbmljb2RlTG9hZGVkOworICAgIGJvb2wJCQkJCW1fYlRvVW5pY29kZUxvYWRlZDsKIAogCiAKQEAgLTMzOCw3ICszMzgsNyBAQAogCiAgICAgdm9pZAkJCQkJTG9hZEVuY29kaW5nKENQREZfT2JqZWN0KiBwRW5jb2RpbmcpOwogCi0gICAgRlhfQk9PTAkJCQkJSXNJZGVudGljYWwoQ1BERl9Gb250RW5jb2RpbmcqIHBBbm90aGVyKSBjb25zdDsKKyAgICBib29sCQkJCQlJc0lkZW50aWNhbChDUERGX0ZvbnRFbmNvZGluZyogcEFub3RoZXIpIGNvbnN0OwogCiAgICAgRlhfV0NIQVIJCQkJVW5pY29kZUZyb21DaGFyQ29kZSh1aW50OF90IGNoYXJjb2RlKSBjb25zdAogICAgIHsKQEAgLTM3MCwxMSArMzcwLDExIEBACiAgICAgfQogICAgIGludCBHZXRDaGFyV2lkdGhGKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwgPSAwKSBvdmVycmlkZTsKICAgICB2b2lkIEdldENoYXJCQm94KEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9SRUNUJiByZWN0LCBpbnQgbGV2ZWwgPSAwKSBvdmVycmlkZTsKLSAgICBpbnQgR2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIEZYX0JPT0wgKnBWZXJ0R2x5cGggPSBOVUxMKSBvdmVycmlkZTsKLSAgICBGWF9CT09MIElzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZTsKKyAgICBpbnQgR2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIGJvb2wgKnBWZXJ0R2x5cGggPSBOVUxMKSBvdmVycmlkZTsKKyAgICBib29sIElzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZTsKIAogcHJvdGVjdGVkOgotICAgIEZYX0JPT0wgTG9hZENvbW1vbigpOworICAgIGJvb2wgTG9hZENvbW1vbigpOwogCiAgICAgdm9pZCBMb2FkU3Vic3RGb250KCk7CiAKQEAgLTQwMSw3ICs0MDEsNyBAQAogICAgIGludCBtX0Jhc2VFbmNvZGluZzsKICAgICBGWF9XT1JEIG1fQ2hhcldpZHRoWzI1Nl07CiAgICAgRlhfU01BTExfUkVDVCBtX0NoYXJCQm94WzI1Nl07Ci0gICAgRlhfQk9PTCBtX2JVc2VGb250V2lkdGg7CisgICAgYm9vbCBtX2JVc2VGb250V2lkdGg7CiB9OwogCiBjbGFzcyBDUERGX1R5cGUxRm9udCA6IHB1YmxpYyBDUERGX1NpbXBsZUZvbnQKQEAgLTQxNiw3ICs0MTYsNyBAQAogICAgIH0KICAgICB2aXJ0dWFsIGludAkJCQlHbHlwaEZyb21DaGFyQ29kZUV4dChGWF9EV09SRCBjaGFyY29kZSk7CiBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJX0xvYWQoKTsKKyAgICB2aXJ0dWFsIGJvb2wJCQlfTG9hZCgpOwogCiAgICAgaW50CQkJCQkJbV9CYXNlMTRGb250OwogICAgIHZpcnR1YWwgdm9pZAkJCUxvYWRHbHlwaE1hcCgpOwpAQCAtNDI3LDcgKzQyNyw3IEBACiAKICAgICBDUERGX1RydWVUeXBlRm9udCgpOwogcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgRlhfQk9PTAkJCV9Mb2FkKCk7CisgICAgdmlydHVhbCBib29sCQkJX0xvYWQoKTsKICAgICB2aXJ0dWFsIHZvaWQJCQlMb2FkR2x5cGhNYXAoKTsKIH07CiBjbGFzcyBDUERGX1R5cGUzQ2hhcgpAQCAtNDM4LDExICs0MzgsMTEgQEAKIAogICAgIH5DUERGX1R5cGUzQ2hhcigpOwogCi0gICAgRlhfQk9PTCBMb2FkQml0bWFwKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQpOworICAgIGJvb2wgTG9hZEJpdG1hcChDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0KTsKIAotICAgIEZYX0JPT0wJCQkJCW1fYkNvbG9yZWQ7CisgICAgYm9vbAkJCQkJbV9iQ29sb3JlZDsKIAotICAgIEZYX0JPT0wJCQkJCW1fYlBhZ2VSZXF1aXJlZDsKKyAgICBib29sCQkJCQltX2JQYWdlUmVxdWlyZWQ7CiAKIAogCkBAIC00ODQsNyArNDg0LDcgQEAKICAgICBDRlhfQWZmaW5lTWF0cml4IG1fRm9udE1hdHJpeDsKIAogcHJpdmF0ZToKLSAgICBGWF9CT09MIF9Mb2FkKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBfTG9hZCgpIG92ZXJyaWRlOwogICAgIHZvaWQgTG9hZEdseXBoTWFwKCkgb3ZlcnJpZGUge30KIAogICAgIGludCBtX0NoYXJXaWR0aExbMjU2XTsKQEAgLTUxMSwxMyArNTExLDEzIEBACiAKICAgICB+Q1BERl9DSURGb250KCkgb3ZlcnJpZGU7CiAKLSAgICBGWF9CT09MIExvYWRHQjIzMTIoKTsKLSAgICBpbnQgR2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIEZYX0JPT0wgKnBWZXJ0R2x5cGggPSBOVUxMKSBvdmVycmlkZTsKKyAgICBib29sIExvYWRHQjIzMTIoKTsKKyAgICBpbnQgR2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIGJvb2wgKnBWZXJ0R2x5cGggPSBOVUxMKSBvdmVycmlkZTsKICAgICBpbnQgR2V0Q2hhcldpZHRoRihGWF9EV09SRCBjaGFyY29kZSwgaW50IGxldmVsID0gMCkgb3ZlcnJpZGU7CiAgICAgdm9pZCBHZXRDaGFyQkJveChGWF9EV09SRCBjaGFyY29kZSwgRlhfUkVDVCYgcmVjdCwgaW50IGxldmVsID0gMCkgb3ZlcnJpZGU7CiAgICAgRlhfV09SRCBDSURGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0OwogCi0gICAgRlhfQk9PTCBJc1RydWVUeXBlKCkgY29uc3QKKyAgICBib29sIElzVHJ1ZVR5cGUoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuICFtX2JUeXBlMTsKICAgICB9CkBAIC01MzMsMTkgKzUzMywxOSBAQAogICAgIH0KIAogICAgIGNvbnN0IHVpbnQ4X3QqIEdldENJRFRyYW5zZm9ybShGWF9XT1JEIENJRCkgY29uc3Q7Ci0gICAgRlhfQk9PTCBJc1ZlcnRXcml0aW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBJc1ZlcnRXcml0aW5nKCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgc2hvcnQgR2V0VmVydFdpZHRoKEZYX1dPUkQgQ0lEKSBjb25zdDsKICAgICB2b2lkIEdldFZlcnRPcmlnaW4oRlhfV09SRCBDSUQsIHNob3J0JiB2eCwgc2hvcnQmIHZ5KSBjb25zdDsKLSAgICBGWF9CT09MIElzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgSXNGb250U3R5bGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0OworICAgIGJvb2wgSXNVbmljb2RlQ29tcGF0aWJsZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBJc0ZvbnRTdHlsZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3Q7CiAKIHByb3RlY3RlZDoKICAgICBmcmllbmQgY2xhc3MgQ1BERl9Gb250OwogCi0gICAgRlhfQk9PTCBfTG9hZCgpIG92ZXJyaWRlOworICAgIGJvb2wgX0xvYWQoKSBvdmVycmlkZTsKICAgICBGWF9XQ0hBUiBfVW5pY29kZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgRlhfRFdPUkQgX0NoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgVW5pY29kZSkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgaW50IEdldEdseXBoSW5kZXgoRlhfRFdPUkQgdW5pY29kZWIsIEZYX0JPT0wgKnBWZXJ0R2x5cGgpOworICAgIGludCBHZXRHbHlwaEluZGV4KEZYX0RXT1JEIHVuaWNvZGViLCBib29sICpwVmVydEdseXBoKTsKICAgICB2b2lkIExvYWRNZXRyaWNzQXJyYXkoQ1BERl9BcnJheSogcEFycmF5LCBDRlhfRFdvcmRBcnJheSYgcmVzdWx0LCBpbnQgbkVsZW1lbnRzKTsKICAgICB2b2lkIExvYWRTdWJzdEZvbnQoKTsKIApAQCAtNTUzLDkgKzU1Myw5IEBACiAgICAgQ1BERl9DTWFwKiBtX3BBbGxvY2F0ZWRDTWFwOwogICAgIENQREZfQ0lEMlVuaWNvZGVNYXAqIG1fcENJRDJVbmljb2RlTWFwOwogICAgIGludCBtX0NoYXJzZXQ7Ci0gICAgRlhfQk9PTCBtX2JUeXBlMTsKKyAgICBib29sIG1fYlR5cGUxOwogICAgIENQREZfU3RyZWFtQWNjKiBtX3BDSURUb0dJRE1hcDsKLSAgICBGWF9CT09MIG1fYkNJRElzR0lEOworICAgIGJvb2wgbV9iQ0lESXNHSUQ7CiAgICAgRlhfV09SRCBtX0RlZmF1bHRXaWR0aDsKICAgICBGWF9XT1JEKiBtX3BBbnNpV2lkdGhzOwogICAgIEZYX1NNQUxMX1JFQ1QgbV9DaGFyQkJveFsyNTZdOwpAQCAtNTYzLDcgKzU2Myw3IEBACiAgICAgc2hvcnQgbV9EZWZhdWx0Vlk7CiAgICAgc2hvcnQgbV9EZWZhdWx0VzE7CiAgICAgQ0ZYX0RXb3JkQXJyYXkgbV9WZXJ0TWV0cmljczsKLSAgICBGWF9CT09MIG1fYkFkb2JlQ291cmllclN0ZDsKKyAgICBib29sIG1fYkFkb2JlQ291cmllclN0ZDsKICAgICBDRlhfQ1RUR1NVQlRhYmxlKiBtX3BUVEdTVUJUYWJsZTsKIH07CiAKQEAgLTYxMiwyNyArNjEyLDI3IEBACiAgICAgICAgIG1heCA9IDEuMGY7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCQkJc1JHQigpIGNvbnN0OworICAgIGJvb2wJCQkJCXNSR0IoKSBjb25zdDsKIAogCiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQlHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3QKKyAgICB2aXJ0dWFsIGJvb2wJCQlTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKIAogCiAKLSAgICBGWF9CT09MCQkJCQlHZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3Q7CisgICAgYm9vbAkJCQkJR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIGMsIEZYX0ZMT0FUJiBtLCBGWF9GTE9BVCYgeSwgRlhfRkxPQVQmIGspIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQkJU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgbSwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgaykgY29uc3Q7CisgICAgYm9vbAkJCQkJU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgbSwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgaykgY29uc3Q7CiAKIAogICAgIHZpcnR1YWwgdm9pZAkJCVRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBkZXN0X2J1ZiwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IHBpeGVscywKLSAgICAgICAgICAgIGludCBpbWFnZV93aWR0aCwgaW50IGltYWdlX2hlaWdodCwgRlhfQk9PTCBiVHJhbnNNYXNrID0gRkFMU0UpIGNvbnN0OworICAgICAgICAgICAgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBib29sIGJUcmFuc01hc2sgPSBmYWxzZSkgY29uc3Q7CiAKICAgICBDUERGX0FycmF5KiYJCQlHZXRBcnJheSgpCiAgICAgewpAQCAtNjQ2LDcgKzY0Niw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZAkJCUVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCk7CisgICAgdmlydHVhbCB2b2lkCQkJRW5hYmxlU3RkQ29udmVyc2lvbihib29sIGJFbmFibGVkKTsKIAogICAgIENQREZfRG9jdW1lbnQqIGNvbnN0IG1fcERvY3VtZW50OwogCkBAIC02NTksMTcgKzY1OSwxNyBAQAogICAgICAgICAgIG1fZHdTdGRDb252ZXJzaW9uKDApIHsKICAgICB9CiAgICAgdmlydHVhbCB+Q1BERl9Db2xvclNwYWNlKCkge30KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQl2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQorICAgIHZpcnR1YWwgYm9vbAkJCXZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCiAgICAgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCXZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIGMsIEZYX0ZMT0FUJiBtLCBGWF9GTE9BVCYgeSwgRlhfRkxPQVQmIGspIGNvbnN0CisgICAgdmlydHVhbCBib29sCQkJdl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQl2X1NldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIG0sIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIGspIGNvbnN0CisgICAgdmlydHVhbCBib29sCQkJdl9TZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBtLCBGWF9GTE9BVCB5LCBGWF9GTE9BVCBrKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgaW50CQkJCQkJbV9GYW1pbHk7CkBAIC02OTIsMTQgKzY5MiwxNCBAQAogCiAgICAgfkNQREZfQ29sb3IoKTsKIAotICAgIEZYX0JPT0wJCQkJCUlzTnVsbCgpIGNvbnN0CisgICAgYm9vbAkJCQkJSXNOdWxsKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BCdWZmZXIgPT0gTlVMTDsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCQlJc0VxdWFsKGNvbnN0IENQREZfQ29sb3ImIG90aGVyKSBjb25zdDsKKyAgICBib29sCQkJCQlJc0VxdWFsKGNvbnN0IENQREZfQ29sb3ImIG90aGVyKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQkJCUlzUGF0dGVybigpIGNvbnN0CisgICAgYm9vbAkJCQkJSXNQYXR0ZXJuKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BDUyAmJiBtX3BDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfUEFUVEVSTjsKICAgICB9CkBAIC03MTIsNyArNzEyLDcgQEAKIAogICAgIHZvaWQJCQkJCVNldFZhbHVlKENQREZfUGF0dGVybiogcFBhdHRlcm4sIEZYX0ZMT0FUKiBjb21wLCBpbnQgbmNvbXBzKTsKIAotICAgIEZYX0JPT0wJCQkJCUdldFJHQihpbnQmIFIsIGludCYgRywgaW50JiBCKSBjb25zdDsKKyAgICBib29sCQkJCQlHZXRSR0IoaW50JiBSLCBpbnQmIEcsIGludCYgQikgY29uc3Q7CiAKICAgICBDUERGX1BhdHRlcm4qCQkJR2V0UGF0dGVybigpIGNvbnN0OwogCkBAIC03MzQsNyArNzM0LDcgQEAKIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgfkNQREZfUGF0dGVybigpOwotICAgIHZvaWQgICAgU2V0Rm9yY2VDbGVhcihGWF9CT09MIGJGb3JjZUNsZWFyKSB7IG1fYkZvcmNlQ2xlYXIgPSBiRm9yY2VDbGVhcjsgfQorICAgIHZvaWQgICAgU2V0Rm9yY2VDbGVhcihib29sIGJGb3JjZUNsZWFyKSB7IG1fYkZvcmNlQ2xlYXIgPSBiRm9yY2VDbGVhcjsgfQogCiAgICAgQ1BERl9PYmplY3QqICAgICAgICAgICAgICAgIG1fcFBhdHRlcm5PYmo7CiAKQEAgLTc0Nyw3ICs3NDcsNyBAQAogCiBwcm90ZWN0ZWQ6CiAgICAgQ1BERl9QYXR0ZXJuKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBQYXJlbnRNYXRyaXgpOwotICAgIEZYX0JPT0wgICAgIG1fYkZvcmNlQ2xlYXI7CisgICAgYm9vbCAgICAgbV9iRm9yY2VDbGVhcjsKIH07CiAKIGNsYXNzIENQREZfVGlsaW5nUGF0dGVybiA6IHB1YmxpYyBDUERGX1BhdHRlcm4KQEAgLTc1OCwxMSArNzU4LDExIEBACiAKICAgICB2aXJ0dWFsIH5DUERGX1RpbGluZ1BhdHRlcm4oKTsKIAotICAgIEZYX0JPT0wJCQkJTG9hZCgpOworICAgIGJvb2wJCQkJTG9hZCgpOwogCiAKIAotICAgIEZYX0JPT0wJCQkJbV9iQ29sb3JlZDsKKyAgICBib29sCQkJCW1fYkNvbG9yZWQ7CiAKICAgICBDRlhfRmxvYXRSZWN0CQltX0JCb3g7CiAKQEAgLTc3OCwxNyArNzc4LDE3IEBACiB7CiBwdWJsaWM6CiAKLSAgICBDUERGX1NoYWRpbmdQYXR0ZXJuKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwgRlhfQk9PTCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcGFyZW50TWF0cml4KTsKKyAgICBDUERGX1NoYWRpbmdQYXR0ZXJuKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwgYm9vbCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcGFyZW50TWF0cml4KTsKIAogICAgIHZpcnR1YWwgfkNQREZfU2hhZGluZ1BhdHRlcm4oKTsKIAogICAgIENQREZfT2JqZWN0KgkJbV9wU2hhZGluZ09iajsKIAotICAgIEZYX0JPT0wJCQkJbV9iU2hhZGluZ09iajsKKyAgICBib29sCQkJCW1fYlNoYWRpbmdPYmo7CiAKLSAgICBGWF9CT09MCQkJCUxvYWQoKTsKKyAgICBib29sCQkJCUxvYWQoKTsKIAotICAgIEZYX0JPT0wJCQkJUmVsb2FkKCk7CisgICAgYm9vbAkJCQlSZWxvYWQoKTsKIAogICAgIGludAkJCQkJbV9TaGFkaW5nVHlwZTsKIApAQCAtODEwLDcgKzgxMCw3IEBACiB7CiBwdWJsaWM6CiAKLSAgICBGWF9CT09MCQkJCUxvYWQoQ1BERl9TdHJlYW0qIHBTaGFkaW5nU3RyZWFtLCBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLCBpbnQgbkZ1bmNzLCBDUERGX0NvbG9yU3BhY2UqIHBDUyk7CisgICAgYm9vbAkJCQlMb2FkKENQREZfU3RyZWFtKiBwU2hhZGluZ1N0cmVhbSwgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywgaW50IG5GdW5jcywgQ1BERl9Db2xvclNwYWNlKiBwQ1MpOwogCiAgICAgRlhfRFdPUkQJCQlHZXRGbGFnKCk7CiAKQEAgLTgyMCw3ICs4MjAsNyBAQAogCiAgICAgRlhfRFdPUkQgCQkJR2V0VmVydGV4KENQREZfTWVzaFZlcnRleCYgdmVydGV4LCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCk7CiAKLSAgICBGWF9CT09MCQkJCUdldFZlcnRleFJvdyhDUERGX01lc2hWZXJ0ZXgqIHZlcnRleCwgaW50IGNvdW50LCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCk7CisgICAgYm9vbAkJCQlHZXRWZXJ0ZXhSb3coQ1BERl9NZXNoVmVydGV4KiB2ZXJ0ZXgsIGludCBjb3VudCwgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJCaXRtYXApOwogICAgIENQREZfRnVuY3Rpb24qKgltX3BGdW5jczsKICAgICBDUERGX0NvbG9yU3BhY2UqCW1fcENTOwogICAgIEZYX0RXT1JECQkJbV9uRnVuY3MsIG1fbkNvb3JkQml0cywgbV9uQ29tcEJpdHMsIG1fbkZsYWdCaXRzLCBtX25Db21wczsKQEAgLTg1NCwxMyArODU0LDEzIEBACiAKICAgICB+Q1BERl9JbWFnZSgpOwogCi0gICAgRlhfQk9PTAkJCQkJTG9hZEltYWdlRihDUERGX1N0cmVhbSogcEltYWdlU3RyZWFtLCBGWF9CT09MIGJJbmxpbmUpOworICAgIGJvb2wJCQkJCUxvYWRJbWFnZUYoQ1BERl9TdHJlYW0qIHBJbWFnZVN0cmVhbSwgYm9vbCBiSW5saW5lKTsKIAogICAgIHZvaWQJCQkJCVJlbGVhc2UoKTsKIAogICAgIENQREZfSW1hZ2UqCQkJCUNsb25lKCk7CiAKLSAgICBGWF9CT09MCQkJCQlJc0lubGluZSgpCisgICAgYm9vbAkJCQkJSXNJbmxpbmUoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYklubGluZTsKICAgICB9CkBAIC05MDgsMTcgKzkwOCwxNyBAQAogICAgIH0KIAogCi0gICAgRlhfQk9PTAkJCQkJSXNNYXNrKCkgY29uc3QKKyAgICBib29sCQkJCQlJc01hc2soKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYklzTWFzazsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCQlJc0ludGVycG9sKCkgY29uc3QKKyAgICBib29sCQkJCQlJc0ludGVycG9sKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX2JJbnRlcnBvbGF0ZTsKICAgICB9CiAKLSAgICBDRlhfRElCU291cmNlKgkJCUxvYWRESUJTb3VyY2UoQ0ZYX0RJQlNvdXJjZSoqIHBwTWFzayA9IE5VTEwsIEZYX0RXT1JEKiBwTWF0dGVDb2xvciA9IE5VTEwsIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSkgY29uc3Q7CisgICAgQ0ZYX0RJQlNvdXJjZSoJCQlMb2FkRElCU291cmNlKENGWF9ESUJTb3VyY2UqKiBwcE1hc2sgPSBOVUxMLCBGWF9EV09SRCogcE1hdHRlQ29sb3IgPSBOVUxMLCBib29sIGJTdGRDUyA9IGZhbHNlLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIGJvb2wgYkxvYWRNYXNrID0gZmFsc2UpIGNvbnN0OwogCiAKIApAQCAtOTMxLDggKzkzMSw4IEBACiAgICAgdm9pZAkJCQkJUmVzZXRDYWNoZShDUERGX1BhZ2UqIHBQYWdlLCBjb25zdCBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCk7CiAKIHB1YmxpYzoKLSAgICBGWF9CT09MCQkJCQlTdGFydExvYWRESUJTb3VyY2UoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2UsIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSk7Ci0gICAgRlhfQk9PTAkJCQkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIGJvb2wJCQkJCVN0YXJ0TG9hZERJQlNvdXJjZShDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZSwgYm9vbCBiU3RkQ1MgPSBmYWxzZSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBib29sIGJMb2FkTWFzayA9IGZhbHNlKTsKKyAgICBib29sCQkJCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CiAgICAgQ0ZYX0RJQlNvdXJjZSoJCQlEZXRhY2hCaXRtYXAoKTsKICAgICBDRlhfRElCU291cmNlKgkJCURldGFjaE1hc2soKTsKICAgICBDRlhfRElCU291cmNlKgkJCW1fcERJQlNvdXJjZTsKQEAgLTk0MSwxNiArOTQxLDE2IEBACiBwcml2YXRlOgogCiAgICAgQ1BERl9TdHJlYW0qCQkJbV9wU3RyZWFtOwotICAgIEZYX0JPT0wJCQkJCW1fYklubGluZTsKKyAgICBib29sCQkJCQltX2JJbmxpbmU7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KgkJbV9wSW5saW5lRGljdDsKIAogICAgIGludDMyX3QJCQkJbV9IZWlnaHQ7CiAKICAgICBpbnQzMl90CQkJCW1fV2lkdGg7CiAKLSAgICBGWF9CT09MCQkJCQltX2JJc01hc2s7CisgICAgYm9vbAkJCQkJbV9iSXNNYXNrOwogCi0gICAgRlhfQk9PTAkJCQkJbV9iSW50ZXJwb2xhdGU7CisgICAgYm9vbAkJCQkJbV9iSW50ZXJwb2xhdGU7CiAKICAgICBDUERGX0RvY3VtZW50KgkJCW1fcERvY3VtZW50OwogCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3NlcmlhbC5oIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9zZXJpYWwuaAppbmRleCAxODc3ZWY4Li4wNmNmMjEzIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3NlcmlhbC5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfc2VyaWFsLmgKQEAgLTExNywzNSArMTE3LDM1IEBACiAKICAgICB2b2lkCQkJCVJlbW92ZVNlY3VyaXR5KCk7CiAKLSAgICBGWF9CT09MCQkJCUNyZWF0ZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzID0gMCk7CisgICAgYm9vbAkJCQlDcmVhdGUoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBGWF9EV09SRCBmbGFncyA9IDApOwogCi0gICAgRlhfQk9PTAkJCQlDcmVhdGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzID0gMCk7CisgICAgYm9vbAkJCQlDcmVhdGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzID0gMCk7CiAKLSAgICBGWF9CT09MCQkJCUNyZWF0ZShJRlhfU3RyZWFtV3JpdGUqIHBGaWxlLCBGWF9EV09SRCBmbGFncyA9IDApOworICAgIGJvb2wJCQkJQ3JlYXRlKElGWF9TdHJlYW1Xcml0ZSogcEZpbGUsIEZYX0RXT1JEIGZsYWdzID0gMCk7CiAKICAgICBpbnQzMl90CQkJQ29udGludWUoSUZYX1BhdXNlICpwUGF1c2UgPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQkJU2V0RmlsZVZlcnNpb24oaW50MzJfdCBmaWxlVmVyc2lvbiA9IDE3KTsKKyAgICBib29sCQkJCVNldEZpbGVWZXJzaW9uKGludDMyX3QgZmlsZVZlcnNpb24gPSAxNyk7CiBwcm90ZWN0ZWQ6CiAKICAgICBDUERGX0RvY3VtZW50KgkJbV9wRG9jdW1lbnQ7CiAKICAgICBDUERGX1BhcnNlcioJCW1fcFBhcnNlcjsKIAotICAgIEZYX0JPT0wJCQkJbV9iQ29tcHJlc3M7CisgICAgYm9vbAkJCQltX2JDb21wcmVzczsKIAotICAgIEZYX0JPT0wJCQkJbV9iU2VjdXJpdHlDaGFuZ2VkOworICAgIGJvb2wJCQkJbV9iU2VjdXJpdHlDaGFuZ2VkOwogCiAgICAgQ1BERl9EaWN0aW9uYXJ5KgltX3BFbmNyeXB0RGljdDsKICAgICBGWF9EV09SRAkJCW1fZHdFbnJ5cHRPYmpOdW07Ci0gICAgRlhfQk9PTAkJCQltX2JFbmNyeXB0Q2xvbmVkOworICAgIGJvb2wJCQkJbV9iRW5jcnlwdENsb25lZDsKIAotICAgIEZYX0JPT0wJCQkJbV9iU3RhbmRhcmRTZWN1cml0eTsKKyAgICBib29sCQkJCW1fYlN0YW5kYXJkU2VjdXJpdHk7CiAKICAgICBDUERGX0NyeXB0b0hhbmRsZXIqCW1fcENyeXB0b0hhbmRsZXI7Ci0gICAgRlhfQk9PTAkJCQltX2JOZXdDcnlwdG87CisgICAgYm9vbAkJCQltX2JOZXdDcnlwdG87CiAKLSAgICBGWF9CT09MCQkJCW1fYkVuY3J5cHRNZXRhZGF0YTsKKyAgICBib29sCQkJCW1fYkVuY3J5cHRNZXRhZGF0YTsKIAogICAgIENQREZfT2JqZWN0KgkJbV9wTWV0YWRhdGE7CiAKQEAgLTE1NCw3ICsxNTQsNyBAQAogICAgIGludDMyX3QJCQltX09iamVjdFN0cmVhbVNpemU7CiAKICAgICBGWF9EV09SRAkJCW1fZHdMYXN0T2JqTnVtOwotICAgIEZYX0JPT0wJCQkJQ3JlYXRlKEZYX0RXT1JEIGZsYWdzKTsKKyAgICBib29sCQkJCUNyZWF0ZShGWF9EV09SRCBmbGFncyk7CiAgICAgdm9pZAkJCQlSZXNldFN0YW5kYXJkU2VjdXJpdHkoKTsKICAgICB2b2lkCQkJCUNsZWFyKCk7CiAgICAgaW50MzJfdAkJCVdyaXRlRG9jX1N0YWdlMShJRlhfUGF1c2UgKnBQYXVzZSk7CkBAIC0xNzAsMTQgKzE3MCwxNCBAQAogICAgIHZvaWQJCQkJQXBwZW5kTmV3T2JqTnVtKEZYX0RXT1JEIG9iamJ1bSk7CiAgICAgaW50MzJfdAkJCVdyaXRlT2xkSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgb2JqbnVtKTsKICAgICBpbnQzMl90CQkJV3JpdGVPbGRPYmpzKElGWF9QYXVzZSAqcFBhdXNlKTsKLSAgICBpbnQzMl90CQkJV3JpdGVOZXdPYmpzKEZYX0JPT0wgYkluY3JlbWVudGFsLCBJRlhfUGF1c2UgKnBQYXVzZSk7CisgICAgaW50MzJfdAkJCVdyaXRlTmV3T2Jqcyhib29sIGJJbmNyZW1lbnRhbCwgSUZYX1BhdXNlICpwUGF1c2UpOwogICAgIGludDMyX3QJCQlXcml0ZUluZGlyZWN0T2JqKGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKTsKLSAgICBpbnQzMl90CQkJV3JpdGVEaXJlY3RPYmooRlhfRFdPUkQgb2JqbnVtLCBjb25zdCBDUERGX09iamVjdCogcE9iaiwgRlhfQk9PTCBiRW5jcnlwdCA9IFRSVUUpOworICAgIGludDMyX3QJCQlXcml0ZURpcmVjdE9iaihGWF9EV09SRCBvYmpudW0sIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqLCBib29sIGJFbmNyeXB0ID0gdHJ1ZSk7CiAgICAgaW50MzJfdAkJCVdyaXRlSW5kaXJlY3RPYmplY3RUb1N0cmVhbShjb25zdCBDUERGX09iamVjdCogcE9iaik7CiAgICAgaW50MzJfdAkJCVdyaXRlSW5kaXJlY3RPYmooRlhfRFdPUkQgb2JqbnVtLCBjb25zdCBDUERGX09iamVjdCogcE9iaik7CiAgICAgaW50MzJfdAkJCVdyaXRlSW5kaXJlY3RPYmplY3RUb1N0cmVhbShGWF9EV09SRCBvYmpudW0sIGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIEZYX0RXT1JEIGR3U2l6ZSk7CiAgICAgaW50MzJfdAkJCUFwcGVuZE9iamVjdE51bWJlclRvWFJlZihGWF9EV09SRCBvYmpudW0pOwotICAgIHZvaWQJCQkJSW5pdElEKEZYX0JPT0wgYkRlZmF1bHQgPSBUUlVFKTsKKyAgICB2b2lkCQkJCUluaXRJRChib29sIGJEZWZhdWx0ID0gdHJ1ZSk7CiAgICAgaW50MzJfdAkJCVdyaXRlU3RyZWFtKGNvbnN0IENQREZfT2JqZWN0KiBwU3RyZWFtLCBGWF9EV09SRCBvYmpudW0sIENQREZfQ3J5cHRvSGFuZGxlciogcENyeXB0byk7CiAKICAgICBpbnQzMl90CQkJbV9pU3RhZ2U7CmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2FwLmggYi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2FwLmgKaW5kZXggN2NmYWVkNC4uZWIwY2E0NCAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9hcC5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfYXAuaApAQCAtNjAsNyArNjAsNyBAQAogCiAgICAgaW50MzJfdAkJCQkJCUdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsIGludDMyX3QgbkZvbnRJbmRleCk7CiAKLSAgICBGWF9CT09MCQkJCQkJCUlzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCk7CisgICAgYm9vbAkJCQkJCQlJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpOwogCiAgICAgaW50MzJfdAkJCQkJCUdldERlZmF1bHRGb250SW5kZXgoKTsKIHByaXZhdGU6CkBAIC03NiwyMCArNzYsMjAgQEAKIHsKIHB1YmxpYzoKIAotICAgIHN0YXRpYyBGWF9CT09MCQkJCQkJCUdlbmVyYXRlVGV4dEZpZWxkQVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKKyAgICBzdGF0aWMgYm9vbAkJCQkJCQlHZW5lcmF0ZVRleHRGaWVsZEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCk7CiAKLSAgICBzdGF0aWMgRlhfQk9PTAkJCQkJCQlHZW5lcmF0ZUNvbWJvQm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKKyAgICBzdGF0aWMgYm9vbAkJCQkJCQlHZW5lcmF0ZUNvbWJvQm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKIAotICAgIHN0YXRpYyBGWF9CT09MCQkJCQkJCUdlbmVyYXRlTGlzdEJveEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCk7CisgICAgc3RhdGljIGJvb2wJCQkJCQkJR2VuZXJhdGVMaXN0Qm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKIAogICAgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2VuZXJhdGVFZGl0QVAoSVBWVF9Gb250TWFwICogcEZvbnRNYXAsIElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yLAotICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0LCBGWF9CT09MIGJDb250aW51b3VzLCBGWF9XT1JEIFN1YldvcmQgPSAwLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBWaXNpYmxlID0gTlVMTCk7CisgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsIGJvb2wgYkNvbnRpbnVvdXMsIEZYX1dPUkQgU3ViV29yZCA9IDAsIGNvbnN0IENQVlRfV29yZFJhbmdlICogcFZpc2libGUgPSBOVUxMKTsKIAogICAgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2VuZXJhdGVCb3JkZXJBUChjb25zdCBDUERGX1JlY3QgJiByZWN0LCBGWF9GTE9BVCBmV2lkdGgsCiAgICAgICAgICAgICBjb25zdCBDUFZUX0NvbG9yICYgY29sb3IsIGNvbnN0IENQVlRfQ29sb3IgJiBjckxlZnRUb3AsIGNvbnN0IENQVlRfQ29sb3IgJiBjclJpZ2h0Qm90dG9tLAogICAgICAgICAgICAgaW50MzJfdCBuU3R5bGUsIGNvbnN0IENQVlRfRGFzaCAmIGRhc2gpOwogCi0gICAgc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZW5lcmF0ZUNvbG9yQVAoY29uc3QgQ1BWVF9Db2xvciAmIGNvbG9yLCBjb25zdCBGWF9CT09MICYgYkZpbGxPclN0cm9rZSk7CisgICAgc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZW5lcmF0ZUNvbG9yQVAoY29uc3QgQ1BWVF9Db2xvciAmIGNvbG9yLCBjb25zdCBib29sICYgYkZpbGxPclN0cm9rZSk7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GUERGRE9DX0ZQREZfQVBfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmggYi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oCmluZGV4IGZjOWQzYmMuLjM2ZDlkMjkgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgKKysrIGIvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaApAQCAtMTY0LDI2ICsxNjQsMjYgQEAKICAgICAgICAgcmV0dXJuIG1fZVVzYWdlVHlwZTsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJQ2hlY2tPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QpOworICAgIGJvb2wJCQlDaGVja09DR1Zpc2libGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCk7CiAKICAgICB2b2lkCQkJUmVzZXRPQ0NvbnRleHQoKTsKIHByb3RlY3RlZDoKIAotICAgIEZYX0JPT0wJCQlMb2FkT0NHU3RhdGVGcm9tQ29uZmlnKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NDb25maWcsIGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QsIEZYX0JPT0wgJmJWYWxpZENvbmZpZykgY29uc3Q7CisgICAgYm9vbAkJCUxvYWRPQ0dTdGF0ZUZyb21Db25maWcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0NvbmZpZywgY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCwgYm9vbCAmYlZhbGlkQ29uZmlnKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQlMb2FkT0NHU3RhdGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCkgY29uc3Q7CisgICAgYm9vbAkJCUxvYWRPQ0dTdGF0ZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ0dEaWN0KSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQlHZXRPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QpOworICAgIGJvb2wJCQlHZXRPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QpOwogCi0gICAgRlhfQk9PTAkJCUdldE9DR1ZFKENQREZfQXJyYXkgKnBFeHByZXNzaW9uLCBGWF9CT09MIGJGcm9tQ29uZmlnLCBpbnQgbkxldmVsID0gMCk7CisgICAgYm9vbAkJCUdldE9DR1ZFKENQREZfQXJyYXkgKnBFeHByZXNzaW9uLCBib29sIGJGcm9tQ29uZmlnLCBpbnQgbkxldmVsID0gMCk7CiAKLSAgICBGWF9CT09MCQkJTG9hZE9DTURTdGF0ZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ01ERGljdCwgRlhfQk9PTCBiRnJvbUNvbmZpZyk7CisgICAgYm9vbAkJCUxvYWRPQ01EU3RhdGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NNRERpY3QsIGJvb2wgYkZyb21Db25maWcpOwogCiAgICAgQ1BERl9Eb2N1bWVudAkJKm1fcERvY3VtZW50OwogCiAgICAgVXNhZ2VUeXBlCQkJbV9lVXNhZ2VUeXBlOwogCi0gICAgc3RkOjptYXA8Y29uc3QgQ1BERl9EaWN0aW9uYXJ5KiwgRlhfQk9PTD4gbV9PQ0dTdGF0ZXM7CisgICAgc3RkOjptYXA8Y29uc3QgQ1BERl9EaWN0aW9uYXJ5KiwgYm9vbD4gbV9PQ0dTdGF0ZXM7CiB9OwogY2xhc3MgQ1BERl9MV2luUGFyYW0KIHsKQEAgLTI5NSw3ICsyOTUsNyBAQAogCiAgICAgQ0ZYX1dpZGVTdHJpbmcJCUdldEZpbGVQYXRoKCkgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJCUdldE5ld1dpbmRvdygpIGNvbnN0CisgICAgYm9vbAkJCQlHZXROZXdXaW5kb3coKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldEJvb2xlYW4oIk5ld1dpbmRvdyIpOwogICAgIH0KQEAgLTMwNCw3ICszMDQsNyBAQAogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCUdldFVSSShDUERGX0RvY3VtZW50KiBwRG9jKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQkJR2V0TW91c2VNYXAoKSBjb25zdAorICAgIGJvb2wJCQkJR2V0TW91c2VNYXAoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldEJvb2xlYW4oIklzTWFwIik7CiAgICAgfQpAQCAtMzE0LDkgKzMxNCw5IEBACiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJR2V0SGlkZVN0YXR1cygpIGNvbnN0CisgICAgYm9vbAkJCQlHZXRIaWRlU3RhdHVzKCkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXRCb29sZWFuKCJIIiwgVFJVRSk7CisgICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXRCb29sZWFuKCJIIiwgdHJ1ZSk7CiAgICAgfQogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCUdldE5hbWVkQWN0aW9uKCkgY29uc3QKQEAgLTM0NSwxNyArMzQ1LDE3IEBACiAgICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXROdW1iZXIoIlZvbHVtZSIpOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJSXNTeW5jaHJvbm91cygpIGNvbnN0CisgICAgYm9vbAkJCQlJc1N5bmNocm9ub3VzKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXRCb29sZWFuKCJTeW5jaHJvbm91cyIpOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJSXNSZXBlYXQoKSBjb25zdAorICAgIGJvb2wJCQkJSXNSZXBlYXQoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldEJvb2xlYW4oIlJlcGVhdCIpOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJSXNNaXhQbGF5KCkgY29uc3QKKyAgICBib29sCQkJCUlzTWl4UGxheSgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiTWl4Iik7CiAgICAgfQpAQCAtNDA1LDcgKzQwNSw3IEBACiAgICAgICAgIERvY3VtZW50UHJpbnRlZAogICAgIH07CiAKLSAgICBGWF9CT09MCQkJCUFjdGlvbkV4aXN0KEFBY3Rpb25UeXBlIGVUeXBlKSBjb25zdDsKKyAgICBib29sCQkJCUFjdGlvbkV4aXN0KEFBY3Rpb25UeXBlIGVUeXBlKSBjb25zdDsKIAogICAgIENQREZfQWN0aW9uCQkJR2V0QWN0aW9uKEFBY3Rpb25UeXBlIGVUeXBlKSBjb25zdDsKIApAQCAtNDU1LDEzICs0NTUsMTMgQEAKICAgICAgICAgcmV0dXJuIG1fcE9iajsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJSXNVUkwoKSBjb25zdDsKKyAgICBib29sCQkJSXNVUkwoKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQlHZXRGaWxlTmFtZShDRlhfV2lkZVN0cmluZyAmd3NGaWxlTmFtZSkgY29uc3Q7CisgICAgYm9vbAkJCUdldEZpbGVOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0ZpbGVOYW1lKSBjb25zdDsKIAogICAgIENQREZfU3RyZWFtKglHZXRGaWxlU3RyZWFtKCkgY29uc3Q7CiAKLSAgICB2b2lkCQkJU2V0RmlsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZpbGVOYW1lLCBGWF9CT09MIGJVUkwgPSBGQUxTRSk7CisgICAgdm9pZAkJCVNldEZpbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGaWxlTmFtZSwgYm9vbCBiVVJMID0gZmFsc2UpOwogcHJvdGVjdGVkOgogCiAgICAgQ1BERl9PYmplY3QJCSptX3BPYmo7CkBAIC01NDMsMTMgKzU0MywxMyBAQAogCiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRBbm5vdERpY3QoKTsKIAotICAgIEZYX0JPT0wgRHJhd0FwcGVhcmFuY2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwKKyAgICBib29sIERyYXdBcHBlYXJhbmNlKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwZWFyYW5jZU1vZGUgbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOwogCi0gICAgRlhfQk9PTCBEcmF3SW5Db250ZXh0KGNvbnN0IENQREZfUGFnZSogcFBhZ2UsCisgICAgYm9vbCBEcmF3SW5Db250ZXh0KGNvbnN0IENQREZfUGFnZSogcFBhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwZWFyYW5jZU1vZGUgbW9kZSk7CkBAIC01ODUsMjUgKzU4NSwyNSBAQAogICAgIHZvaWQJR2V0QW5ub3RSZWN0KGNvbnN0IENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwgY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLCBDUERGX1JlY3QgJnJ0QW5ub3QpIGNvbnN0OwogCiAgICAgdm9pZAkJCQlEaXNwbGF5QW5ub3RzKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0JPT0wgYlNob3dXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIGJvb2wgYlNob3dXaWRnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOwogCiAgICAgdm9pZAkJCQlEaXNwbGF5QW5ub3RzKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByaW50aW5nLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9CT09MIGJTaG93V2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJQcmludGluZywgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgYm9vbCBiU2hvd1dpZGdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykKICAgICB7CiAgICAgICAgIERpc3BsYXlBbm5vdHMocFBhZ2UsIE5VTEwsIHBDb250ZXh0LCBiUHJpbnRpbmcsIHBNYXRyaXgsIGJTaG93V2lkZ2V0ID8gMyA6IDEsIHBPcHRpb25zLCBOVUxMKTsKICAgICB9CiAKICAgICB2b2lkCQkJCURpc3BsYXlBbm5vdHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0JPT0wgYlNob3dXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlByaW50aW5nLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBib29sIGJTaG93V2lkZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBGWF9SRUNUICpwQ2xpcFJlY3QpCiAgICAgewogICAgICAgICBEaXNwbGF5QW5ub3RzKHBQYWdlLCBOVUxMLCBwQ29udGV4dCwgYlByaW50aW5nLCBwTWF0cml4LCBiU2hvd1dpZGdldCA/IDMgOiAxLCBwT3B0aW9ucywgcENsaXBSZWN0KTsKICAgICB9CiAKICAgICB2b2lkCQkJCURpc3BsYXlBbm5vdHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGR3QW5ub3RGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGR3QW5ub3RGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywgRlhfUkVDVCogcENsaXBSZWN0KTsKIAogCkBAIC02MzYsOCArNjM2LDggQEAKICAgICBDRlhfUHRyQXJyYXkJCW1fQm9yZGVyczsKIAogICAgIHZvaWQJCQkJRGlzcGxheVBhc3MoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIEZYX0JPT0wgYlByaW50aW5nLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2lkZ2V0LCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBGWF9SRUNUKiBjbGlwX3JlY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgYm9vbCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJXaWRnZXQsIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIEZYX1JFQ1QqIGNsaXBfcmVjdCk7CiAgICAgZnJpZW5kIGNsYXNzCQlDUERGX0Fubm90OwogfTsKICNkZWZpbmUgQ09MT1JUWVBFX1RSQU5TUEFSRU5UCTAKQEAgLTY3OCw3ICs2NzgsNyBAQAogCiAKIAotICAgIEZYX0JPT0wJCQkJSGFzRm9udCgpOworICAgIGJvb2wJCQkJSGFzRm9udCgpOwogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCUdldEZvbnRTdHJpbmcoKTsKIApAQCAtNjg3LDE4ICs2ODcsMTggQEAKIAogCiAKLSAgICBGWF9CT09MCQkJCUhhc0NvbG9yKEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uID0gRkFMU0UpOworICAgIGJvb2wJCQkJSGFzQ29sb3IoYm9vbCBiU3Ryb2tpbmdPcGVyYXRpb24gPSBmYWxzZSk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJR2V0Q29sb3JTdHJpbmcoRlhfQk9PTCBiU3Ryb2tpbmdPcGVyYXRpb24gPSBGQUxTRSk7CisgICAgQ0ZYX0J5dGVTdHJpbmcJCUdldENvbG9yU3RyaW5nKGJvb2wgYlN0cm9raW5nT3BlcmF0aW9uID0gZmFsc2UpOwogCi0gICAgdm9pZAkJCQlHZXRDb2xvcihpbnQmIGlDb2xvclR5cGUsIEZYX0ZMT0FUIGZjWzRdLCBGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbiA9IEZBTFNFKTsKKyAgICB2b2lkCQkJCUdldENvbG9yKGludCYgaUNvbG9yVHlwZSwgRlhfRkxPQVQgZmNbNF0sIGJvb2wgYlN0cm9raW5nT3BlcmF0aW9uID0gZmFsc2UpOwogCi0gICAgdm9pZAkJCQlHZXRDb2xvcihGWF9BUkdCJiBjb2xvciwgaW50JiBpQ29sb3JUeXBlLCBGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbiA9IEZBTFNFKTsKKyAgICB2b2lkCQkJCUdldENvbG9yKEZYX0FSR0ImIGNvbG9yLCBpbnQmIGlDb2xvclR5cGUsIGJvb2wgYlN0cm9raW5nT3BlcmF0aW9uID0gZmFsc2UpOwogCiAKIAogCi0gICAgRlhfQk9PTAkJCQlIYXNUZXh0TWF0cml4KCk7CisgICAgYm9vbAkJCQlIYXNUZXh0TWF0cml4KCk7CiAKICAgICBDRlhfQnl0ZVN0cmluZwkJR2V0VGV4dE1hdHJpeFN0cmluZygpOwogCkBAIC03MjAsMTUgKzcyMCwxNSBAQAogewogcHVibGljOgogCi0gICAgQ1BERl9JbnRlckZvcm0oQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBGWF9CT09MIGJVcGRhdGVBUCk7CisgICAgQ1BERl9JbnRlckZvcm0oQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBib29sIGJVcGRhdGVBUCk7CiAKICAgICB+Q1BERl9JbnRlckZvcm0oKTsKIAogCiAKLSAgICBzdGF0aWMgdm9pZAkJCQlFbmFibGVVcGRhdGVBUChGWF9CT09MIGJVcGRhdGVBUCk7CisgICAgc3RhdGljIHZvaWQJCQkJRW5hYmxlVXBkYXRlQVAoYm9vbCBiVXBkYXRlQVApOwogCi0gICAgc3RhdGljIEZYX0JPT0wJCQlVcGRhdGluZ0FQRW5hYmxlZCgpOworICAgIHN0YXRpYyBib29sCQkJVXBkYXRpbmdBUEVuYWJsZWQoKTsKIAogCiAgICAgc3RhdGljIENGWF9CeXRlU3RyaW5nCUdlbmVyYXRlTmV3UmVzb3VyY2VOYW1lKGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJlc0RpY3QsIGNvbnN0IEZYX0NIQVIqIGNzVHlwZSwgaW50IGlNaW5MZW4gPSAyLCBjb25zdCBGWF9DSEFSKiBjc1ByZWZpeCA9ICIiKTsKQEAgLTc1NiwxMSArNzU2LDExIEBACiAKIAogCi0gICAgRlhfQk9PTAkJCQkJVmFsaWRhdGVGaWVsZE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lLCBpbnQgaVR5cGUpOworICAgIGJvb2wJCQkJCVZhbGlkYXRlRmllbGROYW1lKENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSwgaW50IGlUeXBlKTsKIAotICAgIEZYX0JPT0wJCQkJCVZhbGlkYXRlRmllbGROYW1lKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsIENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSk7CisgICAgYm9vbAkJCQkJVmFsaWRhdGVGaWVsZE5hbWUoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lKTsKIAotICAgIEZYX0JPT0wJCQkJCVZhbGlkYXRlRmllbGROYW1lKGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sLCBDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUpOworICAgIGJvb2wJCQkJCVZhbGlkYXRlRmllbGROYW1lKGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sLCBDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUpOwogCiAKIApAQCAtNzcxLDcgKzc3MSw3IEBACiAKICAgICB2b2lkCQkJCQlHZXRBbGxGaWVsZE5hbWVzKENGWF9XaWRlU3RyaW5nQXJyYXkmIGFsbEZpZWxkTmFtZXMpOwogCi0gICAgRlhfQk9PTAkJCQkJSXNWYWxpZEZvcm1GaWVsZChjb25zdCB2b2lkKiBwRmllbGQpOworICAgIGJvb2wJCQkJCUlzVmFsaWRGb3JtRmllbGQoY29uc3Qgdm9pZCogcEZpZWxkKTsKIAogICAgIENQREZfRm9ybUZpZWxkKgkJCUdldEZpZWxkQnlEaWN0KENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCkgY29uc3Q7CiAKQEAgLTc4Miw3ICs3ODIsNyBAQAogCiAgICAgQ1BERl9Gb3JtQ29udHJvbCoJCUdldENvbnRyb2woRlhfRFdPUkQgaW5kZXgsIENGWF9XaWRlU3RyaW5nIGNzRmllbGROYW1lID0gTCIiKTsKIAotICAgIEZYX0JPT0wJCQkJCUlzVmFsaWRGb3JtQ29udHJvbChjb25zdCB2b2lkKiBwQ29udHJvbCk7CisgICAgYm9vbAkJCQkJSXNWYWxpZEZvcm1Db250cm9sKGNvbnN0IHZvaWQqIHBDb250cm9sKTsKIAogICAgIGludAkJCQkJCUNvdW50UGFnZUNvbnRyb2xzKENQREZfUGFnZSogcFBhZ2UpIGNvbnN0OwogCkBAIC04MTcsOSArODE3LDkgQEAKIAogCiAKLSAgICBGWF9CT09MCQkJCQlOZWVkQ29uc3RydWN0QVAoKTsKKyAgICBib29sCQkJCQlOZWVkQ29uc3RydWN0QVAoKTsKIAotICAgIHZvaWQJCQkJCU5lZWRDb25zdHJ1Y3RBUChGWF9CT09MIGJOZWVkQVApOworICAgIHZvaWQJCQkJCU5lZWRDb25zdHJ1Y3RBUChib29sIGJOZWVkQVApOwogCiAKIApAQCAtODQ1LDExICs4NDUsMTEgQEAKIAogICAgIENQREZfRm9udCoJCQkJR2V0TmF0aXZlRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CiAKLSAgICBGWF9CT09MCQkJCQlGaW5kRm9ybUZvbnQoY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CisgICAgYm9vbAkJCQkJRmluZEZvcm1Gb250KGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwogCi0gICAgRlhfQk9PTAkJCQkJRmluZEZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsIENQREZfRm9udComIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKKyAgICBib29sCQkJCQlGaW5kRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwogCi0gICAgaW5saW5lIEZYX0JPT0wJCQlGaW5kRm9ybUZvbnQoQ0ZYX1dpZGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCisgICAgaW5saW5lIGJvb2wJCQlGaW5kRm9ybUZvbnQoQ0ZYX1dpZGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCiAgICAgewogICAgICAgICByZXR1cm4gRmluZEZvcm1Gb250KFBERl9FbmNvZGVUZXh0KGNzRm9udE5hbWUpLCBwRm9udCwgY3NOYW1lVGFnKTsKICAgICB9CkBAIC04ODIsMjAgKzg4MiwyMCBAQAogCiAKIAotICAgIENQREZfRm9ybUZpZWxkKgkJCUNoZWNrUmVxdWlyZWRGaWVsZHMoY29uc3QgQ0ZYX1B0ckFycmF5ICpmaWVsZHMgPSBOVUxMLCBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlID0gVFJVRSkgY29uc3Q7CisgICAgQ1BERl9Gb3JtRmllbGQqCQkJQ2hlY2tSZXF1aXJlZEZpZWxkcyhjb25zdCBDRlhfUHRyQXJyYXkgKmZpZWxkcyA9IE5VTEwsIGJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUgPSB0cnVlKSBjb25zdDsKIAotICAgIENGREZfRG9jdW1lbnQqIAkJCUV4cG9ydFRvRkRGKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcGRmX3BhdGgsIEZYX0JPT0wgYlNpbXBsZUZpbGVTcGVjID0gRkFMU0UpIGNvbnN0OworICAgIENGREZfRG9jdW1lbnQqIAkJCUV4cG9ydFRvRkRGKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcGRmX3BhdGgsIGJvb2wgYlNpbXBsZUZpbGVTcGVjID0gZmFsc2UpIGNvbnN0OwogCi0gICAgQ0ZERl9Eb2N1bWVudCoJCQlFeHBvcnRUb0ZERihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHBkZl9wYXRoLCBDRlhfUHRyQXJyYXkmIGZpZWxkcywgRlhfQk9PTCBiSW5jbHVkZU9yRXhjbHVkZSA9IFRSVUUsIEZYX0JPT0wgYlNpbXBsZUZpbGVTcGVjID0gRkFMU0UpIGNvbnN0OworICAgIENGREZfRG9jdW1lbnQqCQkJRXhwb3J0VG9GREYoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwZGZfcGF0aCwgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsIGJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUgPSB0cnVlLCBib29sIGJTaW1wbGVGaWxlU3BlYyA9IGZhbHNlKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQkJCUltcG9ydEZyb21GREYoY29uc3QgQ0ZERl9Eb2N1bWVudCogcEZERkRvYywgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOworICAgIGJvb2wJCQkJCUltcG9ydEZyb21GREYoY29uc3QgQ0ZERl9Eb2N1bWVudCogcEZERkRvYywgYm9vbCBiTm90aWZ5ID0gZmFsc2UpOwogCiAKIAogCi0gICAgRlhfQk9PTAkJCQkJUmVzZXRGb3JtKGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLCBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlID0gVFJVRSwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOworICAgIGJvb2wJCQkJCVJlc2V0Rm9ybShjb25zdCBDRlhfUHRyQXJyYXkmIGZpZWxkcywgYm9vbCBiSW5jbHVkZU9yRXhjbHVkZSA9IHRydWUsIGJvb2wgYk5vdGlmeSA9IGZhbHNlKTsKIAotICAgIEZYX0JPT0wJCQkJCVJlc2V0Rm9ybShGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CisgICAgYm9vbAkJCQkJUmVzZXRGb3JtKGJvb2wgYk5vdGlmeSA9IGZhbHNlKTsKIAogICAgIHZvaWQJCQkJCVJlbG9hZEZvcm0oKTsKIApAQCAtOTA3LDI3ICs5MDcsMjcgQEAKICAgICB2b2lkCQkJCQlTZXRGb3JtTm90aWZ5KGNvbnN0IENQREZfRm9ybU5vdGlmeSogcE5vdGlmeSk7CiAKIAotICAgIGludAkJCQkJCUdldFBhZ2VXaXRoV2lkZ2V0KGludCBpQ3VyUGFnZSwgRlhfQk9PTCBiTmV4dCk7CisgICAgaW50CQkJCQkJR2V0UGFnZVdpdGhXaWRnZXQoaW50IGlDdXJQYWdlLCBib29sIGJOZXh0KTsKIAogCiAKLSAgICBGWF9CT09MCQkJCQlJc1VwZGF0ZWQoKQorICAgIGJvb2wJCQkJCUlzVXBkYXRlZCgpCiAgICAgewogICAgICAgICByZXR1cm4gbV9iVXBkYXRlZDsKICAgICB9CiAKICAgICB2b2lkCQkJCQlDbGVhclVwZGF0ZWRGbGFnKCkKICAgICB7Ci0gICAgICAgIG1fYlVwZGF0ZWQgPSBGQUxTRTsKKyAgICAgICAgbV9iVXBkYXRlZCA9IGZhbHNlOwogICAgIH0KIAogCi0gICAgRlhfQk9PTAkJCQkJSGFzWEZBRm9ybSgpIGNvbnN0OworICAgIGJvb2wJCQkJCUhhc1hGQUZvcm0oKSBjb25zdDsKIAogICAgIHZvaWQJCQkJCUZpeFBhZ2VGaWVsZHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSk7CiBwcm90ZWN0ZWQ6CiAKLSAgICBzdGF0aWMgRlhfQk9PTAkJCW1fYlVwZGF0ZUFQOworICAgIHN0YXRpYyBib29sCQkJbV9iVXBkYXRlQVA7CiAKICAgICB2b2lkCQkJCQlMb2FkRmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LCBpbnQgbkxldmVsID0gMCk7CiAKQEAgLTkzNyw5ICs5MzcsOSBAQAogCiAgICAgQ1BERl9Gb3JtQ29udHJvbCoJCUFkZENvbnRyb2woY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwV2lkZ2V0RGljdCk7CiAKLSAgICB2b2lkCQkJCQlGREZfSW1wb3J0RmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBwYXJlbnRfbmFtZSwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UsIGludCBuTGV2ZWwgPSAwKTsKKyAgICB2b2lkCQkJCQlGREZfSW1wb3J0RmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBwYXJlbnRfbmFtZSwgYm9vbCBiTm90aWZ5ID0gZmFsc2UsIGludCBuTGV2ZWwgPSAwKTsKIAotICAgIEZYX0JPT0wJCQkJCVZhbGlkYXRlRmllbGROYW1lKENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSwgaW50IGlUeXBlLCBjb25zdCBDUERGX0Zvcm1GaWVsZCogcEV4Y2x1ZGVkRmllbGQsIGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBFeGNsdWRlZENvbnRyb2wpOworICAgIGJvb2wJCQkJCVZhbGlkYXRlRmllbGROYW1lKENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSwgaW50IGlUeXBlLCBjb25zdCBDUERGX0Zvcm1GaWVsZCogcEV4Y2x1ZGVkRmllbGQsIGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBFeGNsdWRlZENvbnRyb2wpOwogCiAgICAgaW50CQkJCQkJQ29tcGFyZUZpZWxkTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgbmFtZTEsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBuYW1lMik7CiAKQEAgLTk0Nyw3ICs5NDcsNyBAQAogCiAgICAgQ1BERl9Eb2N1bWVudCoJCQltX3BEb2N1bWVudDsKIAotICAgIEZYX0JPT0wJCQkJCW1fYkdlbmVyYXRlQVA7CisgICAgYm9vbAkJCQkJbV9iR2VuZXJhdGVBUDsKIAogICAgIENQREZfRGljdGlvbmFyeSoJCW1fcEZvcm1EaWN0OwogCkBAIC05NTksNyArOTU5LDcgQEAKIAogICAgIENQREZfRm9ybU5vdGlmeSoJCW1fcEZvcm1Ob3RpZnk7CiAKLSAgICBGWF9CT09MCQkJCQltX2JVcGRhdGVkOworICAgIGJvb2wJCQkJCW1fYlVwZGF0ZWQ7CiAgICAgZnJpZW5kIGNsYXNzIENQREZfRm9ybUNvbnRyb2w7CiAgICAgZnJpZW5kIGNsYXNzIENQREZfRm9ybUZpZWxkOwogfTsKQEAgLTEwMTgsNyArMTAxOCw3IEBACiAgICAgICAgIG1fcERpY3QgPSBwRGljdDsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCQlSZXNldEZpZWxkKEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKKyAgICBib29sCQkJCQlSZXNldEZpZWxkKGJvb2wgYk5vdGlmeSA9IGZhbHNlKTsKIAogCiAKQEAgLTEwNzUsNyArMTA3NSw3IEBACiAKICAgICBDRlhfV2lkZVN0cmluZwkJCUdldERlZmF1bHRWYWx1ZSgpOwogCi0gICAgRlhfQk9PTAkJCQkJU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CisgICAgYm9vbAkJCQkJU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBib29sIGJOb3RpZnkgPSBmYWxzZSk7CiAKIAogCkBAIC0xMDkwLDEzICsxMDkwLDEzIEBACiAKICAgICBpbnQJCQkJCQlHZXRTZWxlY3RlZEluZGV4KGludCBpbmRleCk7CiAKLSAgICBGWF9CT09MCQkJCQlDbGVhclNlbGVjdGlvbihGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CisgICAgYm9vbAkJCQkJQ2xlYXJTZWxlY3Rpb24oYm9vbCBiTm90aWZ5ID0gZmFsc2UpOwogCi0gICAgRlhfQk9PTAkJCQkJSXNJdGVtU2VsZWN0ZWQoaW50IGluZGV4KTsKKyAgICBib29sCQkJCQlJc0l0ZW1TZWxlY3RlZChpbnQgaW5kZXgpOwogCi0gICAgRlhfQk9PTAkJCQkJU2V0SXRlbVNlbGVjdGlvbihpbnQgaW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CisgICAgYm9vbAkJCQkJU2V0SXRlbVNlbGVjdGlvbihpbnQgaW5kZXgsIGJvb2wgYlNlbGVjdGVkLCBib29sIGJOb3RpZnkgPSBmYWxzZSk7CiAKLSAgICBGWF9CT09MCQkJCQlJc0l0ZW1EZWZhdWx0U2VsZWN0ZWQoaW50IGluZGV4KTsKKyAgICBib29sCQkJCQlJc0l0ZW1EZWZhdWx0U2VsZWN0ZWQoaW50IGluZGV4KTsKIAogICAgIGludAkJCQkJCUdldERlZmF1bHRTZWxlY3RlZEl0ZW0oKTsKIApAQCAtMTExNiw3ICsxMTE2LDcgQEAKIAogCiAKLSAgICBGWF9CT09MCQkJCQlDaGVja0NvbnRyb2woaW50IGlDb250cm9sSW5kZXgsIEZYX0JPT0wgYkNoZWNrZWQsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKKyAgICBib29sCQkJCQlDaGVja0NvbnRyb2woaW50IGlDb250cm9sSW5kZXgsIGJvb2wgYkNoZWNrZWQsIGJvb2wgYk5vdGlmeSA9IGZhbHNlKTsKIAogCiAKQEAgLTExMzAsMTEgKzExMzAsMTEgQEAKIAogICAgIGludAkJCQkJCUdldFNlbGVjdGVkT3B0aW9uSW5kZXgoaW50IGluZGV4KTsKIAotICAgIEZYX0JPT0wJCQkJCUlzT3B0aW9uU2VsZWN0ZWQoaW50IGlPcHRJbmRleCk7CisgICAgYm9vbAkJCQkJSXNPcHRpb25TZWxlY3RlZChpbnQgaU9wdEluZGV4KTsKIAotICAgIEZYX0JPT0wJCQkJCVNlbGVjdE9wdGlvbihpbnQgaU9wdEluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOworICAgIGJvb2wJCQkJCVNlbGVjdE9wdGlvbihpbnQgaU9wdEluZGV4LCBib29sIGJTZWxlY3RlZCwgYm9vbCBiTm90aWZ5ID0gZmFsc2UpOwogCi0gICAgRlhfQk9PTAkJCQkJQ2xlYXJTZWxlY3RlZE9wdGlvbnMoRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOworICAgIGJvb2wJCQkJCUNsZWFyU2VsZWN0ZWRPcHRpb25zKGJvb2wgYk5vdGlmeSA9IGZhbHNlKTsKIAogCiAKQEAgLTExNjksOSArMTE2OSw5IEBACiAKIAogCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRWYWx1ZShGWF9CT09MIGJEZWZhdWx0KTsKKyAgICBDRlhfV2lkZVN0cmluZwkJCUdldFZhbHVlKGJvb2wgYkRlZmF1bHQpOwogCi0gICAgRlhfQk9PTAkJCQkJU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBGWF9CT09MIGJEZWZhdWx0LCBGWF9CT09MIGJOb3RpZnkpOworICAgIGJvb2wJCQkJCVNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwgYm9vbCBiRGVmYXVsdCwgYm9vbCBiTm90aWZ5KTsKIAogCiAgICAgdm9pZAkJCQkJU3luY0ZpZWxkRmxhZ3MoKTsKQEAgLTExODYsOSArMTE4Niw5IEBACiAKIAogCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRDaGVja1ZhbHVlKEZYX0JPT0wgYkRlZmF1bHQpOworICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0Q2hlY2tWYWx1ZShib29sIGJEZWZhdWx0KTsKIAotICAgIEZYX0JPT0wJCQkJCVNldENoZWNrVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBGWF9CT09MIGJEZWZhdWx0LCBGWF9CT09MIGJOb3RpZnkpOworICAgIGJvb2wJCQkJCVNldENoZWNrVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBib29sIGJEZWZhdWx0LCBib29sIGJOb3RpZnkpOwogCiAKICAgICBGWF9GTE9BVAkJCQltX0ZvbnRTaXplOwpAQCAtMTIyNSw3ICsxMjI1LDcgQEAKIAogCiAKLSAgICBGWF9CT09MCQkJCQlJc1Byb3BvcnRpb25hbFNjYWxlKCk7CisgICAgYm9vbAkJCQkJSXNQcm9wb3J0aW9uYWxTY2FsZSgpOwogCiAKIApAQCAtMTIzNSw3ICsxMjM1LDcgQEAKIAogCiAKLSAgICBGWF9CT09MCQkJCQlHZXRGaXR0aW5nQm91bmRzKCk7CisgICAgYm9vbAkJCQkJR2V0Rml0dGluZ0JvdW5kcygpOwogCiAKICAgICBDUERGX0RpY3Rpb25hcnkqCQltX3BEaWN0OwpAQCAtMTI4Myw5ICsxMjgzLDkgQEAKIAogICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0RXhwb3J0VmFsdWUoKTsKIAotICAgIEZYX0JPT0wJCQkJCUlzQ2hlY2tlZCgpOworICAgIGJvb2wJCQkJCUlzQ2hlY2tlZCgpOwogCi0gICAgRlhfQk9PTAkJCQkJSXNEZWZhdWx0Q2hlY2tlZCgpOworICAgIGJvb2wJCQkJCUlzRGVmYXVsdENoZWNrZWQoKTsKIAogCiAKQEAgLTEzMDMsNyArMTMwMyw3IEBACiAKIAogCi0gICAgRlhfQk9PTAkJCQkJSGFzTUtFbnRyeShDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KTsKKyAgICBib29sCQkJCQlIYXNNS0VudHJ5KENGWF9CeXRlU3RyaW5nIGNzRW50cnkpOwogCiAKIApAQCAtMTQzNCw3ICsxNDM0LDcgQEAKIAogICAgIHZvaWQJCQkJCVNldE9uU3RhdGVOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc09uKTsKIAotICAgIHZvaWQJCQkJCUNoZWNrQ29udHJvbChGWF9CT09MIGJDaGVja2VkKTsKKyAgICB2b2lkCQkJCQlDaGVja0NvbnRyb2woYm9vbCBiQ2hlY2tlZCk7CiAKICAgICBGWF9BUkdCCQkJCQlHZXRDb2xvcihpbnQmIGlDb2xvclR5cGUsIENGWF9CeXRlU3RyaW5nIGNzRW50cnkpOwogCkBAIC0xNDQ2LDcgKzE0NDYsNyBAQAogCiAgICAgQ1BERl9TdHJlYW0qCQkJR2V0SWNvbihDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KTsKIAotICAgIENQREZfQXBTZXR0aW5ncwkJCUdldE1LKEZYX0JPT0wgYkNyZWF0ZSk7CisgICAgQ1BERl9BcFNldHRpbmdzCQkJR2V0TUsoYm9vbCBiQ3JlYXRlKTsKIAogICAgIENQREZfSW50ZXJGb3JtKgkJCW1fcEZvcm07CiAKQEAgLTE1MDcsNyArMTUwNyw3IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIH07Ci1GWF9CT09MCQlGUERGX0dlbmVyYXRlQVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKK2Jvb2wJCUZQREZfR2VuZXJhdGVBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOwogY2xhc3MgQ1BERl9QYWdlTGFiZWwKIHsKIHB1YmxpYzoKQEAgLTE1NTksOSArMTU1OSw5IEBACiAgICAgfkNQREZfVmlld2VyUHJlZmVyZW5jZXMoKTsKIAogCi0gICAgRlhfQk9PTCBJc0RpcmVjdGlvblIyTCgpIGNvbnN0OworICAgIGJvb2wgSXNEaXJlY3Rpb25SMkwoKSBjb25zdDsKIAotICAgIEZYX0JPT0wgUHJpbnRTY2FsaW5nKCkgY29uc3Q7CisgICAgYm9vbCBQcmludFNjYWxpbmcoKSBjb25zdDsKIAogICAgIGludDMyX3QgTnVtQ29waWVzKCkgY29uc3Q7CiAKQEAgLTE1ODYsNyArMTU4Niw3IEBACiAgICAgICAgIHJldHVybiBtX3BEaWN0OwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJCUhhc01LRW50cnkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0VudHJ5KTsKKyAgICBib29sCQkJCQlIYXNNS0VudHJ5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbnRyeSk7CiAKIAogCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3RhZ2dlZC5oIGIvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl90YWdnZWQuaAppbmRleCA3MDZmNWMwLi45NzYxZTAxIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3RhZ2dlZC5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdGFnZ2VkLmgKQEAgLTg1LDE3ICs4NSwxNyBAQAogCiAgICAgdmlydHVhbCBDRlhfUHRyQXJyYXkqCQlHZXRPYmplY3RBcnJheSgpID0gMDsKIAotICAgIHZpcnR1YWwgQ1BERl9PYmplY3QqCQlHZXRBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwgRlhfRkxPQVQgZkxldmVsID0gMC4wRikgPSAwOworICAgIHZpcnR1YWwgQ1BERl9PYmplY3QqCQlHZXRBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgYm9vbCBiSW5oZXJpdGFibGUgPSBmYWxzZSwgRlhfRkxPQVQgZkxldmVsID0gMC4wRikgPSAwOwogCiAKIAotICAgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsIGludCBzdWJpbmRleCA9IC0xKSA9IDA7CisgICAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZGVmYXVsdF92YWx1ZSwgYm9vbCBiSW5oZXJpdGFibGUgPSBmYWxzZSwgaW50IHN1YmluZGV4ID0gLTEpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQVJHQgkJCQlHZXRDb2xvcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0FSR0IgZGVmYXVsdF92YWx1ZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwgaW50IHN1YmluZGV4ID0gLTEpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0FSR0IJCQkJR2V0Q29sb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9BUkdCIGRlZmF1bHRfdmFsdWUsIGJvb2wgYkluaGVyaXRhYmxlID0gZmFsc2UsIGludCBzdWJpbmRleCA9IC0xKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0TnVtYmVyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQgZGVmYXVsdF92YWx1ZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwgaW50IHN1YmluZGV4ID0gLTEpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0TnVtYmVyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQgZGVmYXVsdF92YWx1ZSwgYm9vbCBiSW5oZXJpdGFibGUgPSBmYWxzZSwgaW50IHN1YmluZGV4ID0gLTEpID0gMDsKIAotICAgIHZpcnR1YWwgaW50CQkJCQlHZXRJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50IGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsIGludCBzdWJpbmRleCA9IC0xKSA9IDA7CisgICAgdmlydHVhbCBpbnQJCQkJCUdldEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBpbnQgZGVmYXVsdF92YWx1ZSwgYm9vbCBiSW5oZXJpdGFibGUgPSBmYWxzZSwgaW50IHN1YmluZGV4ID0gLTEpID0gMDsKIAogfTsKIApkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl92dC5oIGIvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl92dC5oCmluZGV4IDRiYWJhNDEuLjdmODllOGQgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdnQuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3Z0LmgKQEAgLTM5LDEyICszOSwxMiBAQAogICAgICAgICBuU2VjSW5kZXggPSBuTGluZUluZGV4ID0gbldvcmRJbmRleCA9IC0xOwogICAgIH0KIAotICAgIEZYX0JPT0wgb3BlcmF0b3IgPT0gKGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3ApIGNvbnN0CisgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiB3cC5uU2VjSW5kZXggPT0gblNlY0luZGV4ICYmIHdwLm5MaW5lSW5kZXggPT0gbkxpbmVJbmRleCAmJiB3cC5uV29yZEluZGV4ID09IG5Xb3JkSW5kZXg7CiAgICAgfQogCi0gICAgRlhfQk9PTCBvcGVyYXRvciAhPSAoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cCkgY29uc3QKKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIHdwLm5TZWNJbmRleCAhPSBuU2VjSW5kZXggfHwgd3AubkxpbmVJbmRleCAhPSBuTGluZUluZGV4IHx8IHdwLm5Xb3JkSW5kZXggIT0gbldvcmRJbmRleDsKICAgICB9CkBAIC0xNDIsMTIgKzE0MiwxMiBAQAogICAgICAgICBTd2FwV29yZFBsYWNlKCk7CiAgICAgfQogCi0gICAgRlhfQk9PTCBJc0V4aXN0KCkgY29uc3QKKyAgICBib29sIElzRXhpc3QoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIEJlZ2luUG9zICE9IEVuZFBvczsKICAgICB9CiAKLSAgICBGWF9CT09MIG9wZXJhdG9yICE9IChjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyKSBjb25zdAorICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gd3IuQmVnaW5Qb3MgIT0gQmVnaW5Qb3MgfHwgd3IuRW5kUG9zICE9IEVuZFBvczsKICAgICB9CkBAIC0yOTAsNyArMjkwLDcgQEAKIAogICAgIHZpcnR1YWwgaW50MzJfdAkJCQkJCUdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsIGludDMyX3QgbkZvbnRJbmRleCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCUlzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCQkJCQlJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpID0gMDsKIAogICAgIHZpcnR1YWwgaW50MzJfdAkJCQkJCUdldERlZmF1bHRGb250SW5kZXgoKSA9IDA7CiB9OwpAQCAtMjk5LDI3ICsyOTksMjcgQEAKIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5JUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcigpIHsgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCU5leHRXb3JkKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCQkJCQlOZXh0V29yZCgpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlQcmV2V29yZCgpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQkJCQkJUHJldldvcmQoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJTmV4dExpbmUoKSA9IDA7CisgICAgdmlydHVhbCBib29sCQkJCQkJCU5leHRMaW5lKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCVByZXZMaW5lKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCQkJCQlQcmV2TGluZSgpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlOZXh0U2VjdGlvbigpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQkJCQkJTmV4dFNlY3Rpb24oKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJUHJldlNlY3Rpb24oKSA9IDA7CisgICAgdmlydHVhbCBib29sCQkJCQkJCVByZXZTZWN0aW9uKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCUdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCQkJCQlHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRXb3JkKGNvbnN0IENQVlRfV29yZCAmIHdvcmQpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQkJCQkJU2V0V29yZChjb25zdCBDUFZUX1dvcmQgJiB3b3JkKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJR2V0TGluZShDUFZUX0xpbmUgJiBsaW5lKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sCQkJCQkJCUdldExpbmUoQ1BWVF9MaW5lICYgbGluZSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCUdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCQkJCQlHZXRTZWN0aW9uKENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwJRlhfQk9PTAkJCQkJCQlTZXRTZWN0aW9uKGNvbnN0IENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pID0gMDsKKyAgICB2aXJ0dWFsCWJvb2wJCQkJCQkJU2V0U2VjdGlvbihjb25zdCBDUFZUX1NlY3Rpb24gJiBzZWN0aW9uKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXQoaW50MzJfdCBuV29yZEluZGV4KSA9IDA7CiAKQEAgLTM1MiwyMyArMzUyLDIzIEBACiAKICAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSA9IDEwMCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldE11bHRpTGluZShGWF9CT09MIGJNdWx0aUxpbmUgPSBUUlVFKSA9IDA7CisgICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldE11bHRpTGluZShib29sIGJNdWx0aUxpbmUgPSB0cnVlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXV0b1JldHVybihGWF9CT09MIGJBdXRvID0gVFJVRSkgPSAwOworICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdXRvUmV0dXJuKGJvb2wgYkF1dG8gPSB0cnVlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXV0b0ZvbnRTaXplKEZYX0JPT0wgYkF1dG8gPSBUUlVFKSA9IDA7CisgICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldEF1dG9Gb250U2l6ZShib29sIGJBdXRvID0gdHJ1ZSkgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZykgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldFJpY2hUZXh0KEZYX0JPT0wgYlJpY2hUZXh0KSA9IDA7CisgICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldFJpY2hUZXh0KGJvb2wgYlJpY2hUZXh0KSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJSW5pdGlhbGl6ZSgpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc1ZhbGlkKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCQkJCQlJc1ZhbGlkKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCUlzUmljaFRleHQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sCQkJCQkJCUlzUmljaFRleHQoKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJUmVhcnJhbmdlQWxsKCkgPSAwOwogCkBAIC00MTAsNyArNDEwLDcgQEAKIAogICAgIHZpcnR1YWwgaW50MzJfdAkJCQkJCUdldExpbWl0Q2hhcigpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc011bHRpTGluZSgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQkJCQkJSXNNdWx0aUxpbmUoKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIGludDMyX3QJCQkJCQlHZXRIb3J6U2NhbGUoKSBjb25zdCA9IDA7CiAKQEAgLTQ0MCw3ICs0NDAsNyBAQAogCiAgICAgdmlydHVhbCB2b2lkCQkJCQkJCVVwZGF0ZVdvcmRQbGFjZShDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlCQkJCQlBanVzdExpbmVIZWFkZXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRlhfQk9PTCBiUHJldk9yTmV4dCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUFqdXN0TGluZUhlYWRlcihjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBib29sIGJQcmV2T3JOZXh0KSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIGludDMyX3QJCQkJCQlXb3JkUGxhY2VUb1dvcmRJbmRleChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdCA9IDA7CiAKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcGRmdGV4dC9mcGRmX3RleHQuaCBiL2NvcmUvaW5jbHVkZS9mcGRmdGV4dC9mcGRmX3RleHQuaAppbmRleCAwNDkyMmM0Li44YjU0ZjJkIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZnRleHQvZnBkZl90ZXh0LmgKKysrIGIvY29yZS9pbmNsdWRlL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5oCkBAIC02MSw5ICs2MSw5IEBACiBwdWJsaWM6CiAKICAgICBDUERGVGV4dF9QYXJzZU9wdGlvbnMoKTsKLSAgICBGWF9CT09MCQkJbV9iR2V0Q2hhckNvZGVPbmx5OwotICAgIEZYX0JPT0wJCQltX2JOb3JtYWxpemVPYmpzOwotICAgIEZYX0JPT0wJCQltX2JPdXRwdXRIeXBoZW47CisgICAgYm9vbAkJCW1fYkdldENoYXJDb2RlT25seTsKKyAgICBib29sCQkJbV9iTm9ybWFsaXplT2JqczsKKyAgICBib29sCQkJbV9iT3V0cHV0SHlwaGVuOwogfTsKIGNsYXNzIElQREZfVGV4dFBhZ2UKIHsKQEAgLTc1LDEyICs3NSwxMiBAQAogICAgIHN0YXRpYyBJUERGX1RleHRQYWdlKglDcmVhdGVUZXh0UGFnZShjb25zdCBDUERGX1BhZ2VPYmplY3RzKiBwT2JqcywgaW50IGZsYWdzID0gMCk7CiAgICAgc3RhdGljIElQREZfVGV4dFBhZ2UqCUNyZWF0ZVJlZmxvd1RleHRQYWdlKElQREZfUmVmbG93ZWRQYWdlKiBwUmVmUGFnZSk7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQlOb3JtYWxpemVPYmplY3RzKEZYX0JPT0wgYk5vcm1hbGl6ZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZAkJCU5vcm1hbGl6ZU9iamVjdHMoYm9vbCBiTm9ybWFsaXplKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlQYXJzZVRleHRQYWdlKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCVBhcnNlVGV4dFBhZ2UoKSA9IDA7CiAKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzUGFyc2VyZWQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sCQkJSXNQYXJzZXJlZCgpIGNvbnN0ID0gMDsKIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgaW50IENoYXJJbmRleEZyb21UZXh0SW5kZXgoaW50IFRleHRJbmRleCkgY29uc3QgPSAwOwpAQCAtMTA5LDExICsxMDksMTEgQEAKIAogICAgIHZpcnR1YWwJdm9pZAkJCUdldFJlY3QoaW50IHJlY3RJbmRleCwgRlhfRkxPQVQmIGxlZnQsIEZYX0ZMT0FUJiB0b3AsIEZYX0ZMT0FUJiByaWdodCwgRlhfRkxPQVQgJmJvdHRvbSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJR2V0QmFzZWxpbmVSb3RhdGUoaW50IHJlY3RJbmRleCwgaW50JiBSb3RhdGUpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQlHZXRCYXNlbGluZVJvdGF0ZShpbnQgcmVjdEluZGV4LCBpbnQmIFJvdGF0ZSkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJR2V0QmFzZWxpbmVSb3RhdGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwgaW50JiBSb3RhdGUpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQlHZXRCYXNlbGluZVJvdGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LCBpbnQmIFJvdGF0ZSkgPSAwOwogCi0gICAgdmlydHVhbAlpbnQJCQkJQ291bnRCb3VuZGVkU2VnbWVudHMoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgdG9wLCBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgYm90dG9tLCBGWF9CT09MIGJDb250YWlucyA9IEZBTFNFKSA9IDA7CisgICAgdmlydHVhbAlpbnQJCQkJQ291bnRCb3VuZGVkU2VnbWVudHMoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgdG9wLCBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgYm90dG9tLCBib29sIGJDb250YWlucyA9IGZhbHNlKSA9IDA7CiAKICAgICB2aXJ0dWFsCXZvaWQJCQlHZXRCb3VuZGVkU2VnbWVudChpbnQgaW5kZXgsIGludCYgc3RhcnQsIGludCYgY291bnQpIGNvbnN0ID0gMDsKIApAQCAtMTM0LDExICsxMzQsMTEgQEAKICAgICBzdGF0aWMJSVBERl9UZXh0UGFnZUZpbmQqCUNyZWF0ZVBhZ2VGaW5kKGNvbnN0IElQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSk7CiBwdWJsaWM6CiAKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJRmluZEZpcnN0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmaW5kd2hhdCwgaW50IGZsYWdzLCBpbnQgc3RhcnRQb3MgPSAwKSA9IDA7CisgICAgdmlydHVhbAlib29sCQkJCUZpbmRGaXJzdChjb25zdCBDRlhfV2lkZVN0cmluZyYgZmluZHdoYXQsIGludCBmbGFncywgaW50IHN0YXJ0UG9zID0gMCkgPSAwOwogCi0gICAgdmlydHVhbAlGWF9CT09MCQkJCUZpbmROZXh0KCkgPSAwOworICAgIHZpcnR1YWwJYm9vbAkJCQlGaW5kTmV4dCgpID0gMDsKIAotICAgIHZpcnR1YWwJRlhfQk9PTAkJCQlGaW5kUHJldigpID0gMDsKKyAgICB2aXJ0dWFsCWJvb2wJCQkJRmluZFByZXYoKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQJCQkJR2V0UmVjdEFycmF5KENGWF9SZWN0QXJyYXkmIHJlY3RzKSBjb25zdCA9IDA7CiAKQEAgLTE1NCw3ICsxNTQsNyBAQAogCiAgICAgc3RhdGljCUlQREZfTGlua0V4dHJhY3QqCUNyZWF0ZUxpbmtFeHRyYWN0KCk7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRXh0cmFjdExpbmtzKGNvbnN0IElQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCQlFeHRyYWN0TGlua3MoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKSA9IDA7CiBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIGludAkJCQkJQ291bnRMaW5rcygpIGNvbnN0ID0gMDsKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmggYi9jb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oCmluZGV4IGUzZDY5ZTUuLjU1MzkwMDggMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaApAQCAtNTEsOSArNTEsOSBAQAogcHVibGljOgogCiAgICAgdmlydHVhbCB+SUNvZGVjX0Jhc2ljTW9kdWxlKCkge30KLSAgICB2aXJ0dWFsIEZYX0JPT0wJUnVuTGVuZ3RoRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsCisgICAgdmlydHVhbCBib29sCVJ1bkxlbmd0aEVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAlBODVFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICB2aXJ0dWFsIGJvb2wJQTg1RW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSA9IDA7CiAgICAgdmlydHVhbCBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDcmVhdGVSdW5MZW5ndGhEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICBpbnQgbkNvbXBzLCBpbnQgYnBjKSA9IDA7CkBAIC03MCw3ICs3MCw3IEBACiAKICAgICB2aXJ0dWFsIHVpbnQ4X3QqCUdldFNjYW5saW5lKGludCBsaW5lKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJU2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKSA9IDA7CiAKICAgICB2aXJ0dWFsIGludAkJCUdldFdpZHRoKCkgPSAwOwogCkBAIC04MCw3ICs4MCw3IEBACiAKICAgICB2aXJ0dWFsIGludAkJCUdldEJQQygpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNDb2xvclRyYW5zZm9ybWVkKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJSXNDb2xvclRyYW5zZm9ybWVkKCkgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkCQlDbGVhckltYWdlRGF0YSgpID0gMDsKIH07CkBAIC05MSwxMyArOTEsMTMgQEAKICAgICB2aXJ0dWFsIH5JQ29kZWNfRmxhdGVNb2R1bGUoKSB7fQogICAgIHZpcnR1YWwgSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJQ3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgaW50IG5Db21wcywgaW50IGJwYywgaW50IHByZWRpY3RvciwgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9EV09SRAlGbGF0ZU9yTFpXRGVjb2RlKEZYX0JPT0wgYkxaVywgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIEZYX0JPT0wgYkVhcmx5Q2hhbmdlLAorICAgIHZpcnR1YWwgRlhfRFdPUkQJRmxhdGVPckxaV0RlY29kZShib29sIGJMWlcsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBib29sIGJFYXJseUNoYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBlc3RpbWF0ZWRfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgdmlydHVhbCBib29sCQlFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKSA9IDA7CiB9OwogY2xhc3MgSUNvZGVjX0ZheE1vZHVsZQogewpAQCAtMTA2LDEwICsxMDYsMTAgQEAKICAgICB2aXJ0dWFsIH5JQ29kZWNfRmF4TW9kdWxlKCkge30KIAogICAgIHZpcnR1YWwgSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJQ3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgaW50IEssIEZYX0JPT0wgRW5kT2ZMaW5lLCBGWF9CT09MIEVuY29kZWRCeXRlQWxpZ24sIEZYX0JPT0wgQmxhY2tJczEsIGludCBDb2x1bW5zLCBpbnQgUm93cykgPSAwOworICAgICAgICAgICAgaW50IEssIGJvb2wgRW5kT2ZMaW5lLCBib29sIEVuY29kZWRCeXRlQWxpZ24sIGJvb2wgQmxhY2tJczEsIGludCBDb2x1bW5zLCBpbnQgUm93cykgPSAwOwogCiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwaXRjaCwKKyAgICB2aXJ0dWFsIGJvb2wJCUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwaXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpID0gMDsKIH07CiBjbGFzcyBJQ29kZWNfSnBlZ01vZHVsZQpAQCAtMTIxLDEzICsxMjEsMTMgQEAKICAgICB2aXJ0dWFsIHZvaWQJCVNldFBvdmlkZXIoSUZYX0pwZWdQcm92aWRlciogcEpQKSA9IDA7CiAKICAgICB2aXJ0dWFsIElDb2RlY19TY2FubGluZURlY29kZXIqCUNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIEZYX0JPT0wgQ29sb3JUcmFuc2Zvcm0pID0gMDsKKyAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywgYm9vbCBDb2xvclRyYW5zZm9ybSkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlMb2FkSW5mbyhjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50JiB3aWR0aCwgaW50JiBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLCBpbnQmIGJpdHNfcGVyX2NvbXBvbmVudHMsIEZYX0JPT0wmIGNvbG9yX3RyYW5zZm9ybSwKKyAgICB2aXJ0dWFsIGJvb2wJCUxvYWRJbmZvKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbnVtX2NvbXBvbmVudHMsIGludCYgYml0c19wZXJfY29tcG9uZW50cywgYm9vbCYgY29sb3JfdHJhbnNmb3JtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGljY19idWZfcHRyID0gTlVMTCwgRlhfRFdPUkQqIGljY19sZW5ndGggPSBOVUxMKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuY29kZShjb25zdCBjbGFzcyBDRlhfRElCU291cmNlKiBwU291cmNlLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX1NUUlNJWkUmIGRlc3Rfc2l6ZSwgaW50IHF1YWxpdHkgPSA3NSwKKyAgICB2aXJ0dWFsIGJvb2wJCUVuY29kZShjb25zdCBjbGFzcyBDRlhfRElCU291cmNlKiBwU291cmNlLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX1NUUlNJWkUmIGRlc3Rfc2l6ZSwgaW50IHF1YWxpdHkgPSA3NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBpY2NfYnVmID0gTlVMTCwgRlhfRFdPUkQgaWNjX2xlbmd0aCA9IDApID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCoJCVN0YXJ0KCkgPSAwOwpAQCAtMTQyLDcgKzE0Miw3IEBACiAgICAgdmlydHVhbCBpbnQJCQlTdGFydFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCBpbnQgZG93bl9zY2FsZSkgPSAwOwogCiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVJlYWRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgdWludDhfdCogZGVzdF9idWYpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCVJlYWRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgdWludDhfdCogZGVzdF9idWYpID0gMDsKIAogCiAgICAgdmlydHVhbCBGWF9EV09SRAlHZXRBdmFpbElucHV0KHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiogYXZhaWxfYnVmX3B0ciA9IE5VTEwpID0gMDsKQEAgLTE1MywxMyArMTUzLDEzIEBACiAKICAgICB2aXJ0dWFsIH5JQ29kZWNfSnB4TW9kdWxlKCkge30KIAotICAgIHZpcnR1YWwgdm9pZCogCUNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIEZYX0JPT0wgdXNlQ29sb3JTcGFjZSA9IEZBTFNFKSA9IDA7CisgICAgdmlydHVhbCB2b2lkKiAJQ3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgYm9vbCB1c2VDb2xvclNwYWNlID0gZmFsc2UpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZAkJR2V0SW1hZ2VJbmZvKHZvaWQqIGN0eCwgRlhfRFdPUkQmIHdpZHRoLCBGWF9EV09SRCYgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBjb2Rlc3RyZWFtX25Db21wcywgRlhfRFdPUkQmIG91dHB1dF9uQ29tcHMpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVjb2RlKHZvaWQqIGN0eCwgdWludDhfdCogZGVzdF9kYXRhLCBpbnQgcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNsYXRlQ29sb3IsIHVpbnQ4X3QqIG9mZnNldHMpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCURlY29kZSh2b2lkKiBjdHgsIHVpbnQ4X3QqIGRlc3RfZGF0YSwgaW50IHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRyYW5zbGF0ZUNvbG9yLCB1aW50OF90KiBvZmZzZXRzKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQJCURlc3Ryb3lEZWNvZGVyKHZvaWQqIGN0eCkgPSAwOwogfTsKQEAgLTE2OSwxMCArMTY5LDEwIEBACiAKICAgICB2aXJ0dWFsIH5JQ29kZWNfSmJpZzJNb2R1bGUoKSB7fQogCi0gICAgdmlydHVhbCBGWF9CT09MCQlEZWNvZGUoRlhfRFdPUkQgd2lkdGgsIEZYX0RXT1JEIGhlaWdodCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgdmlydHVhbCBib29sCQlEZWNvZGUoRlhfRFdPUkQgd2lkdGgsIEZYX0RXT1JEIGhlaWdodCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZ2xvYmFsX2RhdGEsIEZYX0RXT1JEIGdsb2JhbF9zaXplLCB1aW50OF90KiBkZXN0X2J1ZiwgRlhfRFdPUkQgZGVzdF9waXRjaCkgID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVjb2RlKElGWF9GaWxlUmVhZCogZmlsZV9wdHIsIEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwKKyAgICB2aXJ0dWFsIGJvb2wJCURlY29kZShJRlhfRmlsZVJlYWQqIGZpbGVfcHRyLCBGWF9EV09SRCYgd2lkdGgsIEZYX0RXT1JEJiBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHBpdGNoLCB1aW50OF90KiYgZGVzdF9idWYpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQqCQkJCUNyZWF0ZUpiaWcyQ29udGV4dCgpID0gMDsKIApAQCAtMjUxLDYgKzI1MSw2IEBACiB9Owogdm9pZCBBZG9iZUNNWUtfdG9fc1JHQihGWF9GTE9BVCBjLCBGWF9GTE9BVCBtLCBGWF9GTE9BVCB5LCBGWF9GTE9BVCBrLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKTsKIHZvaWQgQWRvYmVDTVlLX3RvX3NSR0IxKHVpbnQ4X3QgYywgdWludDhfdCBtLCB1aW50OF90IHksIHVpbnQ4X3QgaywgdWludDhfdCYgUiwgdWludDhfdCYgRywgdWludDhfdCYgQik7Ci1GWF9CT09MIE1ENUNvbXB1dGVJRChjb25zdCB2b2lkKiBidWYsIEZYX0RXT1JEIGR3U2l6ZSwgdWludDhfdCBJRFsxNl0pOworYm9vbCBNRDVDb21wdXRlSUQoY29uc3Qgdm9pZCogYnVmLCBGWF9EV09SRCBkd1NpemUsIHVpbnQ4X3QgSURbMTZdKTsKIAogI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfRlhDT0RFQ19GWF9DT0RFQ19IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfcHJvdmlkZXIuaCBiL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjX3Byb3ZpZGVyLmgKaW5kZXggMGIyMzhiNy4uYWM2OWY5YSAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfcHJvdmlkZXIuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlY19wcm92aWRlci5oCkBAIC0xNCwyNSArMTQsMjUgQEAKIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQqCQlDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIEZYX0JPT0wgQ29sb3JUcmFuc2Zvcm0pID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQqCQlDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIGJvb2wgQ29sb3JUcmFuc2Zvcm0pID0gMDsKIAogCiAgICAgdmlydHVhbCB2b2lkCQlEZXN0cm95RGVjb2Rlcih2b2lkKiBwRGVjb2RlcikgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkCQlEb3duU2NhbGUodm9pZCogcERlY29kZXIsIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJUmV3aW5kKHZvaWQqIHBEZWNvZGVyKSA9IDA7CisgICAgdmlydHVhbCBib29sCQlSZXdpbmQodm9pZCogcERlY29kZXIpID0gMDsKIAogICAgIHZpcnR1YWwgdWludDhfdCoJR2V0TmV4dExpbmUodm9pZCogcERlY29kZXIpID0gMDsKIAogICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0U3JjT2Zmc2V0KHZvaWQqIHBEZWNvZGVyKSA9IDA7CiAKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJTG9hZEluZm8oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgd2lkdGgsIGludCYgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBudW1fY29tcG9uZW50cywgaW50JiBiaXRzX3Blcl9jb21wb25lbnRzLCBGWF9CT09MJiBjb2xvcl90cmFuc2Zvcm0sCisgICAgdmlydHVhbCBib29sCQlMb2FkSW5mbyhjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50JiB3aWR0aCwgaW50JiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLCBpbnQmIGJpdHNfcGVyX2NvbXBvbmVudHMsIGJvb2wmIGNvbG9yX3RyYW5zZm9ybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBpY2NfYnVmX3B0ciA9IE5VTEwsIEZYX0RXT1JEKiBpY2NfbGVuZ3RoID0gTlVMTCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlFbmNvZGUoY29uc3QgY2xhc3MgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9TVFJTSVpFJiBkZXN0X3NpemUsIGludCBxdWFsaXR5ID0gNzUsCisgICAgdmlydHVhbCBib29sCQlFbmNvZGUoY29uc3QgY2xhc3MgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9TVFJTSVpFJiBkZXN0X3NpemUsIGludCBxdWFsaXR5ID0gNzUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogaWNjX2J1ZiA9IE5VTEwsIEZYX0RXT1JEIGljY19sZW5ndGggPSAwKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQqCQlTdGFydCgpID0gMDsKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICB2aXJ0dWFsIGludAkJCVN0YXJ0U2NhbmxpbmUodm9pZCogcENvbnRleHQsIGludCBkb3duX3NjYWxlKSA9IDA7CiAKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVhZFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiBkZXN0X2J1ZikgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJUmVhZFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiBkZXN0X2J1ZikgPSAwOwogCiAKICAgICB2aXJ0dWFsIEZYX0RXT1JECUdldEF2YWlsSW5wdXQodm9pZCogcENvbnRleHQsIHVpbnQ4X3QqKiBhdmFpbF9idWZfcHRyID0gTlVMTCkgPSAwOwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2FyYi5oIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2FyYi5oCmluZGV4IDdjZTIxZTUuLjVjNDE3MzggMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9hcmIuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfYXJiLmgKQEAgLTE1LDkgKzE1LDkgQEAKICAgICBzdGF0aWMgSUZYX0JpZGlDaGFyKiBDcmVhdGUoKTsKICAgICB2aXJ0dWFsIH5JRlhfQmlkaUNoYXIoKSB7fQogCi0gICAgdmlydHVhbCB2b2lkIFNldFBvbGljeShGWF9CT09MIGJTZXBhcmF0ZU5ldXRyYWwgPSBUUlVFKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MIEFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MIEVuZENoYXIoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIFNldFBvbGljeShib29sIGJTZXBhcmF0ZU5ldXRyYWwgPSB0cnVlKSA9IDA7CisgICAgdmlydHVhbCBib29sIEFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKSA9IDA7CisgICAgdmlydHVhbCBib29sIEVuZENoYXIoKSA9IDA7CiAgICAgdmlydHVhbCBpbnQzMl90IEdldEJpZGlJbmZvKGludDMyX3QgJmlTdGFydCwgaW50MzJfdCAmaUNvdW50KSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIFJlc2V0KCkgPSAwOwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgKaW5kZXggZDU3NWRmNi4uYzI3MmViNSAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgKQEAgLTIxOCw5ICsyMTgsOSBAQAogCiAgICAgQ0ZYX0FyY2hpdmVMb2FkZXImCQlvcGVyYXRvciA+PiAoQ0ZYX1dpZGVTdHJpbmcmIHdzdHIpOwogCi0gICAgRlhfQk9PTAkJCQkJSXNFT0YoKTsKKyAgICBib29sCQkJCQlJc0VPRigpOwogCi0gICAgRlhfQk9PTAkJCQkJUmVhZCh2b2lkKiBwQnVmLCBGWF9EV09SRCBkd1NpemUpOworICAgIGJvb2wJCQkJCVJlYWQodm9pZCogcEJ1ZiwgRlhfRFdPUkQgZHdTaXplKTsKIHByb3RlY3RlZDoKIAogICAgIEZYX0RXT1JECQkJCW1fTG9hZGluZ1BvczsKQEAgLTIzOSw3ICsyMzksNyBAQAogCiAgICAgdmlydHVhbCB2b2lkIENsZWFyKCk7CiAKLSAgICBGWF9CT09MIEZsdXNoKCk7CisgICAgYm9vbCBGbHVzaCgpOwogCiAgICAgaW50MzJfdCBBcHBlbmRCbG9jayhjb25zdCB2b2lkKiBwQnVmLCBzaXplX3Qgc2l6ZSk7CiAKQEAgLTI1Miw3ICsyNTIsNyBAQAogCiBwcm90ZWN0ZWQ6CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wgRG9Xb3JrKGNvbnN0IHZvaWQqIHBCdWYsIHNpemVfdCBzaXplKSA9IDA7CisgICAgdmlydHVhbCBib29sIERvV29yayhjb25zdCB2b2lkKiBwQnVmLCBzaXplX3Qgc2l6ZSkgPSAwOwogCiAgICAgRlhfU1RSU0laRSBtX0J1ZlNpemU7CiAKQEAgLTI2OSwxOCArMjY5LDE4IEBACiAKICAgICB2b2lkIENsZWFyKCkgb3ZlcnJpZGU7CiAKLSAgICBGWF9CT09MIEF0dGFjaEZpbGUoSUZYX1N0cmVhbVdyaXRlICpwRmlsZSwgRlhfQk9PTCBiVGFrZW92ZXIgPSBGQUxTRSk7CisgICAgYm9vbCBBdHRhY2hGaWxlKElGWF9TdHJlYW1Xcml0ZSAqcEZpbGUsIGJvb2wgYlRha2VvdmVyID0gZmFsc2UpOwogCi0gICAgRlhfQk9PTCBBdHRhY2hGaWxlKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSk7CisgICAgYm9vbCBBdHRhY2hGaWxlKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSk7CiAKLSAgICBGWF9CT09MIEF0dGFjaEZpbGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUpOworICAgIGJvb2wgQXR0YWNoRmlsZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSk7CiAKIHByaXZhdGU6Ci0gICAgRlhfQk9PTCBEb1dvcmsoY29uc3Qgdm9pZCogcEJ1Ziwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIGJvb2wgRG9Xb3JrKGNvbnN0IHZvaWQqIHBCdWYsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKIAogICAgIElGWF9TdHJlYW1Xcml0ZSogbV9wRmlsZTsKIAotICAgIEZYX0JPT0wgbV9iVGFrZW92ZXI7CisgICAgYm9vbCBtX2JUYWtlb3ZlcjsKIH07CiAKIHN0cnVjdCBDRlhfQ2hhck1hcCB7CkBAIC0zNjIsMTcgKzM2MiwxNyBAQAogCiAgICAgfkNGWF9CYXNpY0FycmF5KCk7CiAKLSAgICBGWF9CT09MCQkJU2V0U2l6ZShpbnQgbk5ld1NpemUpOworICAgIGJvb2wJCQlTZXRTaXplKGludCBuTmV3U2l6ZSk7CiAKLSAgICBGWF9CT09MCQkJQXBwZW5kKGNvbnN0IENGWF9CYXNpY0FycmF5JiBzcmMpOworICAgIGJvb2wJCQlBcHBlbmQoY29uc3QgQ0ZYX0Jhc2ljQXJyYXkmIHNyYyk7CiAKLSAgICBGWF9CT09MCQkJQ29weShjb25zdCBDRlhfQmFzaWNBcnJheSYgc3JjKTsKKyAgICBib29sCQkJQ29weShjb25zdCBDRlhfQmFzaWNBcnJheSYgc3JjKTsKIAogICAgIHVpbnQ4X3QqCQlJbnNlcnRTcGFjZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpOwogCi0gICAgRlhfQk9PTAkJCVJlbW92ZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpOworICAgIGJvb2wJCQlSZW1vdmVBdChpbnQgbkluZGV4LCBpbnQgbkNvdW50KTsKIAotICAgIEZYX0JPT0wJCQlJbnNlcnRBdChpbnQgblN0YXJ0SW5kZXgsIGNvbnN0IENGWF9CYXNpY0FycmF5KiBwTmV3QXJyYXkpOworICAgIGJvb2wJCQlJbnNlcnRBdChpbnQgblN0YXJ0SW5kZXgsIGNvbnN0IENGWF9CYXNpY0FycmF5KiBwTmV3QXJyYXkpOwogCiAgICAgY29uc3Qgdm9pZCoJCUdldERhdGFQdHIoaW50IGluZGV4KSBjb25zdDsKIHByb3RlY3RlZDoKQEAgLTQwMSw3ICs0MDEsNyBAQAogICAgICAgICByZXR1cm4gbV9uU2l6ZSAtIDE7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJU2V0U2l6ZShpbnQgbk5ld1NpemUpCisgICAgYm9vbAkJU2V0U2l6ZShpbnQgbk5ld1NpemUpCiAgICAgewogICAgICAgICByZXR1cm4gQ0ZYX0Jhc2ljQXJyYXk6OlNldFNpemUobk5ld1NpemUpOwogICAgIH0KQEAgLTQxOSwxMyArNDE5LDEzIEBACiAgICAgICAgIHJldHVybiAoKGNvbnN0IFRZUEUqKW1fcERhdGEpW25JbmRleF07CiAgICAgfQogCi0gICAgRlhfQk9PTAkJU2V0QXQoaW50IG5JbmRleCwgVFlQRSBuZXdFbGVtZW50KQorICAgIGJvb2wJCVNldEF0KGludCBuSW5kZXgsIFRZUEUgbmV3RWxlbWVudCkKICAgICB7CiAgICAgICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX25TaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgKChUWVBFKiltX3BEYXRhKVtuSW5kZXhdID0gbmV3RWxlbWVudDsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIFRZUEUmCQlFbGVtZW50QXQoaW50IG5JbmRleCkKQEAgLTQ0NiwzNiArNDQ2LDM2IEBACiAgICAgICAgIHJldHVybiAoVFlQRSopbV9wRGF0YTsKICAgICB9CiAKLSAgICBGWF9CT09MCQlTZXRBdEdyb3coaW50IG5JbmRleCwgVFlQRSBuZXdFbGVtZW50KQorICAgIGJvb2wJCVNldEF0R3JvdyhpbnQgbkluZGV4LCBUWVBFIG5ld0VsZW1lbnQpCiAgICAgewogICAgICAgICBpZiAobkluZGV4IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChuSW5kZXggPj0gbV9uU2l6ZSkKICAgICAgICAgICAgIGlmICghU2V0U2l6ZShuSW5kZXggKyAxKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICgoVFlQRSopbV9wRGF0YSlbbkluZGV4XSA9IG5ld0VsZW1lbnQ7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBGWF9CT09MCQlBZGQoVFlQRSBuZXdFbGVtZW50KQorICAgIGJvb2wJCUFkZChUWVBFIG5ld0VsZW1lbnQpCiAgICAgewogICAgICAgICBpZiAobV9uU2l6ZSA8IG1fbk1heFNpemUpIHsKICAgICAgICAgICAgIG1fblNpemUgKys7CiAgICAgICAgIH0gZWxzZSBpZiAoIVNldFNpemUobV9uU2l6ZSArIDEpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgKChUWVBFKiltX3BEYXRhKVttX25TaXplIC0gMV0gPSBuZXdFbGVtZW50OwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJQXBwZW5kKGNvbnN0IENGWF9BcnJheVRlbXBsYXRlJiBzcmMpCisgICAgYm9vbAkJQXBwZW5kKGNvbnN0IENGWF9BcnJheVRlbXBsYXRlJiBzcmMpCiAgICAgewogICAgICAgICByZXR1cm4gQ0ZYX0Jhc2ljQXJyYXk6OkFwcGVuZChzcmMpOwogICAgIH0KIAotICAgIEZYX0JPT0wJCUNvcHkoY29uc3QgQ0ZYX0FycmF5VGVtcGxhdGUmIHNyYykKKyAgICBib29sCQlDb3B5KGNvbnN0IENGWF9BcnJheVRlbXBsYXRlJiBzcmMpCiAgICAgewogICAgICAgICByZXR1cm4gQ0ZYX0Jhc2ljQXJyYXk6OkNvcHkoc3JjKTsKICAgICB9CkBAIC01MTEsMjMgKzUxMSwyMyBAQAogICAgICAgICByZXR1cm4gKChUWVBFKiltX3BEYXRhKVtuSW5kZXhdOwogICAgIH0KIAotICAgIEZYX0JPT0wJCUluc2VydEF0KGludCBuSW5kZXgsIFRZUEUgbmV3RWxlbWVudCwgaW50IG5Db3VudCA9IDEpCisgICAgYm9vbAkJSW5zZXJ0QXQoaW50IG5JbmRleCwgVFlQRSBuZXdFbGVtZW50LCBpbnQgbkNvdW50ID0gMSkKICAgICB7CiAgICAgICAgIGlmICghSW5zZXJ0U3BhY2VBdChuSW5kZXgsIG5Db3VudCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICB3aGlsZSAobkNvdW50LS0pIHsKICAgICAgICAgICAgICgoVFlQRSopbV9wRGF0YSlbbkluZGV4KytdID0gbmV3RWxlbWVudDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJUmVtb3ZlQXQoaW50IG5JbmRleCwgaW50IG5Db3VudCA9IDEpCisgICAgYm9vbAkJUmVtb3ZlQXQoaW50IG5JbmRleCwgaW50IG5Db3VudCA9IDEpCiAgICAgewogICAgICAgICByZXR1cm4gQ0ZYX0Jhc2ljQXJyYXk6OlJlbW92ZUF0KG5JbmRleCwgbkNvdW50KTsKICAgICB9CiAKLSAgICBGWF9CT09MCQlJbnNlcnRBdChpbnQgblN0YXJ0SW5kZXgsIGNvbnN0IENGWF9CYXNpY0FycmF5KiBwTmV3QXJyYXkpCisgICAgYm9vbAkJSW5zZXJ0QXQoaW50IG5TdGFydEluZGV4LCBjb25zdCBDRlhfQmFzaWNBcnJheSogcE5ld0FycmF5KQogICAgIHsKICAgICAgICAgcmV0dXJuIENGWF9CYXNpY0FycmF5OjpJbnNlcnRBdChuU3RhcnRJbmRleCwgcE5ld0FycmF5KTsKICAgICB9CkBAIC03MDAsNyArNzAwLDcgQEAKICAgICAgICAgcmV0dXJuIG1fVW5pdFNpemU7CiAgICAgfQogCi0gICAgdm9pZCoJSXRlcmF0ZShGWF9CT09MICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksIHZvaWQqIHBhcmFtKSBjb25zdDsKKyAgICB2b2lkKglJdGVyYXRlKGJvb2wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0OwogcHJpdmF0ZToKIAogICAgIGludAkJCQltX1VuaXRTaXplOwpAQCAtNzE1LDggKzcxNSw4IEBACiAKICAgICB2b2lkKgkJCW1fcEluZGV4OwogICAgIHZvaWQqKglHZXRJbmRleChpbnQgc2VnX2luZGV4KSBjb25zdDsKLSAgICB2b2lkKglJdGVyYXRlSW5kZXgoaW50IGxldmVsLCBpbnQmIHN0YXJ0LCB2b2lkKiogcEluZGV4LCBGWF9CT09MICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksIHZvaWQqIHBhcmFtKSBjb25zdDsKLSAgICB2b2lkKglJdGVyYXRlU2VnbWVudChjb25zdCB1aW50OF90KiBwU2VnbWVudCwgaW50IGNvdW50LCBGWF9CT09MICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksIHZvaWQqIHBhcmFtKSBjb25zdDsKKyAgICB2b2lkKglJdGVyYXRlSW5kZXgoaW50IGxldmVsLCBpbnQmIHN0YXJ0LCB2b2lkKiogcEluZGV4LCBib29sICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksIHZvaWQqIHBhcmFtKSBjb25zdDsKKyAgICB2b2lkKglJdGVyYXRlU2VnbWVudChjb25zdCB1aW50OF90KiBwU2VnbWVudCwgaW50IGNvdW50LCBib29sICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksIHZvaWQqIHBhcmFtKSBjb25zdDsKIH07CiB0ZW1wbGF0ZSA8Y2xhc3MgRWxlbWVudFR5cGU+CiBjbGFzcyBDRlhfU2VnbWVudGVkQXJyYXkgOiBwdWJsaWMgQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheQpAQCAtNzk4LDEyICs3OTgsMTIgQEAKICAgICAgICAgcmV0dXJuIG1fbkNvdW50OwogICAgIH0KIAotICAgIEZYX0JPT0wgSXNFbXB0eSgpIGNvbnN0CisgICAgYm9vbCBJc0VtcHR5KCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX25Db3VudCA9PSAwOwogICAgIH0KIAotICAgIEZYX0JPT0wgTG9va3VwKHZvaWQqIGtleSwgdm9pZComIHJWYWx1ZSkgY29uc3Q7CisgICAgYm9vbCBMb29rdXAodm9pZCoga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdDsKIAogICAgIHZvaWQqIEdldFZhbHVlQXQodm9pZCoga2V5KSBjb25zdDsKIApAQCAtODE0LDcgKzgxNCw3IEBACiAgICAgICAgICgqdGhpcylba2V5XSA9IG5ld1ZhbHVlOwogICAgIH0KIAotICAgIEZYX0JPT0wgUmVtb3ZlS2V5KHZvaWQqIGtleSk7CisgICAgYm9vbCBSZW1vdmVLZXkodm9pZCoga2V5KTsKIAogICAgIHZvaWQgUmVtb3ZlQWxsKCk7CiAKQEAgLTgzMCw3ICs4MzAsNyBAQAogICAgICAgICByZXR1cm4gbV9uSGFzaFRhYmxlU2l6ZTsKICAgICB9CiAKLSAgICB2b2lkIEluaXRIYXNoVGFibGUoRlhfRFdPUkQgaGFzaFNpemUsIEZYX0JPT0wgYkFsbG9jTm93ID0gVFJVRSk7CisgICAgdm9pZCBJbml0SGFzaFRhYmxlKEZYX0RXT1JEIGhhc2hTaXplLCBib29sIGJBbGxvY05vdyA9IHRydWUpOwogcHJvdGVjdGVkOgogCiAgICAgQ0Fzc29jKiogbV9wSGFzaFRhYmxlOwpAQCAtODU4LDcgKzg1OCw3IEBACiB7CiBwdWJsaWM6CiAKLSAgICBGWF9CT09MCQkJTG9va3VwKEZYX0RXT1JEIGtleSwgRlhfRFdPUkQmIHZhbHVlKSBjb25zdDsKKyAgICBib29sCQkJTG9va3VwKEZYX0RXT1JEIGtleSwgRlhfRFdPUkQmIHZhbHVlKSBjb25zdDsKIAogICAgIHZvaWQJCQlTZXRBdChGWF9EV09SRCBrZXksIEZYX0RXT1JEIHZhbHVlKTsKIApAQCAtODkzLDEyICs4OTMsMTIgQEAKICAgICAgICAgcmV0dXJuIG1fbkNvdW50OwogICAgIH0KIAotICAgIEZYX0JPT0wgSXNFbXB0eSgpIGNvbnN0CisgICAgYm9vbCBJc0VtcHR5KCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX25Db3VudCA9PSAwOwogICAgIH0KIAotICAgIEZYX0JPT0wgTG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdDsKKyAgICBib29sIExvb2t1cChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgdm9pZComIHJWYWx1ZSkgY29uc3Q7CiAKICAgICB2b2lkKiYgb3BlcmF0b3JbXShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSk7CiAKQEAgLTkwNyw3ICs5MDcsNyBAQAogICAgICAgICAoKnRoaXMpW2tleV0gPSBuZXdWYWx1ZTsKICAgICB9CiAKLSAgICBGWF9CT09MIFJlbW92ZUtleShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSk7CisgICAgYm9vbCBSZW1vdmVLZXkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpOwogCiAgICAgdm9pZCBSZW1vdmVBbGwoKTsKIApAQCAtOTI1LDcgKzkyNSw3IEBACiAgICAgICAgIHJldHVybiBtX25IYXNoVGFibGVTaXplOwogICAgIH0KIAotICAgIHZvaWQgSW5pdEhhc2hUYWJsZShGWF9EV09SRCBoYXNoU2l6ZSwgRlhfQk9PTCBiQWxsb2NOb3cgPSBUUlVFKTsKKyAgICB2b2lkIEluaXRIYXNoVGFibGUoRlhfRFdPUkQgaGFzaFNpemUsIGJvb2wgYkFsbG9jTm93ID0gdHJ1ZSk7CiAKICAgICBGWF9EV09SRCBIYXNoS2V5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdDsKIHByb3RlY3RlZDoKQEAgLTk2Niw3ICs5NjYsNyBAQAogCiAgICAgdm9pZCoJCUdldE5leHRWYWx1ZShGWF9QT1NJVElPTiYgck5leHRQb3NpdGlvbikgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJTG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdDsKKyAgICBib29sCQkJTG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdDsKIAogICAgIHZvaWQJCQlTZXRBdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgdm9pZCogdmFsdWUpOwogCkBAIC0xMDkwLDcgKzEwOTAsNyBAQAogCiAgICAgUERfQ0FMTEJBQ0tfRlJFRURBVEEJbV9wQ2FsbGJhY2s7CiAKLSAgICBGWF9CT09MCQkJCQltX2JTZWxmRGVzdHJ1Y3Q7CisgICAgYm9vbAkJCQkJbV9iU2VsZkRlc3RydWN0OwogfTsKIGNsYXNzIENGWF9Qcml2YXRlRGF0YQogewpAQCAtMTEwNiwyNyArMTEwNiwyNyBAQAogCiAgICAgdm9pZCoJCQkJR2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkKTsKIAotICAgIEZYX0JPT0wJCQkJCUxvb2t1cFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCwgdm9pZCogJnBEYXRhKSBjb25zdAorICAgIGJvb2wJCQkJCUxvb2t1cFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCwgdm9pZCogJnBEYXRhKSBjb25zdAogICAgIHsKICAgICAgICAgaWYgKCFtb2R1bGVfaWQpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBGWF9EV09SRCBuQ291bnQgPSBtX0RhdGFMaXN0LkdldFNpemUoKTsKICAgICAgICAgZm9yIChGWF9EV09SRCBuID0gMDsgbiA8IG5Db3VudDsgbiArKykgewogICAgICAgICAgICAgaWYgKG1fRGF0YUxpc3Rbbl0ubV9wTW9kdWxlSWQgPT0gbW9kdWxlX2lkKSB7CiAgICAgICAgICAgICAgICAgcERhdGEgPSBtX0RhdGFMaXN0W25dLm1fcERhdGE7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCQkJUmVtb3ZlUHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkKTsKKyAgICBib29sCQkJCQlSZW1vdmVQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQpOwogcHJvdGVjdGVkOgogCiAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfUFJJVkFURURBVEE+CW1fRGF0YUxpc3Q7CiAKLSAgICB2b2lkCQkJCQlBZGREYXRhKHZvaWQqIG1vZHVsZV9pZCwgdm9pZCogcERhdGEsIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrLCBGWF9CT09MIGJTZWxmRGVzdHJ1Y3QpOworICAgIHZvaWQJCQkJCUFkZERhdGEodm9pZCogbW9kdWxlX2lkLCB2b2lkKiBwRGF0YSwgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2ssIGJvb2wgYlNlbGZEZXN0cnVjdCk7CiB9OwogY2xhc3MgQ0ZYX0JpdFN0cmVhbQogewpAQCAtMTEzOSw3ICsxMTM5LDcgQEAKIAogICAgIHZvaWQJCQkJQnl0ZUFsaWduKCk7CiAKLSAgICBGWF9CT09MCQkJCUlzRU9GKCkKKyAgICBib29sCQkJCUlzRU9GKCkKICAgICB7CiAgICAgICAgIHJldHVybiBtX0JpdFBvcyA+PSBtX0JpdFNpemU7CiAgICAgfQpAQCAtMTI1MiwxMiArMTI1MiwxMiBAQAogICAgICAgICByZXR1cm4gbV9wT2JqZWN0OwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJSXNOdWxsKCkgY29uc3QKKyAgICBib29sCQkJCUlzTnVsbCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9wT2JqZWN0ID09IE5VTEw7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCQlOb3ROdWxsKCkgY29uc3QKKyAgICBib29sCQkJCU5vdE51bGwoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcE9iamVjdCAhPSBOVUxMOwogICAgIH0KQEAgLTEyODgsNyArMTI4OCw3IEBACiAgICAgICAgIG1fcE9iamVjdCA9IE5VTEw7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCQlvcGVyYXRvciA9PSAoY29uc3QgUmVmJiByZWYpIGNvbnN0CisgICAgYm9vbAkJCQlvcGVyYXRvciA9PSAoY29uc3QgUmVmJiByZWYpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9wT2JqZWN0ID09IHJlZi5tX3BPYmplY3Q7CiAgICAgfQpAQCAtMTMwMCw3ICsxMzAwLDcgQEAKIHsKIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5JRlhfUGF1c2UoKSB7IH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJTmVlZFRvUGF1c2VOb3coKSA9IDA7CisgICAgdmlydHVhbCBib29sCU5lZWRUb1BhdXNlTm93KCkgPSAwOwogfTsKIGNsYXNzIENGWF9EYXRhRmlsdGVyCiB7CkBAIC0xMzEwLDcgKzEzMTAsNyBAQAogCiAgICAgdm9pZAkJCVNldERlc3RGaWx0ZXIoQ0ZYX0RhdGFGaWx0ZXIqIHBGaWx0ZXIpOwogCi0gICAgRlhfQk9PTAkJCUlzRU9GKCkgY29uc3QKKyAgICBib29sCQkJSXNFT0YoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYkVPRjsKICAgICB9CkBAIC0xMzMwLDcgKzEzMzAsNyBAQAogICAgIHZpcnR1YWwgdm9pZAl2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikgPSAwOwogICAgIHZvaWQJCQlSZXBvcnRFT0YoRlhfRFdPUkQgbGVmdF9pbnB1dCk7CiAKLSAgICBGWF9CT09MCQkJbV9iRU9GOworICAgIGJvb2wJCQltX2JFT0Y7CiAKICAgICBGWF9EV09SRAkJbV9TcmNQb3M7CiAKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9jb29yZGluYXRlcy5oIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgKaW5kZXggMzY4OWE0Yi4uNmVkYWY1MyAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgKQEAgLTY4LDExICs2OCwxMSBAQAogICAgICAgICB5IC89IGxhbWRhOwogICAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgfQotICAgIGZyaWVuZAlGWF9CT09MCQlvcGVyYXRvciA9PSAoY29uc3QgRlhUX1BTViAmb2JqMSwgY29uc3QgRlhUX1BTViAmb2JqMikKKyAgICBmcmllbmQJYm9vbAkJb3BlcmF0b3IgPT0gKGNvbnN0IEZYVF9QU1YgJm9iajEsIGNvbnN0IEZYVF9QU1YgJm9iajIpCiAgICAgewogICAgICAgICByZXR1cm4gb2JqMS54ID09IG9iajIueCAmJiBvYmoxLnkgPT0gb2JqMi55OwogICAgIH0KLSAgICBmcmllbmQJRlhfQk9PTAkJb3BlcmF0b3IgIT0gKGNvbnN0IEZYVF9QU1YgJm9iajEsIGNvbnN0IEZYVF9QU1YgJm9iajIpCisgICAgZnJpZW5kCWJvb2wJCW9wZXJhdG9yICE9IChjb25zdCBGWFRfUFNWICZvYmoxLCBjb25zdCBGWFRfUFNWICZvYmoyKQogICAgIHsKICAgICAgICAgcmV0dXJuIG9iajEueCAhPSBvYmoyLnggfHwgb2JqMS55ICE9IG9iajIueTsKICAgICB9CkBAIC0xNzQsMjEgKzE3NCwyMSBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIEZYVF9QU1Y6OnggKiB2LnggKyBGWFRfUFNWOjp5ICogdi55OwogICAgIH0KLSAgICBGWF9CT09MCQlJc1BhcmFsbGVsKGJhc2VUeXBlIG90aGVyeCwgYmFzZVR5cGUgb3RoZXJ5KSBjb25zdAorICAgIGJvb2wJCUlzUGFyYWxsZWwoYmFzZVR5cGUgb3RoZXJ4LCBiYXNlVHlwZSBvdGhlcnkpIGNvbnN0CiAgICAgewogICAgICAgICBiYXNlVHlwZSB0ID0gRlhUX1BTVjo6eCAqIG90aGVyeSAtIEZYVF9QU1Y6OnkgKiBvdGhlcng7CiAgICAgICAgIHJldHVybiBGWFNZU19mYWJzKHQpIDwgMHgwMDAxZjsKICAgICB9Ci0gICAgRlhfQk9PTAkJSXNQYXJhbGxlbChjb25zdCBGWFRfVkVDVE9SICZ2KSBjb25zdAorICAgIGJvb2wJCUlzUGFyYWxsZWwoY29uc3QgRlhUX1ZFQ1RPUiAmdikgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBJc1BhcmFsbGVsKHYueCwgdi55KTsKICAgICB9Ci0gICAgRlhfQk9PTAkJSXNQZXJwZW5kaWN1bGFyKGJhc2VUeXBlIG90aGVyeCwgYmFzZVR5cGUgb3RoZXJ5KSBjb25zdAorICAgIGJvb2wJCUlzUGVycGVuZGljdWxhcihiYXNlVHlwZSBvdGhlcngsIGJhc2VUeXBlIG90aGVyeSkgY29uc3QKICAgICB7CiAgICAgICAgIGJhc2VUeXBlIHQgPSBEb3RQcm9kdWN0KG90aGVyeCwgb3RoZXJ5KTsKICAgICAgICAgcmV0dXJuIEZYU1lTX2ZhYnModCkgPCAweDAwMDFmOwogICAgIH0KLSAgICBGWF9CT09MCQlJc1BlcnBlbmRpY3VsYXIoY29uc3QgRlhUX1ZFQ1RPUiAmdikgY29uc3QKKyAgICBib29sCQlJc1BlcnBlbmRpY3VsYXIoY29uc3QgRlhUX1ZFQ1RPUiAmdikgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBJc1BlcnBlbmRpY3VsYXIodi54LCB2LnkpOwogICAgIH0KQEAgLTM0MCwxMSArMzQwLDExIEBACiAgICAgewogICAgICAgICBEZWZsYXRlKHJ0LmxlZnQsIHJ0LnRvcCwgcnQudG9wICsgcnQud2lkdGgsIHJ0LnRvcCArIHJ0LmhlaWdodCk7CiAgICAgfQotICAgIEZYX0JPT0wJCUlzRW1wdHkoKSBjb25zdAorICAgIGJvb2wJCUlzRW1wdHkoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDA7CiAgICAgfQotICAgIEZYX0JPT0wJCUlzRW1wdHkoRlhfRkxPQVQgZkVwc2lsb24pIGNvbnN0CisgICAgYm9vbAkJSXNFbXB0eShGWF9GTE9BVCBmRXBzaWxvbikgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiB3aWR0aCA8PSBmRXBzaWxvbiB8fCBoZWlnaHQgPD0gZkVwc2lsb247CiAgICAgfQpAQCAtMzUyLDE1ICszNTIsMTUgQEAKICAgICB7CiAgICAgICAgIHdpZHRoID0gaGVpZ2h0ID0gMDsKICAgICB9Ci0gICAgRlhfQk9PTAkJQ29udGFpbnMoYmFzZVR5cGUgeCwgYmFzZVR5cGUgeSkgY29uc3QKKyAgICBib29sCQlDb250YWlucyhiYXNlVHlwZSB4LCBiYXNlVHlwZSB5KSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIHggPj0gbGVmdCAmJiB4IDwgbGVmdCArIHdpZHRoICYmIHkgPj0gdG9wICYmIHkgPCB0b3AgKyBoZWlnaHQ7CiAgICAgfQotICAgIEZYX0JPT0wJCUNvbnRhaW5zKGNvbnN0IEZYVF9QT0lOVCAmcCkgY29uc3QKKyAgICBib29sCQlDb250YWlucyhjb25zdCBGWFRfUE9JTlQgJnApIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gQ29udGFpbnMocC54LCBwLnkpOwogICAgIH0KLSAgICBGWF9CT09MCQlDb250YWlucyhjb25zdCBGWFRfUkVDVCAmcnQpIGNvbnN0CisgICAgYm9vbAkJQ29udGFpbnMoY29uc3QgRlhUX1JFQ1QgJnJ0KSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIHJ0LmxlZnQgPj0gbGVmdCAmJiBydC5yaWdodCgpIDw9IHJpZ2h0KCkgJiYgcnQudG9wID49IHRvcCAmJiBydC5ib3R0b20oKSA8PSBib3R0b20oKTsKICAgICB9CkBAIC01MDEsMjMgKzUwMSwyMyBAQAogICAgICAgICB3aWR0aCA9IHIgLSBsZWZ0OwogICAgICAgICBoZWlnaHQgPSBiIC0gdG9wOwogICAgIH0KLSAgICBGWF9CT09MCQlJbnRlcnNlY3RXaXRoKGNvbnN0IEZYVF9SRUNUICZydCkgY29uc3QKKyAgICBib29sCQlJbnRlcnNlY3RXaXRoKGNvbnN0IEZYVF9SRUNUICZydCkgY29uc3QKICAgICB7CiAgICAgICAgIEZYVF9SRUNUIHJlY3QgPSBydDsKICAgICAgICAgcmVjdC5JbnRlcnNlY3QoKnRoaXMpOwogICAgICAgICByZXR1cm4gIXJlY3QuSXNFbXB0eSgpOwogICAgIH0KLSAgICBGWF9CT09MCQlJbnRlcnNlY3RXaXRoKGNvbnN0IEZYVF9SRUNUICZydCwgRlhfRkxPQVQgZkVwc2lsb24pIGNvbnN0CisgICAgYm9vbAkJSW50ZXJzZWN0V2l0aChjb25zdCBGWFRfUkVDVCAmcnQsIEZYX0ZMT0FUIGZFcHNpbG9uKSBjb25zdAogICAgIHsKICAgICAgICAgRlhUX1JFQ1QgcmVjdCA9IHJ0OwogICAgICAgICByZWN0LkludGVyc2VjdCgqdGhpcyk7CiAgICAgICAgIHJldHVybiAhcmVjdC5Jc0VtcHR5KGZFcHNpbG9uKTsKICAgICB9Ci0gICAgZnJpZW5kCUZYX0JPT0wJb3BlcmF0b3IgPT0gKGNvbnN0IEZYVF9SRUNUICZyYzEsIGNvbnN0IEZYVF9SRUNUICZyYzIpCisgICAgZnJpZW5kCWJvb2wJb3BlcmF0b3IgPT0gKGNvbnN0IEZYVF9SRUNUICZyYzEsIGNvbnN0IEZYVF9SRUNUICZyYzIpCiAgICAgewogICAgICAgICByZXR1cm4gcmMxLmxlZnQgPT0gcmMyLmxlZnQgJiYgcmMxLnRvcCA9PSByYzIudG9wICYmIHJjMS53aWR0aCA9PSByYzIud2lkdGggJiYgcmMxLmhlaWdodCA9PSByYzIuaGVpZ2h0OwogICAgIH0KLSAgICBmcmllbmQJRlhfQk9PTAlvcGVyYXRvciAhPSAoY29uc3QgRlhUX1JFQ1QgJnJjMSwgY29uc3QgRlhUX1JFQ1QgJnJjMikKKyAgICBmcmllbmQJYm9vbAlvcGVyYXRvciAhPSAoY29uc3QgRlhUX1JFQ1QgJnJjMSwgY29uc3QgRlhUX1JFQ1QgJnJjMikKICAgICB7CiAgICAgICAgIHJldHVybiByYzEubGVmdCAhPSByYzIubGVmdCB8fCByYzEudG9wICE9IHJjMi50b3AgfHwgcmMxLndpZHRoICE9IHJjMi53aWR0aCB8fCByYzEuaGVpZ2h0ICE9IHJjMi5oZWlnaHQ7CiAgICAgfQpAQCAtNTYxLDcgKzU2MSw3IEBACiAgICAgICAgIHJldHVybiBib3R0b20gLSB0b3A7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJSXNFbXB0eSgpIGNvbnN0CisgICAgYm9vbAkJSXNFbXB0eSgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gcmlnaHQgPD0gbGVmdCB8fCBib3R0b20gPD0gdG9wOwogICAgIH0KQEAgLTU3Nyw3ICs1NzcsNyBAQAogCiAgICAgdm9pZAkJVW5pb24oY29uc3QgRlhfUkVDVCYgb3RoZXJfcmVjdCk7CiAKLSAgICBGWF9CT09MCQlvcGVyYXRvciA9PSAoY29uc3QgRlhfUkVDVCYgc3JjKSBjb25zdAorICAgIGJvb2wJCW9wZXJhdG9yID09IChjb25zdCBGWF9SRUNUJiBzcmMpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbGVmdCA9PSBzcmMubGVmdCAmJiByaWdodCA9PSBzcmMucmlnaHQgJiYgdG9wID09IHNyYy50b3AgJiYgYm90dG9tID09IHNyYy5ib3R0b207CiAgICAgfQpAQCAtNTkwLDEyICs1OTAsMTIgQEAKICAgICAgICAgYm90dG9tICs9IGR5OwogICAgIH0KIAotICAgIEZYX0JPT0wJCUNvbnRhaW5zKGNvbnN0IEZYX1JFQ1QmIG90aGVyX3JlY3QpIGNvbnN0CisgICAgYm9vbAkJQ29udGFpbnMoY29uc3QgRlhfUkVDVCYgb3RoZXJfcmVjdCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBvdGhlcl9yZWN0LmxlZnQgPj0gbGVmdCAmJiBvdGhlcl9yZWN0LnJpZ2h0IDw9IHJpZ2h0ICYmIG90aGVyX3JlY3QudG9wID49IHRvcCAmJiBvdGhlcl9yZWN0LmJvdHRvbSA8PSBib3R0b207CiAgICAgfQogCi0gICAgRlhfQk9PTAkJQ29udGFpbnMoaW50IHgsIGludCB5KSBjb25zdAorICAgIGJvb2wJCUNvbnRhaW5zKGludCB4LCBpbnQgeSkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiB4ID49IGxlZnQgJiYgeCA8IHJpZ2h0ICYmIHkgPj0gdG9wICYmIHkgPCBib3R0b207CiAgICAgfQpAQCAtNjM3LDcgKzYzNyw3IEBACiAKICAgICBDRlhfRmxvYXRSZWN0KGNvbnN0IEZYX1JFQ1QmIHJlY3QpOwogCi0gICAgRlhfQk9PTAkJCQlJc0VtcHR5KCkgY29uc3QKKyAgICBib29sCQkJCUlzRW1wdHkoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIGxlZnQgPj0gcmlnaHQgfHwgYm90dG9tID49IHRvcDsKICAgICB9CkBAIC02NDksOSArNjQ5LDkgQEAKICAgICAgICAgbGVmdCA9IHJpZ2h0ID0gYm90dG9tID0gdG9wID0gMDsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCUNvbnRhaW5zKGNvbnN0IENGWF9GbG9hdFJlY3QmIG90aGVyX3JlY3QpIGNvbnN0OworICAgIGJvb2wJCQkJQ29udGFpbnMoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCkgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJCUNvbnRhaW5zKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpIGNvbnN0OworICAgIGJvb2wJCQkJQ29udGFpbnMoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkgY29uc3Q7CiAKICAgICB2b2lkCQkJCVRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKIApAQCAtNzg2LDExICs3ODYsMTEgQEAKIAogICAgIHZvaWQJCQlTZXRSZXZlcnNlKGNvbnN0IENGWF9NYXRyaXggJm0pOwogCi0gICAgdm9pZAkJCUNvbmNhdChGWF9GTE9BVCBhLCBGWF9GTE9BVCBiLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBkLCBGWF9GTE9BVCBlLCBGWF9GTE9BVCBmLCBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7CisgICAgdm9pZAkJCUNvbmNhdChGWF9GTE9BVCBhLCBGWF9GTE9BVCBiLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBkLCBGWF9GTE9BVCBlLCBGWF9GTE9BVCBmLCBib29sIGJQcmVwZW5kZWQgPSBmYWxzZSk7CiAKLSAgICB2b2lkCQkJQ29uY2F0KGNvbnN0IENGWF9NYXRyaXggJm0sIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKKyAgICB2b2lkCQkJQ29uY2F0KGNvbnN0IENGWF9NYXRyaXggJm0sIGJvb2wgYlByZXBlbmRlZCA9IGZhbHNlKTsKIAotICAgIHZvaWQJCQlDb25jYXRJbnZlcnNlKGNvbnN0IENGWF9NYXRyaXgmIG0sIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKKyAgICB2b2lkCQkJQ29uY2F0SW52ZXJzZShjb25zdCBDRlhfTWF0cml4JiBtLCBib29sIGJQcmVwZW5kZWQgPSBmYWxzZSk7CiAgICAgdm9pZAkJCVJlc2V0KCkKICAgICB7CiAgICAgICAgIFNldElkZW50aXR5KCk7CkBAIC04MDEsMzAgKzgwMSwzMCBAQAogICAgICAgICAqdGhpcyA9IG07CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCUlzSWRlbnRpdHkoKSBjb25zdAorICAgIGJvb2wJCQlJc0lkZW50aXR5KCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBhID09IDEgJiYgYiA9PSAwICYmIGMgPT0gMCAmJiBkID09IDEgJiYgZSA9PSAwICYmIGYgPT0gMDsKICAgICB9Ci0gICAgRlhfQk9PTAkJCUlzSW52ZXJ0aWJsZSgpIGNvbnN0OworICAgIGJvb2wJCQlJc0ludmVydGlibGUoKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQlJczkwUm90YXRlZCgpIGNvbnN0OworICAgIGJvb2wJCQlJczkwUm90YXRlZCgpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCUlzU2NhbGVkKCkgY29uc3Q7CisgICAgYm9vbAkJCUlzU2NhbGVkKCkgY29uc3Q7CiAKLSAgICB2b2lkCQkJVHJhbnNsYXRlKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKKyAgICB2b2lkCQkJVHJhbnNsYXRlKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIGJvb2wgYlByZXBlbmRlZCA9IGZhbHNlKTsKIAotICAgIHZvaWQJCQlUcmFuc2xhdGVJKGludDMyX3QgeCwgaW50MzJfdCB5LCBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSkKKyAgICB2b2lkCQkJVHJhbnNsYXRlSShpbnQzMl90IHgsIGludDMyX3QgeSwgYm9vbCBiUHJlcGVuZGVkID0gZmFsc2UpCiAgICAgewogICAgICAgICBUcmFuc2xhdGUoKEZYX0ZMT0FUKXgsIChGWF9GTE9BVCl5LCBiUHJlcGVuZGVkKTsKICAgICB9CiAKLSAgICB2b2lkCQkJU2NhbGUoRlhfRkxPQVQgc3gsIEZYX0ZMT0FUIHN5LCBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7CisgICAgdm9pZAkJCVNjYWxlKEZYX0ZMT0FUIHN4LCBGWF9GTE9BVCBzeSwgYm9vbCBiUHJlcGVuZGVkID0gZmFsc2UpOwogCi0gICAgdm9pZAkJCVJvdGF0ZShGWF9GTE9BVCBmUmFkaWFuLCBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7CisgICAgdm9pZAkJCVJvdGF0ZShGWF9GTE9BVCBmUmFkaWFuLCBib29sIGJQcmVwZW5kZWQgPSBmYWxzZSk7CiAKLSAgICB2b2lkCQkJUm90YXRlQXQoRlhfRkxPQVQgZlJhZGlhbiwgRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpOworICAgIHZvaWQJCQlSb3RhdGVBdChGWF9GTE9BVCBmUmFkaWFuLCBGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBib29sIGJQcmVwZW5kZWQgPSBmYWxzZSk7CiAKLSAgICB2b2lkCQkJU2hlYXIoRlhfRkxPQVQgZkFscGhhUmFkaWFuLCBGWF9GTE9BVCBmQmV0YVJhZGlhbiwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpOworICAgIHZvaWQJCQlTaGVhcihGWF9GTE9BVCBmQWxwaGFSYWRpYW4sIEZYX0ZMT0FUIGZCZXRhUmFkaWFuLCBib29sIGJQcmVwZW5kZWQgPSBmYWxzZSk7CiAKICAgICB2b2lkCQkJTWF0Y2hSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QgJmRlc3QsIGNvbnN0IENGWF9GbG9hdFJlY3QgJnNyYyk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaAppbmRleCBmMjRmNDU0Li5hMDRmYzUyIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oCkBAIC0yMSwxMSArMjEsMTEgQEAKIGludDMyX3QJCUZYU1lTX3djc25pY21wKGNvbnN0IEZYX1dDSEFSKiBzMSwgY29uc3QgRlhfV0NIQVIqIHMyLCBzaXplX3QgY291bnQpOwogaW50MzJfdAkJRlhTWVNfc3RybmljbXAoY29uc3QgRlhfQ0hBUiogczEsIGNvbnN0IEZYX0NIQVIqIHMyLCBzaXplX3QgY291bnQpOwogCi1pbmxpbmUgRlhfQk9PTAlGWFNZU19pc2xvd2VyKGludDMyX3QgY2gpCitpbmxpbmUgYm9vbAlGWFNZU19pc2xvd2VyKGludDMyX3QgY2gpCiB7CiAgICAgcmV0dXJuIGNoID49ICdhJyAmJiBjaCA8PSAneic7CiB9Ci1pbmxpbmUgRlhfQk9PTAlGWFNZU19pc3VwcGVyKGludDMyX3QgY2gpCitpbmxpbmUgYm9vbAlGWFNZU19pc3VwcGVyKGludDMyX3QgY2gpCiB7CiAgICAgcmV0dXJuIGNoID49ICdBJyAmJiBjaCA8PSAnWic7CiB9CkBAIC0zOCw4ICszOCw4IEBACiAgICAgcmV0dXJuIGNoIDwgJ2EnIHx8IGNoID4gJ3onID8gY2ggOiAoY2ggLSAweDIwKTsKIH0KIAotRlhfRFdPUkQJRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoY29uc3QgRlhfQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoLCBGWF9CT09MIGJJZ25vcmVDYXNlID0gRkFMU0UpOwotRlhfRFdPUkQJRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCwgRlhfQk9PTCBiSWdub3JlQ2FzZSA9IEZBTFNFKTsKK0ZYX0RXT1JECUZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKGNvbnN0IEZYX0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCwgYm9vbCBiSWdub3JlQ2FzZSA9IGZhbHNlKTsKK0ZYX0RXT1JECUZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgsIGJvb2wgYklnbm9yZUNhc2UgPSBmYWxzZSk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmVhbS5oIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmVhbS5oCmluZGV4IGZkZDdiMTEuLmIwNWU4NGQgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJlYW0uaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyZWFtLmgKQEAgLTExLDggKzExLDggQEAKIAogdm9pZCogRlhfT3BlbkZvbGRlcihjb25zdCBGWF9DSEFSKiBwYXRoKTsKIHZvaWQqIEZYX09wZW5Gb2xkZXIoY29uc3QgRlhfV0NIQVIqIHBhdGgpOwotRlhfQk9PTCBGWF9HZXROZXh0RmlsZSh2b2lkKiBoYW5kbGUsIENGWF9CeXRlU3RyaW5nJiBmaWxlbmFtZSwgRlhfQk9PTCYgYkZvbGRlcik7Ci1GWF9CT09MIEZYX0dldE5leHRGaWxlKHZvaWQqIGhhbmRsZSwgQ0ZYX1dpZGVTdHJpbmcmIGZpbGVuYW1lLCBGWF9CT09MJiBiRm9sZGVyKTsKK2Jvb2wgRlhfR2V0TmV4dEZpbGUodm9pZCogaGFuZGxlLCBDRlhfQnl0ZVN0cmluZyYgZmlsZW5hbWUsIGJvb2wmIGJGb2xkZXIpOworYm9vbCBGWF9HZXROZXh0RmlsZSh2b2lkKiBoYW5kbGUsIENGWF9XaWRlU3RyaW5nJiBmaWxlbmFtZSwgYm9vbCYgYkZvbGRlcik7CiB2b2lkIEZYX0Nsb3NlRm9sZGVyKHZvaWQqIGhhbmRsZSk7CiBGWF9XQ0hBUiBGWF9HZXRGb2xkZXJTZXBhcmF0b3IoKTsKIHR5cGVkZWYgc3RydWN0IEZYX0hGSUxFXyB7CkBAIC01MywyMyArNTMsMjMgQEAKIHNpemVfdAkJRlhfRmlsZV9SZWFkUG9zKEZYX0hGSUxFIGhGaWxlLCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcyk7CiBzaXplX3QJCUZYX0ZpbGVfV3JpdGUoRlhfSEZJTEUgaEZpbGUsIGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcik7CiBzaXplX3QJCUZYX0ZpbGVfV3JpdGVQb3MoRlhfSEZJTEUgaEZpbGUsIGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKTsKLUZYX0JPT0wJCUZYX0ZpbGVfRmx1c2goRlhfSEZJTEUgaEZpbGUpOwotRlhfQk9PTAkJRlhfRmlsZV9UcnVuY2F0ZShGWF9IRklMRSBoRmlsZSwgRlhfRklMRVNJWkUgc3pGaWxlKTsKLUZYX0JPT0wJCUZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSk7Ci1GWF9CT09MCQlGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpOwotRlhfQk9PTAkJRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSk7Ci1GWF9CT09MCQlGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKTsKLUZYX0JPT0wJCUZYX0ZpbGVfQ29weShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KTsKLUZYX0JPT0wJCUZYX0ZpbGVfQ29weShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KTsKLUZYX0JPT0wJCUZYX0ZpbGVfTW92ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KTsKLUZYX0JPT0wJCUZYX0ZpbGVfTW92ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KTsKK2Jvb2wJCUZYX0ZpbGVfRmx1c2goRlhfSEZJTEUgaEZpbGUpOworYm9vbAkJRlhfRmlsZV9UcnVuY2F0ZShGWF9IRklMRSBoRmlsZSwgRlhfRklMRVNJWkUgc3pGaWxlKTsKK2Jvb2wJCUZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSk7Citib29sCQlGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpOworYm9vbAkJRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSk7Citib29sCQlGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKTsKK2Jvb2wJCUZYX0ZpbGVfQ29weShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KTsKK2Jvb2wJCUZYX0ZpbGVfQ29weShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KTsKK2Jvb2wJCUZYX0ZpbGVfTW92ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KTsKK2Jvb2wJCUZYX0ZpbGVfTW92ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KTsKIGNsYXNzIElGWF9TdHJlYW1Xcml0ZQogewogcHVibGljOgogICAgIHZpcnR1YWwgfklGWF9TdHJlYW1Xcml0ZSgpIHsgfQogICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpID0gMDsKIAotICAgIHZpcnR1YWwJRlhfQk9PTAkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgc2l6ZV90IHNpemUpID0gMDsKKyAgICB2aXJ0dWFsCWJvb2wJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKSA9IDA7CiB9OwogY2xhc3MgSUZYX0ZpbGVXcml0ZSA6IHB1YmxpYyBJRlhfU3RyZWFtV3JpdGUKIHsKQEAgLTc5LDEwICs3OSwxMCBAQAogCiAgICAgdmlydHVhbCBGWF9GSUxFU0laRQkJR2V0U2l6ZSgpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUZsdXNoKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCUZsdXNoKCkgPSAwOwogCi0gICAgdmlydHVhbAlGWF9CT09MCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgPSAwOwotICAgIHZpcnR1YWwJRlhfQk9PTAkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKQorICAgIHZpcnR1YWwJYm9vbAkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpID0gMDsKKyAgICB2aXJ0dWFsCWJvb2wJCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBzaXplX3Qgc2l6ZSkKICAgICB7CiAgICAgICAgIHJldHVybiBXcml0ZUJsb2NrKHBEYXRhLCBHZXRTaXplKCksIHNpemUpOwogICAgIH0KQEAgLTk2LDcgKzk2LDcgQEAKIAogICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0VPRigpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQlJc0VPRigpID0gMDsKIAogICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFBvc2l0aW9uKCkgPSAwOwogCkBAIC0xMDksOSArMTA5LDkgQEAKIAogICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFNpemUoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0VPRigpCisgICAgdmlydHVhbCBib29sCQkJSXNFT0YoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgdmlydHVhbCBGWF9GSUxFU0laRQkJR2V0UG9zaXRpb24oKQpAQCAtMTE5LDE0ICsxMTksMTQgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0UmFuZ2UoRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9GSUxFU0laRSBzaXplKQorICAgIHZpcnR1YWwgYm9vbAkJCVNldFJhbmdlKEZYX0ZJTEVTSVpFIG9mZnNldCwgRlhfRklMRVNJWkUgc2l6ZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZAkJCUNsZWFyUmFuZ2UoKSB7fQogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpID0gMDsKIAogICAgIHZpcnR1YWwgc2l6ZV90CQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCiAgICAgewpAQCAtMTQ1LDIxICsxNDUsMjEgQEAKIAogICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCQlHZXRTaXplKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCUlzRU9GKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCQlJc0VPRigpID0gMDsKIAogICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCQlHZXRQb3NpdGlvbigpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSA9IDA7CisgICAgdmlydHVhbCBib29sCQkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpID0gMDsKIAogICAgIHZpcnR1YWwgc2l6ZV90CQkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSA9IDA7CiAKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpID0gMDsKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQorICAgIHZpcnR1YWwJYm9vbAkJCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgPSAwOworICAgIHZpcnR1YWwJYm9vbAkJCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCiAgICAgewogICAgICAgICByZXR1cm4gV3JpdGVCbG9jayhidWZmZXIsIEdldFNpemUoKSwgc2l6ZSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCUZsdXNoKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCQlGbHVzaCgpID0gMDsKIH07CiBJRlhfRmlsZVN0cmVhbSoJCUZYX0NyZWF0ZUZpbGVTdHJlYW0oY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGR3TW9kZXMpOwogSUZYX0ZpbGVTdHJlYW0qCQlGWF9DcmVhdGVGaWxlU3RyZWFtKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSwgRlhfRFdPUkQgZHdNb2Rlcyk7CkBAIC0xNjcsMzEgKzE2NywzMSBAQAogewogcHVibGljOgogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNDb25zZWN1dGl2ZSgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQlJc0NvbnNlY3V0aXZlKCkgY29uc3QgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkCQkJRXN0aW1hdGVTaXplKHNpemVfdCBuSW5pdFNpemUsIHNpemVfdCBuR3Jvd1NpemUpID0gMDsKIAogICAgIHZpcnR1YWwgdWludDhfdCoJCUdldEJ1ZmZlcigpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCUF0dGFjaEJ1ZmZlcih1aW50OF90KiBwQnVmZmVyLCBzaXplX3QgblNpemUsIEZYX0JPT0wgYlRha2VPdmVyID0gRkFMU0UpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQJCQlBdHRhY2hCdWZmZXIodWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IG5TaXplLCBib29sIGJUYWtlT3ZlciA9IGZhbHNlKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQJCQlEZXRhY2hCdWZmZXIoKSA9IDA7CiB9OwotSUZYX01lbW9yeVN0cmVhbSoJRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBuU2l6ZSwgRlhfQk9PTCBiVGFrZU92ZXIgPSBGQUxTRSk7Ci1JRlhfTWVtb3J5U3RyZWFtKglGWF9DcmVhdGVNZW1vcnlTdHJlYW0oRlhfQk9PTCBiQ29uc2VjdXRpdmUgPSBGQUxTRSk7CitJRlhfTWVtb3J5U3RyZWFtKglGWF9DcmVhdGVNZW1vcnlTdHJlYW0odWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IG5TaXplLCBib29sIGJUYWtlT3ZlciA9IGZhbHNlKTsKK0lGWF9NZW1vcnlTdHJlYW0qCUZYX0NyZWF0ZU1lbW9yeVN0cmVhbShib29sIGJDb25zZWN1dGl2ZSA9IGZhbHNlKTsKIGNsYXNzIElGWF9CdWZmZXJSZWFkIDogcHVibGljIElGWF9TdHJlYW1SZWFkCiB7CiBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNFT0YoKSA9IDA7CisgICAgdmlydHVhbCBib29sCQkJSXNFT0YoKSA9IDA7CiAKICAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCQlHZXRQb3NpdGlvbigpID0gMDsKIAogICAgIHZpcnR1YWwgc2l6ZV90CQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVJlYWROZXh0QmxvY2soRlhfQk9PTCBiUmVzdGFydCA9IEZBTFNFKSA9IDA7CisgICAgdmlydHVhbCBib29sCQkJUmVhZE5leHRCbG9jayhib29sIGJSZXN0YXJ0ID0gZmFsc2UpID0gMDsKIAogICAgIHZpcnR1YWwgY29uc3QgdWludDhfdCoJCUdldEJsb2NrQnVmZmVyKCkgPSAwOwogCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmggYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgKaW5kZXggOGQ3MzU1NS4uNzM2YWEzMiAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmluZy5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaApAQCAtNjcwLDcgKzY3MCw3IEBACiAgICAgdm9pZAkJCQkJRW1wdHkoKTsKIAogCi0gICAgRlhfQk9PTAkJCQkJSXNFbXB0eSgpIGNvbnN0CisgICAgYm9vbAkJCQkJSXNFbXB0eSgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gIUdldExlbmd0aCgpOwogICAgIH0KQEAgLTg5NSw3ICs4OTUsNyBAQAogICAgIHJldHVybiByaHMgIT0gbGhzOwogfQogRlhfRkxPQVQgRlhfYXRvZihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7Ci12b2lkIEZYX2F0b251bShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0ciwgRlhfQk9PTCYgYkludGVnZXIsIHZvaWQqIHBEYXRhKTsKK3ZvaWQgRlhfYXRvbnVtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyLCBib29sJiBiSW50ZWdlciwgdm9pZCogcERhdGEpOwogRlhfU1RSU0laRSBGWF9mdG9hKEZYX0ZMT0FUIGYsIEZYX0NIQVIqIGJ1Zik7CiBDRlhfQnl0ZVN0cmluZwlGWF9VVEY4RW5jb2RlKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsIEZYX1NUUlNJWkUgbGVuKTsKIGlubGluZSBDRlhfQnl0ZVN0cmluZwlGWF9VVEY4RW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NTdHIpCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmggYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgKaW5kZXggOGJjMmI0YS4uOWZjYWYxNyAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaApAQCAtNzEsNyArNzEsNiBAQAogdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgICAgICBGWF9XT1JEOyAgICAgLy8gS2VlcCAtICJhbiBlZmZpY2llbnQgc21hbGwgdHlwZSIKIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICAgRlhfRFdPUkQ7ICAgIC8vIEtlZXAgLSAiYW4gZWZmaWNpZW50IHR5cGUiCiB0eXBlZGVmIGZsb2F0ICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUOyAgICAvLyBLZWVwLCBhbGxvdyB1cGdyYWRlIHRvIGRvdWJsZXMuCi10eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0w7ICAgICAvLyBLZWVwLCBzYWRseSBub3QgYWx3YXlzIDAgb3IgMS4KIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgICAgRlhfQ0hBUjsgICAgIC8vIEtlZXAsIHF1ZXN0aW9uYWJsZSBzaWduZWRuZXNzLgogdHlwZWRlZiB3Y2hhcl90ICAgICAgICAgICAgICAgICBGWF9XQ0hBUjsgICAgLy8gS2VlcCwgbWF5YmUgYmFkIHBsYXRmb3JtIHdjaGFycy4KIApAQCAtODQsMTQgKzgzLDYgQEAKICNkZWZpbmUgX0RFQlVHCiAjZW5kaWYKIAotI2lmbmRlZiBUUlVFCi0jZGVmaW5lIFRSVUUJMQotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UJMAotI2VuZGlmCi0KICNpZm5kZWYgTlVMTAogI2RlZmluZSBOVUxMCTAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3VjZC5oIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3VjZC5oCmluZGV4IDdiNzMwYmIuLmQ5YjU3ODEgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNydC9meF91Y2QuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfdWNkLmgKQEAgLTkyLDExICs5MiwxMSBAQAogICAgIEZYX0NIQVJUWVBFX0FyYWJpYwkJCQk9ICgxMiA8PCBGWF9DSEFSVFlQRUJJVFMpLAogfTsKIEZYX0RXT1JEIEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKEZYX1dDSEFSIHdjaCk7Ci1GWF9CT09MCUZYX0lzQ3RybENvZGUoRlhfV0NIQVIgY2gpOwotRlhfQk9PTAlGWF9Jc1JvdGF0aW9uQ29kZShGWF9XQ0hBUiBjaCk7Ci1GWF9CT09MIEZYX0lzQ29tYmluYXRpb25DaGFyKEZYX1dDSEFSIHdjaCk7Ci1GWF9CT09MCUZYX0lzQmlkaUNoYXIoRlhfV0NIQVIgd2NoKTsKLUZYX1dDSEFSIEZYX0dldE1pcnJvckNoYXIoRlhfV0NIQVIgd2NoLCBGWF9CT09MIGJSVEwsIEZYX0JPT0wgYlZlcnRpY2FsKTsKLUZYX1dDSEFSIEZYX0dldE1pcnJvckNoYXIoRlhfV0NIQVIgd2NoLCBGWF9EV09SRCBkd1Byb3BzLCBGWF9CT09MIGJSVEwsIEZYX0JPT0wgYlZlcnRpY2FsKTsKK2Jvb2wJRlhfSXNDdHJsQ29kZShGWF9XQ0hBUiBjaCk7Citib29sCUZYX0lzUm90YXRpb25Db2RlKEZYX1dDSEFSIGNoKTsKK2Jvb2wgRlhfSXNDb21iaW5hdGlvbkNoYXIoRlhfV0NIQVIgd2NoKTsKK2Jvb2wJRlhfSXNCaWRpQ2hhcihGWF9XQ0hBUiB3Y2gpOworRlhfV0NIQVIgRlhfR2V0TWlycm9yQ2hhcihGWF9XQ0hBUiB3Y2gsIGJvb2wgYlJUTCwgYm9vbCBiVmVydGljYWwpOworRlhfV0NIQVIgRlhfR2V0TWlycm9yQ2hhcihGWF9XQ0hBUiB3Y2gsIEZYX0RXT1JEIGR3UHJvcHMsIGJvb2wgYlJUTCwgYm9vbCBiVmVydGljYWwpOwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWENSVF9GWF9VQ0RfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNydC9meF94bWwuaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF94bWwuaAppbmRleCBiYTMzYjIwLi4yMzNhOGY5IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfeG1sLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3htbC5oCkBAIC0zOCwyMSArMzgsMjEgQEAKIGNsYXNzIENYTUxfQ29udGVudAogewogcHVibGljOgotICAgIENYTUxfQ29udGVudCgpIDogbV9iQ0RBVEEoRkFMU0UpLCBtX0NvbnRlbnQoKSB7fQotICAgIHZvaWQJU2V0KEZYX0JPT0wgYkNEQVRBLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnQpCisgICAgQ1hNTF9Db250ZW50KCkgOiBtX2JDREFUQShmYWxzZSksIG1fQ29udGVudCgpIHt9CisgICAgdm9pZAlTZXQoYm9vbCBiQ0RBVEEsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudCkKICAgICB7CiAgICAgICAgIG1fYkNEQVRBID0gYkNEQVRBOwogICAgICAgICBtX0NvbnRlbnQgPSBjb250ZW50OwogICAgIH0KLSAgICBGWF9CT09MCQkJbV9iQ0RBVEE7CisgICAgYm9vbAkJCW1fYkNEQVRBOwogICAgIENGWF9XaWRlU3RyaW5nCW1fQ29udGVudDsKIH07CiBjbGFzcyBDWE1MX0VsZW1lbnQKIHsKIHB1YmxpYzoKLSAgICBzdGF0aWMgQ1hNTF9FbGVtZW50KglQYXJzZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSwgRlhfQk9PTCBiU2F2ZVNwYWNlQ2hhcnMgPSBGQUxTRSwgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplID0gTlVMTCk7Ci0gICAgc3RhdGljIENYTUxfRWxlbWVudCoJUGFyc2UoSUZYX0ZpbGVSZWFkICpwRmlsZSwgRlhfQk9PTCBiU2F2ZVNwYWNlQ2hhcnMgPSBGQUxTRSwgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplID0gTlVMTCk7Ci0gICAgc3RhdGljIENYTUxfRWxlbWVudCoJUGFyc2UoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXIsIEZYX0JPT0wgYlNhdmVTcGFjZUNoYXJzID0gRkFMU0UsIEZYX0ZJTEVTSVpFKiBwUGFyc2VkU2l6ZSA9IE5VTEwpOworICAgIHN0YXRpYyBDWE1MX0VsZW1lbnQqCVBhcnNlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzaXplLCBib29sIGJTYXZlU3BhY2VDaGFycyA9IGZhbHNlLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUgPSBOVUxMKTsKKyAgICBzdGF0aWMgQ1hNTF9FbGVtZW50KglQYXJzZShJRlhfRmlsZVJlYWQgKnBGaWxlLCBib29sIGJTYXZlU3BhY2VDaGFycyA9IGZhbHNlLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUgPSBOVUxMKTsKKyAgICBzdGF0aWMgQ1hNTF9FbGVtZW50KglQYXJzZShJRlhfQnVmZmVyUmVhZCAqcEJ1ZmZlciwgYm9vbCBiU2F2ZVNwYWNlQ2hhcnMgPSBmYWxzZSwgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplID0gTlVMTCk7CiAgICAgQ1hNTF9FbGVtZW50KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcVNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZ05hbWUpOwogICAgIENYTUxfRWxlbWVudChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHFUYWdOYW1lKTsKICAgICBDWE1MX0VsZW1lbnQoKTsKQEAgLTYzLDkgKzYzLDkgQEAKIAogCiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJCUdldFRhZ05hbWUoRlhfQk9PTCBiUXVhbGlmaWVkID0gRkFMU0UpIGNvbnN0OworICAgIENGWF9CeXRlU3RyaW5nCQkJR2V0VGFnTmFtZShib29sIGJRdWFsaWZpZWQgPSBmYWxzZSkgY29uc3Q7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJCUdldE5hbWVzcGFjZShGWF9CT09MIGJRdWFsaWZpZWQgPSBGQUxTRSkgY29uc3Q7CisgICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXROYW1lc3BhY2UoYm9vbCBiUXVhbGlmaWVkID0gZmFsc2UpIGNvbnN0OwogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXROYW1lc3BhY2VVUkkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBxTmFtZSkgY29uc3Q7CiAKQEAgLTgxLDkgKzgxLDkgQEAKIAogICAgIHZvaWQJCQkJCUdldEF0dHJCeUluZGV4KGludCBpbmRleCwgQ0ZYX0J5dGVTdHJpbmcgJnNwYWNlLCBDRlhfQnl0ZVN0cmluZyAmbmFtZSwgQ0ZYX1dpZGVTdHJpbmcgJnZhbHVlKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQkJCUhhc0F0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBxTmFtZSkgY29uc3Q7CisgICAgYm9vbAkJCQkJSGFzQXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHFOYW1lKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQkJCUdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIENGWF9XaWRlU3RyaW5nJiBhdHRyaWJ1dGUpIGNvbnN0OworICAgIGJvb2wJCQkJCUdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIENGWF9XaWRlU3RyaW5nJiBhdHRyaWJ1dGUpIGNvbnN0OwogICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QKICAgICB7CiAgICAgICAgIENGWF9XaWRlU3RyaW5nIGF0dHI7CkBAIC05MSw3ICs5MSw3IEBACiAgICAgICAgIHJldHVybiBhdHRyOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJCUdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIENGWF9XaWRlU3RyaW5nJiBhdHRyaWJ1dGUpIGNvbnN0OworICAgIGJvb2wJCQkJCUdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIENGWF9XaWRlU3RyaW5nJiBhdHRyaWJ1dGUpIGNvbnN0OwogICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QKICAgICB7CiAgICAgICAgIENGWF9XaWRlU3RyaW5nIGF0dHI7CkBAIC05OSw3ICs5OSw3IEBACiAgICAgICAgIHJldHVybiBhdHRyOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJCUdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50JiBhdHRyaWJ1dGUpIGNvbnN0OworICAgIGJvb2wJCQkJCUdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50JiBhdHRyaWJ1dGUpIGNvbnN0OwogICAgIGludAkJCQkJCUdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QKICAgICB7CiAgICAgICAgIGludCBhdHRyID0gMDsKQEAgLTEwNyw3ICsxMDcsNyBAQAogICAgICAgICByZXR1cm4gYXR0cjsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCQlHZXRBdHRySW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCYgYXR0cmlidXRlKSBjb25zdDsKKyAgICBib29sCQkJCQlHZXRBdHRySW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCYgYXR0cmlidXRlKSBjb25zdDsKICAgICBpbnQJCQkJCQlHZXRBdHRySW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0CiAgICAgewogICAgICAgICBpbnQgYXR0ciA9IDA7CkBAIC0xMTUsNyArMTE1LDcgQEAKICAgICAgICAgcmV0dXJuIGF0dHI7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCQkJR2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3Q7CisgICAgYm9vbAkJCQkJR2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3Q7CiAgICAgRlhfRkxPQVQJCQkJR2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QKICAgICB7CiAgICAgICAgIEZYX0ZMT0FUIGF0dHIgPSAwOwpAQCAtMTIzLDcgKzEyMyw3IEBACiAgICAgICAgIHJldHVybiBhdHRyOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJCUdldEF0dHJGbG9hdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0ZMT0FUJiBhdHRyaWJ1dGUpIGNvbnN0OworICAgIGJvb2wJCQkJCUdldEF0dHJGbG9hdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0ZMT0FUJiBhdHRyaWJ1dGUpIGNvbnN0OwogICAgIEZYX0ZMT0FUCQkJCUdldEF0dHJGbG9hdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0CiAgICAgewogICAgICAgICBGWF9GTE9BVCBhdHRyID0gMDsKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGdlL2ZwZi5oIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnBmLmgKaW5kZXggZmI5YmY0ZC4uMTE1ZWY1NSAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnBmLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnBmLmgKQEAgLTQxLDggKzQxLDggQEAKICAgICB2aXJ0dWFsIGludDMyX3QJCUdldEFzY2VudCgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGludDMyX3QJCUdldERlc2NlbnQoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRHbHlwaEJCb3goaW50MzJfdCBpR2x5cGhJbmRleCwgRlhfUkVDVCAmcnRCQm94KSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJR2V0QkJveChGWF9SRUNUICZydEJCb3gpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQlHZXRHbHlwaEJCb3goaW50MzJfdCBpR2x5cGhJbmRleCwgRlhfUkVDVCAmcnRCQm94KSA9IDA7CisgICAgdmlydHVhbCBib29sCQkJR2V0QkJveChGWF9SRUNUICZydEJCb3gpID0gMDsKIAogICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0SGVpZ2h0KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0SXRhbGljQW5nbGUoKSBjb25zdCA9IDA7CmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhnZS9meF9kaWIuaCBiL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2RpYi5oCmluZGV4IDI3ZmMyZjkuLjU1NGZlMzAgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2RpYi5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2RpYi5oCkBAIC0xNzksMTMgKzE3OSwxMyBAQAogCiAgICAgdmlydHVhbCBjb25zdCB1aW50OF90KglHZXRTY2FubGluZShpbnQgbGluZSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpIGNvbnN0CisgICAgdmlydHVhbCBib29sCQlTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQJCURvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwgdWludDhfdCogZGVzdF9zY2FuLCBpbnQgZGVzdF9icHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIEZYX0JPT0wgYkZsaXBYLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF93aWR0aCkgY29uc3QgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBib29sIGJGbGlwWCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfd2lkdGgpIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZAkJU2V0RG93blNhbXBsZVNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSBjb25zdCB7fQogCkBAIC0xOTQsMjQgKzE5NCwyNCBAQAogICAgICAgICByZXR1cm4gbV9icHA7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCUlzQWxwaGFNYXNrKCkgY29uc3QKKyAgICBib29sCQkJSXNBbHBoYU1hc2soKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fQWxwaGFGbGFnID09IDE7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCUhhc0FscGhhKCkgY29uc3QKKyAgICBib29sCQkJSGFzQWxwaGEoKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIG1fQWxwaGFGbGFnICYgMiA/IFRSVUUgOiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIG1fQWxwaGFGbGFnICYgMiA/IHRydWUgOiBmYWxzZTsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJSXNPcGFxdWVJbWFnZSgpIGNvbnN0CisgICAgYm9vbAkJCUlzT3BhcXVlSW1hZ2UoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuICEobV9BbHBoYUZsYWcgJiAzKTsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJSXNDbXlrSW1hZ2UoKSBjb25zdAorICAgIGJvb2wJCQlJc0NteWtJbWFnZSgpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gbV9BbHBoYUZsYWcgJiA0ID8gVFJVRSA6IEZBTFNFOworICAgICAgICByZXR1cm4gbV9BbHBoYUZsYWcgJiA0ID8gdHJ1ZSA6IGZhbHNlOwogICAgIH0KIAogCkBAIC0yNDgsMTEgKzI0OCwxMSBAQAogCiAgICAgQ0ZYX0RJQml0bWFwKglHZXRBbHBoYU1hc2soY29uc3QgRlhfUkVDVCogcENsaXAgPSBOVUxMKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQlDb3B5QWxwaGFNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBBbHBoYU1hc2ssIGNvbnN0IEZYX1JFQ1QqIHBDbGlwID0gTlVMTCk7CisgICAgYm9vbAkJCUNvcHlBbHBoYU1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEFscGhhTWFzaywgY29uc3QgRlhfUkVDVCogcENsaXAgPSBOVUxMKTsKIAotICAgIENGWF9ESUJpdG1hcCoJU3dhcFhZKEZYX0JPT0wgYlhGbGlwLCBGWF9CT09MIGJZRmxpcCwgY29uc3QgRlhfUkVDVCogcENsaXAgPSBOVUxMKSBjb25zdDsKKyAgICBDRlhfRElCaXRtYXAqCVN3YXBYWShib29sIGJYRmxpcCwgYm9vbCBiWUZsaXAsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwID0gTlVMTCkgY29uc3Q7CiAKLSAgICBDRlhfRElCaXRtYXAqCUZsaXBJbWFnZShGWF9CT09MIGJYRmxpcCwgRlhfQk9PTCBiWUZsaXApIGNvbnN0OworICAgIENGWF9ESUJpdG1hcCoJRmxpcEltYWdlKGJvb2wgYlhGbGlwLCBib29sIGJZRmxpcCkgY29uc3Q7CiAKICAgICB2b2lkCQkJR2V0T3ZlcmxhcFJlY3QoaW50JiBkZXN0X2xlZnQsIGludCYgZGVzdF90b3AsIGludCYgd2lkdGgsIGludCYgaGVpZ2h0LCBpbnQgc3JjX3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2hlaWdodCwgaW50JiBzcmNfbGVmdCwgaW50JiBzcmNfdG9wLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24pOwpAQCAtMjc2LDcgKzI3Niw3IEBACiAKICAgICB2b2lkCQkJQnVpbGRQYWxldHRlKCk7CiAKLSAgICBGWF9CT09MCQkJQnVpbGRBbHBoYU1hc2soKTsKKyAgICBib29sCQkJQnVpbGRBbHBoYU1hc2soKTsKIAogICAgIGludAkJCQlGaW5kUGFsZXR0ZShGWF9EV09SRCBjb2xvcikgY29uc3Q7CiAKQEAgLTI5Miw5ICsyOTIsOSBAQAogCiAgICAgQ0ZYX0RJQml0bWFwKGNvbnN0IENGWF9ESUJpdG1hcCYgc3JjKTsKIAotICAgIEZYX0JPT0wJCQlDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCB1aW50OF90KiBwQnVmZmVyID0gTlVMTCwgaW50IHBpdGNoID0gMCk7CisgICAgYm9vbAkJCUNyZWF0ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQsIHVpbnQ4X3QqIHBCdWZmZXIgPSBOVUxMLCBpbnQgcGl0Y2ggPSAwKTsKIAotICAgIEZYX0JPT0wJCQlDb3B5KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMpOworICAgIGJvb2wJCQlDb3B5KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMpOwogCiAgICAgdmlydHVhbAl1aW50OF90KglHZXRCdWZmZXIoKSBjb25zdAogICAgIHsKQEAgLTMwNywxMSArMzA3LDExIEBACiAgICAgfQogCiAgICAgdmlydHVhbCB2b2lkCURvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwgdWludDhfdCogZGVzdF9zY2FuLCBpbnQgZGVzdF9icHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgRlhfQk9PTCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBib29sIGJGbGlwWCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfd2lkdGgpIGNvbnN0OwogCiAgICAgdm9pZAkJCVRha2VPdmVyKENGWF9ESUJpdG1hcCogcFNyY0JpdG1hcCk7CiAKLSAgICBGWF9CT09MCQkJQ29udmVydEZvcm1hdChGWERJQl9Gb3JtYXQgZm9ybWF0LCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgICAgYm9vbAkJCUNvbnZlcnRGb3JtYXQoRlhESUJfRm9ybWF0IGZvcm1hdCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCiAgICAgdm9pZAkJCUNsZWFyKEZYX0RXT1JEIGNvbG9yKTsKIApAQCAtMzE5LDQwICszMTksNDAgQEAKIAogICAgIHZvaWQJCQlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yKTsKIAotICAgIEZYX0JPT0wJCQlMb2FkQ2hhbm5lbChGWERJQl9DaGFubmVsIGRlc3RDaGFubmVsLCBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBGWERJQl9DaGFubmVsIHNyY0NoYW5uZWwpOworICAgIGJvb2wJCQlMb2FkQ2hhbm5lbChGWERJQl9DaGFubmVsIGRlc3RDaGFubmVsLCBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBGWERJQl9DaGFubmVsIHNyY0NoYW5uZWwpOwogCi0gICAgRlhfQk9PTAkJCUxvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsIGludCB2YWx1ZSk7CisgICAgYm9vbAkJCUxvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsIGludCB2YWx1ZSk7CiAKLSAgICBGWF9CT09MCQkJTXVsdGlwbHlBbHBoYShpbnQgYWxwaGEpOworICAgIGJvb2wJCQlNdWx0aXBseUFscGhhKGludCBhbHBoYSk7CiAKLSAgICBGWF9CT09MCQkJTXVsdGlwbHlBbHBoYShjb25zdCBDRlhfRElCU291cmNlKiBwQWxwaGFNYXNrKTsKKyAgICBib29sCQkJTXVsdGlwbHlBbHBoYShjb25zdCBDRlhfRElCU291cmNlKiBwQWxwaGFNYXNrKTsKIAotICAgIEZYX0JPT0wJCQlUcmFuc2ZlckJpdG1hcChpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICBib29sCQkJVHJhbnNmZXJCaXRtYXAoaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlDb21wb3NpdGVCaXRtYXAoaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgYm9vbAkJCUNvbXBvc2l0ZUJpdG1hcChpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduID0gTlVMTCwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyID0gRkFMU0UsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24gPSBOVUxMLCBib29sIGJSZ2JCeXRlT3JkZXIgPSBmYWxzZSwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCVRyYW5zZmVyTWFzayhpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICBib29sCQkJVHJhbnNmZXJNYXNrKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE1hc2ssIEZYX0RXT1JEIGNvbG9yLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlDb21wb3NpdGVNYXNrKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgIGJvb2wJCQlDb21wb3NpdGVNYXNrKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBNYXNrLCBGWF9EV09SRCBjb2xvciwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduID0gTlVMTCwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyID0gRkFMU0UsIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24gPSBOVUxMLCBib29sIGJSZ2JCeXRlT3JkZXIgPSBmYWxzZSwgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJQ29tcG9zaXRlUmVjdChpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhfRFdPUkQgY29sb3IsIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICAgIGJvb2wJCQlDb21wb3NpdGVSZWN0KGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWF9EV09SRCBjb2xvciwgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJQ29udmVydENvbG9yU2NhbGUoRlhfRFdPUkQgZm9yZWNvbG9yLCBGWF9EV09SRCBiYWNrY29sb3IpOworICAgIGJvb2wJCQlDb252ZXJ0Q29sb3JTY2FsZShGWF9EV09SRCBmb3JlY29sb3IsIEZYX0RXT1JEIGJhY2tjb2xvcik7CiAKLSAgICBGWF9CT09MCQkJRGl0aGVyRlMoY29uc3QgRlhfRFdPUkQqIHBQYWxldHRlLCBpbnQgcGFsX3NpemUsIGNvbnN0IEZYX1JFQ1QqIHBSZWN0ID0gTlVMTCk7CisgICAgYm9vbAkJCURpdGhlckZTKGNvbnN0IEZYX0RXT1JEKiBwUGFsZXR0ZSwgaW50IHBhbF9zaXplLCBjb25zdCBGWF9SRUNUKiBwUmVjdCA9IE5VTEwpOwogcHJvdGVjdGVkOgogCiAgICAgdWludDhfdCoJCW1fcEJ1ZmZlcjsKIAotICAgIEZYX0JPT0wJCQltX2JFeHRCdWY7CisgICAgYm9vbAkJCW1fYkV4dEJ1ZjsKIAotICAgIEZYX0JPT0wJCQlHZXRHcmF5RGF0YSh2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgICAgYm9vbAkJCUdldEdyYXlEYXRhKHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIH07CiBjbGFzcyBDRlhfRElCRXh0cmFjdG9yCiB7CkBAIC0zNzksNyArMzc5LDcgQEAKIAogICAgIH5DRlhfRmlsdGVyZWRESUIoKTsKIAotICAgIHZvaWQJCQkJCUxvYWRTcmMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywgRlhfQk9PTCBiQXV0b0Ryb3BTcmMgPSBGQUxTRSk7CisgICAgdm9pZAkJCQkJTG9hZFNyYyhjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBib29sIGJBdXRvRHJvcFNyYyA9IGZhbHNlKTsKIAogICAgIHZpcnR1YWwgRlhESUJfRm9ybWF0CUdldERlc3RGb3JtYXQoKSA9IDA7CiAKQEAgLTM5MiwxMSArMzkyLDExIEBACiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCBjb25zdCB1aW50OF90KgkJR2V0U2NhbmxpbmUoaW50IGxpbmUpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZAkJCURvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwgdWludDhfdCogZGVzdF9zY2FuLCBpbnQgZGVzdF9icHAsCi0gICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgRlhfQk9PTCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdDsKKyAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBib29sIGJGbGlwWCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfd2lkdGgpIGNvbnN0OwogCiAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSoJbV9wU3JjOwogCi0gICAgRlhfQk9PTAkJCQkJbV9iQXV0b0Ryb3BTcmM7CisgICAgYm9vbAkJCQkJbV9iQXV0b0Ryb3BTcmM7CiAKICAgICB1aW50OF90KgkJCQltX3BTY2FubGluZTsKIH07CkBAIC00MDcsNyArNDA3LDcgQEAKIAogICAgIHZpcnR1YWwJdm9pZAkJQ29tcG9zZVNjYW5saW5lKGludCBsaW5lLCBjb25zdCB1aW50OF90KiBzY2FubGluZSwgY29uc3QgdWludDhfdCogc2Nhbl9leHRyYV9hbHBoYSA9IE5VTEwpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0SW5mbyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LCBGWF9EV09SRCogcFNyY1BhbGV0dGUpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCVNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKSA9IDA7CiB9OwogY2xhc3MgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcgogewpAQCAtNDE2LDggKzQxNiw4IEBACiAKICAgICB+Q0ZYX1NjYW5saW5lQ29tcG9zaXRvcigpOwogCi0gICAgRlhfQk9PTAkJCQlJbml0KEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsIGludDMyX3Qgd2lkdGgsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwgaW50IGJsZW5kX3R5cGUsIEZYX0JPT0wgYkNsaXAsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLCBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgICBib29sCQkJCUluaXQoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgaW50MzJfdCB3aWR0aCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBpbnQgYmxlbmRfdHlwZSwgYm9vbCBiQ2xpcCwgYm9vbCBiUmdiQnl0ZU9yZGVyID0gZmFsc2UsIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCiAKICAgICB2b2lkCQkJCUNvbXBvc2l0ZVJnYkJpdG1hcExpbmUodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCkBAIC00NDksNyArNDQ5LDcgQEAKICAgICB2b2lkKgkJCQltX3BJY2NUcmFuc2Zvcm07CiAgICAgdWludDhfdCoJCQltX3BDYWNoZVNjYW5saW5lOwogICAgIGludAkJCQkJbV9DYWNoZVNpemU7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICBtX2JSZ2JCeXRlT3JkZXI7CisgICAgYm9vbCAgICAgICAgICAgICBtX2JSZ2JCeXRlT3JkZXI7CiB9OwogY2xhc3MgQ0ZYX0JpdG1hcENvbXBvc2VyIDogcHVibGljIElGWF9TY2FubGluZUNvbXBvc2VyCiB7CkBAIC00NjEsMTEgKzQ2MSwxMSBAQAogCiAKICAgICB2b2lkCQkJCUNvbXBvc2UoQ0ZYX0RJQml0bWFwKiBwRGVzdCwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBpbnQgYml0bWFwX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBGWF9SRUNUJiBkZXN0X3JlY3QsIEZYX0JPT0wgYlZlcnRpY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWCwgRlhfQk9PTCBiRmxpcFksIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBGWF9SRUNUJiBkZXN0X3JlY3QsIGJvb2wgYlZlcnRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGbGlwWCwgYm9vbCBiRmxpcFksIGJvb2wgYlJnYkJ5dGVPcmRlciA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKTsKKyAgICB2aXJ0dWFsIGJvb2wJCVNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKTsKIAogCiAgICAgdmlydHVhbAl2b2lkCQlDb21wb3NlU2NhbmxpbmUoaW50IGxpbmUsIGNvbnN0IHVpbnQ4X3QqIHNjYW5saW5lLCBjb25zdCB1aW50OF90KiBzY2FuX2V4dHJhX2FscGhhKTsKQEAgLTQ4MCwxMCArNDgwLDEwIEBACiAgICAgRlhfRFdPUkQJCQltX01hc2tDb2xvcjsKICAgICBjb25zdCBDRlhfRElCaXRtYXAqCW1fcENsaXBNYXNrOwogICAgIENGWF9TY2FubGluZUNvbXBvc2l0b3IJbV9Db21wb3NpdG9yOwotICAgIEZYX0JPT0wJCQkJbV9iVmVydGljYWwsIG1fYkZsaXBYLCBtX2JGbGlwWTsKKyAgICBib29sCQkJCW1fYlZlcnRpY2FsLCBtX2JGbGlwWCwgbV9iRmxpcFk7CiAgICAgaW50CQkJCQltX0FscGhhRmxhZzsKICAgICB2b2lkKgkJCQltX3BJY2NUcmFuc2Zvcm07Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICBtX2JSZ2JCeXRlT3JkZXI7CisgICAgYm9vbCAgICAgICAgICAgICBtX2JSZ2JCeXRlT3JkZXI7CiAgICAgaW50CQkJCQltX0JsZW5kVHlwZTsKICAgICB2b2lkCQkJCUNvbXBvc2VTY2FubGluZVYoaW50IGxpbmUsIGNvbnN0IHVpbnQ4X3QqIHNjYW5saW5lLCBjb25zdCB1aW50OF90KiBzY2FuX2V4dHJhX2FscGhhID0gTlVMTCk7CiAgICAgdWludDhfdCogbV9wU2NhbmxpbmVWOwpAQCAtNTAxLDcgKzUwMSw3IEBACiAKICAgICB2aXJ0dWFsCXZvaWQJCUNvbXBvc2VTY2FubGluZShpbnQgbGluZSwgY29uc3QgdWludDhfdCogc2NhbmxpbmUsIGNvbnN0IHVpbnQ4X3QqIHNjYW5fZXh0cmFfYWxwaGEpOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlTZXRJbmZvKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSk7CisgICAgdmlydHVhbCBib29sCQlTZXRJbmZvKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSk7CiAKICAgICBDRlhfRElCaXRtYXAqCQlHZXRCaXRtYXAoKQogICAgIHsKQEAgLTUyMSwyMiArNTIxLDIyIEBACiAgICAgQ0ZYX0ltYWdlU3RyZXRjaGVyKCk7CiAgICAgfkNGWF9JbWFnZVN0cmV0Y2hlcigpOwogCi0gICAgRlhfQk9PTCBTdGFydChJRlhfU2NhbmxpbmVDb21wb3NlciogcERlc3QsIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgYm9vbCBTdGFydChJRlhfU2NhbmxpbmVDb21wb3NlciogcERlc3QsIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUJiBiaXRtYXBfcmVjdCwKICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzKTsKIAotICAgIEZYX0JPT0wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIEZYX0JPT0wgU3RhcnRRdWlja1N0cmV0Y2goKTsKLSAgICBGWF9CT09MIFN0YXJ0U3RyZXRjaCgpOwotICAgIEZYX0JPT0wgQ29udGludWVRdWlja1N0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIEZYX0JPT0wgQ29udGludWVTdHJldGNoKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICBib29sIENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICBib29sIFN0YXJ0UXVpY2tTdHJldGNoKCk7CisgICAgYm9vbCBTdGFydFN0cmV0Y2goKTsKKyAgICBib29sIENvbnRpbnVlUXVpY2tTdHJldGNoKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICBib29sIENvbnRpbnVlU3RyZXRjaChJRlhfUGF1c2UqIHBQYXVzZSk7CiAKICAgICBJRlhfU2NhbmxpbmVDb21wb3NlcioJbV9wRGVzdDsKICAgICBjb25zdCBDRlhfRElCU291cmNlKgltX3BTb3VyY2U7CiAgICAgQ1N0cmV0Y2hFbmdpbmUqCQltX3BTdHJldGNoRW5naW5lOwogICAgIEZYX0RXT1JECQltX0ZsYWdzOwotICAgIEZYX0JPT0wJCQltX2JGbGlwWDsKLSAgICBGWF9CT09MICAgICAgICAgbV9iRmxpcFk7CisgICAgYm9vbAkJCW1fYkZsaXBYOworICAgIGJvb2wgICAgICAgICBtX2JGbGlwWTsKICAgICBpbnQJCQkJbV9EZXN0V2lkdGg7CiAgICAgaW50ICAgICAgICAgICAgIG1fRGVzdEhlaWdodDsKICAgICBGWF9SRUNUCQkJbV9DbGlwUmVjdDsKQEAgLTU1MiwxMCArNTUyLDEwIEBACiAgICAgQ0ZYX0ltYWdlVHJhbnNmb3JtZXIoKTsKICAgICB+Q0ZYX0ltYWdlVHJhbnNmb3JtZXIoKTsKIAotICAgIEZYX0JPT0wgU3RhcnQoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICBib29sIFN0YXJ0KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwKTsKIAotICAgIEZYX0JPT0wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIGJvb2wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwogCiAgICAgQ0ZYX0FmZmluZU1hdHJpeCogbV9wTWF0cml4OwogICAgIEZYX1JFQ1QJCW1fU3RyZXRjaENsaXA7CkBAIC01NzUsMTQgKzU3NSwxNCBAQAogICAgIENGWF9JbWFnZVJlbmRlcmVyKCk7CiAgICAgfkNGWF9JbWFnZVJlbmRlcmVyKCk7CiAKLSAgICBGWF9CT09MIFN0YXJ0KENGWF9ESUJpdG1hcCogcERldmljZSwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLAorICAgIGJvb2wgU3RhcnQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCiAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBpbnQgYml0bWFwX2FscGhhLAogICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRpYl9mbGFncywgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkaWJfZmxhZ3MsIGJvb2wgYlJnYkJ5dGVPcmRlciA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKIAotICAgIEZYX0JPT0wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIGJvb2wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwogCiBwcm90ZWN0ZWQ6CiAgICAgQ0ZYX0RJQml0bWFwKgkJbV9wRGV2aWNlOwpAQCAtNTk4LDcgKzU5OCw3IEBACiAgICAgRlhfRFdPUkQJCQltX0ZsYWdzOwogICAgIGludAkJCQkJbV9BbHBoYUZsYWc7CiAgICAgdm9pZCoJCQkJbV9wSWNjVHJhbnNmb3JtOwotICAgIEZYX0JPT0wJCQkJbV9iUmdiQnl0ZU9yZGVyOworICAgIGJvb2wJCQkJbV9iUmdiQnl0ZU9yZGVyOwogICAgIGludAkJCQkJbV9CbGVuZFR5cGU7CiB9OwogCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhnZS9meF9mb250LmggYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9mb250LmgKaW5kZXggMjgzMmZiZi4uMjBlZjVkNCAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZm9udC5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2ZvbnQuaApAQCAtNTYsMTIgKzU2LDEyIEBACiAgICAgQ0ZYX0ZvbnQoKTsKICAgICB+Q0ZYX0ZvbnQoKTsKIAotICAgIEZYX0JPT0wJCQkJCUxvYWRTdWJzdChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBGWF9CT09MIGJUcnVlVHlwZSwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGludCBpdGFsaWNfYW5nbGUsIGludCBDaGFyc2V0Q1AsIEZYX0JPT0wgYlZlcnRpY2FsID0gRkFMU0UpOworICAgIGJvb2wJCQkJCUxvYWRTdWJzdChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBib29sIGJUcnVlVHlwZSwgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGludCBpdGFsaWNfYW5nbGUsIGludCBDaGFyc2V0Q1AsIGJvb2wgYlZlcnRpY2FsID0gZmFsc2UpOwogCi0gICAgRlhfQk9PTAkJCQkJTG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIEZYX0RXT1JEIHNpemUpOworICAgIGJvb2wJCQkJCUxvYWRFbWJlZGRlZChjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplKTsKIAotICAgIEZYX0JPT0wJCQkJCUxvYWRGaWxlKElGWF9GaWxlUmVhZCogcEZpbGUpOworICAgIGJvb2wJCQkJCUxvYWRGaWxlKElGWF9GaWxlUmVhZCogcEZpbGUpOwogCiAgICAgRlhGVF9GYWNlCQkJCUdldEZhY2UoKSBjb25zdAogICAgIHsKQEAgLTgyLDE1ICs4MiwxNSBAQAogCiAgICAgaW50CQkJCQkJR2V0RGVzY2VudCgpIGNvbnN0OwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgR2V0R2x5cGhCQm94KEZYX0RXT1JEIGdseXBoX2luZGV4LCBGWF9SRUNUICZiYm94KTsKKyAgICBib29sICAgICAgICAgICAgICAgICBHZXRHbHlwaEJCb3goRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIEZYX1JFQ1QgJmJib3gpOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgSXNJdGFsaWMoKTsKKyAgICBib29sICAgICAgICAgICAgICAgICBJc0l0YWxpYygpOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgSXNCb2xkKCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgSXNCb2xkKCk7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBJc0ZpeGVkV2lkdGgoKTsKKyAgICBib29sICAgICAgICAgICAgICAgICBJc0ZpeGVkV2lkdGgoKTsKIAotICAgIEZYX0JPT0wJCQkJCUlzVmVydGljYWwoKSBjb25zdAorICAgIGJvb2wJCQkJCUlzVmVydGljYWwoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYlZlcnRpY2FsOwogICAgIH0KQEAgLTEwMyw5ICsxMDMsOSBAQAogICAgIENGWF9CeXRlU3RyaW5nICAgICAgICAgIEdldEZhY2VOYW1lKCkgY29uc3Q7CiAKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIElzVFRGb250KCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgSXNUVEZvbnQoKTsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIEdldEJCb3goRlhfUkVDVCAmYmJveCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgR2V0QkJveChGWF9SRUNUICZiYm94KTsKIAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIEdldEhlaWdodCgpOwogCkBAIC0xMTgsNyArMTE4LDcgQEAKICAgICBGWEZUX0ZhY2UJCQkJbV9GYWNlOwogCiAgICAgQ0ZYX1N1YnN0Rm9udCoJCQltX3BTdWJzdEZvbnQ7Ci0gICAgRlhfQk9PTAkJCQkJSXNFbWJlZGRlZCgpCisgICAgYm9vbAkJCQkJSXNFbWJlZGRlZCgpCiAgICAgewogICAgICAgICByZXR1cm4gbV9iRW1iZWRkZWQ7CiAgICAgfQpAQCAtMTMzLDE0ICsxMzMsMTQgQEAKICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtX3BQbGF0Zm9ybUZvbnQ7CiAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgbV9wUGxhdGZvcm1Gb250Q29sbGVjdGlvbjsKICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtX3BEd0ZvbnQ7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgbV9iRHdMb2FkZWQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgbV9iRHdMb2FkZWQ7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgUmVsZWFzZVBsYXRmb3JtUmVzb3VyY2UoKTsKIAogICAgIHZvaWQJCQkJCURlbGV0ZUZhY2UoKTsKIHByb3RlY3RlZDoKIAotICAgIEZYX0JPT0wJCQkJCW1fYkVtYmVkZGVkOwotICAgIEZYX0JPT0wJCQkJCW1fYlZlcnRpY2FsOworICAgIGJvb2wJCQkJCW1fYkVtYmVkZGVkOworICAgIGJvb2wJCQkJCW1fYlZlcnRpY2FsOwogICAgIHZvaWQqCQkJCQltX3BPd25lZFN0cmVhbTsKIH07CiAjZGVmaW5lIEVOQ09ESU5HX0lOVEVSTkFMCQkwCkBAIC0xODIsMTEgKzE4MiwxMSBAQAogCiAgICAgaW50CQkJCQkJbV9JdGFsaWNBbmdsZTsKIAotICAgIEZYX0JPT0wJCQkJCW1fYlN1YnN0T2ZDSks7CisgICAgYm9vbAkJCQkJbV9iU3Vic3RPZkNKSzsKIAogICAgIGludAkJCQkJCW1fV2VpZ2h0Q0pLOwogCi0gICAgRlhfQk9PTAkJCQkJbV9iSXRsaWNDSks7CisgICAgYm9vbAkJCQkJbV9iSXRsaWNDSks7CiB9OwogI2RlZmluZSBGWF9GT05UX0ZMQUdfU0VSSUYgICAgICAgICAgICAgIDB4MDEKICNkZWZpbmUgRlhfRk9OVF9GTEFHX0ZJWEVEUElUQ0gJCQkweDAyCkBAIC0yMDYsOSArMjA2LDkgQEAKICAgICB+Q0ZYX0ZvbnRNZ3IoKTsKICAgICB2b2lkCQkJSW5pdEZUTGlicmFyeSgpOwogICAgIEZYRlRfRmFjZQkJR2V0Q2FjaGVkRmFjZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgdWludDhfdComIHBGb250RGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCB1aW50OF90KiYgcEZvbnREYXRhKTsKICAgICBGWEZUX0ZhY2UJCUFkZENhY2hlZEZhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBpbnQgZmFjZV9pbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgaW50IGZhY2VfaW5kZXgpOwogICAgIEZYRlRfRmFjZQkJR2V0Q2FjaGVkVFRDRmFjZShpbnQgdHRjX3NpemUsIEZYX0RXT1JEIGNoZWNrc3VtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb250X29mZnNldCwgdWludDhfdComIHBGb250RGF0YSk7CiAgICAgRlhGVF9GYWNlCQlBZGRDYWNoZWRUVENGYWNlKGludCB0dGNfc2l6ZSwgRlhfRFdPUkQgY2hlY2tzdW0sCkBAIC0yMTcsMTIgKzIxNywxMiBAQAogICAgIEZYRlRfRmFjZQkJR2V0Rml4ZWRGYWNlKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBpbnQgZmFjZV9pbmRleCk7CiAgICAgdm9pZAkJCVJlbGVhc2VGYWNlKEZYRlRfRmFjZSBmYWNlKTsKICAgICB2b2lkCQkJU2V0U3lzdGVtRm9udEluZm8oSUZYX1N5c3RlbUZvbnRJbmZvKiBwRm9udEluZm8pOwotICAgIEZYRlRfRmFjZQkJRmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBGWF9CT09MIGJUcnVlVHlwZSwgRlhfRFdPUkQgZmxhZ3MsCisgICAgRlhGVF9GYWNlCQlGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsIGJvb2wgYlRydWVUeXBlLCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBpbnQgaXRhbGljX2FuZ2xlLCBpbnQgQ2hhcnNldENQLCBDRlhfU3Vic3RGb250KiBwU3Vic3RGb250KTsKIAogICAgIHZvaWQJCQlGcmVlQ2FjaGUoKTsKIAotICAgIEZYX0JPT0wJCQlHZXRTdGFuZGFyZEZvbnQoY29uc3QgdWludDhfdComIHBGb250RGF0YSwgRlhfRFdPUkQmIHNpemUsIGludCBpbmRleCk7CisgICAgYm9vbAkJCUdldFN0YW5kYXJkRm9udChjb25zdCB1aW50OF90KiYgcEZvbnREYXRhLCBGWF9EV09SRCYgc2l6ZSwgaW50IGluZGV4KTsKICAgICBDRlhfRm9udE1hcHBlcioJbV9wQnVpbHRpbk1hcHBlcjsKICAgICBJRlhfRm9udE1hcHBlcioJbV9wRXh0TWFwcGVyOwogICAgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHIJbV9GYWNlTWFwOwpAQCAtMjM1LDcgKzIzNSw3IEBACiAKICAgICB2aXJ0dWFsIH5JRlhfRm9udE1hcHBlcigpIHt9CiAKLSAgICB2aXJ0dWFsIEZYRlRfRmFjZQlGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsIEZYX0JPT0wgYlRydWVUeXBlLCBGWF9EV09SRCBmbGFncywKKyAgICB2aXJ0dWFsIEZYRlRfRmFjZQlGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsIGJvb2wgYlRydWVUeXBlLCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgaW50IGl0YWxpY19hbmdsZSwgaW50IENoYXJzZXRDUCwgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCkgPSAwOwogCiAgICAgQ0ZYX0ZvbnRNZ3IqCQltX3BGb250TWdyOwpAQCAtMjc3LDE0ICsyNzcsMTQgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BGb250RW51bWVyYXRvcjsKICAgICB9Ci0gICAgdmlydHVhbCBGWEZUX0ZhY2UJRmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBGWF9CT09MIGJUcnVlVHlwZSwgRlhfRFdPUkQgZmxhZ3MsCisgICAgdmlydHVhbCBGWEZUX0ZhY2UJRmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBib29sIGJUcnVlVHlwZSwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGludCBpdGFsaWNfYW5nbGUsIGludCBDaGFyc2V0Q1AsIENGWF9TdWJzdEZvbnQqIHBTdWJzdEZvbnQpOwogcHJpdmF0ZToKICAgICBDRlhfQnl0ZVN0cmluZwkJR2V0UFNOYW1lRnJvbVRUKHZvaWQqIGhGb250KTsKICAgICBDRlhfQnl0ZVN0cmluZwkJTWF0Y2hJbnN0YWxsZWRGb250cyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbm9ybV9uYW1lKTsKICAgICBGWEZUX0ZhY2UJCQlVc2VJbnRlcm5hbFN1YnN0KENGWF9TdWJzdEZvbnQqIHBTdWJzdEZvbnQsIGludCBpQmFzZUZvbnQsIGludCBpdGFsaWNfYW5nbGUsIGludCB3ZWlnaHQsIGludCBwaWN0aGZhbWlseSk7CiAKLSAgICBGWF9CT09MCQkJCW1fYkxpc3RMb2FkZWQ7CisgICAgYm9vbAkJCQltX2JMaXN0TG9hZGVkOwogICAgIEZYRlRfRmFjZQkJCW1fTU1GYWNlc1syXTsKICAgICBDRlhfQnl0ZVN0cmluZwkJbV9MYXN0RmFtaWx5OwogICAgIENGWF9EV29yZEFycmF5CQltX0NoYXJzZXRBcnJheTsKQEAgLTI5OSwxMiArMjk5LDEyIEBACiAgICAgc3RhdGljIElGWF9TeXN0ZW1Gb250SW5mbyoJQ3JlYXRlRGVmYXVsdCgpOwogICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpID0gMDsKIAotICAgIHZpcnR1YWwJRlhfQk9PTAkJRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkKgkJTWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYWNlLCBpbnQmIGlFeGFjdCkgPSAwOworICAgIHZpcnR1YWwJYm9vbAkJRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSA9IDA7CisgICAgdmlydHVhbCB2b2lkKgkJTWFwRm9udChpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYWNlLCBpbnQmIGlFeGFjdCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCoJCUdldEZvbnQoY29uc3QgRlhfQ0hBUiogZmFjZSkgPSAwOwogICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0Rm9udERhdGEodm9pZCogaEZvbnQsIEZYX0RXT1JEIHRhYmxlLCB1aW50OF90KiBidWZmZXIsIEZYX0RXT1JEIHNpemUpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSA9IDA7CisgICAgdmlydHVhbCBib29sCQlHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KSA9IDA7CiAgICAgdmlydHVhbCBpbnQJCQlHZXRGYWNlSW5kZXgodm9pZCogaEZvbnQpCiAgICAgewogICAgICAgICByZXR1cm4gMDsKQEAgLTMyNiwxNSArMzI2LDE1IEBACiAKICAgICAvLyBJRlhfU3l0ZW1Gb250SW5mbzoKICAgICB2b2lkIFJlbGVhc2UoKSBvdmVycmlkZTsKLSAgICBGWF9CT09MIEVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcikgb3ZlcnJpZGU7Ci0gICAgdm9pZCogTWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LAorICAgIGJvb2wgRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSBvdmVycmlkZTsKKyAgICB2b2lkKiBNYXBGb250KGludCB3ZWlnaHQsIGJvb2wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksCiAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBmYWNlLCBpbnQmIGJFeGFjdCkgb3ZlcnJpZGU7CiAgICAgdm9pZCogR2V0Rm9udChjb25zdCBGWF9DSEFSKiBmYWNlKSBvdmVycmlkZTsKICAgICBGWF9EV09SRCBHZXRGb250RGF0YSh2b2lkKiBoRm9udCwgRlhfRFdPUkQgdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYnVmZmVyLCBGWF9EV09SRCBzaXplKSBvdmVycmlkZTsKICAgICB2b2lkIERlbGV0ZUZvbnQodm9pZCogaEZvbnQpIG92ZXJyaWRlOwotICAgIEZYX0JPT0wgR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSBvdmVycmlkZTsKLSAgICBGWF9CT09MIEdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpIG92ZXJyaWRlOworICAgIGJvb2wgR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSBvdmVycmlkZTsKKyAgICBib29sIEdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpIG92ZXJyaWRlOwogCiBwcm90ZWN0ZWQ6CiAgICAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgltX0ZvbnRMaXN0OwpAQCAtMzU3LDcgKzM1Nyw3IEBACiAgICAgfkNGWF9Gb250Q2FjaGUoKTsKICAgICBDRlhfRmFjZUNhY2hlKgkJCUdldENhY2hlZEZhY2UoQ0ZYX0ZvbnQqIHBGb250KTsKICAgICB2b2lkCQkJCQlSZWxlYXNlQ2FjaGVkRmFjZShDRlhfRm9udCogcEZvbnQpOwotICAgIHZvaWQJCQkJCUZyZWVDYWNoZShGWF9CT09MIGJSZWxlYXNlID0gRkFMU0UpOworICAgIHZvaWQJCQkJCUZyZWVDYWNoZShib29sIGJSZWxlYXNlID0gZmFsc2UpOwogCiBwcml2YXRlOgogICAgIHVzaW5nIENGWF9GVENhY2hlTWFwID0gc3RkOjptYXA8RlhGVF9GYWNlLCBDRlhfQ291bnRlZEZhY2VDYWNoZSo+OwpAQCAtMzkxLDcgKzM5MSw3IEBACiB7CiBwdWJsaWM6CiAgICAgfkNGWF9GYWNlQ2FjaGUoKTsKLSAgICBjb25zdCBDRlhfR2x5cGhCaXRtYXAqCUxvYWRHbHlwaEJpdG1hcChDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIGdseXBoX2luZGV4LCBGWF9CT09MIGJGb250U3R5bGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgY29uc3QgQ0ZYX0dseXBoQml0bWFwKglMb2FkR2x5cGhCaXRtYXAoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgYm9vbCBiRm9udFN0eWxlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGFudGlfYWxpYXMsIGludCYgdGV4dF9mbGFncyk7CiAgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKgkJTG9hZEdseXBoUGF0aChDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIGdseXBoX2luZGV4LCBpbnQgZGVzdF93aWR0aCk7CiAKQEAgLTM5OSwxMiArMzk5LDEyIEBACiAgICAgQ0ZYX0ZhY2VDYWNoZShGWEZUX0ZhY2UgZmFjZSk7CiBwcml2YXRlOgogICAgIEZYRlRfRmFjZQkJCQltX0ZhY2U7Ci0gICAgQ0ZYX0dseXBoQml0bWFwKgkJUmVuZGVyR2x5cGgoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfQk9PTCBiRm9udFN0eWxlLAorICAgIENGWF9HbHlwaEJpdG1hcCoJCVJlbmRlckdseXBoKENGWF9Gb250KiBwRm9udCwgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIGJvb2wgYkZvbnRTdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBpbnQgZGVzdF93aWR0aCwgaW50IGFudGlfYWxpYXMpOwogICAgIENGWF9HbHlwaEJpdG1hcCoJCVJlbmRlckdseXBoX05hdGl2ZXRleHQoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwKICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIGludCBkZXN0X3dpZHRoLCBpbnQgYW50aV9hbGlhcyk7CiAgICAgQ0ZYX0dseXBoQml0bWFwKiAgICAgICAgTG9va1VwR2x5cGhCaXRtYXAoQ0ZYX0ZvbnQqIHBGb250LCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBDRlhfQnl0ZVN0cmluZ0MmIEZhY2VHbHlwaHNLZXksCi0gICAgICAgICAgICBGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfQk9PTCBiRm9udFN0eWxlLCBpbnQgZGVzdF93aWR0aCwgaW50IGFudGlfYWxpYXMpOworICAgICAgICAgICAgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIGJvb2wgYkZvbnRTdHlsZSwgaW50IGRlc3Rfd2lkdGgsIGludCBhbnRpX2FsaWFzKTsKICAgICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyCW1fU2l6ZU1hcDsKICAgICBDRlhfTWFwUHRyVG9QdHIJCQltX1BhdGhNYXA7CiAgICAgQ0ZYX0RJQml0bWFwKiAgICAgICAgICAgbV9wQml0bWFwOwpAQCAtNDE4LDE2ICs0MTgsMTYgQEAKICAgICBGWF9GTE9BVAkJCW1fZk9yaWdpblgsIG1fZk9yaWdpblk7CiB9IEZYVEVYVF9HTFlQSFBPUzsKIEZYX1JFQ1QgRlhHRV9HZXRHbHlwaHNCQm94KEZYVEVYVF9HTFlQSFBPUyogcEdseXBoQW5kUG9zLCBpbnQgbkNoYXJzLCBpbnQgYW50aV9hbGlhcywgRlhfRkxPQVQgcmV0aW5hU2NhbGVYID0gMS4wZiwgRlhfRkxPQVQgcmV0aW5hU2NhbGVZID0gMS4wZik7Ci1GWF9CT09MCU91dHB1dEdseXBoKHZvaWQqIGRpYiwgaW50IHgsIGludCB5LCBDRlhfRm9udCogcEZvbnQsIGRvdWJsZSBmb250X3NpemUsCitib29sCU91dHB1dEdseXBoKHZvaWQqIGRpYiwgaW50IHgsIGludCB5LCBDRlhfRm9udCogcEZvbnQsIGRvdWJsZSBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIHVuc2lnbmVkIGxvbmcgZ2x5cGhfaW5kZXgsIHVuc2lnbmVkIGxvbmcgYXJnYik7Ci1GWF9CT09MCU91dHB1dFRleHQodm9pZCogZGliLCBpbnQgeCwgaW50IHksIENGWF9Gb250KiBwRm9udCwgZG91YmxlIGZvbnRfc2l6ZSwKK2Jvb2wJT3V0cHV0VGV4dCh2b2lkKiBkaWIsIGludCB4LCBpbnQgeSwgQ0ZYX0ZvbnQqIHBGb250LCBkb3VibGUgZm9udF9zaXplLAogICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0X21hdHJpeCwgdW5zaWduZWQgc2hvcnQgY29uc3QqIHRleHQsIHVuc2lnbmVkIGxvbmcgYXJnYik7CiBjbGFzcyBJRlhfR1NVQlRhYmxlCiB7CiBwdWJsaWM6CiAgICAgc3RhdGljIElGWF9HU1VCVGFibGUqIENyZWF0ZShDRlhfRm9udCogcEZvbnQpOwogICAgIHZpcnR1YWwgfklGWF9HU1VCVGFibGUoKSB7IH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgR2V0VmVydGljYWxHbHlwaChGWF9EV09SRCBnbHlwaG51bSwgRlhfRFdPUkQqIHZnbHlwaG51bSkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBHZXRWZXJ0aWNhbEdseXBoKEZYX0RXT1JEIGdseXBobnVtLCBGWF9EV09SRCogdmdseXBobnVtKSA9IDA7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWEdFX0ZYX0ZPTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmggYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oCmluZGV4IGZkOWMxNDguLjU5NjU2NDEgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaApAQCAtMTkzLDExICsxOTMsMTEgQEAKIAogICAgIHZvaWQJCQkJVHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgpOwogCi0gICAgRlhfQk9PTAkJCQlJc1JlY3QoKSBjb25zdDsKKyAgICBib29sCQkJCUlzUmVjdCgpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQlHZXRaZXJvQXJlYVBhdGgoQ0ZYX1BhdGhEYXRhJiBOZXdQYXRoLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9CT09MJmJUaGluLCBGWF9CT09MIGJBZGp1c3QpIGNvbnN0OworICAgIGJvb2wJCQkJR2V0WmVyb0FyZWFQYXRoKENGWF9QYXRoRGF0YSYgTmV3UGF0aCwgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgYm9vbCZiVGhpbiwgYm9vbCBiQWRqdXN0KSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQkJSXNSZWN0KGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIENGWF9GbG9hdFJlY3QqIHJlY3QpIGNvbnN0OworICAgIGJvb2wJCQkJSXNSZWN0KGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIENGWF9GbG9hdFJlY3QqIHJlY3QpIGNvbnN0OwogCiAgICAgdm9pZCBBcHBlbmQoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwU3JjLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KTsKICAgICB2b2lkIEFwcGVuZFJlY3QoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgYm90dG9tLCBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgdG9wKTsKQEAgLTI5NCwxMCArMjk0LDEwIEBACiAgICAgRlhfRFdPUkQJCQltX0dseXBoSW5kZXg7CiAgICAgRlhfRkxPQVQJCQltX09yaWdpblgsIG1fT3JpZ2luWTsKICAgICBpbnQJCQkJCW1fRm9udENoYXJXaWR0aDsKLSAgICBGWF9CT09MCQkJCW1fYkdseXBoQWRqdXN0OworICAgIGJvb2wJCQkJbV9iR2x5cGhBZGp1c3Q7CiAgICAgRlhfRkxPQVQJCQltX0FkanVzdE1hdHJpeFs0XTsKICAgICBGWF9EV09SRAkJCW1fRXh0R0lEOwotICAgIEZYX0JPT0wJCQkJbV9iRm9udFN0eWxlOworICAgIGJvb2wJCQkJbV9iRm9udFN0eWxlOwogfSBGWFRFWFRfQ0hBUlBPUzsKIGNsYXNzIENGWF9SZW5kZXJEZXZpY2UKIHsKQEAgLTMxMyw3ICszMTMsNyBAQAogICAgICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQlTdGFydFJlbmRlcmluZygpOworICAgIGJvb2wJCQlTdGFydFJlbmRlcmluZygpOwogCiAgICAgdm9pZAkJCUVuZFJlbmRlcmluZygpOwogCkBAIC0zMjEsNyArMzIxLDcgQEAKIAogICAgIHZvaWQJCQlTYXZlU3RhdGUoKTsKIAotICAgIHZvaWQJCQlSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkID0gRkFMU0UpOworICAgIHZvaWQJCQlSZXN0b3JlU3RhdGUoYm9vbCBiS2VlcFNhdmVkID0gZmFsc2UpOwogCiAKIApAQCAtMzY1LDI2ICszNjUsMjYgQEAKICAgICAgICAgbV9wQml0bWFwID0gcEJpdG1hcDsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcChDRlhfRElCaXRtYXAqIHBESUIsIGludCB3aWR0aCwgaW50IGhlaWdodCkgY29uc3Q7CisgICAgYm9vbAkJCUNyZWF0ZUNvbXBhdGlibGVCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwRElCLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIGNvbnN0OwogCiAgICAgY29uc3QgRlhfUkVDVCYJR2V0Q2xpcEJveCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9DbGlwQm94OwogICAgIH0KIAotICAgIEZYX0JPT0wJCQlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIGJvb2wJCQlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKLSAgICBGWF9CT09MCQkJU2V0Q2xpcF9SZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0KTsKKyAgICBib29sCQkJU2V0Q2xpcF9SZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0KTsKIAotICAgIEZYX0JPT0wJCQlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgYm9vbAkJCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogCi0gICAgRlhfQk9PTAkJCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIGJvb2wJCQlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCkBAIC0zOTUsNDYgKzM5NSw0NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTAogICAgICAgICAgICAgICAgICAgICAgICk7CiAKLSAgICBGWF9CT09MCQkJU2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwKKyAgICBib29sCQkJU2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGNvbG9yLAorICAgIGJvb2wJCQlGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKIAotICAgIEZYX0JPT0wJCQlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKKyAgICBib29sCQkJRHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSA9IDAsIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKIAotICAgIEZYX0JPT0wJCQlHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICAgIGJvb2wJCQlHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCiAgICAgQ0ZYX0RJQml0bWFwKiAgIEdldEJhY2tEcm9wKCk7CiAKLSAgICBGWF9CT09MCQkJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCwKKyAgICBib29sCQkJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LAorICAgIGJvb2wJCQlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKIAotICAgIEZYX0JPT0wJCQlTZXRCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBGWF9EV09SRCBjb2xvciwKKyAgICBib29sCQkJU2V0Qml0TWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJU3RyZXRjaEJpdE1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsCisgICAgYm9vbAkJCVN0cmV0Y2hCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwgRlhfRFdPUkQgZmxhZ3MgPSAwLCBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKKyAgICBib29sCQkJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGZsYWdzLCB2b2lkKiYgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CiAKLSAgICBGWF9CT09MCQkJQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgYm9vbAkJCUNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpOwogCiAgICAgdm9pZAkJCUNhbmNlbERJQml0cyh2b2lkKiBoYW5kbGUpOwogCi0gICAgRlhfQk9PTAkJCURyYXdOb3JtYWxUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICBib29sCQkJRHJhd05vcm1hbFRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsIEZYX0RXT1JEIHRleHRfZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCURyYXdUZXh0UGF0aChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCisgICAgYm9vbAkJCURyYXdUZXh0UGF0aChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHQyVXNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKQEAgLTQ3NywxMiArNDc3LDEyIEBACiAKICAgICB+Q0ZYX0Z4Z2VEZXZpY2UoKTsKIAotICAgIEZYX0JPT0wJCQlBdHRhY2goQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMgPSAwLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlID0gTlVMTCwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCA9IEZBTFNFKTsKKyAgICBib29sCQkJQXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzID0gMCwgYm9vbCBiUmdiQnl0ZU9yZGVyID0gZmFsc2UsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSA9IE5VTEwsIGJvb2wgYkdyb3VwS25vY2tvdXQgPSBmYWxzZSk7CiAKLSAgICBGWF9CT09MCQkJQ3JlYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IGZvcm1hdCwgaW50IGRpdGhlcl9iaXRzID0gMCwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlID0gTlVMTCk7CisgICAgYm9vbAkJCUNyZWF0ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQsIGludCBkaXRoZXJfYml0cyA9IDAsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSA9IE5VTEwpOwogcHJvdGVjdGVkOgogCi0gICAgRlhfQk9PTAkJCW1fYk93bmVkQml0bWFwOworICAgIGJvb2wJCQltX2JPd25lZEJpdG1hcDsKIH07CiBjbGFzcyBDRlhfU2tpYURldmljZSA6IHB1YmxpYyBDRlhfUmVuZGVyRGV2aWNlCiB7CkBAIC00OTIsMTkgKzQ5MiwxOSBAQAogCiAgICAgfkNGWF9Ta2lhRGV2aWNlKCk7CiAKLSAgICBGWF9CT09MCQkJQXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzID0gMCwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyID0gRkFMU0UsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSA9IE5VTEwsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQgPSBGQUxTRSk7CisgICAgYm9vbAkJCUF0dGFjaChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkaXRoZXJfYml0cyA9IDAsIGJvb2wgYlJnYkJ5dGVPcmRlciA9IGZhbHNlLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UgPSBOVUxMLCBib29sIGJHcm91cEtub2Nrb3V0ID0gZmFsc2UpOwogCi0gICAgRlhfQk9PTAkJCUNyZWF0ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQsIGludCBkaXRoZXJfYml0cyA9IDAsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSA9IE5VTEwpOworICAgIGJvb2wJCQlDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCBpbnQgZGl0aGVyX2JpdHMgPSAwLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UgPSBOVUxMKTsKIHByb3RlY3RlZDoKIAotICAgIEZYX0JPT0wJCQltX2JPd25lZEJpdG1hcDsKKyAgICBib29sCQkJbV9iT3duZWRCaXRtYXA7CiB9OwogY2xhc3MgSUZYX1JlbmRlckRldmljZURyaXZlcgogewogcHVibGljOgogCi0gICAgc3RhdGljIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqCQlDcmVhdGVGeGdlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyID0gRkFMU0UsCi0gICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UgPSBOVUxMLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0ID0gRkFMU0UpOworICAgIHN0YXRpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKgkJQ3JlYXRlRnhnZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGJvb2wgYlJnYkJ5dGVPcmRlciA9IGZhbHNlLAorICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlID0gTlVMTCwgYm9vbCBiR3JvdXBLbm9ja291dCA9IGZhbHNlKTsKIAogICAgIHZpcnR1YWwgfklGWF9SZW5kZXJEZXZpY2VEcml2ZXIoKSB7fQogICAgIHZpcnR1YWwgdm9pZCBCZWdpbigpIHsgfQpAQCAtNTE3LDE0ICs1MTcsMTQgQEAKICAgICAgICAgcmV0dXJuIENGWF9NYXRyaXgoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wgSXNQU1ByaW50RHJpdmVyKCkKKyAgICB2aXJ0dWFsIGJvb2wgSXNQU1ByaW50RHJpdmVyKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHZpcnR1YWwgRlhfQk9PTAlTdGFydFJlbmRlcmluZygpCisgICAgdmlydHVhbCBib29sCVN0YXJ0UmVuZGVyaW5nKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQJRW5kUmVuZGVyaW5nKCkge30KQEAgLTUzNCwyMyArNTM0LDIzIEBACiAKICAgICB2aXJ0dWFsIHZvaWQJU2F2ZVN0YXRlKCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCVJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQgPSBGQUxTRSkgPSAwOworICAgIHZpcnR1YWwgdm9pZAlSZXN0b3JlU3RhdGUoYm9vbCBiS2VlcFNhdmVkID0gZmFsc2UpID0gMDsKIAogCi0gICAgdmlydHVhbCBGWF9CT09MCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCBib29sCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIHZpcnR1YWwgYm9vbAlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIHZpcnR1YWwgYm9vbAlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCkBAIC01NjEsNTkgKzU2MSw1OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCVNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsCisgICAgdmlydHVhbCBib29sCVNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpCiAgICAgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wgRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsCisgICAgdmlydHVhbCBib29sIEZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LCBGWF9EV09SRCBmaWxsX2NvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHZpcnR1YWwgRlhfQk9PTAlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKKyAgICB2aXJ0dWFsIGJvb2wJRHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpCiAgICAgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBGWF9CT09MIGJERWRnZSA9IEZBTFNFKQorICAgIHZpcnR1YWwgYm9vbAlHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGJvb2wgYkRFZGdlID0gZmFsc2UpCiAgICAgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgdmlydHVhbCBDRlhfRElCaXRtYXAqICAgR2V0QmFja0Ryb3AoKQogICAgIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCVNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCisgICAgdmlydHVhbCBib29sCVNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCBibGVuZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCVN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKKyAgICB2aXJ0dWFsIGJvb2wJU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKKyAgICB2aXJ0dWFsIGJvb2wJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGZsYWdzLCB2b2lkKiYgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCUNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCisgICAgdmlydHVhbCBib29sCUNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCiAgICAgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQJQ2FuY2VsRElCaXRzKHZvaWQqIGhhbmRsZSkge30KIAotICAgIHZpcnR1YWwgRlhfQk9PTCBEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKKyAgICB2aXJ0dWFsIGJvb2wgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpCiAgICAgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQqCUdldFBsYXRmb3JtU3VyZmFjZSgpCkBAIC02NDYsMTMgKzY0NiwxMyBAQAogCiAgICAgfkNGWF9QU1JlbmRlcmVyKCk7CiAKLSAgICB2b2lkCQkJSW5pdChJRlhfUFNPdXRwdXQqIHBPdXRwdXQsIGludCBwc19sZXZlbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWF9CT09MIGJDbXlrT3V0cHV0KTsKLSAgICBGWF9CT09MCQkJU3RhcnRSZW5kZXJpbmcoKTsKKyAgICB2b2lkCQkJSW5pdChJRlhfUFNPdXRwdXQqIHBPdXRwdXQsIGludCBwc19sZXZlbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIGJDbXlrT3V0cHV0KTsKKyAgICBib29sCQkJU3RhcnRSZW5kZXJpbmcoKTsKICAgICB2b2lkCQkJRW5kUmVuZGVyaW5nKCk7CiAKICAgICB2b2lkCQkJU2F2ZVN0YXRlKCk7CiAKLSAgICB2b2lkCQkJUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCA9IEZBTFNFKTsKKyAgICB2b2lkCQkJUmVzdG9yZVN0YXRlKGJvb2wgYktlZXBTYXZlZCA9IGZhbHNlKTsKIAogICAgIHZvaWQJCQlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLApAQCAtNjY5LDcgKzY2OSw3IEBACiAgICAgICAgIHJldHVybiBtX0NsaXBCb3g7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIGJvb2wJCQlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCkBAIC02NzksMTggKzY3OSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICk7CiAKLSAgICBGWF9CT09MCQkJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisgICAgYm9vbAkJCVNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorICAgIGJvb2wJCQlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJRHJhd0RJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwKKyAgICBib29sCQkJRHJhd0RJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlEcmF3VGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAorICAgIGJvb2wJCQlEcmF3VGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwgRlhfRkxPQVQgZm9udF9zaXplLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiBwcml2YXRlOgpAQCAtNzAxLDExICs3MDEsMTEgQEAKIAogICAgIENGWF9HcmFwaFN0YXRlRGF0YQltX0N1ckdyYXBoU3RhdGU7CiAKLSAgICBGWF9CT09MCQkJbV9iR3JhcGhTdGF0ZVNldDsKKyAgICBib29sCQkJbV9iR3JhcGhTdGF0ZVNldDsKIAotICAgIEZYX0JPT0wJCQltX2JDbXlrT3V0cHV0OworICAgIGJvb2wJCQltX2JDbXlrT3V0cHV0OwogCi0gICAgRlhfQk9PTAkJCW1fYkNvbG9yU2V0OworICAgIGJvb2wJCQltX2JDb2xvclNldDsKIAogICAgIEZYX0RXT1JECQltX0xhc3RDb2xvcjsKIApAQCAtNzE0LDcgKzcxNCw3IEBACiAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BTRm9udCo+CW1fUFNGb250TGlzdDsKIAogICAgIENGWF9BcnJheVRlbXBsYXRlPEZYX1JFQ1Q+CW1fQ2xpcEJveFN0YWNrOwotICAgIEZYX0JPT0wJCQltX2JJbml0ZWQ7CisgICAgYm9vbAkJCW1fYkluaXRlZDsKIAogICAgIHZvaWQJCQlPdXRwdXRQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX2FwcGxlLmggYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9nZV9hcHBsZS5oCmluZGV4IDBmYjhiZWQuLmViZTYxY2MgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX2FwcGxlLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2VfYXBwbGUuaApAQCAtMTMsMTUgKzEzLDE1IEBACiBwdWJsaWM6CiAgICAgQ0ZYX1F1YXJ0ekRldmljZSgpOwogICAgIH5DRlhfUXVhcnR6RGV2aWNlKCk7Ci0gICAgRlhfQk9PTCBBdHRhY2goQ0dDb250ZXh0UmVmIGNvbnRleHQsIGludDMyX3QgbkRldmljZUNsYXNzID0gRlhEQ19ESVNQTEFZKTsKLSAgICBGWF9CT09MIEF0dGFjaChDRlhfRElCaXRtYXAqIHBCaXRtYXApOwotICAgIEZYX0JPT0wgQ3JlYXRlKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0KTsKKyAgICBib29sIEF0dGFjaChDR0NvbnRleHRSZWYgY29udGV4dCwgaW50MzJfdCBuRGV2aWNlQ2xhc3MgPSBGWERDX0RJU1BMQVkpOworICAgIGJvb2wgQXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCk7CisgICAgYm9vbCBDcmVhdGUoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQpOwogCiAgICAgQ0dDb250ZXh0UmVmIEdldENvbnRleHQoKTsKIAogcHJvdGVjdGVkOgogICAgIENHQ29udGV4dFJlZiBtX3BDb250ZXh0OwotICAgIEZYX0JPT0wgbV9iT3duZWRCaXRtYXA7CisgICAgYm9vbCBtX2JPd25lZEJpdG1hcDsKIH07CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2Vfd2luMzIuaCBiL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX3dpbjMyLmgKaW5kZXggNWIxNjE0Ni4uODAyM2JkOCAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2Vfd2luMzIuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9nZV93aW4zMi5oCkBAIC03MiwxMyArNzIsMTMgQEAKIGNsYXNzIENGWF9XaW5kb3dzRGV2aWNlIDogcHVibGljIENGWF9SZW5kZXJEZXZpY2UKIHsKIHB1YmxpYzoKLSAgICBzdGF0aWMgSUZYX1JlbmRlckRldmljZURyaXZlcioJQ3JlYXRlRHJpdmVyKEhEQyBoREMsIEZYX0JPT0wgYkNteWtPdXRwdXQgPSBGQUxTRSk7CisgICAgc3RhdGljIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqCUNyZWF0ZURyaXZlcihIREMgaERDLCBib29sIGJDbXlrT3V0cHV0ID0gZmFsc2UpOwogCi0gICAgQ0ZYX1dpbmRvd3NEZXZpY2UoSERDIGhEQywgRlhfQk9PTCBiQ215a091dHB1dCA9IEZBTFNFLCBGWF9CT09MIGJGb3JjZVBTT3V0cHV0ID0gRkFMU0UsIGludCBwc0xldmVsID0gMik7CisgICAgQ0ZYX1dpbmRvd3NEZXZpY2UoSERDIGhEQywgYm9vbCBiQ215a091dHB1dCA9IGZhbHNlLCBib29sIGJGb3JjZVBTT3V0cHV0ID0gZmFsc2UsIGludCBwc0xldmVsID0gMik7CiAKICAgICBIREMJCUdldERDKCkgY29uc3Q7CiAKLSAgICBGWF9CT09MIG1fYkZvcmNlUFNPdXRwdXQ7CisgICAgYm9vbCBtX2JGb3JjZVBTT3V0cHV0OwogCiAgICAgc3RhdGljIGludCBtX3BzTGV2ZWw7CiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL3RoaXJkcGFydGllcy9saWJqcGVnL2ptb3JlY2ZnLmggYi9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvam1vcmVjZmcuaAppbmRleCA4OGQyMTA5Li5lMGE4NzFlIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvam1vcmVjZmcuaAorKysgYi9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvam1vcmVjZmcuaApAQCAtMjMwLDcgKzIzMCw3IEBACiAKIAogLyoKLSAqIE9uIGEgZmV3IHN5c3RlbXMsIHR5cGUgYm9vbGVhbiBhbmQvb3IgaXRzIHZhbHVlcyBGQUxTRSwgVFJVRSBtYXkgYXBwZWFyCisgKiBPbiBhIGZldyBzeXN0ZW1zLCB0eXBlIGJvb2xlYW4gYW5kL29yIGl0cyB2YWx1ZXMgZmFsc2UsIHRydWUgbWF5IGFwcGVhcgogICogaW4gc3RhbmRhcmQgaGVhZGVyIGZpbGVzLiAgT3IgeW91IG1heSBoYXZlIGNvbmZsaWN0cyB3aXRoIGFwcGxpY2F0aW9uLQogICogc3BlY2lmaWMgaGVhZGVyIGZpbGVzIHRoYXQgeW91IHdhbnQgdG8gaW5jbHVkZSB0b2dldGhlciB3aXRoIHRoZXNlIGZpbGVzLgogICogRGVmaW5pbmcgSEFWRV9CT09MRUFOIGJlZm9yZSBpbmNsdWRpbmcganBlZ2xpYi5oIHNob3VsZCBtYWtlIGl0IHdvcmsuCkBAIC0yMzksMTEgKzIzOSwxMSBAQAogI2lmbmRlZiBIQVZFX0JPT0xFQU4KIHR5cGVkZWYgaW50IGJvb2xlYW47CiAjZW5kaWYKLSNpZm5kZWYgRkFMU0UJCQkvKiBpbiBjYXNlIHRoZXNlIG1hY3JvcyBhbHJlYWR5IGV4aXN0ICovCi0jZGVmaW5lIEZBTFNFCTAJCS8qIHZhbHVlcyBvZiBib29sZWFuICovCisjaWZuZGVmIGZhbHNlCQkJLyogaW4gY2FzZSB0aGVzZSBtYWNyb3MgYWxyZWFkeSBleGlzdCAqLworI2RlZmluZSBmYWxzZQkwCQkvKiB2YWx1ZXMgb2YgYm9vbGVhbiAqLwogI2VuZGlmCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRQkxCisjaWZuZGVmIHRydWUKKyNkZWZpbmUgdHJ1ZQkxCiAjZW5kaWYKIAogCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvanBlZ2ludC5oIGIvY29yZS9pbmNsdWRlL3RoaXJkcGFydGllcy9saWJqcGVnL2pwZWdpbnQuaAppbmRleCA5NWIwMGQ0Li43NDVhNGMwIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvanBlZ2ludC5oCisrKyBiL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvbGlianBlZy9qcGVnaW50LmgKQEAgLTk1LDcgKzk1LDcgQEAKIAkJCSAgICAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAogCQkJICAgICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBfaW5kZXgpKTsKIAotICBib29sZWFuIG5lZWRfY29udGV4dF9yb3dzOwkvKiBUUlVFIGlmIG5lZWQgcm93cyBhYm92ZSAmIGJlbG93ICovCisgIGJvb2xlYW4gbmVlZF9jb250ZXh0X3Jvd3M7CS8qIHRydWUgaWYgbmVlZCByb3dzIGFib3ZlICYgYmVsb3cgKi8KIH07CiAKIC8qIEZvcndhcmQgRENUIChhbHNvIGNvbnRyb2xzIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbikgKi8KQEAgLTIxMyw3ICsyMTMsNyBAQAogCiAgIC8qIFRoaXMgaXMgaGVyZSB0byBzaGFyZSBjb2RlIGJldHdlZW4gYmFzZWxpbmUgYW5kIHByb2dyZXNzaXZlIGRlY29kZXJzOyAqLwogICAvKiBvdGhlciBtb2R1bGVzIHByb2JhYmx5IHNob3VsZCBub3QgdXNlIGl0ICovCi0gIGJvb2xlYW4gaW5zdWZmaWNpZW50X2RhdGE7CS8qIHNldCBUUlVFIGFmdGVyIGVtaXR0aW5nIHdhcm5pbmcgKi8KKyAgYm9vbGVhbiBpbnN1ZmZpY2llbnRfZGF0YTsJLyogc2V0IHRydWUgYWZ0ZXIgZW1pdHRpbmcgd2FybmluZyAqLwogfTsKIAogLyogSW52ZXJzZSBEQ1QgKGFsc28gcGVyZm9ybXMgZGVxdWFudGl6YXRpb24pICovCkBAIC0yMzksNyArMjM5LDcgQEAKIAkJCSAgIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAogCQkJICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOwogCi0gIGJvb2xlYW4gbmVlZF9jb250ZXh0X3Jvd3M7CS8qIFRSVUUgaWYgbmVlZCByb3dzIGFib3ZlICYgYmVsb3cgKi8KKyAgYm9vbGVhbiBuZWVkX2NvbnRleHRfcm93czsJLyogdHJ1ZSBpZiBuZWVkIHJvd3MgYWJvdmUgJiBiZWxvdyAqLwogfTsKIAogLyogQ29sb3JzcGFjZSBjb252ZXJzaW9uICovCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvanBlZ2xpYi5oIGIvY29yZS9pbmNsdWRlL3RoaXJkcGFydGllcy9saWJqcGVnL2pwZWdsaWIuaAppbmRleCA3ZGU1YWI3Li43ODgzMWFjIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvanBlZ2xpYi5oCisrKyBiL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvbGlianBlZy9qcGVnbGliLmgKQEAgLTE1MywxMiArMTUzLDEyIEBACiAgICAqIENBVVRJT046IElKRyB2ZXJzaW9ucyBwcmlvciB0byB2NmEga2VwdCB0aGlzIGFycmF5IGluIHppZ3phZyBvcmRlci4KICAgICovCiAgIFVJTlQxNiBxdWFudHZhbFtEQ1RTSVpFMl07CS8qIHF1YW50aXphdGlvbiBzdGVwIGZvciBlYWNoIGNvZWZmaWNpZW50ICovCi0gIC8qIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGR1cmluZyBjb21wcmVzc2lvbi4gIEl0J3MgaW5pdGlhbGl6ZWQgRkFMU0Ugd2hlbgotICAgKiB0aGUgdGFibGUgaXMgY3JlYXRlZCwgYW5kIHNldCBUUlVFIHdoZW4gaXQncyBiZWVuIG91dHB1dCB0byB0aGUgZmlsZS4KLSAgICogWW91IGNvdWxkIHN1cHByZXNzIG91dHB1dCBvZiBhIHRhYmxlIGJ5IHNldHRpbmcgdGhpcyB0byBUUlVFLgorICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBkdXJpbmcgY29tcHJlc3Npb24uICBJdCdzIGluaXRpYWxpemVkIGZhbHNlIHdoZW4KKyAgICogdGhlIHRhYmxlIGlzIGNyZWF0ZWQsIGFuZCBzZXQgdHJ1ZSB3aGVuIGl0J3MgYmVlbiBvdXRwdXQgdG8gdGhlIGZpbGUuCisgICAqIFlvdSBjb3VsZCBzdXBwcmVzcyBvdXRwdXQgb2YgYSB0YWJsZSBieSBzZXR0aW5nIHRoaXMgdG8gdHJ1ZS4KICAgICogKFNlZSBqcGVnX3N1cHByZXNzX3RhYmxlcyBmb3IgYW4gZXhhbXBsZS4pCiAgICAqLwotICBib29sZWFuIHNlbnRfdGFibGU7CQkvKiBUUlVFIHdoZW4gdGFibGUgaGFzIGJlZW4gb3V0cHV0ICovCisgIGJvb2xlYW4gc2VudF90YWJsZTsJCS8qIHRydWUgd2hlbiB0YWJsZSBoYXMgYmVlbiBvdXRwdXQgKi8KIH0gSlFVQU5UX1RCTDsKIAogCkBAIC0xNjksMTIgKzE2OSwxMiBAQAogICBVSU5UOCBiaXRzWzE3XTsJCS8qIGJpdHNba10gPSAjIG9mIHN5bWJvbHMgd2l0aCBjb2RlcyBvZiAqLwogCQkJCS8qIGxlbmd0aCBrIGJpdHM7IGJpdHNbMF0gaXMgdW51c2VkICovCiAgIFVJTlQ4IGh1ZmZ2YWxbMjU2XTsJCS8qIFRoZSBzeW1ib2xzLCBpbiBvcmRlciBvZiBpbmNyIGNvZGUgbGVuZ3RoICovCi0gIC8qIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGR1cmluZyBjb21wcmVzc2lvbi4gIEl0J3MgaW5pdGlhbGl6ZWQgRkFMU0Ugd2hlbgotICAgKiB0aGUgdGFibGUgaXMgY3JlYXRlZCwgYW5kIHNldCBUUlVFIHdoZW4gaXQncyBiZWVuIG91dHB1dCB0byB0aGUgZmlsZS4KLSAgICogWW91IGNvdWxkIHN1cHByZXNzIG91dHB1dCBvZiBhIHRhYmxlIGJ5IHNldHRpbmcgdGhpcyB0byBUUlVFLgorICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBkdXJpbmcgY29tcHJlc3Npb24uICBJdCdzIGluaXRpYWxpemVkIGZhbHNlIHdoZW4KKyAgICogdGhlIHRhYmxlIGlzIGNyZWF0ZWQsIGFuZCBzZXQgdHJ1ZSB3aGVuIGl0J3MgYmVlbiBvdXRwdXQgdG8gdGhlIGZpbGUuCisgICAqIFlvdSBjb3VsZCBzdXBwcmVzcyBvdXRwdXQgb2YgYSB0YWJsZSBieSBzZXR0aW5nIHRoaXMgdG8gdHJ1ZS4KICAgICogKFNlZSBqcGVnX3N1cHByZXNzX3RhYmxlcyBmb3IgYW4gZXhhbXBsZS4pCiAgICAqLwotICBib29sZWFuIHNlbnRfdGFibGU7CQkvKiBUUlVFIHdoZW4gdGFibGUgaGFzIGJlZW4gb3V0cHV0ICovCisgIGJvb2xlYW4gc2VudF90YWJsZTsJCS8qIHRydWUgd2hlbiB0YWJsZSBoYXMgYmVlbiBvdXRwdXQgKi8KIH0gSkhVRkZfVEJMOwogCiAKQEAgLTM4NCwxMCArMzg0LDEwIEBACiAgICAqIHNldCBudW1fc2NhbnMgYW5kIHNjYW5faW5mbyB0byBwb2ludCB0byBhbiBhcnJheSBvZiBzY2FuIGRlZmluaXRpb25zLgogICAgKi8KIAotICBib29sZWFuIHJhd19kYXRhX2luOwkJLyogVFJVRT1jYWxsZXIgc3VwcGxpZXMgZG93bnNhbXBsZWQgZGF0YSAqLwotICBib29sZWFuIGFyaXRoX2NvZGU7CQkvKiBUUlVFPWFyaXRobWV0aWMgY29kaW5nLCBGQUxTRT1IdWZmbWFuICovCi0gIGJvb2xlYW4gb3B0aW1pemVfY29kaW5nOwkvKiBUUlVFPW9wdGltaXplIGVudHJvcHkgZW5jb2RpbmcgcGFybXMgKi8KLSAgYm9vbGVhbiBDQ0lSNjAxX3NhbXBsaW5nOwkvKiBUUlVFPWZpcnN0IHNhbXBsZXMgYXJlIGNvc2l0ZWQgKi8KKyAgYm9vbGVhbiByYXdfZGF0YV9pbjsJCS8qIHRydWU9Y2FsbGVyIHN1cHBsaWVzIGRvd25zYW1wbGVkIGRhdGEgKi8KKyAgYm9vbGVhbiBhcml0aF9jb2RlOwkJLyogdHJ1ZT1hcml0aG1ldGljIGNvZGluZywgZmFsc2U9SHVmZm1hbiAqLworICBib29sZWFuIG9wdGltaXplX2NvZGluZzsJLyogdHJ1ZT1vcHRpbWl6ZSBlbnRyb3B5IGVuY29kaW5nIHBhcm1zICovCisgIGJvb2xlYW4gQ0NJUjYwMV9zYW1wbGluZzsJLyogdHJ1ZT1maXJzdCBzYW1wbGVzIGFyZSBjb3NpdGVkICovCiAgIGludCBzbW9vdGhpbmdfZmFjdG9yOwkJLyogMS4uMTAwLCBvciAwIGZvciBubyBpbnB1dCBzbW9vdGhpbmcgKi8KICAgSl9EQ1RfTUVUSE9EIGRjdF9tZXRob2Q7CS8qIERDVCBhbGdvcml0aG0gc2VsZWN0b3IgKi8KIApAQCAtNDI3LDcgKzQyNyw3IEBACiAgIC8qCiAgICAqIFRoZXNlIGZpZWxkcyBhcmUgY29tcHV0ZWQgZHVyaW5nIGNvbXByZXNzaW9uIHN0YXJ0dXAKICAgICovCi0gIGJvb2xlYW4gcHJvZ3Jlc3NpdmVfbW9kZTsJLyogVFJVRSBpZiBzY2FuIHNjcmlwdCB1c2VzIHByb2dyZXNzaXZlIG1vZGUgKi8KKyAgYm9vbGVhbiBwcm9ncmVzc2l2ZV9tb2RlOwkvKiB0cnVlIGlmIHNjYW4gc2NyaXB0IHVzZXMgcHJvZ3Jlc3NpdmUgbW9kZSAqLwogICBpbnQgbWF4X2hfc2FtcF9mYWN0b3I7CS8qIGxhcmdlc3QgaF9zYW1wX2ZhY3RvciAqLwogICBpbnQgbWF4X3Zfc2FtcF9mYWN0b3I7CS8qIGxhcmdlc3Qgdl9zYW1wX2ZhY3RvciAqLwogCkBAIC01MDAsMTcgKzUwMCwxNyBAQAogCiAgIGRvdWJsZSBvdXRwdXRfZ2FtbWE7CQkvKiBpbWFnZSBnYW1tYSB3YW50ZWQgaW4gb3V0cHV0ICovCiAKLSAgYm9vbGVhbiBidWZmZXJlZF9pbWFnZTsJLyogVFJVRT1tdWx0aXBsZSBvdXRwdXQgcGFzc2VzICovCi0gIGJvb2xlYW4gcmF3X2RhdGFfb3V0OwkJLyogVFJVRT1kb3duc2FtcGxlZCBkYXRhIHdhbnRlZCAqLworICBib29sZWFuIGJ1ZmZlcmVkX2ltYWdlOwkvKiB0cnVlPW11bHRpcGxlIG91dHB1dCBwYXNzZXMgKi8KKyAgYm9vbGVhbiByYXdfZGF0YV9vdXQ7CQkvKiB0cnVlPWRvd25zYW1wbGVkIGRhdGEgd2FudGVkICovCiAKICAgSl9EQ1RfTUVUSE9EIGRjdF9tZXRob2Q7CS8qIElEQ1QgYWxnb3JpdGhtIHNlbGVjdG9yICovCi0gIGJvb2xlYW4gZG9fZmFuY3lfdXBzYW1wbGluZzsJLyogVFJVRT1hcHBseSBmYW5jeSB1cHNhbXBsaW5nICovCi0gIGJvb2xlYW4gZG9fYmxvY2tfc21vb3RoaW5nOwkvKiBUUlVFPWFwcGx5IGludGVyYmxvY2sgc21vb3RoaW5nICovCisgIGJvb2xlYW4gZG9fZmFuY3lfdXBzYW1wbGluZzsJLyogdHJ1ZT1hcHBseSBmYW5jeSB1cHNhbXBsaW5nICovCisgIGJvb2xlYW4gZG9fYmxvY2tfc21vb3RoaW5nOwkvKiB0cnVlPWFwcGx5IGludGVyYmxvY2sgc21vb3RoaW5nICovCiAKLSAgYm9vbGVhbiBxdWFudGl6ZV9jb2xvcnM7CS8qIFRSVUU9Y29sb3JtYXBwZWQgb3V0cHV0IHdhbnRlZCAqLworICBib29sZWFuIHF1YW50aXplX2NvbG9yczsJLyogdHJ1ZT1jb2xvcm1hcHBlZCBvdXRwdXQgd2FudGVkICovCiAgIC8qIHRoZSBmb2xsb3dpbmcgYXJlIGlnbm9yZWQgaWYgbm90IHF1YW50aXplX2NvbG9yczogKi8KICAgSl9ESVRIRVJfTU9ERSBkaXRoZXJfbW9kZTsJLyogdHlwZSBvZiBjb2xvciBkaXRoZXJpbmcgdG8gdXNlICovCi0gIGJvb2xlYW4gdHdvX3Bhc3NfcXVhbnRpemU7CS8qIFRSVUU9dXNlIHR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiAqLworICBib29sZWFuIHR3b19wYXNzX3F1YW50aXplOwkvKiB0cnVlPXVzZSB0d28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24gKi8KICAgaW50IGRlc2lyZWRfbnVtYmVyX29mX2NvbG9yczsJLyogbWF4ICMgY29sb3JzIHRvIHVzZSBpbiBjcmVhdGVkIGNvbG9ybWFwICovCiAgIC8qIHRoZXNlIGFyZSBzaWduaWZpY2FudCBvbmx5IGluIGJ1ZmZlcmVkLWltYWdlIG1vZGU6ICovCiAgIGJvb2xlYW4gZW5hYmxlXzFwYXNzX3F1YW50OwkvKiBlbmFibGUgZnV0dXJlIHVzZSBvZiAxLXBhc3MgcXVhbnRpemVyICovCkBAIC02MDIsOCArNjAyLDggQEAKICAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBfaW5mbzsKICAgLyogY29tcF9pbmZvW2ldIGRlc2NyaWJlcyBjb21wb25lbnQgdGhhdCBhcHBlYXJzIGkndGggaW4gU09GICovCiAKLSAgYm9vbGVhbiBwcm9ncmVzc2l2ZV9tb2RlOwkvKiBUUlVFIGlmIFNPRm4gc3BlY2lmaWVzIHByb2dyZXNzaXZlIG1vZGUgKi8KLSAgYm9vbGVhbiBhcml0aF9jb2RlOwkJLyogVFJVRT1hcml0aG1ldGljIGNvZGluZywgRkFMU0U9SHVmZm1hbiAqLworICBib29sZWFuIHByb2dyZXNzaXZlX21vZGU7CS8qIHRydWUgaWYgU09GbiBzcGVjaWZpZXMgcHJvZ3Jlc3NpdmUgbW9kZSAqLworICBib29sZWFuIGFyaXRoX2NvZGU7CQkvKiB0cnVlPWFyaXRobWV0aWMgY29kaW5nLCBmYWxzZT1IdWZmbWFuICovCiAKICAgVUlOVDggYXJpdGhfZGNfTFtOVU1fQVJJVEhfVEJMU107IC8qIEwgdmFsdWVzIGZvciBEQyBhcml0aC1jb2RpbmcgdGFibGVzICovCiAgIFVJTlQ4IGFyaXRoX2RjX1VbTlVNX0FSSVRIX1RCTFNdOyAvKiBVIHZhbHVlcyBmb3IgREMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLwpAQCAtNjE0LDE3ICs2MTQsMTcgQEAKICAgLyogVGhlc2UgZmllbGRzIHJlY29yZCBkYXRhIG9idGFpbmVkIGZyb20gb3B0aW9uYWwgbWFya2VycyByZWNvZ25pemVkIGJ5CiAgICAqIHRoZSBKUEVHIGxpYnJhcnkuCiAgICAqLwotICBib29sZWFuIHNhd19KRklGX21hcmtlcjsJLyogVFJVRSBpZmYgYSBKRklGIEFQUDAgbWFya2VyIHdhcyBmb3VuZCAqLwotICAvKiBEYXRhIGNvcGllZCBmcm9tIEpGSUYgbWFya2VyOyBvbmx5IHZhbGlkIGlmIHNhd19KRklGX21hcmtlciBpcyBUUlVFOiAqLworICBib29sZWFuIHNhd19KRklGX21hcmtlcjsJLyogdHJ1ZSBpZmYgYSBKRklGIEFQUDAgbWFya2VyIHdhcyBmb3VuZCAqLworICAvKiBEYXRhIGNvcGllZCBmcm9tIEpGSUYgbWFya2VyOyBvbmx5IHZhbGlkIGlmIHNhd19KRklGX21hcmtlciBpcyB0cnVlOiAqLwogICBVSU5UOCBKRklGX21ham9yX3ZlcnNpb247CS8qIEpGSUYgdmVyc2lvbiBudW1iZXIgKi8KICAgVUlOVDggSkZJRl9taW5vcl92ZXJzaW9uOwogICBVSU5UOCBkZW5zaXR5X3VuaXQ7CQkvKiBKRklGIGNvZGUgZm9yIHBpeGVsIHNpemUgdW5pdHMgKi8KICAgVUlOVDE2IFhfZGVuc2l0eTsJCS8qIEhvcml6b250YWwgcGl4ZWwgZGVuc2l0eSAqLwogICBVSU5UMTYgWV9kZW5zaXR5OwkJLyogVmVydGljYWwgcGl4ZWwgZGVuc2l0eSAqLwotICBib29sZWFuIHNhd19BZG9iZV9tYXJrZXI7CS8qIFRSVUUgaWZmIGFuIEFkb2JlIEFQUDE0IG1hcmtlciB3YXMgZm91bmQgKi8KKyAgYm9vbGVhbiBzYXdfQWRvYmVfbWFya2VyOwkvKiB0cnVlIGlmZiBhbiBBZG9iZSBBUFAxNCBtYXJrZXIgd2FzIGZvdW5kICovCiAgIFVJTlQ4IEFkb2JlX3RyYW5zZm9ybTsJLyogQ29sb3IgdHJhbnNmb3JtIGNvZGUgZnJvbSBBZG9iZSBtYXJrZXIgKi8KIAotICBib29sZWFuIENDSVI2MDFfc2FtcGxpbmc7CS8qIFRSVUU9Zmlyc3Qgc2FtcGxlcyBhcmUgY29zaXRlZCAqLworICBib29sZWFuIENDSVI2MDFfc2FtcGxpbmc7CS8qIHRydWU9Zmlyc3Qgc2FtcGxlcyBhcmUgY29zaXRlZCAqLwogCiAgIC8qIEFzaWRlIGZyb20gdGhlIHNwZWNpZmljIGRhdGEgcmV0YWluZWQgZnJvbSBBUFBuIG1hcmtlcnMga25vd24gdG8gdGhlCiAgICAqIGxpYnJhcnksIHRoZSB1bmludGVycHJldGVkIGNvbnRlbnRzIG9mIGFueSBvciBhbGwgQVBQbiBhbmQgQ09NIG1hcmtlcnMKQEAgLTEwMzQsNyArMTAzNCw3IEBACiAjZGVmaW5lIEpQRUdfU1VTUEVOREVECQkwIC8qIFN1c3BlbmRlZCBkdWUgdG8gbGFjayBvZiBpbnB1dCBkYXRhICovCiAjZGVmaW5lIEpQRUdfSEVBREVSX09LCQkxIC8qIEZvdW5kIHZhbGlkIGltYWdlIGRhdGFzdHJlYW0gKi8KICNkZWZpbmUgSlBFR19IRUFERVJfVEFCTEVTX09OTFkJMiAvKiBGb3VuZCB2YWxpZCB0YWJsZS1zcGVjcy1vbmx5IGRhdGFzdHJlYW0gKi8KLS8qIElmIHlvdSBwYXNzIHJlcXVpcmVfaW1hZ2UgPSBUUlVFIChub3JtYWwgY2FzZSksIHlvdSBuZWVkIG5vdCBjaGVjayBmb3IKKy8qIElmIHlvdSBwYXNzIHJlcXVpcmVfaW1hZ2UgPSB0cnVlIChub3JtYWwgY2FzZSksIHlvdSBuZWVkIG5vdCBjaGVjayBmb3IKICAqIGEgVEFCTEVTX09OTFkgcmV0dXJuIGNvZGU7IGFuIGFiYnJldmlhdGVkIGZpbGUgd2lsbCBjYXVzZSBhbiBlcnJvciBleGl0LgogICogSlBFR19TVVNQRU5ERUQgaXMgb25seSBwb3NzaWJsZSBpZiB5b3UgdXNlIGEgZGF0YSBzb3VyY2UgbW9kdWxlIHRoYXQgY2FuCiAgKiBnaXZlIGEgc3VzcGVuc2lvbiByZXR1cm4gKHRoZSBzdGRpbyBzb3VyY2UgbW9kdWxlIGRvZXNuJ3QpLgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHQuY3BwIGIvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHQuY3BwCmluZGV4IDgzYTQyMGEuLmYxOTQ0NWYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0LmNwcAorKysgYi9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdC5jcHAKQEAgLTI0OSw4ICsyNDksOCBAQAogICAgIENSWVBUX01ENVVwZGF0ZSgmY3R4LCBpbnB1dCwgbGVuZ3RoKTsKICAgICBDUllQVF9NRDVGaW5pc2goJmN0eCwgZGlnZXN0KTsKIH0KLXN0YXRpYyBGWF9CT09MICgqZ19QdWJLZXlEZWNyeXB0b3IpKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCB1aW50OF90KiBkYXRhX2J1ZiwgRlhfRFdPUkQmIGRhdGFfbGVuKSA9IE5VTEw7Ci12b2lkIENSWVBUX1NldFB1YktleURlY3J5cHRvcihGWF9CT09MICgqZnVuYykoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIHVpbnQ4X3QqIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9sZW4pKQorc3RhdGljIGJvb2wgKCpnX1B1YktleURlY3J5cHRvcikoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIHVpbnQ4X3QqIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9sZW4pID0gTlVMTDsKK3ZvaWQgQ1JZUFRfU2V0UHViS2V5RGVjcnlwdG9yKGJvb2wgKCpmdW5jKShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgdWludDhfdCogZGF0YV9idWYsIEZYX0RXT1JEJiBkYXRhX2xlbikpCiB7CiAgICAgZ19QdWJLZXlEZWNyeXB0b3IgPSBmdW5jOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHRfYWVzLmNwcCBiL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X2Flcy5jcHAKaW5kZXggNGJkODcxMC4uOWYxNDIyMiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHRfYWVzLmNwcAorKysgYi9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdF9hZXMuY3BwCkBAIC05ODgsNyArOTg4LDcgQEAKICAgICB9CiAgICAgRlhTWVNfbWVtY3B5KGN0eC0+aXYsIGl2LCBzaXplb2YoaXYpKTsKIH0KLXZvaWQgQ1JZUFRfQUVTU2V0S2V5KHZvaWQqIGNvbnRleHQsIEZYX0RXT1JEIGJsb2NrbGVuLCBjb25zdCB1aW50OF90KiBrZXksIEZYX0RXT1JEIGtleWxlbiwgRlhfQk9PTCBiRW5jcnlwdCkKK3ZvaWQgQ1JZUFRfQUVTU2V0S2V5KHZvaWQqIGNvbnRleHQsIEZYX0RXT1JEIGJsb2NrbGVuLCBjb25zdCB1aW50OF90KiBrZXksIEZYX0RXT1JEIGtleWxlbiwgYm9vbCBiRW5jcnlwdCkKIHsKICAgICBhZXNfc2V0dXAoKEFFU0NvbnRleHQqKWNvbnRleHQsIGJsb2NrbGVuLCBrZXksIGtleWxlbik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdF9zaGEuY3BwIGIvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHRfc2hhLmNwcAppbmRleCBiMjIzNDhhLi5kZTFlYzA4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdF9zaGEuY3BwCisrKyBiL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X3NoYS5jcHAKQEAgLTQwNSw3ICs0MDUsNyBAQAogICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA+PSAnQScgJiYgc3RyW2ldIDw9ICdGJykgewogICAgICAgICAgICAgcmV0IHw9IChzdHJbaV0gLSAnQScgKyAxMCkgJiAweEZGOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsKKyAgICAgICAgICAgIEZYU1lTX2Fzc2VydChmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9iYXNpY19tb2R1bGUuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2Jhc2ljX21vZHVsZS5jcHAKaW5kZXggMDNjZmQ2Ni4uODMwMzRhZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2Jhc2ljX21vZHVsZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2Jhc2ljX21vZHVsZS5jcHAKQEAgLTQ0LDE0ICs0NCwxNCBAQAogewogfQogCi12b2lkIENQREZfTW9kdWxlTWdyOjpTZXREb3dubG9hZENhbGxiYWNrKEZYX0JPT0wgKCpjYWxsYmFjaykoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpKQordm9pZCBDUERGX01vZHVsZU1ncjo6U2V0RG93bmxvYWRDYWxsYmFjayhib29sICgqY2FsbGJhY2spKGNvbnN0IEZYX0NIQVIqIG1vZHVsZV9uYW1lKSkKIHsKICAgICBtX3BEb3dubG9hZENhbGxiYWNrID0gY2FsbGJhY2s7CiB9Ci1GWF9CT09MIENQREZfTW9kdWxlTWdyOjpEb3dubG9hZE1vZHVsZShjb25zdCBGWF9DSEFSKiBtb2R1bGVfbmFtZSkKK2Jvb2wgQ1BERl9Nb2R1bGVNZ3I6OkRvd25sb2FkTW9kdWxlKGNvbnN0IEZYX0NIQVIqIG1vZHVsZV9uYW1lKQogewogICAgIGlmIChtX3BEb3dubG9hZENhbGxiYWNrID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBtX3BEb3dubG9hZENhbGxiYWNrKG1vZHVsZV9uYW1lKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2VkaXRpbnQuaCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2VkaXRpbnQuaAppbmRleCA0YWVjMzJhLi5iYzRjNzJhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9lZGl0aW50LmgKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZWRpdGludC5oCkBAIC0xMiw3ICsxMiw3IEBACiBwdWJsaWM6CiAgICAgQ1BERl9PYmplY3RTdHJlYW0oKTsKIAotICAgIEZYX0JPT0wJCQkJU3RhcnQoKTsKKyAgICBib29sCQkJCVN0YXJ0KCk7CiAKICAgICBpbnQzMl90CQkJQ29tcHJlc3NJbmRpcmVjdE9iamVjdChGWF9EV09SRCBkd09iak51bSwgY29uc3QgQ1BERl9PYmplY3QgKnBPYmopOwogICAgIGludDMyX3QJCQlDb21wcmVzc0luZGlyZWN0T2JqZWN0KEZYX0RXT1JEIGR3T2JqTnVtLCBjb25zdCB1aW50OF90KiBwQnVmZmVyLCBGWF9EV09SRCBkd1NpemUpOwpAQCAtMzQsMTUgKzM0LDE1IEBACiAKICAgICBDUERGX1hSZWZTdHJlYW0oKTsKIAotICAgIEZYX0JPT0wJCQkJU3RhcnQoKTsKKyAgICBib29sCQkJCVN0YXJ0KCk7CiAKICAgICBpbnQzMl90CQkJQ29tcHJlc3NJbmRpcmVjdE9iamVjdChGWF9EV09SRCBkd09iak51bSwgY29uc3QgQ1BERl9PYmplY3QgKnBPYmosIENQREZfQ3JlYXRvciAqcENyZWF0b3IpOwogCiAgICAgaW50MzJfdAkJCUNvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sIGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIEZYX0RXT1JEIGR3U2l6ZSwgQ1BERl9DcmVhdG9yICpwQ3JlYXRvcik7CiAKLSAgICBGWF9CT09MCQkJCUVuZChDUERGX0NyZWF0b3IgKnBDcmVhdG9yLCBGWF9CT09MIGJFT0YgPSBGQUxTRSk7Ci0gICAgRlhfQk9PTAkJCQlBZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkoRlhfRFdPUkQgb2JqbnVtKTsKLSAgICBGWF9CT09MCQkJCUVuZFhSZWZTdHJlYW0oQ1BERl9DcmVhdG9yKiBwQ3JlYXRvcik7CisgICAgYm9vbAkJCQlFbmQoQ1BERl9DcmVhdG9yICpwQ3JlYXRvciwgYm9vbCBiRU9GID0gZmFsc2UpOworICAgIGJvb2wJCQkJQWRkT2JqZWN0TnVtYmVyVG9JbmRleEFycmF5KEZYX0RXT1JEIG9iam51bSk7CisgICAgYm9vbAkJCQlFbmRYUmVmU3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IpOwogCiAKICAgICBDRlhfRFdvcmRBcnJheQkJbV9JbmRleEFycmF5OwpAQCAtNTEsOCArNTEsOCBAQAogICAgIEZYX0RXT1JECQkJbV9kd1RlbXBPYmpOdW07CiAKIHByb3RlY3RlZDoKLSAgICBpbnQzMl90CQkJRW5kT2JqZWN0U3RyZWFtKENQREZfQ3JlYXRvciAqcENyZWF0b3IsIEZYX0JPT0wgYkVPRiA9IFRSVUUpOwotICAgIEZYX0JPT0wJCQkJR2VuZXJhdGVYUmVmU3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IsIEZYX0JPT0wgYkVPRik7CisgICAgaW50MzJfdAkJCUVuZE9iamVjdFN0cmVhbShDUERGX0NyZWF0b3IgKnBDcmVhdG9yLCBib29sIGJFT0YgPSB0cnVlKTsKKyAgICBib29sCQkJCUdlbmVyYXRlWFJlZlN0cmVhbShDUERGX0NyZWF0b3IqIHBDcmVhdG9yLCBib29sIGJFT0YpOwogICAgIGludDMyX3QJCQltX2lTZWc7CiAgICAgQ1BERl9PYmplY3RTdHJlYW0JbV9PYmpTdHJlYW07CiAgICAgQ0ZYX0J5dGVUZXh0QnVmCQltX0J1ZmZlcjsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9jb250ZW50LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9jb250ZW50LmNwcAppbmRleCA2NWY3OGRhLi5iODQ5MzZjIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfY29udGVudC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NvbnRlbnQuY3BwCkBAIC0yOCwxMCArMjgsMTAgQEAKIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZTo6fkNQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZSgpCiB7CiB9Ci1GWF9CT09MIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZTo6SW5zZXJ0UGFnZU9iamVjdChDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqZWN0KQorYm9vbCBDUERGX1BhZ2VDb250ZW50R2VuZXJhdGU6Okluc2VydFBhZ2VPYmplY3QoQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iamVjdCkKIHsKICAgICBpZiAoIXBQYWdlT2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gbV9wYWdlT2JqZWN0cy5BZGQocFBhZ2VPYmplY3QpOwogfQpAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICBwUGFnZURpY3QtPlJlbW92ZUF0KCJDb250ZW50cyIpOwogICAgIH0KICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShOVUxMLCAwLCBOVUxMKTsKLSAgICBwU3RyZWFtLT5TZXREYXRhKGJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOworICAgIHBTdHJlYW0tPlNldERhdGEoYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0TGVuZ3RoKCksIGZhbHNlLCBmYWxzZSk7CiAgICAgbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBTdHJlYW0pOwogICAgIHBQYWdlRGljdC0+U2V0QXRSZWZlcmVuY2UoIkNvbnRlbnRzIiwgbV9wRG9jdW1lbnQsIHBTdHJlYW0tPkdldE9iak51bSgpKTsKIH0KQEAgLTE1OCw3ICsxNTgsNyBAQAogICAgICAgICBQcm9jZXNzRm9ybShidWYsIGNvbnRlbnRTdHJlYW0uR2V0RGF0YSgpLCBjb250ZW50U3RyZWFtLkdldFNpemUoKSwgbWF0cml4KTsKICAgICB9CiAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW0oTlVMTCwgMCwgTlVMTCk7Ci0gICAgcFN0cmVhbS0+U2V0RGF0YShidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRMZW5ndGgoKSwgRkFMU0UsIEZBTFNFKTsKKyAgICBwU3RyZWFtLT5TZXREYXRhKGJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldExlbmd0aCgpLCBmYWxzZSwgZmFsc2UpOwogICAgIG1fcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwU3RyZWFtKTsKICAgICBtX3BQYWdlLT5tX3BGb3JtRGljdC0+U2V0QXRSZWZlcmVuY2UoIkNvbnRlbnRzIiwgbV9wRG9jdW1lbnQsIHBTdHJlYW0tPkdldE9iak51bSgpKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9jcmVhdGUuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAKaW5kZXggMjI4MjZhMy4uYjE5N2IyNSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAKQEAgLTEzLDcgKzEzLDcgQEAKIGV4dGVybiB2b2lkIEZsYXRlRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19kYXRhLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOwogZXh0ZXJuIHZvaWQgRmxhdGVFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci1leHRlcm4gRlhfQk9PTCBJc1NpZ25hdHVyZURpY3QoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CitleHRlcm4gYm9vbCBJc1NpZ25hdHVyZURpY3QoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CiBpbnQzMl90IFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KGNvbnN0IENQREZfT2JqZWN0KiBwT2JqLCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUgKnBGaWxlLCBGWF9GSUxFU0laRSYgb2Zmc2V0KQogewogICAgIGludDMyX3QgbGVuID0gMDsKQEAgLTQzLDcgKzQzLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFBERk9CSl9TVFJJTkc6IHsKICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBwT2JqLT5HZXRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBGWF9CT09MIGJIZXggPSAoKENQREZfU3RyaW5nKilwT2JqKS0+SXNIZXgoKTsKKyAgICAgICAgICAgICAgICBib29sIGJIZXggPSAoKENQREZfU3RyaW5nKilwT2JqKS0+SXNIZXgoKTsKICAgICAgICAgICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoUERGX0VuY29kZVN0cmluZyhzdHIsIGJIZXgpKSkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICB9CkBAIC0xNTYsNyArMTU2LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDg7CiAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW1BY2MgYWNjOwotICAgICAgICAgICAgICAgIGFjYy5Mb2FkQWxsRGF0YShwLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBhY2MuTG9hZEFsbERhdGEocCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRCbG9jayhhY2MuR2V0RGF0YSgpLCBhY2MuR2V0U2l6ZSgpKSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgIH0KQEAgLTE2OCwxMiArMTY4LDEyIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlQoRkFMU0UpOworICAgICAgICAgICAgQVNTRVJUKGZhbHNlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gMTsKIH0KLWludDMyX3QgUERGX0NyZWF0b3JXcml0ZVRyYWlsZXIoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUqIHBGaWxlLCBDUERGX0FycmF5KiBwSURBcnJheSwgRlhfQk9PTCBiQ29tcHJlc3MpCitpbnQzMl90IFBERl9DcmVhdG9yV3JpdGVUcmFpbGVyKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKiBwRmlsZSwgQ1BERl9BcnJheSogcElEQXJyYXksIGJvb2wgYkNvbXByZXNzKQogewogICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IDA7CiAgICAgaW50MzJfdCBsZW4gPSAwOwpAQCAtMjg1LDEwICsyODUsMTAgQEAKICAgICBvZmZzZXQgKz0gbGVuICsgNjsKICAgICByZXR1cm4gb2Zmc2V0OwogfQotRlhfQk9PTCBQREZfR2VuZXJhdGVGaWxlSUQoRlhfRFdPUkQgZHdTZWVkMSwgRlhfRFdPUkQgZHdTZWVkMiwgRlhfRFdPUkQqIHBCdWZmZXIpCitib29sIFBERl9HZW5lcmF0ZUZpbGVJRChGWF9EV09SRCBkd1NlZWQxLCBGWF9EV09SRCBkd1NlZWQyLCBGWF9EV09SRCogcEJ1ZmZlcikKIHsKICAgICBpZiAoIXBCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHZvaWQqIHBDb250ZXh0ID0gRlhfUmFuZG9tX01UX1N0YXJ0KGR3U2VlZDEpOwogICAgIGludDMyX3QgaSA9IDA7CkBAIC0zMDEsMjEgKzMwMSwyMSBAQAogICAgICAgICAqcEJ1ZmZlcisrID0gRlhfUmFuZG9tX01UX0dlbmVyYXRlKHBDb250ZXh0KTsKICAgICB9CiAgICAgRlhfUmFuZG9tX01UX0Nsb3NlKHBDb250ZXh0KTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGNsYXNzIENQREZfRmxhdGVFbmNvZGVyCiB7CiBwdWJsaWM6CiAgICAgQ1BERl9GbGF0ZUVuY29kZXIoKTsKICAgICB+Q1BERl9GbGF0ZUVuY29kZXIoKTsKLSAgICBGWF9CT09MCQlJbml0aWFsaXplKENQREZfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJGbGF0ZUVuY29kZSk7Ci0gICAgRlhfQk9PTAkJSW5pdGlhbGl6ZShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBGWF9EV09SRCBzaXplLCBGWF9CT09MIGJGbGF0ZUVuY29kZSwgRlhfQk9PTCBiWFJlZlN0cmVhbSA9IEZBTFNFKTsKKyAgICBib29sCQlJbml0aWFsaXplKENQREZfU3RyZWFtKiBwU3RyZWFtLCBib29sIGJGbGF0ZUVuY29kZSk7CisgICAgYm9vbAkJSW5pdGlhbGl6ZShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBGWF9EV09SRCBzaXplLCBib29sIGJGbGF0ZUVuY29kZSwgYm9vbCBiWFJlZlN0cmVhbSA9IGZhbHNlKTsKICAgICB2b2lkCQlDbG9uZURpY3QoKTsKICAgICB1aW50OF90KgkJCW1fcERhdGE7CiAgICAgRlhfRFdPUkQJCQltX2R3U2l6ZTsKICAgICBDUERGX0RpY3Rpb25hcnkqCW1fcERpY3Q7Ci0gICAgRlhfQk9PTAkJCQltX2JDbG9uZWQ7Ci0gICAgRlhfQk9PTAkJCQltX2JOZXdEYXRhOworICAgIGJvb2wJCQkJbV9iQ2xvbmVkOworICAgIGJvb2wJCQkJbV9iTmV3RGF0YTsKICAgICBDUERGX1N0cmVhbUFjYwkJbV9BY2M7CiB9OwogQ1BERl9GbGF0ZUVuY29kZXI6OkNQREZfRmxhdGVFbmNvZGVyKCkKQEAgLTMyMywxOSArMzIzLDE5IEBACiAgICAgbV9wRGF0YSA9IE5VTEw7CiAgICAgbV9kd1NpemUgPSAwOwogICAgIG1fcERpY3QgPSBOVUxMOwotICAgIG1fYkNsb25lZCA9IEZBTFNFOwotICAgIG1fYk5ld0RhdGEgPSBGQUxTRTsKKyAgICBtX2JDbG9uZWQgPSBmYWxzZTsKKyAgICBtX2JOZXdEYXRhID0gZmFsc2U7CiB9CiB2b2lkIENQREZfRmxhdGVFbmNvZGVyOjpDbG9uZURpY3QoKQogewogICAgIGlmICghbV9iQ2xvbmVkKSB7CiAgICAgICAgIG1fcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KiltX3BEaWN0LT5DbG9uZSgpOwotICAgICAgICBtX2JDbG9uZWQgPSBUUlVFOworICAgICAgICBtX2JDbG9uZWQgPSB0cnVlOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9GbGF0ZUVuY29kZXI6OkluaXRpYWxpemUoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYkZsYXRlRW5jb2RlKQorYm9vbCBDUERGX0ZsYXRlRW5jb2Rlcjo6SW5pdGlhbGl6ZShDUERGX1N0cmVhbSogcFN0cmVhbSwgYm9vbCBiRmxhdGVFbmNvZGUpCiB7Ci0gICAgbV9BY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgVFJVRSk7CisgICAgbV9BY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgdHJ1ZSk7CiAgICAgaWYgKChwU3RyZWFtICYmIHBTdHJlYW0tPkdldERpY3QoKSAmJiBwU3RyZWFtLT5HZXREaWN0KCktPktleUV4aXN0KCJGaWx0ZXIiKSkgfHwgIWJGbGF0ZUVuY29kZSkgewogICAgICAgICBpZiAocFN0cmVhbS0+R2V0RGljdCgpLT5LZXlFeGlzdCgiRmlsdGVyIikgJiYgIWJGbGF0ZUVuY29kZSkgewogICAgICAgICAgICAgQ1BERl9TdHJlYW1BY2MgZGVzdEFjYzsKQEAgLTM0NCw0MCArMzQ0LDQwIEBACiAgICAgICAgICAgICBtX3BEYXRhID0gKHVpbnQ4X3QqKWRlc3RBY2MuRGV0YWNoRGF0YSgpOwogICAgICAgICAgICAgbV9wRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBTdHJlYW0tPkdldERpY3QoKS0+Q2xvbmUoKTsKICAgICAgICAgICAgIG1fcERpY3QtPlJlbW92ZUF0KEZYX0JTVFJDKCJGaWx0ZXIiKSk7Ci0gICAgICAgICAgICBtX2JOZXdEYXRhID0gVFJVRTsKLSAgICAgICAgICAgIG1fYkNsb25lZCA9IFRSVUU7CisgICAgICAgICAgICBtX2JOZXdEYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fYkNsb25lZCA9IHRydWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtX3BEYXRhID0gKHVpbnQ4X3QqKW1fQWNjLkdldERhdGEoKTsKICAgICAgICAgICAgIG1fZHdTaXplID0gbV9BY2MuR2V0U2l6ZSgpOwogICAgICAgICAgICAgbV9wRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIG1fcERhdGEgPSBOVUxMOwogICAgIG1fZHdTaXplID0gMDsKLSAgICBtX2JOZXdEYXRhID0gVFJVRTsKLSAgICBtX2JDbG9uZWQgPSBUUlVFOworICAgIG1fYk5ld0RhdGEgPSB0cnVlOworICAgIG1fYkNsb25lZCA9IHRydWU7CiAgICAgOjpGbGF0ZUVuY29kZShtX0FjYy5HZXREYXRhKCksIG1fQWNjLkdldFNpemUoKSwgbV9wRGF0YSwgbV9kd1NpemUpOwogICAgIG1fcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwU3RyZWFtLT5HZXREaWN0KCktPkNsb25lKCk7CiAgICAgbV9wRGljdC0+U2V0QXRJbnRlZ2VyKCJMZW5ndGgiLCBtX2R3U2l6ZSk7CiAgICAgbV9wRGljdC0+U2V0QXROYW1lKCJGaWx0ZXIiLCAiRmxhdGVEZWNvZGUiKTsKICAgICBtX3BEaWN0LT5SZW1vdmVBdCgiRGVjb2RlUGFybXMiKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9GbGF0ZUVuY29kZXI6OkluaXRpYWxpemUoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgRlhfRFdPUkQgc2l6ZSwgRlhfQk9PTCBiRmxhdGVFbmNvZGUsIEZYX0JPT0wgYlhSZWZTdHJlYW0pCitib29sIENQREZfRmxhdGVFbmNvZGVyOjpJbml0aWFsaXplKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIEZYX0RXT1JEIHNpemUsIGJvb2wgYkZsYXRlRW5jb2RlLCBib29sIGJYUmVmU3RyZWFtKQogewogICAgIGlmICghYkZsYXRlRW5jb2RlKSB7CiAgICAgICAgIG1fcERhdGEgPSAodWludDhfdCopcEJ1ZmZlcjsKICAgICAgICAgbV9kd1NpemUgPSBzaXplOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIG1fYk5ld0RhdGEgPSBUUlVFOworICAgIG1fYk5ld0RhdGEgPSB0cnVlOwogICAgIGlmIChiWFJlZlN0cmVhbSkgewogICAgICAgICA6OkZsYXRlRW5jb2RlKHBCdWZmZXIsIHNpemUsIDEyLCAxLCA4LCA3LCBtX3BEYXRhLCBtX2R3U2l6ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgOjpGbGF0ZUVuY29kZShwQnVmZmVyLCBzaXplLCBtX3BEYXRhLCBtX2R3U2l6ZSk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQ1BERl9GbGF0ZUVuY29kZXI6On5DUERGX0ZsYXRlRW5jb2RlcigpCiB7CkBAIC0zOTMsMzMgKzM5MywzMyBAQAogcHVibGljOgogICAgIENQREZfRW5jcnlwdG9yKCk7CiAgICAgfkNQREZfRW5jcnlwdG9yKCk7Ci0gICAgRlhfQk9PTAkJSW5pdGlhbGl6ZShDUERGX0NyeXB0b0hhbmRsZXIqIHBIYW5kbGVyLCBpbnQgb2JqbnVtLCB1aW50OF90KiBzcmNfZGF0YSwgRlhfRFdPUkQgc3JjX3NpemUpOworICAgIGJvb2wJCUluaXRpYWxpemUoQ1BERl9DcnlwdG9IYW5kbGVyKiBwSGFuZGxlciwgaW50IG9iam51bSwgdWludDhfdCogc3JjX2RhdGEsIEZYX0RXT1JEIHNyY19zaXplKTsKICAgICB1aW50OF90KgkJCW1fcERhdGE7CiAgICAgRlhfRFdPUkQJCQltX2R3U2l6ZTsKLSAgICBGWF9CT09MCQkJCW1fYk5ld0J1ZjsKKyAgICBib29sCQkJCW1fYk5ld0J1ZjsKIH07CiBDUERGX0VuY3J5cHRvcjo6Q1BERl9FbmNyeXB0b3IoKQogewogICAgIG1fcERhdGEgPSBOVUxMOwogICAgIG1fZHdTaXplID0gMDsKLSAgICBtX2JOZXdCdWYgPSBGQUxTRTsKKyAgICBtX2JOZXdCdWYgPSBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9FbmNyeXB0b3I6OkluaXRpYWxpemUoQ1BERl9DcnlwdG9IYW5kbGVyKiBwSGFuZGxlciwgaW50IG9iam51bSwgdWludDhfdCogc3JjX2RhdGEsIEZYX0RXT1JEIHNyY19zaXplKQorYm9vbCBDUERGX0VuY3J5cHRvcjo6SW5pdGlhbGl6ZShDUERGX0NyeXB0b0hhbmRsZXIqIHBIYW5kbGVyLCBpbnQgb2JqbnVtLCB1aW50OF90KiBzcmNfZGF0YSwgRlhfRFdPUkQgc3JjX3NpemUpCiB7CiAgICAgaWYgKHNyY19zaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAocEhhbmRsZXIgPT0gTlVMTCkgewogICAgICAgICBtX3BEYXRhID0gKHVpbnQ4X3QqKXNyY19kYXRhOwogICAgICAgICBtX2R3U2l6ZSA9IHNyY19zaXplOwotICAgICAgICBtX2JOZXdCdWYgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIG1fYk5ld0J1ZiA9IGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgbV9kd1NpemUgPSBwSGFuZGxlci0+RW5jcnlwdEdldFNpemUob2JqbnVtLCAwLCBzcmNfZGF0YSwgc3JjX3NpemUpOwogICAgIG1fcERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCBtX2R3U2l6ZSk7CiAgICAgcEhhbmRsZXItPkVuY3J5cHRDb250ZW50KG9iam51bSwgMCwgc3JjX2RhdGEsIHNyY19zaXplLCBtX3BEYXRhLCBtX2R3U2l6ZSk7Ci0gICAgbV9iTmV3QnVmID0gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBtX2JOZXdCdWYgPSB0cnVlOworICAgIHJldHVybiB0cnVlOwogfQogQ1BERl9FbmNyeXB0b3I6On5DUERGX0VuY3J5cHRvcigpCiB7CkBAIC00MzIsMTQgKzQzMiwxNCBAQAogICAgICwgbV9pbmRleCgwKQogewogfQotRlhfQk9PTCBDUERGX09iamVjdFN0cmVhbTo6U3RhcnQoKQorYm9vbCBDUERGX09iamVjdFN0cmVhbTo6U3RhcnQoKQogewogICAgIG1fT2JqTnVtQXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgbV9PZmZzZXRBcnJheS5SZW1vdmVBbGwoKTsKICAgICBtX0J1ZmZlci5DbGVhcigpOwogICAgIG1fZHdPYmpOdW0gPSAwOwogICAgIG1faW5kZXggPSAwOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogaW50MzJfdCBDUERGX09iamVjdFN0cmVhbTo6Q29tcHJlc3NJbmRpcmVjdE9iamVjdChGWF9EV09SRCBkd09iak51bSwgY29uc3QgQ1BERl9PYmplY3QgKnBPYmopCiB7CkBAIC01NDcsMTIgKzU0NywxMiBAQAogICAgICwgbV9pU2VnKDApCiB7CiB9Ci1GWF9CT09MIENQREZfWFJlZlN0cmVhbTo6U3RhcnQoKQorYm9vbCBDUERGX1hSZWZTdHJlYW06OlN0YXJ0KCkKIHsKICAgICBtX0luZGV4QXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgbV9CdWZmZXIuQ2xlYXIoKTsKICAgICBtX2lTZWcgPSAwOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogaW50MzJfdCBDUERGX1hSZWZTdHJlYW06OkNvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sIGNvbnN0IENQREZfT2JqZWN0ICpwT2JqLCBDUERGX0NyZWF0b3IgKnBDcmVhdG9yKQogewpAQCAtNTc4LDcgKzU3OCw3IEBACiAgICAgfQogICAgIHJldHVybiBFbmRPYmplY3RTdHJlYW0ocENyZWF0b3IpOwogfQotc3RhdGljIHZvaWQgX0FwcGVuZEluZGV4MChDRlhfQnl0ZVRleHRCdWYmIGJ1ZmZlciwgRlhfQk9PTCBiRmlyc3RPYmplY3QgPSAgVFJVRSkKK3N0YXRpYyB2b2lkIF9BcHBlbmRJbmRleDAoQ0ZYX0J5dGVUZXh0QnVmJiBidWZmZXIsIGJvb2wgYkZpcnN0T2JqZWN0ID0gIHRydWUpCiB7CiAgICAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7CiAgICAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7CkBAIC02MTMsNyArNjEzLDcgQEAKICAgICBidWZmZXIuQXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUOChpbmRleCkpOwogICAgIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQwKGluZGV4KSk7CiB9Ci1pbnQzMl90IENQREZfWFJlZlN0cmVhbTo6RW5kT2JqZWN0U3RyZWFtKENQREZfQ3JlYXRvciAqcENyZWF0b3IsIEZYX0JPT0wgYkVPRikKK2ludDMyX3QgQ1BERl9YUmVmU3RyZWFtOjpFbmRPYmplY3RTdHJlYW0oQ1BERl9DcmVhdG9yICpwQ3JlYXRvciwgYm9vbCBiRU9GKQogewogICAgIEZYX0ZJTEVTSVpFIG9iak9mZnNldCA9IDA7CiAgICAgaWYgKGJFT0YpIHsKQEAgLTY0NCw3ICs2NDQsNyBAQAogICAgICAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgyKG1fQnVmZmVyLCBkd09ialN0bU51bSwgaW5kZXgrKyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgwKG1fQnVmZmVyLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgX0FwcGVuZEluZGV4MChtX0J1ZmZlciwgZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChpU2l6ZSA+IDAgJiYgYkVPRikgewpAQCAtNjgyLDEyICs2ODIsMTIgQEAKICAgICB9CiAgICAgcmV0dXJuIDE7CiB9Ci1GWF9CT09MIENQREZfWFJlZlN0cmVhbTo6R2VuZXJhdGVYUmVmU3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IsIEZYX0JPT0wgYkVPRikKK2Jvb2wgQ1BERl9YUmVmU3RyZWFtOjpHZW5lcmF0ZVhSZWZTdHJlYW0oQ1BERl9DcmVhdG9yKiBwQ3JlYXRvciwgYm9vbCBiRU9GKQogewogICAgIEZYX0ZJTEVTSVpFIG9mZnNldF90bXAgPSBwQ3JlYXRvci0+bV9PZmZzZXQ7CiAgICAgRlhfRFdPUkQgb2JqbnVtID0gKytwQ3JlYXRvci0+bV9kd0xhc3RPYmpOdW07CiAgICAgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlICpwRmlsZSA9ICZwQ3JlYXRvci0+bV9GaWxlOwotICAgIEZYX0JPT0wgYkluY3JlbWVudGFsID0gKHBDcmVhdG9yLT5tX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAhPSAwOworICAgIGJvb2wgYkluY3JlbWVudGFsID0gKHBDcmVhdG9yLT5tX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAhPSAwOwogICAgIGlmIChiSW5jcmVtZW50YWwpIHsKICAgICAgICAgQWRkT2JqZWN0TnVtYmVyVG9JbmRleEFycmF5KG9iam51bSk7CiAgICAgfSBlbHNlIHsKQEAgLTY5Niw3ICs2OTYsNyBAQAogICAgICAgICAgICAgaWYgKG9mZnNldCkgewogICAgICAgICAgICAgICAgIF9BcHBlbmRJbmRleDEobV9CdWZmZXIsICpvZmZzZXQpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgwKG1fQnVmZmVyLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgX0FwcGVuZEluZGV4MChtX0J1ZmZlciwgZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNzA0LDQ5ICs3MDQsNDkgQEAKICAgICBGWF9GSUxFU0laRSAmb2Zmc2V0ID0gcENyZWF0b3ItPm1fT2Zmc2V0OwogICAgIGludDMyX3QgbGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKG9iam51bSk7CiAgICAgaWYgKGxlbiA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG9mZnNldCArPSBsZW47CiAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBvYmpcclxuPDwvVHlwZSAvWFJlZi9XWzEgNCAyXS9JbmRleFsiKSkpIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgb2Zmc2V0ICs9IGxlbjsKICAgICBpZiAoIWJJbmNyZW1lbnRhbCkgewogICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZCgwKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBvZmZzZXQgKz0gbGVuICsgMTsKICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQob2JqbnVtICsgMSkpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIG9mZnNldCArPSBsZW47CiAgICAgfSBlbHNlIHsKICAgICAgICAgaW50MzJfdCBpU2VnID0gbV9JbmRleEFycmF5LkdldFNpemUoKSAvIDI7CiAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTZWc7IGkrKykgewogICAgICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQobV9JbmRleEFycmF5LkVsZW1lbnRBdChpICogMikpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9mZnNldCArPSBsZW4gKyAxOwogICAgICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQobV9JbmRleEFycmF5LkVsZW1lbnRBdChpICogMiArIDEpKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvZmZzZXQgKz0gbGVuICsgMTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXS9TaXplICIpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKG9iam51bSArIDEpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG9mZnNldCArPSBsZW4gKyA3OwogICAgIGlmIChtX1ByZXZPZmZzZXQgPiAwKSB7CkBAIC03NjIsMjYgKzc2MiwyNiBAQAogICAgICAgICB9CiAgICAgICAgIG9mZnNldCArPSBsZW4gKyA2OwogICAgIH0KLSAgICBGWF9CT09MIGJQcmVkaWN0b3IgPSBUUlVFOworICAgIGJvb2wgYlByZWRpY3RvciA9IHRydWU7CiAgICAgQ1BERl9GbGF0ZUVuY29kZXIgZW5jb2RlcjsKICAgICBlbmNvZGVyLkluaXRpYWxpemUobV9CdWZmZXIuR2V0QnVmZmVyKCksIG1fQnVmZmVyLkdldExlbmd0aCgpLCBwQ3JlYXRvci0+bV9iQ29tcHJlc3MsIGJQcmVkaWN0b3IpOwogICAgIGlmIChwQ3JlYXRvci0+bV9iQ29tcHJlc3MpIHsKICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi9GaWx0ZXIgL0ZsYXRlRGVjb2RlIikpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIG9mZnNldCArPSAyMDsKICAgICAgICAgaWYgKGJQcmVkaWN0b3IpIHsKICAgICAgICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiL0RlY29kZVBhcm1zPDwvQ29sdW1ucyA3L1ByZWRpY3RvciAxMj4+IikpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbjsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiL0xlbmd0aCAiKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChlbmNvZGVyLm1fZHdTaXplKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBvZmZzZXQgKz0gbGVuICsgODsKICAgICBpZiAoYkVPRikgewpAQCAtODAxLDI3ICs4MDEsMjcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIj4+c3RyZWFtXHJcbiIpKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBvZmZzZXQgKz0gbGVuOwogICAgIGlmIChwRmlsZS0+QXBwZW5kQmxvY2soZW5jb2Rlci5tX3BEYXRhLCBlbmNvZGVyLm1fZHdTaXplKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbmVuZHN0cmVhbVxyXG5lbmRvYmpcclxuIikpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG9mZnNldCArPSBlbmNvZGVyLm1fZHdTaXplICsgbGVuOwogICAgIG1fUHJldk9mZnNldCA9IG9mZnNldF90bXA7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfWFJlZlN0cmVhbTo6RW5kKENQREZfQ3JlYXRvciAqcENyZWF0b3IsIEZYX0JPT0wgYkVPRiApCitib29sIENQREZfWFJlZlN0cmVhbTo6RW5kKENQREZfQ3JlYXRvciAqcENyZWF0b3IsIGJvb2wgYkVPRiApCiB7CiAgICAgaWYgKEVuZE9iamVjdFN0cmVhbShwQ3JlYXRvciwgYkVPRikgPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gR2VuZXJhdGVYUmVmU3RyZWFtKHBDcmVhdG9yLCBiRU9GKTsKIH0KLUZYX0JPT0wgQ1BERl9YUmVmU3RyZWFtOjpFbmRYUmVmU3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IpCitib29sIENQREZfWFJlZlN0cmVhbTo6RW5kWFJlZlN0cmVhbShDUERGX0NyZWF0b3IqIHBDcmVhdG9yKQogewogICAgIGlmICghKHBDcmVhdG9yLT5tX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSkgewogICAgICAgICBfQXBwZW5kSW5kZXgwKG1fQnVmZmVyKTsKQEAgLTgzMCw3ICs4MzAsNyBAQAogICAgICAgICAgICAgaWYgKG9mZnNldCkgewogICAgICAgICAgICAgICAgIF9BcHBlbmRJbmRleDEobV9CdWZmZXIsICpvZmZzZXQpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgwKG1fQnVmZmVyLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgX0FwcGVuZEluZGV4MChtX0J1ZmZlciwgZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTg0Myw5ICs4NDMsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBHZW5lcmF0ZVhSZWZTdHJlYW0ocENyZWF0b3IsIEZBTFNFKTsKKyAgICByZXR1cm4gR2VuZXJhdGVYUmVmU3RyZWFtKHBDcmVhdG9yLCBmYWxzZSk7CiB9Ci1GWF9CT09MIENQREZfWFJlZlN0cmVhbTo6QWRkT2JqZWN0TnVtYmVyVG9JbmRleEFycmF5KEZYX0RXT1JEIG9iam51bSkKK2Jvb2wgQ1BERl9YUmVmU3RyZWFtOjpBZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkoRlhfRFdPUkQgb2JqbnVtKQogewogICAgIGludDMyX3QgaVNpemUgPSBtX0luZGV4QXJyYXkuR2V0U2l6ZSgpOwogICAgIGlmIChpU2l6ZSA9PSAwKSB7CkBAIC04NjIsMTMgKzg2MiwxMyBAQAogICAgICAgICAgICAgbV9JbmRleEFycmF5LkFkZCgxKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIENQREZfQ3JlYXRvcjo6Q1BERl9DcmVhdG9yKENQREZfRG9jdW1lbnQqIHBEb2MpCiB7CiAgICAgbV9wRG9jdW1lbnQgPSBwRG9jOwogICAgIG1fcFBhcnNlciA9IChDUERGX1BhcnNlciopcERvYy0+bV9wUGFyc2VyOwotICAgIG1fYkNvbXByZXNzID0gVFJVRTsKKyAgICBtX2JDb21wcmVzcyA9IHRydWU7CiAgICAgaWYgKG1fcFBhcnNlcikgewogICAgICAgICBtX3BFbmNyeXB0RGljdCA9IG1fcFBhcnNlci0+R2V0RW5jcnlwdERpY3QoKTsKICAgICAgICAgbV9wQ3J5cHRvSGFuZGxlciA9IG1fcFBhcnNlci0+R2V0Q3J5cHRvSGFuZGxlcigpOwpAQCAtODc2LDExICs4NzYsMTEgQEAKICAgICAgICAgbV9wRW5jcnlwdERpY3QgPSBOVUxMOwogICAgICAgICBtX3BDcnlwdG9IYW5kbGVyID0gTlVMTDsKICAgICB9Ci0gICAgbV9iU2VjdXJpdHlDaGFuZ2VkID0gRkFMU0U7Ci0gICAgbV9iU3RhbmRhcmRTZWN1cml0eSA9IEZBTFNFOworICAgIG1fYlNlY3VyaXR5Q2hhbmdlZCA9IGZhbHNlOworICAgIG1fYlN0YW5kYXJkU2VjdXJpdHkgPSBmYWxzZTsKICAgICBtX3BNZXRhZGF0YSA9IE5VTEw7Ci0gICAgbV9iRW5jcnlwdENsb25lZCA9IEZBTFNFOwotICAgIG1fYkVuY3J5cHRNZXRhZGF0YSA9IEZBTFNFOworICAgIG1fYkVuY3J5cHRDbG9uZWQgPSBmYWxzZTsKKyAgICBtX2JFbmNyeXB0TWV0YWRhdGEgPSBmYWxzZTsKICAgICBtX09mZnNldCA9IDA7CiAgICAgbV9pU3RhZ2UgPSAtMTsKICAgICBtX2R3RmxhZ3MgPSAwOwpAQCAtODkyLDcgKzg5Miw3IEBACiAgICAgbV9wSURBcnJheSA9IE5VTEw7CiAgICAgbV9GaWxlVmVyc2lvbiA9IDA7CiAgICAgbV9kd0VucnlwdE9iak51bSA9IDA7Ci0gICAgbV9iTmV3Q3J5cHRvID0gRkFMU0U7CisgICAgbV9iTmV3Q3J5cHRvID0gZmFsc2U7CiB9CiBDUERGX0NyZWF0b3I6On5DUERGX0NyZWF0b3IoKQogewpAQCAtOTAzLDEwICs5MDMsMTAgQEAKICAgICB9CiAgICAgQ2xlYXIoKTsKIH0KLXN0YXRpYyBGWF9CT09MIF9Jc1hSZWZOZWVkRW5kKENQREZfWFJlZlN0cmVhbSogcFhSZWYsIEZYX0RXT1JEIGZsYWcpCitzdGF0aWMgYm9vbCBfSXNYUmVmTmVlZEVuZChDUERGX1hSZWZTdHJlYW0qIHBYUmVmLCBGWF9EV09SRCBmbGFnKQogewogICAgIGlmICghKGZsYWcgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50MzJfdCBpU2l6ZSA9IHBYUmVmLT5tX0luZGV4QXJyYXkuR2V0U2l6ZSgpIC8gMjsKICAgICBpbnQzMl90IGlDb3VudCA9IDA7CkBAIC0xMDAxLDcgKzEwMDEsNyBAQAogaW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlU3RyZWFtKGNvbnN0IENQREZfT2JqZWN0KiBwU3RyZWFtLCBGWF9EV09SRCBvYmpudW0sIENQREZfQ3J5cHRvSGFuZGxlciogcENyeXB0bykKIHsKICAgICBDUERGX0ZsYXRlRW5jb2RlciBlbmNvZGVyOwotICAgIGVuY29kZXIuSW5pdGlhbGl6ZSgoQ1BERl9TdHJlYW0qKXBTdHJlYW0sIHBTdHJlYW0gPT0gbV9wTWV0YWRhdGEgPyBGQUxTRSA6IG1fYkNvbXByZXNzKTsKKyAgICBlbmNvZGVyLkluaXRpYWxpemUoKENQREZfU3RyZWFtKilwU3RyZWFtLCBwU3RyZWFtID09IG1fcE1ldGFkYXRhID8gZmFsc2UgOiBtX2JDb21wcmVzcyk7CiAgICAgQ1BERl9FbmNyeXB0b3IgZW5jcnlwdG9yOwogICAgIGlmKCFlbmNyeXB0b3IuSW5pdGlhbGl6ZShwQ3J5cHRvLCBvYmpudW0sIGVuY29kZXIubV9wRGF0YSwgZW5jb2Rlci5tX2R3U2l6ZSkpIHsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTA2Nyw3ICsxMDY3LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIFdyaXRlSW5kaXJlY3RPYmoocE9iai0+R2V0T2JqTnVtKCksIHBPYmopOwogfQotaW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlRGlyZWN0T2JqKEZYX0RXT1JEIG9iam51bSwgY29uc3QgQ1BERl9PYmplY3QqIHBPYmosIEZYX0JPT0wgYkVuY3J5cHQpCitpbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVEaXJlY3RPYmooRlhfRFdPUkQgb2JqbnVtLCBjb25zdCBDUERGX09iamVjdCogcE9iaiwgYm9vbCBiRW5jcnlwdCkKIHsKICAgICBpbnQzMl90IGxlbiA9IDA7CiAgICAgaWYgKHBPYmogPT0gTlVMTCkgewpAQCAtMTA5Niw3ICsxMDk2LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFBERk9CSl9TVFJJTkc6IHsKICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBwT2JqLT5HZXRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBGWF9CT09MIGJIZXggPSAoKENQREZfU3RyaW5nKilwT2JqKS0+SXNIZXgoKTsKKyAgICAgICAgICAgICAgICBib29sIGJIZXggPSAoKENQREZfU3RyaW5nKilwT2JqKS0+SXNIZXgoKTsKICAgICAgICAgICAgICAgICBpZiAobV9wQ3J5cHRvSGFuZGxlciA9PSBOVUxMIHx8ICFiRW5jcnlwdCkgewogICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBjb250ZW50ID0gUERGX0VuY29kZVN0cmluZyhzdHIsIGJIZXgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmRTdHJpbmcoY29udGVudCkpIDwgMCkgewpAQCAtMTIwNiwxMCArMTIwNiwxMCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtX09mZnNldCArPSAyOwogICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcCA9IChDUERGX0RpY3Rpb25hcnkqKXBPYmo7Ci0gICAgICAgICAgICAgICAgRlhfQk9PTCBiU2lnbkRpY3QgPSBJc1NpZ25hdHVyZURpY3QocCk7CisgICAgICAgICAgICAgICAgYm9vbCBiU2lnbkRpY3QgPSBJc1NpZ25hdHVyZURpY3QocCk7CiAgICAgICAgICAgICAgICAgRlhfUE9TSVRJT04gcG9zID0gcC0+R2V0U3RhcnRQb3MoKTsKICAgICAgICAgICAgICAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNpZ25WYWx1ZSA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBib29sIGJTaWduVmFsdWUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5OwogICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcFZhbHVlID0gcC0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXkpOwogICAgICAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiLyIpKSA8IDApIHsKQEAgLTEyMjAsNyArMTIyMCw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbV9PZmZzZXQgKz0gbGVuICsgMTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJTaWduRGljdCAmJiBrZXkgPT0gRlhfQlNUUkMoIkNvbnRlbnRzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTaWduVmFsdWUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYlNpZ25WYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKHBWYWx1ZS0+R2V0T2JqTnVtKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewpAQCAtMTI1NSw4ICsxMjU1LDggQEAKICAgICB9CiAgICAgbV9PYmplY3RPZmZzZXRbb2JqbnVtXSA9IG1fT2Zmc2V0OwogICAgIHZvaWQqIHZhbHVldGVtcCA9IE5VTEw7Ci0gICAgRlhfQk9PTCBiRXhpc3RJbk1hcCA9IG1fcERvY3VtZW50LT5tX0luZGlyZWN0T2Jqcy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3Qpb2JqbnVtLCB2YWx1ZXRlbXApOwotICAgIEZYX0JPT0wgYk9ialN0bSA9IChtX3BQYXJzZXItPm1fVjVUeXBlW29iam51bV0gPT0gMikgJiYgbV9wRW5jcnlwdERpY3QgJiYgIW1fcFhSZWZTdHJlYW07CisgICAgYm9vbCBiRXhpc3RJbk1hcCA9IG1fcERvY3VtZW50LT5tX0luZGlyZWN0T2Jqcy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3Qpb2JqbnVtLCB2YWx1ZXRlbXApOworICAgIGJvb2wgYk9ialN0bSA9IChtX3BQYXJzZXItPm1fVjVUeXBlW29iam51bV0gPT0gMikgJiYgbV9wRW5jcnlwdERpY3QgJiYgIW1fcFhSZWZTdHJlYW07CiAgICAgaWYobV9wUGFyc2VyLT5tX2JWZXJzaW9uVXBkYXRlZCB8fCBtX2JTZWN1cml0eUNoYW5nZWQgfHwgYkV4aXN0SW5NYXAgfHwgYk9ialN0bSkgewogICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IG1fcERvY3VtZW50LT5HZXRJbmRpcmVjdE9iamVjdChvYmpudW0pOwogICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7CkBAIC0xMzM0LDcgKzEzMzQsNyBAQAogICAgIH0KICAgICByZXR1cm4gMDsKIH0KLWludDMyX3QgQ1BERl9DcmVhdG9yOjpXcml0ZU5ld09ianMoRlhfQk9PTCBiSW5jcmVtZW50YWwsIElGWF9QYXVzZSAqcFBhdXNlKQoraW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlTmV3T2Jqcyhib29sIGJJbmNyZW1lbnRhbCwgSUZYX1BhdXNlICpwUGF1c2UpCiB7CiAgICAgaW50MzJfdCBpQ291bnQgPSBtX05ld09iak51bUFycmF5LkdldFNpemUoKTsKICAgICBpbnQzMl90IGluZGV4ID0gKGludDMyX3QpKHVpbnRwdHJfdCltX1BvczsKQEAgLTEzODUsOCArMTM4NSw4IEBACiB9CiB2b2lkIENQREZfQ3JlYXRvcjo6SW5pdE5ld09iak51bU9mZnNldHMoKQogewotICAgIEZYX0JPT0wgYkluY3JlbWVudGFsID0gKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICE9IDA7Ci0gICAgRlhfQk9PTCBiTm9PcmlnaW5hbCA9IChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX05PX09SSUdJTkFMKSAhPSAwOworICAgIGJvb2wgYkluY3JlbWVudGFsID0gKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICE9IDA7CisgICAgYm9vbCBiTm9PcmlnaW5hbCA9IChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX05PX09SSUdJTkFMKSAhPSAwOwogICAgIEZYX0RXT1JEIG5PbGRTaXplID0gbV9wUGFyc2VyID8gbV9wUGFyc2VyLT5tX0Nyb3NzUmVmLkdldFNpemUoKSA6IDA7CiAgICAgRlhfUE9TSVRJT04gcG9zID0gbV9wRG9jdW1lbnQtPm1fSW5kaXJlY3RPYmpzLkdldFN0YXJ0UG9zaXRpb24oKTsKICAgICB3aGlsZSAocG9zKSB7CkBAIC0xNDE0LDcgKzE0MTQsNyBAQAogICAgIH0KICAgICBpbnQzMl90IGkgPSAwOwogICAgIEZYX0RXT1JEIGR3U3RhcnRPYmpOdW0gPSAwOwotICAgIEZYX0JPT0wgYkNyb3NzUmVmVmFsaWQgPSBtX3BQYXJzZXIgJiYgbV9wUGFyc2VyLT5HZXRMYXN0WFJlZk9mZnNldCgpID4gMDsKKyAgICBib29sIGJDcm9zc1JlZlZhbGlkID0gbV9wUGFyc2VyICYmIG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKSA+IDA7CiAgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsKICAgICAgICAgZHdTdGFydE9iak51bSA9IG1fTmV3T2JqTnVtQXJyYXkuRWxlbWVudEF0KGkpOwogICAgICAgICBpZiAoKGJJbmNyZW1lbnRhbCAmJiAoYk5vT3JpZ2luYWwgfHwgYkNyb3NzUmVmVmFsaWQpKSB8fCAhbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoZHdTdGFydE9iak51bSkpIHsKQEAgLTE0MjcsMTAgKzE0MjcsMTAgQEAKICAgICB9CiAgICAgRlhfRFdPUkQgZHdMYXN0T2JqTnVtID0gZHdTdGFydE9iak51bTsKICAgICBpKys7Ci0gICAgRlhfQk9PTCBiTmV3U3RhcnQgPSBGQUxTRTsKKyAgICBib29sIGJOZXdTdGFydCA9IGZhbHNlOwogICAgIGZvciAoOyBpIDwgaUNvdW50OyBpKyspIHsKICAgICAgICAgRlhfRFdPUkQgZHdDdXJPYmpOdW0gPSBtX05ld09iak51bUFycmF5LkVsZW1lbnRBdChpKTsKLSAgICAgICAgRlhfQk9PTCBiRXhpc3QgPSAoZHdDdXJPYmpOdW0gPCBuT2xkU2l6ZSAmJiBtX09iamVjdE9mZnNldC5HZXRQdHJBdChkd0N1ck9iak51bSkgIT0gTlVMTCk7CisgICAgICAgIGJvb2wgYkV4aXN0ID0gKGR3Q3VyT2JqTnVtIDwgbk9sZFNpemUgJiYgbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoZHdDdXJPYmpOdW0pICE9IE5VTEwpOwogICAgICAgICBpZiAoYkV4aXN0IHx8IGR3Q3VyT2JqTnVtIC0gZHdMYXN0T2JqTnVtID4gMSkgewogICAgICAgICAgICAgaWYgKCFiTmV3U3RhcnQpIHsKICAgICAgICAgICAgICAgICBtX09iamVjdE9mZnNldC5BZGQoZHdTdGFydE9iak51bSwgZHdMYXN0T2JqTnVtIC0gZHdTdGFydE9iak51bSArIDEpOwpAQCAtMTU0Niw3ICsxNTQ2LDcgQEAKICAgICAgICAgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX05PX09SSUdJTkFMKSA9PSAwICYmIG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKSA9PSAwKSB7CiAgICAgICAgICAgICBJbml0T2xkT2JqTnVtT2Zmc2V0cygpOwogICAgICAgICAgICAgRlhfRFdPUkQgZHdFbmQgPSBtX3BQYXJzZXItPkdldExhc3RPYmpOdW0oKTsKLSAgICAgICAgICAgIEZYX0JPT0wgYk9ialN0bSA9IChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX09CSkVDVFNUUkVBTSkgIT0gMDsKKyAgICAgICAgICAgIGJvb2wgYk9ialN0bSA9IChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX09CSkVDVFNUUkVBTSkgIT0gMDsKICAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgb2JqbnVtID0gMDsgb2JqbnVtIDw9IGR3RW5kOyBvYmpudW0rKykgewogICAgICAgICAgICAgICAgIGlmIChtX3BQYXJzZXItPm1fVjVUeXBlW29iam51bV0gPT0gMCB8fCBtX3BQYXJzZXItPm1fVjVUeXBlW29iam51bV0gPT0gMjU1KSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTYyMiw3ICsxNjIyLDcgQEAKICAgICBpZiAobV9pU3RhZ2UgPT0gODApIHsKICAgICAgICAgbV9YcmVmU3RhcnQgPSBtX09mZnNldDsKICAgICAgICAgaWYgKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfT0JKRUNUU1RSRUFNKSB7Ci0gICAgICAgICAgICBtX3BYUmVmU3RyZWFtLT5FbmQodGhpcywgVFJVRSk7CisgICAgICAgICAgICBtX3BYUmVmU3RyZWFtLT5FbmQodGhpcywgdHJ1ZSk7CiAgICAgICAgICAgICBtX1hyZWZTdGFydCA9IG1fcFhSZWZTdHJlYW0tPm1fUHJldk9mZnNldDsKICAgICAgICAgICAgIG1faVN0YWdlID0gOTA7CiAgICAgICAgIH0gZWxzZSBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpID09IDAgfHwgIW1fcFBhcnNlci0+SXNYUmVmU3RyZWFtKCkpIHsKQEAgLTE3NjUsNyArMTc2NSw3IEBACiB7CiAgICAgRlhTWVNfYXNzZXJ0KG1faVN0YWdlID49IDkwKTsKICAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfT0JKRUNUU1RSRUFNKSA9PSAwKSB7Ci0gICAgICAgIEZYX0JPT0wgYlhSZWZTdHJlYW0gPSAobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMCAmJiBtX3BQYXJzZXItPklzWFJlZlN0cmVhbSgpOworICAgICAgICBib29sIGJYUmVmU3RyZWFtID0gKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICE9IDAgJiYgbV9wUGFyc2VyLT5Jc1hSZWZTdHJlYW0oKTsKICAgICAgICAgaWYgKCFiWFJlZlN0cmVhbSkgewogICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoInRyYWlsZXJcclxuPDwiKSkgPCAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTk3NiwzOSArMTk3NiwzOSBAQAogICAgICAgICBtX3BJREFycmF5ID0gTlVMTDsKICAgICB9CiB9Ci1GWF9CT09MIENQREZfQ3JlYXRvcjo6Q3JlYXRlKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBGWF9EV09SRCBmbGFncykKK2Jvb2wgQ1BERl9DcmVhdG9yOjpDcmVhdGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzKQogewogICAgIGlmICghbV9GaWxlLkF0dGFjaEZpbGUoZmlsZW5hbWUpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBGWF9CT09MIGJSZXQgPSBDcmVhdGUoZmxhZ3MpOworICAgIGJvb2wgYlJldCA9IENyZWF0ZShmbGFncyk7CiAgICAgaWYgKCFiUmV0IHx8ICEoZmxhZ3MgJiBGUERGQ1JFQVRFX1BST0dSRVNTSVZFKSkgewogICAgICAgICBDbGVhcigpOwogICAgIH0KICAgICByZXR1cm4gYlJldDsKIH0KLUZYX0JPT0wgQ1BERl9DcmVhdG9yOjpDcmVhdGUoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBGWF9EV09SRCBmbGFncykKK2Jvb2wgQ1BERl9DcmVhdG9yOjpDcmVhdGUoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBGWF9EV09SRCBmbGFncykKIHsKICAgICBpZiAoIW1fRmlsZS5BdHRhY2hGaWxlKGZpbGVuYW1lKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgRlhfQk9PTCBiUmV0ID0gQ3JlYXRlKGZsYWdzKTsKKyAgICBib29sIGJSZXQgPSBDcmVhdGUoZmxhZ3MpOwogICAgIGlmICghYlJldCB8fCAhKGZsYWdzICYgRlBERkNSRUFURV9QUk9HUkVTU0lWRSkpIHsKICAgICAgICAgQ2xlYXIoKTsKICAgICB9CiAgICAgcmV0dXJuIGJSZXQ7CiB9Ci1GWF9CT09MIENQREZfQ3JlYXRvcjo6Q3JlYXRlKElGWF9TdHJlYW1Xcml0ZSogcEZpbGUsIEZYX0RXT1JEIGZsYWdzKQorYm9vbCBDUERGX0NyZWF0b3I6OkNyZWF0ZShJRlhfU3RyZWFtV3JpdGUqIHBGaWxlLCBGWF9EV09SRCBmbGFncykKIHsKICAgICBpZiAoIXBGaWxlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBpZiAoIW1fRmlsZS5BdHRhY2hGaWxlKHBGaWxlLCBGQUxTRSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmICghbV9GaWxlLkF0dGFjaEZpbGUocEZpbGUsIGZhbHNlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBDcmVhdGUoZmxhZ3MpOwogfQotRlhfQk9PTCBDUERGX0NyZWF0b3I6OkNyZWF0ZShGWF9EV09SRCBmbGFncykKK2Jvb2wgQ1BERl9DcmVhdG9yOjpDcmVhdGUoRlhfRFdPUkQgZmxhZ3MpCiB7CiAgICAgbV9kd0ZsYWdzID0gZmxhZ3M7CiAgICAgbV9pU3RhZ2UgPSAwOwpAQCAtMjAxOSwxNCArMjAxOSwxNCBAQAogICAgIG1fTmV3T2JqTnVtQXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgSW5pdElEKCk7CiAgICAgaWYgKGZsYWdzICYgRlBERkNSRUFURV9QUk9HUkVTU0lWRSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBDb250aW51ZShOVUxMKSA+IC0xOwogfQotdm9pZCBDUERGX0NyZWF0b3I6OkluaXRJRChGWF9CT09MIGJEZWZhdWx0ICkKK3ZvaWQgQ1BERl9DcmVhdG9yOjpJbml0SUQoYm9vbCBiRGVmYXVsdCApCiB7CiAgICAgQ1BERl9BcnJheSogcE9sZElEQXJyYXkgPSBtX3BQYXJzZXIgPyBtX3BQYXJzZXItPkdldElEQXJyYXkoKSA6IE5VTEw7Ci0gICAgRlhfQk9PTCBiTmV3SWQgPSAhbV9wSURBcnJheTsKKyAgICBib29sIGJOZXdJZCA9ICFtX3BJREFycmF5OwogICAgIGlmICghbV9wSURBcnJheSkgewogICAgICAgICBGWF9EV09SRCogcEJ1ZmZlciA9IE5VTEw7CiAgICAgICAgIG1fcElEQXJyYXkgPSBDUERGX0FycmF5OjpDcmVhdGUoKTsKQEAgLTIwMzcsNyArMjAzNyw3IEBACiAgICAgICAgICAgICBwQnVmZmVyID0gRlhfQWxsb2MoRlhfRFdPUkQsIDQpOwogICAgICAgICAgICAgUERGX0dlbmVyYXRlRmlsZUlEKChGWF9EV09SRCkodWludHB0cl90KXRoaXMsIG1fZHdMYXN0T2JqTnVtLCBwQnVmZmVyKTsKICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyBic0J1ZmZlcigoY29uc3QgdWludDhfdCopcEJ1ZmZlciwgNCAqIHNpemVvZihGWF9EV09SRCkpOwotICAgICAgICAgICAgbV9wSURBcnJheS0+QWRkKENQREZfU3RyaW5nOjpDcmVhdGUoYnNCdWZmZXIsIFRSVUUpLCBtX3BEb2N1bWVudCk7CisgICAgICAgICAgICBtX3BJREFycmF5LT5BZGQoQ1BERl9TdHJpbmc6OkNyZWF0ZShic0J1ZmZlciwgdHJ1ZSksIG1fcERvY3VtZW50KTsKICAgICAgICAgfQogICAgICAgICBpZiAocEJ1ZmZlcikgewogICAgICAgICAgICAgRlhfRnJlZShwQnVmZmVyKTsKQEAgLTIwNTUsNyArMjA1NSw3IEBACiAgICAgICAgIEZYX0RXT1JEKiBwQnVmZmVyID0gRlhfQWxsb2MoRlhfRFdPUkQsIDQpOwogICAgICAgICBQREZfR2VuZXJhdGVGaWxlSUQoKEZYX0RXT1JEKSh1aW50cHRyX3QpdGhpcywgbV9kd0xhc3RPYmpOdW0sIHBCdWZmZXIpOwogICAgICAgICBDRlhfQnl0ZVN0cmluZ0MgYnNCdWZmZXIoKGNvbnN0IHVpbnQ4X3QqKXBCdWZmZXIsIDQgKiBzaXplb2YoRlhfRFdPUkQpKTsKLSAgICAgICAgbV9wSURBcnJheS0+QWRkKENQREZfU3RyaW5nOjpDcmVhdGUoYnNCdWZmZXIsIFRSVUUpLCBtX3BEb2N1bWVudCk7CisgICAgICAgIG1fcElEQXJyYXktPkFkZChDUERGX1N0cmluZzo6Q3JlYXRlKGJzQnVmZmVyLCB0cnVlKSwgbV9wRG9jdW1lbnQpOwogICAgICAgICBGWF9GcmVlKHBCdWZmZXIpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMjA3MSw4ICsyMDcxLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1fcENyeXB0b0hhbmRsZXIgPSBuZXcgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI7CiAgICAgICAgICAgICBtX3BDcnlwdG9IYW5kbGVyLT5Jbml0KG1fcEVuY3J5cHREaWN0LCAmaGFuZGxlcik7Ci0gICAgICAgICAgICBtX2JOZXdDcnlwdG8gPSBUUlVFOwotICAgICAgICAgICAgbV9iU2VjdXJpdHlDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgIG1fYk5ld0NyeXB0byA9IHRydWU7CisgICAgICAgICAgICBtX2JTZWN1cml0eUNoYW5nZWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMjEwMywxOCArMjEwMywxOCBAQAogICAgIH0KICAgICByZXR1cm4gbV9pU3RhZ2U7CiB9Ci1GWF9CT09MIENQREZfQ3JlYXRvcjo6U2V0RmlsZVZlcnNpb24oaW50MzJfdCBmaWxlVmVyc2lvbiApCitib29sIENQREZfQ3JlYXRvcjo6U2V0RmlsZVZlcnNpb24oaW50MzJfdCBmaWxlVmVyc2lvbiApCiB7CiAgICAgaWYgKGZpbGVWZXJzaW9uIDwgMTAgfHwgZmlsZVZlcnNpb24gPiAxNykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9GaWxlVmVyc2lvbiA9IGZpbGVWZXJzaW9uOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDUERGX0NyZWF0b3I6OlJlbW92ZVNlY3VyaXR5KCkKIHsKICAgICBSZXNldFN0YW5kYXJkU2VjdXJpdHkoKTsKLSAgICBtX2JTZWN1cml0eUNoYW5nZWQgPSBUUlVFOworICAgIG1fYlNlY3VyaXR5Q2hhbmdlZCA9IHRydWU7CiAgICAgbV9wRW5jcnlwdERpY3QgPSBOVUxMOwogICAgIG1fcENyeXB0b0hhbmRsZXIgPSBOVUxMOwogfQpAQCAtMjEyNCw3ICsyMTI0LDcgQEAKICAgICAgICAgZGVsZXRlIG1fcENyeXB0b0hhbmRsZXI7CiAgICAgICAgIG1fcENyeXB0b0hhbmRsZXIgPSBOVUxMOwogICAgIH0KLSAgICBtX2JOZXdDcnlwdG8gPSBGQUxTRTsKKyAgICBtX2JOZXdDcnlwdG8gPSBmYWxzZTsKICAgICBpZiAoIW1fYlN0YW5kYXJkU2VjdXJpdHkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTIxMzIsNSArMjEzMiw1IEBACiAgICAgICAgIG1fcEVuY3J5cHREaWN0LT5SZWxlYXNlKCk7CiAgICAgICAgIG1fcEVuY3J5cHREaWN0ID0gTlVMTDsKICAgICB9Ci0gICAgbV9iU3RhbmRhcmRTZWN1cml0eSA9IEZBTFNFOworICAgIG1fYlN0YW5kYXJkU2VjdXJpdHkgPSBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9kb2MuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2RvYy5jcHAKaW5kZXggNWE1ZmI5NC4uMzYyMWM3OSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2RvYy5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2RvYy5jcHAKQEAgLTEyLDcgKzEyLDcgQEAKIHsKICAgICBtX3BSb290RGljdCA9IE5VTEw7CiAgICAgbV9wSW5mb0RpY3QgPSBOVUxMOwotICAgIG1fYkxpbmVhcml6ZWQgPSBGQUxTRTsKKyAgICBtX2JMaW5lYXJpemVkID0gZmFsc2U7CiAgICAgbV9kd0ZpcnN0UGFnZU5vID0gMDsKICAgICBtX2R3Rmlyc3RQYWdlT2JqTnVtID0gMDsKICAgICBtX3BEb2NQYWdlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkNyZWF0ZURvY0RhdGEodGhpcyk7CkBAIC0yMTUsNyArMjE1LDcgQEAKICAgICB9CiAgICAgRlhfRnJlZSh3aWR0aHMpOwogfQotQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRXaW5kb3dzRm9udChMT0dGT05UVyogcExvZ0ZvbnQsIEZYX0JPT0wgYlZlcnQsIEZYX0JPT0wgYlRyYW5zbGF0ZU5hbWUpCitDUERGX0ZvbnQqIENQREZfRG9jdW1lbnQ6OkFkZFdpbmRvd3NGb250KExPR0ZPTlRXKiBwTG9nRm9udCwgYm9vbCBiVmVydCwgYm9vbCBiVHJhbnNsYXRlTmFtZSkKIHsKICAgICBMT0dGT05UQSBsZmE7CiAgICAgRlhTWVNfbWVtY3B5KCZsZmEsIHBMb2dGb250LCAoY2hhciopbGZhLmxmRmFjZU5hbWUgLSAoY2hhciopJmxmYSk7CkBAIC0yMzksNyArMjM5LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KLUNQREZfRm9udCogQ1BERl9Eb2N1bWVudDo6QWRkV2luZG93c0ZvbnQoTE9HRk9OVEEqIHBMb2dGb250LCBGWF9CT09MIGJWZXJ0LCBGWF9CT09MIGJUcmFuc2xhdGVOYW1lKQorQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRXaW5kb3dzRm9udChMT0dGT05UQSogcExvZ0ZvbnQsIGJvb2wgYlZlcnQsIGJvb2wgYlRyYW5zbGF0ZU5hbWUpCiB7CiAgICAgcExvZ0ZvbnQtPmxmSGVpZ2h0ID0gLTEwMDA7CiAgICAgcExvZ0ZvbnQtPmxmV2lkdGggPSAwOwpAQCAtMjY5LDcgKzI2OSw3IEBACiAgICAgaWYgKChwTG9nRm9udC0+bGZQaXRjaEFuZEZhbWlseSAmIDB4ZjgpID09IEZGX1NDUklQVCkgewogICAgICAgICBmbGFncyB8PSBQREZGT05UX1NDUklQVDsKICAgICB9Ci0gICAgRlhfQk9PTCBiQ0pLID0gcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBDSElORVNFQklHNV9DSEFSU0VUIHx8IHBMb2dGb250LT5sZkNoYXJTZXQgPT0gR0IyMzEyX0NIQVJTRVQgfHwKKyAgICBib29sIGJDSksgPSBwTG9nRm9udC0+bGZDaGFyU2V0ID09IENISU5FU0VCSUc1X0NIQVJTRVQgfHwgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBHQjIzMTJfQ0hBUlNFVCB8fAogICAgICAgICAgICAgICAgICAgIHBMb2dGb250LT5sZkNoYXJTZXQgPT0gSEFOR0VVTF9DSEFSU0VUIHx8IHBMb2dGb250LT5sZkNoYXJTZXQgPT0gU0hJRlRKSVNfQ0hBUlNFVDsKICAgICBDRlhfQnl0ZVN0cmluZyBiYXNlZm9udDsKICAgICBpZiAoYlRyYW5zbGF0ZU5hbWUgJiYgYkNKSykgewpAQCAtNTQ5LDcgKzU0OSw3IEBACiAgICAgZGVzdCA9IChGWF9DSEFSKilwQnVmZmVyOwogICAgIGZyZWUocEJ1ZmZlcik7CiB9Ci1GWF9CT09MIElzSGFzQ2hhclNldChDRkFycmF5UmVmIGxhbmd1YWdlcywgY29uc3QgQ0ZYX0RXb3JkQXJyYXkgJmNoYXJTZXRzKQorYm9vbCBJc0hhc0NoYXJTZXQoQ0ZBcnJheVJlZiBsYW5ndWFnZXMsIGNvbnN0IENGWF9EV29yZEFycmF5ICZjaGFyU2V0cykKIHsKICAgICBpbnQgaUNvdW50ID0gY2hhclNldHMuR2V0U2l6ZSgpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ0ZBcnJheUdldENvdW50KGxhbmd1YWdlcyk7ICsraSkgewpAQCAtNTU3LDExICs1NTcsMTEgQEAKICAgICAgICAgRlhfRFdPUkQgQ2hhclNldCA9IEZYX0dldENoYXJzZXRGcm9tTGFuZyhDRlN0cmluZ0dldENTdHJpbmdQdHIobGFuZ3VhZ2UsIGtDRlN0cmluZ0VuY29kaW5nTWFjUm9tYW4pLCAtMSk7CiAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaUNvdW50OyArK2opIHsKICAgICAgICAgICAgIGlmIChDaGFyU2V0ID09IGNoYXJTZXRzW2pdKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIHZvaWQgRlhfR2V0Q2hhcldpZHRoKENURm9udFJlZiBmb250LCBVbmlDaGFyIHN0YXJ0LCBVbmlDaGFyIGVuZCwgaW50KiB3aWR0aCkKIHsKQEAgLTU5OSw3ICs1OTksNyBAQAogICAgIH0KICAgICBGWF9GcmVlKHdpZHRocyk7CiB9Ci1DUERGX0ZvbnQqIENQREZfRG9jdW1lbnQ6OkFkZE1hY0ZvbnQoQ1RGb250UmVmIHBGb250LCBGWF9CT09MIGJWZXJ0LCBGWF9CT09MIGJUcmFuc2xhdGVOYW1lKQorQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRNYWNGb250KENURm9udFJlZiBwRm9udCwgYm9vbCBiVmVydCwgYm9vbCBiVHJhbnNsYXRlTmFtZSkKIHsKICAgICBDVEZvbnRSZWYgZm9udCA9IChDVEZvbnRSZWYpcEZvbnQ7CiAgICAgQ1RGb250RGVzY3JpcHRvclJlZiBkZXNjcmlwdG9yID0gQ1RGb250Q29weUZvbnREZXNjcmlwdG9yKGZvbnQpOwpAQCAtNjA3LDcgKzYwNyw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBDRlhfQnl0ZVN0cmluZyBiYXNlZm9udDsKLSAgICBGWF9CT09MIGJDSksgPSBGQUxTRTsKKyAgICBib29sIGJDSksgPSBmYWxzZTsKICAgICBpbnQgZmxhZ3MgPSAwLCBpdGFsaWNhbmdsZSA9IDAsIGFzY2VuZCA9IDAsIGRlc2NlbmQgPSAwLCBjYXBoZWlnaHQgPSAwLCBiYm94WzRdOwogICAgIEZYU1lTX21lbXNldChiYm94LCAwLCBzaXplb2YoaW50KSAqIDQpOwogICAgIENGQXJyYXlSZWYgbGFuZ3VhZ2VzID0gKENGQXJyYXlSZWYpQ1RGb250RGVzY3JpcHRvckNvcHlBdHRyaWJ1dGUoZGVzY3JpcHRvciwga0NURm9udExhbmd1YWdlc0F0dHJpYnV0ZSk7CkBAIC02MjEsNyArNjIxLDcgQEAKICAgICBjaGFyU2V0cy5BZGQoRlhGT05UX0hBTkdFVUxfQ0hBUlNFVCk7CiAgICAgY2hhclNldHMuQWRkKEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKTsKICAgICBpZiAoSXNIYXNDaGFyU2V0KGxhbmd1YWdlcywgY2hhclNldHMpKSB7Ci0gICAgICAgIGJDSksgPSBUUlVFOworICAgICAgICBiQ0pLID0gdHJ1ZTsKICAgICB9CiAgICAgQ0ZSZWxlYXNlKGRlc2NyaXB0b3IpOwogICAgIENGRGljdGlvbmFyeVJlZiB0cmFpdHMgPSAoQ0ZEaWN0aW9uYXJ5UmVmKUNURm9udENvcHlUcmFpdHMoZm9udCk7CkBAIC03MzcsNyArNzM3LDcgQEAKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY21hcDsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgb3JkZXJpbmc7CiAgICAgICAgIGludCBzdXBwbGVtZW50OwotICAgICAgICBGWF9CT09MIGJGb3VuZCA9IEZBTFNFOworICAgICAgICBib29sIGJGb3VuZCA9IGZhbHNlOwogICAgICAgICBDUERGX0FycmF5KiBwV2lkdGhBcnJheSA9IG5ldyBDUERGX0FycmF5OwogICAgICAgICBjaGFyU2V0cy5SZW1vdmVBbGwoKTsKICAgICAgICAgY2hhclNldHMuQWRkKEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUKTsKQEAgLTc0Nyw3ICs3NDcsNyBAQAogICAgICAgICAgICAgc3VwcGxlbWVudCA9IDQ7CiAgICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigxKTsKICAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGZvbnQsIDB4MjAsIDB4N2UsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgIGJGb3VuZCA9IFRSVUU7CisgICAgICAgICAgICBiRm91bmQgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGNoYXJTZXRzLlJlbW92ZUFsbCgpOwogICAgICAgICBjaGFyU2V0cy5BZGQoRlhGT05UX0dCMjMxMl9DSEFSU0VUKTsKQEAgLTc1OCw3ICs3NTgsNyBAQAogICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkoZm9udCwgMHgyMCwgMHgyMCwgcFdpZHRoQXJyYXkpOwogICAgICAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoODE0KTsKICAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGZvbnQsIDB4MjEsIDB4N2UsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgIGJGb3VuZCA9IFRSVUU7CisgICAgICAgICAgICBiRm91bmQgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGNoYXJTZXRzLlJlbW92ZUFsbCgpOwogICAgICAgICBjaGFyU2V0cy5BZGQoRlhGT05UX0hBTkdFVUxfQ0hBUlNFVCk7CkBAIC03NjgsNyArNzY4LDcgQEAKICAgICAgICAgICAgIHN1cHBsZW1lbnQgPSAyOwogICAgICAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoMSk7CiAgICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShmb250LCAweDIwLCAweDdlLCBwV2lkdGhBcnJheSk7Ci0gICAgICAgICAgICBiRm91bmQgPSBUUlVFOworICAgICAgICAgICAgYkZvdW5kID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBjaGFyU2V0cy5SZW1vdmVBbGwoKTsKICAgICAgICAgY2hhclNldHMuQWRkKEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKTsKQEAgLTg2NywxMiArODY3LDEyIEBACiAgICAgfQogICAgIEZYX0ZyZWUod2lkdGhzKTsKIH0KLUNQREZfRm9udCogQ1BERl9Eb2N1bWVudDo6QWRkRm9udChDRlhfRm9udCogcEZvbnQsIGludCBjaGFyc2V0LCBGWF9CT09MIGJWZXJ0KQorQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRGb250KENGWF9Gb250KiBwRm9udCwgaW50IGNoYXJzZXQsIGJvb2wgYlZlcnQpCiB7CiAgICAgaWYgKHBGb250ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIEZYX0JPT0wgYkNKSyA9IGNoYXJzZXQgPT0gRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQgfHwgY2hhcnNldCA9PSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQgfHwKKyAgICBib29sIGJDSksgPSBjaGFyc2V0ID09IEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUIHx8IGNoYXJzZXQgPT0gRlhGT05UX0dCMjMxMl9DSEFSU0VUIHx8CiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9PSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUIHx8IGNoYXJzZXQgPT0gRlhGT05UX1NISUZUSklTX0NIQVJTRVQ7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgYmFzZWZvbnQgPSBwRm9udC0+R2V0RmFtaWx5TmFtZSgpOwogICAgIGJhc2Vmb250LlJlcGxhY2UoIiAiLCAiIik7CkBAIC0xMDUyLDcgKzEwNTIsNyBAQAogICAgIHJldHVybiBMb2FkRm9udChwQmFzZURpY3QpOwogfQogc3RhdGljIGludCBJbnNlcnREZWxldGVQREZQYWdlKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcFBhZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUGFnZXNUb0dvLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLCBGWF9CT09MIGJJbnNlcnQsIENGWF9QdHJBcnJheSYgc3RhY2tMaXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUGFnZXNUb0dvLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLCBib29sIGJJbnNlcnQsIENGWF9QdHJBcnJheSYgc3RhY2tMaXN0KQogewogICAgIENQREZfQXJyYXkqIHBLaWRMaXN0ID0gcFBhZ2VzLT5HZXRBcnJheSgiS2lkcyIpOwogICAgIGlmICghcEtpZExpc3QpIHsKQEAgLTExMjIsNyArMTEyMiw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IHN0YWNrOwogICAgICAgICBzdGFjay5BZGQocFBhZ2VzKTsKLSAgICAgICAgaWYgKEluc2VydERlbGV0ZVBERlBhZ2UocERvYywgcFBhZ2VzLCBpUGFnZSwgcFBhZ2VEaWN0LCBUUlVFLCBzdGFjaykgPCAwKSB7CisgICAgICAgIGlmIChJbnNlcnREZWxldGVQREZQYWdlKHBEb2MsIHBQYWdlcywgaVBhZ2UsIHBQYWdlRGljdCwgdHJ1ZSwgc3RhY2spIDwgMCkgewogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgfQpAQCAtMTE2NSw3ICsxMTY1LDcgQEAKICAgICB9CiAgICAgQ0ZYX1B0ckFycmF5IHN0YWNrOwogICAgIHN0YWNrLkFkZChwUGFnZXMpOwotICAgIGlmIChJbnNlcnREZWxldGVQREZQYWdlKHRoaXMsIHBQYWdlcywgaVBhZ2UsIE5VTEwsIEZBTFNFLCBzdGFjaykgPCAwKSB7CisgICAgaWYgKEluc2VydERlbGV0ZVBERlBhZ2UodGhpcywgcFBhZ2VzLCBpUGFnZSwgTlVMTCwgZmFsc2UsIHN0YWNrKSA8IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtX1BhZ2VMaXN0LlJlbW92ZUF0KGlQYWdlKTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9pbWFnZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfaW1hZ2UuY3BwCmluZGV4IGRhZDczMjYuLjIxY2UzMWUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9pbWFnZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2ltYWdlLmNwcApAQCAtMTYsNyArMTYsNyBAQAogICAgIGludDMyX3QgaGVpZ2h0OwogICAgIGludDMyX3QgbnVtX2NvbXBzOwogICAgIGludDMyX3QgYml0czsKLSAgICBGWF9CT09MIGNvbG9yX3RyYW5zOworICAgIGJvb2wgY29sb3JfdHJhbnM7CiAgICAgaWYgKCFDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+CiAgICAgICAgICAgICBMb2FkSW5mbyhwRGF0YSwgc2l6ZSwgd2lkdGgsIGhlaWdodCwgbnVtX2NvbXBzLCBiaXRzLCBjb2xvcl90cmFucykpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC00OCw3ICs0OCw3IEBACiAgICAgICAgIHBEaWN0LT5TZXRBdCgiRGVjb2RlUGFybXMiLCBwUGFybXMpOwogICAgICAgICBwUGFybXMtPlNldEF0SW50ZWdlcigiQ29sb3JUcmFuc2Zvcm0iLCAwKTsKICAgICB9Ci0gICAgbV9iSXNNYXNrID0gRkFMU0U7CisgICAgbV9iSXNNYXNrID0gZmFsc2U7CiAgICAgbV9XaWR0aCA9IHdpZHRoOwogICAgIG1fSGVpZ2h0ID0gaGVpZ2h0OwogICAgIGlmIChtX3BTdHJlYW0gPT0gTlVMTCkgewpAQCAtOTIsNyArOTIsNyBAQAogdm9pZCBfRENURW5jb2RlQml0bWFwKENQREZfRGljdGlvbmFyeSAqcEJpdG1hcERpY3QsIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IHF1YWxpdHksIHVpbnQ4X3QqICZidWYsIEZYX1NUUlNJWkUgJnNpemUpCiB7CiB9Ci12b2lkIF9KQklHMkVuY29kZUJpdG1hcChDUERGX0RpY3Rpb25hcnkgKnBCaXRtYXBEaWN0LCBjb25zdCBDRlhfRElCaXRtYXAgKnBCaXRtYXAsIENQREZfRG9jdW1lbnQgKnBEb2MsIHVpbnQ4X3QqICZidWYsIEZYX1NUUlNJWkUgJnNpemUsIEZYX0JPT0wgYkxvc3NMZXNzKQordm9pZCBfSkJJRzJFbmNvZGVCaXRtYXAoQ1BERl9EaWN0aW9uYXJ5ICpwQml0bWFwRGljdCwgY29uc3QgQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBDUERGX0RvY3VtZW50ICpwRG9jLCB1aW50OF90KiAmYnVmLCBGWF9TVFJTSVpFICZzaXplLCBib29sIGJMb3NzTGVzcykKIHsKIH0KIHZvaWQgQ1BERl9JbWFnZTo6U2V0SW1hZ2UoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQzMl90IGlDb21wcmVzcywgSUZYX0ZpbGVXcml0ZSAqcEZpbGVXcml0ZSwgSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQsIGNvbnN0IENGWF9ESUJpdG1hcCogcE1hc2ssIGNvbnN0IENQREZfSW1hZ2VTZXRQYXJhbSogcFBhcmFtKQpAQCAtMTA1LDcgKzEwNSw3IEBACiAgICAgdWludDhfdCogc3JjX2J1ZiA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpOwogICAgIGludDMyX3Qgc3JjX3BpdGNoID0gcEJpdG1hcC0+R2V0UGl0Y2goKTsKICAgICBpbnQzMl90IGJwcCA9IHBCaXRtYXAtPkdldEJQUCgpOwotICAgIEZYX0JPT0wgYlVzZU1hdHRlID0gcFBhcmFtICYmIHBQYXJhbS0+cE1hdHRlQ29sb3IgJiYgKHBCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpOworICAgIGJvb2wgYlVzZU1hdHRlID0gcFBhcmFtICYmIHBQYXJhbS0+cE1hdHRlQ29sb3IgJiYgKHBCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpOwogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwogICAgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlR5cGUiKSwgRlhfQlNUUkMoIlhPYmplY3QiKSk7CiAgICAgcERpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiU3VidHlwZSIpLCBGWF9CU1RSQygiSW1hZ2UiKSk7CkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICAgICAgICAgIEFyZ2JEZWNvZGUocEJpdG1hcC0+R2V0UGFsZXR0ZUFyZ2IoMSksIHNldF9hLCBzZXRfciwgc2V0X2csIHNldF9iKTsKICAgICAgICAgfQogICAgICAgICBpZiAoc2V0X2EgPT0gMCB8fCByZXNldF9hID09IDApIHsKLSAgICAgICAgICAgIHBEaWN0LT5TZXRBdChGWF9CU1RSQygiSW1hZ2VNYXNrIiksIG5ldyBDUERGX0Jvb2xlYW4oVFJVRSkpOworICAgICAgICAgICAgcERpY3QtPlNldEF0KEZYX0JTVFJDKCJJbWFnZU1hc2siKSwgbmV3IENQREZfQm9vbGVhbih0cnVlKSk7CiAgICAgICAgICAgICBpZiAocmVzZXRfYSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gbmV3IENQREZfQXJyYXk7CiAgICAgICAgICAgICAgICAgcEFycmF5LT5BZGRJbnRlZ2VyKDEpOwpAQCAtMTQyLDcgKzE0Miw3IEBACiAgICAgICAgICAgICBwQnVmWzRdID0gKEZYX0NIQVIpc2V0X2c7CiAgICAgICAgICAgICBwQnVmWzVdID0gKEZYX0NIQVIpc2V0X2I7CiAgICAgICAgICAgICBjdC5SZWxlYXNlQnVmZmVyKDYpOwotICAgICAgICAgICAgcENTLT5BZGQoQ1BERl9TdHJpbmc6OkNyZWF0ZShjdCwgVFJVRSkpOworICAgICAgICAgICAgcENTLT5BZGQoQ1BERl9TdHJpbmc6OkNyZWF0ZShjdCwgdHJ1ZSkpOwogICAgICAgICAgICAgcERpY3QtPlNldEF0KEZYX0JTVFJDKCJDb2xvclNwYWNlIiksIHBDUyk7CiAgICAgICAgIH0KICAgICAgICAgcERpY3QtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpLCAxKTsKQEAgLTE5NCwxMCArMTk0LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwTWFza0JpdG1hcCA9IE5VTEw7Ci0gICAgRlhfQk9PTCBiRGVsZXRlTWFzayA9IEZBTFNFOworICAgIGJvb2wgYkRlbGV0ZU1hc2sgPSBmYWxzZTsKICAgICBpZiAocEJpdG1hcC0+SGFzQWxwaGEoKSkgewogICAgICAgICBwTWFza0JpdG1hcCA9IHBCaXRtYXAtPkdldEFscGhhTWFzaygpOwotICAgICAgICBiRGVsZXRlTWFzayA9IFRSVUU7CisgICAgICAgIGJEZWxldGVNYXNrID0gdHJ1ZTsKICAgICB9CiAgICAgaWYgKCFwTWFza0JpdG1hcCAmJiBwTWFzaykgewogICAgICAgICBGWERJQl9Gb3JtYXQgbWFza0Zvcm1hdCA9IHBNYXNrLT5HZXRGb3JtYXQoKTsKQEAgLTIyMCw3ICsyMjAsNyBAQAogICAgICAgICBpZiAocE1hc2tCaXRtYXAtPkdldEJQUCgpID09IDggJiYgKGlDb21wcmVzcyAmIFBERl9JTUFHRV9NQVNLX0xPU1NZX0NPTVBSRVNTKSAhPSAwKSB7CiAgICAgICAgICAgICBfRENURW5jb2RlQml0bWFwKHBNYXNrRGljdCwgcE1hc2tCaXRtYXAsIHBQYXJhbSA/IHBQYXJhbS0+blF1YWxpdHkgOiA3NSwgbWFza19idWYsIG1hc2tfc2l6ZSk7CiAgICAgICAgIH0gZWxzZSBpZiAocE1hc2tCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCXzFicHBNYXNrKSB7Ci0gICAgICAgICAgICBfSkJJRzJFbmNvZGVCaXRtYXAocE1hc2tEaWN0LCBwTWFza0JpdG1hcCwgbV9wRG9jdW1lbnQsIG1hc2tfYnVmLCBtYXNrX3NpemUsIFRSVUUpOworICAgICAgICAgICAgX0pCSUcyRW5jb2RlQml0bWFwKHBNYXNrRGljdCwgcE1hc2tCaXRtYXAsIG1fcERvY3VtZW50LCBtYXNrX2J1ZiwgbWFza19zaXplLCB0cnVlKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1hc2tfYnVmID0gRlhfQWxsb2MyRCh1aW50OF90LCBtYXNrSGVpZ2h0LCBtYXNrV2lkdGgpOwogICAgICAgICAgICAgbWFza19zaXplID0gbWFza0hlaWdodCAqIG1hc2tXaWR0aDsgIC8vIFNhZmUgc2luY2UgY2hlY2tlZCBhbGxvYyByZXR1cm5lZC4KQEAgLTI0NSwxNSArMjQ1LDE1IEBACiAgICAgICAgICAgICBkZWxldGUgcE1hc2tCaXRtYXA7CiAgICAgICAgIH0KICAgICB9Ci0gICAgRlhfQk9PTCBiU3RyZWFtID0gcEZpbGVXcml0ZSAhPSBOVUxMICYmIHBGaWxlUmVhZCAhPSBOVUxMOworICAgIGJvb2wgYlN0cmVhbSA9IHBGaWxlV3JpdGUgIT0gTlVMTCAmJiBwRmlsZVJlYWQgIT0gTlVMTDsKICAgICBpZiAob3BUeXBlID09IDApIHsKICAgICAgICAgaWYgKGlDb21wcmVzcyAmIFBERl9JTUFHRV9MT1NTTEVTU19DT01QUkVTUykgewogICAgICAgICAgICAgaWYgKHBCaXRtYXAtPkdldEJQUCgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBfSkJJRzJFbmNvZGVCaXRtYXAocERpY3QsIHBCaXRtYXAsIG1fcERvY3VtZW50LCBkZXN0X2J1ZiwgZGVzdF9zaXplLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBfSkJJRzJFbmNvZGVCaXRtYXAocERpY3QsIHBCaXRtYXAsIG1fcERvY3VtZW50LCBkZXN0X2J1ZiwgZGVzdF9zaXplLCB0cnVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgX0pCSUcyRW5jb2RlQml0bWFwKHBEaWN0LCBwQml0bWFwLCBtX3BEb2N1bWVudCwgZGVzdF9idWYsIGRlc3Rfc2l6ZSwgRkFMU0UpOworICAgICAgICAgICAgICAgIF9KQklHMkVuY29kZUJpdG1hcChwRGljdCwgcEJpdG1hcCwgbV9wRG9jdW1lbnQsIGRlc3RfYnVmLCBkZXN0X3NpemUsIGZhbHNlKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAocEJpdG1hcC0+R2V0QlBQKCkgPj0gOCAmJiBwQml0bWFwLT5HZXRQYWxldHRlKCkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCAqcE5ld0JpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXAoKTsKICAgICAgICAgICAgICAgICBwTmV3Qml0bWFwLT5Db3B5KHBCaXRtYXApOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZm9udF9pbnQuaCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZvbnRfaW50LmgKaW5kZXggZjU3ZTUyNy4uZTUyNTQwOCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZm9udF9pbnQuaAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mb250X2ludC5oCkBAIC0xMiwxNSArMTIsMTUgQEAKIHB1YmxpYzoKICAgICBDUERGX0NNYXBNYW5hZ2VyKCk7CiAgICAgfkNQREZfQ01hcE1hbmFnZXIoKTsKLSAgICB2b2lkKgkJCQlHZXRQYWNrYWdlKEZYX0JPT0wgYlByb21wdCk7Ci0gICAgQ1BERl9DTWFwKgkJCQlHZXRQcmVkZWZpbmVkQ01hcChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgRlhfQk9PTCBiUHJvbXB0KTsKLSAgICBDUERGX0NJRDJVbmljb2RlTWFwKglHZXRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgRlhfQk9PTCBiUHJvbXB0KTsKKyAgICB2b2lkKgkJCQlHZXRQYWNrYWdlKGJvb2wgYlByb21wdCk7CisgICAgQ1BERl9DTWFwKgkJCQlHZXRQcmVkZWZpbmVkQ01hcChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgYm9vbCBiUHJvbXB0KTsKKyAgICBDUERGX0NJRDJVbmljb2RlTWFwKglHZXRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgYm9vbCBiUHJvbXB0KTsKICAgICB2b2lkCQkJCQlSZWxvYWRBbGwoKTsKIHByaXZhdGU6Ci0gICAgQ1BERl9DTWFwKgkJCQlMb2FkUHJlZGVmaW5lZENNYXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsICBGWF9CT09MIGJQcm9tcHQpOwotICAgIENQREZfQ0lEMlVuaWNvZGVNYXAqCUxvYWRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgRlhfQk9PTCBiUHJvbXB0KTsKLSAgICB2b2lkCQkJCQlEcm9wQWxsKEZYX0JPT0wgYlJlbG9hZCk7Ci0gICAgRlhfQk9PTAkJCQkJbV9iUHJvbXB0ZWQ7CisgICAgQ1BERl9DTWFwKgkJCQlMb2FkUHJlZGVmaW5lZENNYXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsICBib29sIGJQcm9tcHQpOworICAgIENQREZfQ0lEMlVuaWNvZGVNYXAqCUxvYWRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgYm9vbCBiUHJvbXB0KTsKKyAgICB2b2lkCQkJCQlEcm9wQWxsKGJvb2wgYlJlbG9hZCk7CisgICAgYm9vbAkJCQkJbV9iUHJvbXB0ZWQ7CiAgICAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgltX0NNYXBzOwogICAgIENQREZfQ0lEMlVuaWNvZGVNYXAqCW1fQ0lEMlVuaWNvZGVNYXBzWzZdOwogfTsKQEAgLTU2LDcgKzU2LDcgQEAKIHB1YmxpYzoKICAgICBDUERGX0NNYXBQYXJzZXIoKTsKICAgICB+Q1BERl9DTWFwUGFyc2VyKCkge30KLSAgICBGWF9CT09MCUluaXRpYWxpemUoQ1BERl9DTWFwKik7CisgICAgYm9vbAlJbml0aWFsaXplKENQREZfQ01hcCopOwogICAgIHZvaWQJUGFyc2VXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKTsKICAgICBDRlhfQmluYXJ5QnVmCW1fQWRkTWFwczsKIHByaXZhdGU6CkBAIC04MCwxMCArODAsMTAgQEAKIHsKIHB1YmxpYzoKICAgICBDUERGX0NNYXAoKTsKLSAgICBGWF9CT09MCQkJCQlMb2FkUHJlZGVmaW5lZChDUERGX0NNYXBNYW5hZ2VyKiBwTWdyLCBjb25zdCBGWF9DSEFSKiBuYW1lLCBGWF9CT09MIGJQcm9tcHRDSkspOwotICAgIEZYX0JPT0wJCQkJCUxvYWRFbWJlZGRlZChjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKTsKKyAgICBib29sCQkJCQlMb2FkUHJlZGVmaW5lZChDUERGX0NNYXBNYW5hZ2VyKiBwTWdyLCBjb25zdCBGWF9DSEFSKiBuYW1lLCBib29sIGJQcm9tcHRDSkspOworICAgIGJvb2wJCQkJCUxvYWRFbWJlZGRlZChjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKTsKICAgICB2b2lkCQkJCQlSZWxlYXNlKCk7Ci0gICAgRlhfQk9PTAkJCQkJSXNMb2FkZWQoKSBjb25zdAorICAgIGJvb2wJCQkJCUlzTG9hZGVkKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX2JMb2FkZWQ7CiAgICAgfQpAQCAtOTEsNyArOTEsNyBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fQ2hhcnNldDsKICAgICB9Ci0gICAgRlhfQk9PTAkJCQkJSXNWZXJ0V3JpdGluZygpIGNvbnN0CisgICAgYm9vbAkJCQkJSXNWZXJ0V3JpdGluZygpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iVmVydGljYWw7CiAgICAgfQpAQCAtMTA5LDE0ICsxMDksMTQgQEAKICAgICBmcmllbmQgY2xhc3MJCQlDUERGX0NJREZvbnQ7CiBwcm90ZWN0ZWQ6CiAgICAgQ0ZYX0J5dGVTdHJpbmcJCQltX1ByZWRlZmluZWRDTWFwOwotICAgIEZYX0JPT0wJCQkJCW1fYlZlcnRpY2FsOworICAgIGJvb2wJCQkJCW1fYlZlcnRpY2FsOwogICAgIGludAkJCQkJCW1fQ2hhcnNldCwgbV9Db2Rpbmc7CiAgICAgQ29kaW5nU2NoZW1lCQkJbV9Db2RpbmdTY2hlbWU7CiAgICAgaW50CQkJCQkJbV9uQ29kZVJhbmdlczsKICAgICB1aW50OF90KgkJCQltX3BMZWFkaW5nQnl0ZXM7CiAgICAgRlhfV09SRCoJCQkJbV9wTWFwcGluZzsKICAgICB1aW50OF90KgkJCQltX3BBZGRNYXBwaW5nOwotICAgIEZYX0JPT0wJCQkJCW1fYkxvYWRlZDsKKyAgICBib29sCQkJCQltX2JMb2FkZWQ7CiAgICAgY29uc3QgRlhDTUFQX0NNYXAqCQltX3BFbWJlZE1hcDsKICAgICBDUERGX0NNYXAqCQkJCW1fcFVzZU1hcDsKIH07CkBAIC0xNDYsOSArMTQ2LDkgQEAKIHB1YmxpYzoKICAgICBDUERGX0NJRDJVbmljb2RlTWFwKCk7CiAgICAgfkNQREZfQ0lEMlVuaWNvZGVNYXAoKTsKLSAgICBGWF9CT09MCQlJbml0aWFsaXplKCk7Ci0gICAgRlhfQk9PTAkJSXNMb2FkZWQoKTsKLSAgICB2b2lkCQlMb2FkKENQREZfQ01hcE1hbmFnZXIqIHBNZ3IsIGludCBjaGFyc2V0LCBGWF9CT09MIGJQcm9tcHRDSkspOworICAgIGJvb2wJCUluaXRpYWxpemUoKTsKKyAgICBib29sCQlJc0xvYWRlZCgpOworICAgIHZvaWQJCUxvYWQoQ1BERl9DTWFwTWFuYWdlciogcE1nciwgaW50IGNoYXJzZXQsIGJvb2wgYlByb21wdENKSyk7CiAgICAgRlhfV0NIQVIJVW5pY29kZUZyb21DSUQoRlhfV09SRCBDSUQpOwogcHJvdGVjdGVkOgogICAgIGludAkJCW1fQ2hhcnNldDsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnQuY3BwCmluZGV4IDgwMzdhOGMuLmFmY2NlNmQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250LmNwcApAQCAtMTIsMTYgKzEyLDE2IEBACiAjaW5jbHVkZSAiLi4vZnBkZl9wYWdlL3BhZ2VpbnQuaCIKICNpbmNsdWRlICJmb250X2ludC5oIgogCi1GWF9CT09MIEZUX1VzZVRUQ2hhcm1hcChGWEZUX0ZhY2UgZmFjZSwgaW50IHBsYXRmb3JtX2lkLCBpbnQgZW5jb2RpbmdfaWQpCitib29sIEZUX1VzZVRUQ2hhcm1hcChGWEZUX0ZhY2UgZmFjZSwgaW50IHBsYXRmb3JtX2lkLCBpbnQgZW5jb2RpbmdfaWQpCiB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChmYWNlKTsgaSArKykgewogICAgICAgICBpZiAoRlhGVF9HZXRfQ2hhcm1hcF9QbGF0Zm9ybUlEKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbaV0pID09IHBsYXRmb3JtX2lkICYmCiAgICAgICAgICAgICAgICAgRlhGVF9HZXRfQ2hhcm1hcF9FbmNvZGluZ0lEKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbaV0pID09IGVuY29kaW5nX2lkKSB7CiAgICAgICAgICAgICBGWEZUX1NldF9DaGFybWFwKGZhY2UsIEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbaV0pOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogQ1BERl9Gb250R2xvYmFsczo6Q1BERl9Gb250R2xvYmFscygpCiAgICAgOiBtX3BDb250cmFzdFJhbXBzKE5VTEwpCkBAIC0xMjAsNyArMTIwLDcgQEAKICAgICBtX3BGb250RmlsZSA9IE5VTEw7CiAgICAgbV9GbGFncyA9IDA7CiAgICAgbV9wVG9Vbmljb2RlTWFwID0gTlVMTDsKLSAgICBtX2JUb1VuaWNvZGVMb2FkZWQgPSBGQUxTRTsKKyAgICBtX2JUb1VuaWNvZGVMb2FkZWQgPSBmYWxzZTsKICAgICBtX3BDaGFyTWFwID0gbmV3IENQREZfRm9udENoYXJNYXAodGhpcyk7CiB9CiBDUERGX0ZvbnQ6On5DUERGX0ZvbnQoKQpAQCAtMTM1LDkgKzEzNSw5IEBACiAgICAgICAgIG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlRm9udEZpbGVTdHJlYW1BY2MoKENQREZfU3RyZWFtKiltX3BGb250RmlsZS0+R2V0U3RyZWFtKCkpOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9Gb250OjpJc1ZlcnRXcml0aW5nKCkgY29uc3QKK2Jvb2wgQ1BERl9Gb250OjpJc1ZlcnRXcml0aW5nKCkgY29uc3QKIHsKLSAgICBGWF9CT09MIGJWZXJ0V3JpdGluZyA9IEZBTFNFOworICAgIGJvb2wgYlZlcnRXcml0aW5nID0gZmFsc2U7CiAgICAgQ1BERl9DSURGb250KiBwQ0lERm9udCA9IEdldENJREZvbnQoKTsKICAgICBpZiAocENJREZvbnQpIHsKICAgICAgICAgYlZlcnRXcml0aW5nID0gcENJREZvbnQtPklzVmVydFdyaXRpbmcoKTsKQEAgLTIzNiwzMyArMjM2LDMzIEBACiB7CiAgICAgbV9GbGFncyA9IHBGb250RGVzYy0+R2V0SW50ZWdlcihGWF9CU1RSQygiRmxhZ3MiKSwgUERGRk9OVF9OT05TWU1CT0xJQyk7CiAgICAgaW50IEl0YWxpY0FuZ2xlID0gMDsKLSAgICBGWF9CT09MIGJFeGlzdEl0YWxpY0FuZ2xlID0gRkFMU0U7CisgICAgYm9vbCBiRXhpc3RJdGFsaWNBbmdsZSA9IGZhbHNlOwogICAgIGlmIChwRm9udERlc2MtPktleUV4aXN0KEZYX0JTVFJDKCJJdGFsaWNBbmdsZSIpKSkgewogICAgICAgICBJdGFsaWNBbmdsZSA9IHBGb250RGVzYy0+R2V0SW50ZWdlcihGWF9CU1RSQygiSXRhbGljQW5nbGUiKSk7Ci0gICAgICAgIGJFeGlzdEl0YWxpY0FuZ2xlID0gVFJVRTsKKyAgICAgICAgYkV4aXN0SXRhbGljQW5nbGUgPSB0cnVlOwogICAgIH0KICAgICBpZiAoSXRhbGljQW5nbGUgPCAwKSB7CiAgICAgICAgIG1fRmxhZ3MgfD0gUERGRk9OVF9JVEFMSUM7CiAgICAgICAgIG1fSXRhbGljQW5nbGUgPSBJdGFsaWNBbmdsZTsKICAgICB9Ci0gICAgRlhfQk9PTCBiRXhpc3RTdGVtViA9IEZBTFNFOworICAgIGJvb2wgYkV4aXN0U3RlbVYgPSBmYWxzZTsKICAgICBpZiAocEZvbnREZXNjLT5LZXlFeGlzdChGWF9CU1RSQygiU3RlbVYiKSkpIHsKICAgICAgICAgbV9TdGVtViA9IHBGb250RGVzYy0+R2V0SW50ZWdlcihGWF9CU1RSQygiU3RlbVYiKSk7Ci0gICAgICAgIGJFeGlzdFN0ZW1WID0gVFJVRTsKKyAgICAgICAgYkV4aXN0U3RlbVYgPSB0cnVlOwogICAgIH0KLSAgICBGWF9CT09MIGJFeGlzdEFzY2VudCA9IEZBTFNFOworICAgIGJvb2wgYkV4aXN0QXNjZW50ID0gZmFsc2U7CiAgICAgaWYgKHBGb250RGVzYy0+S2V5RXhpc3QoRlhfQlNUUkMoIkFzY2VudCIpKSkgewogICAgICAgICBtX0FzY2VudCA9IHBGb250RGVzYy0+R2V0SW50ZWdlcihGWF9CU1RSQygiQXNjZW50IikpOwotICAgICAgICBiRXhpc3RBc2NlbnQgPSBUUlVFOworICAgICAgICBiRXhpc3RBc2NlbnQgPSB0cnVlOwogICAgIH0KLSAgICBGWF9CT09MIGJFeGlzdERlc2NlbnQgPSBGQUxTRTsKKyAgICBib29sIGJFeGlzdERlc2NlbnQgPSBmYWxzZTsKICAgICBpZiAocEZvbnREZXNjLT5LZXlFeGlzdChGWF9CU1RSQygiRGVzY2VudCIpKSkgewogICAgICAgICBtX0Rlc2NlbnQgPSBwRm9udERlc2MtPkdldEludGVnZXIoRlhfQlNUUkMoIkRlc2NlbnQiKSk7Ci0gICAgICAgIGJFeGlzdERlc2NlbnQgPSBUUlVFOworICAgICAgICBiRXhpc3REZXNjZW50ID0gdHJ1ZTsKICAgICB9Ci0gICAgRlhfQk9PTCBiRXhpc3RDYXBIZWlnaHQgPSBGQUxTRTsKKyAgICBib29sIGJFeGlzdENhcEhlaWdodCA9IGZhbHNlOwogICAgIGlmIChwRm9udERlc2MtPktleUV4aXN0KEZYX0JTVFJDKCJDYXBIZWlnaHQiKSkpIHsKLSAgICAgICAgYkV4aXN0Q2FwSGVpZ2h0ID0gVFJVRTsKKyAgICAgICAgYkV4aXN0Q2FwSGVpZ2h0ID0gdHJ1ZTsKICAgICB9CiAgICAgaWYgKGJFeGlzdEl0YWxpY0FuZ2xlICYmIGJFeGlzdEFzY2VudCAmJiBiRXhpc3RDYXBIZWlnaHQgJiYgYkV4aXN0RGVzY2VudCAmJiBiRXhpc3RTdGVtVikgewogICAgICAgICBtX0ZsYWdzIHw9IFBERkZPTlRfVVNFRVhURVJOQVRUUjsKQEAgLTMxNiw3ICszMTYsNyBAQAogICAgICAgICAgICAgbV9Bc2NlbnQgPSBUVDJQREYoRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihtX0ZvbnQubV9GYWNlKSwgbV9Gb250Lm1fRmFjZSk7CiAgICAgICAgICAgICBtX0Rlc2NlbnQgPSBUVDJQREYoRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIobV9Gb250Lm1fRmFjZSksIG1fRm9udC5tX0ZhY2UpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhfQk9PTCBiRmlyc3QgPSBUUlVFOworICAgICAgICAgICAgYm9vbCBiRmlyc3QgPSB0cnVlOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKICAgICAgICAgICAgICAgICBGWF9SRUNUIHJlY3Q7CiAgICAgICAgICAgICAgICAgR2V0Q2hhckJCb3goaSwgcmVjdCk7CkBAIC0zMjUsNyArMzI1LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGJGaXJzdCkgewogICAgICAgICAgICAgICAgICAgICBtX0ZvbnRCQm94ID0gcmVjdDsKLSAgICAgICAgICAgICAgICAgICAgYkZpcnN0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJGaXJzdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtX0ZvbnRCQm94LnRvcCA8IHJlY3QudG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtX0ZvbnRCQm94LnRvcCA9IHJlY3QudG9wOwpAQCAtMzYxLDcgKzM2MSw3IEBACiB9CiB2b2lkIENQREZfRm9udDo6TG9hZFVuaWNvZGVNYXAoKQogewotICAgIG1fYlRvVW5pY29kZUxvYWRlZCA9IFRSVUU7CisgICAgbV9iVG9Vbmljb2RlTG9hZGVkID0gdHJ1ZTsKICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IG1fcEZvbnREaWN0LT5HZXRTdHJlYW0oRlhfQlNUUkMoIlRvVW5pY29kZSIpKTsKICAgICBpZiAocFN0cmVhbSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTQ2NiwxMCArNDY2LDEwIEBACiAgICAgfQogICAgIHJldHVybiBwRm9udDsKIH0KLUZYX0JPT0wgQ1BERl9Gb250OjpMb2FkKCkKK2Jvb2wgQ1BERl9Gb250OjpMb2FkKCkKIHsKICAgICBpZiAobV9wRm9udERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmcgdHlwZSA9IG1fcEZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSk7CiAgICAgbV9CYXNlRm9udCA9IG1fcEZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkJhc2VGb250IikpOwpAQCAtNjIzLDcgKzYyMyw3IEBACiB7CiAgICAgaW50IENJRFNldCA9IDA7CiAgICAgQ1BERl9TdHJlYW1BY2Mgc3RyZWFtOwotICAgIHN0cmVhbS5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7CisgICAgc3RyZWFtLkxvYWRBbGxEYXRhKHBTdHJlYW0sIGZhbHNlKTsKICAgICBDUERGX1NpbXBsZVBhcnNlciBwYXJzZXIoc3RyZWFtLkdldERhdGEoKSwgc3RyZWFtLkdldFNpemUoKSk7CiAgICAgbV9NYXAuRXN0aW1hdGVTaXplKHN0cmVhbS5HZXRTaXplKCkgLyA4LCAxMDI0KTsKICAgICB3aGlsZSAoMSkgewpAQCAtNzE5LDEyICs3MTksMTIgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoQ0lEU2V0KSB7Ci0gICAgICAgIG1fcEJhc2VNYXAgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0Rm9udEdsb2JhbHMoKS0+bV9DTWFwTWFuYWdlci5HZXRDSUQyVW5pY29kZU1hcChDSURTZXQsIEZBTFNFKTsKKyAgICAgICAgbV9wQmFzZU1hcCA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpLT5tX0NNYXBNYW5hZ2VyLkdldENJRDJVbmljb2RlTWFwKENJRFNldCwgZmFsc2UpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1fcEJhc2VNYXAgPSBOVUxMOwogICAgIH0KIH0KLXN0YXRpYyBGWF9CT09MIEdldFByZWRlZmluZWRFbmNvZGluZyhpbnQmIGJhc2VtYXAsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiB2YWx1ZSkKK3N0YXRpYyBib29sIEdldFByZWRlZmluZWRFbmNvZGluZyhpbnQmIGJhc2VtYXAsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiB2YWx1ZSkKIHsKICAgICBpZiAodmFsdWUgPT0gRlhfQlNUUkMoIldpbkFuc2lFbmNvZGluZyIpKSB7CiAgICAgICAgIGJhc2VtYXAgPSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0k7CkBAIC03MzUsMTIgKzczNSwxMiBAQAogICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gRlhfQlNUUkMoIlBERkRvY0VuY29kaW5nIikpIHsKICAgICAgICAgYmFzZW1hcCA9IFBERkZPTlRfRU5DT0RJTkdfUERGRE9DOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ1BERl9Gb250OjpMb2FkUERGRW5jb2RpbmcoQ1BERl9PYmplY3QqIHBFbmNvZGluZywgaW50JiBpQmFzZUVuY29kaW5nLCBDRlhfQnl0ZVN0cmluZyomIHBDaGFyTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVtYmVkZGVkLCBGWF9CT09MIGJUcnVlVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRW1iZWRkZWQsIGJvb2wgYlRydWVUeXBlKQogewogICAgIGlmIChwRW5jb2RpbmcgPT0gTlVMTCkgewogICAgICAgICBpZiAobV9CYXNlRm9udCA9PSBGWF9CU1RSQygiU3ltYm9sIikpIHsKQEAgLTgwMiwxOCArODAyLDE4IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1GWF9CT09MIENQREZfRm9udDo6SXNTdGFuZGFyZEZvbnQoKSBjb25zdAorYm9vbCBDUERGX0ZvbnQ6OklzU3RhbmRhcmRGb250KCkgY29uc3QKIHsKICAgICBpZiAobV9Gb250VHlwZSAhPSBQREZGT05UX1RZUEUxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9wRm9udEZpbGUgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCgoQ1BERl9UeXBlMUZvbnQqKXRoaXMpLT5HZXRCYXNlMTRGb250KCkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIENQREZfU2ltcGxlRm9udDo6Q1BERl9TaW1wbGVGb250KGludCBmb250dHlwZSkgOiBDUERGX0ZvbnQoZm9udHR5cGUpCiB7CkBAIC04MjgsMTAgKzgyOCwxMCBAQAogewogICAgIGRlbGV0ZVtdIG1fcENoYXJOYW1lczsKIH0KLWludCBDUERGX1NpbXBsZUZvbnQ6OkdseXBoRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9CT09MICpwVmVydEdseXBoKQoraW50IENQREZfU2ltcGxlRm9udDo6R2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIGJvb2wgKnBWZXJ0R2x5cGgpCiB7CiAgICAgaWYgKHBWZXJ0R2x5cGgpIHsKLSAgICAgICAgKnBWZXJ0R2x5cGggPSBGQUxTRTsKKyAgICAgICAgKnBWZXJ0R2x5cGggPSBmYWxzZTsKICAgICB9CiAgICAgaWYgKGNoYXJjb2RlID4gMHhmZikgewogICAgICAgICByZXR1cm4gLTE7CkBAIC05MjMsNyArOTIzLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIG5hbWU7CiB9Ci1GWF9CT09MIENQREZfU2ltcGxlRm9udDo6TG9hZENvbW1vbigpCitib29sIENQREZfU2ltcGxlRm9udDo6TG9hZENvbW1vbigpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERlc2MgPSBtX3BGb250RGljdC0+R2V0RGljdChGWF9CU1RSQygiRm9udERlc2NyaXB0b3IiKSk7CiAgICAgaWYgKHBGb250RGVzYykgewpAQCAtOTMxLDkgKzkzMSw5IEBACiAgICAgfQogICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5ID0gbV9wRm9udERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJXaWR0aHMiKSk7CiAgICAgaW50IHdpZHRoX3N0YXJ0ID0gMCwgd2lkdGhfZW5kID0gLTE7Ci0gICAgbV9iVXNlRm9udFdpZHRoID0gVFJVRTsKKyAgICBtX2JVc2VGb250V2lkdGggPSB0cnVlOwogICAgIGlmIChwV2lkdGhBcnJheSkgewotICAgICAgICBtX2JVc2VGb250V2lkdGggPSBGQUxTRTsKKyAgICAgICAgbV9iVXNlRm9udFdpZHRoID0gZmFsc2U7CiAgICAgICAgIGlmIChwRm9udERlc2MgJiYgcEZvbnREZXNjLT5LZXlFeGlzdChGWF9CU1RSQygiTWlzc2luZ1dpZHRoIikpKSB7CiAgICAgICAgICAgICBpbnQgTWlzc2luZ1dpZHRoID0gcEZvbnREZXNjLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJNaXNzaW5nV2lkdGgiKSk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewpAQCAtOTcwLDcgKzk3MCw3IEBACiAgICAgZGVsZXRlW10gbV9wQ2hhck5hbWVzOwogICAgIG1fcENoYXJOYW1lcyA9IE5VTEw7CiAgICAgaWYgKG1fRm9udC5tX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChtX0ZsYWdzICYgUERGRk9OVF9BTExDQVApIHsKICAgICAgICAgdW5zaWduZWQgY2hhciBsb3dlcmNhc2VzW10gPSB7J2EnLCAneicsIDB4ZTAsIDB4ZjYsIDB4ZjgsIDB4ZmR9OwpAQCAtOTg4LDcgKzk4OCw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgQ2hlY2tGb250TWV0cmljcygpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDUERGX1NpbXBsZUZvbnQ6OkxvYWRTdWJzdEZvbnQoKQogewpAQCAtMTAxMyw3ICsxMDEzLDcgQEAKICAgICBpZiAobV9Gb250Lm1fcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX05PTlNZTUJPTCkgewogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9TaW1wbGVGb250OjpJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QKK2Jvb2wgQ1BERl9TaW1wbGVGb250OjpJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9CYXNlRW5jb2RpbmcgIT0gUERGRk9OVF9FTkNPRElOR19CVUlMVElOICYmIG1fQmFzZUVuY29kaW5nICE9IFBERkZPTlRfRU5DT0RJTkdfQURPQkVfU1lNQk9MICYmCiAgICAgICAgICAgIG1fQmFzZUVuY29kaW5nICE9IFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOwpAQCAtMTAyMiw3ICsxMDIyLDcgQEAKIHsKICAgICBtX0Jhc2UxNEZvbnQgPSAtMTsKIH0KLUZYX0JPT0wgQ1BERl9UeXBlMUZvbnQ6Ol9Mb2FkKCkKK2Jvb2wgQ1BERl9UeXBlMUZvbnQ6Ol9Mb2FkKCkKIHsKICAgICBtX0Jhc2UxNEZvbnQgPSBfUERGX0dldFN0YW5kYXJkRm9udE5hbWUobV9CYXNlRm9udCk7CiAgICAgaWYgKG1fQmFzZTE0Rm9udCA+PSAwKSB7CkBAIC0xMDQ2LDIxICsxMDQ2LDIxIEBACiAgICAgfQogICAgIHJldHVybiBMb2FkQ29tbW9uKCk7CiB9Ci1zdGF0aWMgRlhfQk9PTCBGVF9Vc2VUeXBlMUNoYXJtYXAoRlhGVF9GYWNlIGZhY2UpCitzdGF0aWMgYm9vbCBGVF9Vc2VUeXBlMUNoYXJtYXAoRlhGVF9GYWNlIGZhY2UpCiB7CiAgICAgaWYgKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcENvdW50KGZhY2UpID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChmYWNlKSA9PSAxICYmCiAgICAgICAgICAgICBGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbMF0pID09IEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKEZYRlRfR2V0X0NoYXJtYXBfRW5jb2RpbmcoRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVswXSkgPT0gRlhGVF9FTkNPRElOR19VTklDT0RFKSB7CiAgICAgICAgIEZYRlRfU2V0X0NoYXJtYXAoZmFjZSwgRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVsxXSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgRlhGVF9TZXRfQ2hhcm1hcChmYWNlLCBGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpWzBdKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBleHRlcm4gRlhfV0NIQVIgRlRfVW5pY29kZUZyb21DaGFyQ29kZShpbnQgZW5jb2RpbmcsIEZYX0RXT1JEIGNoYXJjb2RlKTsKICNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KQEAgLTExMTIsMjEgKzExMTIsMjEgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICBGWF9CT09MIGJDb3JlVGV4dCA9IFRSVUU7CisgICAgYm9vbCBiQ29yZVRleHQgPSB0cnVlOwogICAgIENRdWFydHoyRCAmIHF1YXJ0ejJkID0gKChDQXBwbGVQbGF0Zm9ybSAqKSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPl9xdWFydHoyZDsKICAgICBpZiAoIW1fRm9udC5tX3BQbGF0Zm9ybUZvbnQpIHsKICAgICAgICAgaWYgKG1fRm9udC5HZXRQc05hbWUoKSA9PSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKCJERkhlaVN0ZC1XNSIpKSB7Ci0gICAgICAgICAgICBiQ29yZVRleHQgPSBGQUxTRTsKKyAgICAgICAgICAgIGJDb3JlVGV4dCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIG1fRm9udC5tX3BQbGF0Zm9ybUZvbnQgPSBxdWFydHoyZC5DcmVhdGVGb250KG1fRm9udC5tX3BGb250RGF0YSwgbV9Gb250Lm1fZHdTaXplKTsKICAgICAgICAgaWYgKE5VTEwgPT0gbV9Gb250Lm1fcFBsYXRmb3JtRm9udCkgewotICAgICAgICAgICAgYkNvcmVUZXh0ID0gRkFMU0U7CisgICAgICAgICAgICBiQ29yZVRleHQgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICNlbmRpZgogICAgIGlmICghSXNFbWJlZGRlZCgpICYmIChtX0Jhc2UxNEZvbnQgPCAxMikgJiYgbV9Gb250LklzVFRGb250KCkpIHsKICAgICAgICAgaWYgKEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCAzLCAwKSkgewotICAgICAgICAgICAgRlhfQk9PTCBiR290T25lID0gRkFMU0U7CisgICAgICAgICAgICBib29sIGJHb3RPbmUgPSBmYWxzZTsKICAgICAgICAgICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlICsrKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBwcmVmaXhbNF0gPSB7MHgwMCwgMHhmMCwgMHhmMSwgMHhmMn07CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqICsrKSB7CkBAIC0xMTQzLDcgKzExNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJHb3RPbmUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYkdvdE9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTEyMzcsOSArMTIzNyw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCBiVW5pY29kZSA9IEZBTFNFOworICAgICAgICBib29sIGJVbmljb2RlID0gZmFsc2U7CiAgICAgICAgIGlmICgwID09IEZYRlRfU2VsZWN0X0NoYXJtYXAobV9Gb250Lm1fRmFjZSwgRlhGVF9FTkNPRElOR19VTklDT0RFKSkgewotICAgICAgICAgICAgYlVuaWNvZGUgPSBUUlVFOworICAgICAgICAgICAgYlVuaWNvZGUgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlICsrKSB7CiAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBuYW1lID0gR2V0QWRvYmVDaGFyTmFtZShtX0Jhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7CkBAIC0xMzE1LDkgKzEzMTUsOSBAQAogI2VuZGlmCiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgRlhfQk9PTCBiVW5pY29kZSA9IEZBTFNFOworICAgIGJvb2wgYlVuaWNvZGUgPSBmYWxzZTsKICAgICBpZiAoMCA9PSBGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5tX0ZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkpIHsKLSAgICAgICAgYlVuaWNvZGUgPSBUUlVFOworICAgICAgICBiVW5pY29kZSA9IHRydWU7CiAgICAgfQogICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlICsrKSB7CiAgICAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKG1fQmFzZUVuY29kaW5nLCBtX3BDaGFyTmFtZXMsIGNoYXJjb2RlKTsKQEAgLTEzNjMsNyArMTM2Myw3IEBACiAgICAgICAgICAgICBtX1VuaWNvZGVzW2ldID0gcFNyY1tpXTsKICAgICAgICAgfQogfQotRlhfQk9PTCBDUERGX0ZvbnRFbmNvZGluZzo6SXNJZGVudGljYWwoQ1BERl9Gb250RW5jb2RpbmcqIHBBbm90aGVyKSBjb25zdAorYm9vbCBDUERGX0ZvbnRFbmNvZGluZzo6SXNJZGVudGljYWwoQ1BERl9Gb250RW5jb2RpbmcqIHBBbm90aGVyKSBjb25zdAogewogICAgIHJldHVybiBGWFNZU19tZW1jbXAobV9Vbmljb2RlcywgcEFub3RoZXItPm1fVW5pY29kZXMsIHNpemVvZihtX1VuaWNvZGVzKSkgPT0gMDsKIH0KQEAgLTEzNzIsMTAgKzEzNzIsMTAgQEAKICAgICBpbnQgcHJlZGVmaW5lZCA9IDA7CiAgICAgZm9yIChpbnQgY3MgPSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0k7IGNzIDwgUERGRk9OVF9FTkNPRElOR19aQVBGRElOR0JBVFM7IGNzICsrKSB7CiAgICAgICAgIGNvbnN0IEZYX1dPUkQqIHBTcmMgPSBQREZfVW5pY29kZXNGb3JQcmVkZWZpbmVkQ2hhclNldChjcyk7Ci0gICAgICAgIEZYX0JPT0wgbWF0Y2ggPSBUUlVFOworICAgICAgICBib29sIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7ICsraSkgewogICAgICAgICAgICAgaWYgKG1fVW5pY29kZXNbaV0gIT0gcFNyY1tpXSkgewotICAgICAgICAgICAgICAgIG1hdGNoID0gRkFMU0U7CisgICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTQxMyw3ICsxNDEzLDcgQEAKIENQREZfVHJ1ZVR5cGVGb250OjpDUERGX1RydWVUeXBlRm9udCgpIDogQ1BERl9TaW1wbGVGb250KFBERkZPTlRfVFJVRVRZUEUpCiB7CiB9Ci1GWF9CT09MIENQREZfVHJ1ZVR5cGVGb250OjpfTG9hZCgpCitib29sIENQREZfVHJ1ZVR5cGVGb250OjpfTG9hZCgpCiB7CiAgICAgcmV0dXJuIExvYWRDb21tb24oKTsKIH0KQEAgLTE0MjYsMTQgKzE0MjYsMTQgQEAKICAgICBpZiAobV9wRm9udEZpbGUgJiYgbV9Gb250Lm1fRmFjZS0+bnVtX2NoYXJtYXBzID4gMAogICAgICAgICAgICAgJiYgKGJhc2VFbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX01BQ1JPTUFOIHx8IGJhc2VFbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0kpCiAgICAgICAgICAgICAmJiAobV9GbGFncyAmIFBERkZPTlRfU1lNQk9MSUMpKSB7Ci0gICAgICAgIEZYX0JPT0wgYlN1cHBvcnRXaW4gPSBGQUxTRTsKLSAgICAgICAgRlhfQk9PTCBiU3VwcG9ydE1hYyA9IEZBTFNFOworICAgICAgICBib29sIGJTdXBwb3J0V2luID0gZmFsc2U7CisgICAgICAgIGJvb2wgYlN1cHBvcnRNYWMgPSBmYWxzZTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChtX0ZvbnQubV9GYWNlKTsgaSsrKSB7CiAgICAgICAgICAgICBpbnQgcGxhdGZvcm1faWQgPSBGWEZUX0dldF9DaGFybWFwX1BsYXRmb3JtSUQoRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhtX0ZvbnQubV9GYWNlKVtpXSk7CiAgICAgICAgICAgICBpZiAocGxhdGZvcm1faWQgPT0gMCB8fCBwbGF0Zm9ybV9pZCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgYlN1cHBvcnRXaW4gPSBUUlVFOworICAgICAgICAgICAgICAgIGJTdXBwb3J0V2luID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAocGxhdGZvcm1faWQgPT0gMCB8fCBwbGF0Zm9ybV9pZCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgYlN1cHBvcnRNYWMgPSBUUlVFOworICAgICAgICAgICAgICAgIGJTdXBwb3J0TWFjID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoYmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSSAmJiAhYlN1cHBvcnRXaW4pIHsKQEAgLTE0NTksOCArMTQ1OSw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCBiTVNVbmljb2RlID0gRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDMsIDEpOwotICAgICAgICBGWF9CT09MIGJNYWNSb21hbiA9IEZBTFNFLCBiTVNTeW1ib2wgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiTVNVbmljb2RlID0gRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDMsIDEpOworICAgICAgICBib29sIGJNYWNSb21hbiA9IGZhbHNlLCBiTVNTeW1ib2wgPSBmYWxzZTsKICAgICAgICAgaWYgKCFiTVNVbmljb2RlKSB7CiAgICAgICAgICAgICBpZiAobV9GbGFncyAmIFBERkZPTlRfTk9OU1lNQk9MSUMpIHsKICAgICAgICAgICAgICAgICBiTWFjUm9tYW4gPSBGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMSwgMCk7CkBAIC0xNDcwLDcgKzE0NzAsNyBAQAogICAgICAgICAgICAgICAgIGJNYWNSb21hbiA9ICFiTVNTeW1ib2wgJiYgRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDEsIDApOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIEZYX0JPT0wgYlRvVW5pY29kZSA9IG1fcEZvbnREaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiVG9Vbmljb2RlIikpOworICAgICAgICBib29sIGJUb1VuaWNvZGUgPSBtX3BGb250RGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIlRvVW5pY29kZSIpKTsKICAgICAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUgKyspIHsKICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKGJhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7CiAgICAgICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CkBAIC0xNTIzLDEzICsxNTIzLDEzIEBACiAgICAgfQogICAgIGlmIChGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMywgMCkpIHsKICAgICAgICAgY29uc3QgdWludDhfdCBwcmVmaXhbNF0gPSB7MHgwMCwgMHhmMCwgMHhmMSwgMHhmMn07Ci0gICAgICAgIEZYX0JPT0wgYkdvdE9uZSA9IEZBTFNFOworICAgICAgICBib29sIGJHb3RPbmUgPSBmYWxzZTsKICAgICAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUgKyspIHsKICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaiArKykgewogICAgICAgICAgICAgICAgIEZYX1dPUkQgdW5pY29kZSA9IHByZWZpeFtqXSAqIDI1NiArIGNoYXJjb2RlOwogICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIHVuaWNvZGUpOwogICAgICAgICAgICAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJHb3RPbmUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBiR290T25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTU1MiwxMiArMTU1MiwxMiBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMSwgMCkpIHsKLSAgICAgICAgRlhfQk9PTCBiR290T25lID0gRkFMU0U7CisgICAgICAgIGJvb2wgYkdvdE9uZSA9IGZhbHNlOwogICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewogICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgY2hhcmNvZGUpOwogICAgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IEZUX1VuaWNvZGVGcm9tQ2hhckNvZGUoRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTiwgY2hhcmNvZGUpOwogICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKLSAgICAgICAgICAgICAgICBiR290T25lID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiR290T25lID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAobV9wRm9udEZpbGUgfHwgYkdvdE9uZSkgewpAQCAtMTU2NSw3ICsxNTY1LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoRlhGVF9TZWxlY3RfQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpID09IDApIHsKLSAgICAgICAgRlhfQk9PTCBiR290T25lID0gRkFMU0U7CisgICAgICAgIGJvb2wgYkdvdE9uZSA9IGZhbHNlOwogICAgICAgICBjb25zdCBGWF9XT1JEKiBwVW5pY29kZXMgPSBQREZfVW5pY29kZXNGb3JQcmVkZWZpbmVkQ2hhclNldChiYXNlRW5jb2RpbmcpOwogICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewogICAgICAgICAgICAgaWYgKG1fcEZvbnRGaWxlID09IE5VTEwpIHsKQEAgLTE1ODAsNyArMTU4MCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdKTsKICAgICAgICAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdKSB7Ci0gICAgICAgICAgICAgICAgYkdvdE9uZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgYkdvdE9uZSA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJHb3RPbmUpIHsKQEAgLTE2MTQsNyArMTYxNCw3IEBACiAgICAgICAgIGRlbGV0ZSAoQ1BERl9UeXBlM0NoYXIqKWtleTsKICAgICB9CiB9Ci1GWF9CT09MIENQREZfVHlwZTNGb250OjpfTG9hZCgpCitib29sIENQREZfVHlwZTNGb250OjpfTG9hZCgpCiB7CiAgICAgbV9wRm9udFJlc291cmNlcyA9IG1fcEZvbnREaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJSZXNvdXJjZXMiKSk7CiAgICAgQ1BERl9BcnJheSogcE1hdHJpeCA9IG1fcEZvbnREaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRm9udE1hdHJpeCIpKTsKQEAgLTE2NDgsNyArMTY0OCw3IEBACiAgICAgbV9wQ2hhclByb2NzID0gbV9wRm9udERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkNoYXJQcm9jcyIpKTsKICAgICBDUERGX09iamVjdCogcEVuY29kaW5nID0gbV9wRm9udERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRW5jb2RpbmciKSk7CiAgICAgaWYgKHBFbmNvZGluZykgewotICAgICAgICBMb2FkUERGRW5jb2RpbmcocEVuY29kaW5nLCBtX0Jhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBGQUxTRSwgRkFMU0UpOworICAgICAgICBMb2FkUERGRW5jb2RpbmcocEVuY29kaW5nLCBtX0Jhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBmYWxzZSwgZmFsc2UpOwogICAgICAgICBpZiAobV9wQ2hhck5hbWVzKSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewogICAgICAgICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tpXSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShtX3BDaGFyTmFtZXNbaV0pOwpAQCAtMTY1OCw3ICsxNjU4LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ1BERl9UeXBlM0ZvbnQ6OkNoZWNrVHlwZTNGb250TWV0cmljcygpCiB7CkBAIC0xNzM2LDggKzE3MzYsOCBAQAogewogICAgIG1fcEZvcm0gPSBOVUxMOwogICAgIG1fcEJpdG1hcCA9IE5VTEw7Ci0gICAgbV9iUGFnZVJlcXVpcmVkID0gRkFMU0U7Ci0gICAgbV9iQ29sb3JlZCA9IEZBTFNFOworICAgIG1fYlBhZ2VSZXF1aXJlZCA9IGZhbHNlOworICAgIG1fYkNvbG9yZWQgPSBmYWxzZTsKIH0KIENQREZfVHlwZTNDaGFyOjp+Q1BERl9UeXBlM0NoYXIoKQogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250X2NpZC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2lkLmNwcAppbmRleCBmNzBiOWVjLi44Zjk1ZTU5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2lkLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2lkLmNwcApAQCAtMTMsMTggKzEzLDE4IEBACiAjaW5jbHVkZSAiZm9udF9pbnQuaCIKIAogZXh0ZXJuIHNob3J0IFRUMlBERihpbnQgbSwgRlhGVF9GYWNlIGZhY2UpOwotZXh0ZXJuIEZYX0JPT0wgRlRfVXNlVFRDaGFybWFwKEZYRlRfRmFjZSBmYWNlLCBpbnQgcGxhdGZvcm1faWQsIGludCBlbmNvZGluZ19pZCk7CitleHRlcm4gYm9vbCBGVF9Vc2VUVENoYXJtYXAoRlhGVF9GYWNlIGZhY2UsIGludCBwbGF0Zm9ybV9pZCwgaW50IGVuY29kaW5nX2lkKTsKIAogQ1BERl9DTWFwTWFuYWdlcjo6Q1BERl9DTWFwTWFuYWdlcigpCiB7Ci0gICAgbV9iUHJvbXB0ZWQgPSBGQUxTRTsKKyAgICBtX2JQcm9tcHRlZCA9IGZhbHNlOwogICAgIEZYU1lTX21lbXNldChtX0NJRDJVbmljb2RlTWFwcywgMCwgc2l6ZW9mIG1fQ0lEMlVuaWNvZGVNYXBzKTsKIH0KIENQREZfQ01hcE1hbmFnZXI6On5DUERGX0NNYXBNYW5hZ2VyKCkKIHsKLSAgICBEcm9wQWxsKEZBTFNFKTsKKyAgICBEcm9wQWxsKGZhbHNlKTsKIH0KLUNQREZfQ01hcCogQ1BERl9DTWFwTWFuYWdlcjo6R2V0UHJlZGVmaW5lZENNYXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIEZYX0JPT0wgYlByb21wdENKSykKK0NQREZfQ01hcCogQ1BERl9DTWFwTWFuYWdlcjo6R2V0UHJlZGVmaW5lZENNYXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIGJvb2wgYlByb21wdENKSykKIHsKICAgICBDUERGX0NNYXAqIHBDTWFwOwogICAgIGlmIChtX0NNYXBzLkxvb2t1cChuYW1lLCAodm9pZComKXBDTWFwKSkgewpAQCAtMzcsNyArMzcsNyBAQAogICAgIG1fQ01hcHMuU2V0QXQobmFtZSwgcENNYXApOwogICAgIHJldHVybiBwQ01hcDsKIH0KLUNQREZfQ01hcCogQ1BERl9DTWFwTWFuYWdlcjo6TG9hZFByZWRlZmluZWRDTWFwKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBGWF9CT09MIGJQcm9tcHRDSkspCitDUERGX0NNYXAqIENQREZfQ01hcE1hbmFnZXI6OkxvYWRQcmVkZWZpbmVkQ01hcChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgYm9vbCBiUHJvbXB0Q0pLKQogewogICAgIENQREZfQ01hcCogcENNYXAgPSBuZXcgQ1BERl9DTWFwOwogICAgIGNvbnN0IEZYX0NIQVIqIHBuYW1lID0gbmFtZTsKQEAgLTU5LDkgKzU5LDkgQEAKIH0KIHZvaWQgQ1BERl9DTWFwTWFuYWdlcjo6UmVsb2FkQWxsKCkKIHsKLSAgICBEcm9wQWxsKFRSVUUpOworICAgIERyb3BBbGwodHJ1ZSk7CiB9Ci12b2lkIENQREZfQ01hcE1hbmFnZXI6OkRyb3BBbGwoRlhfQk9PTCBiUmVsb2FkKQordm9pZCBDUERGX0NNYXBNYW5hZ2VyOjpEcm9wQWxsKGJvb2wgYlJlbG9hZCkKIHsKICAgICBGWF9QT1NJVElPTiBwb3MgPSBtX0NNYXBzLkdldFN0YXJ0UG9zaXRpb24oKTsKICAgICB3aGlsZSAocG9zKSB7CkBAIC03Miw3ICs3Miw3IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoYlJlbG9hZCkgewotICAgICAgICAgICAgcENNYXAtPkxvYWRQcmVkZWZpbmVkKHRoaXMsIG5hbWUsIEZBTFNFKTsKKyAgICAgICAgICAgIHBDTWFwLT5Mb2FkUHJlZGVmaW5lZCh0aGlzLCBuYW1lLCBmYWxzZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkZWxldGUgcENNYXA7CiAgICAgICAgIH0KQEAgLTgzLDIwICs4MywyMCBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJSZWxvYWQpIHsKLSAgICAgICAgICAgIHBNYXAtPkxvYWQodGhpcywgaSwgRkFMU0UpOworICAgICAgICAgICAgcE1hcC0+TG9hZCh0aGlzLCBpLCBmYWxzZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkZWxldGUgcE1hcDsKICAgICAgICAgfQogICAgIH0KIH0KLUNQREZfQ0lEMlVuaWNvZGVNYXAqIENQREZfQ01hcE1hbmFnZXI6OkdldENJRDJVbmljb2RlTWFwKGludCBjaGFyc2V0LCBGWF9CT09MIGJQcm9tcHRDSkspCitDUERGX0NJRDJVbmljb2RlTWFwKiBDUERGX0NNYXBNYW5hZ2VyOjpHZXRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgYm9vbCBiUHJvbXB0Q0pLKQogewogICAgIGlmIChtX0NJRDJVbmljb2RlTWFwc1tjaGFyc2V0XSA9PSBOVUxMKSB7CiAgICAgICAgIG1fQ0lEMlVuaWNvZGVNYXBzW2NoYXJzZXRdID0gTG9hZENJRDJVbmljb2RlTWFwKGNoYXJzZXQsIGJQcm9tcHRDSkspOwogICAgIH0KICAgICByZXR1cm4gbV9DSUQyVW5pY29kZU1hcHNbY2hhcnNldF07CiB9Ci1DUERGX0NJRDJVbmljb2RlTWFwKiBDUERGX0NNYXBNYW5hZ2VyOjpMb2FkQ0lEMlVuaWNvZGVNYXAoaW50IGNoYXJzZXQsIEZYX0JPT0wgYlByb21wdENKSykKK0NQREZfQ0lEMlVuaWNvZGVNYXAqIENQREZfQ01hcE1hbmFnZXI6OkxvYWRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgYm9vbCBiUHJvbXB0Q0pLKQogewogICAgIENQREZfQ0lEMlVuaWNvZGVNYXAqIHBNYXAgPSBuZXcgQ1BERl9DSUQyVW5pY29kZU1hcCgpOwogICAgIGlmICghcE1hcC0+SW5pdGlhbGl6ZSgpKSB7CkBAIC0xMTIsMTMgKzExMiwxMyBAQAogICAgIG1fU3RhdHVzID0gMDsKICAgICBtX0NvZGVTZXEgPSAwOwogfQotRlhfQk9PTAlDUERGX0NNYXBQYXJzZXI6OkluaXRpYWxpemUoQ1BERl9DTWFwKiBwQ01hcCkKK2Jvb2wJQ1BERl9DTWFwUGFyc2VyOjpJbml0aWFsaXplKENQREZfQ01hcCogcENNYXApCiB7CiAgICAgbV9wQ01hcCA9IHBDTWFwOwogICAgIG1fU3RhdHVzID0gMDsKICAgICBtX0NvZGVTZXEgPSAwOwogICAgIG1fQWRkTWFwcy5Fc3RpbWF0ZVNpemUoMCwgMTAyNDApOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogc3RhdGljIEZYX0RXT1JEIENNYXBfR2V0Q29kZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmQpCiB7CkBAIC0xNDcsMTAgKzE0NywxMCBAQAogICAgIH0KICAgICByZXR1cm4gbnVtOwogfQotc3RhdGljIEZYX0JPT0wgX0NNYXBfR2V0Q29kZVJhbmdlKF9DTWFwX0NvZGVSYW5nZSYgcmFuZ2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlyc3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc2Vjb25kKQorc3RhdGljIGJvb2wgX0NNYXBfR2V0Q29kZVJhbmdlKF9DTWFwX0NvZGVSYW5nZSYgcmFuZ2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlyc3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc2Vjb25kKQogewogICAgIGlmIChmaXJzdC5HZXRMZW5ndGgoKSA9PSAwIHx8IGZpcnN0LkdldEF0KDApICE9ICc8JykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gMTsgaSA8IGZpcnN0LkdldExlbmd0aCgpOyBpICsrKQpAQCAtMTU5LDcgKzE1OSw3IEBACiAgICAgICAgIH0KICAgICByYW5nZS5tX0NoYXJTaXplID0gKGkgLSAxKSAvIDI7CiAgICAgaWYgKHJhbmdlLm1fQ2hhclNpemUgPiA0KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBmb3IgKGkgPSAwOyBpIDwgcmFuZ2UubV9DaGFyU2l6ZTsgaSArKykgewogICAgICAgICB1aW50OF90IGRpZ2l0MSA9IGZpcnN0LkdldEF0KGkgKiAyICsgMSk7CkBAIC0xNzYsNyArMTc2LDcgQEAKICAgICAgICAgYnl0ZSA9IGJ5dGUgKiAxNiArICgoZGlnaXQyID49ICcwJyAmJiBkaWdpdDIgPD0gJzknKSA/IChkaWdpdDIgLSAnMCcpIDogKChkaWdpdDIgJiAweGRmKSAtICdBJyArIDEwKSk7CiAgICAgICAgIHJhbmdlLm1fVXBwZXJbaV0gPSBieXRlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBDTWFwX0dldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmQpCiB7CkBAIC0yODIsNyArMjgyLDcgQEAKICAgICBtX0NvZGluZyA9IENJRENPRElOR19VTktOT1dOOwogICAgIG1fQ29kaW5nU2NoZW1lID0gVHdvQnl0ZXM7CiAgICAgbV9iVmVydGljYWwgPSAwOwotICAgIG1fYkxvYWRlZCA9IEZBTFNFOworICAgIG1fYkxvYWRlZCA9IGZhbHNlOwogICAgIG1fcE1hcHBpbmcgPSBOVUxMOwogICAgIG1fcExlYWRpbmdCeXRlcyA9IE5VTEw7CiAgICAgbV9wQWRkTWFwcGluZyA9IE5VTEw7CkBAIC0zNDYsMTQgKzM0NiwxNCBAQAogfTsKIGV4dGVybiB2b2lkIEZQREZBUElfRmluZEVtYmVkZGVkQ01hcChjb25zdCBjaGFyKiBuYW1lLCBpbnQgY2hhcnNldCwgaW50IGNvZGluZywgY29uc3QgRlhDTUFQX0NNYXAqJiBwTWFwKTsKIGV4dGVybiBGWF9XT1JEIEZQREZBUElfQ0lERnJvbUNoYXJDb2RlKGNvbnN0IEZYQ01BUF9DTWFwKiBwTWFwLCBGWF9EV09SRCBjaGFyY29kZSk7Ci1GWF9CT09MIENQREZfQ01hcDo6TG9hZFByZWRlZmluZWQoQ1BERl9DTWFwTWFuYWdlciogcE1nciwgY29uc3QgRlhfQ0hBUiogcE5hbWUsIEZYX0JPT0wgYlByb21wdENKSykKK2Jvb2wgQ1BERl9DTWFwOjpMb2FkUHJlZGVmaW5lZChDUERGX0NNYXBNYW5hZ2VyKiBwTWdyLCBjb25zdCBGWF9DSEFSKiBwTmFtZSwgYm9vbCBiUHJvbXB0Q0pLKQogewogICAgIG1fUHJlZGVmaW5lZENNYXAgPSBwTmFtZTsKICAgICBpZiAobV9QcmVkZWZpbmVkQ01hcCA9PSBGWF9CU1RSQygiSWRlbnRpdHktSCIpIHx8IG1fUHJlZGVmaW5lZENNYXAgPT0gRlhfQlNUUkMoIklkZW50aXR5LVYiKSkgewogICAgICAgICBtX0NvZGluZyA9IENJRENPRElOR19DSUQ7CiAgICAgICAgIG1fYlZlcnRpY2FsID0gcE5hbWVbOV0gPT0gJ1YnOwotICAgICAgICBtX2JMb2FkZWQgPSBUUlVFOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgbV9iTG9hZGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIGNtYXBpZCA9IG1fUHJlZGVmaW5lZENNYXA7CiAgICAgbV9iVmVydGljYWwgPSBjbWFwaWQuUmlnaHQoMSkgPT0gRlhfQlNUUkMoIlYiKTsKQEAgLTM2Myw3ICszNjMsNyBAQAogICAgIGludCBpbmRleCA9IDA7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKGdfUHJlZGVmaW5lZENNYXBzW2luZGV4XS5tX3BOYW1lID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoY21hcGlkID09IENGWF9CeXRlU3RyaW5nQyhnX1ByZWRlZmluZWRDTWFwc1tpbmRleF0ubV9wTmFtZSkpIHsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzg0LDEwICszODQsMTAgQEAKICAgICB9CiAgICAgRlBERkFQSV9GaW5kRW1iZWRkZWRDTWFwKHBOYW1lLCBtX0NoYXJzZXQsIG1fQ29kaW5nLCBtX3BFbWJlZE1hcCk7CiAgICAgaWYgKG1fcEVtYmVkTWFwKSB7Ci0gICAgICAgIG1fYkxvYWRlZCA9IFRSVUU7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICBtX2JMb2FkZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIGV4dGVybiAiQyIgewogICAgIHN0YXRpYyBpbnQgY29tcGFyZV9kd29yZChjb25zdCB2b2lkKiBkYXRhMSwgY29uc3Qgdm9pZCogZGF0YTIpCkBAIC0zOTUsNyArMzk1LDcgQEAKICAgICAgICAgcmV0dXJuICgqKEZYX0RXT1JEKilkYXRhMSkgLSAoKihGWF9EV09SRCopZGF0YTIpOwogICAgIH0KIH07Ci1GWF9CT09MIENQREZfQ01hcDo6TG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplKQorYm9vbCBDUERGX0NNYXA6OkxvYWRFbWJlZGRlZChjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSkKIHsKICAgICBtX3BNYXBwaW5nID0gRlhfQWxsb2MoRlhfV09SRCwgNjU1MzYpOwogICAgIENQREZfQ01hcFBhcnNlciBwYXJzZXI7CkBAIC00MTQsNyArNDE0LDcgQEAKICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcEFkZE1hcHBpbmcgKyA0LCBwYXJzZXIubV9BZGRNYXBzLkdldEJ1ZmZlcigpLCBwYXJzZXIubV9BZGRNYXBzLkdldFNpemUoKSk7CiAgICAgICAgIEZYU1lTX3Fzb3J0KG1fcEFkZE1hcHBpbmcgKyA0LCBwYXJzZXIubV9BZGRNYXBzLkdldFNpemUoKSAvIDgsIDgsIGNvbXBhcmVfZHdvcmQpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGV4dGVybiAiQyIgewogICAgIHN0YXRpYyBpbnQgY29tcGFyZUNJRChjb25zdCB2b2lkKiBrZXksIGNvbnN0IHZvaWQqIGVsZW1lbnQpCkBAIC02NjgsMTEgKzY2OCwxMSBAQAogQ1BERl9DSUQyVW5pY29kZU1hcDo6fkNQREZfQ0lEMlVuaWNvZGVNYXAoKQogewogfQotRlhfQk9PTCBDUERGX0NJRDJVbmljb2RlTWFwOjpJbml0aWFsaXplKCkKK2Jvb2wgQ1BERl9DSUQyVW5pY29kZU1hcDo6SW5pdGlhbGl6ZSgpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfQ0lEMlVuaWNvZGVNYXA6OklzTG9hZGVkKCkKK2Jvb2wgQ1BERl9DSUQyVW5pY29kZU1hcDo6SXNMb2FkZWQoKQogewogICAgIHJldHVybiBtX0VtYmVkZGVkQ291bnQgIT0gMDsKIH0KQEAgLTY4Nyw3ICs2ODcsNyBAQAogICAgIHJldHVybiAwOwogfQogdm9pZCBGUERGQVBJX0xvYWRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgY29uc3QgRlhfV09SRComIHBNYXAsIEZYX0RXT1JEJiBjb3VudCk7Ci12b2lkIENQREZfQ0lEMlVuaWNvZGVNYXA6OkxvYWQoQ1BERl9DTWFwTWFuYWdlciogcE1nciwgaW50IGNoYXJzZXQsIEZYX0JPT0wgYlByb21wdENKSykKK3ZvaWQgQ1BERl9DSUQyVW5pY29kZU1hcDo6TG9hZChDUERGX0NNYXBNYW5hZ2VyKiBwTWdyLCBpbnQgY2hhcnNldCwgYm9vbCBiUHJvbXB0Q0pLKQogewogICAgIG1fQ2hhcnNldCA9IGNoYXJzZXQ7CiAgICAgRlBERkFQSV9Mb2FkQ0lEMlVuaWNvZGVNYXAoY2hhcnNldCwgbV9wRW1iZWRkZWRNYXAsIG1fRW1iZWRkZWRDb3VudCk7CkBAIC03MDAsOCArNzAwLDggQEAKICAgICBtX3BDSUQyVW5pY29kZU1hcCA9IE5VTEw7CiAgICAgbV9wQW5zaVdpZHRocyA9IE5VTEw7CiAgICAgbV9wQ0lEVG9HSURNYXAgPSBOVUxMOwotICAgIG1fYkNJRElzR0lEID0gRkFMU0U7Ci0gICAgbV9iQWRvYmVDb3VyaWVyU3RkID0gRkFMU0U7CisgICAgbV9iQ0lESXNHSUQgPSBmYWxzZTsKKyAgICBtX2JBZG9iZUNvdXJpZXJTdGQgPSBmYWxzZTsKICAgICBtX3BUVEdTVUJUYWJsZSA9IE5VTEw7CiAgICAgRlhTWVNfbWVtc2V0KG1fQ2hhckJCb3gsIDB4ZmYsIDI1NiAqIHNpemVvZihGWF9TTUFMTF9SRUNUKSk7CiB9CkBAIC03MjEsOSArNzIxLDkgQEAKICAgICB9CiAgICAgcmV0dXJuIG1fcENNYXAtPkNJREZyb21DaGFyQ29kZShjaGFyY29kZSk7CiB9Ci1GWF9CT09MIENQREZfQ0lERm9udDo6SXNWZXJ0V3JpdGluZygpIGNvbnN0Citib29sIENQREZfQ0lERm9udDo6SXNWZXJ0V3JpdGluZygpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1fcENNYXAgPyBtX3BDTWFwLT5Jc1ZlcnRXcml0aW5nKCkgOiBGQUxTRTsKKyAgICByZXR1cm4gbV9wQ01hcCA/IG1fcENNYXAtPklzVmVydFdyaXRpbmcoKSA6IGZhbHNlOwogfQogZXh0ZXJuIEZYX0RXT1JEIEZQREZBUElfQ2hhckNvZGVGcm9tQ0lEKGNvbnN0IEZYQ01BUF9DTWFwKiBwTWFwLCBGWF9XT1JEIGNpZCk7CiBzdGF0aWMgRlhfRFdPUkQgX0VtYmVkZGVkQ2hhcmNvZGVGcm9tVW5pY29kZShjb25zdCBGWENNQVBfQ01hcCogcEVtYmVkTWFwLCBpbnQgY2hhcnNldCwgRlhfV0NIQVIgdW5pY29kZSkKQEAgLTg3MywyNyArODczLDI3IEBACiAgICAgICAgIEZYRlRfU2V0X0NoYXJtYXAoZmFjZSwgKkZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSkpOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9DSURGb250OjpfTG9hZCgpCitib29sIENQREZfQ0lERm9udDo6X0xvYWQoKQogewogICAgIGlmIChtX3BGb250RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTdWJ0eXBlIikpID09IEZYX0JTVFJDKCJUcnVlVHlwZSIpKSB7CiAgICAgICAgIHJldHVybiBMb2FkR0IyMzEyKCk7CiAgICAgfQogICAgIENQREZfQXJyYXkqIHBGb250cyA9IG1fcEZvbnREaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRGVzY2VuZGFudEZvbnRzIikpOwogICAgIGlmIChwRm9udHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBGb250cy0+R2V0Q291bnQoKSAhPSAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX0RpY3Rpb25hcnkqIHBDSURGb250RGljdCA9IHBGb250cy0+R2V0RGljdCgwKTsKICAgICBpZiAocENJREZvbnREaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fQmFzZUZvbnQgPSBwQ0lERm9udERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiQmFzZUZvbnQiKSk7CiAgICAgaWYgKChtX0Jhc2VGb250LkNvbXBhcmUoIkNvdXJpZXJTdGQiKSA9PSAwIHx8IG1fQmFzZUZvbnQuQ29tcGFyZSgiQ291cmllclN0ZC1Cb2xkIikgPT0gMAogICAgICAgICAgICAgfHwgbV9CYXNlRm9udC5Db21wYXJlKCJDb3VyaWVyU3RkLUJvbGRPYmxpcXVlIikgPT0gMCB8fCBtX0Jhc2VGb250LkNvbXBhcmUoIkNvdXJpZXJTdGQtT2JsaXF1ZSIpID09IDApCiAgICAgICAgICAgICAmJiAhSXNFbWJlZGRlZCgpKSB7Ci0gICAgICAgIG1fYkFkb2JlQ291cmllclN0ZCA9IFRSVUU7CisgICAgICAgIG1fYkFkb2JlQ291cmllclN0ZCA9IHRydWU7CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0gcENJREZvbnREaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJGb250RGVzY3JpcHRvciIpKTsKICAgICBpZiAocEZvbnREZXNjKSB7CkBAIC05MDEsMTIgKzkwMSwxMiBAQAogICAgIH0KICAgICBDUERGX09iamVjdCogcEVuY29kaW5nID0gbV9wRm9udERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRW5jb2RpbmciKSk7CiAgICAgaWYgKHBFbmNvZGluZyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRlhfQnl0ZVN0cmluZyBzdWJ0eXBlID0gcENJREZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSk7Ci0gICAgbV9iVHlwZTEgPSBGQUxTRTsKKyAgICBtX2JUeXBlMSA9IGZhbHNlOwogICAgIGlmIChzdWJ0eXBlID09IEZYX0JTVFJDKCJDSURGb250VHlwZTAiKSkgewotICAgICAgICBtX2JUeXBlMSA9IFRSVUU7CisgICAgICAgIG1fYlR5cGUxID0gdHJ1ZTsKICAgICB9CiAgICAgaWYgKHBFbmNvZGluZy0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7CiAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNtYXAgPSBwRW5jb2RpbmctPkdldFN0cmluZygpOwpAQCAtOTE2LDEzICs5MTYsMTMgQEAKICAgICAgICAgbV9wQWxsb2NhdGVkQ01hcCA9IG1fcENNYXAgPSBuZXcgQ1BERl9DTWFwOwogICAgICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IChDUERGX1N0cmVhbSopcEVuY29kaW5nOwogICAgICAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgICAgIGFjYy5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7CisgICAgICAgIGFjYy5Mb2FkQWxsRGF0YShwU3RyZWFtLCBmYWxzZSk7CiAgICAgICAgIG1fcENNYXAtPkxvYWRFbWJlZGRlZChhY2MuR2V0RGF0YSgpLCBhY2MuR2V0U2l6ZSgpKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fcENNYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9DaGFyc2V0ID0gbV9wQ01hcC0+bV9DaGFyc2V0OwogICAgIGlmIChtX0NoYXJzZXQgPT0gQ0lEU0VUX1VOS05PV04pIHsKQEAgLTk1NSwxNCArOTU1LDE0IEBACiAgICAgICAgICAgICBpZiAocG1hcCkgewogICAgICAgICAgICAgICAgIGlmIChwbWFwLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewogICAgICAgICAgICAgICAgICAgICBtX3BDSURUb0dJRE1hcCA9IG5ldyBDUERGX1N0cmVhbUFjYzsKLSAgICAgICAgICAgICAgICAgICAgbV9wQ0lEVG9HSURNYXAtPkxvYWRBbGxEYXRhKChDUERGX1N0cmVhbSopcG1hcCwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBtX3BDSURUb0dJRE1hcC0+TG9hZEFsbERhdGEoKENQREZfU3RyZWFtKilwbWFwLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwbWFwLT5HZXRTdHJpbmcoKSA9PSBGWF9CU1RSQygiSWRlbnRpdHkiKSkgewogI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwogICAgICAgICAgICAgICAgICAgICBpZiAobV9wRm9udEZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYkNJRElzR0lEID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYkNJRElzR0lEID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgbV9iQ0lESXNHSUQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBtX2JDSURJc0dJRCA9IHRydWU7CiAjZW5kaWYKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC05ODMsNyArOTgzLDcgQEAKICAgICAgICAgICAgIG1fRGVmYXVsdFcxID0gLTEwMDA7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBGWF9GTE9BVCBfQ0lEVHJhbnNmb3JtVG9GbG9hdCh1aW50OF90IGNoKQogewpAQCAtMTAwMSw3ICsxMDAxLDcgQEAKICAgICAgICAgcmVjdC50b3AgPSBtX0NoYXJCQm94W2NoYXJjb2RlXS5Ub3A7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgRlhfQk9PTCBiVmVydCA9IEZBTFNFOworICAgIGJvb2wgYlZlcnQgPSBmYWxzZTsKICAgICBpbnQgZ2x5cGhfaW5kZXggPSBHbHlwaEZyb21DaGFyQ29kZShjaGFyY29kZSwgJmJWZXJ0KTsKICAgICBpZiAobV9Gb250Lm1fRmFjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJlY3QgPSBGWF9SRUNUKDAsIDAsIDAsIDApOwpAQCAtMTEyMCwxMCArMTEyMCwxMCBAQAogICAgIHZ4ID0gKHNob3J0KWR3V2lkdGggLyAyOwogICAgIHZ5ID0gKHNob3J0KW1fRGVmYXVsdFZZOwogfQotaW50CUNQREZfQ0lERm9udDo6R2V0R2x5cGhJbmRleChGWF9EV09SRCB1bmljb2RlLCBGWF9CT09MICpwVmVydEdseXBoKQoraW50CUNQREZfQ0lERm9udDo6R2V0R2x5cGhJbmRleChGWF9EV09SRCB1bmljb2RlLCBib29sICpwVmVydEdseXBoKQogewogICAgIGlmIChwVmVydEdseXBoKSB7Ci0gICAgICAgICpwVmVydEdseXBoID0gRkFMU0U7CisgICAgICAgICpwVmVydEdseXBoID0gZmFsc2U7CiAgICAgfQogICAgIGludCBpbmRleCA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgdW5pY29kZSApOwogICAgIGlmICh1bmljb2RlID09IDB4MjUwMikgewpAQCAtMTEzNiw3ICsxMTM2LDcgQEAKICAgICAgICAgICAgIGlmICh2aW5kZXgpIHsKICAgICAgICAgICAgICAgICBpbmRleCA9IHZpbmRleDsKICAgICAgICAgICAgICAgICBpZiAocFZlcnRHbHlwaCkgewotICAgICAgICAgICAgICAgICAgICAqcFZlcnRHbHlwaCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICpwVmVydEdseXBoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CkBAIC0xMTU3LDIxICsxMTU3LDIxIEBACiAgICAgICAgICAgICBpZiAodmluZGV4KSB7CiAgICAgICAgICAgICAgICAgaW5kZXggPSB2aW5kZXg7CiAgICAgICAgICAgICAgICAgaWYgKHBWZXJ0R2x5cGgpIHsKLSAgICAgICAgICAgICAgICAgICAgKnBWZXJ0R2x5cGggPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAqcFZlcnRHbHlwaCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBpbmRleDsKICAgICB9CiAgICAgaWYgKHBWZXJ0R2x5cGgpIHsKLSAgICAgICAgKnBWZXJ0R2x5cGggPSBGQUxTRTsKKyAgICAgICAgKnBWZXJ0R2x5cGggPSBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIGluZGV4OwogfQotaW50IENQREZfQ0lERm9udDo6R2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIEZYX0JPT0wgKnBWZXJ0R2x5cGgpCitpbnQgQ1BERl9DSURGb250OjpHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSwgYm9vbCAqcFZlcnRHbHlwaCkKIHsKICAgICBpZiAocFZlcnRHbHlwaCkgewotICAgICAgICAqcFZlcnRHbHlwaCA9IEZBTFNFOworICAgICAgICAqcFZlcnRHbHlwaCA9IGZhbHNlOwogICAgIH0KICAgICBpZiAobV9wRm9udEZpbGUgPT0gTlVMTCAmJiBtX3BDSURUb0dJRE1hcCA9PSBOVUxMKSB7CiAgICAgICAgIEZYX1dPUkQgY2lkID0gQ0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKQEAgLTEyMDYsOCArMTIwNiw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjaGFyY29kZSArPSAzMTsKICAgICAgICAgICAgIGludCBpbmRleCA9IDAsIGlCYXNlRW5jb2Rpbmc7Ci0gICAgICAgICAgICBGWF9CT09MIGJNU1VuaWNvZGUgPSBGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMywgMSk7Ci0gICAgICAgICAgICBGWF9CT09MIGJNYWNSb21hbiA9IEZBTFNFOworICAgICAgICAgICAgYm9vbCBiTVNVbmljb2RlID0gRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDMsIDEpOworICAgICAgICAgICAgYm9vbCBiTWFjUm9tYW4gPSBmYWxzZTsKICAgICAgICAgICAgIGlmICghYk1TVW5pY29kZSkgewogICAgICAgICAgICAgICAgIGJNYWNSb21hbiA9IEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCAxLCAwKTsKICAgICAgICAgICAgIH0KQEAgLTEzMjcsMTYgKzEzMjcsMTYgQEAKIHsKICAgICByZXR1cm4gbV9wQ01hcC0+QXBwZW5kQ2hhcihzdHIsIGNoYXJjb2RlKTsKIH0KLUZYX0JPT0wgQ1BERl9DSURGb250OjpJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QKK2Jvb2wgQ1BERl9DSURGb250OjpJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QKIHsKICAgICBpZiAoIW1fcENNYXAtPklzTG9hZGVkKCkgfHwgbV9wQ0lEMlVuaWNvZGVNYXAgPT0gTlVMTCB8fCAhbV9wQ0lEMlVuaWNvZGVNYXAtPklzTG9hZGVkKCkpIHsKICAgICAgICAgcmV0dXJuIG1fcENNYXAtPm1fQ29kaW5nICE9IENJRENPRElOR19VTktOT1dOOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9DSURGb250OjpJc0ZvbnRTdHlsZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3QKK2Jvb2wgQ1BERl9DSURGb250OjpJc0ZvbnRTdHlsZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3QKIHsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ1BERl9DSURGb250OjpMb2FkU3Vic3RGb250KCkKIHsKQEAgLTEzOTAsNyArMTM5MCw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1GWF9CT09MIENQREZfQ0lERm9udDo6TG9hZEdCMjMxMigpCitib29sIENQREZfQ0lERm9udDo6TG9hZEdCMjMxMigpCiB7CiAgICAgbV9CYXNlRm9udCA9IG1fcEZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkJhc2VGb250IikpOwogICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0gbV9wRm9udERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkZvbnREZXNjcmlwdG9yIikpOwpAQCAtMTM5OCwxMCArMTM5OCwxMCBAQAogICAgICAgICBMb2FkRm9udERlc2NyaXB0b3IocEZvbnREZXNjKTsKICAgICB9CiAgICAgbV9DaGFyc2V0ID0gQ0lEU0VUX0dCMTsKLSAgICBtX2JUeXBlMSA9IEZBTFNFOworICAgIG1fYlR5cGUxID0gZmFsc2U7CiAgICAgbV9wQ01hcCA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpLT5tX0NNYXBNYW5hZ2VyLkdldFByZWRlZmluZWRDTWFwKAotICAgICAgICAgICAgICAgICAgRlhfQlNUUkMoIkdCSy1FVUMtSCIpLCBGQUxTRSk7Ci0gICAgbV9wQ0lEMlVuaWNvZGVNYXAgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0Rm9udEdsb2JhbHMoKS0+bV9DTWFwTWFuYWdlci5HZXRDSUQyVW5pY29kZU1hcChtX0NoYXJzZXQsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgIEZYX0JTVFJDKCJHQkstRVVDLUgiKSwgZmFsc2UpOworICAgIG1fcENJRDJVbmljb2RlTWFwID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCktPm1fQ01hcE1hbmFnZXIuR2V0Q0lEMlVuaWNvZGVNYXAobV9DaGFyc2V0LCBmYWxzZSk7CiAgICAgaWYgKCFJc0VtYmVkZGVkKCkpIHsKICAgICAgICAgTG9hZFN1YnN0Rm9udCgpOwogICAgIH0KQEAgLTE0MTEsNyArMTQxMSw3IEBACiAgICAgZm9yIChpbnQgaSA9IDMyOyBpIDwgMTI3OyBpICsrKSB7CiAgICAgICAgIG1fcEFuc2lXaWR0aHNbaV0gPSA1MDA7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogY29uc3Qgc3RydWN0IF9DSURUcmFuc2Zvcm0gewogICAgIEZYX1dPUkQJCUNJRDsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L3R0Z3N1YnRhYmxlLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L3R0Z3N1YnRhYmxlLmNwcAppbmRleCBhNjUzNTljLi45ODBlMTZjIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC90dGdzdWJ0YWJsZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvdHRnc3VidGFibGUuY3BwCkBAIC00OCwxNSArNDgsMTUgQEAKICAgICB9CiAgICAgbV9CdWZmZXIuSW5zZXJ0QmxvY2sobG93ICogc2l6ZW9mKF9JbnRQYWlyKSwgJnBhaXIsIHNpemVvZihfSW50UGFpcikpOwogfQotRlhfQk9PTCBDRlhfR2x5cGhNYXA6Okxvb2t1cChpbnQga2V5LCBpbnQgJnZhbHVlKQorYm9vbCBDRlhfR2x5cGhNYXA6Okxvb2t1cChpbnQga2V5LCBpbnQgJnZhbHVlKQogewogICAgIHZvaWQqIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZrZXksIG1fQnVmZmVyLkdldEJ1ZmZlcigpLCBtX0J1ZmZlci5HZXRTaXplKCkgLyBzaXplb2YoX0ludFBhaXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoX0ludFBhaXIpLCBfQ29tcGFyZUludCk7CiAgICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgdmFsdWUgPSAoKEZYX0RXT1JEKilwUmVzdWx0KVsxXTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGJvb2wgQ0ZYX0NUVEdTVUJUYWJsZTo6TG9hZEdTVUJUYWJsZShGVF9CeXRlcyBnc3ViKQogewpAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1fYkZlYXV0dXJlTWFwTG9hZCA9IFRSVUU7CisgICAgICAgIG1fYkZlYXV0dXJlTWFwTG9hZCA9IHRydWU7CiAgICAgfQogICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fZmVhdHVyZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7CiAgICAgd2hpbGUgKHBvcykgewpAQCAtNDIwLDcgKzQyMCw3IEBACiAgICAgICAgIHJlYy0+U3Vic3RpdHV0ZVtpXSA9IEdldFVJbnQxNihzcCk7CiAgICAgfQogfQotRlhfQk9PTCBDRlhfR1NVQlRhYmxlOjpHZXRWZXJ0aWNhbEdseXBoKEZYX0RXT1JEIGdseXBobnVtLCBGWF9EV09SRCogdmdseXBobnVtKQorYm9vbCBDRlhfR1NVQlRhYmxlOjpHZXRWZXJ0aWNhbEdseXBoKEZYX0RXT1JEIGdseXBobnVtLCBGWF9EV09SRCogdmdseXBobnVtKQogewogICAgIHJldHVybiBtX0dzdWJJbXAuR2V0VmVydGljYWxHbHlwaChnbHlwaG51bSwgdmdseXBobnVtKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L3R0Z3N1YnRhYmxlLmggYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC90dGdzdWJ0YWJsZS5oCmluZGV4IDFiMThmODIuLjEzMzY2N2IgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L3R0Z3N1YnRhYmxlLmgKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvdHRnc3VidGFibGUuaApAQCAtMTcsMTUgKzE3LDE1IEBACiAgICAgQ0ZYX0dseXBoTWFwKCk7CiAgICAgfkNGWF9HbHlwaE1hcCgpOwogICAgIHZvaWQJU2V0QXQoaW50IGtleSwgaW50IHZhbHVlKTsKLSAgICBGWF9CT09MCUxvb2t1cChpbnQga2V5LCBpbnQgJnZhbHVlKTsKKyAgICBib29sCUxvb2t1cChpbnQga2V5LCBpbnQgJnZhbHVlKTsKIHByb3RlY3RlZDoKICAgICBDRlhfQmluYXJ5QnVmCW1fQnVmZmVyOwogfTsKIGNsYXNzIENGWF9DVFRHU1VCVGFibGUKIHsKIHB1YmxpYzoKLSAgICBDRlhfQ1RUR1NVQlRhYmxlKHZvaWQpOiBtX2JGZWF1dHVyZU1hcExvYWQoRkFMU0UpLCBsb2FkZWQoZmFsc2UpIHt9OwotICAgIENGWF9DVFRHU1VCVGFibGUoRlRfQnl0ZXMgZ3N1Yik6IG1fYkZlYXV0dXJlTWFwTG9hZChGQUxTRSksIGxvYWRlZChmYWxzZSkKKyAgICBDRlhfQ1RUR1NVQlRhYmxlKHZvaWQpOiBtX2JGZWF1dHVyZU1hcExvYWQoZmFsc2UpLCBsb2FkZWQoZmFsc2UpIHt9OworICAgIENGWF9DVFRHU1VCVGFibGUoRlRfQnl0ZXMgZ3N1Yik6IG1fYkZlYXV0dXJlTWFwTG9hZChmYWxzZSksIGxvYWRlZChmYWxzZSkKICAgICB7CiAgICAgICAgIExvYWRHU1VCVGFibGUoZ3N1Yik7CiAgICAgfQpAQCAtMzk1LDcgKzM5NSw3IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIENGWF9DTWFwRFdvcmRUb0RXb3JkIG1fZmVhdHVyZU1hcDsKLSAgICBGWF9CT09MCW1fYkZlYXV0dXJlTWFwTG9hZDsKKyAgICBib29sCW1fYkZlYXV0dXJlTWFwTG9hZDsKICAgICBib29sIGxvYWRlZDsKICAgICBzdHJ1Y3QgdHRfZ3N1Yl9oZWFkZXIgaGVhZGVyOwogICAgIHN0cnVjdCBUU2NyaXB0TGlzdCBTY3JpcHRMaXN0OwpAQCAtNDA2LDcgKzQwNiw3IEBACiB7CiBwdWJsaWM6CiAgICAgfkNGWF9HU1VCVGFibGUoKSBvdmVycmlkZSB7fQotICAgIHZpcnR1YWwgRlhfQk9PTCBHZXRWZXJ0aWNhbEdseXBoKEZYX0RXT1JEIGdseXBobnVtLCBGWF9EV09SRCogdmdseXBobnVtKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgR2V0VmVydGljYWxHbHlwaChGWF9EV09SRCBnbHlwaG51bSwgRlhfRFdPUkQqIHZnbHlwaG51bSkgb3ZlcnJpZGU7CiAKICAgICBDRlhfQ1RUR1NVQlRhYmxlIG1fR3N1YkltcDsKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2UuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlLmNwcAppbmRleCBmNDA0MzUyLi43MjllOTZjIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2UuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZS5jcHAKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgICBtX1RvcCA9IHBTcmMtPm1fVG9wOwogICAgIG1fQm90dG9tID0gcFNyYy0+bV9Cb3R0b207CiB9Ci12b2lkIENQREZfUGFnZU9iamVjdDo6QXBwZW5kQ2xpcFBhdGgoQ1BERl9QYXRoIHBhdGgsIGludCB0eXBlLCBGWF9CT09MIGJBdXRvTWVyZ2UpCit2b2lkIENQREZfUGFnZU9iamVjdDo6QXBwZW5kQ2xpcFBhdGgoQ1BERl9QYXRoIHBhdGgsIGludCB0eXBlLCBib29sIGJBdXRvTWVyZ2UpCiB7CiAgICAgbV9DbGlwUGF0aC5BcHBlbmRQYXRoKHBhdGgsIHR5cGUsIGJBdXRvTWVyZ2UpOwogfQpAQCAtMzUzLDcgKzM1Myw3IEBACiB7CiAgICAgRlhfRkxPQVQgZm9udHNpemUgPSBtX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpIC8gMTAwMDsKICAgICBDUERGX0ZvbnQqIHBGb250ID0gbV9UZXh0U3RhdGUuR2V0Rm9udCgpOwotICAgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7CisgICAgYm9vbCBiVmVydFdyaXRpbmcgPSBmYWxzZTsKICAgICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gcEZvbnQtPkdldENJREZvbnQoKTsKICAgICBpZiAocENJREZvbnQpIHsKICAgICAgICAgYlZlcnRXcml0aW5nID0gcENJREZvbnQtPklzVmVydFdyaXRpbmcoKTsKQEAgLTM3Myw3ICszNzMsNyBAQAogICAgICAgICByZXR1cm4gR2V0Q2hhcldpZHRoKGNoYXJDb2RlKTsKICAgICB9CiAgICAgRlhfRkxPQVQgZm9udFNpemUgPSBtX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpIC8gNDAwMC4wZjsKLSAgICBGWF9CT09MIGJWZXJ0V3JpdGluZyA9IEZBTFNFOworICAgIGJvb2wgYlZlcnRXcml0aW5nID0gZmFsc2U7CiAgICAgQ1BERl9DSURGb250KiBwQ0lERm9udCA9IHBGb250LT5HZXRDSURGb250KCk7CiAgICAgaWYgKHBDSURGb250KSB7CiAgICAgICAgIGJWZXJ0V3JpdGluZyA9IHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7CkBAIC0zODgsNyArMzg4LDcgQEAKIHZvaWQgQ1BERl9UZXh0T2JqZWN0OjpHZXRDaGFyUmVjdChpbnQgaW5kZXgsIENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0CiB7CiAgICAgQ1BERl9Gb250KiBwRm9udCA9IG1fVGV4dFN0YXRlLkdldEZvbnQoKTsKLSAgICBGWF9CT09MIGJWZXJ0V3JpdGluZyA9IEZBTFNFOworICAgIGJvb2wgYlZlcnRXcml0aW5nID0gZmFsc2U7CiAgICAgQ1BERl9DSURGb250KiBwQ0lERm9udCA9IHBGb250LT5HZXRDSURGb250KCk7CiAgICAgaWYgKHBDSURGb250KSB7CiAgICAgICAgIGJWZXJ0V3JpdGluZyA9IHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7CkBAIC00NDEsNyArNDQxLDcgQEAKICAgICBGWF9GTE9BVCBtaW5feSA9IDEwMDAwICogMS4wZjsKICAgICBGWF9GTE9BVCBtYXhfeSA9IC0xMDAwMCAqIDEuMGY7CiAgICAgQ1BERl9Gb250KiBwRm9udCA9IG1fVGV4dFN0YXRlLkdldEZvbnQoKTsKLSAgICBGWF9CT09MIGJWZXJ0V3JpdGluZyA9IEZBTFNFOworICAgIGJvb2wgYlZlcnRXcml0aW5nID0gZmFsc2U7CiAgICAgQ1BERl9DSURGb250KiBwQ0lERm9udCA9IHBGb250LT5HZXRDSURGb250KCk7CiAgICAgaWYgKHBDSURGb250KSB7CiAgICAgICAgIGJWZXJ0V3JpdGluZyA9IHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7CkBAIC01NzAsNyArNTcwLDcgQEAKIHZvaWQgQ1BERl9UZXh0T2JqZWN0OjpDYWxjQ2hhclBvcyhGWF9GTE9BVCogcFBvc0FycmF5KSBjb25zdAogewogICAgIENQREZfRm9udCogcEZvbnQgPSBtX1RleHRTdGF0ZS5HZXRGb250KCk7Ci0gICAgRlhfQk9PTCBiVmVydFdyaXRpbmcgPSBGQUxTRTsKKyAgICBib29sIGJWZXJ0V3JpdGluZyA9IGZhbHNlOwogICAgIENQREZfQ0lERm9udCogcENJREZvbnQgPSBwRm9udC0+R2V0Q0lERm9udCgpOwogICAgIGlmIChwQ0lERm9udCkgewogICAgICAgICBiVmVydFdyaXRpbmcgPSBwQ0lERm9udC0+SXNWZXJ0V3JpdGluZygpOwpAQCAtNzIwLDcgKzcyMCw3IEBACiAgICAgbV9SaWdodCA9IGZvcm1fcmVjdC5yaWdodDsKICAgICBtX1RvcCA9IGZvcm1fcmVjdC50b3A7CiB9Ci1DUERGX1BhZ2VPYmplY3RzOjpDUERGX1BhZ2VPYmplY3RzKEZYX0JPT0wgYlJlbGVhc2VNZW1iZXJzKQorQ1BERl9QYWdlT2JqZWN0czo6Q1BERl9QYWdlT2JqZWN0cyhib29sIGJSZWxlYXNlTWVtYmVycykKICAgICA6IG1fcEZvcm1EaWN0KG51bGxwdHIpLAogICAgICAgbV9wRm9ybVN0cmVhbShudWxscHRyKSwKICAgICAgIG1fcERvY3VtZW50KG51bGxwdHIpLApAQCAtNzI4LDcgKzcyOCw3IEBACiAgICAgICBtX3BSZXNvdXJjZXMobnVsbHB0ciksCiAgICAgICBtX1RyYW5zcGFyZW5jeSgwKSwKICAgICAgIG1fT2JqZWN0TGlzdCgxMjgpLAotICAgICAgbV9iQmFja2dyb3VuZEFscGhhTmVlZGVkKEZBTFNFKSwKKyAgICAgIG1fYkJhY2tncm91bmRBbHBoYU5lZWRlZChmYWxzZSksCiAgICAgICBtX2JSZWxlYXNlTWVtYmVycyhiUmVsZWFzZU1lbWJlcnMpLAogICAgICAgbV9wUGFyc2VyKG51bGxwdHIpLAogICAgICAgbV9QYXJzZVN0YXRlKENPTlRFTlRfTk9UX1BBUlNFRCkKQEAgLTg1Niw3ICs4NTYsNyBAQAogewogICAgIG1fcFBhZ2VSZW5kZXIgPSBOVUxMOwogfQotdm9pZCBDUERGX1BhZ2U6OkxvYWQoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCwgRlhfQk9PTCBiUGFnZUNhY2hlKQordm9pZCBDUERGX1BhZ2U6OkxvYWQoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCwgYm9vbCBiUGFnZUNhY2hlKQogewogICAgIG1fcERvY3VtZW50ID0gKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudDsKICAgICBtX3BGb3JtRGljdCA9IHBQYWdlRGljdDsKQEAgLTkyMyw3ICs5MjMsNyBAQAogICAgIG1fVHJhbnNwYXJlbmN5ID0gUERGVFJBTlNfSVNPTEFURUQ7CiAgICAgTG9hZFRyYW5zSW5mbygpOwogfQotdm9pZCBDUERGX1BhZ2U6OlN0YXJ0UGFyc2UoQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zLCBGWF9CT09MIGJSZVBhcnNlKQordm9pZCBDUERGX1BhZ2U6OlN0YXJ0UGFyc2UoQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zLCBib29sIGJSZVBhcnNlKQogewogICAgIGlmIChiUmVQYXJzZSkgewogICAgICAgICBDbGVhckNhY2hlT2JqZWN0cygpOwpAQCAtOTM1LDcgKzkzNSw3IEBACiAgICAgbV9wUGFyc2VyLT5TdGFydCh0aGlzLCBwT3B0aW9ucyk7CiAgICAgbV9QYXJzZVN0YXRlID0gQ09OVEVOVF9QQVJTSU5HOwogfQotdm9pZCBDUERGX1BhZ2U6OlBhcnNlQ29udGVudChDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMsIEZYX0JPT0wgYlJlUGFyc2UpCit2b2lkIENQREZfUGFnZTo6UGFyc2VDb250ZW50KENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywgYm9vbCBiUmVQYXJzZSkKIHsKICAgICBTdGFydFBhcnNlKHBPcHRpb25zLCBiUmVQYXJzZSk7CiAgICAgQ29udGludWVQYXJzZShOVUxMKTsKQEAgLTEwNjgsOCArMTA2OCw4IEBACiB9CiBDUERGX1BhcnNlT3B0aW9uczo6Q1BERl9QYXJzZU9wdGlvbnMoKQogewotICAgIG1fYlRleHRPbmx5ID0gRkFMU0U7Ci0gICAgbV9iTWFya2VkQ29udGVudCA9IFRSVUU7Ci0gICAgbV9iU2VwYXJhdGVGb3JtID0gVFJVRTsKLSAgICBtX2JEZWNvZGVJbmxpbmVJbWFnZSA9IEZBTFNFOworICAgIG1fYlRleHRPbmx5ID0gZmFsc2U7CisgICAgbV9iTWFya2VkQ29udGVudCA9IHRydWU7CisgICAgbV9iU2VwYXJhdGVGb3JtID0gdHJ1ZTsKKyAgICBtX2JEZWNvZGVJbmxpbmVJbWFnZSA9IGZhbHNlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2NvbG9ycy5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfY29sb3JzLmNwcAppbmRleCAxOTgwNTRlLi5iMWM4ODM3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfY29sb3JzLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfY29sb3JzLmNwcApAQCAtNDAsNyArNDAsNyBAQAogICAgICAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBmYW1pbHksIENvbXBvbmVudHNGb3JGYW1pbHkoZmFtaWx5KSkgewogfQogCi1GWF9CT09MIENQREZfRGV2aWNlQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKK2Jvb2wgQ1BERl9EZXZpY2VDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAogewogICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VSR0IpIHsKICAgICAgICAgUiA9IHBCdWZbMF07CkBAIC04MSw1NiArODEsNTYgQEAKICAgICB9IGVsc2UgewogICAgICAgICBBU1NFUlQobV9GYW1pbHkgPT0gUERGQ1NfUEFUVEVSTik7CiAgICAgICAgIFIgPSBHID0gQiA9IDA7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9EZXZpY2VDUzo6dl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3QKK2Jvb2wgQ1BERl9EZXZpY2VDUzo6dl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3QKIHsKICAgICBpZiAobV9GYW1pbHkgIT0gUERGQ1NfREVWSUNFQ01ZSykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgYyA9IHBCdWZbMF07CiAgICAgbSA9IHBCdWZbMV07CiAgICAgeSA9IHBCdWZbMl07CiAgICAgayA9IHBCdWZbM107Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfRGV2aWNlQ1M6OlNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3QKK2Jvb2wgQ1BERl9EZXZpY2VDUzo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdAogewogICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VSR0IpIHsKICAgICAgICAgcEJ1ZlswXSA9IFI7CiAgICAgICAgIHBCdWZbMV0gPSBHOwogICAgICAgICBwQnVmWzJdID0gQjsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFR1JBWSkgewogICAgICAgICBpZiAoUiA9PSBHICYmIFIgPT0gQikgewogICAgICAgICAgICAgKnBCdWYgPSBSOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUspIHsKICAgICAgICAgc1JHQl90b19BZG9iZUNNWUsoUiwgRywgQiwgcEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSwgcEJ1ZlszXSk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9EZXZpY2VDUzo6dl9TZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBtLCBGWF9GTE9BVCB5LCBGWF9GTE9BVCBrKSBjb25zdAorYm9vbCBDUERGX0RldmljZUNTOjp2X1NldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIG0sIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIGspIGNvbnN0CiB7CiAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRVJHQikgewogICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQihjLCBtLCB5LCBrLCBwQnVmWzBdLCBwQnVmWzFdLCBwQnVmWzJdKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSykgewogICAgICAgICBwQnVmWzBdID0gYzsKICAgICAgICAgcEJ1ZlsxXSA9IG07CiAgICAgICAgIHBCdWZbMl0gPSB5OwogICAgICAgICBwQnVmWzNdID0gazsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogc3RhdGljIHZvaWQgUmV2ZXJzZVJHQih1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscykKIHsKQEAgLTE0OSw3ICsxNDksNyBAQAogICAgICAgICAgICAgcFNyY0J1ZiArPSAzOwogICAgICAgICB9CiB9Ci12b2lkIENQREZfRGV2aWNlQ1M6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0Cit2b2lkIENQREZfRGV2aWNlQ1M6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBib29sIGJUcmFuc01hc2spIGNvbnN0CiB7CiAgICAgaWYgKGJUcmFuc01hc2sgJiYgbV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSykgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSArKykgewpAQCAtMjc0LDExICsyNzQsMTEgQEAKICAgICBleHBsaWNpdCBDUERGX0NhbEdyYXkoQ1BERl9Eb2N1bWVudCogcERvYykKICAgICAgICAgOiBDUERGX0NvbG9yU3BhY2UocERvYywgUERGQ1NfQ0FMR1JBWSwgMSkgewogICAgIH0KLSAgICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOwotICAgIEZYX0JPT0wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKLSAgICBGWF9CT09MCVNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKKyAgICBib29sIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbAlTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZvaWQgVHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwgRlhfQk9PTCBiVHJhbnNNYXNrID0gRkFMU0UpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsIGJvb2wgYlRyYW5zTWFzayA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICBGWF9GTE9BVCBtX1doaXRlUG9pbnRbM107CkBAIC0yODYsNyArMjg2LDcgQEAKICAgICBGWF9GTE9BVCBtX0dhbW1hOwogfTsKIAotRlhfQk9PTCBDUERGX0NhbEdyYXk6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCitib29sIENQREZfQ2FsR3JheTo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcEFycmF5LT5HZXREaWN0KDEpOwogICAgIENQREZfQXJyYXkqIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiV2hpdGVQb2ludCIpKTsKQEAgLTMwMiwyMiArMzAyLDIyIEBACiAgICAgaWYgKG1fR2FtbWEgPT0gMCkgewogICAgICAgICBtX0dhbW1hID0gMS4wZjsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfQ2FsR3JheTo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAorYm9vbCBDUERGX0NhbEdyYXk6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKIHsKICAgICBSID0gRyA9IEIgPSAqcEJ1ZjsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9DYWxHcmF5OjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0Citib29sIENQREZfQ2FsR3JheTo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdAogewogICAgIGlmIChSID09IEcgJiYgUiA9PSBCKSB7CiAgICAgICAgICpwQnVmID0gUjsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotdm9pZCBDUERGX0NhbEdyYXk6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0Cit2b2lkIENQREZfQ2FsR3JheTo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIGJvb2wgYlRyYW5zTWFzaykgY29uc3QKIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSArKykgewogICAgICAgICAqcERlc3RCdWYgKysgPSBwU3JjQnVmW2ldOwpAQCAtMzMxLDI0ICszMzEsMjQgQEAKICAgICBleHBsaWNpdCBDUERGX0NhbFJHQihDUERGX0RvY3VtZW50KiBwRG9jKQogICAgICAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19DQUxSR0IsIDMpIHsKICAgICB9Ci0gICAgRlhfQk9PTCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKLSAgICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCBTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7CisgICAgYm9vbCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdCBvdmVycmlkZTsKICAgICB2b2lkIFRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzayA9IEZBTFNFKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LCBib29sIGJUcmFuc01hc2sgPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICBGWF9GTE9BVCBtX1doaXRlUG9pbnRbM107CiAgICAgRlhfRkxPQVQgbV9CbGFja1BvaW50WzNdOwogICAgIEZYX0ZMT0FUIG1fR2FtbWFbM107CiAgICAgRlhfRkxPQVQgbV9NYXRyaXhbOV07Ci0gICAgRlhfQk9PTCBtX2JHYW1tYTsKLSAgICBGWF9CT09MIG1fYk1hdHJpeDsKKyAgICBib29sIG1fYkdhbW1hOworICAgIGJvb2wgbV9iTWF0cml4OwogfTsKLUZYX0JPT0wgQ1BERl9DYWxSR0I6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCitib29sIENQREZfQ2FsUkdCOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQogewogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwQXJyYXktPkdldERpY3QoMSk7CiAgICAgaWYgKCFwRGljdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0FycmF5KiBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIldoaXRlUG9pbnQiKSk7CiAgICAgaW50IGk7CkBAIC0zNjEsMjUgKzM2MSwyNSBAQAogICAgIH0KICAgICBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkdhbW1hIikpOwogICAgIGlmIChwUGFyYW0pIHsKLSAgICAgICAgbV9iR2FtbWEgPSBUUlVFOworICAgICAgICBtX2JHYW1tYSA9IHRydWU7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpICsrKSB7CiAgICAgICAgICAgICBtX0dhbW1hW2ldID0gcFBhcmFtLT5HZXROdW1iZXIoaSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBtX2JHYW1tYSA9IEZBTFNFOworICAgICAgICBtX2JHYW1tYSA9IGZhbHNlOwogICAgIH0KICAgICBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIk1hdHJpeCIpKTsKICAgICBpZiAocFBhcmFtKSB7Ci0gICAgICAgIG1fYk1hdHJpeCA9IFRSVUU7CisgICAgICAgIG1fYk1hdHJpeCA9IHRydWU7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpICsrKSB7CiAgICAgICAgICAgICBtX01hdHJpeFtpXSA9IHBQYXJhbS0+R2V0TnVtYmVyKGkpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbV9iTWF0cml4ID0gRkFMU0U7CisgICAgICAgIG1fYk1hdHJpeCA9IGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9DYWxSR0I6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKK2Jvb2wgQ1BERl9DYWxSR0I6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKIHsKICAgICBGWF9GTE9BVCBBXyA9IHBCdWZbMF07CiAgICAgRlhfRkxPQVQgQl8gPSBwQnVmWzFdOwpAQCAtNDAwLDE2ICs0MDAsMTYgQEAKICAgICAgICAgWiA9IENfOwogICAgIH0KICAgICBYWVpfdG9fc1JHQl9XaGl0ZVBvaW50KFgsIFksIFosIFIsIEcsIEIsIG1fV2hpdGVQb2ludFswXSwgbV9XaGl0ZVBvaW50WzFdLCBtX1doaXRlUG9pbnRbMl0pOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0NhbFJHQjo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdAorYm9vbCBDUERGX0NhbFJHQjo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdAogewogICAgIHBCdWZbMF0gPSBSOwogICAgIHBCdWZbMV0gPSBHOwogICAgIHBCdWZbMl0gPSBCOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotdm9pZCBDUERGX0NhbFJHQjo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzaykgY29uc3QKK3ZvaWQgQ1BERl9DYWxSR0I6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBib29sIGJUcmFuc01hc2spIGNvbnN0CiB7CiAgICAgaWYgKGJUcmFuc01hc2spIHsKICAgICAgICAgRlhfRkxPQVQgQ2FsWzNdOwpAQCAtNDM1LDIxICs0MzUsMjEgQEAKICAgICAgICAgOiBDUERGX0NvbG9yU3BhY2UocERvYywgUERGQ1NfTEFCLCAzKSB7CiAgICAgfQogICAgIHZvaWQgR2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LCBGWF9GTE9BVCYgdmFsdWUsIEZYX0ZMT0FUJiBtaW4sIEZYX0ZMT0FUJiBtYXgpIGNvbnN0IG92ZXJyaWRlOwotICAgIEZYX0JPT0wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTAlHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOwotICAgIEZYX0JPT0wJU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICAgIGJvb2wJR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sCVNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdm9pZCBUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogcERlc3RCdWYsIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsIGludCBwaXhlbHMsIGludCBpbWFnZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2sgPSBGQUxTRSkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwgYm9vbCBiVHJhbnNNYXNrID0gZmFsc2UpIGNvbnN0OwogCiAgICAgRlhfRkxPQVQgbV9XaGl0ZVBvaW50WzNdOwogICAgIEZYX0ZMT0FUIG1fQmxhY2tQb2ludFszXTsKICAgICBGWF9GTE9BVCBtX1Jhbmdlc1s0XTsKIH07Ci1GWF9CT09MIENQREZfTGFiQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCitib29sIENQREZfTGFiQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBBcnJheS0+R2V0RGljdCgxKTsKICAgICBpZiAoIXBEaWN0KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX0FycmF5KiBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIldoaXRlUG9pbnQiKSk7CiAgICAgaW50IGk7CkBAIC00NjUsNyArNDY1LDcgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArKykgewogICAgICAgICBtX1Jhbmdlc1tpXSA9IHBQYXJhbSA/IHBQYXJhbS0+R2V0TnVtYmVyKGkpIDogZGVmX3Jhbmdlc1tpXTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENQREZfTGFiQ1M6OkdldERlZmF1bHRWYWx1ZShpbnQgaUNvbXBvbmVudCwgRlhfRkxPQVQmIHZhbHVlLCBGWF9GTE9BVCYgbWluLCBGWF9GTE9BVCYgbWF4KSBjb25zdAogewpAQCAtNDg0LDcgKzQ4NCw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1GWF9CT09MIENQREZfTGFiQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKK2Jvb2wgQ1BERl9MYWJDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAogewogICAgIEZYX0ZMT0FUIExzdGFyID0gcEJ1ZlswXTsKICAgICBGWF9GTE9BVCBhc3RhciA9IHBCdWZbMV07CkBAIC01MDksMTMgKzUwOSwxMyBAQAogICAgICAgICBaID0gMS4wODg5ZiAqIE4gKiBOICogTjsKICAgICB9CiAgICAgWFlaX3RvX3NSR0IoWCwgWSwgWiwgUiwgRywgQik7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfTGFiQ1M6OlNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3QKK2Jvb2wgQ1BERl9MYWJDUzo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdAogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci12b2lkIENQREZfTGFiQ1M6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0Cit2b2lkIENQREZfTGFiQ1M6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBib29sIGJUcmFuc01hc2spIGNvbnN0CiB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkgKyspIHsKICAgICAgICAgRlhfRkxPQVQgbGFiWzNdOwpAQCAtNTMyLDEyICs1MzIsMTIgQEAKICAgICB9CiB9CiBDUERGX0ljY1Byb2ZpbGU6OkNQREZfSWNjUHJvZmlsZShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKToKLSAgICBtX2JzUkdCKEZBTFNFKSwKKyAgICBtX2JzUkdCKGZhbHNlKSwKICAgICBtX3BUcmFuc2Zvcm0oTlVMTCksCiAgICAgbV9uU3JjQ29tcG9uZW50cygwKQogewogICAgIGlmIChkd1NpemUgPT0gMzE0NCAmJiBGWFNZU19tZW1jbXAocERhdGEgKyAweDE5MCwgInNSR0IgSUVDNjE5NjYtMi4xIiwgMTcpID09IDApIHsKLSAgICAgICAgbV9ic1JHQiA9IFRSVUU7CisgICAgICAgIG1fYnNSR0IgPSB0cnVlOwogICAgICAgICBtX25TcmNDb21wb25lbnRzID0gMzsKICAgICB9CiAgICAgZWxzZSBpZiAoQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRJY2NNb2R1bGUoKSkgewpAQCAtNTU5LDIzICs1NTksMjMgQEAKICAgICAgICAgICBtX3BQcm9maWxlKG51bGxwdHIpLAogICAgICAgICAgIG1fcENhY2hlKG51bGxwdHIpLAogICAgICAgICAgIG1fcFJhbmdlcyhudWxscHRyKSwKLSAgICAgICAgICBtX2JPd24oRkFMU0UpIHsKKyAgICAgICAgICBtX2JPd24oZmFsc2UpIHsKICAgICB9CiAgICAgfkNQREZfSUNDQmFzZWRDUygpIG92ZXJyaWRlOwogCi0gICAgRlhfQk9PTAl2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKLSAgICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTAlTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0IG92ZXJyaWRlOwotICAgIEZYX0JPT0wJdl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpIG92ZXJyaWRlOworICAgIGJvb2wJdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7CisgICAgYm9vbCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wJU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sCXZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIGMsIEZYX0ZMT0FUJiBtLCBGWF9GTE9BVCYgeSwgRlhfRkxPQVQmIGspIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgRW5hYmxlU3RkQ29udmVyc2lvbihib29sIGJFbmFibGVkKSBvdmVycmlkZTsKICAgICB2b2lkIFRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzayA9IEZBTFNFKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LCBib29sIGJUcmFuc01hc2sgPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICBDUERGX0NvbG9yU3BhY2UqIG1fcEFsdGVyQ1M7CiAgICAgQ1BERl9JY2NQcm9maWxlKiBtX3BQcm9maWxlOwogICAgIHVpbnQ4X3QqIG1fcENhY2hlOwogICAgIEZYX0ZMT0FUKiBtX3BSYW5nZXM7Ci0gICAgRlhfQk9PTAltX2JPd247CisgICAgYm9vbAltX2JPd247CiB9OwogCiBDUERGX0lDQ0Jhc2VkQ1M6On5DUERGX0lDQ0Jhc2VkQ1MoKQpAQCAtNTk0LDE1ICs1OTQsMTUgQEAKICAgICB9CiB9CiAKLUZYX0JPT0wgQ1BERl9JQ0NCYXNlZENTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQorYm9vbCBDUERGX0lDQ0Jhc2VkQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCiB7CiAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwQXJyYXktPkdldFN0cmVhbSgxKTsKICAgICBpZiAocFN0cmVhbSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BQcm9maWxlID0gcERvYy0+TG9hZEljY1Byb2ZpbGUocFN0cmVhbSk7CiAgICAgaWYgKCFtX3BQcm9maWxlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX25Db21wb25lbnRzID0gbV9wUHJvZmlsZS0+R2V0Q29tcG9uZW50cygpOyAvL1RyeSB1c2luZyB0aGUgbkNvbXBvbmVudHMgZnJvbSBJQ0MgcHJvZmlsZQogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7CkBAIC02MTUsMTMgKzYxNSwxMyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAocEFsdGVyQ1MtPkNvdW50Q29tcG9uZW50cygpID4gMCkgeyAvLyBVc2UgQWx0ZXJuYXRpdmUgY29sb3JzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICAgbV9uQ29tcG9uZW50cyA9IHBBbHRlckNTLT5Db3VudENvbXBvbmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEFsdGVyQ1MgPSBwQWx0ZXJDUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYk93biA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2JPd24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBObyB2YWxpZCBhbHRlcm5hdGl2ZSBjb2xvcnNwYWNlCiAgICAgICAgICAgICAgICAgICAgICAgICBwQWx0ZXJDUy0+UmVsZWFzZUNTKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5EaWN0Q29tcG9uZW50cyA9IHBEaWN0ID8gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIk4iKSkgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5EaWN0Q29tcG9uZW50cyAhPSAxICYmIG5EaWN0Q29tcG9uZW50cyAhPSAzICYmIG5EaWN0Q29tcG9uZW50cyAhPSA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG1fbkNvbXBvbmVudHMgPSBuRGljdENvbXBvbmVudHM7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTYzMyw3ICs2MzMsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgbV9wQWx0ZXJDUyA9IHBBbHRlckNTOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9iT3duID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYk93biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC02NjEsMTUgKzY2MSwxNSBAQAogICAgICAgICAgICAgbV9wUmFuZ2VzW2ldID0gMDsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9JQ0NCYXNlZENTOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0Citib29sIENQREZfSUNDQmFzZWRDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAogewogICAgIGlmIChtX3BQcm9maWxlICYmIG1fcFByb2ZpbGUtPm1fYnNSR0IpIHsKICAgICAgICAgUiA9IHBCdWZbMF07CiAgICAgICAgIEcgPSBwQnVmWzFdOwogICAgICAgICBCID0gcEJ1ZlsyXTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBJQ29kZWNfSWNjTW9kdWxlICpwSWNjTW9kdWxlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRJY2NNb2R1bGUoKTsKICAgICBpZiAobV9wUHJvZmlsZS0+bV9wVHJhbnNmb3JtID09IE5VTEwgfHwgcEljY01vZHVsZSA9PSBOVUxMKSB7CkBAIC02NzgsNyArNjc4LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFIgPSBHID0gQiA9IDAuMGY7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBGWF9GTE9BVCByZ2JbM107CiAgICAgcEljY01vZHVsZS0+U2V0Q29tcG9uZW50cyhtX25Db21wb25lbnRzKTsKQEAgLTY4NiwzMSArNjg2LDMxIEBACiAgICAgUiA9IHJnYlswXTsKICAgICBHID0gcmdiWzFdOwogICAgIEIgPSByZ2JbMl07Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfSUNDQmFzZWRDUzo6dl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3QKK2Jvb2wgQ1BERl9JQ0NCYXNlZENTOjp2X0dldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBjLCBGWF9GTE9BVCYgbSwgRlhfRkxPQVQmIHksIEZYX0ZMT0FUJiBrKSBjb25zdAogewogICAgIGlmIChtX25Db21wb25lbnRzICE9IDQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGMgPSBwQnVmWzBdOwogICAgIG0gPSBwQnVmWzFdOwogICAgIHkgPSBwQnVmWzJdOwogICAgIGsgPSBwQnVmWzNdOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0lDQ0Jhc2VkQ1M6OlNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3QKK2Jvb2wgQ1BERl9JQ0NCYXNlZENTOjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLXZvaWQgQ1BERl9JQ0NCYXNlZENTOjpFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpCit2b2lkIENQREZfSUNDQmFzZWRDUzo6RW5hYmxlU3RkQ29udmVyc2lvbihib29sIGJFbmFibGVkKQogewogICAgIENQREZfQ29sb3JTcGFjZTo6RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7CiAgICAgaWYgKG1fcEFsdGVyQ1MpIHsKICAgICAgICAgbV9wQWx0ZXJDUy0+RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7CiAgICAgfQogfQotdm9pZCBDUERGX0lDQ0Jhc2VkQ1M6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0Cit2b2lkIENQREZfSUNDQmFzZWRDUzo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIGJvb2wgYlRyYW5zTWFzaykgY29uc3QKIHsKICAgICBpZiAobV9wUHJvZmlsZS0+bV9ic1JHQikgewogICAgICAgICBSZXZlcnNlUkdCKHBEZXN0QnVmLCBwU3JjQnVmLCBwaXhlbHMpOwpAQCAtNzY1LDEwICs3NjUsMTAgQEAKICAgICB9CiAgICAgfkNQREZfSW5kZXhlZENTKCkgb3ZlcnJpZGU7CiAKLSAgICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOwotICAgIEZYX0JPT0wJR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICAgIGJvb2wJR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKICAgICBDUERGX0NvbG9yU3BhY2UqIEdldEJhc2VDUygpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgRW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKSBvdmVycmlkZTsKKyAgICB2b2lkIEVuYWJsZVN0ZENvbnZlcnNpb24oYm9vbCBiRW5hYmxlZCkgb3ZlcnJpZGU7CiAKICAgICBDUERGX0NvbG9yU3BhY2UqIG1fcEJhc2VDUzsKICAgICBDUERGX0NvdW50ZWRDb2xvclNwYWNlKiBtX3BDb3VudGVkQmFzZUNTOwpAQCAtNzg3LDE5ICs3ODcsMTkgQEAKICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDUy0+R2V0QXJyYXkoKSk7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX0luZGV4ZWRDUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKK2Jvb2wgQ1BERl9JbmRleGVkQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCiB7CiAgICAgaWYgKHBBcnJheS0+R2V0Q291bnQoKSA8IDQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfT2JqZWN0KiBwQmFzZU9iaiA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKDEpOwogICAgIGlmIChwQmFzZU9iaiA9PSBtX3BBcnJheSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9Eb2NQYWdlRGF0YSogcERvY1BhZ2VEYXRhID0gcERvYy0+R2V0UGFnZURhdGEoKTsKICAgICBtX3BCYXNlQ1MgPSBwRG9jUGFnZURhdGEtPkdldENvbG9yU3BhY2UocEJhc2VPYmosIE5VTEwpOwogICAgIGlmIChtX3BCYXNlQ1MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9wQ291bnRlZEJhc2VDUyA9IHBEb2NQYWdlRGF0YS0+RmluZENvbG9yU3BhY2VQdHIobV9wQmFzZUNTLT5HZXRBcnJheSgpKTsKICAgICBtX25CYXNlQ29tcG9uZW50cyA9IG1fcEJhc2VDUy0+Q291bnRDb21wb25lbnRzKCk7CkBAIC04MTIsMjkgKzgxMiwyOSBAQAogICAgIG1fTWF4SW5kZXggPSBwQXJyYXktPkdldEludGVnZXIoMik7CiAgICAgQ1BERl9PYmplY3QqIHBUYWJsZU9iaiA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKDMpOwogICAgIGlmIChwVGFibGVPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBUYWJsZU9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKICAgICAgICAgbV9UYWJsZSA9ICgoQ1BERl9TdHJpbmcqKXBUYWJsZU9iaiktPkdldFN0cmluZygpOwogICAgIH0gZWxzZSBpZiAocFRhYmxlT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewogICAgICAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgICAgIGFjYy5Mb2FkQWxsRGF0YSgoQ1BERl9TdHJlYW0qKXBUYWJsZU9iaiwgRkFMU0UpOworICAgICAgICBhY2MuTG9hZEFsbERhdGEoKENQREZfU3RyZWFtKilwVGFibGVPYmosIGZhbHNlKTsKICAgICAgICAgbV9UYWJsZSA9IENGWF9CeXRlU3RyaW5nQyhhY2MuR2V0RGF0YSgpLCBhY2MuR2V0U2l6ZSgpKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ1BERl9JbmRleGVkQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKK2Jvb2wgQ1BERl9JbmRleGVkQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKIHsKICAgICBpbnQgaW5kZXggPSAoaW50MzJfdCkoKnBCdWYpOwogICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBtX01heEluZGV4KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9uQmFzZUNvbXBvbmVudHMpIHsKICAgICAgICAgaWYgKGluZGV4ID09IElOVF9NQVggfHwgKGluZGV4ICsgMSkgPiBJTlRfTUFYIC8gbV9uQmFzZUNvbXBvbmVudHMgfHwKICAgICAgICAgICAgICAgICAoaW5kZXggKyAxKSptX25CYXNlQ29tcG9uZW50cyA+IChpbnQpbV9UYWJsZS5HZXRMZW5ndGgoKSkgewogICAgICAgICAgICAgUiA9IEcgPSBCID0gMDsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gQ29tcHMobV9uQmFzZUNvbXBvbmVudHMpOwpAQCAtODQ0LDEzICs4NDQsMTMgQEAKICAgICAgICAgY29tcHNbaV0gPSBtX3BDb21wTWluTWF4W2kgKiAyXSArIG1fcENvbXBNaW5NYXhbaSAqIDIgKyAxXSAqIHBUYWJsZVtpbmRleCAqIG1fbkJhc2VDb21wb25lbnRzICsgaV0gLyAyNTU7CiAgICAgfQogICAgIG1fcEJhc2VDUy0+R2V0UkdCKGNvbXBzLCBSLCBHLCBCKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIENQREZfQ29sb3JTcGFjZSpDUERGX0luZGV4ZWRDUzo6R2V0QmFzZUNTKCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9wQmFzZUNTOwogfQotdm9pZCBDUERGX0luZGV4ZWRDUzo6RW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKQordm9pZCBDUERGX0luZGV4ZWRDUzo6RW5hYmxlU3RkQ29udmVyc2lvbihib29sIGJFbmFibGVkKQogewogICAgIENQREZfQ29sb3JTcGFjZTo6RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7CiAgICAgaWYgKG1fcEJhc2VDUykgewpAQCAtODcxLDM5ICs4NzEsMzkgQEAKIAkgICAgbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDUy0+R2V0QXJyYXkoKSk7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX1BhdHRlcm5DUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKK2Jvb2wgQ1BERl9QYXR0ZXJuQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCiB7CiAgICAgQ1BERl9PYmplY3QqIHBCYXNlQ1MgPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgxKTsKICAgICBpZiAocEJhc2VDUyA9PSBtX3BBcnJheSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9Eb2NQYWdlRGF0YSogcERvY1BhZ2VEYXRhID0gcERvYy0+R2V0UGFnZURhdGEoKTsKICAgICBtX3BCYXNlQ1MgPSBwRG9jUGFnZURhdGEtPkdldENvbG9yU3BhY2UocEJhc2VDUywgTlVMTCk7CiAgICAgaWYgKG1fcEJhc2VDUykgewogICAgICAgICBpZiAobV9wQmFzZUNTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19QQVRURVJOKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbV9wQ291bnRlZEJhc2VDUyA9IHBEb2NQYWdlRGF0YS0+RmluZENvbG9yU3BhY2VQdHIobV9wQmFzZUNTLT5HZXRBcnJheSgpKTsKICAgICAgICAgbV9uQ29tcG9uZW50cyA9IG1fcEJhc2VDUy0+Q291bnRDb21wb25lbnRzKCkgKyAxOwogICAgICAgICBpZiAobV9wQmFzZUNTLT5Db3VudENvbXBvbmVudHMoKSA+IE1BWF9QQVRURVJOX0NPTE9SQ09NUFMpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIG1fbkNvbXBvbmVudHMgPSAxOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9QYXR0ZXJuQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKK2Jvb2wgQ1BERl9QYXR0ZXJuQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKIHsKICAgICBpZiAobV9wQmFzZUNTKSB7CiAgICAgICAgIEFTU0VSVChtX3BCYXNlQ1MtPkdldEZhbWlseSgpICE9IFBERkNTX1BBVFRFUk4pOwogICAgICAgICBQYXR0ZXJuVmFsdWUqIHB2YWx1ZSA9IChQYXR0ZXJuVmFsdWUqKXBCdWY7CiAgICAgICAgIGlmIChtX3BCYXNlQ1MtPkdldFJHQihwdmFsdWUtPm1fQ29tcHMsIFIsIEcsIEIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIFIgPSBHID0gQiA9IDAuNzVmOwotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBDUERGX0NvbG9yU3BhY2UqIENQREZfUGF0dGVybkNTOjpHZXRCYXNlQ1MoKSBjb25zdAogewpAQCAtOTE5LDkgKzkxOSw5IEBACiAgICAgfQogICAgIH5DUERGX1NlcGFyYXRpb25DUygpIG92ZXJyaWRlOwogICAgIHZvaWQgR2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LCBGWF9GTE9BVCYgdmFsdWUsIEZYX0ZMT0FUJiBtaW4sIEZYX0ZMT0FUJiBtYXgpIGNvbnN0IG92ZXJyaWRlOwotICAgIEZYX0JPT0wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgRW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKSBvdmVycmlkZTsKKyAgICBib29sIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICAgIGJvb2wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIEVuYWJsZVN0ZENvbnZlcnNpb24oYm9vbCBiRW5hYmxlZCkgb3ZlcnJpZGU7CiAKICAgICBDUERGX0NvbG9yU3BhY2UqIG1fcEFsdENTOwogICAgIENQREZfRnVuY3Rpb24qIG1fcEZ1bmM7CkBAIC05NDAsNyArOTQwLDcgQEAKICAgICBtaW4gPSAwOwogICAgIG1heCA9IDEuMGY7CiB9Ci1GWF9CT09MIENQREZfU2VwYXJhdGlvbkNTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQorYm9vbCBDUERGX1NlcGFyYXRpb25DUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKIHsKICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gcEFycmF5LT5HZXRTdHJpbmcoMSk7CiAgICAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIk5vbmUiKSkgewpAQCAtOTQ5LDExICs5NDksMTEgQEAKICAgICAgICAgbV9UeXBlID0gQ29sb3JhbnQ7CiAgICAgICAgIENQREZfT2JqZWN0KiBwQWx0Q1MgPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgyKTsKICAgICAgICAgaWYgKHBBbHRDUyA9PSBtX3BBcnJheSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIG1fcEFsdENTID0gTG9hZChwRG9jLCBwQWx0Q1MpOwogICAgICAgICBpZiAoIW1fcEFsdENTKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgQ1BERl9PYmplY3QqIHBGdW5jT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMyk7CiAgICAgICAgIGlmIChwRnVuY09iaiAmJiBwRnVuY09iai0+R2V0VHlwZSgpICE9IFBERk9CSl9OQU1FKSB7CkBAIC05NjQsMTYgKzk2NCwxNiBAQAogICAgICAgICAgICAgbV9wRnVuYyA9IE5VTEw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfU2VwYXJhdGlvbkNTOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0Citib29sIENQREZfU2VwYXJhdGlvbkNTOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0CiB7CiAgICAgaWYgKG1fVHlwZSA9PSBOb25lKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9wRnVuYyA9PSBOVUxMKSB7CiAgICAgICAgIGlmIChtX3BBbHRDUyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaW50IG5Db21wcyA9IG1fcEFsdENTLT5Db3VudENvbXBvbmVudHMoKTsKICAgICAgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IHJlc3VsdHMobkNvbXBzKTsKQEAgLTk4MSwyMiArOTgxLDIyIEBACiAgICAgICAgICAgICByZXN1bHRzW2ldID0gKnBCdWY7CiAgICAgICAgIH0KICAgICAgICAgbV9wQWx0Q1MtPkdldFJHQihyZXN1bHRzLCBSLCBHLCBCKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gcmVzdWx0cyhtX3BGdW5jLT5Db3VudE91dHB1dHMoKSk7CiAgICAgaW50IG5yZXN1bHRzID0gMDsKICAgICBtX3BGdW5jLT5DYWxsKHBCdWYsIDEsIHJlc3VsdHMsIG5yZXN1bHRzKTsKICAgICBpZiAobnJlc3VsdHMgPT0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fcEFsdENTKSB7CiAgICAgICAgIG1fcEFsdENTLT5HZXRSR0IocmVzdWx0cywgUiwgRywgQik7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgUiA9IEcgPSBCID0gMDsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotdm9pZCBDUERGX1NlcGFyYXRpb25DUzo6RW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKQordm9pZCBDUERGX1NlcGFyYXRpb25DUzo6RW5hYmxlU3RkQ29udmVyc2lvbihib29sIGJFbmFibGVkKQogewogICAgIENQREZfQ29sb3JTcGFjZTo6RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7CiAgICAgaWYgKG1fcEFsdENTKSB7CkBAIC0xMDEzLDkgKzEwMTMsOSBAQAogICAgIH0KICAgICB+Q1BERl9EZXZpY2VOQ1MoKSBvdmVycmlkZTsKICAgICB2b2lkIEdldERlZmF1bHRWYWx1ZShpbnQgaUNvbXBvbmVudCwgRlhfRkxPQVQmIHZhbHVlLCBGWF9GTE9BVCYgbWluLCBGWF9GTE9BVCYgbWF4KSBjb25zdCBvdmVycmlkZTsKLSAgICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOwotICAgIEZYX0JPT0wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIEVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCkgb3ZlcnJpZGU7CisgICAgYm9vbCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKKyAgICBib29sIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBFbmFibGVTdGRDb252ZXJzaW9uKGJvb2wgYkVuYWJsZWQpIG92ZXJyaWRlOwogCiAgICAgQ1BERl9Db2xvclNwYWNlKiBtX3BBbHRDUzsKICAgICBDUERGX0Z1bmN0aW9uKiBtX3BGdW5jOwpAQCAtMTAzMyw0NSArMTAzMyw0NSBAQAogICAgIG1pbiA9IDA7CiAgICAgbWF4ID0gMS4wZjsKIH0KLUZYX0JPT0wgQ1BERl9EZXZpY2VOQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCitib29sIENQREZfRGV2aWNlTkNTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQogewogICAgIENQREZfT2JqZWN0KiBwT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMSk7CiAgICAgaWYgKCFwT2JqKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAocE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9uQ29tcG9uZW50cyA9ICgoQ1BERl9BcnJheSopcE9iaiktPkdldENvdW50KCk7CiAgICAgQ1BERl9PYmplY3QqIHBBbHRDUyA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKDIpOwogICAgIGlmICghcEFsdENTIHx8IHBBbHRDUyA9PSBtX3BBcnJheSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9wQWx0Q1MgPSBMb2FkKHBEb2MsIHBBbHRDUyk7CiAgICAgbV9wRnVuYyA9IENQREZfRnVuY3Rpb246OkxvYWQocEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMykpOwogICAgIGlmIChtX3BBbHRDUyA9PSBOVUxMIHx8IG1fcEZ1bmMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fcEZ1bmMtPkNvdW50T3V0cHV0cygpIDwgbV9wQWx0Q1MtPkNvdW50Q29tcG9uZW50cygpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9EZXZpY2VOQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKK2Jvb2wgQ1BERl9EZXZpY2VOQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKIHsKICAgICBpZiAobV9wRnVuYyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gcmVzdWx0cyhtX3BGdW5jLT5Db3VudE91dHB1dHMoKSk7CiAgICAgaW50IG5yZXN1bHRzID0gMDsKICAgICBtX3BGdW5jLT5DYWxsKHBCdWYsIG1fbkNvbXBvbmVudHMsIHJlc3VsdHMsIG5yZXN1bHRzKTsKICAgICBpZiAobnJlc3VsdHMgPT0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9wQWx0Q1MtPkdldFJHQihyZXN1bHRzLCBSLCBHLCBCKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLXZvaWQgQ1BERl9EZXZpY2VOQ1M6OkVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCkKK3ZvaWQgQ1BERl9EZXZpY2VOQ1M6OkVuYWJsZVN0ZENvbnZlcnNpb24oYm9vbCBiRW5hYmxlZCkKIHsKICAgICBDUERGX0NvbG9yU3BhY2U6OkVuYWJsZVN0ZENvbnZlcnNpb24oYkVuYWJsZWQpOwogICAgIGlmIChtX3BBbHRDUykgewpAQCAtMTE5NywzMyArMTE5NywzMyBAQAogICAgIHVpbnQ4X3QqIHBCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKICAgICByZXR1cm4gKEZYX0ZMT0FUKilwQnVmOwogfQotRlhfQk9PTCBDUERGX0NvbG9yU3BhY2U6OnNSR0IoKSBjb25zdAorYm9vbCBDUERGX0NvbG9yU3BhY2U6OnNSR0IoKSBjb25zdAogewogICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VSR0IpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAobV9GYW1pbHkgIT0gUERGQ1NfSUNDQkFTRUQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfSUNDQmFzZWRDUyogcENTID0gKENQREZfSUNDQmFzZWRDUyopdGhpczsKICAgICByZXR1cm4gcENTLT5tX3BQcm9maWxlLT5tX2JzUkdCOwogfQotRlhfQk9PTCBDUERGX0NvbG9yU3BhY2U6OkdldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBjLCBGWF9GTE9BVCYgbSwgRlhfRkxPQVQmIHksIEZYX0ZMT0FUJiBrKSBjb25zdAorYm9vbCBDUERGX0NvbG9yU3BhY2U6OkdldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBjLCBGWF9GTE9BVCYgbSwgRlhfRkxPQVQmIHksIEZYX0ZMT0FUJiBrKSBjb25zdAogewogICAgIGlmICh2X0dldENNWUsocEJ1ZiwgYywgbSwgeSwgaykpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBGWF9GTE9BVCBSLCBHLCBCOwogICAgIGlmICghR2V0UkdCKHBCdWYsIFIsIEcsIEIpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBzUkdCX3RvX0Fkb2JlQ01ZSyhSLCBHLCBCLCBjLCBtLCB5LCBrKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9Db2xvclNwYWNlOjpTZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBtLCBGWF9GTE9BVCB5LCBGWF9GTE9BVCBrKSBjb25zdAorYm9vbCBDUERGX0NvbG9yU3BhY2U6OlNldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIG0sIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIGspIGNvbnN0CiB7CiAgICAgaWYgKHZfU2V0Q01ZSyhwQnVmLCBjLCBtLCB5LCBrKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIEZYX0ZMT0FUIFIsIEcsIEI7CiAgICAgQWRvYmVDTVlLX3RvX3NSR0IoYywgbSwgeSwgaywgUiwgRywgQik7CkBAIC0xMjQ3LDcgKzEyNDcsNyBAQAogICAgIENQREZfSW5kZXhlZENTKiBwQ1MgPSAoQ1BERl9JbmRleGVkQ1MqKXRoaXM7CiAgICAgcmV0dXJuIHBDUy0+bV9NYXhJbmRleDsKIH0KLXZvaWQgQ1BERl9Db2xvclNwYWNlOjpUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogZGVzdF9idWYsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBwaXhlbHMsIGludCBpbWFnZV93aWR0aCwgaW50IGltYWdlX2hlaWdodCwgRlhfQk9PTCBiVHJhbnNNYXNrKSBjb25zdAordm9pZCBDUERGX0NvbG9yU3BhY2U6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBkZXN0X2J1ZiwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBib29sIGJUcmFuc01hc2spIGNvbnN0CiB7CiAgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IHNyY2J1ZihtX25Db21wb25lbnRzKTsKICAgICBGWF9GTE9BVCogc3JjID0gc3JjYnVmOwpAQCAtMTI2NSw3ICsxMjY1LDcgQEAKICAgICAgICAgKmRlc3RfYnVmICsrID0gKGludDMyX3QpKFIgKiAyNTUpOwogICAgIH0KIH0KLXZvaWQgQ1BERl9Db2xvclNwYWNlOjpFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpCit2b2lkIENQREZfQ29sb3JTcGFjZTo6RW5hYmxlU3RkQ29udmVyc2lvbihib29sIGJFbmFibGVkKQogewogICAgIGlmIChiRW5hYmxlZCkgewogICAgICAgICBtX2R3U3RkQ29udmVyc2lvbiArKzsKQEAgLTEzOTcsMjMgKzEzOTcsMjMgQEAKICAgICBpZiAobV9wQ1MtPkdldEZhbWlseSgpID09IFBERkNTX1BBVFRFUk4pIHsKICAgICAgICAgUGF0dGVyblZhbHVlKiBwdmFsdWUgPSAoUGF0dGVyblZhbHVlKiltX3BCdWZmZXI7CiAgICAgICAgIGlmIChwdmFsdWUtPm1fcFBhdHRlcm4gJiYgcHZhbHVlLT5tX3BQYXR0ZXJuLT5tX3BEb2N1bWVudCkgewotICAgICAgICAgICAgcHZhbHVlLT5tX3BQYXR0ZXJuID0gcHZhbHVlLT5tX3BQYXR0ZXJuLT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0UGF0dGVybihwdmFsdWUtPm1fcFBhdHRlcm4tPm1fcFBhdHRlcm5PYmosIEZBTFNFLCAmcHZhbHVlLT5tX3BQYXR0ZXJuLT5tX1BhcmVudE1hdHJpeCk7CisgICAgICAgICAgICBwdmFsdWUtPm1fcFBhdHRlcm4gPSBwdmFsdWUtPm1fcFBhdHRlcm4tPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5HZXRQYXR0ZXJuKHB2YWx1ZS0+bV9wUGF0dGVybi0+bV9wUGF0dGVybk9iaiwgZmFsc2UsICZwdmFsdWUtPm1fcFBhdHRlcm4tPm1fUGFyZW50TWF0cml4KTsKICAgICAgICAgfQogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9Db2xvcjo6R2V0UkdCKGludCYgUiwgaW50JiBHLCBpbnQmIEIpIGNvbnN0Citib29sIENQREZfQ29sb3I6OkdldFJHQihpbnQmIFIsIGludCYgRywgaW50JiBCKSBjb25zdAogewogICAgIGlmIChtX3BDUyA9PSBOVUxMIHx8IG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWF9GTE9BVCByPTAuMGYsIGc9MC4wZiwgYj0wLjBmOwogICAgIGlmICghbV9wQ1MtPkdldFJHQihtX3BCdWZmZXIsIHIsIGcsIGIpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBSID0gKGludDMyX3QpKHIgKiAyNTUgKyAwLjVmKTsKICAgICBHID0gKGludDMyX3QpKGcgKiAyNTUgKyAwLjVmKTsKICAgICBCID0gKGludDMyX3QpKGIgKiAyNTUgKyAwLjVmKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIENQREZfUGF0dGVybiogQ1BERl9Db2xvcjo6R2V0UGF0dGVybigpIGNvbnN0CiB7CkBAIC0xNDM4LDEwICsxNDM4LDEwIEBACiAgICAgUGF0dGVyblZhbHVlKiBwdmFsdWUgPSAoUGF0dGVyblZhbHVlKiltX3BCdWZmZXI7CiAgICAgcmV0dXJuIHB2YWx1ZS0+bV9uQ29tcHMgPyBwdmFsdWUtPm1fQ29tcHMgOiBOVUxMOwogfQotRlhfQk9PTCBDUERGX0NvbG9yOjpJc0VxdWFsKGNvbnN0IENQREZfQ29sb3ImIG90aGVyKSBjb25zdAorYm9vbCBDUERGX0NvbG9yOjpJc0VxdWFsKGNvbnN0IENQREZfQ29sb3ImIG90aGVyKSBjb25zdAogewogICAgIGlmIChtX3BDUyAhPSBvdGhlci5tX3BDUyB8fCBtX3BDUyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gRlhTWVNfbWVtY21wKG1fcEJ1ZmZlciwgb3RoZXIubV9wQnVmZmVyLCBtX3BDUy0+R2V0QnVmU2l6ZSgpKSA9PSAwOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2RvYy5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZG9jLmNwcAppbmRleCAwNTIzM2ExLi41Njg4NjNhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZG9jLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZG9jLmNwcApAQCAtNzgsNyArNzgsNyBAQAogfQogdm9pZCBDUERGX1BhZ2VNb2R1bGU6OkNsZWFyRG9jKENQREZfRG9jdW1lbnQqIHBEb2MpCiB7Ci0gICAgcERvYy0+R2V0UGFnZURhdGEoKS0+Q2xlYXIoRkFMU0UpOworICAgIHBEb2MtPkdldFBhZ2VEYXRhKCktPkNsZWFyKGZhbHNlKTsKIH0KIHZvaWQgQ1BERl9QYWdlTW9kdWxlOjpOb3RpZnlDSktBdmFpbGFibGUoKQogewpAQCAtODgsNyArODgsNyBAQAogQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpMb2FkRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCkKIHsKICAgICBBU1NFUlQocEZvbnREaWN0KTsKLSAgICByZXR1cm4gR2V0VmFsaWRhdGVQYWdlRGF0YSgpLT5HZXRGb250KHBGb250RGljdCwgRkFMU0UpOworICAgIHJldHVybiBHZXRWYWxpZGF0ZVBhZ2VEYXRhKCktPkdldEZvbnQocEZvbnREaWN0LCBmYWxzZSk7CiB9CiAKIENQREZfU3RyZWFtQWNjKiBDUERGX0RvY3VtZW50OjpMb2FkRm9udEZpbGUoQ1BERl9TdHJlYW0qIHBTdHJlYW0pCkBAIC0xMDEsNyArMTAxLDcgQEAKIHsKICAgICByZXR1cm4gR2V0VmFsaWRhdGVQYWdlRGF0YSgpLT5HZXRDb2xvclNwYWNlKHBDU09iaiwgcFJlc291cmNlcyk7CiB9Ci1DUERGX1BhdHRlcm4qIENQREZfRG9jdW1lbnQ6OkxvYWRQYXR0ZXJuKENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwgRlhfQk9PTCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogbWF0cml4KQorQ1BERl9QYXR0ZXJuKiBDUERGX0RvY3VtZW50OjpMb2FkUGF0dGVybihDUERGX09iamVjdCogcFBhdHRlcm5PYmosIGJvb2wgYlNoYWRpbmcsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCkKIHsKICAgICByZXR1cm4gR2V0VmFsaWRhdGVQYWdlRGF0YSgpLT5HZXRQYXR0ZXJuKHBQYXR0ZXJuT2JqLCBiU2hhZGluZywgbWF0cml4KTsKIH0KQEAgLTEyNiwxNCArMTI2LDE0IEBACiB9CiBDUERGX0RvY1BhZ2VEYXRhOjpDUERGX0RvY1BhZ2VEYXRhKENQREZfRG9jdW1lbnQqIHBQREZEb2MpCiAgICAgOiBtX3BQREZEb2MocFBERkRvYyksCi0gICAgICBtX2JGb3JjZUNsZWFyKEZBTFNFKQorICAgICAgbV9iRm9yY2VDbGVhcihmYWxzZSkKIHsKIH0KIAogQ1BERl9Eb2NQYWdlRGF0YTo6fkNQREZfRG9jUGFnZURhdGEoKQogewotICAgIENsZWFyKEZBTFNFKTsKLSAgICBDbGVhcihUUlVFKTsKKyAgICBDbGVhcihmYWxzZSk7CisgICAgQ2xlYXIodHJ1ZSk7CiAKICAgICBmb3IgKGF1dG8mIGl0IDogbV9QYXR0ZXJuTWFwKQogICAgICAgICBkZWxldGUgaXQuc2Vjb25kOwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAgICAgbV9Db2xvclNwYWNlTWFwLmNsZWFyKCk7CiB9CiAKLXZvaWQgQ1BERl9Eb2NQYWdlRGF0YTo6Q2xlYXIoRlhfQk9PTCBiRm9yY2VSZWxlYXNlKQordm9pZCBDUERGX0RvY1BhZ2VEYXRhOjpDbGVhcihib29sIGJGb3JjZVJlbGVhc2UpCiB7CiAgICAgbV9iRm9yY2VDbGVhciA9IGJGb3JjZVJlbGVhc2U7CiAKQEAgLTIzNSw3ICsyMzUsNyBAQAogICAgIH0KIH0KIAotQ1BERl9Gb250KiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRGb250KENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0LCBGWF9CT09MIGZpbmRPbmx5KQorQ1BERl9Gb250KiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRGb250KENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0LCBib29sIGZpbmRPbmx5KQogewogICAgIGlmICghcEZvbnREaWN0KSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNDMyLDcgKzQzMiw3IEBACiAgICAgfQogfQogCi1DUERGX1BhdHRlcm4qIENQREZfRG9jUGFnZURhdGE6OkdldFBhdHRlcm4oQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLCBGWF9CT09MIGJTaGFkaW5nLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBtYXRyaXgpCitDUERGX1BhdHRlcm4qIENQREZfRG9jUGFnZURhdGE6OkdldFBhdHRlcm4oQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLCBib29sIGJTaGFkaW5nLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBtYXRyaXgpCiB7CiAgICAgaWYgKCFwUGF0dGVybk9iaikKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC00NTUsNyArNDU1LDcgQEAKICAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHsKICAgICAgICAgICAgICAgICBwUGF0dGVybiA9IG5ldyBDUERGX1RpbGluZ1BhdHRlcm4obV9wUERGRG9jLCBwUGF0dGVybk9iaiwgbWF0cml4KTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgcFBhdHRlcm4gPSBuZXcgQ1BERl9TaGFkaW5nUGF0dGVybihtX3BQREZEb2MsIHBQYXR0ZXJuT2JqLCBGQUxTRSwgbWF0cml4KTsKKyAgICAgICAgICAgICAgICBwUGF0dGVybiA9IG5ldyBDUERGX1NoYWRpbmdQYXR0ZXJuKG1fcFBERkRvYywgcFBhdHRlcm5PYmosIGZhbHNlLCBtYXRyaXgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNTAxLDcgKzUwMSw3IEBACiAgICAgfQogCiAgICAgQ1BERl9JbWFnZSogcEltYWdlID0gbmV3IENQREZfSW1hZ2UobV9wUERGRG9jKTsKLSAgICBwSW1hZ2UtPkxvYWRJbWFnZUYoKENQREZfU3RyZWFtKilwSW1hZ2VTdHJlYW0sIEZBTFNFKTsKKyAgICBwSW1hZ2UtPkxvYWRJbWFnZUYoKENQREZfU3RyZWFtKilwSW1hZ2VTdHJlYW0sIGZhbHNlKTsKIAogICAgIENQREZfQ291bnRlZEltYWdlKiBpbWFnZURhdGEgPSBuZXcgQ1BERl9Db3VudGVkSW1hZ2UocEltYWdlKTsKICAgICBtX0ltYWdlTWFwW2R3SW1hZ2VPYmpOdW1dID0gaW1hZ2VEYXRhOwpAQCAtNTQwLDcgKzU0MCw3IEBACiAgICAgfQogCiAgICAgQ1BERl9TdHJlYW1BY2Mgc3RyZWFtOwotICAgIHN0cmVhbS5Mb2FkQWxsRGF0YShwSWNjUHJvZmlsZVN0cmVhbSwgRkFMU0UpOworICAgIHN0cmVhbS5Mb2FkQWxsRGF0YShwSWNjUHJvZmlsZVN0cmVhbSwgZmFsc2UpOwogICAgIHVpbnQ4X3QgZGlnZXN0WzIwXTsKICAgICBDUERGX1N0cmVhbSogcENvcGllZFN0cmVhbSA9IG51bGxwdHI7CiAgICAgQ1JZUFRfU0hBMUdlbmVyYXRlKHN0cmVhbS5HZXREYXRhKCksIHN0cmVhbS5HZXRTaXplKCksIGRpZ2VzdCk7CkBAIC01OTAsMTQgKzU5MCwxNCBAQAogICAgICAgICBvcmdfc2l6ZSA9IDA7CiAKICAgICBDUERGX1N0cmVhbUFjYyogcEZvbnRGaWxlID0gbmV3IENQREZfU3RyZWFtQWNjOwotICAgIHBGb250RmlsZS0+TG9hZEFsbERhdGEocEZvbnRTdHJlYW0sIEZBTFNFLCBvcmdfc2l6ZSk7CisgICAgcEZvbnRGaWxlLT5Mb2FkQWxsRGF0YShwRm9udFN0cmVhbSwgZmFsc2UsIG9yZ19zaXplKTsKIAogICAgIENQREZfQ291bnRlZFN0cmVhbUFjYyogZnREYXRhID0gbmV3IENQREZfQ291bnRlZFN0cmVhbUFjYyhwRm9udEZpbGUpOwogICAgIG1fRm9udEZpbGVNYXBbcEZvbnRTdHJlYW1dID0gZnREYXRhOwogICAgIHJldHVybiBmdERhdGEtPkFkZFJlZigpOwogfQogCi12b2lkIENQREZfRG9jUGFnZURhdGE6OlJlbGVhc2VGb250RmlsZVN0cmVhbUFjYyhDUERGX1N0cmVhbSogcEZvbnRTdHJlYW0sIEZYX0JPT0wgYkZvcmNlKQordm9pZCBDUERGX0RvY1BhZ2VEYXRhOjpSZWxlYXNlRm9udEZpbGVTdHJlYW1BY2MoQ1BERl9TdHJlYW0qIHBGb250U3RyZWFtLCBib29sIGJGb3JjZSkKIHsKICAgICBpZiAoIXBGb250U3RyZWFtKQogICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZnVuYy5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZnVuYy5jcHAKaW5kZXggYzk2MWY4Yi4uYTkyMjE5ZCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2Z1bmMuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9mdW5jLmNwcApAQCAtMjUsOCArMjUsOCBAQAogewogcHVibGljOgogICAgIH5DUERGX1BTUHJvYygpOwotICAgIEZYX0JPT0wJUGFyc2UoQ1BERl9TaW1wbGVQYXJzZXImIHBhcnNlcik7Ci0gICAgRlhfQk9PTAlFeGVjdXRlKENQREZfUFNFbmdpbmUqIHBFbmdpbmUpOworICAgIGJvb2wJUGFyc2UoQ1BERl9TaW1wbGVQYXJzZXImIHBhcnNlcik7CisgICAgYm9vbAlFeGVjdXRlKENQREZfUFNFbmdpbmUqIHBFbmdpbmUpOwogICAgIENGWF9QdHJBcnJheQkJbV9PcGVyYXRvcnM7CiB9OwogI2RlZmluZSBQU0VOR0lORV9TVEFDS1NJWkUgMTAwCkBAIC0zNSwxMiArMzUsMTIgQEAKIHB1YmxpYzoKICAgICBDUERGX1BTRW5naW5lKCk7CiAgICAgfkNQREZfUFNFbmdpbmUoKTsKLSAgICBGWF9CT09MCVBhcnNlKGNvbnN0IEZYX0NIQVIqIHN0cmluZywgaW50IHNpemUpOwotICAgIEZYX0JPT0wJRXhlY3V0ZSgpCisgICAgYm9vbAlQYXJzZShjb25zdCBGWF9DSEFSKiBzdHJpbmcsIGludCBzaXplKTsKKyAgICBib29sCUV4ZWN1dGUoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fTWFpblByb2MuRXhlY3V0ZSh0aGlzKTsKICAgICB9Ci0gICAgRlhfQk9PTAlEb09wZXJhdG9yKFBERl9QU09QIG9wKTsKKyAgICBib29sCURvT3BlcmF0b3IoUERGX1BTT1Agb3ApOwogICAgIHZvaWQJUmVzZXQoKQogICAgIHsKICAgICAgICAgbV9TdGFja0NvdW50ID0gMDsKQEAgLTczLDcgKzczLDcgQEAKICAgICAgICAgfQogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9QU1Byb2M6OkV4ZWN1dGUoQ1BERl9QU0VuZ2luZSogcEVuZ2luZSkKK2Jvb2wgQ1BERl9QU1Byb2M6OkV4ZWN1dGUoQ1BERl9QU0VuZ2luZSogcEVuZ2luZSkKIHsKICAgICBpbnQgc2l6ZSA9IG1fT3BlcmF0b3JzLkdldFNpemUoKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkgKyspIHsKQEAgLTg1LDcgKzg1LDcgQEAKICAgICAgICAgICAgIGkgKys7CiAgICAgICAgIH0gZWxzZSBpZiAob3AgPT0gUFNPUF9JRikgewogICAgICAgICAgICAgaWYgKGkgPCAyIHx8IG1fT3BlcmF0b3JzW2kgLSAyXSAhPSAodm9pZCopUFNPUF9QUk9DKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICgoaW50KXBFbmdpbmUtPlBvcCgpKSB7CiAgICAgICAgICAgICAgICAgKChDUERGX1BTUHJvYyopbV9PcGVyYXRvcnNbaSAtIDFdKS0+RXhlY3V0ZShwRW5naW5lKTsKQEAgLTkzLDcgKzkzLDcgQEAKICAgICAgICAgfSBlbHNlIGlmIChvcCA9PSBQU09QX0lGRUxTRSkgewogICAgICAgICAgICAgaWYgKGkgPCA0IHx8IG1fT3BlcmF0b3JzW2kgLSAyXSAhPSAodm9pZCopUFNPUF9QUk9DIHx8CiAgICAgICAgICAgICAgICAgICAgIG1fT3BlcmF0b3JzW2kgLSA0XSAhPSAodm9pZCopUFNPUF9QUk9DKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICgoaW50KXBFbmdpbmUtPlBvcCgpKSB7CiAgICAgICAgICAgICAgICAgKChDUERGX1BTUHJvYyopbV9PcGVyYXRvcnNbaSAtIDNdKS0+RXhlY3V0ZShwRW5naW5lKTsKQEAgLTEwNCw3ICsxMDQsNyBAQAogICAgICAgICAgICAgcEVuZ2luZS0+RG9PcGVyYXRvcihvcCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBDUERGX1BTRW5naW5lOjpDUERGX1BTRW5naW5lKCkKIHsKQEAgLTE0NSwzMSArMTQ1LDMxIEBACiAgICAgeyJjb3B5IiwgUFNPUF9DT1BZfSwgeyJpbmRleCIsIFBTT1BfSU5ERVh9LCB7InJvbGwiLCBQU09QX1JPTEx9LAogICAgIHtOVUxMLCBQU09QX1BST0N9CiB9OwotRlhfQk9PTCBDUERGX1BTRW5naW5lOjpQYXJzZShjb25zdCBGWF9DSEFSKiBzdHJpbmcsIGludCBzaXplKQorYm9vbCBDUERGX1BTRW5naW5lOjpQYXJzZShjb25zdCBGWF9DSEFSKiBzdHJpbmcsIGludCBzaXplKQogewogICAgIENQREZfU2ltcGxlUGFyc2VyIHBhcnNlcigodWludDhfdCopc3RyaW5nLCBzaXplKTsKICAgICBDRlhfQnl0ZVN0cmluZ0Mgd29yZCA9IHBhcnNlci5HZXRXb3JkKCk7CiAgICAgaWYgKHdvcmQgIT0gRlhfQlNUUkMoInsiKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIG1fTWFpblByb2MuUGFyc2UocGFyc2VyKTsKIH0KLUZYX0JPT0wgQ1BERl9QU1Byb2M6OlBhcnNlKENQREZfU2ltcGxlUGFyc2VyJiBwYXJzZXIpCitib29sIENQREZfUFNQcm9jOjpQYXJzZShDUERGX1NpbXBsZVBhcnNlciYgcGFyc2VyKQogewogICAgIHdoaWxlICgxKSB7CiAgICAgICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKICAgICAgICAgaWYgKHdvcmQuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIn0iKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAod29yZCA9PSBGWF9CU1RSQygieyIpKSB7CiAgICAgICAgICAgICBDUERGX1BTUHJvYyogcFByb2MgPSBuZXcgQ1BERl9QU1Byb2M7CiAgICAgICAgICAgICBtX09wZXJhdG9ycy5BZGQoKHZvaWQqKVBTT1BfUFJPQyk7CiAgICAgICAgICAgICBtX09wZXJhdG9ycy5BZGQocFByb2MpOwogICAgICAgICAgICAgaWYgKCFwUHJvYy0+UGFyc2UocGFyc2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpbnQgaSA9IDA7CkBAIC0xOTAsNyArMTkwLDcgQEAKICAgICB9CiB9CiAjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NWYKLUZYX0JPT0wgQ1BERl9QU0VuZ2luZTo6RG9PcGVyYXRvcihQREZfUFNPUCBvcCkKK2Jvb2wgQ1BERl9QU0VuZ2luZTo6RG9PcGVyYXRvcihQREZfUFNPUCBvcCkKIHsKICAgICBpbnQgaTEsIGkyOwogICAgIEZYX0ZMT0FUIGQxLCBkMjsKQEAgLTQxOCw3ICs0MTgsNyBAQAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogc3RhdGljIEZYX0ZMT0FUIFBERl9JbnRlcnBvbGF0ZShGWF9GTE9BVCB4LCBGWF9GTE9BVCB4bWluLCBGWF9GTE9BVCB4bWF4LCBGWF9GTE9BVCB5bWluLCBGWF9GTE9BVCB5bWF4KQogewpAQCAtNDQ1LDggKzQ0NSw4IEBACiBwdWJsaWM6CiAgICAgQ1BERl9TYW1wbGVkRnVuYygpOwogICAgIHZpcnR1YWwgfkNQREZfU2FtcGxlZEZ1bmMoKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfSW5pdChDUERGX09iamVjdCogcE9iaik7Ci0gICAgdmlydHVhbCBGWF9CT09MCQl2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbAkJdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKTsKKyAgICB2aXJ0dWFsIGJvb2wJCXZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Q7CiAgICAgU2FtcGxlRW5jb2RlSW5mbyoJbV9wRW5jb2RlSW5mbzsKICAgICBTYW1wbGVEZWNvZGVJbmZvKgltX3BEZWNvZGVJbmZvOwogICAgIEZYX0RXT1JECW1fbkJpdHNQZXJTYW1wbGU7CkBAIC00NjksMTAgKzQ2OSwxMCBAQAogICAgICAgICBGWF9GcmVlKG1fcERlY29kZUluZm8pOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9TYW1wbGVkRnVuYzo6dl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKQorYm9vbCBDUERGX1NhbXBsZWRGdW5jOjp2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopCiB7CiAgICAgaWYgKHBPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IChDUERGX1N0cmVhbSopcE9iajsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOwpAQCAtNDgxLDExICs0ODEsMTEgQEAKICAgICBDUERGX0FycmF5KiBwRGVjb2RlID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJEZWNvZGUiKSk7CiAgICAgbV9uQml0c1BlclNhbXBsZSA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyU2FtcGxlIikpOwogICAgIGlmIChtX25CaXRzUGVyU2FtcGxlID4gMzIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fU2FtcGxlTWF4ID0gMHhmZmZmZmZmZiA+PiAoMzIgLSBtX25CaXRzUGVyU2FtcGxlKTsKICAgICBtX3BTYW1wbGVTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgbV9wU2FtcGxlU3RyZWFtLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7CisgICAgbV9wU2FtcGxlU3RyZWFtLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBmYWxzZSk7CiAgICAgbV9wRW5jb2RlSW5mbyA9IEZYX0FsbG9jKFNhbXBsZUVuY29kZUluZm8sIG1fbklucHV0cyk7CiAgICAgRlhfU0FGRV9EV09SRCBuVG90YWxTYW1wbGVCaXRzID0gMTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbklucHV0czsgaSArKykgewpAQCAtNTE0LDcgKzUxNCw3IEBACiAgICAgaWYgKCFuVG90YWxTYW1wbGVCeXRlcy5Jc1ZhbGlkKCkgfHwKICAgICAgICAgblRvdGFsU2FtcGxlQnl0ZXMuVmFsdWVPckRpZSgpID09IDAgfHwKICAgICAgICAgblRvdGFsU2FtcGxlQnl0ZXMuVmFsdWVPckRpZSgpID4gbV9wU2FtcGxlU3RyZWFtLT5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcERlY29kZUluZm8gPSBGWF9BbGxvYyhTYW1wbGVEZWNvZGVJbmZvLCBtX25PdXRwdXRzKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbk91dHB1dHM7IGkgKyspIHsKQEAgLTUyNiw5ICs1MjYsOSBAQAogICAgICAgICAgICAgbV9wRGVjb2RlSW5mb1tpXS5kZWNvZGVfbWF4ID0gbV9wUmFuZ2VzW2kgKiAyICsgMV07CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfU2FtcGxlZEZ1bmM6OnZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QKK2Jvb2wgQ1BERl9TYW1wbGVkRnVuYzo6dl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdAogewogICAgIGludCBwb3MgPSAwOwogICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiBlbmNvZGVkX2lucHV0X2J1ZihtX25JbnB1dHMpOwpAQCAtNTU1LDIxICs1NTUsMjEgQEAKICAgICBGWF9TQUZFX0lOVDMyIGJpdHNfdG9fb3V0cHV0ID0gbV9uT3V0cHV0czsKICAgICBiaXRzX3RvX291dHB1dCAqPSBtX25CaXRzUGVyU2FtcGxlOwogICAgIGlmICghYml0c190b19vdXRwdXQuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWF9TQUZFX0lOVDMyIGJpdHBvcyA9IHBvczsKICAgICBiaXRwb3MgKj0gYml0c190b19vdXRwdXQuVmFsdWVPckRpZSgpOwogICAgIGlmICghYml0cG9zLklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfU0FGRV9JTlQzMiByYW5nZV9jaGVjayA9IGJpdHBvczsKICAgICByYW5nZV9jaGVjayArPSBiaXRzX3RvX291dHB1dC5WYWx1ZU9yRGllKCk7CiAgICAgaWYgKCFyYW5nZV9jaGVjay5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGNvbnN0IHVpbnQ4X3QqIHBTYW1wbGVEYXRhID0gbV9wU2FtcGxlU3RyZWFtLT5HZXREYXRhKCk7CiAgICAgaWYgKCFwU2FtcGxlRGF0YSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtX25PdXRwdXRzOyBqICsrKSB7CiAgICAgICAgIEZYX0RXT1JEIHNhbXBsZSA9IF9HZXRCaXRzMzIocFNhbXBsZURhdGEsIGJpdHBvcy5WYWx1ZU9yRGllKCkgKyBqICogbV9uQml0c1BlclNhbXBsZSwgbV9uQml0c1BlclNhbXBsZSk7CkBAIC01ODYsNyArNTg2LDcgQEAKICAgICAgICAgICAgICAgICBiaXRwb3MyICs9IGo7CiAgICAgICAgICAgICAgICAgYml0cG9zMiAqPSBtX25CaXRzUGVyU2FtcGxlOwogICAgICAgICAgICAgICAgIGlmICghYml0cG9zMi5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNhbXBsZTEgPSBfR2V0Qml0czMyKHBTYW1wbGVEYXRhLCBiaXRwb3MyLlZhbHVlT3JEaWUoKSwgbV9uQml0c1BlclNhbXBsZSk7CiAgICAgICAgICAgICAgICAgZW5jb2RlZCArPSAoZW5jb2RlZF9pbnB1dFtpXSAtIGluZGV4W2ldKSAqICgoRlhfRkxPQVQpc2FtcGxlMSAtIChGWF9GTE9BVClzYW1wbGUpOwpAQCAtNTk1LDIzICs1OTUsMjMgQEAKICAgICAgICAgcmVzdWx0c1tqXSA9IFBERl9JbnRlcnBvbGF0ZShlbmNvZGVkLCAwLCAoRlhfRkxPQVQpbV9TYW1wbGVNYXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGVjb2RlSW5mb1tqXS5kZWNvZGVfbWluLCBtX3BEZWNvZGVJbmZvW2pdLmRlY29kZV9tYXgpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGNsYXNzIENQREZfUFNGdW5jIDogcHVibGljIENQREZfRnVuY3Rpb24KIHsKIHB1YmxpYzoKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfSW5pdChDUERGX09iamVjdCogcE9iaik7Ci0gICAgdmlydHVhbCBGWF9CT09MCQl2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbAkJdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKTsKKyAgICB2aXJ0dWFsIGJvb2wJCXZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Q7CiAgICAgQ1BERl9QU0VuZ2luZSBtX1BTOwogfTsKLUZYX0JPT0wgQ1BERl9QU0Z1bmM6OnZfSW5pdChDUERGX09iamVjdCogcE9iaikKK2Jvb2wgQ1BERl9QU0Z1bmM6OnZfSW5pdChDUERGX09iamVjdCogcE9iaikKIHsKICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IChDUERGX1N0cmVhbSopcE9iajsKICAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgYWNjLkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFKTsKKyAgICBhY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgZmFsc2UpOwogICAgIHJldHVybiBtX1BTLlBhcnNlKChjb25zdCBGWF9DSEFSKilhY2MuR2V0RGF0YSgpLCBhY2MuR2V0U2l6ZSgpKTsKIH0KLUZYX0JPT0wgQ1BERl9QU0Z1bmM6OnZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QKK2Jvb2wgQ1BERl9QU0Z1bmM6OnZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QKIHsKICAgICBDUERGX1BTRW5naW5lJiBQUyA9IChDUERGX1BTRW5naW5lJiltX1BTOwogICAgIFBTLlJlc2V0KCk7CkBAIC02MjEsMjAgKzYyMSwyMCBAQAogICAgIH0KICAgICBQUy5FeGVjdXRlKCk7CiAgICAgaWYgKFBTLkdldFN0YWNrU2l6ZSgpIDwgbV9uT3V0cHV0cykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgZm9yIChpID0gMDsgaSA8IG1fbk91dHB1dHM7IGkgKyspIHsKICAgICAgICAgcmVzdWx0c1ttX25PdXRwdXRzIC0gaSAtIDFdID0gUFMuUG9wKCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogY2xhc3MgQ1BERl9FeHBJbnRGdW5jIDogcHVibGljIENQREZfRnVuY3Rpb24KIHsKIHB1YmxpYzoKICAgICBDUERGX0V4cEludEZ1bmMoKTsKICAgICB2aXJ0dWFsIH5DUERGX0V4cEludEZ1bmMoKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfSW5pdChDUERGX09iamVjdCogcE9iaik7Ci0gICAgdmlydHVhbCBGWF9CT09MCQl2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbAkJdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKTsKKyAgICB2aXJ0dWFsIGJvb2wJCXZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Q7CiAgICAgRlhfRkxPQVQJbV9FeHBvbmVudDsKICAgICBGWF9GTE9BVCoJbV9wQmVnaW5WYWx1ZXM7CiAgICAgRlhfRkxPQVQqCW1fcEVuZFZhbHVlczsKQEAgLTY1NCwxMSArNjU0LDExIEBACiAgICAgICAgIEZYX0ZyZWUobV9wRW5kVmFsdWVzKTsKICAgICB9CiB9Ci1GWF9CT09MIENQREZfRXhwSW50RnVuYzo6dl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKQorYm9vbCBDUERGX0V4cEludEZ1bmM6OnZfSW5pdChDUERGX09iamVjdCogcE9iaikKIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcE9iai0+R2V0RGljdCgpOwogICAgIGlmIChwRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX0FycmF5KiBwQXJyYXkwID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJDMCIpKTsKICAgICBpZiAobV9uT3V0cHV0cyA9PSAwKSB7CkBAIC02NzcsMjcgKzY3NywyNyBAQAogICAgIG1fRXhwb25lbnQgPSBwRGljdC0+R2V0RmxvYXQoRlhfQlNUUkMoIk4iKSk7CiAgICAgbV9uT3JpZ091dHB1dHMgPSBtX25PdXRwdXRzOwogICAgIGlmIChtX25PdXRwdXRzICYmIG1fbklucHV0cyA+IElOVF9NQVggLyBtX25PdXRwdXRzKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX25PdXRwdXRzICo9IG1fbklucHV0czsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9FeHBJbnRGdW5jOjp2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0Citib29sIENQREZfRXhwSW50RnVuYzo6dl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdAogewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpICsrKQogICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1fbk9yaWdPdXRwdXRzOyBqICsrKSB7CiAgICAgICAgICAgICByZXN1bHRzW2kgKiBtX25PcmlnT3V0cHV0cyArIGpdID0gbV9wQmVnaW5WYWx1ZXNbal0gKyAoRlhfRkxPQVQpRlhTWVNfcG93KGlucHV0c1tpXSwgbV9FeHBvbmVudCkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3BFbmRWYWx1ZXNbal0gLSBtX3BCZWdpblZhbHVlc1tqXSk7CiAgICAgICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGNsYXNzIENQREZfU3RpdGNoRnVuYyA6IHB1YmxpYyBDUERGX0Z1bmN0aW9uCiB7CiBwdWJsaWM6CiAgICAgQ1BERl9TdGl0Y2hGdW5jKCk7CiAgICAgdmlydHVhbCB+Q1BERl9TdGl0Y2hGdW5jKCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQl2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wJCXZfSW5pdChDUERGX09iamVjdCogcE9iaik7CisgICAgdmlydHVhbCBib29sCQl2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0OwogICAgIGludAkJCW1fblN1YnM7CiAgICAgQ1BERl9GdW5jdGlvbioqIG1fcFN1YkZ1bmN0aW9uczsKICAgICBGWF9GTE9BVCoJbV9wQm91bmRzOwpAQCAtNzI0LDE5ICs3MjQsMTkgQEAKICAgICAgICAgRlhfRnJlZShtX3BFbmNvZGUpOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9TdGl0Y2hGdW5jOjp2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopCitib29sIENQREZfU3RpdGNoRnVuYzo6dl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKQogewogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwT2JqLT5HZXREaWN0KCk7CiAgICAgaWYgKHBEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfQXJyYXkqIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRnVuY3Rpb25zIikpOwogICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9uU3VicyA9IHBBcnJheS0+R2V0Q291bnQoKTsKICAgICBpZiAobV9uU3VicyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BTdWJGdW5jdGlvbnMgPSBGWF9BbGxvYyhDUERGX0Z1bmN0aW9uKiwgbV9uU3Vicyk7CiAgICAgbV9uT3V0cHV0cyA9IDA7CkBAIC03NDQsMTEgKzc0NCwxMSBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBtX25TdWJzOyBpICsrKSB7CiAgICAgICAgIENQREZfT2JqZWN0KiBwU3ViID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoaSk7CiAgICAgICAgIGlmIChwU3ViID09IHBPYmopIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBtX3BTdWJGdW5jdGlvbnNbaV0gPSBDUERGX0Z1bmN0aW9uOjpMb2FkKHBTdWIpOwogICAgICAgICBpZiAobV9wU3ViRnVuY3Rpb25zW2ldID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9wU3ViRnVuY3Rpb25zW2ldLT5Db3VudE91dHB1dHMoKSA+IG1fbk91dHB1dHMpIHsKICAgICAgICAgICAgIG1fbk91dHB1dHMgPSBtX3BTdWJGdW5jdGlvbnNbaV0tPkNvdW50T3V0cHV0cygpOwpAQCAtNzU4LDcgKzc1OCw3IEBACiAgICAgbV9wQm91bmRzWzBdID0gbV9wRG9tYWluc1swXTsKICAgICBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkJvdW5kcyIpKTsKICAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCBtX25TdWJzIC0gMTsgaSArKykgewogICAgICAgICBtX3BCb3VuZHNbaSArIDFdID0gcEFycmF5LT5HZXRGbG9hdChpKTsKQEAgLTc2NywxNCArNzY3LDE0IEBACiAgICAgbV9wRW5jb2RlID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgbV9uU3VicywgMik7CiAgICAgcEFycmF5ID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJFbmNvZGUiKSk7CiAgICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBmb3IgKGkgPSAwOyBpIDwgbV9uU3VicyAqIDI7IGkgKyspIHsKICAgICAgICAgbV9wRW5jb2RlW2ldID0gcEFycmF5LT5HZXRGbG9hdChpKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfU3RpdGNoRnVuYzo6dl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiBvdXRwdXRzKSBjb25zdAorYm9vbCBDUERGX1N0aXRjaEZ1bmM6OnZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogb3V0cHV0cykgY29uc3QKIHsKICAgICBGWF9GTE9BVCBpbnB1dCA9IGlucHV0c1swXTsKICAgICBpbnQgaTsKQEAgLTc4MywxMiArNzgzLDEyIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIGlmIChtX3BTdWJGdW5jdGlvbnNbaV0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW5wdXQgPSBQREZfSW50ZXJwb2xhdGUoaW5wdXQsIG1fcEJvdW5kc1tpXSwgbV9wQm91bmRzW2kgKyAxXSwgbV9wRW5jb2RlW2kgKiAyXSwgbV9wRW5jb2RlW2kgKiAyICsgMV0pOwogICAgIGludCBucmVzdWx0czsKICAgICBtX3BTdWJGdW5jdGlvbnNbaV0tPkNhbGwoJmlucHV0LCBtX25JbnB1dHMsIG91dHB1dHMsIG5yZXN1bHRzKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIENQREZfRnVuY3Rpb24qIENQREZfRnVuY3Rpb246OkxvYWQoQ1BERl9PYmplY3QqIHBGdW5jT2JqKQogewpAQCAtODM3LDcgKzgzNyw3IEBACiAgICAgICAgIG1fcFJhbmdlcyA9IE5VTEw7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX0Z1bmN0aW9uOjpJbml0KENQREZfT2JqZWN0KiBwT2JqKQorYm9vbCBDUERGX0Z1bmN0aW9uOjpJbml0KENQREZfT2JqZWN0KiBwT2JqKQogewogICAgIENQREZfRGljdGlvbmFyeSogcERpY3Q7CiAgICAgaWYgKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7CkBAIC04NDcsMTEgKzg0NywxMSBAQAogICAgIH0KICAgICBDUERGX0FycmF5KiBwRG9tYWlucyA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRG9tYWluIikpOwogICAgIGlmIChwRG9tYWlucyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX25JbnB1dHMgPSBwRG9tYWlucy0+R2V0Q291bnQoKSAvIDI7CiAgICAgaWYgKG1fbklucHV0cyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BEb21haW5zID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgbV9uSW5wdXRzLCAyKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbklucHV0cyAqIDI7IGkgKyspIHsKQEAgLTg2OCw3ICs4NjgsNyBAQAogICAgIH0KICAgICBGWF9EV09SRCBvbGRfb3V0cHV0cyA9IG1fbk91dHB1dHM7CiAgICAgaWYgKCF2X0luaXQocE9iaikpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX3BSYW5nZXMgJiYgbV9uT3V0cHV0cyA+IChpbnQpb2xkX291dHB1dHMpIHsKICAgICAgICAgbV9wUmFuZ2VzID0gRlhfUmVhbGxvYyhGWF9GTE9BVCwgbV9wUmFuZ2VzLCBtX25PdXRwdXRzICogMik7CkBAIC04NzYsMTIgKzg3NiwxMiBAQAogICAgICAgICAgICAgRlhTWVNfbWVtc2V0KG1fcFJhbmdlcyArIChvbGRfb3V0cHV0cyAqIDIpLCAwLCBzaXplb2YoRlhfRkxPQVQpICogKG1fbk91dHB1dHMgLSBvbGRfb3V0cHV0cykgKiAyKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9GdW5jdGlvbjo6Q2FsbChGWF9GTE9BVCogaW5wdXRzLCBpbnQgbmlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMsIGludCYgbnJlc3VsdHMpIGNvbnN0Citib29sIENQREZfRnVuY3Rpb246OkNhbGwoRlhfRkxPQVQqIGlucHV0cywgaW50IG5pbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzLCBpbnQmIG5yZXN1bHRzKSBjb25zdAogewogICAgIGlmIChtX25JbnB1dHMgIT0gbmlucHV0cykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbnJlc3VsdHMgPSBtX25PdXRwdXRzOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpICsrKSB7CkBAIC05MDEsNSArOTAxLDUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9ncmFwaF9zdGF0ZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZ3JhcGhfc3RhdGUuY3BwCmluZGV4IGI0ZDAzMGUuLjMyNjRiZTQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9ncmFwaF9zdGF0ZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2dyYXBoX3N0YXRlLmNwcApAQCAtOTcsNyArOTcsNyBAQAogQ1BERl9SZWN0IENQREZfQ2xpcFBhdGg6OkdldENsaXBCb3goKSBjb25zdAogewogICAgIENQREZfUmVjdCByZWN0OwotICAgIEZYX0JPT0wgYlN0YXJ0ZWQgPSBGQUxTRTsKKyAgICBib29sIGJTdGFydGVkID0gZmFsc2U7CiAgICAgaW50IGNvdW50ID0gR2V0UGF0aENvdW50KCk7CiAgICAgaWYgKGNvdW50KSB7CiAgICAgICAgIHJlY3QgPSBHZXRQYXRoKDApLkdldEJvdW5kaW5nQm94KCk7CkBAIC0xMDUsMjYgKzEwNSwyNiBAQAogICAgICAgICAgICAgQ1BERl9SZWN0IHBhdGhfcmVjdCA9IEdldFBhdGgoaSkuR2V0Qm91bmRpbmdCb3goKTsKICAgICAgICAgICAgIHJlY3QuSW50ZXJzZWN0KHBhdGhfcmVjdCk7CiAgICAgICAgIH0KLSAgICAgICAgYlN0YXJ0ZWQgPSBUUlVFOworICAgICAgICBiU3RhcnRlZCA9IHRydWU7CiAgICAgfQogICAgIGNvdW50ID0gR2V0VGV4dENvdW50KCk7CiAgICAgaWYgKGNvdW50KSB7CiAgICAgICAgIENQREZfUmVjdCBsYXllcl9yZWN0OwotICAgICAgICBGWF9CT09MIGJMYXllclN0YXJ0ZWQgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiTGF5ZXJTdGFydGVkID0gZmFsc2U7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKICAgICAgICAgICAgIENQREZfVGV4dE9iamVjdCogcFRleHRPYmogPSBHZXRUZXh0KGkpOwogICAgICAgICAgICAgaWYgKHBUZXh0T2JqID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpZiAoIWJTdGFydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIHJlY3QgPSBsYXllcl9yZWN0OwotICAgICAgICAgICAgICAgICAgICBiU3RhcnRlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJTdGFydGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICByZWN0LkludGVyc2VjdChsYXllcl9yZWN0KTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYkxheWVyU3RhcnRlZCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJMYXllclN0YXJ0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKCFiTGF5ZXJTdGFydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIGxheWVyX3JlY3QgPSBwVGV4dE9iai0+R2V0QkJveChOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgYkxheWVyU3RhcnRlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJMYXllclN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGxheWVyX3JlY3QuVW5pb24ocFRleHRPYmotPkdldEJCb3goTlVMTCkpOwogICAgICAgICAgICAgICAgIH0KQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgIH0KICAgICByZXR1cm4gcmVjdDsKIH0KLXZvaWQgQ1BERl9DbGlwUGF0aDo6QXBwZW5kUGF0aChDUERGX1BhdGggcGF0aCwgaW50IHR5cGUsIEZYX0JPT0wgYkF1dG9NZXJnZSkKK3ZvaWQgQ1BERl9DbGlwUGF0aDo6QXBwZW5kUGF0aChDUERGX1BhdGggcGF0aCwgaW50IHR5cGUsIGJvb2wgYkF1dG9NZXJnZSkKIHsKICAgICBDUERGX0NsaXBQYXRoRGF0YSogcERhdGEgPSBHZXRNb2RpZnkoKTsKICAgICBpZiAocERhdGEtPm1fUGF0aENvdW50ICYmIGJBdXRvTWVyZ2UpIHsKQEAgLTI1Niw3ICsyNTYsNyBAQAogICAgIENQREZfQ29sb3JTdGF0ZURhdGEqIHBEYXRhID0gR2V0TW9kaWZ5KCk7CiAgICAgcERhdGEtPm1fRmlsbENvbG9yLlNldFZhbHVlKHBQYXR0ZXJuLCBwVmFsdWUsIG5WYWx1ZXMpOwogICAgIGludCBSLCBHLCBCOwotICAgIEZYX0JPT0wgcmV0ID0gcERhdGEtPm1fRmlsbENvbG9yLkdldFJHQihSLCBHLCBCKTsKKyAgICBib29sIHJldCA9IHBEYXRhLT5tX0ZpbGxDb2xvci5HZXRSR0IoUiwgRywgQik7CiAgICAgaWYgKHBQYXR0ZXJuLT5tX1BhdHRlcm5UeXBlID09IDEgJiYgKChDUERGX1RpbGluZ1BhdHRlcm4qKXBQYXR0ZXJuKS0+bV9iQ29sb3JlZCAmJiAhcmV0KSB7CiAgICAgICAgIHBEYXRhLT5tX0ZpbGxSR0IgPSAweDAwQkZCRkJGOwogICAgICAgICByZXR1cm47CkBAIC0yNjgsNyArMjY4LDcgQEAKICAgICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwRGF0YSA9IEdldE1vZGlmeSgpOwogICAgIHBEYXRhLT5tX1N0cm9rZUNvbG9yLlNldFZhbHVlKHBQYXR0ZXJuLCBwVmFsdWUsIG5WYWx1ZXMpOwogICAgIGludCBSLCBHLCBCOwotICAgIEZYX0JPT0wgcmV0ID0gcERhdGEtPm1fU3Ryb2tlQ29sb3IuR2V0UkdCKFIsIEcsIEIpOworICAgIGJvb2wgcmV0ID0gcERhdGEtPm1fU3Ryb2tlQ29sb3IuR2V0UkdCKFIsIEcsIEIpOwogICAgIGlmIChwUGF0dGVybi0+bV9QYXR0ZXJuVHlwZSA9PSAxICYmICgoQ1BERl9UaWxpbmdQYXR0ZXJuKilwUGF0dGVybiktPm1fYkNvbG9yZWQgJiYgIXJldCkgewogICAgICAgICBwRGF0YS0+bV9TdHJva2VSR0IgPSAweDAwQkZCRkJGOwogICAgICAgICByZXR1cm47CkBAIC0yOTUsNyArMjk1LDcgQEAKICAgICB9CiAgICAgRlhTWVNfbWVtY3B5KHRoaXMsICZzcmMsIHNpemVvZihDUERGX1RleHRTdGF0ZURhdGEpKTsKICAgICBpZiAobV9wRG9jdW1lbnQgJiYgbV9wRm9udCkgewotICAgICAgICBtX3BGb250ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPkdldEZvbnQobV9wRm9udC0+R2V0Rm9udERpY3QoKSwgRkFMU0UpOworICAgICAgICBtX3BGb250ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPkdldEZvbnQobV9wRm9udC0+R2V0Rm9udERpY3QoKSwgZmFsc2UpOwogICAgIH0KIH0KIENQREZfVGV4dFN0YXRlRGF0YTo6fkNQREZfVGV4dFN0YXRlRGF0YSgpCkBAIC01NDUsNyArNTQ1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBwR2VuZXJhbFN0YXRlLT5TZXRCbGVuZE1vZGUobW9kZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwR2VuZXJhbFN0YXRlLT5tX0JsZW5kVHlwZSA+IEZYRElCX0JMRU5EX01VTFRJUExZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyc2VyLT5HZXRPYmplY3RMaXN0KCktPm1fYkJhY2tncm91bmRBbHBoYU5lZWRlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBwUGFyc2VyLT5HZXRPYmplY3RMaXN0KCktPm1fYkJhY2tncm91bmRBbHBoYU5lZWRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpAQCAtNjMxLDEyICs2MzEsMTIgQEAKICAgICAgICAgKChDUERGX0RpY3Rpb25hcnkqKW1fcFBhcmFtKS0+UmVsZWFzZSgpOwogICAgIH0KIH0KLUZYX0JPT0wJQ1BERl9Db250ZW50TWFya0l0ZW06Okhhc01DSUQoKSBjb25zdAorYm9vbAlDUERGX0NvbnRlbnRNYXJrSXRlbTo6SGFzTUNJRCgpIGNvbnN0CiB7CiAgICAgaWYgKG1fcFBhcmFtICYmIChtX1BhcmFtVHlwZSA9PSBEaXJlY3REaWN0IHx8IG1fUGFyYW1UeXBlID09IFByb3BlcnRpZXNEaWN0KSkgewogICAgICAgICByZXR1cm4gKChDUERGX0RpY3Rpb25hcnkgKiltX3BQYXJhbSktPktleUV4aXN0KEZYX0JTVFJDKCJNQ0lEIikpOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogQ1BERl9Db250ZW50TWFya0RhdGE6OkNQREZfQ29udGVudE1hcmtEYXRhKGNvbnN0IENQREZfQ29udGVudE1hcmtEYXRhJiBzcmMpCiB7CkBAIC02NTgsNyArNjU4LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIC0xOwogfQotdm9pZCBDUERGX0NvbnRlbnRNYXJrRGF0YTo6QWRkTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgRlhfQk9PTCBiRGlyZWN0KQordm9pZCBDUERGX0NvbnRlbnRNYXJrRGF0YTo6QWRkTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgYm9vbCBiRGlyZWN0KQogewogICAgIENQREZfQ29udGVudE1hcmtJdGVtJiBpdGVtID0gbV9NYXJrcy5BZGQoKTsKICAgICBpdGVtLlNldE5hbWUobmFtZSk7CkBAIC02NzYsMjMgKzY3NiwyMyBAQAogICAgIH0KICAgICBtX01hcmtzLlJlbW92ZUF0KHNpemUgLSAxKTsKIH0KLUZYX0JPT0wgQ1BERl9Db250ZW50TWFyazo6SGFzTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG1hcmspIGNvbnN0Citib29sIENQREZfQ29udGVudE1hcms6Okhhc01hcmsoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBtYXJrKSBjb25zdAogewogICAgIGlmIChtX3BPYmplY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3BPYmplY3QtPkNvdW50SXRlbXMoKTsgaSArKykgewogICAgICAgICBDUERGX0NvbnRlbnRNYXJrSXRlbSYgaXRlbSA9IG1fcE9iamVjdC0+R2V0SXRlbShpKTsKICAgICAgICAgaWYgKGl0ZW0uR2V0TmFtZSgpID09IG1hcmspIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9Db250ZW50TWFyazo6TG9va3VwTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG1hcmssIENQREZfRGljdGlvbmFyeSomIHBEaWN0KSBjb25zdAorYm9vbCBDUERGX0NvbnRlbnRNYXJrOjpMb29rdXBNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbWFyaywgQ1BERl9EaWN0aW9uYXJ5KiYgcERpY3QpIGNvbnN0CiB7CiAgICAgaWYgKG1fcE9iamVjdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fcE9iamVjdC0+Q291bnRJdGVtcygpOyBpICsrKSB7CiAgICAgICAgIENQREZfQ29udGVudE1hcmtJdGVtJiBpdGVtID0gbV9wT2JqZWN0LT5HZXRJdGVtKGkpOwpAQCAtNzAyLDggKzcwMiw4IEBACiAgICAgICAgICAgICAgICAgICAgIGl0ZW0uR2V0UGFyYW1UeXBlKCkgPT0gQ1BERl9Db250ZW50TWFya0l0ZW06OkRpcmVjdERpY3QpIHsKICAgICAgICAgICAgICAgICBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKWl0ZW0uR2V0UGFyYW0oKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9pbWFnZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfaW1hZ2UuY3BwCmluZGV4IGFhYmZkMTQuLjczOWEwYmQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9pbWFnZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2ltYWdlLmNwcApAQCAtNTcsNyArNTcsNyBAQAogICAgIENQREZfSW1hZ2UqIHBJbWFnZSA9IG5ldyBDUERGX0ltYWdlKG1fcERvY3VtZW50KTsKICAgICBwSW1hZ2UtPkxvYWRJbWFnZUYoKENQREZfU3RyZWFtKikoKENQREZfT2JqZWN0KiltX3BTdHJlYW0pLT5DbG9uZSgpLCBtX2JJbmxpbmUpOwogICAgIGlmIChtX2JJbmxpbmUpIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5ICpwSW5saW5lRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKW1fcElubGluZURpY3QtPkNsb25lKFRSVUUpOworICAgICAgICBDUERGX0RpY3Rpb25hcnkgKnBJbmxpbmVEaWN0ID0gKENQREZfRGljdGlvbmFyeSopbV9wSW5saW5lRGljdC0+Q2xvbmUodHJ1ZSk7CiAgICAgICAgIHBJbWFnZS0+U2V0SW5saW5lRGljdChwSW5saW5lRGljdCk7CiAgICAgfQogICAgIHJldHVybiBwSW1hZ2U7CkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgbV9wRG9jdW1lbnQgPSBwRG9jOwogICAgIG1fcFN0cmVhbSA9IE5VTEw7CiAgICAgbV9wT0MgPSBOVUxMOwotICAgIG1fYklubGluZSA9IEZBTFNFOworICAgIG1fYklubGluZSA9IGZhbHNlOwogICAgIG1fcElubGluZURpY3QgPSBOVUxMOwogICAgIG1fcERJQlNvdXJjZSA9IE5VTEw7CiAgICAgbV9wTWFzayA9IE5VTEw7CkBAIC04NCw3ICs4NCw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1GWF9CT09MIENQREZfSW1hZ2U6OkxvYWRJbWFnZUYoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYklubGluZSkKK2Jvb2wgQ1BERl9JbWFnZTo6TG9hZEltYWdlRihDUERGX1N0cmVhbSogcFN0cmVhbSwgYm9vbCBiSW5saW5lKQogewogICAgIG1fcFN0cmVhbSA9IHBTdHJlYW07CiAgICAgaWYgKG1fYklubGluZSAmJiBtX3BJbmxpbmVEaWN0KSB7CkBAIC0xMDEsNSArMTAxLDUgQEAKICAgICBtX2JJbnRlcnBvbGF0ZSA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJJbnRlcnBvbGF0ZSIpKTsKICAgICBtX0hlaWdodCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJIZWlnaHQiKSk7CiAgICAgbV9XaWR0aCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJXaWR0aCIpKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXJzZXIuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhcnNlci5jcHAKaW5kZXggODkyZTIxNS4uYjI3Zjk1OCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhcnNlci5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhcnNlci5jcHAKQEAgLTksNyArOSw3IEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfc2VyaWFsLmgiCiAjaW5jbHVkZSAicGFnZWludC5oIgogCi0jZGVmaW5lIFJFUVVJUkVfUEFSQU1TKGNvdW50KSBpZiAobV9QYXJhbUNvdW50ICE9IGNvdW50KSB7IG1fYkFib3J0ID0gVFJVRTsgcmV0dXJuOyB9CisjZGVmaW5lIFJFUVVJUkVfUEFSQU1TKGNvdW50KSBpZiAobV9QYXJhbUNvdW50ICE9IGNvdW50KSB7IG1fYkFib3J0ID0gdHJ1ZTsgcmV0dXJuOyB9CiAKIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6Q1BERl9TdHJlYW1Db250ZW50UGFyc2VyKAogICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKQEAgLTMwLDcgKzMwLDcgQEAKICAgICAgIG1fTGV2ZWwobGV2ZWwpLAogICAgICAgbV9QYXJhbVN0YXJ0UG9zKDApLAogICAgICAgbV9QYXJhbUNvdW50KDApLAotICAgICAgbV9iQWJvcnQoRkFMU0UpLAorICAgICAgbV9iQWJvcnQoZmFsc2UpLAogICAgICAgbV9wQ3VyU3RhdGVzKG5ldyBDUERGX0FsbFN0YXRlcyksCiAgICAgICBtX3BMYXN0VGV4dE9iamVjdChudWxscHRyKSwKICAgICAgIG1fRGVmRm9udFNpemUoMCksCkBAIC00Myw5ICs0Myw5IEBACiAgICAgICBtX3BMYXN0SW1hZ2UobnVsbHB0ciksCiAgICAgICBtX3BMYXN0SW1hZ2VEaWN0KG51bGxwdHIpLAogICAgICAgbV9wTGFzdENsb25lSW1hZ2VEaWN0KG51bGxwdHIpLAotICAgICAgbV9iUmVsZWFzZUxhc3REaWN0KFRSVUUpLAotICAgICAgbV9iQ29sb3JlZChGQUxTRSksCi0gICAgICBtX2JSZXNvdXJjZU1pc3NpbmcoRkFMU0UpCisgICAgICBtX2JSZWxlYXNlTGFzdERpY3QodHJ1ZSksCisgICAgICBtX2JDb2xvcmVkKGZhbHNlKSwKKyAgICAgIG1fYlJlc291cmNlTWlzc2luZyhmYWxzZSkKIHsKICAgICBpZiAocG10Q29udGVudFRvVXNlcikgewogICAgICAgICBtX210Q29udGVudFRvVXNlciA9ICpwbXRDb250ZW50VG9Vc2VyOwpAQCAtMTgzLDcgKzE4Myw3IEBACiAgICAgaWYgKHBhcmFtLm1fVHlwZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBwYXJhbS5tX3BPYmplY3Q7CiAgICAgfQotICAgIEFTU0VSVChGQUxTRSk7CisgICAgQVNTRVJUKGZhbHNlKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIENGWF9CeXRlU3RyaW5nIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6R2V0U3RyaW5nKEZYX0RXT1JEIGluZGV4KQpAQCAtMjI2LDcgKzIyNiw3IEBACiB7CiAgICAgcmV0dXJuIEdldE51bWJlcihpbmRleCk7CiB9Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6U2V0R3JhcGhpY1N0YXRlcyhDUERGX1BhZ2VPYmplY3QqIHBPYmosIEZYX0JPT0wgYkNvbG9yLCBGWF9CT09MIGJUZXh0LCBGWF9CT09MIGJHcmFwaCkKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpTZXRHcmFwaGljU3RhdGVzKENQREZfUGFnZU9iamVjdCogcE9iaiwgYm9vbCBiQ29sb3IsIGJvb2wgYlRleHQsIGJvb2wgYkdyYXBoKQogewogICAgIHBPYmotPm1fR2VuZXJhbFN0YXRlID0gbV9wQ3VyU3RhdGVzLT5tX0dlbmVyYWxTdGF0ZTsKICAgICBwT2JqLT5tX0NsaXBQYXRoID0gbV9wQ3VyU3RhdGVzLT5tX0NsaXBQYXRoOwpAQCAtMzE4LDcgKzMxOCw3IEBACiAgICAge0ZYQlNUUl9JRCgndycsIDAsIDAsIDApLAkJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVXaWR0aH0sCiAgICAge0ZYQlNUUl9JRCgneScsIDAsIDAsIDApLAkJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0N1cnZlVG9fMTN9LAogfTsKLUZYX0JPT0wgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpPbk9wZXJhdG9yKGNvbnN0IEZYX0NIQVIqIG9wKQorYm9vbCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6Ok9uT3BlcmF0b3IoY29uc3QgRlhfQ0hBUiogb3ApCiB7CiAgICAgaW50IGkgPSAwOwogICAgIEZYX0RXT1JEIG9waWQgPSAwOwpAQCAtMzM2LDcgKzMzNiw3IEBACiAgICAgICAgIGludCBjb21wYXJlID0gb3BpZCAtIGdfT3BDb2Rlc1ttaWRkbGVdLm1fT3BJZDsKICAgICAgICAgaWYgKGNvbXBhcmUgPT0gMCkgewogICAgICAgICAgICAgKHRoaXMtPipnX09wQ29kZXNbbWlkZGxlXS5tX09wSGFuZGxlcikoKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGNvbXBhcmUgPCAwKSB7CiAgICAgICAgICAgICBoaWdoID0gbWlkZGxlIC0gMTsKQEAgLTM1MiwxNCArMzUyLDE0IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgSGFuZGxlX0Nsb3NlUGF0aCgpOwotICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX1dJTkRJTkcsIFRSVUUpOworICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX1dJTkRJTkcsIHRydWUpOwogfQogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9GaWxsU3Ryb2tlUGF0aCgpCiB7CiAgICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX1dJTkRJTkcsIFRSVUUpOworICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX1dJTkRJTkcsIHRydWUpOwogfQogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DbG9zZUVPRmlsbFN0cm9rZVBhdGgoKQogewpAQCAtMzY3LDE0ICszNjcsMTQgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBBZGRQYXRoUG9pbnQobV9QYXRoU3RhcnRYLCBtX1BhdGhTdGFydFksIEZYUFRfTElORVRPIHwgRlhQVF9DTE9TRUZJR1VSRSk7Ci0gICAgQWRkUGF0aE9iamVjdChGWEZJTExfQUxURVJOQVRFLCBUUlVFKTsKKyAgICBBZGRQYXRoT2JqZWN0KEZYRklMTF9BTFRFUk5BVEUsIHRydWUpOwogfQogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FT0ZpbGxTdHJva2VQYXRoKCkKIHsKICAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQWRkUGF0aE9iamVjdChGWEZJTExfQUxURVJOQVRFLCBUUlVFKTsKKyAgICBBZGRQYXRoT2JqZWN0KEZYRklMTF9BTFRFUk5BVEUsIHRydWUpOwogfQogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9CZWdpbk1hcmtlZENvbnRlbnRfRGljdGlvbmFyeSgpCiB7CkBAIC0zODYsMTMgKzM4NiwxMyBAQAogICAgIGlmIChwUHJvcGVydHkgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEZYX0JPT0wgYkRpcmVjdCA9IFRSVUU7CisgICAgYm9vbCBiRGlyZWN0ID0gdHJ1ZTsKICAgICBpZiAocFByb3BlcnR5LT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKICAgICAgICAgcFByb3BlcnR5ID0gRmluZFJlc291cmNlT2JqKEZYX0JTVFJDKCJQcm9wZXJ0aWVzIiksIHBQcm9wZXJ0eS0+R2V0U3RyaW5nKCkpOwogICAgICAgICBpZiAocFByb3BlcnR5ID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBiRGlyZWN0ID0gRkFMU0U7CisgICAgICAgIGJEaXJlY3QgPSBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBQcm9wZXJ0eS0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTQwNSw3ICs0MDUsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIHRhZyA9IEdldFN0cmluZygwKTsKLSAgICBtX0N1ckNvbnRlbnRNYXJrLkdldE1vZGlmeSgpLT5BZGRNYXJrKHRhZywgTlVMTCwgRkFMU0UpOworICAgIG1fQ3VyQ29udGVudE1hcmsuR2V0TW9kaWZ5KCktPkFkZE1hcmsodGFnLCBOVUxMLCBmYWxzZSk7CiB9CiBzdHJ1Y3QgX0ZYX0JTVFIgewogICAgIGNvbnN0IEZYX0NIQVIqCW1fUHRyOwpAQCAtNjIyLDIwICs2MjIsMjAgQEAKIHsKICAgICBtX1R5cGUzRGF0YVswXSA9IEdldE51bWJlcigxKTsKICAgICBtX1R5cGUzRGF0YVsxXSA9IEdldE51bWJlcigwKTsKLSAgICBtX2JDb2xvcmVkID0gVFJVRTsKKyAgICBtX2JDb2xvcmVkID0gdHJ1ZTsKIH0KIHZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q2FjaGVkRGV2aWNlKCkKIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkgKyspIHsKICAgICAgICAgbV9UeXBlM0RhdGFbaV0gPSBHZXROdW1iZXIoNSAtIGkpOwogICAgIH0KLSAgICBtX2JDb2xvcmVkID0gRkFMU0U7CisgICAgbV9iQ29sb3JlZCA9IGZhbHNlOwogfQogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FeGVjdXRlWE9iamVjdCgpCiB7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IEdldFN0cmluZygwKTsKICAgICBpZiAobmFtZSA9PSBtX0xhc3RJbWFnZU5hbWUgJiYgbV9wTGFzdEltYWdlICYmIG1fcExhc3RJbWFnZS0+R2V0U3RyZWFtKCkgJiYgbV9wTGFzdEltYWdlLT5HZXRTdHJlYW0oKS0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgQWRkSW1hZ2UoTlVMTCwgbV9wTGFzdEltYWdlLCBGQUxTRSk7CisgICAgICAgIEFkZEltYWdlKE5VTEwsIG1fcExhc3RJbWFnZSwgZmFsc2UpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKQEAgLTY3MywxNCArNjczLDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIEZYX0JPT0wgYkZvcm07CisgICAgICAgIGJvb2wgYkZvcm07CiAgICAgICAgIGlmIChtX3BEb2N1bWVudC0+SXNGb3JtU3RyZWFtKCgoQ1BERl9SZWZlcmVuY2UqKXBSZXMpLT5HZXRSZWZPYmpOdW0oKSwgYkZvcm0pICYmICFiRm9ybSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQogICAgIENQREZfU3RyZWFtKiBwWE9iamVjdCA9IChDUERGX1N0cmVhbSopRmluZFJlc291cmNlT2JqKEZYX0JTVFJDKCJYT2JqZWN0IiksIG5hbWUpOwogICAgIGlmIChwWE9iamVjdCA9PSBOVUxMIHx8IHBYT2JqZWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSBUUlVFOworICAgICAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSB0cnVlOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nQyB0eXBlID0gcFhPYmplY3QtPkdldERpY3QoKSA/IHBYT2JqZWN0LT5HZXREaWN0KCktPkdldENvbnN0U3RyaW5nKEZYX0JTVFJDKCJTdWJ0eXBlIikpIDogQ0ZYX0J5dGVTdHJpbmdDKCk7CkBAIC02ODgsNyArNjg4LDcgQEAKICAgICAgICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIENQREZfSW1hZ2VPYmplY3QqIHBPYmogPSBBZGRJbWFnZShwWE9iamVjdCwgTlVMTCwgRkFMU0UpOworICAgICAgICBDUERGX0ltYWdlT2JqZWN0KiBwT2JqID0gQWRkSW1hZ2UocFhPYmplY3QsIE5VTEwsIGZhbHNlKTsKICAgICAgICAgbV9MYXN0SW1hZ2VOYW1lID0gbmFtZTsKICAgICAgICAgbV9wTGFzdEltYWdlID0gcE9iai0+bV9wSW1hZ2U7CiAgICAgfSBlbHNlIGlmICh0eXBlID09IEZYX0JTVFJDKCJGb3JtIikpIHsKQEAgLTcxOSwxMCArNzE5LDEwIEBACiAgICAgICAgICAgICBtX3BDdXJTdGF0ZXMuZ2V0KCksIG1fTGV2ZWwgKyAxKTsKICAgICAgICAgcGFyc2VyLm1fcEN1clN0YXRlcy0+bV9DVE0gPSBmb3JtX21hdHJpeDsKICAgICAgICAgaWYgKENsaXBQYXRoLk5vdE51bGwoKSkgewotICAgICAgICAgICAgcGFyc2VyLm1fcEN1clN0YXRlcy0+bV9DbGlwUGF0aC5BcHBlbmRQYXRoKENsaXBQYXRoLCBGWEZJTExfV0lORElORywgVFJVRSk7CisgICAgICAgICAgICBwYXJzZXIubV9wQ3VyU3RhdGVzLT5tX0NsaXBQYXRoLkFwcGVuZFBhdGgoQ2xpcFBhdGgsIEZYRklMTF9XSU5ESU5HLCB0cnVlKTsKICAgICAgICAgfQogICAgICAgICBDUERGX1N0cmVhbUFjYyBzdHJlYW07Ci0gICAgICAgIHN0cmVhbS5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7CisgICAgICAgIHN0cmVhbS5Mb2FkQWxsRGF0YShwU3RyZWFtLCBmYWxzZSk7CiAgICAgICAgIGlmIChzdHJlYW0uR2V0U2l6ZSgpID09IDApIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtNzQwLDEzICs3NDAsMTMgQEAKICAgICBzdGF0dXMubV9UZXh0U3RhdGUgPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlOwogICAgIHBGb3JtT2JqLT5tX3BGb3JtLT5QYXJzZUNvbnRlbnQoJnN0YXR1cywgTlVMTCwgTlVMTCwgJm1fT3B0aW9ucywgbV9MZXZlbCArIDEpOwogICAgIGlmICghbV9wT2JqZWN0TGlzdC0+bV9iQmFja2dyb3VuZEFscGhhTmVlZGVkICYmIHBGb3JtT2JqLT5tX3BGb3JtLT5tX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQpIHsKLSAgICAgICAgbV9wT2JqZWN0TGlzdC0+bV9iQmFja2dyb3VuZEFscGhhTmVlZGVkID0gVFJVRTsKKyAgICAgICAgbV9wT2JqZWN0TGlzdC0+bV9iQmFja2dyb3VuZEFscGhhTmVlZGVkID0gdHJ1ZTsKICAgICB9CiAgICAgcEZvcm1PYmotPkNhbGNCb3VuZGluZ0JveCgpOwotICAgIFNldEdyYXBoaWNTdGF0ZXMocEZvcm1PYmosIFRSVUUsIFRSVUUsIFRSVUUpOworICAgIFNldEdyYXBoaWNTdGF0ZXMocEZvcm1PYmosIHRydWUsIHRydWUsIHRydWUpOwogICAgIG1fcE9iamVjdExpc3QtPm1fT2JqZWN0TGlzdC5BZGRUYWlsKHBGb3JtT2JqKTsKIH0KLUNQREZfSW1hZ2VPYmplY3QqIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6QWRkSW1hZ2UoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIENQREZfSW1hZ2UqIHBJbWFnZSwgRlhfQk9PTCBiSW5saW5lKQorQ1BERl9JbWFnZU9iamVjdCogQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRJbWFnZShDUERGX1N0cmVhbSogcFN0cmVhbSwgQ1BERl9JbWFnZSogcEltYWdlLCBib29sIGJJbmxpbmUpCiB7CiAgICAgaWYgKHBTdHJlYW0gPT0gTlVMTCAmJiBwSW1hZ2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTc2Myw3ICs3NjMsNyBAQAogICAgICAgICBwSW1hZ2VPYmotPm1fcEltYWdlID0gbmV3IENQREZfSW1hZ2UobV9wRG9jdW1lbnQpOwogICAgICAgICBwSW1hZ2VPYmotPm1fcEltYWdlLT5Mb2FkSW1hZ2VGKHBTdHJlYW0sIGJJbmxpbmUpOwogICAgIH0KLSAgICBTZXRHcmFwaGljU3RhdGVzKHBJbWFnZU9iaiwgcEltYWdlT2JqLT5tX3BJbWFnZS0+SXNNYXNrKCksIEZBTFNFLCBGQUxTRSk7CisgICAgU2V0R3JhcGhpY1N0YXRlcyhwSW1hZ2VPYmosIHBJbWFnZU9iai0+bV9wSW1hZ2UtPklzTWFzaygpLCBmYWxzZSwgZmFsc2UpOwogICAgIHBJbWFnZU9iai0+bV9NYXRyaXggPSBJbWFnZU1hdHJpeDsKICAgICBwSW1hZ2VPYmotPkNhbGNCb3VuZGluZ0JveCgpOwogICAgIG1fcE9iamVjdExpc3QtPm1fT2JqZWN0TGlzdC5BZGRUYWlsKHBJbWFnZU9iaik7CkBAIC04MTcsMjEgKzgxNywyMSBAQAogICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBZGRQYXRoT2JqZWN0KEZYRklMTF9XSU5ESU5HLCBGQUxTRSk7CisgICAgQWRkUGF0aE9iamVjdChGWEZJTExfV0lORElORywgZmFsc2UpOwogfQogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9GaWxsUGF0aE9sZCgpCiB7CiAgICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX1dJTkRJTkcsIEZBTFNFKTsKKyAgICBBZGRQYXRoT2JqZWN0KEZYRklMTF9XSU5ESU5HLCBmYWxzZSk7CiB9CiB2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VPRmlsbFBhdGgoKQogewogICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBZGRQYXRoT2JqZWN0KEZYRklMTF9BTFRFUk5BVEUsIEZBTFNFKTsKKyAgICBBZGRQYXRoT2JqZWN0KEZYRklMTF9BTFRFUk5BVEUsIGZhbHNlKTsKIH0KIHZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0R3JheV9GaWxsKCkKIHsKQEAgLTg1MCw3ICs4NTAsNyBAQAogICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSBHZXRTdHJpbmcoMCk7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwR1MgPSAoQ1BERl9EaWN0aW9uYXJ5KilGaW5kUmVzb3VyY2VPYmooRlhfQlNUUkMoIkV4dEdTdGF0ZSIpLCBuYW1lKTsKICAgICBpZiAocEdTID09IE5VTEwgfHwgcEdTLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgbV9iUmVzb3VyY2VNaXNzaW5nID0gVFJVRTsKKyAgICAgICAgbV9iUmVzb3VyY2VNaXNzaW5nID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtX3BDdXJTdGF0ZXMtPlByb2Nlc3NFeHRHUyhwR1MsIHRoaXMpOwpAQCAtOTM0LDcgKzkzNCw3IEBACiAgICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEFkZFBhdGhPYmplY3QoMCwgRkFMU0UpOworICAgIEFkZFBhdGhPYmplY3QoMCwgZmFsc2UpOwogfQogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TYXZlR3JhcGhTdGF0ZSgpCiB7CkBAIC05OTksMTQgKzk5OSwxNCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIEhhbmRsZV9DbG9zZVBhdGgoKTsKLSAgICBBZGRQYXRoT2JqZWN0KDAsIFRSVUUpOworICAgIEFkZFBhdGhPYmplY3QoMCwgdHJ1ZSk7CiB9CiB2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1N0cm9rZVBhdGgoKQogewogICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBZGRQYXRoT2JqZWN0KDAsIFRSVUUpOworICAgIEFkZFBhdGhPYmplY3QoMCwgdHJ1ZSk7CiB9CiB2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yX0ZpbGwoKQogewpAQCAtMTA2MCw3ICsxMDYwLDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAobnZhbHVlcyAhPSBuYXJncykgewotICAgICAgICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0gRmluZFBhdHRlcm4oR2V0U3RyaW5nKDApLCBGQUxTRSk7CisgICAgICAgIENQREZfUGF0dGVybiogcFBhdHRlcm4gPSBGaW5kUGF0dGVybihHZXRTdHJpbmcoMCksIGZhbHNlKTsKICAgICAgICAgaWYgKHBQYXR0ZXJuKSB7CiAgICAgICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRGaWxsUGF0dGVybihwUGF0dGVybiwgdmFsdWVzLCBudmFsdWVzKTsKICAgICAgICAgfQpAQCAtMTA5Myw3ICsxMDkzLDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAobnZhbHVlcyAhPSBuYXJncykgewotICAgICAgICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0gRmluZFBhdHRlcm4oR2V0U3RyaW5nKDApLCBGQUxTRSk7CisgICAgICAgIENQREZfUGF0dGVybiogcFBhdHRlcm4gPSBGaW5kUGF0dGVybihHZXRTdHJpbmcoMCksIGZhbHNlKTsKICAgICAgICAgaWYgKHBQYXR0ZXJuKSB7CiAgICAgICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRTdHJva2VQYXR0ZXJuKHBQYXR0ZXJuLCB2YWx1ZXMsIG52YWx1ZXMpOwogICAgICAgICB9CkBAIC0xMTExLDcgKzExMTEsNyBAQAogICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0gRmluZFBhdHRlcm4oR2V0U3RyaW5nKDApLCBUUlVFKTsKKyAgICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0gRmluZFBhdHRlcm4oR2V0U3RyaW5nKDApLCB0cnVlKTsKICAgICBpZiAocFBhdHRlcm4gPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTEyNyw3ICsxMTI3LDcgQEAKICAgICB9CiAgICAgQ1BERl9TaGFkaW5nT2JqZWN0KiBwT2JqID0gbmV3IENQREZfU2hhZGluZ09iamVjdDsKICAgICBwT2JqLT5tX3BTaGFkaW5nID0gcFNoYWRpbmc7Ci0gICAgU2V0R3JhcGhpY1N0YXRlcyhwT2JqLCBGQUxTRSwgRkFMU0UsIEZBTFNFKTsKKyAgICBTZXRHcmFwaGljU3RhdGVzKHBPYmosIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogICAgIHBPYmotPm1fTWF0cml4ID0gbV9wQ3VyU3RhdGVzLT5tX0NUTTsKICAgICBwT2JqLT5tX01hdHJpeC5Db25jYXQobV9tdENvbnRlbnRUb1VzZXIpOwogICAgIENGWF9GbG9hdFJlY3QgYmJveDsKQEAgLTEyMDYsNyArMTIwNiw3IEBACiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilGaW5kUmVzb3VyY2VPYmooRlhfQlNUUkMoIkZvbnQiKSwgbmFtZSk7CiAgICAgaWYgKHBGb250RGljdCA9PSBOVUxMIHx8IHBGb250RGljdC0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIG1fYlJlc291cmNlTWlzc2luZyA9IFRSVUU7CisgICAgICAgIG1fYlJlc291cmNlTWlzc2luZyA9IHRydWU7CiAgICAgICAgIHJldHVybiBDUERGX0ZvbnQ6OkdldFN0b2NrRm9udChtX3BEb2N1bWVudCwgRlhfQlNUUkMoIkhlbHZldGljYSIpKTsKICAgICB9CiAgICAgQ1BERl9Gb250KiBwRm9udCA9IG1fcERvY3VtZW50LT5Mb2FkRm9udChwRm9udERpY3QpOwpAQCAtMTIzOCwxNyArMTIzOCwxNyBAQAogICAgIH0KICAgICBDUERGX09iamVjdCogcENTT2JqID0gRmluZFJlc291cmNlT2JqKEZYX0JTVFJDKCJDb2xvclNwYWNlIiksIG5hbWUpOwogICAgIGlmIChwQ1NPYmogPT0gTlVMTCkgewotICAgICAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSBUUlVFOworICAgICAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSB0cnVlOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIG1fcERvY3VtZW50LT5Mb2FkQ29sb3JTcGFjZShwQ1NPYmopOwogfQotQ1BERl9QYXR0ZXJuKiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRQYXR0ZXJuKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBGWF9CT09MIGJTaGFkaW5nKQorQ1BERl9QYXR0ZXJuKiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRQYXR0ZXJuKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBib29sIGJTaGFkaW5nKQogewogICAgIENQREZfT2JqZWN0KiBwUGF0dGVybiA9IEZpbmRSZXNvdXJjZU9iaihiU2hhZGluZyA/IEZYX0JTVFJDKCJTaGFkaW5nIikgOiBGWF9CU1RSQygiUGF0dGVybiIpLCBuYW1lKTsKICAgICBpZiAocFBhdHRlcm4gPT0gTlVMTCB8fCAocFBhdHRlcm4tPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF0dGVybi0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pKSB7Ci0gICAgICAgIG1fYlJlc291cmNlTWlzc2luZyA9IFRSVUU7CisgICAgICAgIG1fYlJlc291cmNlTWlzc2luZyA9IHRydWU7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXR1cm4gbV9wRG9jdW1lbnQtPkxvYWRQYXR0ZXJuKHBQYXR0ZXJuLCBiU2hhZGluZywgJm1fcEN1clN0YXRlcy0+bV9QYXJlbnRNYXRyaXgpOwpAQCAtMTI4Nyw3ICsxMjg3LDcgQEAKICAgICB9CiAgICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dCA9IG5ldyBDUERGX1RleHRPYmplY3Q7CiAgICAgbV9wTGFzdFRleHRPYmplY3QgPSBwVGV4dDsKLSAgICBTZXRHcmFwaGljU3RhdGVzKHBUZXh0LCBUUlVFLCBUUlVFLCBUUlVFKTsKKyAgICBTZXRHcmFwaGljU3RhdGVzKHBUZXh0LCB0cnVlLCB0cnVlLCB0cnVlKTsKICAgICBpZiAodGV4dG1vZGUgJiYgdGV4dG1vZGUgIT0gMyAmJiB0ZXh0bW9kZSAhPSA0ICYmIHRleHRtb2RlICE9IDcpIHsKICAgICAgICAgRlhfRkxPQVQqIHBDVE0gPSBwVGV4dC0+bV9UZXh0U3RhdGUuR2V0TW9kaWZ5KCktPm1fQ1RNOwogICAgICAgICBwQ1RNWzBdID0gbV9wQ3VyU3RhdGVzLT5tX0NUTS5hOwpAQCAtMTUwMSw3ICsxNTAxLDcgQEAKICAgICBtX3BQYXRoUG9pbnRzW21fUGF0aFBvaW50Q291bnQgLSAxXS5tX1BvaW50WCA9IHg7CiAgICAgbV9wUGF0aFBvaW50c1ttX1BhdGhQb2ludENvdW50IC0gMV0ubV9Qb2ludFkgPSB5OwogfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZFBhdGhPYmplY3QoaW50IEZpbGxUeXBlLCBGWF9CT09MIGJTdHJva2UpCit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6QWRkUGF0aE9iamVjdChpbnQgRmlsbFR5cGUsIGJvb2wgYlN0cm9rZSkKIHsKICAgICBpbnQgUGF0aFBvaW50Q291bnQgPSBtX1BhdGhQb2ludENvdW50LCBQYXRoQ2xpcFR5cGUgPSBtX1BhdGhDbGlwVHlwZTsKICAgICBtX1BhdGhQb2ludENvdW50ID0gMDsKQEAgLTE1MTAsNyArMTUxMCw3IEBACiAgICAgICAgIGlmIChQYXRoUG9pbnRDb3VudCAmJiBQYXRoQ2xpcFR5cGUpIHsKICAgICAgICAgICAgIENQREZfUGF0aCBwYXRoOwogICAgICAgICAgICAgcGF0aC5OZXcoKS0+QXBwZW5kUmVjdCgwLCAwLCAwLCAwKTsKLSAgICAgICAgICAgIG1fcEN1clN0YXRlcy0+bV9DbGlwUGF0aC5BcHBlbmRQYXRoKHBhdGgsIEZYRklMTF9XSU5ESU5HLCBUUlVFKTsKKyAgICAgICAgICAgIG1fcEN1clN0YXRlcy0+bV9DbGlwUGF0aC5BcHBlbmRQYXRoKHBhdGgsIEZYRklMTF9XSU5ESU5HLCB0cnVlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTUyOSw3ICsxNTI5LDcgQEAKICAgICAgICAgcFBhdGhPYmotPm1fRmlsbFR5cGUgPSBGaWxsVHlwZTsKICAgICAgICAgcFBhdGhPYmotPm1fUGF0aCA9IFBhdGg7CiAgICAgICAgIHBQYXRoT2JqLT5tX01hdHJpeCA9IG1hdHJpeDsKLSAgICAgICAgU2V0R3JhcGhpY1N0YXRlcyhwUGF0aE9iaiwgVFJVRSwgRkFMU0UsIFRSVUUpOworICAgICAgICBTZXRHcmFwaGljU3RhdGVzKHBQYXRoT2JqLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgIHBQYXRoT2JqLT5DYWxjQm91bmRpbmdCb3goKTsKICAgICAgICAgbV9wT2JqZWN0TGlzdC0+bV9PYmplY3RMaXN0LkFkZFRhaWwocFBhdGhPYmopOwogICAgIH0KQEAgLTE1MzgsMTMgKzE1MzgsMTMgQEAKICAgICAgICAgICAgIFBhdGguVHJhbnNmb3JtKCZtYXRyaXgpOwogICAgICAgICAgICAgbWF0cml4LlNldElkZW50aXR5KCk7CiAgICAgICAgIH0KLSAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX0NsaXBQYXRoLkFwcGVuZFBhdGgoUGF0aCwgUGF0aENsaXBUeXBlLCBUUlVFKTsKKyAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX0NsaXBQYXRoLkFwcGVuZFBhdGgoUGF0aCwgUGF0aENsaXBUeXBlLCB0cnVlKTsKICAgICB9CiB9CiBDRlhfQnl0ZVN0cmluZyBfRlBERl9CeXRlU3RyaW5nRnJvbUhleChDRlhfQmluYXJ5QnVmJiBzcmNfYnVmKQogewogICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7Ci0gICAgRlhfQk9PTCBiRmlyc3QgPSBUUlVFOworICAgIGJvb2wgYkZpcnN0ID0gdHJ1ZTsKICAgICBpbnQgY29kZSA9IDA7CiAgICAgY29uc3QgdWludDhfdCogc3RyID0gc3JjX2J1Zi5HZXRCdWZmZXIoKTsKICAgICBGWF9EV09SRCBzaXplID0gc3JjX2J1Zi5HZXRTaXplKCk7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGFyc2VyX29sZC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGFyc2VyX29sZC5jcHAKaW5kZXggYjJjZmNlNy4uY2E1ZTlmZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhcnNlcl9vbGQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXJzZXJfb2xkLmNwcApAQCAtMTgsMTggKzE4LDE4IEBACiAgICAgIklJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJIgogICAgICJJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSSIKICAgICAiSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUkiOwotRlhfQk9PTCBfUERGX0hhc0ludmFsaWRPcENoYXIoY29uc3QgRlhfQ0hBUiogb3ApCitib29sIF9QREZfSGFzSW52YWxpZE9wQ2hhcihjb25zdCBGWF9DSEFSKiBvcCkKIHsKICAgICBpZighb3ApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHVpbnQ4X3QgY2g7CiAgICAgd2hpbGUoKGNoID0gKm9wKyspKSB7CiAgICAgICAgIGlmKF9QREZfT3BDaGFyVHlwZVtjaF0gPT0gJ0knKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBjbGFzcyBDUERGX1N0cmVhbVBhcnNlckF1dG9DbGVhcmVyIHsKICAgcHVibGljOgpAQCAtNjAsNyArNjAsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBtX3BTeW50YXgtPkdldFBvcygpOwogICAgICAgICAgICAgY2FzZSBDUERGX1N0cmVhbVBhcnNlcjo6S2V5d29yZDoKICAgICAgICAgICAgICAgICBpZighT25PcGVyYXRvcigoY2hhciopc3ludGF4LkdldFdvcmRCdWYoKSkgJiYgX1BERl9IYXNJbnZhbGlkT3BDaGFyKChjaGFyKilzeW50YXguR2V0V29yZEJ1ZigpKSkgewotICAgICAgICAgICAgICAgICAgICBtX2JBYm9ydCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIG1fYkFib3J0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1fYkFib3J0KSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3BTeW50YXgtPkdldFBvcygpOwpAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgcERpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiU3VidHlwZSIpLCBGWF9CU1RSQygiSW1hZ2UiKSk7Ci0gICAgQ1BERl9JbWFnZU9iamVjdCAqcEltZ09iaiA9IEFkZEltYWdlKHBTdHJlYW0sIE5VTEwsIFRSVUUpOworICAgIENQREZfSW1hZ2VPYmplY3QgKnBJbWdPYmogPSBBZGRJbWFnZShwU3RyZWFtLCBOVUxMLCB0cnVlKTsKICAgICBpZiAoIXBJbWdPYmopIHsKICAgICAgICAgaWYgKHBTdHJlYW0pIHsKICAgICAgICAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKQEAgLTE1OSw3ICsxNTksNyBAQAogICAgIGludCBsYXN0X3BvcyA9IG1fcFN5bnRheC0+R2V0UG9zKCk7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgQ1BERl9TdHJlYW1QYXJzZXI6OlN5bnRheFR5cGUgdHlwZSA9IG1fcFN5bnRheC0+UGFyc2VOZXh0RWxlbWVudCgpOwotICAgICAgICBGWF9CT09MIGJQcm9jZXNzZWQgPSBUUlVFOworICAgICAgICBib29sIGJQcm9jZXNzZWQgPSB0cnVlOwogICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgICAgIGNhc2UgQ1BERl9TdHJlYW1QYXJzZXI6OkVuZE9mRGF0YToKICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC0xOTgsNyArMTk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblBhcmFtcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQcm9jZXNzZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByb2Nlc3NlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZW4gPT0gMikgewpAQCAtMjA2LDEwICsyMDYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRQYXRoUmVjdChwYXJhbXNbMF0sIHBhcmFtc1sxXSwgcGFyYW1zWzJdLCBwYXJhbXNbM10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXJhbXMgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHJvY2Vzc2VkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByb2Nlc3NlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYlByb2Nlc3NlZCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgYlByb2Nlc3NlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChiUHJvY2Vzc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3BvcyA9IG1fcFN5bnRheC0+R2V0UG9zKCk7CkBAIC0yMjAsMTQgKzIyMCwxNCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoblBhcmFtcyA9PSA2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbnRlZ2VyOworICAgICAgICAgICAgICAgICAgICBib29sIGJJbnRlZ2VyOwogICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgIEZYX2F0b251bShDRlhfQnl0ZVN0cmluZ0MobV9wU3ludGF4LT5HZXRXb3JkQnVmKCksIG1fcFN5bnRheC0+R2V0V29yZFNpemUoKSksIGJJbnRlZ2VyLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICBwYXJhbXNbblBhcmFtcysrXSA9IGJJbnRlZ2VyID8gKEZYX0ZMT0FUKXZhbHVlIDogKihGWF9GTE9BVCopJnZhbHVlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJQcm9jZXNzZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBiUHJvY2Vzc2VkID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFiUHJvY2Vzc2VkKSB7CiAgICAgICAgICAgICBtX3BTeW50YXgtPlNldFBvcyhsYXN0X3Bvcyk7CkBAIC0yNzksNyArMjc5LDcgQEAKICAgICAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zKTsKIEZYX0RXT1JEIF9BODVEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CiBGWF9EV09SRCBfSGV4RGVjb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOwotRlhfRFdPUkQgRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKEZYX0JPT0wgYkxaVywgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENQREZfRGljdGlvbmFyeSogcFBhcmFtcywKK0ZYX0RXT1JEIEZQREZBUElfRmxhdGVPckxaV0RlY29kZShib29sIGJMWlcsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CiBGWF9EV09SRCBQREZfRGVjb2RlSW5saW5lU3RyZWFtKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIGxpbWl0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIENGWF9CeXRlU3RyaW5nJiBkZWNvZGVyLApAQCAtMjk2LDEwICsyOTYsMTAgQEAKICAgICAgICAgcmV0dXJuIF9IZXhEZWNvZGUoc3JjX2J1ZiwgbGltaXQsIGRlc3RfYnVmLCBkZXN0X3NpemUpOwogICAgIH0KICAgICBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiRmxhdGVEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJGbCIpKSB7Ci0gICAgICAgIHJldHVybiBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoRkFMU0UsIHNyY19idWYsIGxpbWl0LCBwUGFyYW0sIGRlc3Rfc2l6ZSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7CisgICAgICAgIHJldHVybiBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoZmFsc2UsIHNyY19idWYsIGxpbWl0LCBwUGFyYW0sIGRlc3Rfc2l6ZSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7CiAgICAgfQogICAgIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJMWldEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJMWlciKSkgewotICAgICAgICByZXR1cm4gRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKFRSVUUsIHNyY19idWYsIGxpbWl0LCBwUGFyYW0sIDAsIGRlc3RfYnVmLCBkZXN0X3NpemUpOworICAgICAgICByZXR1cm4gRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKHRydWUsIHNyY19idWYsIGxpbWl0LCBwUGFyYW0sIDAsIGRlc3RfYnVmLCBkZXN0X3NpemUpOwogICAgIH0KICAgICBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiRENURGVjb2RlIikgfHwgZGVjb2RlciA9PSBGWF9CU1RSQygiRENUIikpIHsKICAgICAgICAgSUNvZGVjX1NjYW5saW5lRGVjb2RlciogcERlY29kZXIgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+Q3JlYXRlRGVjb2RlcigKQEAgLTMxMyw3ICszMTMsNyBAQAogICAgIGRlc3RfYnVmID0gMDsKICAgICByZXR1cm4gKEZYX0RXT1JEKSAtIDE7CiB9Ci1DUERGX1N0cmVhbSogQ1BERl9TdHJlYW1QYXJzZXI6OlJlYWRJbmxpbmVTdHJlYW0oQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9PYmplY3QqIHBDU09iaiwgRlhfQk9PTCBiRGVjb2RlKQorQ1BERl9TdHJlYW0qIENQREZfU3RyZWFtUGFyc2VyOjpSZWFkSW5saW5lU3RyZWFtKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfT2JqZWN0KiBwQ1NPYmosIGJvb2wgYkRlY29kZSkKIHsKICAgICBpZiAobV9Qb3MgPT0gbV9TaXplKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAgICAgICAgIG1fcExhc3RPYmogPSBOVUxMOwogICAgIH0KICAgICBtX1dvcmRTaXplID0gMDsKLSAgICBGWF9CT09MIGJJc051bWJlciA9IFRSVUU7CisgICAgYm9vbCBiSXNOdW1iZXIgPSB0cnVlOwogICAgIGlmIChtX1BvcyA+PSBtX1NpemUpIHsKICAgICAgICAgcmV0dXJuIEVuZE9mRGF0YTsKICAgICB9CkBAIC00ODUsNyArNDg1LDcgQEAKICAgICAgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHR5cGUgIT0gJ04nKSB7Ci0gICAgICAgICAgICBiSXNOdW1iZXIgPSBGQUxTRTsKKyAgICAgICAgICAgIGJJc051bWJlciA9IGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTA2LDcgKzUwNiw3IEBACiAgICAgfQogICAgIGlmIChtX1dvcmRTaXplID09IDQpIHsKICAgICAgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX1RSVUUpIHsKLSAgICAgICAgICAgIG1fcExhc3RPYmogPSBDUERGX0Jvb2xlYW46OkNyZWF0ZShUUlVFKTsKKyAgICAgICAgICAgIG1fcExhc3RPYmogPSBDUERGX0Jvb2xlYW46OkNyZWF0ZSh0cnVlKTsKICAgICAgICAgICAgIHJldHVybiBPdGhlcnM7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX05VTEwpIHsKQEAgLTUxNSw3ICs1MTUsNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtX1dvcmRTaXplID09IDUpIHsKICAgICAgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX0ZBTFMgJiYgbV9Xb3JkQnVmZmVyWzRdID09ICdlJykgewotICAgICAgICAgICAgbV9wTGFzdE9iaiA9IENQREZfQm9vbGVhbjo6Q3JlYXRlKEZBTFNFKTsKKyAgICAgICAgICAgIG1fcExhc3RPYmogPSBDUERGX0Jvb2xlYW46OkNyZWF0ZShmYWxzZSk7CiAgICAgICAgICAgICByZXR1cm4gT3RoZXJzOwogICAgICAgICB9CiAgICAgfQpAQCAtNTg0LDkgKzU4NCw5IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1DUERGX09iamVjdCogQ1BERl9TdHJlYW1QYXJzZXI6OlJlYWROZXh0T2JqZWN0KEZYX0JPT0wgYkFsbG93TmVzdGVkQXJyYXksIEZYX0JPT0wgYkluQXJyYXkpCitDUERGX09iamVjdCogQ1BERl9TdHJlYW1QYXJzZXI6OlJlYWROZXh0T2JqZWN0KGJvb2wgYkFsbG93TmVzdGVkQXJyYXksIGJvb2wgYkluQXJyYXkpCiB7Ci0gICAgRlhfQk9PTCBiSXNOdW1iZXI7CisgICAgYm9vbCBiSXNOdW1iZXI7CiAgICAgR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKICAgICBpZiAobV9Xb3JkU2l6ZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNjA0LDcgKzYwNCw3IEBACiAgICAgfQogICAgIGlmIChmaXJzdF9jaGFyID09ICc8JykgewogICAgICAgICBpZiAobV9Xb3JkU2l6ZSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1BERl9TdHJpbmc6OkNyZWF0ZShSZWFkSGV4U3RyaW5nKCksIFRSVUUpOworICAgICAgICAgICAgcmV0dXJuIENQREZfU3RyaW5nOjpDcmVhdGUoUmVhZEhleFN0cmluZygpLCB0cnVlKTsKICAgICAgICAgfQogICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKICAgICAgICAgd2hpbGUgKDEpIHsKQEAgLTYyMSw3ICs2MjEsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5ID0gUERGX05hbWVEZWNvZGUoQ0ZYX0J5dGVTdHJpbmdDKG1fV29yZEJ1ZmZlciArIDEsIG1fV29yZFNpemUgLSAxKSk7Ci0gICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IFJlYWROZXh0T2JqZWN0KFRSVUUpOworICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBSZWFkTmV4dE9iamVjdCh0cnVlKTsKICAgICAgICAgICAgIGlmIChwT2JqID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpZiAocERpY3QpIHsKICAgICAgICAgICAgICAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKQEAgLTY0Miw3ICs2NDIsNyBAQAogICAgICAgICB9CiAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOwogICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBSZWFkTmV4dE9iamVjdChiQWxsb3dOZXN0ZWRBcnJheSwgVFJVRSk7CisgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IFJlYWROZXh0T2JqZWN0KGJBbGxvd05lc3RlZEFycmF5LCB0cnVlKTsKICAgICAgICAgICAgIGlmIChwT2JqID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpZiAobV9Xb3JkU2l6ZSA9PSAwIHx8IG1fV29yZEJ1ZmZlclswXSA9PSAnXScpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBBcnJheTsKQEAgLTY1NywyMiArNjU3LDIyIEBACiAgICAgfQogICAgIGlmIChtX1dvcmRTaXplID09IDQpIHsKICAgICAgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX1RSVUUpIHsKLSAgICAgICAgICAgIHJldHVybiBDUERGX0Jvb2xlYW46OkNyZWF0ZShUUlVFKTsKKyAgICAgICAgICAgIHJldHVybiBDUERGX0Jvb2xlYW46OkNyZWF0ZSh0cnVlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoKihGWF9EV09SRCopbV9Xb3JkQnVmZmVyID09IEZYRFdPUkRfTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIENQREZfTnVsbDo6Q3JlYXRlKCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1fV29yZFNpemUgPT0gNSkgewogICAgICAgICBpZiAoKihGWF9EV09SRCopbV9Xb3JkQnVmZmVyID09IEZYRFdPUkRfRkFMUyAmJiBtX1dvcmRCdWZmZXJbNF0gPT0gJ2UnKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1BERl9Cb29sZWFuOjpDcmVhdGUoRkFMU0UpOworICAgICAgICAgICAgcmV0dXJuIENQREZfQm9vbGVhbjo6Q3JlYXRlKGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gTlVMTDsKIH0KLXZvaWQgQ1BERl9TdHJlYW1QYXJzZXI6OkdldE5leHRXb3JkKEZYX0JPT0wmIGJJc051bWJlcikKK3ZvaWQgQ1BERl9TdHJlYW1QYXJzZXI6OkdldE5leHRXb3JkKGJvb2wmIGJJc051bWJlcikKIHsKICAgICBtX1dvcmRTaXplID0gMDsKLSAgICBiSXNOdW1iZXIgPSBUUlVFOworICAgIGJJc051bWJlciA9IHRydWU7CiAgICAgaWYgKG1fU2l6ZSA8PSBtX1BvcykgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNzAxLDcgKzcwMSw3IEBACiAgICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwogICAgIH0KICAgICBpZiAodHlwZSA9PSAnRCcpIHsKLSAgICAgICAgYklzTnVtYmVyID0gRkFMU0U7CisgICAgICAgIGJJc051bWJlciA9IGZhbHNlOwogICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwogICAgICAgICBpZiAoY2ggPT0gJy8nKSB7CiAgICAgICAgICAgICB3aGlsZSAoMSkgewpAQCAtNzQ2LDcgKzc0Niw3IEBACiAgICAgICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwogICAgICAgICB9CiAgICAgICAgIGlmICh0eXBlICE9ICdOJykgewotICAgICAgICAgICAgYklzTnVtYmVyID0gRkFMU0U7CisgICAgICAgICAgICBiSXNOdW1iZXIgPSBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9TaXplIDw9IG1fUG9zKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC04NjIsNyArODYyLDcgQEAKICAgICB9CiAgICAgaW50IGNoID0gbV9wQnVmW21fUG9zKytdOwogICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7Ci0gICAgRlhfQk9PTCBiRmlyc3QgPSBUUlVFOworICAgIGJvb2wgYkZpcnN0ID0gdHJ1ZTsKICAgICBpbnQgY29kZSA9IDA7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKGNoID09ICc+JykgewpAQCAtOTQ3LDcgKzk0Nyw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbV9wT2JqZWN0cyA9IHBQYWdlOwotICAgIG1fYkZvcm0gPSBGQUxTRTsKKyAgICBtX2JGb3JtID0gZmFsc2U7CiAgICAgaWYgKHBPcHRpb25zKSB7CiAgICAgICAgIG1fT3B0aW9ucyA9ICpwT3B0aW9uczsKICAgICB9CkBAIC05NjIsNyArOTYyLDcgQEAKICAgICBpZiAocENvbnRlbnQtPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7CiAgICAgICAgIG1fblN0cmVhbXMgPSAwOwogICAgICAgICBtX3BTaW5nbGVTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgICAgIG1fcFNpbmdsZVN0cmVhbS0+TG9hZEFsbERhdGEoKENQREZfU3RyZWFtKilwQ29udGVudCwgRkFMU0UpOworICAgICAgICBtX3BTaW5nbGVTdHJlYW0tPkxvYWRBbGxEYXRhKChDUERGX1N0cmVhbSopcENvbnRlbnQsIGZhbHNlKTsKICAgICB9IGVsc2UgaWYgKHBDb250ZW50LT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CiAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwQ29udGVudDsKICAgICAgICAgbV9uU3RyZWFtcyA9IHBBcnJheS0+R2V0Q291bnQoKTsKQEAgLTk4MSw3ICs5ODEsNyBAQAogewogICAgIG1fcFR5cGUzQ2hhciA9IHBUeXBlM0NoYXI7CiAgICAgbV9wT2JqZWN0cyA9IHBGb3JtOwotICAgIG1fYkZvcm0gPSBUUlVFOworICAgIG1fYkZvcm0gPSB0cnVlOwogICAgIENGWF9BZmZpbmVNYXRyaXggZm9ybV9tYXRyaXggPSBwRm9ybS0+bV9wRm9ybURpY3QtPkdldE1hdHJpeChGWF9CU1RSQygiTWF0cml4IikpOwogICAgIGlmIChwR3JhcGhpY1N0YXRlcykgewogICAgICAgICBmb3JtX21hdHJpeC5Db25jYXQocEdyYXBoaWNTdGF0ZXMtPm1fQ1RNKTsKQEAgLTEwMTEsNyArMTAxMSw3IEBACiAgICAgbV9wUGFyc2VyLT5HZXRDdXJTdGF0ZXMoKS0+bV9DVE0gPSBmb3JtX21hdHJpeDsKICAgICBtX3BQYXJzZXItPkdldEN1clN0YXRlcygpLT5tX1BhcmVudE1hdHJpeCA9IGZvcm1fbWF0cml4OwogICAgIGlmIChDbGlwUGF0aC5Ob3ROdWxsKCkpIHsKLSAgICAgICAgbV9wUGFyc2VyLT5HZXRDdXJTdGF0ZXMoKS0+bV9DbGlwUGF0aC5BcHBlbmRQYXRoKENsaXBQYXRoLCBGWEZJTExfV0lORElORywgVFJVRSk7CisgICAgICAgIG1fcFBhcnNlci0+R2V0Q3VyU3RhdGVzKCktPm1fQ2xpcFBhdGguQXBwZW5kUGF0aChDbGlwUGF0aCwgRlhGSUxMX1dJTkRJTkcsIHRydWUpOwogICAgIH0KICAgICBpZiAocEZvcm0tPm1fVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfR1JPVVApIHsKICAgICAgICAgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwRGF0YSA9IG1fcFBhcnNlci0+R2V0Q3VyU3RhdGVzKCktPm1fR2VuZXJhbFN0YXRlLkdldE1vZGlmeSgpOwpAQCAtMTAyMyw5ICsxMDIzLDkgQEAKICAgICBtX25TdHJlYW1zID0gMDsKICAgICBtX3BTaW5nbGVTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW1BY2M7CiAgICAgaWYgKHBGb3JtLT5tX3BEb2N1bWVudCkgewotICAgICAgICBtX3BTaW5nbGVTdHJlYW0tPkxvYWRBbGxEYXRhKHBGb3JtLT5tX3BGb3JtU3RyZWFtLCBGQUxTRSk7CisgICAgICAgIG1fcFNpbmdsZVN0cmVhbS0+TG9hZEFsbERhdGEocEZvcm0tPm1fcEZvcm1TdHJlYW0sIGZhbHNlKTsKICAgICB9IGVsc2UgewotICAgICAgICBtX3BTaW5nbGVTdHJlYW0tPkxvYWRBbGxEYXRhKHBGb3JtLT5tX3BGb3JtU3RyZWFtLCBGQUxTRSk7CisgICAgICAgIG1fcFNpbmdsZVN0cmVhbS0+TG9hZEFsbERhdGEocEZvcm0tPm1fcEZvcm1TdHJlYW0sIGZhbHNlKTsKICAgICB9CiAgICAgbV9wRGF0YSA9ICh1aW50OF90KiltX3BTaW5nbGVTdHJlYW0tPkdldERhdGEoKTsKICAgICBtX1NpemUgPSBtX3BTaW5nbGVTdHJlYW0tPkdldFNpemUoKTsKQEAgLTEwNzAsNyArMTA3MCw3IEBACiAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcENvbnRlbnQgPSBtX3BPYmplY3RzLT5tX3BGb3JtRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkNvbnRlbnRzIikpOwogICAgICAgICAgICAgICAgIG1fcFN0cmVhbUFycmF5W21fQ3VycmVudE9mZnNldF0gPSBuZXcgQ1BERl9TdHJlYW1BY2M7CiAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW1PYmogPSAoQ1BERl9TdHJlYW0qKShwQ29udGVudCA/IHBDb250ZW50LT5HZXRFbGVtZW50VmFsdWUobV9DdXJyZW50T2Zmc2V0KSA6IE5VTEwpOwotICAgICAgICAgICAgICAgIG1fcFN0cmVhbUFycmF5W21fQ3VycmVudE9mZnNldF0tPkxvYWRBbGxEYXRhKHBTdHJlYW1PYmosIEZBTFNFKTsKKyAgICAgICAgICAgICAgICBtX3BTdHJlYW1BcnJheVttX0N1cnJlbnRPZmZzZXRdLT5Mb2FkQWxsRGF0YShwU3RyZWFtT2JqLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgbV9DdXJyZW50T2Zmc2V0ICsrOwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGF0dGVybi5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGF0dGVybi5jcHAKaW5kZXggNDhiM2E0MC4uODI5MmQyZCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhdHRlcm4uY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXR0ZXJuLmNwcApAQCAtOCw3ICs4LDcgQEAKICNpbmNsdWRlICJwYWdlaW50LmgiCiAKIENQREZfUGF0dGVybjo6Q1BERl9QYXR0ZXJuKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBQYXJlbnRNYXRyaXgpIDoKLSAgICBtX3BQYXR0ZXJuT2JqKE5VTEwpLCBtX1BhdHRlcm5UeXBlKFBBVFRFUk5fVElMSU5HKSwgbV9wRG9jdW1lbnQoTlVMTCksIG1fYkZvcmNlQ2xlYXIoRkFMU0UpCisgICAgbV9wUGF0dGVybk9iaihOVUxMKSwgbV9QYXR0ZXJuVHlwZShQQVRURVJOX1RJTElORyksIG1fcERvY3VtZW50KE5VTEwpLCBtX2JGb3JjZUNsZWFyKGZhbHNlKQogewogICAgIGlmIChwUGFyZW50TWF0cml4KSB7CiAgICAgICAgIG1fUGFyZW50TWF0cml4ID0gKnBQYXJlbnRNYXRyaXg7CkBAIC0zNywyOCArMzcsMjggQEAKICAgICBkZWxldGUgbV9wRm9ybTsKICAgICBtX3BGb3JtID0gTlVMTDsKIH0KLUZYX0JPT0wgQ1BERl9UaWxpbmdQYXR0ZXJuOjpMb2FkKCkKK2Jvb2wgQ1BERl9UaWxpbmdQYXR0ZXJuOjpMb2FkKCkKIHsKICAgICBpZiAobV9wRm9ybSAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcFBhdHRlcm5PYmotPkdldERpY3QoKTsKICAgICBpZiAocERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9iQ29sb3JlZCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQYWludFR5cGUiKSkgPT0gMTsKICAgICBtX1hTdGVwID0gKEZYX0ZMT0FUKUZYU1lTX2ZhYnMocERpY3QtPkdldE51bWJlcihGWF9CU1RSQygiWFN0ZXAiKSkpOwogICAgIG1fWVN0ZXAgPSAoRlhfRkxPQVQpRlhTWVNfZmFicyhwRGljdC0+R2V0TnVtYmVyKEZYX0JTVFJDKCJZU3RlcCIpKSk7CiAgICAgaWYgKG1fcFBhdHRlcm5PYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IChDUERGX1N0cmVhbSopbV9wUGF0dGVybk9iajsKICAgICBtX3BGb3JtID0gbmV3IENQREZfRm9ybShtX3BEb2N1bWVudCwgTlVMTCwgcFN0cmVhbSk7CiAgICAgbV9wRm9ybS0+UGFyc2VDb250ZW50KE5VTEwsICZtX1BhcmVudE1hdHJpeCwgTlVMTCwgTlVMTCk7CiAgICAgbV9CQm94ID0gcERpY3QtPkdldFJlY3QoRlhfQlNUUkMoIkJCb3giKSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1DUERGX1NoYWRpbmdQYXR0ZXJuOjpDUERGX1NoYWRpbmdQYXR0ZXJuKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwgRlhfQk9PTCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcGFyZW50TWF0cml4KSA6IENQREZfUGF0dGVybihwYXJlbnRNYXRyaXgpCitDUERGX1NoYWRpbmdQYXR0ZXJuOjpDUERGX1NoYWRpbmdQYXR0ZXJuKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwgYm9vbCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcGFyZW50TWF0cml4KSA6IENQREZfUGF0dGVybihwYXJlbnRNYXRyaXgpCiB7CiAgICAgbV9QYXR0ZXJuVHlwZSA9IFBBVFRFUk5fU0hBRElORzsKICAgICBtX3BQYXR0ZXJuT2JqID0gYlNoYWRpbmcgPyBOVUxMIDogcFBhdHRlcm5PYmo7CkBAIC0xMDIsMTQgKzEwMiwxNCBAQAogICAgIG1fcENvdW50ZWRDUyA9IE5VTEw7CiAgICAgbV9uRnVuY3MgPSAwOwogfQotRlhfQk9PTCBDUERGX1NoYWRpbmdQYXR0ZXJuOjpMb2FkKCkKK2Jvb2wgQ1BERl9TaGFkaW5nUGF0dGVybjo6TG9hZCgpCiB7CiAgICAgaWYgKG1fU2hhZGluZ1R5cGUgIT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSogcFNoYWRpbmdEaWN0ID0gbV9wU2hhZGluZ09iaiA/IG1fcFNoYWRpbmdPYmotPkdldERpY3QoKSA6IE5VTEw7CiAgICAgaWYgKHBTaGFkaW5nRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9uRnVuY3MpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25GdW5jczsgaSArKykKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgIH0KICAgICBDUERGX09iamVjdCogcENTT2JqID0gcFNoYWRpbmdEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSk7CiAgICAgaWYgKHBDU09iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX0RvY1BhZ2VEYXRhKiBwRG9jUGFnZURhdGEgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKICAgICBtX3BDUyA9IHBEb2NQYWdlRGF0YS0+R2V0Q29sb3JTcGFjZShwQ1NPYmosIE5VTEwpOwpAQCAtMTQxLDE0ICsxNDEsMTQgQEAKICAgICAgICAgbV9wQ291bnRlZENTID0gcERvY1BhZ2VEYXRhLT5GaW5kQ29sb3JTcGFjZVB0cihtX3BDUy0+R2V0QXJyYXkoKSk7CiAgICAgfQogICAgIG1fU2hhZGluZ1R5cGUgPSBwU2hhZGluZ0RpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlNoYWRpbmdUeXBlIikpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX1NoYWRpbmdQYXR0ZXJuOjpSZWxvYWQoKQorYm9vbCBDUERGX1NoYWRpbmdQYXR0ZXJuOjpSZWxvYWQoKQogewogICAgIENsZWFyKCk7CiAgICAgcmV0dXJuIExvYWQoKTsKIH0KLUZYX0JPT0wgQ1BERl9NZXNoU3RyZWFtOjpMb2FkKENQREZfU3RyZWFtKiBwU2hhZGluZ1N0cmVhbSwgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywgaW50IG5GdW5jcywgQ1BERl9Db2xvclNwYWNlKiBwQ1MpCitib29sIENQREZfTWVzaFN0cmVhbTo6TG9hZChDUERGX1N0cmVhbSogcFNoYWRpbmdTdHJlYW0sIENQREZfRnVuY3Rpb24qKiBwRnVuY3MsIGludCBuRnVuY3MsIENQREZfQ29sb3JTcGFjZSogcENTKQogewogICAgIG1fU3RyZWFtLkxvYWRBbGxEYXRhKHBTaGFkaW5nU3RyZWFtKTsKICAgICBtX0JpdFN0cmVhbS5Jbml0KG1fU3RyZWFtLkdldERhdGEoKSwgbV9TdHJlYW0uR2V0U2l6ZSgpKTsKQEAgLTE2MCwyMSArMTYwLDIxIEBACiAgICAgbV9uQ29tcEJpdHMgPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpKTsKICAgICBtX25GbGFnQml0cyA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyRmxhZyIpKTsKICAgICBpZiAoIW1fbkNvb3JkQml0cyB8fCAhbV9uQ29tcEJpdHMpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGludCBuQ29tcHMgPSBwQ1MtPkNvdW50Q29tcG9uZW50cygpOwogICAgIGlmIChuQ29tcHMgPiA4KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX25Db21wcyA9IG5GdW5jcyA/IDEgOiBuQ29tcHM7CiAgICAgaWYgKCgoaW50KW1fbkNvbXBzIDwgMCkgfHwgbV9uQ29tcHMgPiA4KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX0Nvb3JkTWF4ID0gbV9uQ29vcmRCaXRzID09IDMyID8gLTEgOiAoMSA8PCBtX25Db29yZEJpdHMpIC0gMTsKICAgICBtX0NvbXBNYXggPSAoMSA8PCBtX25Db21wQml0cykgLSAxOwogICAgIENQREZfQXJyYXkqIHBEZWNvZGUgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkRlY29kZSIpKTsKICAgICBpZiAocERlY29kZSA9PSBOVUxMIHx8IHBEZWNvZGUtPkdldENvdW50KCkgIT0gNCArIG1fbkNvbXBzICogMikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV94bWluID0gcERlY29kZS0+R2V0TnVtYmVyKDApOwogICAgIG1feG1heCA9IHBEZWNvZGUtPkdldE51bWJlcigxKTsKQEAgLTE4NCw3ICsxODQsNyBAQAogICAgICAgICBtX0NvbG9yTWluW2ldID0gcERlY29kZS0+R2V0TnVtYmVyKGkgKiAyICsgNCk7CiAgICAgICAgIG1fQ29sb3JNYXhbaV0gPSBwRGVjb2RlLT5HZXROdW1iZXIoaSAqIDIgKyA1KTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBGWF9EV09SRCBDUERGX01lc2hTdHJlYW06OkdldEZsYWcoKQogewpAQCAtMjMxLDE4ICsyMzEsMTggQEAKICAgICBtX0JpdFN0cmVhbS5CeXRlQWxpZ24oKTsKICAgICByZXR1cm4gZmxhZzsKIH0KLUZYX0JPT0wgQ1BERl9NZXNoU3RyZWFtOjpHZXRWZXJ0ZXhSb3coQ1BERl9NZXNoVmVydGV4KiB2ZXJ0ZXgsIGludCBjb3VudCwgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJCaXRtYXApCitib29sIENQREZfTWVzaFN0cmVhbTo6R2V0VmVydGV4Um93KENQREZfTWVzaFZlcnRleCogdmVydGV4LCBpbnQgY291bnQsIENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyQml0bWFwKQogewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKICAgICAgICAgaWYgKG1fQml0U3RyZWFtLklzRU9GKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBHZXRDb29yZHModmVydGV4W2ldLngsIHZlcnRleFtpXS55KTsKICAgICAgICAgcE9iamVjdDJCaXRtYXAtPlRyYW5zZm9ybSh2ZXJ0ZXhbaV0ueCwgdmVydGV4W2ldLnkpOwogICAgICAgICBHZXRDb2xvcih2ZXJ0ZXhbaV0uciwgdmVydGV4W2ldLmcsIHZlcnRleFtpXS5iKTsKICAgICAgICAgbV9CaXRTdHJlYW0uQnl0ZUFsaWduKCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQ0ZYX0Zsb2F0UmVjdCBfR2V0U2hhZGluZ0JCb3goQ1BERl9TdHJlYW0qIHBTdHJlYW0sIGludCB0eXBlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywgaW50IG5GdW5jcywgQ1BERl9Db2xvclNwYWNlKiBwQ1MpCkBAIC0yNTUsOCArMjU1LDggQEAKICAgICAgICAgcmV0dXJuIENGWF9GbG9hdFJlY3QoMCwgMCwgMCwgMCk7CiAgICAgfQogICAgIENGWF9GbG9hdFJlY3QgcmVjdDsKLSAgICBGWF9CT09MIGJTdGFydGVkID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBiR291cmF1ZCA9IHR5cGUgPT0gNCB8fCB0eXBlID09IDU7CisgICAgYm9vbCBiU3RhcnRlZCA9IGZhbHNlOworICAgIGJvb2wgYkdvdXJhdWQgPSB0eXBlID09IDQgfHwgdHlwZSA9PSA1OwogICAgIGludCBmdWxsX3BvaW50X2NvdW50ID0gdHlwZSA9PSA3ID8gMTYgOiAodHlwZSA9PSA2ID8gMTIgOiAxKTsKICAgICBpbnQgZnVsbF9jb2xvcl9jb3VudCA9ICh0eXBlID09IDYgfHwgdHlwZSA9PSA3KSA/IDQgOiAxOwogICAgIHdoaWxlICghc3RyZWFtLm1fQml0U3RyZWFtLklzRU9GKCkpIHsKQEAgLTI3Niw3ICsyNzYsNyBAQAogICAgICAgICAgICAgICAgIHJlY3QuVXBkYXRlUmVjdCh4LCB5KTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmVjdC5Jbml0UmVjdCh4LCB5KTsKLSAgICAgICAgICAgICAgICBiU3RhcnRlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYlN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHN0cmVhbS5tX0JpdFN0cmVhbS5Ta2lwQml0cyhzdHJlYW0ubV9uQ29tcHMgKiBzdHJlYW0ubV9uQ29tcEJpdHMgKiBjb2xvcl9jb3VudCk7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9wYWdlaW50LmggYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9wYWdlaW50LmgKaW5kZXggOGNkMzkzYy4uMDIxYjMzYSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvcGFnZWludC5oCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL3BhZ2VpbnQuaApAQCAtMjEsNyArMjEsNyBAQAogICAgIENQREZfU3RyZWFtUGFyc2VyKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpOwogICAgIH5DUERGX1N0cmVhbVBhcnNlcigpOwogCi0gICAgQ1BERl9TdHJlYW0qCQlSZWFkSW5saW5lU3RyZWFtKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfT2JqZWN0KiBwQ1NPYmosIEZYX0JPT0wgYkRlY29kZSk7CisgICAgQ1BERl9TdHJlYW0qCQlSZWFkSW5saW5lU3RyZWFtKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfT2JqZWN0KiBwQ1NPYmosIGJvb2wgYkRlY29kZSk7CiAgICAgdHlwZWRlZiBlbnVtIHsgRW5kT2ZEYXRhLCBOdW1iZXIsIEtleXdvcmQsIE5hbWUsIE90aGVycyB9IFN5bnRheFR5cGU7CiAKICAgICBTeW50YXhUeXBlCQkJUGFyc2VOZXh0RWxlbWVudCgpOwpAQCAtNDgsMTAgKzQ4LDEwIEBACiAgICAgICAgIG1fUG9zID0gcG9zOwogICAgIH0KIAotICAgIENQREZfT2JqZWN0KgkJUmVhZE5leHRPYmplY3QoRlhfQk9PTCBiQWxsb3dOZXN0ZWRBcnJheSA9IEZBTFNFLCBGWF9CT09MIGJJbkFycmF5ID0gRkFMU0UpOworICAgIENQREZfT2JqZWN0KgkJUmVhZE5leHRPYmplY3QoYm9vbCBiQWxsb3dOZXN0ZWRBcnJheSA9IGZhbHNlLCBib29sIGJJbkFycmF5ID0gZmFsc2UpOwogICAgIHZvaWQJCQkJU2tpcFBhdGhPYmplY3QoKTsKIHByb3RlY3RlZDoKLSAgICB2b2lkCQkJCUdldE5leHRXb3JkKEZYX0JPT0wmIGJJc051bWJlcik7CisgICAgdm9pZAkJCQlHZXROZXh0V29yZChib29sJiBiSXNOdW1iZXIpOwogICAgIENGWF9CeXRlU3RyaW5nCQlSZWFkU3RyaW5nKCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcJCVJlYWRIZXhTdHJpbmcoKTsKICAgICBjb25zdCB1aW50OF90KgkJbV9wQnVmOwpAQCAtMTA1LDcgKzEwNSw3IEBACiAgICAgaW50CQkJbV9UeXBlOwogICAgIHVuaW9uIHsKICAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgIEZYX0JPT0wJCW1fYkludGVnZXI7CisgICAgICAgICAgICBib29sCQltX2JJbnRlZ2VyOwogICAgICAgICAgICAgdW5pb24gewogICAgICAgICAgICAgICAgIGludAkJbV9JbnRlZ2VyOwogICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG1fRmxvYXQ7CkBAIC0xMzcsMTAgKzEzNywxMCBAQAogICAgICAgICBpbnQgbGV2ZWwpOwogICAgIH5DUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIoKTsKIAotICAgIEZYX0JPT0wgU2hvdWxkQWJvcnQoKSBjb25zdCB7IHJldHVybiBtX2JBYm9ydDsgfQorICAgIGJvb2wgU2hvdWxkQWJvcnQoKSBjb25zdCB7IHJldHVybiBtX2JBYm9ydDsgfQogICAgIENQREZfUGFnZU9iamVjdHMqIEdldE9iamVjdExpc3QoKSBjb25zdCB7IHJldHVybiBtX3BPYmplY3RMaXN0OyB9CiAgICAgQ1BERl9BbGxTdGF0ZXMqIEdldEN1clN0YXRlcygpIGNvbnN0IHsgcmV0dXJuIG1fcEN1clN0YXRlcy5nZXQoKTsgfQotICAgIEZYX0JPT0wgSXNDb2xvcmVkKCkgY29uc3QgeyByZXR1cm4gbV9iQ29sb3JlZDsgfQorICAgIGJvb2wgSXNDb2xvcmVkKCkgY29uc3QgeyByZXR1cm4gbV9iQ29sb3JlZDsgfQogICAgIGNvbnN0IEZYX0ZMT0FUKiBHZXRUeXBlM0RhdGEoKSBjb25zdCB7IHJldHVybiBtX1R5cGUzRGF0YTsgfQogCiAgICAgdm9pZAkJCQlBZGROdW1iZXJQYXJhbShjb25zdCBGWF9DSEFSKiBzdHIsIGludCBsZW4pOwpAQCAtMTU2LDcgKzE1Niw3IEBACiAgICAgewogICAgICAgICByZXR1cm4gKGludDMyX3QpKEdldE51bWJlcihpbmRleCkpOwogICAgIH0KLSAgICBGWF9CT09MCQkJCU9uT3BlcmF0b3IoY29uc3QgRlhfQ0hBUiogb3ApOworICAgIGJvb2wJCQkJT25PcGVyYXRvcihjb25zdCBGWF9DSEFSKiBvcCk7CiAgICAgdm9pZAkJCQlCaWdDYXNlQ2FsbGVyKGludCBpbmRleCk7CiAgICAgRlhfRFdPUkQJCQlHZXRQYXJzZVBvcygpCiAgICAgewpAQCAtMTcxLDE2ICsxNzEsMTYgQEAKICAgICB2b2lkCQkJCVBhcnNlUGF0aE9iamVjdCgpOwogICAgIHZvaWQJCQkJQWRkUGF0aFBvaW50KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIGludCBmbGFnKTsKICAgICB2b2lkCQkJCUFkZFBhdGhSZWN0KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIHcsIEZYX0ZMT0FUIGgpOwotICAgIHZvaWQJCQkJQWRkUGF0aE9iamVjdChpbnQgRmlsbFR5cGUsIEZYX0JPT0wgYlN0cm9rZSk7Ci0gICAgQ1BERl9JbWFnZU9iamVjdCoJQWRkSW1hZ2UoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIENQREZfSW1hZ2UqIHBJbWFnZSwgRlhfQk9PTCBiSW5saW5lKTsKKyAgICB2b2lkCQkJCUFkZFBhdGhPYmplY3QoaW50IEZpbGxUeXBlLCBib29sIGJTdHJva2UpOworICAgIENQREZfSW1hZ2VPYmplY3QqCUFkZEltYWdlKENQREZfU3RyZWFtKiBwU3RyZWFtLCBDUERGX0ltYWdlKiBwSW1hZ2UsIGJvb2wgYklubGluZSk7CiAgICAgdm9pZAkJCQlBZGREdXBsaWNhdGVJbWFnZSgpOwogICAgIHZvaWQJCQkJQWRkRm9ybShDUERGX1N0cmVhbSopOwotICAgIHZvaWQJCQkJU2V0R3JhcGhpY1N0YXRlcyhDUERGX1BhZ2VPYmplY3QqIHBPYmosIEZYX0JPT0wgYkNvbG9yLCBGWF9CT09MIGJUZXh0LCBGWF9CT09MIGJHcmFwaCk7CisgICAgdm9pZAkJCQlTZXRHcmFwaGljU3RhdGVzKENQREZfUGFnZU9iamVjdCogcE9iaiwgYm9vbCBiQ29sb3IsIGJvb2wgYlRleHQsIGJvb2wgYkdyYXBoKTsKICAgICB2b2lkCQkJCVNhdmVTdGF0ZXMoQ1BERl9BbGxTdGF0ZXMqKTsKICAgICB2b2lkCQkJCVJlc3RvcmVTdGF0ZXMoQ1BERl9BbGxTdGF0ZXMqKTsKICAgICBDUERGX0ZvbnQqCQkJRmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOwogICAgIENQREZfQ29sb3JTcGFjZSoJRmluZENvbG9yU3BhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOwotICAgIENQREZfUGF0dGVybioJCUZpbmRQYXR0ZXJuKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBGWF9CT09MIGJTaGFkaW5nKTsKKyAgICBDUERGX1BhdHRlcm4qCQlGaW5kUGF0dGVybihjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgYm9vbCBiU2hhZGluZyk7CiAgICAgQ1BERl9PYmplY3QqCQlGaW5kUmVzb3VyY2VPYmooY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0eXBlLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7CiAKIHByb3RlY3RlZDoKQEAgLTI3Nyw3ICsyNzcsNyBAQAogICAgIF9Db250ZW50UGFyYW0gbV9QYXJhbUJ1ZjFbUEFSQU1fQlVGX1NJWkVdOwogICAgIEZYX0RXT1JEIG1fUGFyYW1TdGFydFBvczsKICAgICBGWF9EV09SRCBtX1BhcmFtQ291bnQ7Ci0gICAgRlhfQk9PTCBtX2JBYm9ydDsKKyAgICBib29sIG1fYkFib3J0OwogICAgIENQREZfU3RyZWFtUGFyc2VyKiBtX3BTeW50YXg7CiAgICAgbm9uc3RkOjp1bmlxdWVfcHRyPENQREZfQWxsU3RhdGVzPiBtX3BDdXJTdGF0ZXM7CiAgICAgQ1BERl9Db250ZW50TWFyayBtX0N1ckNvbnRlbnRNYXJrOwpAQCAtMjk5LDExICsyOTksMTEgQEAKICAgICBDRlhfQmluYXJ5QnVmIG1fTGFzdEltYWdlRGF0YTsKICAgICBDUERGX0RpY3Rpb25hcnkqIG1fcExhc3RJbWFnZURpY3Q7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BMYXN0Q2xvbmVJbWFnZURpY3Q7Ci0gICAgRlhfQk9PTCBtX2JSZWxlYXNlTGFzdERpY3Q7Ci0gICAgRlhfQk9PTCBtX2JTYW1lTGFzdERpY3Q7Ci0gICAgRlhfQk9PTCBtX2JDb2xvcmVkOworICAgIGJvb2wgbV9iUmVsZWFzZUxhc3REaWN0OworICAgIGJvb2wgbV9iU2FtZUxhc3REaWN0OworICAgIGJvb2wgbV9iQ29sb3JlZDsKICAgICBGWF9GTE9BVCBtX1R5cGUzRGF0YVs2XTsKLSAgICBGWF9CT09MIG1fYlJlc291cmNlTWlzc2luZzsKKyAgICBib29sIG1fYlJlc291cmNlTWlzc2luZzsKICAgICBDRlhfUHRyQXJyYXkgbV9TdGF0ZVN0YWNrOwogfTsKIGNsYXNzIENQREZfQ29udGVudFBhcnNlcgpAQCAtMzMxLDcgKzMzMSw3IEBACiAgICAgdm9pZAkJCQlDbGVhcigpOwogICAgIFBhcnNlU3RhdHVzCQkJbV9TdGF0dXM7CiAgICAgQ1BERl9QYWdlT2JqZWN0cyoJbV9wT2JqZWN0czsKLSAgICBGWF9CT09MCQkJCW1fYkZvcm07CisgICAgYm9vbAkJCQltX2JGb3JtOwogICAgIENQREZfUGFyc2VPcHRpb25zCW1fT3B0aW9uczsKICAgICBDUERGX1R5cGUzQ2hhcioJCW1fcFR5cGUzQ2hhcjsKICAgICBpbnQJCQkJCW1fSW50ZXJuYWxTdGFnZTsKQEAgLTM2MywyMiArMzYzLDIyIEBACiAgICAgZXhwbGljaXQgQ1BERl9Eb2NQYWdlRGF0YShDUERGX0RvY3VtZW50ICpwUERGRG9jKTsKICAgICB+Q1BERl9Eb2NQYWdlRGF0YSgpOwogCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIENsZWFyKEZYX0JPT0wgYlJlbGVhc2UgPSBGQUxTRSk7Ci0gICAgQ1BERl9Gb250KiAgICAgICAgICAgICAgICAgIEdldEZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QsIEZYX0JPT0wgZmluZE9ubHkpOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBDbGVhcihib29sIGJSZWxlYXNlID0gZmFsc2UpOworICAgIENQREZfRm9udCogICAgICAgICAgICAgICAgICBHZXRGb250KENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0LCBib29sIGZpbmRPbmx5KTsKICAgICBDUERGX0ZvbnQqICAgICAgICAgICAgICAgICAgR2V0U3RhbmRhcmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZm9udE5hbWUsIENQREZfRm9udEVuY29kaW5nKiBwRW5jb2RpbmcpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCk7CiAgICAgQ1BERl9Db2xvclNwYWNlKiAgICAgICAgICAgIEdldENvbG9yU3BhY2UoQ1BERl9PYmplY3QqIHBDU09iaiwgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzb3VyY2VzKTsKICAgICBDUERGX0NvbG9yU3BhY2UqICAgICAgICAgICAgR2V0Q29waWVkQ29sb3JTcGFjZShDUERGX09iamVjdCogcENTT2JqKTsKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZUNvbG9yU3BhY2UoQ1BERl9PYmplY3QqIHBDb2xvclNwYWNlKTsKLSAgICBDUERGX1BhdHRlcm4qICAgICAgICAgICAgICAgR2V0UGF0dGVybihDUERGX09iamVjdCogcFBhdHRlcm5PYmosIEZYX0JPT0wgYlNoYWRpbmcsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCk7CisgICAgQ1BERl9QYXR0ZXJuKiAgICAgICAgICAgICAgIEdldFBhdHRlcm4oQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLCBib29sIGJTaGFkaW5nLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBtYXRyaXgpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlUGF0dGVybihDUERGX09iamVjdCogcFBhdHRlcm5PYmopOwogICAgIENQREZfSW1hZ2UqICAgICAgICAgICAgICAgICBHZXRJbWFnZShDUERGX09iamVjdCogcEltYWdlU3RyZWFtKTsKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZUltYWdlKENQREZfT2JqZWN0KiBwSW1hZ2VTdHJlYW0pOwogICAgIENQREZfSWNjUHJvZmlsZSogICAgICAgICAgICBHZXRJY2NQcm9maWxlKENQREZfU3RyZWFtKiBwSWNjUHJvZmlsZVN0cmVhbSk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VJY2NQcm9maWxlKENQREZfSWNjUHJvZmlsZSogcEljY1Byb2ZpbGUpOwogICAgIENQREZfU3RyZWFtQWNjKiAgICAgICAgICAgICBHZXRGb250RmlsZVN0cmVhbUFjYyhDUERGX1N0cmVhbSogcEZvbnRTdHJlYW0pOwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlRm9udEZpbGVTdHJlYW1BY2MoQ1BERl9TdHJlYW0qIHBGb250U3RyZWFtLCBGWF9CT09MIGJGb3JjZSA9IEZBTFNFKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgSXNGb3JjZUNsZWFyKCkgY29uc3Qge3JldHVybiBtX2JGb3JjZUNsZWFyO30KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZUZvbnRGaWxlU3RyZWFtQWNjKENQREZfU3RyZWFtKiBwRm9udFN0cmVhbSwgYm9vbCBiRm9yY2UgPSBmYWxzZSk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgIElzRm9yY2VDbGVhcigpIGNvbnN0IHtyZXR1cm4gbV9iRm9yY2VDbGVhcjt9CiAgICAgQ1BERl9Db3VudGVkQ29sb3JTcGFjZSogICAgIEZpbmRDb2xvclNwYWNlUHRyKENQREZfT2JqZWN0KiBwQ1NPYmopIGNvbnN0OwogICAgIENQREZfQ291bnRlZFBhdHRlcm4qICAgICAgICBGaW5kUGF0dGVyblB0cihDUERGX09iamVjdCogcFBhdHRlcm5PYmopIGNvbnN0OwogCkBAIC0zOTcsNyArMzk3LDcgQEAKIAogICAgIENQREZfRG9jdW1lbnQqIGNvbnN0IG1fcFBERkRvYzsKICAgICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyIG1fSGFzaFByb2ZpbGVNYXA7Ci0gICAgRlhfQk9PTCBtX2JGb3JjZUNsZWFyOworICAgIGJvb2wgbV9iRm9yY2VDbGVhcjsKIAogICAgIENQREZfQ29sb3JTcGFjZU1hcCBtX0NvbG9yU3BhY2VNYXA7CiAgICAgQ1BERl9Gb250RmlsZU1hcCBtX0ZvbnRGaWxlTWFwOwpAQCAtNDEyLDcgKzQxMiw3IEBACiBwdWJsaWM6CiAgICAgc3RhdGljIENQREZfRnVuY3Rpb24qCUxvYWQoQ1BERl9PYmplY3QqIHBGdW5jT2JqKTsKICAgICB2aXJ0dWFsIH5DUERGX0Z1bmN0aW9uKCk7Ci0gICAgRlhfQk9PTAkJQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBpbnQgbmlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMsIGludCYgbnJlc3VsdHMpIGNvbnN0OworICAgIGJvb2wJCUNhbGwoRlhfRkxPQVQqIGlucHV0cywgaW50IG5pbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzLCBpbnQmIG5yZXN1bHRzKSBjb25zdDsKICAgICBpbnQJCQlDb3VudElucHV0cygpCiAgICAgewogICAgICAgICByZXR1cm4gbV9uSW5wdXRzOwpAQCAtNDI2LDkgKzQyNiw5IEBACiAgICAgaW50CQkJbV9uSW5wdXRzLCBtX25PdXRwdXRzOwogICAgIEZYX0ZMT0FUKgltX3BEb21haW5zOwogICAgIEZYX0ZMT0FUKgltX3BSYW5nZXM7Ci0gICAgRlhfQk9PTAkJSW5pdChDUERGX09iamVjdCogcE9iaik7Ci0gICAgdmlydHVhbCBGWF9CT09MCXZfSW5pdChDUERGX09iamVjdCogcE9iaikgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAl2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0ID0gMDsKKyAgICBib29sCQlJbml0KENQREZfT2JqZWN0KiBwT2JqKTsKKyAgICB2aXJ0dWFsIGJvb2wJdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKSA9IDA7CisgICAgdmlydHVhbCBib29sCXZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QgPSAwOwogfTsKIGNsYXNzIENQREZfSWNjUHJvZmlsZQogewpAQCAtNDM2LDcgKzQzNiw3IEBACiAgICAgQ1BERl9JY2NQcm9maWxlKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpOwogICAgIH5DUERGX0ljY1Byb2ZpbGUoKTsKICAgICBpbnQzMl90IEdldENvbXBvbmVudHMoKSBjb25zdCB7IHJldHVybiBtX25TcmNDb21wb25lbnRzOyB9Ci0gICAgRlhfQk9PTAkJCQkJbV9ic1JHQjsKKyAgICBib29sCQkJCQltX2JzUkdCOwogICAgIHZvaWQqCQkJCW1fcFRyYW5zZm9ybTsKIHByaXZhdGU6CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICBtX25TcmNDb21wb25lbnRzOwpAQCAtNDQ3LDIwICs0NDcsMjAgQEAKIHB1YmxpYzoKICAgICBDUERGX0RldmljZUNTKENQREZfRG9jdW1lbnQqIHBEb2MsIGludCBmYW1pbHkpOwogCi0gICAgRlhfQk9PTCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCisgICAgYm9vbCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCiAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCiAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCiAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOwotICAgIEZYX0JPT0wgU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgIGJvb2wgU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAogICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIFIsCiAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgRywKICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCKSBjb25zdCBvdmVycmlkZTsKLSAgICBGWF9CT09MIHZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKKyAgICBib29sIHZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYywKICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbSwKICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgeSwKICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgaykgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCB2X1NldENNWUsoRlhfRkxPQVQqIHBCdWYsCisgICAgYm9vbCB2X1NldENNWUsoRlhfRkxPQVQqIHBCdWYsCiAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYywKICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBtLAogICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHksCkBAIC00NzAsNyArNDcwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV93aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRyYW5zTWFzayA9IEZBTFNFKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJUcmFuc01hc2sgPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBDUERGX1BhdHRlcm5DUyA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UKQEAgLTQ4Miw4ICs0ODIsOCBAQAogICAgICAgICAgIG1fcENvdW50ZWRCYXNlQ1MobnVsbHB0cikgewogICAgIH0KICAgICB+Q1BERl9QYXR0ZXJuQ1MoKSBvdmVycmlkZTsKLSAgICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOwotICAgIEZYX0JPT0wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgIGJvb2wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7CisgICAgYm9vbCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCiAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCiAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCiAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9maWx0ZXJzX2ludC5oIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9maWx0ZXJzX2ludC5oCmluZGV4IDJlYzU0ZmIuLmMyN2FkZTggMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZmlsdGVyc19pbnQuaAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZpbHRlcnNfaW50LmgKQEAgLTMxLDExICszMSwxMSBAQAogY2xhc3MgQ1BERl9MendGaWx0ZXIgOiBwdWJsaWMgQ0ZYX0RhdGFGaWx0ZXIKIHsKIHB1YmxpYzoKLSAgICBDUERGX0x6d0ZpbHRlcihGWF9CT09MIGJFYXJseUNoYW5nZSk7CisgICAgQ1BERl9MendGaWx0ZXIoYm9vbCBiRWFybHlDaGFuZ2UpOwogICAgIHZpcnR1YWwgfkNQREZfTHp3RmlsdGVyKCkge30KICAgICB2aXJ0dWFsCXZvaWQJdl9GaWx0ZXJJbihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwogICAgIHZpcnR1YWwgdm9pZAl2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zikge30KLSAgICBGWF9CT09MCQkJbV9iRWFybHlDaGFuZ2U7CisgICAgYm9vbAkJCW1fYkVhcmx5Q2hhbmdlOwogICAgIEZYX0RXT1JECQltX0NvZGVBcnJheVs1MDIxXTsKICAgICBGWF9EV09SRAkJbV9uQ29kZXM7CiAgICAgRlhfRFdPUkQJCW1fQ29kZUxlbjsKQEAgLTU0LDcgKzU0LDcgQEAKICAgICB2aXJ0dWFsIH5DUERGX1ByZWRpY3RvckZpbHRlcigpOwogICAgIHZpcnR1YWwJdm9pZAl2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CiAgICAgdmlydHVhbCB2b2lkCXZfRmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7fQotICAgIEZYX0JPT0wJCQltX2JUaWZmOworICAgIGJvb2wJCQltX2JUaWZmOwogICAgIEZYX0RXT1JECQltX1BpdGNoLCBtX0JwcDsKICAgICB1aW50OF90KgkJbV9wUmVmTGluZTsKICAgICB1aW50OF90KgkJbV9wQ3VyTGluZTsKQEAgLTEwMiwxNCArMTAyLDE0IEBACiAgICAgQ0ZYX0JpbmFyeUJ1ZgltX0lucHV0QnVmOwogICAgIHVpbnQ4X3QqCQltX3BTY2FubGluZTsKICAgICBpbnQJCQkJbV9QaXRjaCwgbV9IZWlnaHQsIG1fV2lkdGgsIG1fbkNvbXBzLCBtX2lMaW5lOwotICAgIEZYX0JPT0wJCQltX2JHb3RIZWFkZXI7CisgICAgYm9vbAkJCW1fYkdvdEhlYWRlcjsKIH07CiBjbGFzcyBDUERGX0ZheEZpbHRlciA6IHB1YmxpYyBDRlhfRGF0YUZpbHRlcgogewogcHVibGljOgogICAgIENQREZfRmF4RmlsdGVyKCk7CiAgICAgdmlydHVhbCB+Q1BERl9GYXhGaWx0ZXIoKTsKLSAgICBGWF9CT09MCQkJSW5pdGlhbGl6ZShpbnQgRW5jb2RpbmcsIGludCBiRW5kT2ZMaW5lLCBpbnQgYkJ5dGVBbGlnbiwgaW50IGJCbGFjaywgaW50IG5Sb3dzLCBpbnQgbkNvbHVtbnMpOworICAgIGJvb2wJCQlJbml0aWFsaXplKGludCBFbmNvZGluZywgaW50IGJFbmRPZkxpbmUsIGludCBiQnl0ZUFsaWduLCBpbnQgYkJsYWNrLCBpbnQgblJvd3MsIGludCBuQ29sdW1ucyk7CiAgICAgdmlydHVhbAl2b2lkCXZfRmlsdGVySW4oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKTsKICAgICB2aXJ0dWFsIHZvaWQJdl9GaWx0ZXJGaW5pc2goQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwogICAgIGludAkJCQltX0VuY29kaW5nLCBtX2JFbmRPZkxpbmUsIG1fYkJ5dGVBbGlnbiwgbV9iQmxhY2s7CkBAIC0xMTgsOSArMTE4LDkgQEAKIAl1aW50OF90KgkJbV9wUmVmQnVmOwogICAgIENGWF9CaW5hcnlCdWYJbV9JbnB1dEJ1ZjsKICAgICBpbnQJCQkJbV9JbnB1dEJpdFBvczsKLSAgICB2b2lkCQkJUHJvY2Vzc0RhdGEoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgYml0cG9zLCBGWF9CT09MIGJGaW5pc2gsCisgICAgdm9pZAkJCVByb2Nlc3NEYXRhKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIGJpdHBvcywgYm9vbCBiRmluaXNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7Ci0gICAgRlhfQk9PTAkJCVJlYWRMaW5lKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQmIGJpdHBvcyk7CisgICAgYm9vbAkJCVJlYWRMaW5lKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQmIGJpdHBvcyk7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfU1JDX0ZQREZBUElfRlBERl9QQVJTRVJfRklMVEVSU19JTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmNwcAppbmRleCA0N2MwOGZiLi5lNjA4ODhhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuY3BwCkBAIC05MSw3ICs5MSw3IEBACiAgICAgICAgIH0KICAgICBkZXN0X2J1ZiA9IEZYX0FsbG9jKCB1aW50OF90LCBpIC8gMiArIDEpOwogICAgIGRlc3Rfc2l6ZSA9IDA7Ci0gICAgRlhfQk9PTCBiRmlyc3REaWdpdCA9IFRSVUU7CisgICAgYm9vbCBiRmlyc3REaWdpdCA9IHRydWU7CiAgICAgZm9yIChpID0gMDsgaSA8IHNyY19zaXplOyBpICsrKSB7CiAgICAgICAgIHVpbnQ4X3QgY2ggPSBzcmNfYnVmW2ldOwogICAgICAgICBpZiAoY2ggPT0gJyAnIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJ1x0JyB8fCBjaCA9PSAnXHInKSB7CkBAIC0xODYsOSArMTg2LDkgQEAKICAgICAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zKQogewogICAgIGludCBLID0gMDsKLSAgICBGWF9CT09MIEVuZE9mTGluZSA9IEZBTFNFOwotICAgIEZYX0JPT0wgQnl0ZUFsaWduID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBCbGFja0lzMSA9IEZBTFNFOworICAgIGJvb2wgRW5kT2ZMaW5lID0gZmFsc2U7CisgICAgYm9vbCBCeXRlQWxpZ24gPSBmYWxzZTsKKyAgICBib29sIEJsYWNrSXMxID0gZmFsc2U7CiAgICAgaW50IENvbHVtbnMgPSAxNzI4OwogICAgIGludCBSb3dzID0gMDsKICAgICBpZiAocFBhcmFtcykgewpAQCAtMjA4LDI1ICsyMDgsMjUgQEAKICAgICByZXR1cm4gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRGYXhNb2R1bGUoKS0+Q3JlYXRlRGVjb2RlcihzcmNfYnVmLCBzcmNfc2l6ZSwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgIEssIEVuZE9mTGluZSwgQnl0ZUFsaWduLCBCbGFja0lzMSwgQ29sdW1ucywgUm93cyk7CiB9Ci1zdGF0aWMgRlhfQk9PTCBDaGVja0ZsYXRlRGVjb2RlUGFyYW1zKGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucykKK3N0YXRpYyBib29sIENoZWNrRmxhdGVEZWNvZGVQYXJhbXMoaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zKQogewogICAgIGlmIChDb2x1bW5zIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IGNoZWNrID0gQ29sdW1uczsKICAgICBpZiAoQ29sb3JzIDwgMCB8fCAoY2hlY2sgPiAwICYmIENvbG9ycyA+IElOVF9NQVggLyBjaGVjaykpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGNoZWNrICo9IENvbG9yczsKICAgICBpZiAoQml0c1BlckNvbXBvbmVudCA8IDAgfHwKICAgICAgICAgICAgIChjaGVjayA+IDAgJiYgQml0c1BlckNvbXBvbmVudCA+IElOVF9NQVggLyBjaGVjaykpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGNoZWNrICo9IEJpdHNQZXJDb21wb25lbnQ7CiAgICAgaWYgKGNoZWNrID4gSU5UX01BWCAtIDcpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogSUNvZGVjX1NjYW5saW5lRGVjb2RlciogRlBERkFQSV9DcmVhdGVGbGF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgaW50IG5Db21wcywgaW50IGJwYywgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zKQpAQCAtMjQ1LDExICsyNDUsMTEgQEAKICAgICByZXR1cm4gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRGbGF0ZU1vZHVsZSgpLT5DcmVhdGVEZWNvZGVyKHNyY19idWYsIHNyY19zaXplLCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgbkNvbXBzLCBicGMsIHByZWRpY3RvciwgQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LCBDb2x1bW5zKTsKIH0KLUZYX0RXT1JEIEZQREZBUElfRmxhdGVPckxaV0RlY29kZShGWF9CT09MIGJMWlcsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMsCitGWF9EV09SRCBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoYm9vbCBiTFpXLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCiB7CiAgICAgaW50IHByZWRpY3RvciA9IDA7Ci0gICAgRlhfQk9PTCBiRWFybHlDaGFuZ2UgPSBUUlVFOworICAgIGJvb2wgYkVhcmx5Q2hhbmdlID0gdHJ1ZTsKICAgICBpbnQgQ29sb3JzID0gMCwgQml0c1BlckNvbXBvbmVudCA9IDAsIENvbHVtbnMgPSAwOwogICAgIGlmIChwUGFyYW1zKSB7CiAgICAgICAgIHByZWRpY3RvciA9ICgoQ1BERl9EaWN0aW9uYXJ5KilwUGFyYW1zKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiUHJlZGljdG9yIikpOwpAQCAtMjY1LDE0ICsyNjUsMTQgQEAKICAgICAgICAgICAgIGJFYXJseUNoYW5nZSwgcHJlZGljdG9yLCBDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsIENvbHVtbnMsIGVzdGltYXRlZF9zaXplLAogICAgICAgICAgICAgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7CiB9Ci1GWF9CT09MIFBERl9EYXRhRGVjb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAorYm9vbCBQREZfRGF0YURlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplLCBDRlhfQnl0ZVN0cmluZyYgSW1hZ2VFbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiYgcEltYWdlUGFybXMsIEZYX0RXT1JEIGxhc3RfZXN0aW1hdGVkX3NpemUsIEZYX0JPT0wgYkltYWdlQWNjKQorICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqJiBwSW1hZ2VQYXJtcywgRlhfRFdPUkQgbGFzdF9lc3RpbWF0ZWRfc2l6ZSwgYm9vbCBiSW1hZ2VBY2MpCiAKIHsKICAgICBDUERGX09iamVjdCogcERlY29kZXIgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkZpbHRlciIpKSA6IE5VTEw7CiAgICAgaWYgKHBEZWNvZGVyID09IE5VTEwgfHwgKHBEZWNvZGVyLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZICYmIHBEZWNvZGVyLT5HZXRUeXBlKCkgIT0gUERGT0JKX05BTUUpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX09iamVjdCogcFBhcmFtcyA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRGVjb2RlUGFybXMiKSkgOiBOVUxMOwogICAgIENGWF9CeXRlU3RyaW5nQXJyYXkgRGVjb2Rlckxpc3Q7CkBAIC0zMTAsMTEgKzMxMCwxMSBAQAogICAgICAgICAgICAgICAgIGRlc3RfYnVmID0gKHVpbnQ4X3QqKWxhc3RfYnVmOwogICAgICAgICAgICAgICAgIGRlc3Rfc2l6ZSA9IGxhc3Rfc2l6ZTsKICAgICAgICAgICAgICAgICBwSW1hZ2VQYXJtcyA9IHBQYXJhbTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZnNldCA9IEZQREZBUElfRmxhdGVPckxaV0RlY29kZShGQUxTRSwgbGFzdF9idWYsIGxhc3Rfc2l6ZSwgcFBhcmFtLCBlc3RpbWF0ZWRfc2l6ZSwgbmV3X2J1ZiwgbmV3X3NpemUpOworICAgICAgICAgICAgb2Zmc2V0ID0gRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKGZhbHNlLCBsYXN0X2J1ZiwgbGFzdF9zaXplLCBwUGFyYW0sIGVzdGltYXRlZF9zaXplLCBuZXdfYnVmLCBuZXdfc2l6ZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiTFpXRGVjb2RlIikgfHwgZGVjb2RlciA9PSBGWF9CU1RSQygiTFpXIikpIHsKLSAgICAgICAgICAgIG9mZnNldCA9IEZQREZBUElfRmxhdGVPckxaV0RlY29kZShUUlVFLCBsYXN0X2J1ZiwgbGFzdF9zaXplLCBwUGFyYW0sIGVzdGltYXRlZF9zaXplLCBuZXdfYnVmLCBuZXdfc2l6ZSk7CisgICAgICAgICAgICBvZmZzZXQgPSBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUodHJ1ZSwgbGFzdF9idWYsIGxhc3Rfc2l6ZSwgcFBhcmFtLCBlc3RpbWF0ZWRfc2l6ZSwgbmV3X2J1ZiwgbmV3X3NpemUpOwogICAgICAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkFTQ0lJODVEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJBODUiKSkgewogICAgICAgICAgICAgb2Zmc2V0ID0gX0E4NURlY29kZShsYXN0X2J1ZiwgbGFzdF9zaXplLCBuZXdfYnVmLCBuZXdfc2l6ZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiQVNDSUlIZXhEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJBSHgiKSkgewpAQCAtMzI1LDcgKzMyNSw3IEBACiAgICAgICAgICAgICAgICAgZGVzdF9idWYgPSAodWludDhfdCopbGFzdF9idWY7CiAgICAgICAgICAgICAgICAgZGVzdF9zaXplID0gbGFzdF9zaXplOwogICAgICAgICAgICAgICAgIHBJbWFnZVBhcm1zID0gcFBhcmFtOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb2Zmc2V0ID0gUnVuTGVuZ3RoRGVjb2RlKGxhc3RfYnVmLCBsYXN0X3NpemUsIG5ld19idWYsIG5ld19zaXplKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTM0MCwxMyArMzQwLDEzIEBACiAgICAgICAgICAgICBwSW1hZ2VQYXJtcyA9IHBQYXJhbTsKICAgICAgICAgICAgIGRlc3RfYnVmID0gKHVpbnQ4X3QqKWxhc3RfYnVmOwogICAgICAgICAgICAgZGVzdF9zaXplID0gbGFzdF9zaXplOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAobGFzdF9idWYgIT0gc3JjX2J1ZikgewogICAgICAgICAgICAgRlhfRnJlZShsYXN0X2J1Zik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGxhc3RfYnVmID0gbmV3X2J1ZjsKICAgICAgICAgbGFzdF9zaXplID0gbmV3X3NpemU7CkBAIC0zNTUsNyArMzU1LDcgQEAKICAgICBwSW1hZ2VQYXJtcyA9IE5VTEw7CiAgICAgZGVzdF9idWYgPSBsYXN0X2J1ZjsKICAgICBkZXN0X3NpemUgPSBsYXN0X3NpemU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBleHRlcm4gY29uc3QgRlhfV09SRCBQREZEb2NFbmNvZGluZ1syNTZdID0gewogICAgIDB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywgMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LCAweDAwMDgsIDB4MDAwOSwKQEAgLTM4OSw3ICszODksNyBAQAogewogICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKICAgICBpZiAoc3JjX2xlbiA+PSAyICYmICgoc3JjX2RhdGFbMF0gPT0gMHhmZSAmJiBzcmNfZGF0YVsxXSA9PSAweGZmKSB8fCAoc3JjX2RhdGFbMF0gPT0gMHhmZiAmJiBzcmNfZGF0YVsxXSA9PSAweGZlKSkpIHsKLSAgICAgICAgRlhfQk9PTCBiQkUgPSBzcmNfZGF0YVswXSA9PSAweGZlOworICAgICAgICBib29sIGJCRSA9IHNyY19kYXRhWzBdID09IDB4ZmU7CiAgICAgICAgIEZYX0RXT1JEIG1heF9jaGFycyA9IChzcmNfbGVuIC0gMikgLyAyOwogICAgICAgICBpZiAoIW1heF9jaGFycykgewogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTQ3Miw3ICs0NzIsNyBAQAogICAgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKGVuY0xlbik7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KLUNGWF9CeXRlU3RyaW5nIFBERl9FbmNvZGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNyYywgRlhfQk9PTCBiSGV4KQorQ0ZYX0J5dGVTdHJpbmcgUERGX0VuY29kZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3JjLCBib29sIGJIZXgpCiB7CiAgICAgQ0ZYX0J5dGVUZXh0QnVmIHJlc3VsdDsKICAgICBpbnQgc3JjbGVuID0gc3JjLkdldExlbmd0aCgpOwpAQCAtNTIxLDcgKzUyMSw3IEBACiB7CiAgICAgQ0NvZGVjX01vZHVsZU1nciogcEVuY29kZXJzID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpOwogICAgIGlmIChwRW5jb2RlcnMpIHsKLSAgICAgICAgcmV0dXJuIHBFbmNvZGVycy0+R2V0RmxhdGVNb2R1bGUoKS0+RmxhdGVPckxaV0RlY29kZShGQUxTRSwgc3JjX2J1Ziwgc3JjX3NpemUsIEZBTFNFLCAwLCAwLCAwLCAwLCAwLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgICAgICAgcmV0dXJuIHBFbmNvZGVycy0+R2V0RmxhdGVNb2R1bGUoKS0+RmxhdGVPckxaV0RlY29kZShmYWxzZSwgc3JjX2J1Ziwgc3JjX3NpemUsIGZhbHNlLCAwLCAwLCAwLCAwLCAwLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RvY3VtZW50LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZG9jdW1lbnQuY3BwCmluZGV4IGMwZjQ1YzUuLjBlYTY5MmUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZG9jdW1lbnQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZG9jdW1lbnQuY3BwCkBAIC0xMiw3ICsxMiw3IEBACiAgICAgQVNTRVJUKHBQYXJzZXIgIT0gTlVMTCk7CiAgICAgbV9wUm9vdERpY3QgPSBOVUxMOwogICAgIG1fcEluZm9EaWN0ID0gTlVMTDsKLSAgICBtX2JMaW5lYXJpemVkID0gRkFMU0U7CisgICAgbV9iTGluZWFyaXplZCA9IGZhbHNlOwogICAgIG1fZHdGaXJzdFBhZ2VObyA9IDA7CiAgICAgbV9kd0ZpcnN0UGFnZU9iak51bSA9IDA7CiAgICAgbV9wRG9jUGFnZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5DcmVhdGVEb2NEYXRhKHRoaXMpOwpAQCAtNTgsNyArNTgsNyBAQAogfQogdm9pZCBDUERGX0RvY3VtZW50OjpMb2FkQXN5bkRvYyhDUERGX0RpY3Rpb25hcnkgKnBMaW5lYXJpemVkKQogewotICAgIG1fYkxpbmVhcml6ZWQgPSBUUlVFOworICAgIG1fYkxpbmVhcml6ZWQgPSB0cnVlOwogICAgIG1fTGFzdE9iak51bSA9IG1fcFBhcnNlci0+R2V0TGFzdE9iak51bSgpOwogICAgIENQREZfT2JqZWN0KiBpbmRpcmVjdE9iaiA9IEdldEluZGlyZWN0T2JqZWN0KG1fcFBhcnNlci0+R2V0Um9vdE9iak51bSgpKTsKICAgICBtX3BSb290RGljdCA9IGluZGlyZWN0T2JqID8gaW5kaXJlY3RPYmotPkdldERpY3QoKSA6IE5VTEw7CkBAIC0yMjgsNyArMjI4LDcgQEAKIHsKICAgICBGWF9EV09SRCBuUGFnZXMgPSBtX1BhZ2VMaXN0LkdldFNpemUoKTsKICAgICBGWF9EV09SRCBza2lwX2NvdW50ID0gMDsKLSAgICBGWF9CT09MIGJTa2lwcGVkID0gRkFMU0U7CisgICAgYm9vbCBiU2tpcHBlZCA9IGZhbHNlOwogICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBuUGFnZXM7IGkgKyspIHsKICAgICAgICAgRlhfRFdPUkQgb2JqbnVtMSA9IG1fUGFnZUxpc3QuR2V0QXQoaSk7CiAgICAgICAgIGlmIChvYmpudW0xID09IG9iam51bSkgewpAQCAtMjM2LDcgKzIzNiw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKCFiU2tpcHBlZCAmJiBvYmpudW0xID09IDApIHsKICAgICAgICAgICAgIHNraXBfY291bnQgPSBpOwotICAgICAgICAgICAgYlNraXBwZWQgPSBUUlVFOworICAgICAgICAgICAgYlNraXBwZWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBHZXRSb290KCk7CkBAIC0yOTcsNyArMjk3LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIF9Db3VudFBhZ2VzKHBQYWdlcywgMCk7CiB9Ci1GWF9CT09MIENQREZfRG9jdW1lbnQ6OklzQ29udGVudFVzZWRFbHNld2hlcmUoRlhfRFdPUkQgb2JqbnVtLCBDUERGX0RpY3Rpb25hcnkqIHBUaGlzUGFnZURpY3QpCitib29sIENQREZfRG9jdW1lbnQ6OklzQ29udGVudFVzZWRFbHNld2hlcmUoRlhfRFdPUkQgb2JqbnVtLCBDUERGX0RpY3Rpb25hcnkqIHBUaGlzUGFnZURpY3QpCiB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1BhZ2VMaXN0LkdldFNpemUoKTsgaSArKykgewogICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IEdldFBhZ2UoaSk7CkBAIC0zMTYsNDIgKzMxNiw0MiBAQAogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKCgoQ1BERl9SZWZlcmVuY2UqKSBwUmVmKS0+R2V0UmVmT2JqTnVtKCkgPT0gb2JqbnVtKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAocENvbnRlbnRzLT5HZXRPYmpOdW0oKSA9PSBvYmpudW0pIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0RXT1JEIENQREZfRG9jdW1lbnQ6OkdldFVzZXJQZXJtaXNzaW9ucyhGWF9CT09MIGJDaGVja1JldmlzaW9uKSBjb25zdAorRlhfRFdPUkQgQ1BERl9Eb2N1bWVudDo6R2V0VXNlclBlcm1pc3Npb25zKGJvb2wgYkNoZWNrUmV2aXNpb24pIGNvbnN0CiB7CiAgICAgaWYgKG1fcFBhcnNlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAoRlhfRFdPUkQpIC0gMTsKICAgICB9CiAgICAgcmV0dXJuIG1fcFBhcnNlci0+R2V0UGVybWlzc2lvbnMoYkNoZWNrUmV2aXNpb24pOwogfQotRlhfQk9PTCBDUERGX0RvY3VtZW50OjpJc093bmVyKCkgY29uc3QKK2Jvb2wgQ1BERl9Eb2N1bWVudDo6SXNPd25lcigpIGNvbnN0CiB7CiAgICAgaWYgKG1fcFBhcnNlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIG1fcFBhcnNlci0+SXNPd25lcigpOwogfQotRlhfQk9PTCBDUERGX0RvY3VtZW50OjpJc0Zvcm1TdHJlYW0oRlhfRFdPUkQgb2JqbnVtLCBGWF9CT09MJiBiRm9ybSkgY29uc3QKK2Jvb2wgQ1BERl9Eb2N1bWVudDo6SXNGb3JtU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgYm9vbCYgYkZvcm0pIGNvbnN0CiB7CiAgICAgewogICAgICAgICBDUERGX09iamVjdCogcE9iajsKICAgICAgICAgaWYgKG1fSW5kaXJlY3RPYmpzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClvYmpudW0sICh2b2lkKiYpcE9iaikpIHsKICAgICAgICAgICAgIGJGb3JtID0gcE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0gJiYKICAgICAgICAgICAgICAgICAgICAgKChDUERGX1N0cmVhbSopcE9iaiktPkdldERpY3QoKS0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTdWJ0eXBlIikpID09IEZYX0JTVFJDKCJGb3JtIik7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtX3BQYXJzZXIgPT0gTlVMTCkgewotICAgICAgICBiRm9ybSA9IEZBTFNFOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgYkZvcm0gPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBtX3BQYXJzZXItPklzRm9ybVN0cmVhbShvYmpudW0sIGJGb3JtKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZW5jcnlwdC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2VuY3J5cHQuY3BwCmluZGV4IDlmMzU2YTQuLmZmNmYwZTEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZW5jcnlwdC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9lbmNyeXB0LmNwcApAQCAtMTQsNyArMTQsNyBAQAogICAgIDB4MmYsIDB4MGMsIDB4YTksIDB4ZmUsIDB4NjQsIDB4NTMsIDB4NjksIDB4N2EKIH07CiB2b2lkIENhbGNFbmNyeXB0S2V5KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHQsIGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGtleSwgaW50IGtleWxlbiwgRlhfQk9PTCBiSWdub3JlTWV0YSwgQ1BERl9BcnJheSogcElkQXJyYXkpCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGtleSwgaW50IGtleWxlbiwgYm9vbCBiSWdub3JlTWV0YSwgQ1BERl9BcnJheSogcElkQXJyYXkpCiB7CiAgICAgaW50IHJldmlzaW9uID0gcEVuY3J5cHQtPkdldEludGVnZXIoRlhfQlNUUkMoIlIiKSk7CiAgICAgdWludDhfdCBwYXNzY29kZVszMl07CkBAIC01Nyw3ICs1Nyw3IEBACiB0eXBlZGVmIHN0cnVjdCBfUERGX0NSWVBUT0lURU0gIHsKICAgICBpbnQzMl90CW1fQ2lwaGVyOwogICAgIGludDMyX3QJbV9LZXlMZW47Ci0gICAgRlhfQk9PTAkJbV9iQ2hlY2tlZDsKKyAgICBib29sCQltX2JDaGVja2VkOwogICAgIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyKgltX3BDcnlwdG9IYW5kbGVyOwogfSBQREZfQ1JZUFRPSVRFTTsKIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIoKQpAQCAtNjYsNyArNjYsNyBAQAogICAgIG1fUmV2aXNpb24gPSAwOwogICAgIG1fcFBhcnNlciA9IE5VTEw7CiAgICAgbV9wRW5jcnlwdERpY3QgPSBOVUxMOwotICAgIG1fYk93bmVyID0gRkFMU0U7CisgICAgbV9iT3duZXIgPSBmYWxzZTsKICAgICBtX1Blcm1pc3Npb25zID0gMDsKICAgICBtX0NpcGhlciA9IEZYQ0lQSEVSX05PTkU7CiAgICAgbV9LZXlMZW4gPSAwOwpAQCAtNzQsMzYgKzc0LDM2IEBACiBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjp+Q1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcigpCiB7CiB9Ci1GWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6Ok9uSW5pdChDUERGX1BhcnNlciogcFBhcnNlciwgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpCitib29sIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6Ok9uSW5pdChDUERGX1BhcnNlciogcFBhcnNlciwgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpCiB7CiAgICAgbV9wUGFyc2VyID0gcFBhcnNlcjsKICAgICBpZiAoIUxvYWREaWN0KHBFbmNyeXB0RGljdCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9OT05FKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIENoZWNrU2VjdXJpdHkobV9LZXlMZW4pOwogfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja1NlY3VyaXR5KGludDMyX3Qga2V5X2xlbikKK2Jvb2wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6Q2hlY2tTZWN1cml0eShpbnQzMl90IGtleV9sZW4pCiB7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgcGFzc3dvcmQgPSBtX3BQYXJzZXItPkdldFBhc3N3b3JkKCk7Ci0gICAgaWYgKENoZWNrUGFzc3dvcmQocGFzc3dvcmQsIHBhc3N3b3JkLkdldExlbmd0aCgpLCBUUlVFLCBtX0VuY3J5cHRLZXksIGtleV9sZW4pKSB7CisgICAgaWYgKENoZWNrUGFzc3dvcmQocGFzc3dvcmQsIHBhc3N3b3JkLkdldExlbmd0aCgpLCB0cnVlLCBtX0VuY3J5cHRLZXksIGtleV9sZW4pKSB7CiAgICAgICAgIGlmIChwYXNzd29yZC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmICghQ2hlY2tQYXNzd29yZChwYXNzd29yZCwgcGFzc3dvcmQuR2V0TGVuZ3RoKCksIEZBTFNFLCBtX0VuY3J5cHRLZXksIGtleV9sZW4pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgaWYgKCFDaGVja1Bhc3N3b3JkKHBhc3N3b3JkLCBwYXNzd29yZC5HZXRMZW5ndGgoKSwgZmFsc2UsIG1fRW5jcnlwdEtleSwga2V5X2xlbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbV9iT3duZXIgPSBUUlVFOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgbV9iT3duZXIgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIENoZWNrUGFzc3dvcmQocGFzc3dvcmQsIHBhc3N3b3JkLkdldExlbmd0aCgpLCBGQUxTRSwgbV9FbmNyeXB0S2V5LCBrZXlfbGVuKTsKKyAgICByZXR1cm4gQ2hlY2tQYXNzd29yZChwYXNzd29yZCwgcGFzc3dvcmQuR2V0TGVuZ3RoKCksIGZhbHNlLCBtX0VuY3J5cHRLZXksIGtleV9sZW4pOwogfQogRlhfRFdPUkQgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6R2V0UGVybWlzc2lvbnMoKQogewogICAgIHJldHVybiBtX1Blcm1pc3Npb25zOwogfQotc3RhdGljIEZYX0JPT0wgX0xvYWRDcnlwdEluZm8oQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50JiBjaXBoZXIsIGludCYga2V5bGVuKQorc3RhdGljIGJvb2wgX0xvYWRDcnlwdEluZm8oQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50JiBjaXBoZXIsIGludCYga2V5bGVuKQogewogICAgIGludCBWZXJzaW9uID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJWIikpOwogICAgIGNpcGhlciA9IEZYQ0lQSEVSX1JDNDsKQEAgLTExMSwxNCArMTExLDE0IEBACiAgICAgaWYgKFZlcnNpb24gPj0gNCkgewogICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBDcnlwdEZpbHRlcnMgPSBwRW5jcnlwdERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkNGIikpOwogICAgICAgICBpZiAocENyeXB0RmlsdGVycyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIklkZW50aXR5IikpIHsKICAgICAgICAgICAgIGNpcGhlciA9IEZYQ0lQSEVSX05PTkU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEZWZGaWx0ZXIgPSBwQ3J5cHRGaWx0ZXJzLT5HZXREaWN0KG5hbWUpOwogICAgICAgICAgICAgaWYgKHBEZWZGaWx0ZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQgbktleUJpdHMgPSAwOwogICAgICAgICAgICAgaWYgKFZlcnNpb24gPT0gNCkgewpAQCAtMTQyLDE0ICsxNDIsMTQgQEAKICAgICAgICAga2V5bGVuID0gVmVyc2lvbiA+IDEgPyBwRW5jcnlwdERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkxlbmd0aCIpLCA0MCkgLyA4IDogNTsKICAgICB9CiAgICAgaWYgKGtleWxlbiA+IDMyIHx8IGtleWxlbiA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpMb2FkRGljdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCkKK2Jvb2wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6TG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpCiB7CiAgICAgbV9wRW5jcnlwdERpY3QgPSBwRW5jcnlwdERpY3Q7Ci0gICAgbV9iT3duZXIgPSBGQUxTRTsKKyAgICBtX2JPd25lciA9IGZhbHNlOwogICAgIG1fVmVyc2lvbiA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiViIpKTsKICAgICBtX1JldmlzaW9uID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJSIikpOwogICAgIG1fUGVybWlzc2lvbnMgPSBwRW5jcnlwdERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlAiKSwgLTEpOwpAQCAtMTU5LDE3ICsxNTksMTcgQEAKICAgICBDRlhfQnl0ZVN0cmluZyBzdG1mX25hbWUgPSBwRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3RtRiIpKTsKICAgICBDRlhfQnl0ZVN0cmluZyBzdHJmX25hbWUgPSBwRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3RyRiIpKTsKICAgICBpZiAoc3RtZl9uYW1lICE9IHN0cmZfbmFtZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCFfTG9hZENyeXB0SW5mbyhwRW5jcnlwdERpY3QsIHN0cmZfbmFtZSwgbV9DaXBoZXIsIG1fS2V5TGVuKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkxvYWREaWN0KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBGWF9EV09SRCB0eXBlLCBpbnQmIGNpcGhlciwgaW50JiBrZXlfbGVuKQorYm9vbCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpMb2FkRGljdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgRlhfRFdPUkQgdHlwZSwgaW50JiBjaXBoZXIsIGludCYga2V5X2xlbikKIHsKICAgICBtX3BFbmNyeXB0RGljdCA9IHBFbmNyeXB0RGljdDsKLSAgICBtX2JPd25lciA9IEZBTFNFOworICAgIG1fYk93bmVyID0gZmFsc2U7CiAgICAgbV9WZXJzaW9uID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJWIikpOwogICAgIG1fUmV2aXNpb24gPSBwRW5jcnlwdERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlIiKSk7CiAgICAgbV9QZXJtaXNzaW9ucyA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiUCIpLCAtMSk7CkBAIC0xNzgsMjMgKzE3OCwyMyBAQAogICAgICAgICBzdG1mX25hbWUgPSBwRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3RtRiIpKTsKICAgICAgICAgc3RyZl9uYW1lID0gcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN0ckYiKSk7CiAgICAgICAgIGlmIChzdG1mX25hbWUgIT0gc3RyZl9uYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCFfTG9hZENyeXB0SW5mbyhwRW5jcnlwdERpY3QsIHN0cmZfbmFtZSwgY2lwaGVyLCBrZXlfbGVuKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9DaXBoZXIgPSBjaXBoZXI7CiAgICAgbV9LZXlMZW4gPSBrZXlfbGVuOwotICAgIHJldHVybiBUUlVFOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpHZXRDcnlwdEluZm8oaW50JiBjaXBoZXIsIGNvbnN0IHVpbnQ4X3QqJiBidWZmZXIsIGludCYga2V5bGVuKQorYm9vbCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpHZXRDcnlwdEluZm8oaW50JiBjaXBoZXIsIGNvbnN0IHVpbnQ4X3QqJiBidWZmZXIsIGludCYga2V5bGVuKQogewogICAgIGNpcGhlciA9IG1fQ2lwaGVyOwogICAgIGJ1ZmZlciA9IG1fRW5jcnlwdEtleTsKICAgICBrZXlsZW4gPSBtX0tleUxlbjsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KICNkZWZpbmUgRlhfR0VUXzMyV09SRChuLGIsaSkJCQkJCQkJCVwKICAgICB7CQkJCQkJCQkJCQkJCQlcCkBAIC0yNTIsNyArMjUyLDcgQEAKICAgICAgICAgICAgICAgICBjb250ZW50LkFwcGVuZEJsb2NrKHZlY3RvciwgNDgpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBrZXksIDE2LCBUUlVFKTsKKyAgICAgICAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGtleSwgMTYsIHRydWUpOwogICAgICAgICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKICAgICAgICAgQ1JZUFRfQUVTRW5jcnlwdChhZXMsIEUsIGNvbnRlbnQuR2V0QnVmZmVyKCksIGlCdWZMZW4pOwogICAgICAgICBpbnQgaUhhc2ggPSAwOwpAQCAtMjg4LDE2ICsyODgsMTYgQEAKICAgICAgICAgRlhTWVNfbWVtY3B5KGhhc2gsIGlucHV0LCAzMik7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpBRVMyNTZfQ2hlY2tQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgc2l6ZSwKLSAgICAgICAgRlhfQk9PTCBiT3duZXIsIHVpbnQ4X3QqIGtleSkKK2Jvb2wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6QUVTMjU2X0NoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHNpemUsCisgICAgICAgIGJvb2wgYk93bmVyLCB1aW50OF90KiBrZXkpCiB7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgb2tleSA9IG1fcEVuY3J5cHREaWN0ID8gbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiTyIpKSA6IENGWF9CeXRlU3RyaW5nKCk7CiAgICAgaWYgKG9rZXkuR2V0TGVuZ3RoKCkgPCA0OCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmcgdWtleSA9IG1fcEVuY3J5cHREaWN0ID8gbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiVSIpKSA6IENGWF9CeXRlU3RyaW5nKCk7CiAgICAgaWYgKHVrZXkuR2V0TGVuZ3RoKCkgPCA0OCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgY29uc3QgdWludDhfdCogcGtleSA9IGJPd25lciA/IChjb25zdCB1aW50OF90Kilva2V5IDogKGNvbnN0IHVpbnQ4X3QqKXVrZXk7CiAgICAgdWludDhfdCBzaGFbMTI4XTsKQEAgLTMxNCwxMCArMzE0LDEwIEBACiAgICAgICAgIENSWVBUX1NIQTI1NkZpbmlzaChzaGEsIGRpZ2VzdCk7CiAgICAgfQogICAgIGlmIChGWFNZU19tZW1jbXAoZGlnZXN0LCBwa2V5LCAzMikgIT0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKGtleSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKG1fUmV2aXNpb24gPj0gNikgewogICAgICAgICBSZXZpc2lvbjZfSGFzaChwYXNzd29yZCwgc2l6ZSwgKGNvbnN0IHVpbnQ4X3QqKXBrZXkgKyA0MCwgKGJPd25lciA/IChjb25zdCB1aW50OF90Kil1a2V5IDogTlVMTCksIGRpZ2VzdCk7CkBAIC0zMzIsMTkgKzMzMiwxOSBAQAogICAgIH0KICAgICBDRlhfQnl0ZVN0cmluZyBla2V5ID0gbV9wRW5jcnlwdERpY3QgPyBtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nKGJPd25lciA/IEZYX0JTVFJDKCJPRSIpIDogRlhfQlNUUkMoIlVFIikpIDogQ0ZYX0J5dGVTdHJpbmcoKTsKICAgICBpZiAoZWtleS5HZXRMZW5ndGgoKSA8IDMyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICB1aW50OF90KiBhZXMgPSBGWF9BbGxvYyh1aW50OF90LCAyMDQ4KTsKLSAgICBDUllQVF9BRVNTZXRLZXkoYWVzLCAxNiwgZGlnZXN0LCAzMiwgRkFMU0UpOworICAgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBkaWdlc3QsIDMyLCBmYWxzZSk7CiAgICAgdWludDhfdCBpdlsxNl07CiAgICAgRlhTWVNfbWVtc2V0KGl2LCAwLCAxNik7CiAgICAgQ1JZUFRfQUVTU2V0SVYoYWVzLCBpdik7CiAgICAgQ1JZUFRfQUVTRGVjcnlwdChhZXMsIGtleSwgZWtleSwgMzIpOwotICAgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBrZXksIDMyLCBGQUxTRSk7CisgICAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGtleSwgMzIsIGZhbHNlKTsKICAgICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKICAgICBDRlhfQnl0ZVN0cmluZyBwZXJtcyA9IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlBlcm1zIikpOwogICAgIGlmIChwZXJtcy5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHVpbnQ4X3QgcGVybXNfYnVmWzE2XTsKICAgICBGWFNZU19tZW1zZXQocGVybXNfYnVmLCAwLCBzaXplb2YocGVybXNfYnVmKSk7CkBAIC0zNTcsMjEgKzM1NywyMSBAQAogICAgIENSWVBUX0FFU0RlY3J5cHQoYWVzLCBidWYsIHBlcm1zX2J1ZiwgMTYpOwogICAgIEZYX0ZyZWUoYWVzKTsKICAgICBpZiAoYnVmWzldICE9ICdhJyB8fCBidWZbMTBdICE9ICdkJyB8fCBidWZbMTFdICE9ICdiJykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKEZYRFdPUkRfR0VUX0xTQkZJUlNUKGJ1ZikgIT0gbV9QZXJtaXNzaW9ucykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKChidWZbOF0gPT0gJ1QnICYmICFJc01ldGFkYXRhRW5jcnlwdGVkKCkpIHx8IChidWZbOF0gPT0gJ0YnICYmIElzTWV0YWRhdGFFbmNyeXB0ZWQoKSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotaW50IENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwgRlhfQk9PTCBiT3duZXIsIHVpbnQ4X3QqIGtleSkKK2ludCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsIGJvb2wgYk93bmVyLCB1aW50OF90KiBrZXkpCiB7CiAgICAgcmV0dXJuIENoZWNrUGFzc3dvcmQocGFzc3dvcmQsIHBhc3Nfc2l6ZSwgYk93bmVyLCBrZXksIG1fS2V5TGVuKTsKIH0KLWludCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBzaXplLCBGWF9CT09MIGJPd25lciwgdWludDhfdCoga2V5LCBpbnQzMl90IGtleV9sZW4pCitpbnQgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6Q2hlY2tQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgc2l6ZSwgYm9vbCBiT3duZXIsIHVpbnQ4X3QqIGtleSwgaW50MzJfdCBrZXlfbGVuKQogewogICAgIGlmIChtX1JldmlzaW9uID49IDUpIHsKICAgICAgICAgcmV0dXJuIEFFUzI1Nl9DaGVja1Bhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCBiT3duZXIsIGtleSk7CkBAIC0zODMsMTYgKzM4MywxNiBAQAogICAgIGlmIChiT3duZXIpIHsKICAgICAgICAgcmV0dXJuIENoZWNrT3duZXJQYXNzd29yZChwYXNzd29yZCwgc2l6ZSwga2V5LCBrZXlfbGVuKTsKICAgICB9Ci0gICAgcmV0dXJuIENoZWNrVXNlclBhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCBGQUxTRSwga2V5LCBrZXlfbGVuKSB8fCBDaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgc2l6ZSwgVFJVRSwga2V5LCBrZXlfbGVuKTsKKyAgICByZXR1cm4gQ2hlY2tVc2VyUGFzc3dvcmQocGFzc3dvcmQsIHNpemUsIGZhbHNlLCBrZXksIGtleV9sZW4pIHx8IENoZWNrVXNlclBhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCB0cnVlLCBrZXksIGtleV9sZW4pOwogfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja1VzZXJQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgcGFzc19zaXplLAotICAgICAgICBGWF9CT09MIGJJZ25vcmVFbmNyeXB0TWV0YSwgdWludDhfdCoga2V5LCBpbnQzMl90IGtleV9sZW4pCitib29sIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNoZWNrVXNlclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsCisgICAgICAgIGJvb2wgYklnbm9yZUVuY3J5cHRNZXRhLCB1aW50OF90KiBrZXksIGludDMyX3Qga2V5X2xlbikKIHsKICAgICBDYWxjRW5jcnlwdEtleShtX3BFbmNyeXB0RGljdCwgcGFzc3dvcmQsIHBhc3Nfc2l6ZSwga2V5LCBrZXlfbGVuLCBiSWdub3JlRW5jcnlwdE1ldGEsCiAgICAgICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRJREFycmF5KCkpOwogICAgIENGWF9CeXRlU3RyaW5nIHVrZXkgPSBtX3BFbmNyeXB0RGljdCA/IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlUiKSkgOiBDRlhfQnl0ZVN0cmluZygpOwogICAgIGlmICh1a2V5LkdldExlbmd0aCgpIDwgMTYpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHVpbnQ4X3QgdWtleWJ1ZlszMl07CiAgICAgaWYgKG1fUmV2aXNpb24gPT0gMikgewpAQCAtNDI1LDkgKzQyNSw5IEBACiAgICAgICAgIHJldHVybiBGWFNZU19tZW1jbXAodGVzdCwgdWtleWJ1ZiwgMTYpID09IDA7CiAgICAgfQogICAgIGlmIChGWFNZU19tZW1jbXAoKHZvaWQqKXVrZXkuY19zdHIoKSwgdWtleWJ1ZiwgMTYpID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6R2V0VXNlclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIG93bmVyX3Bhc3MsIEZYX0RXT1JEIHBhc3Nfc2l6ZSkKIHsKQEAgLTQ4MCwxOCArNDgwLDE4IEBACiAgICAgfQogICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhva2V5YnVmLCBsZW4pOwogfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja093bmVyUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwKK2Jvb2wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6Q2hlY2tPd25lclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsCiAgICAgICAgIHVpbnQ4X3QqIGtleSwgaW50MzJfdCBrZXlfbGVuKQogewogICAgIENGWF9CeXRlU3RyaW5nIHVzZXJfcGFzcyA9IEdldFVzZXJQYXNzd29yZChwYXNzd29yZCwgcGFzc19zaXplLCBrZXlfbGVuKTsKLSAgICBpZiAoQ2hlY2tVc2VyUGFzc3dvcmQodXNlcl9wYXNzLCB1c2VyX3Bhc3MuR2V0TGVuZ3RoKCksIEZBTFNFLCBrZXksIGtleV9sZW4pKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgIGlmIChDaGVja1VzZXJQYXNzd29yZCh1c2VyX3Bhc3MsIHVzZXJfcGFzcy5HZXRMZW5ndGgoKSwgZmFsc2UsIGtleSwga2V5X2xlbikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBDaGVja1VzZXJQYXNzd29yZCh1c2VyX3Bhc3MsIHVzZXJfcGFzcy5HZXRMZW5ndGgoKSwgVFJVRSwga2V5LCBrZXlfbGVuKTsKKyAgICByZXR1cm4gQ2hlY2tVc2VyUGFzc3dvcmQodXNlcl9wYXNzLCB1c2VyX3Bhc3MuR2V0TGVuZ3RoKCksIHRydWUsIGtleSwga2V5X2xlbik7CiB9Ci1GWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OklzTWV0YWRhdGFFbmNyeXB0ZWQoKQorYm9vbCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpJc01ldGFkYXRhRW5jcnlwdGVkKCkKIHsKLSAgICByZXR1cm4gbV9wRW5jcnlwdERpY3QtPkdldEJvb2xlYW4oRlhfQlNUUkMoIkVuY3J5cHRNZXRhZGF0YSIpLCBUUlVFKTsKKyAgICByZXR1cm4gbV9wRW5jcnlwdERpY3QtPkdldEJvb2xlYW4oRlhfQlNUUkMoIkVuY3J5cHRNZXRhZGF0YSIpLCB0cnVlKTsKIH0KIENQREZfU2VjdXJpdHlIYW5kbGVyKiBGUERGX0NyZWF0ZVN0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCkKIHsKQEAgLTQ5OSw3ICs0OTksNyBAQAogfQogdm9pZCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpPbkNyZWF0ZShDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9BcnJheSogcElkQXJyYXksCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHVzZXJfcGFzcywgRlhfRFdPUkQgdXNlcl9zaXplLAotICAgICAgICBjb25zdCB1aW50OF90KiBvd25lcl9wYXNzLCBGWF9EV09SRCBvd25lcl9zaXplLCBGWF9CT09MIGJEZWZhdWx0LCBGWF9EV09SRCB0eXBlKQorICAgICAgICBjb25zdCB1aW50OF90KiBvd25lcl9wYXNzLCBGWF9EV09SRCBvd25lcl9zaXplLCBib29sIGJEZWZhdWx0LCBGWF9EV09SRCB0eXBlKQogewogICAgIGludCBjaXBoZXIgPSAwLCBrZXlfbGVuID0gMDsKICAgICBpZiAoIUxvYWREaWN0KHBFbmNyeXB0RGljdCwgdHlwZSwgY2lwaGVyLCBrZXlfbGVuKSkgewpAQCAtNTE3LDEwICs1MTcsMTAgQEAKICAgICAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgbV9FbmNyeXB0S2V5LCAzMik7CiAgICAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsICh1aW50OF90KikidGhlcmUiLCA1KTsKICAgICAgICAgQ1JZUFRfU0hBMjU2RmluaXNoKHNoYSwgbV9FbmNyeXB0S2V5KTsKLSAgICAgICAgQUVTMjU2X1NldFBhc3N3b3JkKHBFbmNyeXB0RGljdCwgdXNlcl9wYXNzLCB1c2VyX3NpemUsIEZBTFNFLCBtX0VuY3J5cHRLZXkpOworICAgICAgICBBRVMyNTZfU2V0UGFzc3dvcmQocEVuY3J5cHREaWN0LCB1c2VyX3Bhc3MsIHVzZXJfc2l6ZSwgZmFsc2UsIG1fRW5jcnlwdEtleSk7CiAgICAgICAgIGlmIChiRGVmYXVsdCkgewotICAgICAgICAgICAgQUVTMjU2X1NldFBhc3N3b3JkKHBFbmNyeXB0RGljdCwgb3duZXJfcGFzcywgb3duZXJfc2l6ZSwgVFJVRSwgbV9FbmNyeXB0S2V5KTsKLSAgICAgICAgICAgIEFFUzI1Nl9TZXRQZXJtcyhwRW5jcnlwdERpY3QsIG1fUGVybWlzc2lvbnMsIHBFbmNyeXB0RGljdC0+R2V0Qm9vbGVhbihGWF9CU1RSQygiRW5jcnlwdE1ldGFkYXRhIiksIFRSVUUpLCBtX0VuY3J5cHRLZXkpOworICAgICAgICAgICAgQUVTMjU2X1NldFBhc3N3b3JkKHBFbmNyeXB0RGljdCwgb3duZXJfcGFzcywgb3duZXJfc2l6ZSwgdHJ1ZSwgbV9FbmNyeXB0S2V5KTsKKyAgICAgICAgICAgIEFFUzI1Nl9TZXRQZXJtcyhwRW5jcnlwdERpY3QsIG1fUGVybWlzc2lvbnMsIHBFbmNyeXB0RGljdC0+R2V0Qm9vbGVhbihGWF9CU1RSQygiRW5jcnlwdE1ldGFkYXRhIiksIHRydWUpLCBtX0VuY3J5cHRLZXkpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC01NTQsNyArNTU0LDcgQEAKICAgICAgICAgfQogICAgICAgICBwRW5jcnlwdERpY3QtPlNldEF0U3RyaW5nKEZYX0JTVFJDKCJPIiksIENGWF9CeXRlU3RyaW5nKHBhc3Njb2RlLCAzMikpOwogICAgIH0KLSAgICBDYWxjRW5jcnlwdEtleShtX3BFbmNyeXB0RGljdCwgKHVpbnQ4X3QqKXVzZXJfcGFzcywgdXNlcl9zaXplLCBtX0VuY3J5cHRLZXksIGtleV9sZW4sIEZBTFNFLCBwSWRBcnJheSk7CisgICAgQ2FsY0VuY3J5cHRLZXkobV9wRW5jcnlwdERpY3QsICh1aW50OF90Kil1c2VyX3Bhc3MsIHVzZXJfc2l6ZSwgbV9FbmNyeXB0S2V5LCBrZXlfbGVuLCBmYWxzZSwgcElkQXJyYXkpOwogICAgIGlmIChtX1JldmlzaW9uIDwgMykgewogICAgICAgICB1aW50OF90IHRlbXBidWZbMzJdOwogICAgICAgICBGWFNZU19tZW1jcHkodGVtcGJ1ZiwgZGVmcGFzc2NvZGUsIDMyKTsKQEAgLTU4NiwxMyArNTg2LDEzIEBACiAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHVzZXJfcGFzcywgRlhfRFdPUkQgdXNlcl9zaXplLAogICAgICAgICBjb25zdCB1aW50OF90KiBvd25lcl9wYXNzLCBGWF9EV09SRCBvd25lcl9zaXplLCBGWF9EV09SRCB0eXBlKQogewotICAgIE9uQ3JlYXRlKHBFbmNyeXB0RGljdCwgcElkQXJyYXksIHVzZXJfcGFzcywgdXNlcl9zaXplLCBvd25lcl9wYXNzLCBvd25lcl9zaXplLCBUUlVFLCB0eXBlKTsKKyAgICBPbkNyZWF0ZShwRW5jcnlwdERpY3QsIHBJZEFycmF5LCB1c2VyX3Bhc3MsIHVzZXJfc2l6ZSwgb3duZXJfcGFzcywgb3duZXJfc2l6ZSwgdHJ1ZSwgdHlwZSk7CiB9CiB2b2lkIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6Ok9uQ3JlYXRlKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBDUERGX0FycmF5KiBwSWRBcnJheSwgY29uc3QgdWludDhfdCogdXNlcl9wYXNzLCBGWF9EV09SRCB1c2VyX3NpemUsIEZYX0RXT1JEIHR5cGUpCiB7Ci0gICAgT25DcmVhdGUocEVuY3J5cHREaWN0LCBwSWRBcnJheSwgdXNlcl9wYXNzLCB1c2VyX3NpemUsIE5VTEwsIDAsIEZBTFNFLCB0eXBlKTsKKyAgICBPbkNyZWF0ZShwRW5jcnlwdERpY3QsIHBJZEFycmF5LCB1c2VyX3Bhc3MsIHVzZXJfc2l6ZSwgTlVMTCwgMCwgZmFsc2UsIHR5cGUpOwogfQotdm9pZCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpBRVMyNTZfU2V0UGFzc3dvcmQoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBzaXplLCBGWF9CT09MIGJPd25lciwgY29uc3QgdWludDhfdCoga2V5KQordm9pZCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpBRVMyNTZfU2V0UGFzc3dvcmQoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBzaXplLCBib29sIGJPd25lciwgY29uc3QgdWludDhfdCoga2V5KQogewogICAgIHVpbnQ4X3Qgc2hhWzEyOF07CiAgICAgQ1JZUFRfU0hBMVN0YXJ0KHNoYSk7CkBAIC02MjcsNyArNjI3LDcgQEAKICAgICAgICAgQ1JZUFRfU0hBMjU2RmluaXNoKHNoYSwgZGlnZXN0MSk7CiAgICAgfQogICAgIHVpbnQ4X3QqIGFlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIDIwNDgpOwotICAgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBkaWdlc3QxLCAzMiwgVFJVRSk7CisgICAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGRpZ2VzdDEsIDMyLCB0cnVlKTsKICAgICB1aW50OF90IGl2WzE2XTsKICAgICBGWFNZU19tZW1zZXQoaXYsIDAsIDE2KTsKICAgICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKQEAgLTYzNiw3ICs2MzYsNyBAQAogICAgIHBFbmNyeXB0RGljdC0+U2V0QXRTdHJpbmcoYk93bmVyID8gRlhfQlNUUkMoIk9FIikgOiBGWF9CU1RSQygiVUUiKSwgQ0ZYX0J5dGVTdHJpbmcoZGlnZXN0MSwgMzIpKTsKIH0KIHZvaWQgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6QUVTMjU2X1NldFBlcm1zKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBGWF9EV09SRCBwZXJtaXNzaW9ucywKLSAgICAgICAgRlhfQk9PTCBiRW5jcnlwdE1ldGFkYXRhLCBjb25zdCB1aW50OF90KiBrZXkpCisgICAgICAgIGJvb2wgYkVuY3J5cHRNZXRhZGF0YSwgY29uc3QgdWludDhfdCoga2V5KQogewogICAgIHVpbnQ4X3QgYnVmWzE2XTsKICAgICBidWZbMF0gPSAodWludDhfdClwZXJtaXNzaW9uczsKQEAgLTY1Miw3ICs2NTIsNyBAQAogICAgIGJ1ZlsxMF0gPSAnZCc7CiAgICAgYnVmWzExXSA9ICdiJzsKICAgICB1aW50OF90KiBhZXMgPSBGWF9BbGxvYyh1aW50OF90LCAyMDQ4KTsKLSAgICBDUllQVF9BRVNTZXRLZXkoYWVzLCAxNiwga2V5LCAzMiwgVFJVRSk7CisgICAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGtleSwgMzIsIHRydWUpOwogICAgIHVpbnQ4X3QgaXZbMTZdLCBidWYxWzE2XTsKICAgICBGWFNZU19tZW1zZXQoaXYsIDAsIDE2KTsKICAgICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKQEAgLTY2MCw3ICs2NjAsNyBAQAogICAgIEZYX0ZyZWUoYWVzKTsKICAgICBwRW5jcnlwdERpY3QtPlNldEF0U3RyaW5nKEZYX0JTVFJDKCJQZXJtcyIpLCBDRlhfQnl0ZVN0cmluZyhidWYxLCAxNikpOwogfQotdm9pZCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRCbG9jayhGWF9CT09MIGJFbmNyeXB0LCBGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCit2b2lkIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpDcnlwdEJsb2NrKGJvb2wgYkVuY3J5cHQsIEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKICAgICAgICAgdWludDhfdCogZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCiB7CiAgICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX05PTkUpIHsKQEAgLTcyMCwxOCArNzIwLDE4IEBACiB9CiB0eXBlZGVmIHN0cnVjdCBfQUVTQ3J5cHRDb250ZXh0IHsKICAgICB1aW50OF90CQltX0NvbnRleHRbMjA0OF07Ci0gICAgRlhfQk9PTAkJbV9iSVY7CisgICAgYm9vbAkJbV9iSVY7CiAgICAgdWludDhfdAkJbV9CbG9ja1sxNl07CiAgICAgRlhfRFdPUkQJbV9CbG9ja09mZnNldDsKIH0gQUVTQ3J5cHRDb250ZXh0Owotdm9pZCogQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkNyeXB0U3RhcnQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIEZYX0JPT0wgYkVuY3J5cHQpCit2b2lkKiBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRTdGFydChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgYm9vbCBiRW5jcnlwdCkKIHsKICAgICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfTk9ORSkgewogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAgICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUyAmJiBtX0tleUxlbiA9PSAzMikgewogICAgICAgICBBRVNDcnlwdENvbnRleHQqIHBDb250ZXh0ID0gRlhfQWxsb2MoQUVTQ3J5cHRDb250ZXh0LCAxKTsKLSAgICAgICAgcENvbnRleHQtPm1fYklWID0gVFJVRTsKKyAgICAgICAgcENvbnRleHQtPm1fYklWID0gdHJ1ZTsKICAgICAgICAgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPSAwOwogICAgICAgICBDUllQVF9BRVNTZXRLZXkocENvbnRleHQtPm1fQ29udGV4dCwgMTYsIG1fRW5jcnlwdEtleSwgMzIsIGJFbmNyeXB0KTsKICAgICAgICAgaWYgKGJFbmNyeXB0KSB7CkBAIC03NTcsNyArNzU3LDcgQEAKICAgICB9CiAgICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUykgewogICAgICAgICBBRVNDcnlwdENvbnRleHQqIHBDb250ZXh0ID0gRlhfQWxsb2MoQUVTQ3J5cHRDb250ZXh0LCAxKTsKLSAgICAgICAgcENvbnRleHQtPm1fYklWID0gVFJVRTsKKyAgICAgICAgcENvbnRleHQtPm1fYklWID0gdHJ1ZTsKICAgICAgICAgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPSAwOwogICAgICAgICBDUllQVF9BRVNTZXRLZXkocENvbnRleHQtPm1fQ29udGV4dCwgMTYsIHJlYWxrZXksIDE2LCBiRW5jcnlwdCk7CiAgICAgICAgIGlmIChiRW5jcnlwdCkgewpAQCAtNzcyLDI1ICs3NzIsMjUgQEAKICAgICBDUllQVF9BcmNGb3VyU2V0dXAocENvbnRleHQsIHJlYWxrZXksIHJlYWxrZXlsZW4pOwogICAgIHJldHVybiBwQ29udGV4dDsKIH0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkNyeXB0U3RyZWFtKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZiwgRlhfQk9PTCBiRW5jcnlwdCkKK2Jvb2wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkNyeXB0U3RyZWFtKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZiwgYm9vbCBiRW5jcnlwdCkKIHsKICAgICBpZiAoIWNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9OT05FKSB7CiAgICAgICAgIGRlc3RfYnVmLkFwcGVuZEJsb2NrKHNyY19idWYsIHNyY19zaXplKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfUkM0KSB7CiAgICAgICAgIGludCBvbGRfc2l6ZSA9IGRlc3RfYnVmLkdldFNpemUoKTsKICAgICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2soc3JjX2J1Ziwgc3JjX3NpemUpOwogICAgICAgICBDUllQVF9BcmNGb3VyQ3J5cHQoY29udGV4dCwgZGVzdF9idWYuR2V0QnVmZmVyKCkgKyBvbGRfc2l6ZSwgc3JjX3NpemUpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIEFFU0NyeXB0Q29udGV4dCogcENvbnRleHQgPSAoQUVTQ3J5cHRDb250ZXh0Kiljb250ZXh0OwogICAgIGlmIChwQ29udGV4dC0+bV9iSVYgJiYgYkVuY3J5cHQpIHsKICAgICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2socENvbnRleHQtPm1fQmxvY2ssIDE2KTsKLSAgICAgICAgcENvbnRleHQtPm1fYklWID0gRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5tX2JJViA9IGZhbHNlOwogICAgIH0KICAgICBGWF9EV09SRCBzcmNfb2ZmID0gMDsKICAgICBGWF9EV09SRCBzcmNfbGVmdCA9IHNyY19zaXplOwpAQCAtODA2LDcgKzgwNiw3IEBACiAgICAgICAgIGlmIChwQ29udGV4dC0+bV9CbG9ja09mZnNldCA9PSAxNikgewogICAgICAgICAgICAgaWYgKCFiRW5jcnlwdCAmJiBwQ29udGV4dC0+bV9iSVYpIHsKICAgICAgICAgICAgICAgICBDUllQVF9BRVNTZXRJVihwQ29udGV4dC0+bV9Db250ZXh0LCBwQ29udGV4dC0+bV9CbG9jayk7Ci0gICAgICAgICAgICAgICAgcENvbnRleHQtPm1fYklWID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcENvbnRleHQtPm1fYklWID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPSAwOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNfb2ZmIDwgc3JjX3NpemUpIHsKICAgICAgICAgICAgICAgICB1aW50OF90IGJsb2NrX2J1ZlsxNl07CkBAIC04MjMsMTkgKzgyMywxOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpDcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZiwgRlhfQk9PTCBiRW5jcnlwdCkKK2Jvb2wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkNyeXB0RmluaXNoKHZvaWQqIGNvbnRleHQsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmLCBib29sIGJFbmNyeXB0KQogewogICAgIGlmICghY29udGV4dCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX05PTkUpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfUkM0KSB7CiAgICAgICAgIEZYX0ZyZWUoY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQUVTQ3J5cHRDb250ZXh0KiBwQ29udGV4dCA9IChBRVNDcnlwdENvbnRleHQqKWNvbnRleHQ7CiAgICAgaWYgKGJFbmNyeXB0KSB7CkBAIC04NTYsMjQgKzg1NiwyNCBAQAogICAgICAgICB9CiAgICAgfQogICAgIEZYX0ZyZWUocENvbnRleHQpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCogQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkRlY3J5cHRTdGFydChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSkKIHsKLSAgICByZXR1cm4gQ3J5cHRTdGFydChvYmpudW0sIGdlbm51bSwgRkFMU0UpOworICAgIHJldHVybiBDcnlwdFN0YXJ0KG9iam51bSwgZ2VubnVtLCBmYWxzZSk7CiB9CiBGWF9EV09SRCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdEdldFNpemUoRlhfRFdPUkQgc3JjX3NpemUpCiB7CiAgICAgcmV0dXJuIG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUyA/IHNyY19zaXplIC0gMTYgOiBzcmNfc2l6ZTsKIH0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkluaXQoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIENQREZfU2VjdXJpdHlIYW5kbGVyKiBwU2VjdXJpdHlIYW5kbGVyKQorYm9vbCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6SW5pdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIpCiB7CiAgICAgY29uc3QgdWludDhfdCoga2V5OwogICAgIGlmICghcFNlY3VyaXR5SGFuZGxlci0+R2V0Q3J5cHRJbmZvKG1fQ2lwaGVyLCBrZXksIG1fS2V5TGVuKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fS2V5TGVuID4gMzIgfHwgbV9LZXlMZW4gPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9DaXBoZXIgIT0gRlhDSVBIRVJfTk9ORSkgewogICAgICAgICBGWFNZU19tZW1jcHkobV9FbmNyeXB0S2V5LCBrZXksIG1fS2V5TGVuKTsKQEAgLTg4MSw5ICs4ODEsOSBAQAogICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9BRVMpIHsKICAgICAgICAgbV9wQUVTQ29udGV4dCA9IEZYX0FsbG9jKHVpbnQ4X3QsIDIwNDgpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkluaXQoaW50IGNpcGhlciwgY29uc3QgdWludDhfdCoga2V5LCBpbnQga2V5bGVuKQorYm9vbCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6SW5pdChpbnQgY2lwaGVyLCBjb25zdCB1aW50OF90KiBrZXksIGludCBrZXlsZW4pCiB7CiAgICAgaWYgKGNpcGhlciA9PSBGWENJUEhFUl9BRVMpIHsKICAgICAgICAgc3dpdGNoKGtleWxlbikgewpAQCAtODkyLDE1ICs4OTIsMTUgQEAKICAgICAgICAgICAgIGNhc2UgMzI6CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGNpcGhlciA9PSBGWENJUEhFUl9BRVMyKSB7CiAgICAgICAgIGlmIChrZXlsZW4gIT0gMzIpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoY2lwaGVyID09IEZYQ0lQSEVSX1JDNCkgewogICAgICAgICBpZiAoa2V5bGVuIDwgNSB8fCBrZXlsZW4gPiAxNikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKGtleWxlbiA+IDMyKSB7CkBAIC05MTMsMTYgKzkxMywxNiBAQAogICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9BRVMpIHsKICAgICAgICAgbV9wQUVTQ29udGV4dCA9IEZYX0FsbG9jKHVpbnQ4X3QsIDIwNDgpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkRlY3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCitib29sIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpEZWNyeXB0U3RyZWFtKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAogICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKIHsKLSAgICByZXR1cm4gQ3J5cHRTdHJlYW0oY29udGV4dCwgc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmLCBGQUxTRSk7CisgICAgcmV0dXJuIENyeXB0U3RyZWFtKGNvbnRleHQsIHNyY19idWYsIHNyY19zaXplLCBkZXN0X2J1ZiwgZmFsc2UpOwogfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKK2Jvb2wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkRlY3J5cHRGaW5pc2godm9pZCogY29udGV4dCwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpCiB7Ci0gICAgcmV0dXJuIENyeXB0RmluaXNoKGNvbnRleHQsIGRlc3RfYnVmLCBGQUxTRSk7CisgICAgcmV0dXJuIENyeXB0RmluaXNoKGNvbnRleHQsIGRlc3RfYnVmLCBmYWxzZSk7CiB9CiBGWF9EV09SRCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RW5jcnlwdEdldFNpemUoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCB2ZXJzaW9uLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSkKIHsKQEAgLTkzMSwxMSArOTMxLDExIEBACiAgICAgfQogICAgIHJldHVybiBzcmNfc2l6ZTsKIH0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkVuY3J5cHRDb250ZW50KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKK2Jvb2wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkVuY3J5cHRDb250ZW50KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKICAgICAgICAgdWludDhfdCogZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCiB7Ci0gICAgQ3J5cHRCbG9jayhUUlVFLCBvYmpudW0sIGdlbm51bSwgc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmLCBkZXN0X3NpemUpOwotICAgIHJldHVybiBUUlVFOworICAgIENyeXB0QmxvY2sodHJ1ZSwgb2JqbnVtLCBnZW5udW0sIHNyY19idWYsIHNyY19zaXplLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ1BERl9DcnlwdG9IYW5kbGVyOjpEZWNyeXB0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBDRlhfQnl0ZVN0cmluZyYgc3RyKQogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9mZGYuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9mZGYuY3BwCmluZGV4IDE5NThmYWIuLmZmY2U0NmIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZmRmLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2ZkZi5jcHAKQEAgLTksNyArOSw3IEBACiB7CiAgICAgbV9wUm9vdERpY3QgPSBOVUxMOwogICAgIG1fcEZpbGUgPSBOVUxMOwotICAgIG1fYk93bkZpbGUgPSBGQUxTRTsKKyAgICBtX2JPd25GaWxlID0gZmFsc2U7CiB9CiBDRkRGX0RvY3VtZW50Ojp+Q0ZERl9Eb2N1bWVudCgpCiB7CkBAIC0yNiw3ICsyNiw3IEBACiAgICAgcERvYy0+bV9wUm9vdERpY3QtPlNldEF0KEZYX0JTVFJDKCJGREYiKSwgcEZERkRpY3QpOwogICAgIHJldHVybiBwRG9jOwogfQotQ0ZERl9Eb2N1bWVudCogQ0ZERl9Eb2N1bWVudDo6UGFyc2VGaWxlKElGWF9GaWxlUmVhZCAqcEZpbGUsIEZYX0JPT0wgYk93bkZpbGUpCitDRkRGX0RvY3VtZW50KiBDRkRGX0RvY3VtZW50OjpQYXJzZUZpbGUoSUZYX0ZpbGVSZWFkICpwRmlsZSwgYm9vbCBiT3duRmlsZSkKIHsKICAgaWYgKCFwRmlsZSkgewogICAgIHJldHVybiBOVUxMOwpAQCAtNDEsMTYgKzQxLDE2IEBACiB9CiBDRkRGX0RvY3VtZW50KiBDRkRGX0RvY3VtZW50OjpQYXJzZU1lbW9yeShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSkKIHsKLSAgICByZXR1cm4gQ0ZERl9Eb2N1bWVudDo6UGFyc2VGaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSgodWludDhfdCopcERhdGEsIHNpemUpLCBUUlVFKTsKKyAgICByZXR1cm4gQ0ZERl9Eb2N1bWVudDo6UGFyc2VGaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSgodWludDhfdCopcERhdGEsIHNpemUpLCB0cnVlKTsKIH0KLXZvaWQgQ0ZERl9Eb2N1bWVudDo6UGFyc2VTdHJlYW0oSUZYX0ZpbGVSZWFkICpwRmlsZSwgRlhfQk9PTCBiT3duRmlsZSkKK3ZvaWQgQ0ZERl9Eb2N1bWVudDo6UGFyc2VTdHJlYW0oSUZYX0ZpbGVSZWFkICpwRmlsZSwgYm9vbCBiT3duRmlsZSkKIHsKICAgICBtX3BGaWxlID0gcEZpbGU7CiAgICAgbV9iT3duRmlsZSA9IGJPd25GaWxlOwogICAgIENQREZfU3ludGF4UGFyc2VyIHBhcnNlcjsKICAgICBwYXJzZXIuSW5pdFBhcnNlcihtX3BGaWxlLCAwKTsKICAgICB3aGlsZSAoMSkgewotICAgICAgICBGWF9CT09MIGJOdW1iZXI7CisgICAgICAgIGJvb2wgYk51bWJlcjsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IHBhcnNlci5HZXROZXh0V29yZChiTnVtYmVyKTsKICAgICAgICAgaWYgKGJOdW1iZXIpIHsKICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSA9IEZYU1lTX2F0b2kod29yZCk7CkBAIC04NSwxMCArODUsMTAgQEAKICAgICAgICAgfQogICAgIH0KIH0KLUZYX0JPT0wgQ0ZERl9Eb2N1bWVudDo6V3JpdGVCdWYoQ0ZYX0J5dGVUZXh0QnVmJiBidWYpIGNvbnN0Citib29sIENGREZfRG9jdW1lbnQ6OldyaXRlQnVmKENGWF9CeXRlVGV4dEJ1ZiYgYnVmKSBjb25zdAogewogICAgIGlmIChtX3BSb290RGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBidWYgPDwgRlhfQlNUUkMoIiVGREYtMS4yXHJcbiIpOwogICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fSW5kaXJlY3RPYmpzLkdldFN0YXJ0UG9zaXRpb24oKTsKQEAgLTk5LDcgKzk5LDcgQEAKICAgICAgICAgYnVmIDw8IChGWF9EV09SRClvYmpudW0gPDwgRlhfQlNUUkMoIiAwIG9ialxyXG4iKSA8PCBwT2JqIDw8IEZYX0JTVFJDKCJcclxuZW5kb2JqXHJcblxyXG4iKTsKICAgICB9CiAgICAgYnVmIDw8IEZYX0JTVFJDKCJ0cmFpbGVyXHJcbjw8L1Jvb3QgIikgPDwgbV9wUm9vdERpY3QtPkdldE9iak51bSgpIDw8IEZYX0JTVFJDKCIgMCBSPj5cclxuJSVFT0ZcclxuIik7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBDRlhfV2lkZVN0cmluZyBDRkRGX0RvY3VtZW50OjpHZXRXaW4zMlBhdGgoKSBjb25zdAogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9maWx0ZXJzLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZmlsdGVycy5jcHAKaW5kZXggZmVkNDU0Ni4uZjgxYWE3MyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9maWx0ZXJzLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2ZpbHRlcnMuY3BwCkBAIC0yNSw3ICsyNSw3IEBACiAKIENGWF9EYXRhRmlsdGVyOjpDRlhfRGF0YUZpbHRlcigpCiB7Ci0gICAgbV9iRU9GID0gRkFMU0U7CisgICAgbV9iRU9GID0gZmFsc2U7CiAgICAgbV9wRGVzdEZpbHRlciA9IE5VTEw7CiAgICAgbV9TcmNQb3MgPSAwOwogfQpAQCAtNjgsMTQgKzY4LDE0IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgdl9GaWx0ZXJGaW5pc2goZGVzdF9idWYpOwogICAgIH0KLSAgICBtX2JFT0YgPSBUUlVFOworICAgIG1fYkVPRiA9IHRydWU7CiB9CiB2b2lkIENGWF9EYXRhRmlsdGVyOjpSZXBvcnRFT0YoRlhfRFdPUkQgbGVmdF9pbnB1dCkKIHsKICAgICBpZiAobV9iRU9GKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbV9iRU9GID0gVFJVRTsKKyAgICBtX2JFT0YgPSB0cnVlOwogICAgIG1fU3JjUG9zIC09IGxlZnRfaW5wdXQ7CiB9CiBDRlhfRGF0YUZpbHRlciogRlBERl9DcmVhdGVGaWx0ZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQpAQCAtMTEzLDkgKzExMyw5IEBACiAgICAgICAgICAgICByZXR1cm4gbmV3IENQREZfUnVuTGVuRmlsdGVyOwogICAgICAgICBjYXNlIEZYQlNUUl9JRCgnQycsICdDJywgJ0knLCAnVCcpOiB7CiAgICAgICAgICAgICAgICAgaW50IEVuY29kaW5nID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgYkVuZE9mTGluZSA9IEZBTFNFOwotICAgICAgICAgICAgICAgIGludCBiQnl0ZUFsaWduID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgaW50IGJCbGFjayA9IEZBTFNFOworICAgICAgICAgICAgICAgIGludCBiRW5kT2ZMaW5lID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW50IGJCeXRlQWxpZ24gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpbnQgYkJsYWNrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaW50IG5Sb3dzID0gMDsKICAgICAgICAgICAgICAgICBpbnQgbkNvbHVtbnMgPSAxNzI4OwogICAgICAgICAgICAgICAgIGlmIChwUGFyYW0pIHsKQEAgLTE3OCw3ICsxNzgsNyBAQAogICAgIH0KICAgICByZXR1cm4gcEZpcnN0RmlsdGVyOwogfQotQ1BERl9TdHJlYW1GaWx0ZXIqIENQREZfU3RyZWFtOjpHZXRTdHJlYW1GaWx0ZXIoRlhfQk9PTCBiUmF3KSBjb25zdAorQ1BERl9TdHJlYW1GaWx0ZXIqIENQREZfU3RyZWFtOjpHZXRTdHJlYW1GaWx0ZXIoYm9vbCBiUmF3KSBjb25zdAogewogICAgIENGWF9EYXRhRmlsdGVyKiBwRmlyc3RGaWx0ZXIgPSBOVUxMOwogICAgIGlmIChtX3BDcnlwdG9IYW5kbGVyKSB7CkBAIC0yOTQsNyArMjk0LDcgQEAKIH0KIHZvaWQgQ1BERl9EZWNyeXB0RmlsdGVyOjp2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKIHsKLSAgICBtX2JFT0YgPSBUUlVFOworICAgIG1fYkVPRiA9IHRydWU7CiAgICAgaWYgKG1fcENvbnRleHQgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMzMwLDcgKzMzMCw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1DUERGX0x6d0ZpbHRlcjo6Q1BERl9MendGaWx0ZXIoRlhfQk9PTCBiRWFybHlDaGFuZ2UpCitDUERGX0x6d0ZpbHRlcjo6Q1BERl9MendGaWx0ZXIoYm9vbCBiRWFybHlDaGFuZ2UpCiB7CiAgICAgbV9iRWFybHlDaGFuZ2UgPSBiRWFybHlDaGFuZ2UgPyAxIDogMDsKICAgICBtX0NvZGVMZW4gPSA5OwpAQCAtNjk3LDcgKzY5Nyw3IEBACiBDUERGX0pwZWdGaWx0ZXI6OkNQREZfSnBlZ0ZpbHRlcigpCiB7CiAgICAgbV9wQ29udGV4dCA9IE5VTEw7Ci0gICAgbV9iR290SGVhZGVyID0gRkFMU0U7CisgICAgbV9iR290SGVhZGVyID0gZmFsc2U7CiAgICAgbV9wU2NhbmxpbmUgPSBOVUxMOwogICAgIG1faUxpbmUgPSAwOwogfQpAQCAtNzQyLDcgKzc0Miw3IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCktPlN0YXJ0U2NhbmxpbmUobV9wQ29udGV4dCwgMSk7Ci0gICAgICAgIG1fYkdvdEhlYWRlciA9IFRSVUU7CisgICAgICAgIG1fYkdvdEhlYWRlciA9IHRydWU7CiAgICAgICAgIG1fUGl0Y2ggPSBtX1dpZHRoICogbV9uQ29tcHM7CiAgICAgfQogICAgIGlmIChtX3BTY2FubGluZSA9PSBOVUxMKSB7CkBAIC03NjUsOSArNzY1LDkgQEAKIENQREZfRmF4RmlsdGVyOjpDUERGX0ZheEZpbHRlcigpCiB7CiAgICAgbV9FbmNvZGluZyA9IDA7Ci0gICAgbV9iRW5kT2ZMaW5lID0gRkFMU0U7Ci0gICAgbV9iQnl0ZUFsaWduID0gRkFMU0U7Ci0gICAgbV9iQmxhY2sgPSBGQUxTRTsKKyAgICBtX2JFbmRPZkxpbmUgPSBmYWxzZTsKKyAgICBtX2JCeXRlQWxpZ24gPSBmYWxzZTsKKyAgICBtX2JCbGFjayA9IGZhbHNlOwogICAgIG1fblJvd3MgPSAwOwogICAgIG1fbkNvbHVtbnMgPSAwOwogICAgIG1fUGl0Y2ggPSAwOwpAQCAtNzg1LDcgKzc4NSw3IEBACiAgICAgICAgIEZYX0ZyZWUobV9wUmVmQnVmKTsKICAgICB9CiB9Ci1GWF9CT09MIENQREZfRmF4RmlsdGVyOjpJbml0aWFsaXplKGludCBFbmNvZGluZywgaW50IGJFbmRPZkxpbmUsIGludCBiQnl0ZUFsaWduLCBpbnQgYkJsYWNrLCBpbnQgblJvd3MsIGludCBuQ29sdW1ucykKK2Jvb2wgQ1BERl9GYXhGaWx0ZXI6OkluaXRpYWxpemUoaW50IEVuY29kaW5nLCBpbnQgYkVuZE9mTGluZSwgaW50IGJCeXRlQWxpZ24sIGludCBiQmxhY2ssIGludCBuUm93cywgaW50IG5Db2x1bW5zKQogewogICAgIG1fRW5jb2RpbmcgPSBFbmNvZGluZzsKICAgICBtX2JFbmRPZkxpbmUgPSBiRW5kT2ZMaW5lOwpAQCAtODAwLDcgKzgwMCw3IEBACiAgICAgRlhTWVNfbWVtc2V0KG1fcFJlZkJ1ZiwgMHhmZiwgbV9QaXRjaCk7CiAgICAgbV9pUm93ID0gMDsKICAgICBtX0lucHV0Qml0UG9zID0gMDsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ1BERl9GYXhGaWx0ZXI6OnZfRmlsdGVySW4oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKQogewpAQCAtODIxLDE5ICs4MjEsMTkgQEAKICAgICAgICAgZmF4X3NyY19zaXplID0gc3JjX3NpemU7CiAgICAgICAgIGJpdHBvcyA9IDA7CiAgICAgfQotICAgIFByb2Nlc3NEYXRhKGZheF9zcmNfYnVmLCBmYXhfc3JjX3NpemUsIGJpdHBvcywgRkFMU0UsIGRlc3RfYnVmKTsKKyAgICBQcm9jZXNzRGF0YShmYXhfc3JjX2J1ZiwgZmF4X3NyY19zaXplLCBiaXRwb3MsIGZhbHNlLCBkZXN0X2J1Zik7CiAgICAgaW50IGxlZnRfYml0cyA9IGZheF9zcmNfc2l6ZSAqIDggLSBiaXRwb3M7CiAgICAgbV9JbnB1dEJ1Zi5BcHBlbmRCbG9jayhmYXhfc3JjX2J1ZiArIGJpdHBvcyAvIDgsIChsZWZ0X2JpdHMgKyA3KSAvIDgpOwogICAgIG1fSW5wdXRCaXRQb3MgPSBiaXRwb3MgJSA4OwogfQogdm9pZCBDUERGX0ZheEZpbHRlcjo6dl9GaWx0ZXJGaW5pc2goQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpCiB7Ci0gICAgUHJvY2Vzc0RhdGEobV9JbnB1dEJ1Zi5HZXRCdWZmZXIoKSwgbV9JbnB1dEJ1Zi5HZXRTaXplKCksIG1fSW5wdXRCaXRQb3MsIFRSVUUsIGRlc3RfYnVmKTsKKyAgICBQcm9jZXNzRGF0YShtX0lucHV0QnVmLkdldEJ1ZmZlcigpLCBtX0lucHV0QnVmLkdldFNpemUoKSwgbV9JbnB1dEJpdFBvcywgdHJ1ZSwgZGVzdF9idWYpOwogfQotRlhfQk9PTCBfRmF4U2tpcEVPTChjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MpOwotRlhfQk9PTCBfRmF4RzRHZXRSb3coY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zLCB1aW50OF90KiBkZXN0X2J1ZiwgY29uc3QgdWludDhfdCogcmVmX2J1ZiwgaW50IGNvbHVtbnMpOwotRlhfQk9PTCBfRmF4R2V0MURMaW5lKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQmIGJpdHBvcywgdWludDhfdCogZGVzdF9idWYsIGludCBjb2x1bW5zKTsKLXZvaWQgQ1BERl9GYXhGaWx0ZXI6OlByb2Nlc3NEYXRhKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIGJpdHBvcywgRlhfQk9PTCBiRmluaXNoLAorYm9vbCBfRmF4U2tpcEVPTChjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MpOworYm9vbCBfRmF4RzRHZXRSb3coY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zLCB1aW50OF90KiBkZXN0X2J1ZiwgY29uc3QgdWludDhfdCogcmVmX2J1ZiwgaW50IGNvbHVtbnMpOworYm9vbCBfRmF4R2V0MURMaW5lKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQmIGJpdHBvcywgdWludDhfdCogZGVzdF9idWYsIGludCBjb2x1bW5zKTsKK3ZvaWQgQ1BERl9GYXhGaWx0ZXI6OlByb2Nlc3NEYXRhKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIGJpdHBvcywgYm9vbCBiRmluaXNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpCiB7CiAgICAgaW50IGJpdHNpemUgPSBzcmNfc2l6ZSAqIDg7CkBAIC04NjMsMjEgKzg2MywyMSBAQAogICAgICAgICB9CiAgICAgfQogfQotRlhfQk9PTCBDUERGX0ZheEZpbHRlcjo6UmVhZExpbmUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zKQorYm9vbCBDUERGX0ZheEZpbHRlcjo6UmVhZExpbmUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zKQogewogICAgIGlmICghX0ZheFNraXBFT0woc3JjX2J1ZiwgYml0c2l6ZSwgYml0cG9zKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgRlhfQk9PTCByZXQ7CisgICAgYm9vbCByZXQ7CiAgICAgaWYgKG1fRW5jb2RpbmcgPCAwKSB7CiAgICAgICAgIHJldCA9IF9GYXhHNEdldFJvdyhzcmNfYnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX3BSZWZCdWYsIG1fbkNvbHVtbnMpOwogICAgIH0gZWxzZSBpZiAobV9FbmNvZGluZyA9PSAwKSB7CiAgICAgICAgIHJldCA9IF9GYXhHZXQxRExpbmUoc3JjX2J1ZiwgYml0c2l6ZSwgYml0cG9zLCBtX3BTY2FubGluZUJ1ZiwgbV9uQ29sdW1ucyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKGJpdHBvcyA9PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCBiTmV4dDFEID0gc3JjX2J1ZltiaXRwb3MgLyA4XSAmICgxIDw8ICg3IC0gYml0cG9zICUgOCkpOworICAgICAgICBib29sIGJOZXh0MUQgPSBzcmNfYnVmW2JpdHBvcyAvIDhdICYgKDEgPDwgKDcgLSBiaXRwb3MgJSA4KSk7CiAgICAgICAgIGJpdHBvcyArKzsKICAgICAgICAgaWYgKGJOZXh0MUQpIHsKICAgICAgICAgICAgIHJldCA9IF9GYXhHZXQxRExpbmUoc3JjX2J1ZiwgYml0c2l6ZSwgYml0cG9zLCBtX3BTY2FubGluZUJ1ZiwgbV9uQ29sdW1ucyk7CkBAIC04ODYsMTQgKzg4NiwxNCBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmICghcmV0KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9iRW5kT2ZMaW5lKQogICAgICAgICBpZiAoIV9GYXhTa2lwRU9MKHNyY19idWYsIGJpdHNpemUsIGJpdHBvcykpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIGlmIChtX2JCeXRlQWxpZ24pIHsKICAgICAgICAgYml0cG9zID0gKGJpdHBvcyArIDcpIC8gOCAqIDg7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9vYmplY3RzLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfb2JqZWN0cy5jcHAKaW5kZXggYzdkMWRlYy4uOTZlNjgwNyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9vYmplY3RzLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX29iamVjdHMuY3BwCkBAIC0xODAsNyArMTgwLDcgQEAKICAgICAgICAgICAgICgoQ1BERl9OYW1lKil0aGlzKS0+bV9OYW1lID0gc3RyOwogICAgICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBU1NFUlQoRkFMU0UpOworICAgIEFTU0VSVChmYWxzZSk7CiB9CiBpbnQgQ1BERl9PYmplY3Q6OkdldERpcmVjdFR5cGUoKSBjb25zdAogewpAQCAtMTkwLDEzICsxOTAsMTMgQEAKICAgICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IChDUERGX1JlZmVyZW5jZSopdGhpczsKICAgICByZXR1cm4gcFJlZi0+bV9wT2JqTGlzdC0+R2V0SW5kaXJlY3RUeXBlKHBSZWYtPm1fUmVmT2JqTnVtKTsKIH0KLUZYX0JPT0wgQ1BERl9PYmplY3Q6OklzSWRlbnRpY2FsKENQREZfT2JqZWN0KiBwT3RoZXIpIGNvbnN0Citib29sIENQREZfT2JqZWN0OjpJc0lkZW50aWNhbChDUERGX09iamVjdCogcE90aGVyKSBjb25zdAogewogICAgIGlmICh0aGlzID09IHBPdGhlcikgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChwT3RoZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBPdGhlci0+bV9UeXBlICE9IG1fVHlwZSkgewogICAgICAgICBpZiAobV9UeXBlID09IFBERk9CSl9SRUZFUkVOQ0UgJiYgR2V0RGlyZWN0KCkpIHsKQEAgLTIwNSw3ICsyMDUsNyBAQAogICAgICAgICBpZiAocE90aGVyLT5tX1R5cGUgPT0gUERGT0JKX1JFRkVSRU5DRSkgewogICAgICAgICAgICAgcmV0dXJuIElzSWRlbnRpY2FsKHBPdGhlci0+R2V0RGlyZWN0KCkpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBzd2l0Y2ggKG1fVHlwZSkgewogICAgICAgICBjYXNlIFBERk9CSl9CT09MRUFOOgpAQCAtMjIxLDEzICsyMjEsMTMgQEAKICAgICAgICAgY2FzZSBQREZPQkpfRElDVElPTkFSWToKICAgICAgICAgICAgIHJldHVybiAoKChDUERGX0RpY3Rpb25hcnkqKXRoaXMpLT5JZGVudGljYWwoKENQREZfRGljdGlvbmFyeSopcE90aGVyKSk7CiAgICAgICAgIGNhc2UgUERGT0JKX05VTEw6Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBjYXNlIFBERk9CSl9TVFJFQU06CiAgICAgICAgICAgICByZXR1cm4gKCgoQ1BERl9TdHJlYW0qKXRoaXMpLT5JZGVudGljYWwoKENQREZfU3RyZWFtKilwT3RoZXIpKTsKICAgICAgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOgogICAgICAgICAgICAgcmV0dXJuICgoKENQREZfUmVmZXJlbmNlKil0aGlzKS0+SWRlbnRpY2FsKChDUERGX1JlZmVyZW5jZSopcE90aGVyKSk7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBDUERGX09iamVjdCogQ1BERl9PYmplY3Q6OkdldERpcmVjdCgpIGNvbnN0CiB7CkBAIC0yNDAsMTIgKzI0MCwxMiBAQAogICAgIH0KICAgICByZXR1cm4gcFJlZi0+bV9wT2JqTGlzdC0+R2V0SW5kaXJlY3RPYmplY3QocFJlZi0+bV9SZWZPYmpOdW0pOwogfQotQ1BERl9PYmplY3QqIENQREZfT2JqZWN0OjpDbG9uZShGWF9CT09MIGJEaXJlY3QpIGNvbnN0CitDUERGX09iamVjdCogQ1BERl9PYmplY3Q6OkNsb25lKGJvb2wgYkRpcmVjdCkgY29uc3QKIHsKICAgICBDRlhfTWFwUHRyVG9QdHIgdmlzaXRlZDsKICAgICByZXR1cm4gQ2xvbmVJbnRlcm5hbChiRGlyZWN0LCAmdmlzaXRlZCk7CiB9Ci1DUERGX09iamVjdCogQ1BERl9PYmplY3Q6OkNsb25lSW50ZXJuYWwoRlhfQk9PTCBiRGlyZWN0LCBDRlhfTWFwUHRyVG9QdHIqIHZpc2l0ZWQpIGNvbnN0CitDUERGX09iamVjdCogQ1BERl9PYmplY3Q6OkNsb25lSW50ZXJuYWwoYm9vbCBiRGlyZWN0LCBDRlhfTWFwUHRyVG9QdHIqIHZpc2l0ZWQpIGNvbnN0CiB7CiAgICAgc3dpdGNoIChtX1R5cGUpIHsKICAgICAgICAgY2FzZSBQREZPQkpfQk9PTEVBTjoKQEAgLTI4NCw3ICsyODQsNyBAQAogICAgICAgICBjYXNlIFBERk9CSl9TVFJFQU06IHsKICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbSogcFRoaXMgPSAoQ1BERl9TdHJlYW0qKXRoaXM7CiAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW1BY2MgYWNjOwotICAgICAgICAgICAgICAgIGFjYy5Mb2FkQWxsRGF0YShwVGhpcywgVFJVRSk7CisgICAgICAgICAgICAgICAgYWNjLkxvYWRBbGxEYXRhKHBUaGlzLCB0cnVlKTsKICAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJlYW1TaXplID0gYWNjLkdldFNpemUoKTsKICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFRoaXMtPkdldERpY3QoKTsKICAgICAgICAgICAgICAgICBpZiAocERpY3QpCkBAIC0yOTksNyArMjk5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFwUmVmLT5HZXREaXJlY3QoKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwUmVmLT5HZXREaXJlY3QoKS0+Q2xvbmVJbnRlcm5hbChUUlVFLCB2aXNpdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBSZWYtPkdldERpcmVjdCgpLT5DbG9uZUludGVybmFsKHRydWUsIHZpc2l0ZWQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENQREZfUmVmZXJlbmNlKHBSZWYtPm1fcE9iakxpc3QsIG9ial9udW0pOwogICAgICAgICAgICAgfQpAQCAtMzIwLDcgKzMyMCw3IEBACiAgICAgfQogICAgIGlmIChtX1R5cGUgPT0gUERGT0JKX1NUUkVBTSkgewogICAgICAgICBDUERGX1N0cmVhbUFjYyBzdHJlYW07Ci0gICAgICAgIHN0cmVhbS5Mb2FkQWxsRGF0YSgoQ1BERl9TdHJlYW0qKXRoaXMsIEZBTFNFKTsKKyAgICAgICAgc3RyZWFtLkxvYWRBbGxEYXRhKChDUERGX1N0cmVhbSopdGhpcywgZmFsc2UpOwogICAgICAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQgPSBQREZfRGVjb2RlVGV4dChzdHJlYW0uR2V0RGF0YSgpLCBzdHJlYW0uR2V0U2l6ZSgpLCBwQ2hhck1hcCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtMzM1LDE5ICszMzUsMTkgQEAKICAgICAgICAgKChDUERGX1N0cmluZyopdGhpcyktPm1fU3RyaW5nID0gUERGX0VuY29kZVRleHQocFVuaWNvZGVzLCBsZW4pOwogICAgIH0gZWxzZSBpZiAobV9UeXBlID09IFBERk9CSl9TVFJFQU0pIHsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0ID0gUERGX0VuY29kZVRleHQocFVuaWNvZGVzLCBsZW4pOwotICAgICAgICAoKENQREZfU3RyZWFtKil0aGlzKS0+U2V0RGF0YSgodWludDhfdCopcmVzdWx0LmNfc3RyKCksIHJlc3VsdC5HZXRMZW5ndGgoKSwgRkFMU0UsIEZBTFNFKTsKKyAgICAgICAgKChDUERGX1N0cmVhbSopdGhpcyktPlNldERhdGEoKHVpbnQ4X3QqKXJlc3VsdC5jX3N0cigpLCByZXN1bHQuR2V0TGVuZ3RoKCksIGZhbHNlLCBmYWxzZSk7CiAgICAgfQogfQogCiBDUERGX051bWJlcjo6Q1BERl9OdW1iZXIoaW50IHZhbHVlKQotICAgIDogQ1BERl9PYmplY3QoUERGT0JKX05VTUJFUiksIG1fYkludGVnZXIoVFJVRSksIG1fSW50ZWdlcih2YWx1ZSkgeworICAgIDogQ1BERl9PYmplY3QoUERGT0JKX05VTUJFUiksIG1fYkludGVnZXIodHJ1ZSksIG1fSW50ZWdlcih2YWx1ZSkgewogfQogCiBDUERGX051bWJlcjo6Q1BERl9OdW1iZXIoRlhfRkxPQVQgdmFsdWUpCi0gICAgOiBDUERGX09iamVjdChQREZPQkpfTlVNQkVSKSwgbV9iSW50ZWdlcihGQUxTRSksIG1fRmxvYXQodmFsdWUpIHsKKyAgICA6IENQREZfT2JqZWN0KFBERk9CSl9OVU1CRVIpLCBtX2JJbnRlZ2VyKGZhbHNlKSwgbV9GbG9hdCh2YWx1ZSkgewogfQogCi1DUERGX051bWJlcjo6Q1BERl9OdW1iZXIoRlhfQk9PTCBiSW50ZWdlciwgdm9pZCogcERhdGEpCitDUERGX051bWJlcjo6Q1BERl9OdW1iZXIoYm9vbCBiSW50ZWdlciwgdm9pZCogcERhdGEpCiAgICAgOiBDUERGX09iamVjdChQREZPQkpfTlVNQkVSKSwgbV9iSW50ZWdlcihiSW50ZWdlciksIG1fSW50ZWdlcigqKGludCopcERhdGEpIHsKIH0KIApAQCAtMzU5LDcgKzM1OSw3IEBACiB7CiAgICAgRlhfYXRvbnVtKHN0ciwgbV9iSW50ZWdlciwgJm1fSW50ZWdlcik7CiB9Ci1GWF9CT09MIENQREZfTnVtYmVyOjpJZGVudGljYWwoQ1BERl9OdW1iZXIqIHBPdGhlcikgY29uc3QKK2Jvb2wgQ1BERl9OdW1iZXI6OklkZW50aWNhbChDUERGX051bWJlciogcE90aGVyKSBjb25zdAogewogICAgIHJldHVybiBtX2JJbnRlZ2VyID09IHBPdGhlci0+bV9iSW50ZWdlciAmJiBtX0ludGVnZXIgPT0gcE90aGVyLT5tX0ludGVnZXI7CiB9CkBAIC0zNjksMTAgKzM2OSwxMCBAQAogfQogdm9pZCBDUERGX051bWJlcjo6U2V0TnVtYmVyKEZYX0ZMT0FUIHZhbHVlKQogewotICAgIG1fYkludGVnZXIgPSBGQUxTRTsKKyAgICBtX2JJbnRlZ2VyID0gZmFsc2U7CiAgICAgbV9GbG9hdCA9IHZhbHVlOwogfQotQ1BERl9TdHJpbmc6OkNQREZfU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIDogQ1BERl9PYmplY3QoUERGT0JKX1NUUklORyksIG1fYkhleChGQUxTRSkgeworQ1BERl9TdHJpbmc6OkNQREZfU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIDogQ1BERl9PYmplY3QoUERGT0JKX1NUUklORyksIG1fYkhleChmYWxzZSkgewogICAgIG1fU3RyaW5nID0gUERGX0VuY29kZVRleHQoc3RyKTsKIH0KIENQREZfQXJyYXk6On5DUERGX0FycmF5KCkKQEAgLTU1MywxNiArNTUzLDE2IEBACiAgICAgQVNTRVJUKG1fVHlwZSA9PSBQREZPQkpfQVJSQVkpOwogICAgIEFkZChuZXcgQ1BERl9SZWZlcmVuY2UocERvYywgb2JqbnVtKSk7CiB9Ci1GWF9CT09MIENQREZfQXJyYXk6OklkZW50aWNhbChDUERGX0FycmF5KiBwT3RoZXIpIGNvbnN0Citib29sIENQREZfQXJyYXk6OklkZW50aWNhbChDUERGX0FycmF5KiBwT3RoZXIpIGNvbnN0CiB7CiAgICAgaWYgKG1fT2JqZWN0cy5HZXRTaXplKCkgIT0gcE90aGVyLT5tX09iamVjdHMuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fT2JqZWN0cy5HZXRTaXplKCk7IGkgKyspCiAgICAgICAgIGlmICghKChDUERGX09iamVjdCopbV9PYmplY3RzW2ldKS0+SXNJZGVudGljYWwoKENQREZfT2JqZWN0KilwT3RoZXItPm1fT2JqZWN0c1tpXSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQ1BERl9EaWN0aW9uYXJ5Ojp+Q1BERl9EaWN0aW9uYXJ5KCkKIHsKQEAgLTY3Nyw3ICs2NzcsNyBAQAogICAgIH0KICAgICByZXR1cm4gMDsKIH0KLUZYX0JPT0wgQ1BERl9EaWN0aW9uYXJ5OjpHZXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBGWF9CT09MIGJEZWZhdWx0KSBjb25zdAorYm9vbCBDUERGX0RpY3Rpb25hcnk6OkdldEJvb2xlYW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGJvb2wgYkRlZmF1bHQpIGNvbnN0CiB7CiAgICAgQ1BERl9PYmplY3QqIHAgPSBOVUxMOwogICAgIG1fTWFwLkxvb2t1cChrZXksICh2b2lkKiYpcCk7CkBAIC03MzQsNyArNzM0LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIG1hdHJpeDsKIH0KLUZYX0JPT0wgQ1BERl9EaWN0aW9uYXJ5OjpLZXlFeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3QKK2Jvb2wgQ1BERl9EaWN0aW9uYXJ5OjpLZXlFeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3QKIHsKICAgICB2b2lkKiB2YWx1ZTsKICAgICByZXR1cm4gbV9NYXAuTG9va3VwKGtleSwgdmFsdWUpOwpAQCAtNzg2LDEzICs3ODYsMTMgQEAKICAgICBtX01hcC5SZW1vdmVLZXkob2xka2V5KTsKICAgICBtX01hcC5TZXRBdChuZXdrZXksIHApOwogfQotRlhfQk9PTCBDUERGX0RpY3Rpb25hcnk6OklkZW50aWNhbChDUERGX0RpY3Rpb25hcnkqIHBPdGhlcikgY29uc3QKK2Jvb2wgQ1BERl9EaWN0aW9uYXJ5OjpJZGVudGljYWwoQ1BERl9EaWN0aW9uYXJ5KiBwT3RoZXIpIGNvbnN0CiB7CiAgICAgaWYgKHBPdGhlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9NYXAuR2V0Q291bnQoKSAhPSBwT3RoZXItPm1fTWFwLkdldENvdW50KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKICAgICB3aGlsZSAocG9zKSB7CkBAIC04MDAsMTIgKzgwMCwxMiBAQAogICAgICAgICB2b2lkKiB2YWx1ZTsKICAgICAgICAgbV9NYXAuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7CiAgICAgICAgIGlmICghdmFsdWUpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGlmICghKChDUERGX09iamVjdCopdmFsdWUpLT5Jc0lkZW50aWNhbChwT3RoZXItPkdldEVsZW1lbnQoa2V5KSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGludCBpKQogewpAQCAtODMzLDcgKzgzMyw3IEBACiAgICAgcE51bWJlci0+U2V0TnVtYmVyKGYpOwogICAgIFNldEF0KGtleSwgcE51bWJlcik7CiB9Ci12b2lkIENQREZfRGljdGlvbmFyeTo6U2V0QXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBGWF9CT09MIGJWYWx1ZSkKK3ZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdEJvb2xlYW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGJvb2wgYlZhbHVlKQogewogICAgIFNldEF0KGtleSwgbmV3IENQREZfQm9vbGVhbihiVmFsdWUpKTsKIH0KQEAgLTkwNSw3ICs5MDUsNyBAQAogICAgICAgICBtX3BEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkxlbmd0aCIpLCBzaXplKTsKICAgICB9CiB9Ci12b2lkIENQREZfU3RyZWFtOjpTZXREYXRhKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBGWF9CT09MIGJDb21wcmVzc2VkLCBGWF9CT09MIGJLZWVwQnVmKQordm9pZCBDUERGX1N0cmVhbTo6U2V0RGF0YShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgYm9vbCBiQ29tcHJlc3NlZCwgYm9vbCBiS2VlcEJ1ZikKIHsKICAgICBpZiAobV9HZW5OdW0gPT0gKEZYX0RXT1JEKSAtIDEpIHsKICAgICAgICAgaWYgKG1fcERhdGFCdWYpIHsKQEAgLTkzMyw3ICs5MzMsNyBAQAogICAgICAgICBtX3BEaWN0LT5SZW1vdmVBdChGWF9CU1RSQygiRGVjb2RlUGFybXMiKSk7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX1N0cmVhbTo6UmVhZFJhd0RhdGEoRlhfRklMRVNJWkUgb2Zmc2V0LCB1aW50OF90KiBidWYsIEZYX0RXT1JEIHNpemUpIGNvbnN0Citib29sIENQREZfU3RyZWFtOjpSZWFkUmF3RGF0YShGWF9GSUxFU0laRSBvZmZzZXQsIHVpbnQ4X3QqIGJ1ZiwgRlhfRFdPUkQgc2l6ZSkgY29uc3QKIHsKICAgICBpZiAoKG1fR2VuTnVtICE9IChGWF9EV09SRCkgLSAxKSAmJiBtX3BGaWxlKSB7CiAgICAgICAgIHJldHVybiBtX3BGaWxlLT5SZWFkQmxvY2soYnVmLCBtX0ZpbGVPZmZzZXQgKyBvZmZzZXQsIHNpemUpOwpAQCAtOTQxLDcgKzk0MSw3IEBACiAgICAgaWYgKG1fcERhdGFCdWYpIHsKICAgICAgICAgRlhTWVNfbWVtY3B5KGJ1ZiwgbV9wRGF0YUJ1ZiArIG9mZnNldCwgc2l6ZSk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDUERGX1N0cmVhbTo6SW5pdFN0cmVhbShJRlhfRmlsZVJlYWQgKnBGaWxlLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KQogewpAQCAtOTUyLDIzICs5NTIsMjMgQEAKICAgICAgICAgbV9wRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJMZW5ndGgiKSwgbV9kd1NpemUpOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9TdHJlYW06OklkZW50aWNhbChDUERGX1N0cmVhbSogcE90aGVyKSBjb25zdAorYm9vbCBDUERGX1N0cmVhbTo6SWRlbnRpY2FsKENQREZfU3RyZWFtKiBwT3RoZXIpIGNvbnN0CiB7CiAgICAgaWYgKCFtX3BEaWN0KQotICAgICAgICByZXR1cm4gcE90aGVyLT5tX3BEaWN0ID8gRkFMU0UgOiBUUlVFOworICAgICAgICByZXR1cm4gcE90aGVyLT5tX3BEaWN0ID8gZmFsc2UgOiB0cnVlOwogCiAgICAgaWYgKCFtX3BEaWN0LT5JZGVudGljYWwocE90aGVyLT5tX3BEaWN0KSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fZHdTaXplICE9IHBPdGhlci0+bV9kd1NpemUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX0dlbk51bSAhPSAoRlhfRFdPUkQpIC0gMSAmJiBwT3RoZXItPm1fR2VuTnVtICE9IChGWF9EV09SRCkgLSAxKSB7CiAgICAgICAgIGlmIChtX3BGaWxlID09IHBPdGhlci0+bV9wRmlsZSAmJiBtX3BGaWxlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFtX3BGaWxlIHx8ICFwT3RoZXItPm1fcEZpbGUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICB1aW50OF90IHNyY0J1ZlsxMDI0XTsKICAgICAgICAgdWludDhfdCBkZXN0QnVmWzEwMjRdOwpAQCAtOTc2LDIwICs5NzYsMjAgQEAKICAgICAgICAgRlhfRFdPUkQgc3JjT2Zmc2V0ID0gbV9GaWxlT2Zmc2V0OwogICAgICAgICBGWF9EV09SRCBkZXN0T2Zmc2V0ID0gcE90aGVyLT5tX0ZpbGVPZmZzZXQ7CiAgICAgICAgIGlmIChtX3BGaWxlID09IHBPdGhlci0+bV9wRmlsZSAmJiBzcmNPZmZzZXQgPT0gZGVzdE9mZnNldCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICB3aGlsZSAoc2l6ZSA+IDApIHsKICAgICAgICAgICAgIEZYX0RXT1JEIGFjdHVhbFNpemUgPSBzaXplID4gMTAyNCA/IDEwMjQgOiBzaXplOwogICAgICAgICAgICAgbV9wRmlsZS0+UmVhZEJsb2NrKHNyY0J1Ziwgc3JjT2Zmc2V0LCBhY3R1YWxTaXplKTsKICAgICAgICAgICAgIHBPdGhlci0+bV9wRmlsZS0+UmVhZEJsb2NrKGRlc3RCdWYsIGRlc3RPZmZzZXQsIGFjdHVhbFNpemUpOwogICAgICAgICAgICAgaWYgKEZYU1lTX21lbWNtcChzcmNCdWYsIGRlc3RCdWYsIGFjdHVhbFNpemUpICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2l6ZSAtPSBhY3R1YWxTaXplOwogICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IGFjdHVhbFNpemU7CiAgICAgICAgICAgICBkZXN0T2Zmc2V0ICs9IGFjdHVhbFNpemU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAobV9HZW5OdW0gIT0gKEZYX0RXT1JEKSAtIDEgfHwgcE90aGVyLT5tX0dlbk51bSAhPSAoRlhfRFdPUkQpIC0gMSkgewogICAgICAgICBJRlhfRmlsZVJlYWQqIHBGaWxlID0gTlVMTDsKQEAgLTEwMDUsNyArMTAwNSw3IEBACiAgICAgICAgICAgICBvZmZzZXQgPSBtX0ZpbGVPZmZzZXQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKE5VTEwgPT0gcEJ1ZikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHVpbnQ4X3Qgc3JjQnVmWzEwMjRdOwogICAgICAgICBGWF9EV09SRCBzaXplID0gbV9kd1NpemU7CkBAIC0xMDEzLDE3ICsxMDEzLDE3IEBACiAgICAgICAgICAgICBGWF9EV09SRCBhY3R1YWxTaXplID0gc3RkOjptaW4oc2l6ZSwgMTAyNFUpOwogICAgICAgICAgICAgcEZpbGUtPlJlYWRCbG9jayhzcmNCdWYsIG9mZnNldCwgYWN0dWFsU2l6ZSk7CiAgICAgICAgICAgICBpZiAoRlhTWVNfbWVtY21wKHNyY0J1ZiwgcEJ1ZiwgYWN0dWFsU2l6ZSkgIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwQnVmICs9IGFjdHVhbFNpemU7CiAgICAgICAgICAgICBzaXplIC09IGFjdHVhbFNpemU7CiAgICAgICAgICAgICBvZmZzZXQgKz0gYWN0dWFsU2l6ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBGWFNZU19tZW1jbXAobV9wRGF0YUJ1ZiwgcE90aGVyLT5tX3BEYXRhQnVmLCBtX2R3U2l6ZSkgPT0gMDsKIH0KLUNQREZfU3RyZWFtKiBDUERGX1N0cmVhbTo6Q2xvbmUoRlhfQk9PTCBiRGlyZWN0LCBGUERGX0xQRkNsb25lU3RyZWFtQ2FsbGJhY2sgbHBmQ2FsbGJhY2ssIHZvaWQqIHBVc2VyRGF0YSkgY29uc3QKK0NQREZfU3RyZWFtKiBDUERGX1N0cmVhbTo6Q2xvbmUoYm9vbCBiRGlyZWN0LCBGUERGX0xQRkNsb25lU3RyZWFtQ2FsbGJhY2sgbHBmQ2FsbGJhY2ssIHZvaWQqIHBVc2VyRGF0YSkgY29uc3QKIHsKICAgICBDUERGX0RpY3Rpb25hcnkgKnBDbG9uZURpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KiltX3BEaWN0LT5DbG9uZShiRGlyZWN0KTsKICAgICBJRlhfRmlsZVN0cmVhbSAqcEZTID0gTlVMTDsKQEAgLTEwMzIsMTIgKzEwMzIsMTIgQEAKICAgICB9CiAgICAgaWYgKCFwRlMpIHsKICAgICAgICAgQ1BERl9TdHJlYW1BY2MgYWNjOwotICAgICAgICBhY2MuTG9hZEFsbERhdGEodGhpcywgVFJVRSk7CisgICAgICAgIGFjYy5Mb2FkQWxsRGF0YSh0aGlzLCB0cnVlKTsKICAgICAgICAgRlhfRFdPUkQgc3RyZWFtU2l6ZSA9IGFjYy5HZXRTaXplKCk7CiAgICAgICAgIHJldHVybiBuZXcgQ1BERl9TdHJlYW0oYWNjLkRldGFjaERhdGEoKSwgc3RyZWFtU2l6ZSwgcENsb25lRGljdCk7CiAgICAgfQogICAgIENQREZfU3RyZWFtKiBwT2JqID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOwotICAgIENQREZfU3RyZWFtRmlsdGVyICpwU0YgPSBHZXRTdHJlYW1GaWx0ZXIoVFJVRSk7CisgICAgQ1BERl9TdHJlYW1GaWx0ZXIgKnBTRiA9IEdldFN0cmVhbUZpbHRlcih0cnVlKTsKICAgICBpZiAocFNGKSB7CiAgICAgICAgIHVpbnQ4X3QqIHBCdWYgPSBGWF9BbGxvYyh1aW50OF90LCA0MDk2KTsKICAgICAgICAgRlhfRFdPUkQgZHdSZWFkOwpAQCAtMTA1NCwyMCArMTA1NCwyMCBAQAogICAgIHBPYmotPkluaXRTdHJlYW0oKElGWF9GaWxlUmVhZCopcEZTLCBwQ2xvbmVEaWN0KTsKICAgICByZXR1cm4gcE9iajsKIH0KLWV4dGVybiBGWF9CT09MIFBERl9EYXRhRGVjb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAorZXh0ZXJuIGJvb2wgUERGX0RhdGFEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGNvbnN0IENQREZfRGljdGlvbmFyeSogcERpY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUsIENGWF9CeXRlU3RyaW5nJiBJbWFnZUVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiYgcEltYWdlUGFybXMsIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLCBGWF9CT09MIGJJbWFnZUFjYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqJiBwSW1hZ2VQYXJtcywgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUsIGJvb2wgYkltYWdlQWNjKTsKIENQREZfU3RyZWFtQWNjOjpDUERGX1N0cmVhbUFjYygpCiB7Ci0gICAgbV9iTmV3QnVmID0gRkFMU0U7CisgICAgbV9iTmV3QnVmID0gZmFsc2U7CiAgICAgbV9wRGF0YSA9IE5VTEw7CiAgICAgbV9kd1NpemUgPSAwOwogICAgIG1fcEltYWdlUGFyYW0gPSBOVUxMOwogICAgIG1fcFN0cmVhbSA9IE5VTEw7CiAgICAgbV9wU3JjRGF0YSA9IE5VTEw7CiB9Ci12b2lkIENQREZfU3RyZWFtQWNjOjpMb2FkQWxsRGF0YShjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiUmF3QWNjZXNzLCBGWF9EV09SRCBlc3RpbWF0ZWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltYWdlQWNjKQordm9pZCBDUERGX1N0cmVhbUFjYzo6TG9hZEFsbERhdGEoY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sIGJvb2wgYlJhd0FjY2VzcywgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJbWFnZUFjYykKIHsKICAgICBpZiAocFN0cmVhbSA9PSBOVUxMIHx8IHBTdHJlYW0tPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTExMTEsNyArMTExMSw3IEBACiAgICAgICAgIG1fcERhdGEgPSBwRGVjcnlwdGVkRGF0YTsKICAgICAgICAgbV9kd1NpemUgPSBkd0RlY3J5cHRlZFNpemU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgRlhfQk9PTCBiUmV0ID0gUERGX0RhdGFEZWNvZGUocERlY3J5cHRlZERhdGEsIGR3RGVjcnlwdGVkU2l6ZSwgbV9wU3RyZWFtLT5HZXREaWN0KCksCisgICAgICAgIGJvb2wgYlJldCA9IFBERl9EYXRhRGVjb2RlKHBEZWNyeXB0ZWREYXRhLCBkd0RlY3J5cHRlZFNpemUsIG1fcFN0cmVhbS0+R2V0RGljdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEYXRhLCBtX2R3U2l6ZSwgbV9JbWFnZURlY29kZXIsIG1fcEltYWdlUGFyYW0sIGVzdGltYXRlZF9zaXplLCBiSW1hZ2VBY2MpOwogICAgICAgICBpZiAoIWJSZXQpIHsKICAgICAgICAgICAgIG1fcERhdGEgPSBwRGVjcnlwdGVkRGF0YTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfcGFyc2VyLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfcGFyc2VyLmNwcAppbmRleCA4NTRiZTc1Li4wN2Y2Y2E3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3BhcnNlci5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9wYXJzZXIuY3BwCkBAIC0xMywxOSArMTMsMTkgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKICNpbmNsdWRlICIuLi9mcGRmX3BhZ2UvcGFnZWludC5oIgogCi1GWF9CT09MIElzU2lnbmF0dXJlRGljdChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KQorYm9vbCBJc1NpZ25hdHVyZURpY3QoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkKIHsKICAgICBDUERGX09iamVjdCogcFR5cGUgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJUeXBlIikpOwogICAgIGlmICghcFR5cGUpIHsKICAgICAgICAgcFR5cGUgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJGVCIpKTsKICAgICAgICAgaWYgKCFwVHlwZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChwVHlwZS0+R2V0U3RyaW5nKCkgPT0gRlhfQlNUUkMoIlNpZyIpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIHN0YXRpYyBpbnQgX0NvbXBhcmVGaWxlU2l6ZShjb25zdCB2b2lkKiBwMSwgY29uc3Qgdm9pZCogcDIpCiB7CkBAIC00OCwxMyArNDgsMTMgQEAKICAgICBtX3BMaW5lYXJpemVkID0gTlVMTDsKICAgICBtX2R3Rmlyc3RQYWdlTm8gPSAwOwogICAgIG1fZHdYcmVmU3RhcnRPYmpOdW0gPSAwOwotICAgIG1fYk93bkZpbGVSZWFkID0gVFJVRTsKKyAgICBtX2JPd25GaWxlUmVhZCA9IHRydWU7CiAgICAgbV9GaWxlVmVyc2lvbiA9IDA7Ci0gICAgbV9iRm9yY2VVc2VTZWN1cml0eUhhbmRsZXIgPSBGQUxTRTsKKyAgICBtX2JGb3JjZVVzZVNlY3VyaXR5SGFuZGxlciA9IGZhbHNlOwogfQogQ1BERl9QYXJzZXI6On5DUERGX1BhcnNlcigpCiB7Ci0gICAgQ2xvc2VQYXJzZXIoRkFMU0UpOworICAgIENsb3NlUGFyc2VyKGZhbHNlKTsKIH0KIEZYX0RXT1JEIENQREZfUGFyc2VyOjpHZXRMYXN0T2JqTnVtKCkKIHsKQEAgLTY1LDkgKzY1LDkgQEAKIHsKICAgICBtX3BFbmNyeXB0RGljdCA9IHBEaWN0OwogfQotdm9pZCBDUERGX1BhcnNlcjo6Q2xvc2VQYXJzZXIoRlhfQk9PTCBiUmVQYXJzZSkKK3ZvaWQgQ1BERl9QYXJzZXI6OkNsb3NlUGFyc2VyKGJvb2wgYlJlUGFyc2UpCiB7Ci0gICAgbV9iVmVyc2lvblVwZGF0ZWQgPSBGQUxTRTsKKyAgICBtX2JWZXJzaW9uVXBkYXRlZCA9IGZhbHNlOwogICAgIGlmICghYlJlUGFyc2UpIHsKICAgICAgICAgZGVsZXRlIG1fcERvY3VtZW50OwogICAgICAgICBtX3BEb2N1bWVudCA9IE5VTEw7CkBAIC0xMjQsNyArMTI0LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIC0xOwogfQotRlhfRFdPUkQgQ1BERl9QYXJzZXI6OlN0YXJ0UGFyc2UoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIEZYX0JPT0wgYlJlUGFyc2UpCitGWF9EV09SRCBDUERGX1BhcnNlcjo6U3RhcnRQYXJzZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgYm9vbCBiUmVQYXJzZSkKIHsKICAgICBJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzID0gRlhfQ3JlYXRlRmlsZVJlYWQoZmlsZW5hbWUpOwogICAgIGlmICghcEZpbGVBY2Nlc3MpIHsKQEAgLTEzMiw3ICsxMzIsNyBAQAogICAgIH0KICAgICByZXR1cm4gU3RhcnRQYXJzZShwRmlsZUFjY2VzcywgYlJlUGFyc2UpOwogfQotRlhfRFdPUkQgQ1BERl9QYXJzZXI6OlN0YXJ0UGFyc2UoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBGWF9CT09MIGJSZVBhcnNlKQorRlhfRFdPUkQgQ1BERl9QYXJzZXI6OlN0YXJ0UGFyc2UoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBib29sIGJSZVBhcnNlKQogewogICAgIElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MgPSBGWF9DcmVhdGVGaWxlUmVhZChmaWxlbmFtZSk7CiAgICAgaWYgKCFwRmlsZUFjY2VzcykgewpAQCAtMTQyLDEwICsxNDIsMTAgQEAKIH0KIENQREZfU2VjdXJpdHlIYW5kbGVyKiBGUERGX0NyZWF0ZVN0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCk7CiBDUERGX1NlY3VyaXR5SGFuZGxlciogRlBERl9DcmVhdGVQdWJLZXlIYW5kbGVyKHZvaWQqKTsKLUZYX0RXT1JEIENQREZfUGFyc2VyOjpTdGFydFBhcnNlKElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MsIEZYX0JPT0wgYlJlUGFyc2UsIEZYX0JPT0wgYk93bkZpbGVSZWFkKQorRlhfRFdPUkQgQ1BERl9QYXJzZXI6OlN0YXJ0UGFyc2UoSUZYX0ZpbGVSZWFkKiBwRmlsZUFjY2VzcywgYm9vbCBiUmVQYXJzZSwgYm9vbCBiT3duRmlsZVJlYWQpCiB7CiAgICAgQ2xvc2VQYXJzZXIoYlJlUGFyc2UpOwotICAgIG1fYlhSZWZTdHJlYW0gPSBGQUxTRTsKKyAgICBtX2JYUmVmU3RyZWFtID0gZmFsc2U7CiAgICAgbV9MYXN0WFJlZk9mZnNldCA9IDA7CiAgICAgbV9iT3duRmlsZVJlYWQgPSBiT3duRmlsZVJlYWQ7CiAgICAgaW50MzJfdCBvZmZzZXQgPSBHZXRIZWFkZXJPZmZzZXQocEZpbGVBY2Nlc3MpOwpAQCAtMTc2LDE1ICsxNzYsMTUgQEAKICAgICBpZiAoIWJSZVBhcnNlKSB7CiAgICAgICAgIG1fcERvY3VtZW50ID0gbmV3IENQREZfRG9jdW1lbnQodGhpcyk7CiAgICAgfQotICAgIEZYX0JPT0wgYlhSZWZSZWJ1aWx0ID0gRkFMU0U7Ci0gICAgaWYgKG1fU3ludGF4LlNlYXJjaFdvcmQoRlhfQlNUUkMoInN0YXJ0eHJlZiIpLCBUUlVFLCBGQUxTRSwgNDA5NikpIHsKKyAgICBib29sIGJYUmVmUmVidWlsdCA9IGZhbHNlOworICAgIGlmIChtX1N5bnRheC5TZWFyY2hXb3JkKEZYX0JTVFJDKCJzdGFydHhyZWYiKSwgdHJ1ZSwgZmFsc2UsIDQwOTYpKSB7CiAgICAgICAgIEZYX0ZJTEVTSVpFIHN0YXJ0eHJlZl9vZmZzZXQgPSBtX1N5bnRheC5TYXZlUG9zKCk7CiAgICAgICAgIHZvaWQqIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZzdGFydHhyZWZfb2Zmc2V0LCBtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgX0NvbXBhcmVGaWxlU2l6ZSk7CiAgICAgICAgIGlmIChwUmVzdWx0ID09IE5VTEwpIHsKICAgICAgICAgICAgIG1fU29ydGVkT2Zmc2V0LkFkZChzdGFydHhyZWZfb2Zmc2V0KTsKICAgICAgICAgfQogICAgICAgICBtX1N5bnRheC5HZXRLZXl3b3JkKCk7Ci0gICAgICAgIEZYX0JPT0wgYk51bWJlcjsKKyAgICAgICAgYm9vbCBiTnVtYmVyOwogICAgICAgICBDRlhfQnl0ZVN0cmluZyB4cmVmcG9zX3N0ciA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJOdW1iZXIpOwogICAgICAgICBpZiAoIWJOdW1iZXIpIHsKICAgICAgICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CkBAIC0xOTQsMTQgKzE5NCwxNCBAQAogICAgICAgICAgICAgaWYgKCFSZWJ1aWxkQ3Jvc3NSZWYoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBiWFJlZlJlYnVpbHQgPSBUUlVFOworICAgICAgICAgICAgYlhSZWZSZWJ1aWx0ID0gdHJ1ZTsKICAgICAgICAgICAgIG1fTGFzdFhSZWZPZmZzZXQgPSAwOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCFSZWJ1aWxkQ3Jvc3NSZWYoKSkgewogICAgICAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKICAgICAgICAgfQotICAgICAgICBiWFJlZlJlYnVpbHQgPSBUUlVFOworICAgICAgICBiWFJlZlJlYnVpbHQgPSB0cnVlOwogICAgIH0KICAgICBGWF9EV09SRCBkd1JldCA9IFNldEVuY3J5cHRIYW5kbGVyKCk7CiAgICAgaWYgKGR3UmV0ICE9IFBERlBBUlNFX0VSUk9SX1NVQ0NFU1MpIHsKQEAgLTM0MCwyNiArMzQwLDI2IEBACiAgICAgfQogICAgIHJldHVybiAwOwogfQotc3RhdGljIEZYX0JPT0wgQ2hlY2tEaXJlY3RUeXBlKENQREZfRGljdGlvbmFyeSogcERpY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBpbnQzMl90IGlUeXBlKQorc3RhdGljIGJvb2wgQ2hlY2tEaXJlY3RUeXBlKENQREZfRGljdGlvbmFyeSogcERpY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBpbnQzMl90IGlUeXBlKQogewogICAgIENQREZfT2JqZWN0KiBwT2JqID0gcERpY3QtPkdldEVsZW1lbnQoa2V5KTsKICAgICBpZiAoIXBPYmopIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gcE9iai0+R2V0VHlwZSgpID09IGlUeXBlOwogfQotRlhfQk9PTCBDUERGX1BhcnNlcjo6TG9hZEFsbENyb3NzUmVmVjQoRlhfRklMRVNJWkUgeHJlZnBvcykKK2Jvb2wgQ1BERl9QYXJzZXI6OkxvYWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHhyZWZwb3MpCiB7Ci0gICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCAwLCBUUlVFLCBGQUxTRSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmICghTG9hZENyb3NzUmVmVjQoeHJlZnBvcywgMCwgdHJ1ZSwgZmFsc2UpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9wVHJhaWxlciA9IExvYWRUcmFpbGVyVjQoKTsKICAgICBpZiAobV9wVHJhaWxlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbnQzMl90IHhyZWZzaXplID0gR2V0RGlyZWN0SW50ZWdlcihtX3BUcmFpbGVyLCBGWF9CU1RSQygiU2l6ZSIpKTsKICAgICBpZiAoeHJlZnNpemUgPD0gMCB8fCB4cmVmc2l6ZSA+ICgxIDw8IDIwKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9Dcm9zc1JlZi5TZXRTaXplKHhyZWZzaXplKTsKICAgICBtX1Y1VHlwZS5TZXRTaXplKHhyZWZzaXplKTsKQEAgLTM2Nyw1MSArMzY3LDUxIEBACiAgICAgQ3Jvc3NSZWZMaXN0LkFkZCh4cmVmcG9zKTsKICAgICBYUmVmU3RyZWFtTGlzdC5BZGQoR2V0RGlyZWN0SW50ZWdlcihtX3BUcmFpbGVyLCBGWF9CU1RSQygiWFJlZlN0bSIpKSk7CiAgICAgaWYgKCFDaGVja0RpcmVjdFR5cGUobV9wVHJhaWxlciwgRlhfQlNUUkMoIlByZXYiKSwgUERGT0JKX05VTUJFUikpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX0ZJTEVTSVpFIG5ld3hyZWZwb3MgPSBHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIsIEZYX0JTVFJDKCJQcmV2IikpOwogICAgIGlmIChuZXd4cmVmcG9zID09IHhyZWZwb3MpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHhyZWZwb3MgPSBuZXd4cmVmcG9zOwogICAgIHdoaWxlICh4cmVmcG9zKSB7CiAgICAgICAgIENyb3NzUmVmTGlzdC5JbnNlcnRBdCgwLCB4cmVmcG9zKTsKLSAgICAgICAgTG9hZENyb3NzUmVmVjQoeHJlZnBvcywgMCwgVFJVRSwgRkFMU0UpOworICAgICAgICBMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCAwLCB0cnVlLCBmYWxzZSk7CiAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBMb2FkVHJhaWxlclY0KCk7CiAgICAgICAgIGlmIChwRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFDaGVja0RpcmVjdFR5cGUocERpY3QsIEZYX0JTVFJDKCJQcmV2IiksIFBERk9CSl9OVU1CRVIpKSB7CiAgICAgICAgICAgICBwRGljdC0+UmVsZWFzZSgpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIG5ld3hyZWZwb3MgPSBHZXREaXJlY3RJbnRlZ2VyKHBEaWN0LCBGWF9CU1RSQygiUHJldiIpKTsKICAgICAgICAgaWYgKG5ld3hyZWZwb3MgPT0geHJlZnBvcykgewogICAgICAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICB4cmVmcG9zID0gbmV3eHJlZnBvczsKICAgICAgICAgWFJlZlN0cmVhbUxpc3QuSW5zZXJ0QXQoMCwgcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlhSZWZTdG0iKSkpOwogICAgICAgICBtX1RyYWlsZXJzLkFkZChwRGljdCk7CiAgICAgfQogICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IENyb3NzUmVmTGlzdC5HZXRTaXplKCk7IGkgKyspCi0gICAgICAgIGlmICghTG9hZENyb3NzUmVmVjQoQ3Jvc3NSZWZMaXN0W2ldLCBYUmVmU3RyZWFtTGlzdFtpXSwgRkFMU0UsIGkgPT0gMCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNChDcm9zc1JlZkxpc3RbaV0sIFhSZWZTdHJlYW1MaXN0W2ldLCBmYWxzZSwgaSA9PSAwKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfUGFyc2VyOjpMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjQoRlhfRklMRVNJWkUgeHJlZnBvcywgRlhfRFdPUkQgZHdPYmpDb3VudCkKK2Jvb2wgQ1BERl9QYXJzZXI6OkxvYWRMaW5lYXJpemVkQWxsQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSB4cmVmcG9zLCBGWF9EV09SRCBkd09iakNvdW50KQogewogICAgIGlmICghTG9hZExpbmVhcml6ZWRDcm9zc1JlZlY0KHhyZWZwb3MsIGR3T2JqQ291bnQpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BUcmFpbGVyID0gTG9hZFRyYWlsZXJWNCgpOwogICAgIGlmIChtX3BUcmFpbGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGludDMyX3QgeHJlZnNpemUgPSBHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIsIEZYX0JTVFJDKCJTaXplIikpOwogICAgIGlmICh4cmVmc2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRlhfRmlsZVNpemVBcnJheSBDcm9zc1JlZkxpc3QsIFhSZWZTdHJlYW1MaXN0OwogICAgIENyb3NzUmVmTGlzdC5BZGQoeHJlZnBvcyk7CkBAIC00MTksMjIgKzQxOSwyMiBAQAogICAgIHhyZWZwb3MgPSBHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIsIEZYX0JTVFJDKCJQcmV2IikpOwogICAgIHdoaWxlICh4cmVmcG9zKSB7CiAgICAgICAgIENyb3NzUmVmTGlzdC5JbnNlcnRBdCgwLCB4cmVmcG9zKTsKLSAgICAgICAgTG9hZENyb3NzUmVmVjQoeHJlZnBvcywgMCwgVFJVRSwgRkFMU0UpOworICAgICAgICBMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCAwLCB0cnVlLCBmYWxzZSk7CiAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBMb2FkVHJhaWxlclY0KCk7CiAgICAgICAgIGlmIChwRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgeHJlZnBvcyA9IEdldERpcmVjdEludGVnZXIocERpY3QsIEZYX0JTVFJDKCJQcmV2IikpOwogICAgICAgICBYUmVmU3RyZWFtTGlzdC5JbnNlcnRBdCgwLCBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiWFJlZlN0bSIpKSk7CiAgICAgICAgIG1fVHJhaWxlcnMuQWRkKHBEaWN0KTsKICAgICB9CiAgICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgQ3Jvc3NSZWZMaXN0LkdldFNpemUoKTsgaSArKykKLSAgICAgICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNChDcm9zc1JlZkxpc3RbaV0sIFhSZWZTdHJlYW1MaXN0W2ldLCBGQUxTRSwgaSA9PSAwKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIUxvYWRDcm9zc1JlZlY0KENyb3NzUmVmTGlzdFtpXSwgWFJlZlN0cmVhbUxpc3RbaV0sIGZhbHNlLCBpID09IDApKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9QYXJzZXI6OkxvYWRMaW5lYXJpemVkQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MsIEZYX0RXT1JEIGR3T2JqQ291bnQpCitib29sIENQREZfUGFyc2VyOjpMb2FkTGluZWFyaXplZENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLCBGWF9EV09SRCBkd09iakNvdW50KQogewogICAgIEZYX0ZJTEVTSVpFIGR3U3RhcnRQb3MgPSBwb3MgLSBtX1N5bnRheC5tX0hlYWRlck9mZnNldDsKICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKGR3U3RhcnRQb3MpOwpAQCAtNDU0LDExICs0NTQsMTEgQEAKICAgICAgICAgRlhfRFdPUkQgZHdSZWFkU2l6ZSA9IGJsb2NrX3NpemUgKiByZWNvcmRzaXplOwogICAgICAgICBpZiAoKEZYX0ZJTEVTSVpFKShkd1N0YXJ0UG9zICsgZHdSZWFkU2l6ZSkgPiBtX1N5bnRheC5tX0ZpbGVMZW4pIHsKICAgICAgICAgICAgIEZYX0ZyZWUocEJ1Zik7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFtX1N5bnRheC5SZWFkQmxvY2soKHVpbnQ4X3QqKXBCdWYsIGR3UmVhZFNpemUpKSB7CiAgICAgICAgICAgICBGWF9GcmVlKHBCdWYpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkgKyspIHsKICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSA9IHN0YXJ0X29iam51bSArIGJsb2NrICogMTAyNCArIGk7CkBAIC00NzIsMTQgKzQ3MiwxNCBAQAogICAgICAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgYyA9IDA7IGMgPCAxMDsgYyArKykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBFbnRyeVtjXSA8ICcwJyB8fCBwRW50cnlbY10gPiAnOScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKHBCdWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbV9Dcm9zc1JlZi5TZXRBdEdyb3cob2JqbnVtLCBvZmZzZXQpOwogICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvbiA9IEZYU1lTX2F0b2kocEVudHJ5ICsgMTEpOwogICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID49IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9iVmVyc2lvblVwZGF0ZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBtX2JWZXJzaW9uVXBkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1fT2JqVmVyc2lvbi5TZXRBdEdyb3cob2JqbnVtLCB2ZXJzaW9uKTsKICAgICAgICAgICAgICAgICBpZiAobV9Dcm9zc1JlZltvYmpudW1dIDwgbV9TeW50YXgubV9GaWxlTGVuKSB7CkBAIC00OTQsMTMgKzQ5NCwxMyBAQAogICAgIH0KICAgICBGWF9GcmVlKHBCdWYpOwogICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MgKyBjb3VudCAqIHJlY29yZHNpemUpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX1BhcnNlcjo6TG9hZENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLCBGWF9GSUxFU0laRSBzdHJlYW1wb3MsIEZYX0JPT0wgYlNraXAsIEZYX0JPT0wgYkZpcnN0KQorYm9vbCBDUERGX1BhcnNlcjo6TG9hZENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLCBGWF9GSUxFU0laRSBzdHJlYW1wb3MsIGJvb2wgYlNraXAsIGJvb2wgYkZpcnN0KQogewogICAgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKICAgICBpZiAobV9TeW50YXguR2V0S2V5d29yZCgpICE9IEZYX0JTVFJDKCJ4cmVmIikpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHZvaWQqIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZwb3MsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLCBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKICAgICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7CkBAIC01MTQsMTAgKzUxNCwxMCBAQAogICAgIH0KICAgICB3aGlsZSAoMSkgewogICAgICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fU3ludGF4LlNhdmVQb3MoKTsKLSAgICAgICAgRlhfQk9PTCBiSXNOdW1iZXI7CisgICAgICAgIGJvb2wgYklzTnVtYmVyOwogICAgICAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKICAgICAgICAgaWYgKHdvcmQuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFiSXNOdW1iZXIpIHsKICAgICAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwpAQCAtNTI1LDIyICs1MjUsMjIgQEAKICAgICAgICAgfQogICAgICAgICBGWF9EV09SRCBzdGFydF9vYmpudW0gPSBGWFNZU19hdG9pKHdvcmQpOwogICAgICAgICBpZiAoc3RhcnRfb2JqbnVtID49ICgxIDw8IDIwKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIEZYX0RXT1JEIGNvdW50ID0gbV9TeW50YXguR2V0RGlyZWN0TnVtKCk7CiAgICAgICAgIG1fU3ludGF4LlRvTmV4dFdvcmQoKTsKICAgICAgICAgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7Ci0gICAgICAgIEZYX0JPT0wgYkZpcnN0SXRlbSA9IEZBTFNFOworICAgICAgICBib29sIGJGaXJzdEl0ZW0gPSBmYWxzZTsKICAgICAgICAgaW50MzJfdCByZWNvcmRzaXplID0gMjA7CiAgICAgICAgIGlmIChiRmlyc3QpIHsKLSAgICAgICAgICAgIGJGaXJzdEl0ZW0gPSBUUlVFOworICAgICAgICAgICAgYkZpcnN0SXRlbSA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgbV9kd1hyZWZTdGFydE9iak51bSA9IHN0YXJ0X29iam51bTsKICAgICAgICAgaWYgKCFiU2tpcCkgewogICAgICAgICAgICAgY2hhciogcEJ1ZiA9IEZYX0FsbG9jKGNoYXIsIDEwMjQgKiByZWNvcmRzaXplICsgMSk7CiAgICAgICAgICAgICBwQnVmWzEwMjQgKiByZWNvcmRzaXplXSA9ICdcMCc7CiAgICAgICAgICAgICBpbnQzMl90IG5CbG9ja3MgPSBjb3VudCAvIDEwMjQgKyAxOwotICAgICAgICAgICAgRlhfQk9PTCBiRmlyc3RCbG9jayA9IFRSVUU7CisgICAgICAgICAgICBib29sIGJGaXJzdEJsb2NrID0gdHJ1ZTsKICAgICAgICAgICAgIGZvciAoaW50MzJfdCBibG9jayA9IDA7IGJsb2NrIDwgbkJsb2NrczsgYmxvY2sgKyspIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IGJsb2NrX3NpemUgPSBibG9jayA9PSBuQmxvY2tzIC0gMSA/IGNvdW50ICUgMTAyNCA6IDEwMjQ7CiAgICAgICAgICAgICAgICAgbV9TeW50YXguUmVhZEJsb2NrKCh1aW50OF90KilwQnVmLCBibG9ja19zaXplICogcmVjb3Jkc2l6ZSk7CkBAIC01NTAsNyArNTUwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHBFbnRyeVsxN10gPT0gJ2YnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYkZpcnN0SXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iam51bSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZpcnN0SXRlbSA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGaXJzdEl0ZW0gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiRmlyc3RCbG9jaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IChGWF9GSUxFU0laRSlGWFNZU19hdG9pNjQocEVudHJ5KTsKQEAgLTU2OCwxNCArNTY4LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGMgPSAwOyBjIDwgMTA7IGMgKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBFbnRyeVtjXSA8ICcwJyB8fCBwRW50cnlbY10gPiAnOScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUocEJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtX0Nyb3NzUmVmLlNldEF0R3JvdyhvYmpudW0sIG9mZnNldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb24gPSBGWFNZU19hdG9pKHBFbnRyeSArIDExKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID49IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JWZXJzaW9uVXBkYXRlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iVmVyc2lvblVwZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbV9PYmpWZXJzaW9uLlNldEF0R3JvdyhvYmpudW0sIHZlcnNpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fQ3Jvc3NSZWZbb2JqbnVtXSA8IG1fU3ludGF4Lm1fRmlsZUxlbikgewpAQCAtNTg3LDcgKzU4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtX1Y1VHlwZS5TZXRBdEdyb3cob2JqbnVtLCAxKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoYkZpcnN0QmxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJGaXJzdEJsb2NrID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBiRmlyc3RCbG9jayA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNTk2LDI1ICs1OTYsMjUgQEAKICAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyArIGNvdW50ICogcmVjb3Jkc2l6ZSk7CiAgICAgfQogICAgIGlmIChzdHJlYW1wb3MpCi0gICAgICAgIGlmICghTG9hZENyb3NzUmVmVjUoc3RyZWFtcG9zLCBzdHJlYW1wb3MsIEZBTFNFKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHN0cmVhbXBvcywgc3RyZWFtcG9zLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX1BhcnNlcjo6TG9hZEFsbENyb3NzUmVmVjUoRlhfRklMRVNJWkUgeHJlZnBvcykKK2Jvb2wgQ1BERl9QYXJzZXI6OkxvYWRBbGxDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHhyZWZwb3MpCiB7Ci0gICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNSh4cmVmcG9zLCB4cmVmcG9zLCBUUlVFKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNSh4cmVmcG9zLCB4cmVmcG9zLCB0cnVlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHdoaWxlICh4cmVmcG9zKQotICAgICAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHhyZWZwb3MsIHhyZWZwb3MsIEZBTFNFKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHhyZWZwb3MsIHhyZWZwb3MsIGZhbHNlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgbV9PYmplY3RTdHJlYW1NYXAuSW5pdEhhc2hUYWJsZSgxMDEsIEZBTFNFKTsKLSAgICBtX2JYUmVmU3RyZWFtID0gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBtX09iamVjdFN0cmVhbU1hcC5Jbml0SGFzaFRhYmxlKDEwMSwgZmFsc2UpOworICAgIG1fYlhSZWZTdHJlYW0gPSB0cnVlOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX1BhcnNlcjo6UmVidWlsZENyb3NzUmVmKCkKK2Jvb2wgQ1BERl9QYXJzZXI6OlJlYnVpbGRDcm9zc1JlZigpCiB7CiAgICAgbV9Dcm9zc1JlZi5SZW1vdmVBbGwoKTsKICAgICBtX1Y1VHlwZS5SZW1vdmVBbGwoKTsKQEAgLTYzMyw3ICs2MzMsNyBAQAogICAgIEZYX0ZJTEVTSVpFIHN0YXJ0X3BvcyA9IDAsIHN0YXJ0X3BvczEgPSAwOwogICAgIEZYX0ZJTEVTSVpFIGxhc3Rfb2JqID0gLTEsIGxhc3RfeHJlZiA9IC0xLCBsYXN0X3RyYWlsZXIgPSAtMTsKICAgICB3aGlsZSAocG9zIDwgbV9TeW50YXgubV9GaWxlTGVuKSB7Ci0gICAgICAgIEZYX0JPT0wgYk92ZXJGbG93ID0gRkFMU0U7CisgICAgICAgIGJvb2wgYk92ZXJGbG93ID0gZmFsc2U7CiAgICAgICAgIEZYX0RXT1JEIHNpemUgPSAoRlhfRFdPUkQpKG1fU3ludGF4Lm1fRmlsZUxlbiAtIHBvcyk7CiAgICAgICAgIGlmIChzaXplID4gNDA5NikgewogICAgICAgICAgICAgc2l6ZSA9IDQwOTY7CkBAIC04MTIsNyArODEyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgbkxlbiA9IG9ial9lbmQgLSBvYmpfcG9zIC0gb2Zmc2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKEZYX0RXT1JEKW5MZW4gPiBzaXplIC0gaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gb2JqX2VuZCArIG1fU3ludGF4Lm1fSGVhZGVyT2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk92ZXJGbG93ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJPdmVyRmxvdyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IChGWF9EV09SRCluTGVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC04MjIsNyArODIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0Nyb3NzUmVmW29iam51bV0gPSBvYmpfcG9zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fT2JqVmVyc2lvbi5TZXRBdChvYmpudW0sIChpbnQxNl90KWdlbm51bSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZGdlbiAhPSBnZW5udW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iVmVyc2lvblVwZGF0ZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JWZXJzaW9uVXBkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtODgxLDcgKzg4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGR3U2F2ZVBvcyA9IG1fU3ludGF4LlNhdmVQb3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyV29yZCA9IG1fU3ludGF4LkdldEtleXdvcmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJXb3JkLkNvbXBhcmUoRlhfQlNUUkMoInN0YXJ0eHJlZiIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTnVtYmVyID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJOdW1iZXIgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzT2Zmc2V0ID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYk51bWJlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYk51bWJlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTGFzdFhSZWZPZmZzZXQgPSBGWFNZU19hdG9pKGJzT2Zmc2V0KTsKQEAgLTk4Miw3ICs5ODIsNyBAQAogICAgICAgICBtX1NvcnRlZE9mZnNldC5BZGQob2Zmc2V0KTsKICAgICB9CiAgICAgRlhfRnJlZShidWZmZXIpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogc3RhdGljIEZYX0RXT1JEIF9HZXRWYXJJbnQoY29uc3QgdWludDhfdCogcCwgaW50MzJfdCBuKQogewpAQCAtOTkyLDExICs5OTIsMTEgQEAKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KLUZYX0JPT0wgQ1BERl9QYXJzZXI6OkxvYWRDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHBvcywgRlhfRklMRVNJWkUmIHByZXYsIEZYX0JPT0wgYk1haW5YUmVmKQorYm9vbCBDUERGX1BhcnNlcjo6TG9hZENyb3NzUmVmVjUoRlhfRklMRVNJWkUgcG9zLCBGWF9GSUxFU0laRSYgcHJldiwgYm9vbCBiTWFpblhSZWYpCiB7CiAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSAoQ1BERl9TdHJlYW0qKVBhcnNlSW5kaXJlY3RPYmplY3RBdChtX3BEb2N1bWVudCwgcG9zLCAwLCBOVUxMKTsKICAgICBpZiAoIXBTdHJlYW0pIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX3BEb2N1bWVudCkgewogICAgICAgICBDUERGX0RpY3Rpb25hcnkgKiBwRGljdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7CkBAIC0xMDA2LDE3ICsxMDA2LDE3IEBACiAgICAgICAgICAgICBpZiAocFN0cmVhbS0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKICAgICAgICAgICAgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHBTdHJlYW0tPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBwcmV2ID0gcFN0cmVhbS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQcmV2IikpOwogICAgIGludDMyX3Qgc2l6ZSA9IHBTdHJlYW0tPkdldERpY3QoKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiU2l6ZSIpKTsKICAgICBpZiAoc2l6ZSA8IDApIHsKICAgICAgICAgcFN0cmVhbS0+UmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKGJNYWluWFJlZikgewogICAgICAgICBtX3BUcmFpbGVyID0gKENQREZfRGljdGlvbmFyeSopcFN0cmVhbS0+R2V0RGljdCgpLT5DbG9uZSgpOwpAQCAtMTA1MCw3ICsxMDUwLDcgQEAKICAgICBwQXJyYXkgPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldEFycmF5KEZYX0JTVFJDKCJXIikpOwogICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewogICAgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRlhfRFdvcmRBcnJheSBXaWR0aEFycmF5OwogICAgIEZYX1NBRkVfRFdPUkQgZHdBY2NXaWR0aCA9IDA7CkBAIC0xMDYwLDcgKzEwNjAsNyBAQAogICAgIH0KICAgICBpZiAoIWR3QWNjV2lkdGguSXNWYWxpZCgpIHx8IFdpZHRoQXJyYXkuR2V0U2l6ZSgpIDwgMykgewogICAgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWF9EV09SRCB0b3RhbFdpZHRoID0gZHdBY2NXaWR0aC5WYWx1ZU9yRGllKCk7CiAgICAgQ1BERl9TdHJlYW1BY2MgYWNjOwpAQCAtMTEyMCw3ICsxMTIwLDcgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gbV9WNVR5cGUuR2V0U2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbV9WNVR5cGVbb2Zmc2V0XSA9IDI1NTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMTI5LDcgKzExMjksNyBAQAogICAgICAgICBzZWdpbmRleCArPSBjb3VudDsKICAgICB9CiAgICAgcFN0cmVhbS0+UmVsZWFzZSgpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQ1BERl9BcnJheSogQ1BERl9QYXJzZXI6OkdldElEQXJyYXkoKQogewpAQCAtMTE2MiwzMiArMTE2MiwzMiBAQAogICAgIH0KICAgICByZXR1cm4gKChDUERGX1JlZmVyZW5jZSopIHBSZWYpLT5HZXRSZWZPYmpOdW0oKTsKIH0KLUZYX0JPT0wgQ1BERl9QYXJzZXI6OklzRm9ybVN0cmVhbShGWF9EV09SRCBvYmpudW0sIEZYX0JPT0wmIGJGb3JtKQorYm9vbCBDUERGX1BhcnNlcjo6SXNGb3JtU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgYm9vbCYgYkZvcm0pCiB7Ci0gICAgYkZvcm0gPSBGQUxTRTsKKyAgICBiRm9ybSA9IGZhbHNlOwogICAgIGlmIChvYmpudW0gPj0gKEZYX0RXT1JEKW1fQ3Jvc3NSZWYuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKG1fVjVUeXBlW29iam51bV0gPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChtX1Y1VHlwZVtvYmpudW1dID09IDIpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBGWF9GSUxFU0laRSBwb3MgPSBtX0Nyb3NzUmVmW29iam51bV07CiAgICAgdm9pZCogcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJnBvcywgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOwogICAgIGlmIChwUmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoKEZYX0ZJTEVTSVpFKilwUmVzdWx0IC0gKEZYX0ZJTEVTSVpFKiltX1NvcnRlZE9mZnNldC5HZXREYXRhKCkgPT0gbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpIC0gMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfRklMRVNJWkUgc2l6ZSA9ICgoRlhfRklMRVNJWkUqKXBSZXN1bHQpWzFdIC0gcG9zOwogICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOwogICAgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKLSAgICBiRm9ybSA9IG1fU3ludGF4LlNlYXJjaE11bHRpV29yZChGWF9CU1RSQygiL0Zvcm1cMHN0cmVhbSIpLCBUUlVFLCBzaXplKSA9PSAwOworICAgIGJGb3JtID0gbV9TeW50YXguU2VhcmNoTXVsdGlXb3JkKEZYX0JTVFJDKCIvRm9ybVwwc3RyZWFtIiksIHRydWUsIHNpemUpID09IDA7CiAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBDUERGX09iamVjdCogQ1BERl9QYXJzZXI6OlBhcnNlSW5kaXJlY3RPYmplY3QoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpMaXN0LCBGWF9EV09SRCBvYmpudW0sIFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0KQogewpAQCAtMTIwOSw3ICsxMjA5LDcgQEAKICAgICAgICAgaW50MzJfdCBuID0gcE9ialN0cmVhbS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJOIikpOwogICAgICAgICBpbnQzMl90IG9mZnNldCA9IHBPYmpTdHJlYW0tPkdldERpY3QoKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiRmlyc3QiKSk7CiAgICAgICAgIENQREZfU3ludGF4UGFyc2VyIHN5bnRheDsKLSAgICAgICAgQ0ZYX1NtYXJ0UG9pbnRlcjxJRlhfRmlsZVN0cmVhbT4gZmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0oKHVpbnQ4X3QqKXBPYmpTdHJlYW0tPkdldERhdGEoKSwgKHNpemVfdClwT2JqU3RyZWFtLT5HZXRTaXplKCksIEZBTFNFKSk7CisgICAgICAgIENGWF9TbWFydFBvaW50ZXI8SUZYX0ZpbGVTdHJlYW0+IGZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKCh1aW50OF90KilwT2JqU3RyZWFtLT5HZXREYXRhKCksIChzaXplX3QpcE9ialN0cmVhbS0+R2V0U2l6ZSgpLCBmYWxzZSkpOwogICAgICAgICBzeW50YXguSW5pdFBhcnNlcihmaWxlLkdldCgpLCAwKTsKICAgICAgICAgQ1BERl9PYmplY3QqIHBSZXQgPSBOVUxMOwogICAgICAgICB3aGlsZSAobikgewpAQCAtMTI4Miw3ICsxMjgyLDcgQEAKICAgICAgICAgQ1BERl9TeW50YXhQYXJzZXIgc3ludGF4OwogICAgICAgICBjb25zdCB1aW50OF90KiBwRGF0YSA9IHBPYmpTdHJlYW0tPkdldERhdGEoKTsKICAgICAgICAgRlhfRFdPUkQgdG90YWxzaXplID0gcE9ialN0cmVhbS0+R2V0U2l6ZSgpOwotICAgICAgICBDRlhfU21hcnRQb2ludGVyPElGWF9GaWxlU3RyZWFtPiBmaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSgodWludDhfdCopcERhdGEsIChzaXplX3QpdG90YWxzaXplLCBGQUxTRSkpOworICAgICAgICBDRlhfU21hcnRQb2ludGVyPElGWF9GaWxlU3RyZWFtPiBmaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSgodWludDhfdCopcERhdGEsIChzaXplX3QpdG90YWxzaXplLCBmYWxzZSkpOwogICAgICAgICBzeW50YXguSW5pdFBhcnNlcihmaWxlLkdldCgpLCAwKTsKICAgICAgICAgd2hpbGUgKG4pIHsKICAgICAgICAgICAgIEZYX0RXT1JEIHRoaXNudW0gPSBzeW50YXguR2V0RGlyZWN0TnVtKCk7CkBAIC0xMzEwLDcgKzEzMTAsNyBAQAogICAgICAgICB9CiAgICAgICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOwogICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKHBvcyk7Ci0gICAgICAgIEZYX0JPT0wgYklzTnVtYmVyOworICAgICAgICBib29sIGJJc051bWJlcjsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7CiAgICAgICAgIGlmICghYklzTnVtYmVyKSB7CiAgICAgICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKQEAgLTEzMzYsMTYgKzEzMzYsMTYgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBGWF9GSUxFU0laRSBuZXh0b2ZmID0gKChGWF9GSUxFU0laRSopcFJlc3VsdClbMV07Ci0gICAgICAgIEZYX0JPT0wgYk5leHRPZmZWYWxpZCA9IEZBTFNFOworICAgICAgICBib29sIGJOZXh0T2ZmVmFsaWQgPSBmYWxzZTsKICAgICAgICAgaWYgKG5leHRvZmYgIT0gcG9zKSB7CiAgICAgICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKG5leHRvZmYpOwogICAgICAgICAgICAgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7CiAgICAgICAgICAgICBpZiAod29yZCA9PSBGWF9CU1RSQygieHJlZiIpKSB7Ci0gICAgICAgICAgICAgICAgYk5leHRPZmZWYWxpZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYk5leHRPZmZWYWxpZCA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGJJc051bWJlcikgewogICAgICAgICAgICAgICAgIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZChiSXNOdW1iZXIpOwogICAgICAgICAgICAgICAgIGlmIChiSXNOdW1iZXIgJiYgbV9TeW50YXguR2V0S2V5d29yZCgpID09IEZYX0JTVFJDKCJvYmoiKSkgewotICAgICAgICAgICAgICAgICAgICBiTmV4dE9mZlZhbGlkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYk5leHRPZmZWYWxpZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMzczLDcgKzEzNzMsNyBAQAogewogICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOwogICAgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKLSAgICBGWF9CT09MIGJJc051bWJlcjsKKyAgICBib29sIGJJc051bWJlcjsKICAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKICAgICBpZiAoIWJJc051bWJlcikgewogICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKQEAgLTE0MTYsNyArMTQxNiw3IEBACiB7CiAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7CiAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhwb3MpOwotICAgIEZYX0JPT0wgYklzTnVtYmVyOworICAgIGJvb2wgYklzTnVtYmVyOwogICAgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZChiSXNOdW1iZXIpOwogICAgIGlmICghYklzTnVtYmVyKSB7CiAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwpAQCAtMTQ1OCw3ICsxNDU4LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIChDUERGX0RpY3Rpb25hcnkqKXBPYmo7CiB9Ci1GWF9EV09SRCBDUERGX1BhcnNlcjo6R2V0UGVybWlzc2lvbnMoRlhfQk9PTCBiQ2hlY2tSZXZpc2lvbikKK0ZYX0RXT1JEIENQREZfUGFyc2VyOjpHZXRQZXJtaXNzaW9ucyhib29sIGJDaGVja1JldmlzaW9uKQogewogICAgIGlmIChtX3BTZWN1cml0eUhhbmRsZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gKEZYX0RXT1JEKSAtIDE7CkBAIC0xNDczLDExICsxNDczLDExIEBACiAgICAgfQogICAgIHJldHVybiBkd1Blcm1pc3Npb247CiB9Ci1GWF9CT09MIENQREZfUGFyc2VyOjpJc093bmVyKCkKK2Jvb2wgQ1BERl9QYXJzZXI6OklzT3duZXIoKQogewotICAgIHJldHVybiBtX3BTZWN1cml0eUhhbmRsZXIgPT0gTlVMTCA/IFRSVUUgOiBtX3BTZWN1cml0eUhhbmRsZXItPklzT3duZXIoKTsKKyAgICByZXR1cm4gbV9wU2VjdXJpdHlIYW5kbGVyID09IE5VTEwgPyB0cnVlIDogbV9wU2VjdXJpdHlIYW5kbGVyLT5Jc093bmVyKCk7CiB9Ci12b2lkIENQREZfUGFyc2VyOjpTZXRTZWN1cml0eUhhbmRsZXIoQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIsIEZYX0JPT0wgYkZvcmNlZCkKK3ZvaWQgQ1BERl9QYXJzZXI6OlNldFNlY3VyaXR5SGFuZGxlcihDUERGX1NlY3VyaXR5SGFuZGxlciogcFNlY3VyaXR5SGFuZGxlciwgYm9vbCBiRm9yY2VkKQogewogICAgIEFTU0VSVChtX3BTZWN1cml0eUhhbmRsZXIgPT0gTlVMTCk7CiAgICAgaWYgKCFtX2JGb3JjZVVzZVNlY3VyaXR5SGFuZGxlcikgewpAQCAtMTQ5MiwyOSArMTQ5MiwyOSBAQAogICAgIG1fU3ludGF4Lm1fcENyeXB0b0hhbmRsZXIgPSBwU2VjdXJpdHlIYW5kbGVyLT5DcmVhdGVDcnlwdG9IYW5kbGVyKCk7CiAgICAgbV9TeW50YXgubV9wQ3J5cHRvSGFuZGxlci0+SW5pdChOVUxMLCBwU2VjdXJpdHlIYW5kbGVyKTsKIH0KLUZYX0JPT0wgQ1BERl9QYXJzZXI6OklzTGluZWFyaXplZEZpbGUoSUZYX0ZpbGVSZWFkKiBwRmlsZUFjY2VzcywgRlhfRFdPUkQgb2Zmc2V0KQorYm9vbCBDUERGX1BhcnNlcjo6SXNMaW5lYXJpemVkRmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLCBGWF9EV09SRCBvZmZzZXQpCiB7CiAgICAgbV9TeW50YXguSW5pdFBhcnNlcihwRmlsZUFjY2Vzcywgb2Zmc2V0KTsKICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKG1fU3ludGF4Lm1fSGVhZGVyT2Zmc2V0ICsgOSk7CiAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7Ci0gICAgRlhfQk9PTCBiSXNOdW1iZXI7CisgICAgYm9vbCBiSXNOdW1iZXI7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7CiAgICAgaWYgKCFiSXNOdW1iZXIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX0RXT1JEIG9iam51bSA9IEZYU1lTX2F0b2kod29yZCk7CiAgICAgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7CiAgICAgaWYgKCFiSXNOdW1iZXIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX0RXT1JEIGdlbm51bSA9IEZYU1lTX2F0b2kod29yZCk7CiAgICAgaWYgKG1fU3ludGF4LkdldEtleXdvcmQoKSAhPSBGWF9CU1RSQygib2JqIikpIHsKICAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BMaW5lYXJpemVkID0gbV9TeW50YXguR2V0T2JqZWN0KE5VTEwsIG9iam51bSwgZ2VubnVtLCAwKTsKICAgICBpZiAoIW1fcExpbmVhcml6ZWQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX3BMaW5lYXJpemVkLT5HZXREaWN0KCkgJiYgbV9wTGluZWFyaXplZC0+R2V0RGljdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJMaW5lYXJpemVkIikpKSB7CiAgICAgICAgIG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7CkBAIC0xNTIyLDEwICsxNTIyLDEwIEBACiAgICAgICAgIGlmICghcExlbikgewogICAgICAgICAgICAgbV9wTGluZWFyaXplZC0+UmVsZWFzZSgpOwogICAgICAgICAgICAgbV9wTGluZWFyaXplZCA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBMZW4tPkdldEludGVnZXIoKSAhPSAoaW50KXBGaWxlQWNjZXNzLT5HZXRTaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBDUERGX09iamVjdCAqcE5vID0gbV9wTGluZWFyaXplZC0+R2V0RGljdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJQIikpOwogICAgICAgICBpZiAocE5vICYmIHBOby0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKQEAgLTE1MzUsMTYgKzE1MzUsMTYgQEAKICAgICAgICAgaWYgKHBUYWJsZSAmJiBwVGFibGUtPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7CiAgICAgICAgICAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gcFRhYmxlLT5HZXRJbnRlZ2VyKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBtX3BMaW5lYXJpemVkLT5SZWxlYXNlKCk7CiAgICAgbV9wTGluZWFyaXplZCA9IE5VTEw7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0RXT1JEIENQREZfUGFyc2VyOjpTdGFydEFzeW5QYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLCBGWF9CT09MIGJSZVBhcnNlLCBGWF9CT09MIGJPd25GaWxlUmVhZCkKK0ZYX0RXT1JEIENQREZfUGFyc2VyOjpTdGFydEFzeW5QYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLCBib29sIGJSZVBhcnNlLCBib29sIGJPd25GaWxlUmVhZCkKIHsKICAgICBDbG9zZVBhcnNlcihiUmVQYXJzZSk7Ci0gICAgbV9iWFJlZlN0cmVhbSA9IEZBTFNFOworICAgIG1fYlhSZWZTdHJlYW0gPSBmYWxzZTsKICAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gMDsKICAgICBtX2JPd25GaWxlUmVhZCA9IGJPd25GaWxlUmVhZDsKICAgICBpbnQzMl90IG9mZnNldCA9IEdldEhlYWRlck9mZnNldChwRmlsZUFjY2Vzcyk7CkBAIC0xNTU5LDE5ICsxNTU5LDE5IEBACiAgICAgICAgIG1fcERvY3VtZW50ID0gbmV3IENQREZfRG9jdW1lbnQodGhpcyk7CiAgICAgfQogICAgIEZYX0ZJTEVTSVpFIGR3Rmlyc3RYUmVmT2Zmc2V0ID0gbV9TeW50YXguU2F2ZVBvcygpOwotICAgIEZYX0JPT0wgYlhSZWZSZWJ1aWx0ID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBiTG9hZFY0ID0gRkFMU0U7Ci0gICAgaWYgKCEoYkxvYWRWNCA9IExvYWRDcm9zc1JlZlY0KGR3Rmlyc3RYUmVmT2Zmc2V0LCAwLCBGQUxTRSwgRkFMU0UpKSAmJiAhTG9hZENyb3NzUmVmVjUoZHdGaXJzdFhSZWZPZmZzZXQsIGR3Rmlyc3RYUmVmT2Zmc2V0LCBUUlVFKSkgeworICAgIGJvb2wgYlhSZWZSZWJ1aWx0ID0gZmFsc2U7CisgICAgYm9vbCBiTG9hZFY0ID0gZmFsc2U7CisgICAgaWYgKCEoYkxvYWRWNCA9IExvYWRDcm9zc1JlZlY0KGR3Rmlyc3RYUmVmT2Zmc2V0LCAwLCBmYWxzZSwgZmFsc2UpKSAmJiAhTG9hZENyb3NzUmVmVjUoZHdGaXJzdFhSZWZPZmZzZXQsIGR3Rmlyc3RYUmVmT2Zmc2V0LCB0cnVlKSkgewogICAgICAgICBpZiAoIVJlYnVpbGRDcm9zc1JlZigpKSB7CiAgICAgICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwogICAgICAgICB9Ci0gICAgICAgIGJYUmVmUmVidWlsdCA9IFRSVUU7CisgICAgICAgIGJYUmVmUmVidWlsdCA9IHRydWU7CiAgICAgICAgIG1fTGFzdFhSZWZPZmZzZXQgPSAwOwogICAgIH0KICAgICBpZiAoYkxvYWRWNCkgewogICAgICAgICBtX3BUcmFpbGVyID0gTG9hZFRyYWlsZXJWNCgpOwogICAgICAgICBpZiAobV9wVHJhaWxlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaW50MzJfdCB4cmVmc2l6ZSA9IEdldERpcmVjdEludGVnZXIobV9wVHJhaWxlciwgRlhfQlNUUkMoIlNpemUiKSk7CiAgICAgICAgIGlmICh4cmVmc2l6ZSA+IDApIHsKQEAgLTE2MjMsMTggKzE2MjMsMTggQEAKICAgICB9CiAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX1NVQ0NFU1M7CiB9Ci1GWF9CT09MIENQREZfUGFyc2VyOjpMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjUoRlhfRklMRVNJWkUgeHJlZnBvcykKK2Jvb2wgQ1BERl9QYXJzZXI6OkxvYWRMaW5lYXJpemVkQWxsQ3Jvc3NSZWZWNShGWF9GSUxFU0laRSB4cmVmcG9zKQogewotICAgIGlmICghTG9hZENyb3NzUmVmVjUoeHJlZnBvcywgeHJlZnBvcywgRkFMU0UpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHhyZWZwb3MsIHhyZWZwb3MsIGZhbHNlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHdoaWxlICh4cmVmcG9zKQotICAgICAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHhyZWZwb3MsIHhyZWZwb3MsIEZBTFNFKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHhyZWZwb3MsIHhyZWZwb3MsIGZhbHNlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgbV9PYmplY3RTdHJlYW1NYXAuSW5pdEhhc2hUYWJsZSgxMDEsIEZBTFNFKTsKLSAgICBtX2JYUmVmU3RyZWFtID0gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBtX09iamVjdFN0cmVhbU1hcC5Jbml0SGFzaFRhYmxlKDEwMSwgZmFsc2UpOworICAgIG1fYlhSZWZTdHJlYW0gPSB0cnVlOworICAgIHJldHVybiB0cnVlOwogfQogRlhfRFdPUkQgQ1BERl9QYXJzZXI6OkxvYWRMaW5lYXJpemVkTWFpblhSZWZUYWJsZSgpCiB7CkBAIC0xNjg4LDcgKzE2ODgsNyBAQAogICAgIG1fcEZpbGVCdWYgPSBOVUxMOwogICAgIG1fTWV0YWRhdGFPYmpudW0gPSAwOwogICAgIG1fZHdXb3JkUG9zID0gMDsKLSAgICBtX2JGaWxlU3RyZWFtID0gRkFMU0U7CisgICAgbV9iRmlsZVN0cmVhbSA9IGZhbHNlOwogfQogQ1BERl9TeW50YXhQYXJzZXI6On5DUERGX1N5bnRheFBhcnNlcigpCiB7CkBAIC0xNjk2LDE5ICsxNjk2LDE5IEBACiAgICAgICAgIEZYX0ZyZWUobV9wRmlsZUJ1Zik7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX1N5bnRheFBhcnNlcjo6R2V0Q2hhckF0KEZYX0ZJTEVTSVpFIHBvcywgdWludDhfdCYgY2gpCitib29sIENQREZfU3ludGF4UGFyc2VyOjpHZXRDaGFyQXQoRlhfRklMRVNJWkUgcG9zLCB1aW50OF90JiBjaCkKIHsKICAgICBGWF9GSUxFU0laRSBzYXZlX3BvcyA9IG1fUG9zOwogICAgIG1fUG9zID0gcG9zOwotICAgIEZYX0JPT0wgcmV0ID0gR2V0TmV4dENoYXIoY2gpOworICAgIGJvb2wgcmV0ID0gR2V0TmV4dENoYXIoY2gpOwogICAgIG1fUG9zID0gc2F2ZV9wb3M7CiAgICAgcmV0dXJuIHJldDsKIH0KLUZYX0JPT0wgQ1BERl9TeW50YXhQYXJzZXI6OkdldE5leHRDaGFyKHVpbnQ4X3QmIGNoKQorYm9vbCBDUERGX1N5bnRheFBhcnNlcjo6R2V0TmV4dENoYXIodWludDhfdCYgY2gpCiB7CiAgICAgRlhfRklMRVNJWkUgcG9zID0gbV9Qb3MgKyBtX0hlYWRlck9mZnNldDsKICAgICBpZiAocG9zID49IG1fRmlsZUxlbikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fQnVmT2Zmc2V0ID49IHBvcyB8fCAoRlhfRklMRVNJWkUpKG1fQnVmT2Zmc2V0ICsgbV9CdWZTaXplKSA8PSBwb3MpIHsKICAgICAgICAgRlhfRklMRVNJWkUgcmVhZF9wb3MgPSBwb3M7CkBAIC0xNzI1LDE5ICsxNzI1LDE5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFtX3BGaWxlQWNjZXNzLT5SZWFkQmxvY2sobV9wRmlsZUJ1ZiwgcmVhZF9wb3MsIHJlYWRfc2l6ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBtX0J1Zk9mZnNldCA9IHJlYWRfcG9zOwogICAgIH0KICAgICBjaCA9IG1fcEZpbGVCdWZbcG9zIC0gbV9CdWZPZmZzZXRdOwogICAgIG1fUG9zICsrOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX1N5bnRheFBhcnNlcjo6R2V0Q2hhckF0QmFja3dhcmQoRlhfRklMRVNJWkUgcG9zLCB1aW50OF90JiBjaCkKK2Jvb2wgQ1BERl9TeW50YXhQYXJzZXI6OkdldENoYXJBdEJhY2t3YXJkKEZYX0ZJTEVTSVpFIHBvcywgdWludDhfdCYgY2gpCiB7CiAgICAgcG9zICs9IG1fSGVhZGVyT2Zmc2V0OwogICAgIGlmIChwb3MgPj0gbV9GaWxlTGVuKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9CdWZPZmZzZXQgPj0gcG9zIHx8IChGWF9GSUxFU0laRSkobV9CdWZPZmZzZXQgKyBtX0J1ZlNpemUpIDw9IHBvcykgewogICAgICAgICBGWF9GSUxFU0laRSByZWFkX3BvczsKQEAgLTE3NTYsMjYgKzE3NTYsMjYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoIW1fcEZpbGVBY2Nlc3MtPlJlYWRCbG9jayhtX3BGaWxlQnVmLCByZWFkX3BvcywgcmVhZF9zaXplKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIG1fQnVmT2Zmc2V0ID0gcmVhZF9wb3M7CiAgICAgfQogICAgIGNoID0gbV9wRmlsZUJ1Zltwb3MgLSBtX0J1Zk9mZnNldF07Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfU3ludGF4UGFyc2VyOjpSZWFkQmxvY2sodWludDhfdCogcEJ1ZiwgRlhfRFdPUkQgc2l6ZSkKK2Jvb2wgQ1BERl9TeW50YXhQYXJzZXI6OlJlYWRCbG9jayh1aW50OF90KiBwQnVmLCBGWF9EV09SRCBzaXplKQogewogICAgIGlmICghbV9wRmlsZUFjY2Vzcy0+UmVhZEJsb2NrKHBCdWYsIG1fUG9zICsgbV9IZWFkZXJPZmZzZXQsIHNpemUpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX1BvcyArPSBzaXplOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogI2RlZmluZSBNQVhfV09SRF9CVUZGRVIgMjU2CiB2b2lkIENQREZfU3ludGF4UGFyc2VyOjpHZXROZXh0V29yZCgpCiB7CiAgICAgbV9Xb3JkU2l6ZSA9IDA7Ci0gICAgbV9iSXNOdW1iZXIgPSBUUlVFOworICAgIG1fYklzTnVtYmVyID0gdHJ1ZTsKICAgICB1aW50OF90IGNoOwogICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTE4MDIsNyArMTgwMiw3IEBACiAgICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwogICAgIH0KICAgICBpZiAodHlwZSA9PSAnRCcpIHsKLSAgICAgICAgbV9iSXNOdW1iZXIgPSBGQUxTRTsKKyAgICAgICAgbV9iSXNOdW1iZXIgPSBmYWxzZTsKICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKICAgICAgICAgaWYgKGNoID09ICcvJykgewogICAgICAgICAgICAgd2hpbGUgKDEpIHsKQEAgLTE4NDQsNyArMTg0NCw3IEBACiAgICAgICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwogICAgICAgICB9CiAgICAgICAgIGlmICh0eXBlICE9ICdOJykgewotICAgICAgICAgICAgbV9iSXNOdW1iZXIgPSBGQUxTRTsKKyAgICAgICAgICAgIG1fYklzTnVtYmVyID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTE5NTAsNyArMTk1MCw3IEBACiAgICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwogICAgIH0KICAgICBDRlhfQmluYXJ5QnVmIGJ1ZjsKLSAgICBGWF9CT09MIGJGaXJzdCA9IFRSVUU7CisgICAgYm9vbCBiRmlyc3QgPSB0cnVlOwogICAgIHVpbnQ4X3QgY29kZSA9IDA7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKGNoID09ICc+JykgewpAQCAtMjAzNiw3ICsyMDM2LDcgQEAKICAgICB9CiAgICAgbV9Qb3MgLS07CiB9Ci1DRlhfQnl0ZVN0cmluZyBDUERGX1N5bnRheFBhcnNlcjo6R2V0TmV4dFdvcmQoRlhfQk9PTCYgYklzTnVtYmVyKQorQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TeW50YXhQYXJzZXI6OkdldE5leHRXb3JkKGJvb2wmIGJJc051bWJlcikKIHsKICAgICBHZXROZXh0V29yZCgpOwogICAgIGJJc051bWJlciA9IG1fYklzTnVtYmVyOwpAQCAtMjA0NywxNSArMjA0NywxNSBAQAogICAgIEdldE5leHRXb3JkKCk7CiAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKChjb25zdCBGWF9DSEFSKiltX1dvcmRCdWZmZXIsIG1fV29yZFNpemUpOwogfQotQ1BERl9PYmplY3QqIENQREZfU3ludGF4UGFyc2VyOjpHZXRPYmplY3QoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpMaXN0LCBGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgUEFSU0VfQ09OVEVYVCogcENvbnRleHQsIEZYX0JPT0wgYkRlY3J5cHQpCitDUERGX09iamVjdCogQ1BERl9TeW50YXhQYXJzZXI6OkdldE9iamVjdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsIEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCwgYm9vbCBiRGVjcnlwdCkKIHsKICAgICBDRlhfQXV0b1Jlc3RvcmVyPGludD4gcmVzdG9yZXIoJnNfQ3VycmVudFJlY3Vyc2lvbkRlcHRoKTsKICAgICBpZiAoKytzX0N1cnJlbnRSZWN1cnNpb25EZXB0aCA+IGtQYXJzZXJNYXhSZWN1cnNpb25EZXB0aCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1BvczsKLSAgICBGWF9CT09MIGJUeXBlT25seSA9IHBDb250ZXh0ICYmIChwQ29udGV4dC0+bV9GbGFncyAmIFBERlBBUlNFX1RZUEVPTkxZKTsKLSAgICBGWF9CT09MIGJJc051bWJlcjsKKyAgICBib29sIGJUeXBlT25seSA9IHBDb250ZXh0ICYmIChwQ29udGV4dC0+bV9GbGFncyAmIFBERlBBUlNFX1RZUEVPTkxZKTsKKyAgICBib29sIGJJc051bWJlcjsKICAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKICAgICBpZiAod29yZC5HZXRMZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgIGlmIChiVHlwZU9ubHkpIHsKQEAgLTIxMDIsNyArMjEwMiw3IEBACiAgICAgICAgIGlmIChtX3BDcnlwdG9IYW5kbGVyICYmIGJEZWNyeXB0KSB7CiAgICAgICAgICAgICBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0KG9iam51bSwgZ2VubnVtLCBzdHIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDUERGX1N0cmluZzo6Q3JlYXRlKHN0ciwgRkFMU0UpOworICAgICAgICByZXR1cm4gQ1BERl9TdHJpbmc6OkNyZWF0ZShzdHIsIGZhbHNlKTsKICAgICB9CiAgICAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIjwiKSkgewogICAgICAgICBpZiAoYlR5cGVPbmx5KSB7CkBAIC0yMTEyLDcgKzIxMTIsNyBAQAogICAgICAgICBpZiAobV9wQ3J5cHRvSGFuZGxlciAmJiBiRGVjcnlwdCkgewogICAgICAgICAgICAgbV9wQ3J5cHRvSGFuZGxlci0+RGVjcnlwdChvYmpudW0sIGdlbm51bSwgc3RyKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gQ1BERl9TdHJpbmc6OkNyZWF0ZShzdHIsIFRSVUUpOworICAgICAgICByZXR1cm4gQ1BERl9TdHJpbmc6OkNyZWF0ZShzdHIsIHRydWUpOwogICAgIH0KICAgICBpZiAod29yZCA9PSBGWF9CU1RSQygiWyIpKSB7CiAgICAgICAgIGlmIChiVHlwZU9ubHkpIHsKQEAgLTIxNDUsNyArMjE0NSw3IEBACiAgICAgICAgIGludDMyX3QgbktleXMgPSAwOwogICAgICAgICBGWF9GSUxFU0laRSBkd1NpZ25WYWx1ZVBvcyA9IDA7CiAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBGWF9CT09MIGJJc051bWJlcjsKKyAgICAgICAgICAgIGJvb2wgYklzTnVtYmVyOwogICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5ID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKICAgICAgICAgICAgIGlmIChrZXkuSXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBEaWN0KQpAQCAtMjE4Myw3ICsyMTgzLDcgQEAKICAgICAgICAgaWYgKElzU2lnbmF0dXJlRGljdChwRGljdCkpIHsKICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGR3U2F2ZVBvcyA9IG1fUG9zOwogICAgICAgICAgICAgbV9Qb3MgPSBkd1NpZ25WYWx1ZVBvczsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gR2V0T2JqZWN0KHBPYmpMaXN0LCBvYmpudW0sIGdlbm51bSwgTlVMTCwgRkFMU0UpOworICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBHZXRPYmplY3QocE9iakxpc3QsIG9iam51bSwgZ2VubnVtLCBOVUxMLCBmYWxzZSk7CiAgICAgICAgICAgICBwRGljdC0+U2V0QXQoRlhfQlNUUkMoIkNvbnRlbnRzIiksIHBPYmopOwogICAgICAgICAgICAgbV9Qb3MgPSBkd1NhdmVQb3M7CiAgICAgICAgIH0KQEAgLTIxOTQsNyArMjE5NCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1BvczsKLSAgICAgICAgRlhfQk9PTCBiSXNOdW1iZXI7CisgICAgICAgIGJvb2wgYklzTnVtYmVyOwogICAgICAgICBDRlhfQnl0ZVN0cmluZyBuZXh0d29yZCA9IEdldE5leHRXb3JkKGJJc051bWJlcik7CiAgICAgICAgIGlmIChuZXh0d29yZCA9PSBGWF9CU1RSQygic3RyZWFtIikpIHsKICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gUmVhZFN0cmVhbShwRGljdCwgcENvbnRleHQsIG9iam51bSwgZ2VubnVtKTsKQEAgLTIyMjUsOCArMjIyNSw4IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fUG9zOwotICAgIEZYX0JPT0wgYlR5cGVPbmx5ID0gcENvbnRleHQgJiYgKHBDb250ZXh0LT5tX0ZsYWdzICYgUERGUEFSU0VfVFlQRU9OTFkpOwotICAgIEZYX0JPT0wgYklzTnVtYmVyOworICAgIGJvb2wgYlR5cGVPbmx5ID0gcENvbnRleHQgJiYgKHBDb250ZXh0LT5tX0ZsYWdzICYgUERGUEFSU0VfVFlQRU9OTFkpOworICAgIGJvb2wgYklzTnVtYmVyOwogICAgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBHZXROZXh0V29yZChiSXNOdW1iZXIpOwogICAgIGlmICh3b3JkLkdldExlbmd0aCgpID09IDApIHsKICAgICAgICAgaWYgKGJUeXBlT25seSkgewpAQCAtMjI3Myw3ICsyMjczLDcgQEAKICAgICAgICAgaWYgKG1fcENyeXB0b0hhbmRsZXIpIHsKICAgICAgICAgICAgIG1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHQob2JqbnVtLCBnZW5udW0sIHN0cik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENQREZfU3RyaW5nOjpDcmVhdGUoc3RyLCBGQUxTRSk7CisgICAgICAgIHJldHVybiBDUERGX1N0cmluZzo6Q3JlYXRlKHN0ciwgZmFsc2UpOwogICAgIH0KICAgICBpZiAod29yZCA9PSBGWF9CU1RSQygiPCIpKSB7CiAgICAgICAgIGlmIChiVHlwZU9ubHkpIHsKQEAgLTIyODMsNyArMjI4Myw3IEBACiAgICAgICAgIGlmIChtX3BDcnlwdG9IYW5kbGVyKSB7CiAgICAgICAgICAgICBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0KG9iam51bSwgZ2VubnVtLCBzdHIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDUERGX1N0cmluZzo6Q3JlYXRlKHN0ciwgVFJVRSk7CisgICAgICAgIHJldHVybiBDUERGX1N0cmluZzo6Q3JlYXRlKHN0ciwgdHJ1ZSk7CiAgICAgfQogICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCJbIikpIHsKICAgICAgICAgaWYgKGJUeXBlT25seSkgewpAQCAtMjMxOSw3ICsyMzE5LDcgQEAKICAgICAgICAgfQogICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKICAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYklzTnVtYmVyOworICAgICAgICAgICAgYm9vbCBiSXNOdW1iZXI7CiAgICAgICAgICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fUG9zOwogICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5ID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKICAgICAgICAgICAgIGlmIChrZXkuSXNFbXB0eSgpKSB7CkBAIC0yMzY2LDcgKzIzNjYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7Ci0gICAgICAgIEZYX0JPT0wgYklzTnVtYmVyOworICAgICAgICBib29sIGJJc051bWJlcjsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmV4dHdvcmQgPSBHZXROZXh0V29yZChiSXNOdW1iZXIpOwogICAgICAgICBpZiAobmV4dHdvcmQgPT0gRlhfQlNUUkMoInN0cmVhbSIpKSB7CiAgICAgICAgICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IFJlYWRTdHJlYW0ocERpY3QsIHBDb250ZXh0LCBvYmpudW0sIGdlbm51bSk7CkBAIC0yNDk1LDMyICsyNDk1LDMyIEBACiAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemVdID0gMDsKICAgICByZXR1cm4gRlhTWVNfYXRvaSgoY29uc3QgRlhfQ0hBUiopbV9Xb3JkQnVmZmVyKTsKIH0KLUZYX0JPT0wgQ1BERl9TeW50YXhQYXJzZXI6OklzV2hvbGVXb3JkKEZYX0ZJTEVTSVpFIHN0YXJ0cG9zLCBGWF9GSUxFU0laRSBsaW1pdCwgY29uc3QgdWludDhfdCogdGFnLCBGWF9EV09SRCB0YWdsZW4pCitib29sIENQREZfU3ludGF4UGFyc2VyOjpJc1dob2xlV29yZChGWF9GSUxFU0laRSBzdGFydHBvcywgRlhfRklMRVNJWkUgbGltaXQsIGNvbnN0IHVpbnQ4X3QqIHRhZywgRlhfRFdPUkQgdGFnbGVuKQogewogICAgIHVpbnQ4X3QgdHlwZSA9IFBERl9DaGFyVHlwZVt0YWdbMF1dOwotICAgIEZYX0JPT0wgYkNoZWNrTGVmdCA9IHR5cGUgIT0gJ0QnICYmIHR5cGUgIT0gJ1cnOworICAgIGJvb2wgYkNoZWNrTGVmdCA9IHR5cGUgIT0gJ0QnICYmIHR5cGUgIT0gJ1cnOwogICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbdGFnW3RhZ2xlbiAtIDFdXTsKLSAgICBGWF9CT09MIGJDaGVja1JpZ2h0ID0gdHlwZSAhPSAnRCcgJiYgdHlwZSAhPSAnVyc7CisgICAgYm9vbCBiQ2hlY2tSaWdodCA9IHR5cGUgIT0gJ0QnICYmIHR5cGUgIT0gJ1cnOwogICAgIHVpbnQ4X3QgY2g7CiAgICAgaWYgKGJDaGVja1JpZ2h0ICYmIHN0YXJ0cG9zICsgKGludDMyX3QpdGFnbGVuIDw9IGxpbWl0ICYmIEdldENoYXJBdChzdGFydHBvcyArIChpbnQzMl90KXRhZ2xlbiwgY2gpKSB7CiAgICAgICAgIHVpbnQ4X3QgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CiAgICAgICAgIGlmICh0eXBlID09ICdOJyB8fCB0eXBlID09ICdSJykgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChiQ2hlY2tMZWZ0ICYmIHN0YXJ0cG9zID4gMCAmJiBHZXRDaGFyQXQoc3RhcnRwb3MgLSAxLCBjaCkpIHsKICAgICAgICAgdWludDhfdCB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKICAgICAgICAgaWYgKHR5cGUgPT0gJ04nIHx8IHR5cGUgPT0gJ1InKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfU3ludGF4UGFyc2VyOjpTZWFyY2hXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFnLCBGWF9CT09MIGJXaG9sZVdvcmQsIEZYX0JPT0wgYkZvcndhcmQsIEZYX0ZJTEVTSVpFIGxpbWl0KQorYm9vbCBDUERGX1N5bnRheFBhcnNlcjo6U2VhcmNoV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZywgYm9vbCBiV2hvbGVXb3JkLCBib29sIGJGb3J3YXJkLCBGWF9GSUxFU0laRSBsaW1pdCkKIHsKICAgICBpbnQzMl90IHRhZ2xlbiA9IHRhZy5HZXRMZW5ndGgoKTsKICAgICBpZiAodGFnbGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX0ZJTEVTSVpFIHBvcyA9IG1fUG9zOwogICAgIGludDMyX3Qgb2Zmc2V0ID0gMDsKQEAgLTI1MzMsMjAgKzI1MzMsMjAgQEAKICAgICAgICAgaWYgKGJGb3J3YXJkKSB7CiAgICAgICAgICAgICBpZiAobGltaXQpIHsKICAgICAgICAgICAgICAgICBpZiAocG9zID49IG1fUG9zICsgbGltaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFHZXRDaGFyQXQocG9zLCBieXRlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobGltaXQpIHsKICAgICAgICAgICAgICAgICBpZiAocG9zIDw9IG1fUG9zIC0gbGltaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFHZXRDaGFyQXRCYWNrd2FyZChwb3MsIGJ5dGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoYnl0ZSA9PSB0YWdfZGF0YVtvZmZzZXRdKSB7CkBAIC0yNTY2LDcgKzI1NjYsNyBAQAogICAgICAgICAgICAgRlhfRklMRVNJWkUgc3RhcnRwb3MgPSBiRm9yd2FyZCA/IHBvcyAtIHRhZ2xlbiArIDEgOiBwb3M7CiAgICAgICAgICAgICBpZiAoIWJXaG9sZVdvcmQgfHwgSXNXaG9sZVdvcmQoc3RhcnRwb3MsIGxpbWl0LCB0YWcuR2V0UHRyKCksIHRhZ2xlbikpIHsKICAgICAgICAgICAgICAgICBtX1BvcyA9IHN0YXJ0cG9zOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChiRm9yd2FyZCkgewpAQCAtMjU3NywxNyArMjU3NywxNyBAQAogICAgICAgICAgICAgcG9zIC0tOwogICAgICAgICB9CiAgICAgICAgIGlmIChwb3MgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIHN0cnVjdCBfU2VhcmNoVGFnUmVjb3JkIHsKICAgICBjb25zdCB1aW50OF90KgltX3BUYWc7CiAgICAgRlhfRFdPUkQJbV9MZW47CiAgICAgRlhfRFdPUkQJbV9PZmZzZXQ7CiB9OwotaW50MzJfdCBDUERGX1N5bnRheFBhcnNlcjo6U2VhcmNoTXVsdGlXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFncywgRlhfQk9PTCBiV2hvbGVXb3JkLCBGWF9GSUxFU0laRSBsaW1pdCkKK2ludDMyX3QgQ1BERl9TeW50YXhQYXJzZXI6OlNlYXJjaE11bHRpV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZ3MsIGJvb2wgYldob2xlV29yZCwgRlhfRklMRVNJWkUgbGltaXQpCiB7CiAgICAgaW50MzJfdCBudGFncyA9IDEsIGk7CiAgICAgZm9yIChpID0gMDsgaSA8IHRhZ3MuR2V0TGVuZ3RoKCk7IGkgKyspCkBAIC0yNjk1LDE3ICsyNjk1LDE3IEBACiAgICAgQ1BERl9EYXRhQXZhaWwoSUZYX0ZpbGVBdmFpbCogcEZpbGVBdmFpbCwgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQpOwogICAgIH5DUERGX0RhdGFBdmFpbCgpOwogCi0gICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgSXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSAgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sICAgICAgICAgICAgICAgICAgICAgSXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSAgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBTZXREb2N1bWVudChDUERGX0RvY3VtZW50KiBwRG9jKSAgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICBJc1BhZ2VBdmFpbChpbnQgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpICBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICAgICAgICAgICBJc1BhZ2VBdmFpbChpbnQgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpICBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIElzRm9ybUF2YWlsKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpICBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIElzTGluZWFyaXplZFBERigpICBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgIElzTGluZWFyaXplZCgpICBvdmVycmlkZQorICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgICAgICAgICAgIElzTGluZWFyaXplZCgpICBvdmVycmlkZQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYkxpbmVhcml6ZWQ7CiAgICAgfQpAQCAtMjcxNyw1MiArMjcxNyw1MiBAQAogICAgIHN0YXRpYyBpbnQgc19DdXJyZW50RGF0YUF2YWlsUmVjdXJzaW9uRGVwdGg7CiAKICAgICBGWF9EV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRPYmplY3RTaXplKEZYX0RXT1JEIG9iam51bSwgRlhfRklMRVNJWkUmIG9mZnNldCk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNPYmplY3RzQXZhaWwoQ0ZYX1B0ckFycmF5JiBvYmpfYXJyYXksIEZYX0JPT0wgYlBhcnNlUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cywgQ0ZYX1B0ckFycmF5ICZyZXRfYXJyYXkpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrRG9jU3RhdHVzKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrSGVhZGVyKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrRmlyc3RQYWdlKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrRW5kKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQ3Jvc3NSZWYoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tDcm9zc1JlZkl0ZW0oSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tUcmFpbGVyKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUm9vdChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0luZm8oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1BhZ2UoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tSZXNvdXJjZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tBbm5vdHMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tBY3JvRm9ybShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Fjcm9Gb3JtU3ViT2JqZWN0KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrVHJhaWxlckFwcGVuZChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1BhZ2VTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tBbGxDcm9zc1JlZlN0cmVhbShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc09iamVjdHNBdmFpbChDRlhfUHRyQXJyYXkmIG9ial9hcnJheSwgYm9vbCBiUGFyc2VQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLCBDRlhfUHRyQXJyYXkgJnJldF9hcnJheSk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tEb2NTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tIZWFkZXIoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tGaXJzdFBhZ2UoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tFbmQoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tDcm9zc1JlZihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Nyb3NzUmVmSXRlbShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1RyYWlsZXIoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tSb290KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrSW5mbyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1Jlc291cmNlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Fubm90cyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Fjcm9Gb3JtKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQWNyb0Zvcm1TdWJPYmplY3QoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tUcmFpbGVyQXBwZW5kKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZVN0YXR1cyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0FsbENyb3NzUmVmU3RyZWFtKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpOwogCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Nyb3NzUmVmU3RyZWFtKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMsIEZYX0ZJTEVTSVpFICZ4cmVmX29mZnNldCk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNMaW5lYXJpemVkRmlsZSh1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdMZW4pOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTGluZWFyaXplZEZpbGUodWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3TGVuKTsKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRTdGFydE9mZnNldChGWF9GSUxFU0laRSBkd09mZnNldCk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TmV4dFRva2VuKENGWF9CeXRlU3RyaW5nICZ0b2tlbik7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TmV4dENoYXIodWludDhfdCAmY2gpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE5leHRUb2tlbihDRlhfQnl0ZVN0cmluZyAmdG9rZW4pOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE5leHRDaGFyKHVpbnQ4X3QgJmNoKTsKICAgICBDUERGX09iamVjdAkqICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUluZGlyZWN0T2JqZWN0QXQoRlhfRklMRVNJWkUgcG9zLCBGWF9EV09SRCBvYmpudW0pOwotICAgIENQREZfT2JqZWN0CSogICAgICAgICAgICAgICAgICAgICAgIEdldE9iamVjdChGWF9EV09SRCBvYmpudW0sIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMsIEZYX0JPT0wgKnBFeGlzdEluRmlsZSk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFnZUtpZHMoQ1BERl9QYXJzZXIgKnBQYXJzZXIsIENQREZfT2JqZWN0ICpwUGFnZXMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXBhcmVQYWdlSXRlbSgpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRQYWdlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkQWxsWHJlZihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkQWxsRmlsZShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0xpbmVhcml6ZWREYXRhKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrRmlsZVJlc291cmNlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1BhZ2VBbm5vdHMoaW50IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBDUERGX09iamVjdAkqICAgICAgICAgICAgICAgICAgICAgICBHZXRPYmplY3QoRlhfRFdPUkQgb2JqbnVtLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLCBib29sICpwRXhpc3RJbkZpbGUpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFBhZ2VLaWRzKENQREZfUGFyc2VyICpwUGFyc2VyLCBDUERGX09iamVjdCAqcFBhZ2VzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVwYXJlUGFnZUl0ZW0oKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkUGFnZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZEFsbFhyZWYoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZEFsbEZpbGUoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tMaW5lYXJpemVkRGF0YShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0ZpbGVSZXNvdXJjZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlQW5ub3RzKGludCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0xpbmVhcml6ZWRGaXJzdFBhZ2UoaW50IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXZlUmVzb3VyY2VBbmNlc3RvcihDUERGX0RpY3Rpb25hcnkgKnBEaWN0KTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1BhZ2UoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZERvY1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWREb2NQYWdlKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZU5vZGUoQ1BERl9QYWdlTm9kZSAmcGFnZU5vZGVzLCBpbnQzMl90IGlQYWdlLCBpbnQzMl90ICZpQ291bnQsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrVW5rb3duUGFnZU5vZGUoRlhfRFdPUkQgZHdQYWdlTm8sIENQREZfUGFnZU5vZGUgKnBQYWdlTm9kZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tBcnJheVBhZ2VOb2RlKEZYX0RXT1JEIGR3UGFnZU5vLCBDUERGX1BhZ2VOb2RlICpwUGFnZU5vZGUsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZUNvdW50KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzRmlyc3RDaGVjayhpbnQgaVBhZ2UpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrTGluZWFyaXplZEZpcnN0UGFnZShpbnQgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhdmVSZXNvdXJjZUFuY2VzdG9yKENQREZfRGljdGlvbmFyeSAqcERpY3QpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZShpbnQzMl90IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkRG9jUGFnZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZERvY1BhZ2UoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlTm9kZShDUERGX1BhZ2VOb2RlICZwYWdlTm9kZXMsIGludDMyX3QgaVBhZ2UsIGludDMyX3QgJmlDb3VudCwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tVbmtvd25QYWdlTm9kZShGWF9EV09SRCBkd1BhZ2VObywgQ1BERl9QYWdlTm9kZSAqcFBhZ2VOb2RlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0FycmF5UGFnZU5vZGUoRlhfRFdPUkQgZHdQYWdlTm8sIENQREZfUGFnZU5vZGUgKnBQYWdlTm9kZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlQ291bnQoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNGaXJzdENoZWNrKGludCBpUGFnZSk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXRGaXJzdENoZWNrKGludCBpUGFnZSk7CiAKICAgICBDUERGX1BhcnNlciAgICAgICAgICAgICAgICAgICAgICAgICBtX3BhcnNlcjsKQEAgLTI3NzksNyArMjc3OSw3IEBACiAKICAgICBDUERGX09iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAqbV9wVHJhaWxlcjsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkRvY0F2YWlsOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkRvY0F2YWlsOwogCiAgICAgRlhfRklMRVNJWkUgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0hlYWRlck9mZnNldDsKIApAQCAtMjgyMywzMSArMjgyMywzMSBAQAogCiAgICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9QYWdlc09iak51bTsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkxpbmVhcml6ZWQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTGluZWFyaXplZDsKIAogICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdGaXJzdFBhZ2VObzsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkxpbmVhcmVkRGF0YU9LOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkxpbmVhcmVkRGF0YU9LOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTWFpblhSZWZMb2FkVHJpZWQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTWFpblhSZWZMb2FkVHJpZWQ7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JNYWluWFJlZkxvYWRlZE9LOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYk1haW5YUmVmTG9hZGVkT0s7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JQYWdlc1RyZWVMb2FkOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYlBhZ2VzVHJlZUxvYWQ7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JQYWdlc0xvYWQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iUGFnZXNMb2FkOwogCiAgICAgQ1BERl9QYXJzZXIgKiAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudFBhcnNlcjsKIAogICAgIEZYX0ZJTEVTSVpFICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdDdXJyZW50WFJlZlN0ZWFtOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iQW5ub3RzTG9hZDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JBbm5vdHNMb2FkOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iSGF2ZUFjcm9Gb3JtOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkhhdmVBY3JvRm9ybTsKIAogICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdBY3JvRm9ybU9iak51bTsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkFjcm9Gb3JtTG9hZDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JBY3JvRm9ybUxvYWQ7CiAKICAgICBDUERGX09iamVjdAkqICAgICAgICAgICAgICAgICAgICAgICBtX3BBY3JvRm9ybTsKIApAQCAtMjg1NywxMSArMjg1NywxMSBAQAogCiAgICAgQ1BERl9PYmplY3QgKiAgICAgICAgICAgICAgICAgICAgICAgbV9wUGFnZVJlc291cmNlOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2U7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2U7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JQYWdlTG9hZGVkT0s7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iUGFnZUxvYWRlZE9LOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTGluZWFyaXplZEZvcm1QYXJhbUxvYWQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTGluZWFyaXplZEZvcm1QYXJhbUxvYWQ7CiAKICAgICBDRlhfUHRyQXJyYXkgICAgICAgICAgICAgICAgICAgICAgICBtX1BhZ2VzQXJyYXk7CiAKQEAgLTI4NjksOSArMjg2OSw5IEBACiAKICAgICBGWF9GSUxFU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3UHJldlhSZWZPZmZzZXQ7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JUb3RhbExvYWRQYWdlVHJlZTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JUb3RhbExvYWRQYWdlVHJlZTsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkN1clBhZ2VEaWN0TG9hZE9LOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkN1clBhZ2VEaWN0TG9hZE9LOwogCiAgICAgQ1BERl9QYWdlTm9kZSAgICAgICAgICAgICAgICAgICAgICAgbV9wYWdlTm9kZXM7CiAKQEAgLTI5MTYsMTkgKzI5MTYsMTkgQEAKICAgICBtX2R3RW5jcnlwdE9iak51bSA9IDA7CiAgICAgbV9kd1ByZXZYUmVmT2Zmc2V0ID0gMDsKICAgICBtX2R3TGFzdFhSZWZPZmZzZXQgPSAwOwotICAgIG1fYkRvY0F2YWlsID0gRkFMU0U7Ci0gICAgbV9iTWFpblhSZWZMb2FkVHJpZWQgPSBGQUxTRTsKLSAgICBtX2JEb2NBdmFpbCA9IEZBTFNFOwotICAgIG1fYkxpbmVhcml6ZWQgPSBGQUxTRTsKLSAgICBtX2JQYWdlc0xvYWQgPSBGQUxTRTsKLSAgICBtX2JQYWdlc1RyZWVMb2FkID0gRkFMU0U7Ci0gICAgbV9iTWFpblhSZWZMb2FkZWRPSyA9IEZBTFNFOwotICAgIG1fYkFubm90c0xvYWQgPSBGQUxTRTsKLSAgICBtX2JIYXZlQWNyb0Zvcm0gPSBGQUxTRTsKLSAgICBtX2JBY3JvRm9ybUxvYWQgPSBGQUxTRTsKLSAgICBtX2JQYWdlTG9hZGVkT0sgPSBGQUxTRTsKLSAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IEZBTFNFOwotICAgIG1fYkxpbmVhcml6ZWRGb3JtUGFyYW1Mb2FkID0gRkFMU0U7CisgICAgbV9iRG9jQXZhaWwgPSBmYWxzZTsKKyAgICBtX2JNYWluWFJlZkxvYWRUcmllZCA9IGZhbHNlOworICAgIG1fYkRvY0F2YWlsID0gZmFsc2U7CisgICAgbV9iTGluZWFyaXplZCA9IGZhbHNlOworICAgIG1fYlBhZ2VzTG9hZCA9IGZhbHNlOworICAgIG1fYlBhZ2VzVHJlZUxvYWQgPSBmYWxzZTsKKyAgICBtX2JNYWluWFJlZkxvYWRlZE9LID0gZmFsc2U7CisgICAgbV9iQW5ub3RzTG9hZCA9IGZhbHNlOworICAgIG1fYkhhdmVBY3JvRm9ybSA9IGZhbHNlOworICAgIG1fYkFjcm9Gb3JtTG9hZCA9IGZhbHNlOworICAgIG1fYlBhZ2VMb2FkZWRPSyA9IGZhbHNlOworICAgIG1fYk5lZWREb3duTG9hZFJlc291cmNlID0gZmFsc2U7CisgICAgbV9iTGluZWFyaXplZEZvcm1QYXJhbUxvYWQgPSBmYWxzZTsKICAgICBtX3BMaW5lYXJpemVkID0gTlVMTDsKICAgICBtX3BSb290ID0gTlVMTDsKICAgICBtX3BUcmFpbGVyID0gTlVMTDsKQEAgLTI5MzgsMTAgKzI5MzgsMTAgQEAKICAgICBtX3BQYWdlUmVzb3VyY2UgPSBOVUxMOwogICAgIG1fcGFnZU1hcENoZWNrU3RhdGUgPSBOVUxMOwogICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9IRUFERVI7Ci0gICAgbV9wYXJzZXIubV9iT3duRmlsZVJlYWQgPSBGQUxTRTsKLSAgICBtX2JUb3RhbExvYWRQYWdlVHJlZSA9IEZBTFNFOwotICAgIG1fYkN1clBhZ2VEaWN0TG9hZE9LID0gRkFMU0U7Ci0gICAgbV9iTGluZWFyZWREYXRhT0sgPSBGQUxTRTsKKyAgICBtX3BhcnNlci5tX2JPd25GaWxlUmVhZCA9IGZhbHNlOworICAgIG1fYlRvdGFsTG9hZFBhZ2VUcmVlID0gZmFsc2U7CisgICAgbV9iQ3VyUGFnZURpY3RMb2FkT0sgPSBmYWxzZTsKKyAgICBtX2JMaW5lYXJlZERhdGFPSyA9IGZhbHNlOwogICAgIG1fcGFnZXNMb2FkU3RhdGUgPSBOVUxMOwogfQogQ1BERl9EYXRhQXZhaWw6On5DUERGX0RhdGFBdmFpbCgpCkBAIC0yOTk1LDEwICsyOTk1LDEwIEBACiAgICAgfQogICAgIHJldHVybiAwOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6SXNPYmplY3RzQXZhaWwoQ0ZYX1B0ckFycmF5JiBvYmpfYXJyYXksIEZYX0JPT0wgYlBhcnNlUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cywgQ0ZYX1B0ckFycmF5ICZyZXRfYXJyYXkpCitib29sIENQREZfRGF0YUF2YWlsOjpJc09iamVjdHNBdmFpbChDRlhfUHRyQXJyYXkmIG9ial9hcnJheSwgYm9vbCBiUGFyc2VQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLCBDRlhfUHRyQXJyYXkgJnJldF9hcnJheSkKIHsKICAgICBpZiAoIW9ial9hcnJheS5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBGWF9EV09SRCBjb3VudCA9IDA7CiAgICAgQ0ZYX1B0ckFycmF5IG5ld19vYmpfYXJyYXk7CkBAIC0zMDg4LDQyICszMDg4LDQyIEBACiAgICAgICAgICAgICAgICAgcmV0X2FycmF5LkFkZChwT2JqKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgb2JqX2FycmF5LlJlbW92ZUFsbCgpOwogICAgIG9ial9hcnJheS5BcHBlbmQobmV3X29ial9hcnJheSk7Ci0gICAgcmV0dXJuIElzT2JqZWN0c0F2YWlsKG9ial9hcnJheSwgRkFMU0UsIHBIaW50cywgcmV0X2FycmF5KTsKKyAgICByZXR1cm4gSXNPYmplY3RzQXZhaWwob2JqX2FycmF5LCBmYWxzZSwgcEhpbnRzLCByZXRfYXJyYXkpOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6SXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6SXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewogICAgIGlmICghbV9kd0ZpbGVMZW4gJiYgbV9wRmlsZVJlYWQpIHsKICAgICAgICAgbV9kd0ZpbGVMZW4gPSAoRlhfRFdPUkQpbV9wRmlsZVJlYWQtPkdldFNpemUoKTsKICAgICAgICAgaWYgKCFtX2R3RmlsZUxlbikgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICB3aGlsZSAoIW1fYkRvY0F2YWlsKSB7CiAgICAgICAgIGlmICghQ2hlY2tEb2NTdGF0dXMocEhpbnRzKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tBY3JvRm9ybVN1Yk9iamVjdChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tBY3JvRm9ybVN1Yk9iamVjdChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewogICAgIGlmICghbV9vYmpzX2FycmF5LkdldFNpemUoKSkgewogICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgICAgIG1fb2JqbnVtX2FycmF5LlJlbW92ZUFsbCgpOwogICAgICAgICBDRlhfUHRyQXJyYXkgb2JqX2FycmF5OwogICAgICAgICBvYmpfYXJyYXkuQXBwZW5kKG1fYXJyYXlBY3JvZm9ybXMpOwotICAgICAgICBGWF9CT09MIGJSZXQgPSBJc09iamVjdHNBdmFpbChvYmpfYXJyYXksIEZBTFNFLCBwSGludHMsIG1fb2Jqc19hcnJheSk7CisgICAgICAgIGJvb2wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG9ial9hcnJheSwgZmFsc2UsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKICAgICAgICAgaWYgKGJSZXQpIHsKICAgICAgICAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYlJldDsKICAgICB9CiAgICAgQ0ZYX1B0ckFycmF5IG5ld19vYmpzX2FycmF5OwotICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgRkFMU0UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOworICAgIGJvb2wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgZmFsc2UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOwogICAgIGlmIChiUmV0KSB7CiAgICAgICAgIGludDMyX3QgaVNpemUgPSBtX2FycmF5QWNyb2Zvcm1zLkdldFNpemUoKTsKICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7ICsraSkgewpAQCAtMzEzNiwyNiArMzEzNiwyNiBAQAogICAgIH0KICAgICByZXR1cm4gYlJldDsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQWNyb0Zvcm0oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQWNyb0Zvcm0oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKLSAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOworICAgIGJvb2wgYkV4aXN0ID0gZmFsc2U7CiAgICAgbV9wQWNyb0Zvcm0gPSBHZXRPYmplY3QobV9kd0Fjcm9Gb3JtT2JqTnVtLCBwSGludHMsICZiRXhpc3QpOwogICAgIGlmICghYkV4aXN0KSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFVFJFRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoIW1fcEFjcm9Gb3JtKSB7CiAgICAgICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0VSUk9SKSB7CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX2FycmF5QWNyb2Zvcm1zLkFkZChtX3BBY3JvRm9ybSk7CiAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tEb2NTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrRG9jU3RhdHVzKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpCiB7CiAgICAgc3dpdGNoIChtX2RvY1N0YXR1cykgewogICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfSEVBREVSOgpAQCAtMzE5NSwxNyArMzE5NSwxNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBDaGVja1BhZ2UocEhpbnRzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFX0xBVEVSTE9BRDsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9FUlJPUjoKICAgICAgICAgICAgIHJldHVybiBMb2FkQWxsRmlsZShwSGludHMpOwogICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfUEFHRV9MQVRFUkxPQUQ6CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRTsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIG1fYkRvY0F2YWlsID0gVFJVRTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgbV9iRG9jQXZhaWwgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogfQotRlhfQk9PTAlDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlU3RhdHVzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitib29sCUNQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBzd2l0Y2ggKG1fZG9jU3RhdHVzKSB7CiAgICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9QQUdFVFJFRToKQEAgLTMyMTUsMzYgKzMyMTUsMzYgQEAKICAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0VSUk9SOgogICAgICAgICAgICAgcmV0dXJuIExvYWRBbGxGaWxlKHBIaW50cyk7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBtX2JQYWdlc1RyZWVMb2FkID0gVFJVRTsKLSAgICAgICAgICAgIG1fYlBhZ2VzTG9hZCA9IFRSVUU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIG1fYlBhZ2VzVHJlZUxvYWQgPSB0cnVlOworICAgICAgICAgICAgbV9iUGFnZXNMb2FkID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkxvYWRBbGxGaWxlKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpMb2FkQWxsRmlsZShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewogICAgIGlmIChtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKDAsIChGWF9EV09SRCltX2R3RmlsZUxlbikpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0RPTkU7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcEhpbnRzLT5BZGRTZWdtZW50KDAsIChGWF9EV09SRCltX2R3RmlsZUxlbik7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkxvYWRBbGxYcmVmKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpMb2FkQWxsWHJlZihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewogICAgIG1fcGFyc2VyLm1fU3ludGF4LkluaXRQYXJzZXIobV9wRmlsZVJlYWQsIChGWF9EV09SRCltX2R3SGVhZGVyT2Zmc2V0KTsKLSAgICBtX3BhcnNlci5tX2JPd25GaWxlUmVhZCA9IEZBTFNFOworICAgIG1fcGFyc2VyLm1fYk93bkZpbGVSZWFkID0gZmFsc2U7CiAgICAgaWYgKCFtX3BhcnNlci5Mb2FkQWxsQ3Jvc3NSZWZWNChtX2R3TGFzdFhSZWZPZmZzZXQpICYmICFtX3BhcnNlci5Mb2FkQWxsQ3Jvc3NSZWZWNShtX2R3TGFzdFhSZWZPZmZzZXQpKSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYU1lTX3Fzb3J0KG1fcGFyc2VyLm1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9wYXJzZXIubV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLCBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKICAgICBtX2R3Um9vdE9iak51bSA9IG1fcGFyc2VyLkdldFJvb3RPYmpOdW0oKTsKICAgICBtX2R3SW5mb09iak51bSA9IG1fcGFyc2VyLkdldEluZm9PYmpOdW0oKTsKICAgICBtX3BDdXJyZW50UGFyc2VyID0gJm1fcGFyc2VyOwogICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9ST09UOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotQ1BERl9PYmplY3QqIENQREZfRGF0YUF2YWlsOjpHZXRPYmplY3QoRlhfRFdPUkQgb2JqbnVtLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLCBGWF9CT09MICpwRXhpc3RJbkZpbGUpCitDUERGX09iamVjdCogQ1BERl9EYXRhQXZhaWw6OkdldE9iamVjdChGWF9EV09SRCBvYmpudW0sIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMsIGJvb2wgKnBFeGlzdEluRmlsZSkKIHsKICAgICBDUERGX09iamVjdCAqcFJldCAgICAgICAgID0gTlVMTDsKICAgICBGWF9EV09SRCAgICBvcmlnaW5hbF9zaXplID0gMDsKQEAgLTMyNTIsNyArMzI1Miw3IEBACiAgICAgQ1BERl9QYXJzZXIgKnBQYXJzZXIgICAgICA9IE5VTEw7CiAKICAgICBpZiAocEV4aXN0SW5GaWxlKSB7Ci0gICAgICAgICpwRXhpc3RJbkZpbGUgPSBUUlVFOworICAgICAgICAqcEV4aXN0SW5GaWxlID0gdHJ1ZTsKICAgICB9CiAKICAgICBpZiAobV9wRG9jdW1lbnQgPT0gTlVMTCkgewpAQCAtMzI2Nyw3ICszMjY3LDcgQEAKICAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPEZYX0RXT1JEPiBzaXplID0gb3JpZ2luYWxfc2l6ZTsKICAgICBpZiAoc2l6ZS5WYWx1ZU9yRGVmYXVsdCgwKSA9PSAwIHx8IG9mZnNldCA8IDAgfHwgb2Zmc2V0ID49IG1fZHdGaWxlTGVuKSB7CiAgICAgICAgIGlmIChwRXhpc3RJbkZpbGUpCi0gICAgICAgICAgICpwRXhpc3RJbkZpbGUgPSBGQUxTRTsKKyAgICAgICAgICAgKnBFeGlzdEluRmlsZSA9IGZhbHNlOwogCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTMyOTgsMTUgKzMyOTgsMTUgQEAKICAgICB9CiAKICAgICBpZiAoIXBSZXQgJiYgcEV4aXN0SW5GaWxlKSB7Ci0gICAgICAgICpwRXhpc3RJbkZpbGUgPSBGQUxTRTsKKyAgICAgICAgKnBFeGlzdEluRmlsZSA9IGZhbHNlOwogICAgIH0KIAogICAgIHJldHVybiBwUmV0OwogfQogCi1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0luZm8oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrSW5mbyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewotICAgIEZYX0JPT0wgYkV4aXN0ID0gRkFMU0U7CisgICAgYm9vbCBiRXhpc3QgPSBmYWxzZTsKICAgICBDUERGX09iamVjdCAqcEluZm8gPSBHZXRPYmplY3QobV9kd0luZm9PYmpOdW0sIHBIaW50cywgJmJFeGlzdCk7CiAgICAgaWYgKCFiRXhpc3QpIHsKICAgICAgICAgaWYgKG1fYkhhdmVBY3JvRm9ybSkgewpAQCAtMzMxNCwxNyArMzMxNCwxNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKCFwSW5mbykgewogICAgICAgICBpZiAobV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9FUlJPUikgewogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9Qb3MgPT0gbV9kd0ZpbGVMZW4pIHsKICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBJbmZvKSB7CiAgICAgICAgIHBJbmZvLT5SZWxlYXNlKCk7CkBAIC0zMzM0LDM3ICszMzM0LDM3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUm9vdChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tSb290KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7Ci0gICAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKKyAgICBib29sIGJFeGlzdCA9IGZhbHNlOwogICAgIG1fcFJvb3QgPSBHZXRPYmplY3QobV9kd1Jvb3RPYmpOdW0sIHBIaW50cywgJmJFeGlzdCk7CiAgICAgaWYgKCFiRXhpc3QpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmICghbV9wUm9vdCkgewogICAgICAgICBpZiAobV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9FUlJPUikgewogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcFJvb3QtPkdldERpY3QoKTsKICAgICBpZiAoIXBEaWN0KSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0gKENQREZfUmVmZXJlbmNlKilwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiUGFnZXMiKSk7CiAgICAgaWYgKHBSZWYgPT0gTlVMTCB8fCBwUmVmLT5HZXRUeXBlKCkgIT0gUERGT0JKX1JFRkVSRU5DRSkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX1BhZ2VzT2JqTnVtID0gcFJlZi0+R2V0UmVmT2JqTnVtKCk7CiAgICAgQ1BERl9SZWZlcmVuY2UqIHBBY3JvRm9ybVJlZiA9IChDUERGX1JlZmVyZW5jZSopbV9wUm9vdC0+R2V0RGljdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJBY3JvRm9ybSIpKTsKICAgICBpZiAocEFjcm9Gb3JtUmVmICYmIHBBY3JvRm9ybVJlZi0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgbV9iSGF2ZUFjcm9Gb3JtID0gVFJVRTsKKyAgICAgICAgbV9iSGF2ZUFjcm9Gb3JtID0gdHJ1ZTsKICAgICAgICAgbV9kd0Fjcm9Gb3JtT2JqTnVtID0gcEFjcm9Gb3JtUmVmLT5HZXRSZWZPYmpOdW0oKTsKICAgICB9CiAgICAgaWYgKG1fZHdJbmZvT2JqTnVtKSB7CkBAIC0zMzc2LDIyICszMzc2LDIyIEBACiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpQcmVwYXJlUGFnZUl0ZW0oKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6UHJlcGFyZVBhZ2VJdGVtKCkKIHsKICAgICBDUERGX0RpY3Rpb25hcnkgKnBSb290ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKICAgICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IHBSb290ID8gKENQREZfUmVmZXJlbmNlKilwUm9vdC0+R2V0RWxlbWVudChGWF9CU1RSQygiUGFnZXMiKSkgOiBOVUxMOwogICAgIGlmIChwUmVmID09IE5VTEwgfHwgcFJlZi0+R2V0VHlwZSgpICE9IFBERk9CSl9SRUZFUkVOQ0UpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9QYWdlc09iak51bSA9IHBSZWYtPkdldFJlZk9iak51bSgpOwogICAgIG1fcEN1cnJlbnRQYXJzZXIgPSAoQ1BERl9QYXJzZXIgKiltX3BEb2N1bWVudC0+R2V0UGFyc2VyKCk7CiAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6SXNGaXJzdENoZWNrKGludCBpUGFnZSkKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OklzRmlyc3RDaGVjayhpbnQgaVBhZ2UpCiB7CiAgICAgaWYgKE5VTEwgPT0gbV9wYWdlTWFwQ2hlY2tTdGF0ZSkgewogICAgICAgICBtX3BhZ2VNYXBDaGVja1N0YXRlID0gbmV3IENGWF9DTWFwRFdvcmRUb0RXb3JkKCk7CkBAIC0zMzk5LDEzICszMzk5LDEzIEBACiAgICAgRlhfRFdPUkQgZHdWYWx1ZSA9IDA7CiAgICAgaWYgKCFtX3BhZ2VNYXBDaGVja1N0YXRlLT5Mb29rdXAoaVBhZ2UsIGR3VmFsdWUpKSB7CiAgICAgICAgIG1fcGFnZU1hcENoZWNrU3RhdGUtPlNldEF0KGlQYWdlLCAxKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoZHdWYWx1ZSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BhZ2VNYXBDaGVja1N0YXRlLT5TZXRBdChpUGFnZSwgMSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENQREZfRGF0YUF2YWlsOjpSZXNldEZpcnN0Q2hlY2soaW50IGlQYWdlKQogewpAQCAtMzQxOCwxMyArMzQxOCwxMyBAQAogICAgIH0KICAgICBtX3BhZ2VNYXBDaGVja1N0YXRlLT5TZXRBdChpUGFnZSwgMCk7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2UoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewogICAgIEZYX0RXT1JEIGlQYWdlT2JqcyA9IG1fUGFnZU9iakxpc3QuR2V0U2l6ZSgpOwogICAgIENGWF9EV29yZEFycmF5IFVuYXZhaWxPYmpMaXN0OwogICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBpUGFnZU9ianM7ICsraSkgewogICAgICAgICBGWF9EV09SRCBkd1BhZ2VPYmpOdW0gPSBtX1BhZ2VPYmpMaXN0LkdldEF0KGkpOwotICAgICAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOworICAgICAgICBib29sIGJFeGlzdCA9IGZhbHNlOwogICAgICAgICBDUERGX09iamVjdCAqcE9iaiA9IEdldE9iamVjdChkd1BhZ2VPYmpOdW0sIHBIaW50cywgJmJFeGlzdCk7CiAgICAgICAgIGlmICghcE9iaikgewogICAgICAgICAgICAgaWYgKGJFeGlzdCkgewpAQCAtMzQ1OSw3ICszNDU5LDcgQEAKICAgICBtX1BhZ2VPYmpMaXN0LlJlbW92ZUFsbCgpOwogICAgIGlmIChVbmF2YWlsT2JqTGlzdC5HZXRTaXplKCkpIHsKICAgICAgICAgbV9QYWdlT2JqTGlzdC5BcHBlbmQoVW5hdmFpbE9iakxpc3QpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfRFdPUkQgaVBhZ2VzID0gbV9QYWdlc0FycmF5LkdldFNpemUoKTsKICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgaVBhZ2VzOyBpKyspIHsKQEAgLTM0NzUsNyArMzQ3NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtX1BhZ2VzQXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7CiAgICAgfQpAQCAtMzQ4MywxOCArMzQ4MywxOCBAQAogICAgIGlmICghbV9QYWdlT2JqTGlzdC5HZXRTaXplKCkpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0RPTkU7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6R2V0UGFnZUtpZHMoQ1BERl9QYXJzZXIgKnBQYXJzZXIsIENQREZfT2JqZWN0ICpwUGFnZXMpCitib29sIENQREZfRGF0YUF2YWlsOjpHZXRQYWdlS2lkcyhDUERGX1BhcnNlciAqcFBhcnNlciwgQ1BERl9PYmplY3QgKnBQYWdlcykKIHsKICAgICBpZiAoIXBQYXJzZXIpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBQYWdlcy0+R2V0RGljdCgpOwogICAgIENQREZfT2JqZWN0ICpwS2lkcyA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIktpZHMiKSkgOiBOVUxMOwogICAgIGlmICghcEtpZHMpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBzd2l0Y2ggKHBLaWRzLT5HZXRUeXBlKCkpIHsKICAgICAgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7CkBAIC0zNTE0LDM1ICszNTE0LDM1IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7Ci0gICAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKKyAgICBib29sIGJFeGlzdCA9IGZhbHNlOwogICAgIENQREZfT2JqZWN0ICpwUGFnZXMgPSBHZXRPYmplY3QobV9QYWdlc09iak51bSwgcEhpbnRzLCAmYkV4aXN0KTsKICAgICBpZiAoIWJFeGlzdCkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKCFwUGFnZXMpIHsKICAgICAgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghR2V0UGFnZUtpZHMobV9wQ3VycmVudFBhcnNlciwgcFBhZ2VzKSkgewogICAgICAgICBwUGFnZXMtPlJlbGVhc2UoKTsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7CiAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0U7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0hlYWRlcihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tIZWFkZXIoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBGWF9EV09SRCByZXFfc2l6ZSA9IDEwMjQ7CiAgICAgaWYgKChGWF9GSUxFU0laRSlyZXFfc2l6ZSA+IG1fZHdGaWxlTGVuKSB7CkBAIC0zNTU1LDM0ICszNTU1LDM0IEBACiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRklSU1RQQUdFOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VORDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHBIaW50cy0+QWRkU2VnbWVudCgwLCByZXFfc2l6ZSk7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrRmlyc3RQYWdlKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0ZpcnN0UGFnZShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKQogewogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BMaW5lYXJpemVkLT5HZXREaWN0KCk7CiAgICAgQ1BERl9PYmplY3QgKnBFbmRPZmZTZXQgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJFIikpIDogTlVMTDsKICAgICBpZiAoIXBFbmRPZmZTZXQpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9PYmplY3QgKnBYUmVmT2Zmc2V0ID0gcERpY3QgPyBwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiVCIpKSA6IE5VTEw7CiAgICAgaWYgKCFwWFJlZk9mZnNldCkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX09iamVjdCAqcEZpbGVMZW4gPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJMIikpIDogTlVMTDsKICAgICBpZiAoIXBGaWxlTGVuKSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIEZYX0JPT0wgYk5lZWREb3duTG9hZCA9IEZBTFNFOworICAgIGJvb2wgYk5lZWREb3duTG9hZCA9IGZhbHNlOwogICAgIGlmIChwRW5kT2ZmU2V0LT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgewogICAgICAgICBGWF9EV09SRCBkd0VuZCA9IHBFbmRPZmZTZXQtPkdldEludGVnZXIoKTsKICAgICAgICAgZHdFbmQgKz0gNTEyOwpAQCAtMzU5Myw3ICszNTkzLDcgQEAKICAgICAgICAgaW50MzJfdCBpU2l6ZSA9IGR3RW5kID4gMTAyNCA/IGR3RW5kIC0gMTAyNCA6IDA7CiAgICAgICAgIGlmICghbV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbChpU3RhcnRQb3MsIGlTaXplKSkgewogICAgICAgICAgICAgcEhpbnRzLT5BZGRTZWdtZW50KGlTdGFydFBvcywgaVNpemUpOwotICAgICAgICAgICAgYk5lZWREb3duTG9hZCA9IFRSVUU7CisgICAgICAgICAgICBiTmVlZERvd25Mb2FkID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICBtX2R3TGFzdFhSZWZPZmZzZXQgPSAwOwpAQCAtMzYxOSwxNiArMzYxOSwxNiBAQAogICAgIH0KICAgICBpZiAoIWJOZWVkRG93bkxvYWQgJiYgbV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9GSVJTVFBBR0VfUFJFUEFSRSkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRklSU1RQQUdFX1BSRVBBUkU7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIENQREZfT2JqZWN0CSogQ1BERl9EYXRhQXZhaWw6OlBhcnNlSW5kaXJlY3RPYmplY3RBdChGWF9GSUxFU0laRSBwb3MsIEZYX0RXT1JEIG9iam51bSkKIHsKICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fc3ludGF4UGFyc2VyLlNhdmVQb3MoKTsKICAgICBtX3N5bnRheFBhcnNlci5SZXN0b3JlUG9zKHBvcyk7Ci0gICAgRlhfQk9PTCBiSXNOdW1iZXI7CisgICAgYm9vbCBiSXNOdW1iZXI7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IG1fc3ludGF4UGFyc2VyLkdldE5leHRXb3JkKGJJc051bWJlcik7CiAgICAgaWYgKCFiSXNOdW1iZXIpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zNjcwLDIxICszNjcwLDIxIEBACiAgICAgfQogICAgIHJldHVybiBQREZfTk9UX0xJTkVBUklaRUQ7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpJc0xpbmVhcml6ZWRGaWxlKHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd0xlbikKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OklzTGluZWFyaXplZEZpbGUodWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3TGVuKQogewotICAgIENGWF9TbWFydFBvaW50ZXI8SUZYX0ZpbGVTdHJlYW0+IGZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKHBEYXRhLCAoc2l6ZV90KWR3TGVuLCBGQUxTRSkpOworICAgIENGWF9TbWFydFBvaW50ZXI8SUZYX0ZpbGVTdHJlYW0+IGZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKHBEYXRhLCAoc2l6ZV90KWR3TGVuLCBmYWxzZSkpOwogICAgIGludDMyX3Qgb2Zmc2V0ID0gR2V0SGVhZGVyT2Zmc2V0KGZpbGUuR2V0KCkpOwogICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9kd0hlYWRlck9mZnNldCA9IG9mZnNldDsKICAgICBtX3N5bnRheFBhcnNlci5Jbml0UGFyc2VyKGZpbGUuR2V0KCksIG9mZnNldCk7CiAgICAgbV9zeW50YXhQYXJzZXIuUmVzdG9yZVBvcyhtX3N5bnRheFBhcnNlci5tX0hlYWRlck9mZnNldCArIDkpOwotICAgIEZYX0JPT0wgYk51bWJlciA9IEZBTFNFOworICAgIGJvb2wgYk51bWJlciA9IGZhbHNlOwogICAgIENGWF9CeXRlU3RyaW5nIHdvcmRPYmpOdW0gPSBtX3N5bnRheFBhcnNlci5HZXROZXh0V29yZChiTnVtYmVyKTsKICAgICBpZiAoIWJOdW1iZXIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX0RXT1JEIG9iam51bSA9IEZYU1lTX2F0b2kod29yZE9iak51bSk7CiAgICAgaWYgKG1fcExpbmVhcml6ZWQpIHsKQEAgLTM2OTMsNTggKzM2OTMsNTggQEAKICAgICB9CiAgICAgbV9wTGluZWFyaXplZCA9IFBhcnNlSW5kaXJlY3RPYmplY3RBdChtX3N5bnRheFBhcnNlci5tX0hlYWRlck9mZnNldCArIDksIG9iam51bSk7CiAgICAgaWYgKCFtX3BMaW5lYXJpemVkKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9wTGluZWFyaXplZC0+R2V0RGljdCgpICYmIG1fcExpbmVhcml6ZWQtPkdldERpY3QoKS0+R2V0RWxlbWVudChGWF9CU1RSQygiTGluZWFyaXplZCIpKSkgewogICAgICAgICBDUERGX09iamVjdCAqcExlbiA9IG1fcExpbmVhcml6ZWQtPkdldERpY3QoKS0+R2V0RWxlbWVudChGWF9CU1RSQygiTCIpKTsKICAgICAgICAgaWYgKCFwTGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChGWF9GSUxFU0laRSlwTGVuLT5HZXRJbnRlZ2VyKCkgIT0gbV9wRmlsZVJlYWQtPkdldFNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIG1fYkxpbmVhcml6ZWQgPSBUUlVFOworICAgICAgICBtX2JMaW5lYXJpemVkID0gdHJ1ZTsKICAgICAgICAgQ1BERl9PYmplY3QgKnBObyA9IG1fcExpbmVhcml6ZWQtPkdldERpY3QoKS0+R2V0RWxlbWVudChGWF9CU1RSQygiUCIpKTsKICAgICAgICAgaWYgKHBObyAmJiBwTm8tPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7CiAgICAgICAgICAgICBtX2R3Rmlyc3RQYWdlTm8gPSBwTm8tPkdldEludGVnZXIoKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0VuZChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tFbmQoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBGWF9EV09SRCByZXFfcG9zID0gKEZYX0RXT1JEKShtX2R3RmlsZUxlbiA+IDEwMjQgPyBtX2R3RmlsZUxlbiAtIDEwMjQgOiAwKTsKICAgICBGWF9EV09SRCBkd1NpemUgPSAoRlhfRFdPUkQpKG1fZHdGaWxlTGVuIC0gcmVxX3Bvcyk7CiAgICAgaWYgKG1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwocmVxX3BvcywgZHdTaXplKSkgewogICAgICAgICB1aW50OF90IGJ1ZmZlclsxMDI0XTsKICAgICAgICAgbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhidWZmZXIsIHJlcV9wb3MsIGR3U2l6ZSk7Ci0gICAgICAgIENGWF9TbWFydFBvaW50ZXI8SUZYX0ZpbGVTdHJlYW0+IGZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKGJ1ZmZlciwgKHNpemVfdClkd1NpemUsIEZBTFNFKSk7CisgICAgICAgIENGWF9TbWFydFBvaW50ZXI8SUZYX0ZpbGVTdHJlYW0+IGZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKGJ1ZmZlciwgKHNpemVfdClkd1NpemUsIGZhbHNlKSk7CiAgICAgICAgIG1fc3ludGF4UGFyc2VyLkluaXRQYXJzZXIoZmlsZS5HZXQoKSwgMCk7CiAgICAgICAgIG1fc3ludGF4UGFyc2VyLlJlc3RvcmVQb3MoZHdTaXplIC0gMSk7Ci0gICAgICAgIGlmIChtX3N5bnRheFBhcnNlci5TZWFyY2hXb3JkKEZYX0JTVFJDKCJzdGFydHhyZWYiKSwgVFJVRSwgRkFMU0UsIGR3U2l6ZSkpIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYk51bWJlcjsKKyAgICAgICAgaWYgKG1fc3ludGF4UGFyc2VyLlNlYXJjaFdvcmQoRlhfQlNUUkMoInN0YXJ0eHJlZiIpLCB0cnVlLCBmYWxzZSwgZHdTaXplKSkgeworICAgICAgICAgICAgYm9vbCBiTnVtYmVyOwogICAgICAgICAgICAgbV9zeW50YXhQYXJzZXIuR2V0TmV4dFdvcmQoYk51bWJlcik7CiAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyB4cmVmcG9zX3N0ciA9IG1fc3ludGF4UGFyc2VyLkdldE5leHRXb3JkKGJOdW1iZXIpOwogICAgICAgICAgICAgaWYgKCFiTnVtYmVyKSB7CiAgICAgICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtX2R3WFJlZk9mZnNldCA9IChGWF9GSUxFU0laRSlGWFNZU19hdG9pNjQoeHJlZnBvc19zdHIpOwogICAgICAgICAgICAgaWYgKCFtX2R3WFJlZk9mZnNldCB8fCBtX2R3WFJlZk9mZnNldCA+IG1fZHdGaWxlTGVuKSB7CiAgICAgICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbV9kd0xhc3RYUmVmT2Zmc2V0ID0gbV9kd1hSZWZPZmZzZXQ7CiAgICAgICAgICAgICBTZXRTdGFydE9mZnNldChtX2R3WFJlZk9mZnNldCk7CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfQ1JPU1NSRUY7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBwSGludHMtPkFkZFNlZ21lbnQocmVxX3BvcywgZHdTaXplKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogaW50MzJfdCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tDcm9zc1JlZlN0cmVhbShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLCBGWF9GSUxFU0laRSAmeHJlZl9vZmZzZXQpCiB7CkBAIC0zNzU1LDkgKzM3NTUsOSBAQAogICAgICAgICBDRlhfQmluYXJ5QnVmIGJ1ZihpU2l6ZSk7CiAgICAgICAgIHVpbnQ4X3QqIHBCdWYgPSBidWYuR2V0QnVmZmVyKCk7CiAgICAgICAgIG1fcEZpbGVSZWFkLT5SZWFkQmxvY2socEJ1ZiwgbV9kd0N1cnJlbnRYUmVmU3RlYW0sIGlTaXplKTsKLSAgICAgICAgQ0ZYX1NtYXJ0UG9pbnRlcjxJRlhfRmlsZVN0cmVhbT4gZmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0ocEJ1ZiwgKHNpemVfdClpU2l6ZSwgRkFMU0UpKTsKKyAgICAgICAgQ0ZYX1NtYXJ0UG9pbnRlcjxJRlhfRmlsZVN0cmVhbT4gZmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0ocEJ1ZiwgKHNpemVfdClpU2l6ZSwgZmFsc2UpKTsKICAgICAgICAgbV9wYXJzZXIubV9TeW50YXguSW5pdFBhcnNlcihmaWxlLkdldCgpLCAwKTsKLSAgICAgICAgRlhfQk9PTCBiTnVtYmVyID0gRkFMU0U7CisgICAgICAgIGJvb2wgYk51bWJlciA9IGZhbHNlOwogICAgICAgICBDRlhfQnl0ZVN0cmluZyBvYmpudW0gPSBtX3BhcnNlci5tX1N5bnRheC5HZXROZXh0V29yZChiTnVtYmVyKTsKICAgICAgICAgaWYgKCFiTnVtYmVyKSB7CiAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC0zNzg5LDE4ICszNzg5LDE4IEBACiAgICAgbV9Qb3MgPSBkd09mZnNldDsKIH0KICNkZWZpbmUgTUFYX1dPUkRfQlVGRkVSIDI1NgotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6R2V0TmV4dFRva2VuKENGWF9CeXRlU3RyaW5nICZ0b2tlbikKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkdldE5leHRUb2tlbihDRlhfQnl0ZVN0cmluZyAmdG9rZW4pCiB7CiAgICAgbV9Xb3JkU2l6ZSA9IDA7CiAgICAgdWludDhfdCBjaDsKICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgdWludDhfdCB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKICAgICB3aGlsZSAoMSkgewogICAgICAgICB3aGlsZSAodHlwZSA9PSAnVycpIHsKICAgICAgICAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwogICAgICAgICB9CkBAIC0zODA5LDcgKzM4MDksNyBAQAogICAgICAgICB9CiAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXG4nKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zODIyLDE0ICszODIyLDE0IEBACiAgICAgICAgIGlmIChjaCA9PSAnLycpIHsKICAgICAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwogICAgICAgICAgICAgICAgIGlmICh0eXBlICE9ICdSJyAmJiB0eXBlICE9ICdOJykgewogICAgICAgICAgICAgICAgICAgICBtX1BvcyAtLTsKICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcmV0KG1fV29yZEJ1ZmZlciwgbV9Xb3JkU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gcmV0OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChtX1dvcmRTaXplIDwgTUFYX1dPUkRfQlVGRkVSKSB7CiAgICAgICAgICAgICAgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CkBAIC0zODM3LDcgKzM4MzcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc8JykgewogICAgICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGNoID09ICc8JykgewogICAgICAgICAgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CkBAIC0zODQ2LDcgKzM4NDYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc+JykgewogICAgICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGNoID09ICc+JykgewogICAgICAgICAgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CkBAIC0zODU2LDE0ICszODU2LDE0IEBACiAgICAgICAgIH0KICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcmV0KG1fV29yZEJ1ZmZlciwgbV9Xb3JkU2l6ZSk7CiAgICAgICAgIHRva2VuID0gcmV0OwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHdoaWxlICgxKSB7CiAgICAgICAgIGlmIChtX1dvcmRTaXplIDwgTUFYX1dPUkRfQlVGRkVSKSB7CiAgICAgICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwogICAgICAgICB9CiAgICAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CiAgICAgICAgIGlmICh0eXBlID09ICdEJyB8fCB0eXBlID09ICdXJykgewpAQCAtMzg3MywxMyArMzg3MywxMyBAQAogICAgIH0KICAgICBDRlhfQnl0ZVN0cmluZyByZXQobV9Xb3JkQnVmZmVyLCBtX1dvcmRTaXplKTsKICAgICB0b2tlbiA9IHJldDsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkdldE5leHRDaGFyKHVpbnQ4X3QgJmNoKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6R2V0TmV4dENoYXIodWludDhfdCAmY2gpCiB7CiAgICAgRlhfRklMRVNJWkUgcG9zID0gbV9Qb3M7CiAgICAgaWYgKHBvcyA+PSBtX2R3RmlsZUxlbikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fYnVmZmVyT2Zmc2V0ID49IHBvcyB8fCAoRlhfRklMRVNJWkUpKG1fYnVmZmVyT2Zmc2V0ICsgbV9idWZmZXJTaXplKSA8PSBwb3MpIHsKICAgICAgICAgRlhfRklMRVNJWkUgcmVhZF9wb3MgPSBwb3M7CkBAIC0zODkxLDE2ICszODkxLDE2IEBACiAgICAgICAgICAgICByZWFkX3BvcyA9IG1fZHdGaWxlTGVuIC0gcmVhZF9zaXplOwogICAgICAgICB9CiAgICAgICAgIGlmICghbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhtX2J1ZmZlckRhdGEsIHJlYWRfcG9zLCByZWFkX3NpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbV9idWZmZXJPZmZzZXQgPSByZWFkX3BvczsKICAgICAgICAgbV9idWZmZXJTaXplID0gcmVhZF9zaXplOwogICAgIH0KICAgICBjaCA9IG1fYnVmZmVyRGF0YVtwb3MgLSBtX2J1ZmZlck9mZnNldF07CiAgICAgbV9Qb3MgKys7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0Nyb3NzUmVmSXRlbShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tDcm9zc1JlZkl0ZW0oSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cykKIHsKICAgICBpbnQzMl90IGlTaXplID0gMDsKICAgICBDRlhfQnl0ZVN0cmluZyB0b2tlbjsKQEAgLTM5MDgsMTYgKzM5MDgsMTYgQEAKICAgICAgICAgaWYgKCFHZXROZXh0VG9rZW4odG9rZW4pKSB7CiAgICAgICAgICAgICBpU2l6ZSA9IChpbnQzMl90KShtX1BvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBtX1BvcyA6IDUxMik7CiAgICAgICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlTaXplKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAodG9rZW4gPT0gInRyYWlsZXIiKSB7CiAgICAgICAgICAgICBtX2R3VHJhaWxlck9mZnNldCA9IG1fUG9zOwogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1RSQUlMRVI7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tBbGxDcm9zc1JlZlN0cmVhbShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tBbGxDcm9zc1JlZlN0cmVhbShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKQogewogICAgIEZYX0ZJTEVTSVpFIHhyZWZfb2Zmc2V0ID0gMDsKICAgICBpbnQzMl90IG5SZXQgPSBDaGVja0Nyb3NzUmVmU3RyZWFtKHBIaW50cywgeHJlZl9vZmZzZXQpOwpAQCAtMzkyOCwyMSArMzkyOCwyMSBAQAogICAgICAgICAgICAgbV9kd0N1cnJlbnRYUmVmU3RlYW0gPSB4cmVmX29mZnNldDsKICAgICAgICAgICAgIG1fUG9zID0geHJlZl9vZmZzZXQ7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoblJldCA9PSAtMSkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0Nyb3NzUmVmKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0Nyb3NzUmVmKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgaW50MzJfdCBpU2l6ZSA9IDA7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgdG9rZW47CiAgICAgaWYgKCFHZXROZXh0VG9rZW4odG9rZW4pKSB7CiAgICAgICAgIGlTaXplID0gKGludDMyX3QpKG1fUG9zICsgNTEyID4gbV9kd0ZpbGVMZW4gPyBtX2R3RmlsZUxlbiAtIG1fUG9zIDogNTEyKTsKICAgICAgICAgcEhpbnRzLT5BZGRTZWdtZW50KG1fUG9zLCBpU2l6ZSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAodG9rZW4gPT0gInhyZWYiKSB7CiAgICAgICAgIG1fQ3Jvc3NPZmZzZXQuSW5zZXJ0QXQoMCwgbV9kd1hSZWZPZmZzZXQpOwpAQCAtMzk1MSwyOCArMzk1MSwyOCBAQAogICAgICAgICAgICAgICAgIGlTaXplID0gKGludDMyX3QpKG1fUG9zICsgNTEyID4gbV9kd0ZpbGVMZW4gPyBtX2R3RmlsZUxlbiAtIG1fUG9zIDogNTEyKTsKICAgICAgICAgICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlTaXplKTsKICAgICAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfQ1JPU1NSRUZfSVRFTTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRva2VuID09ICJ0cmFpbGVyIikgewogICAgICAgICAgICAgICAgIG1fZHdUcmFpbGVyT2Zmc2V0ID0gbV9Qb3M7CiAgICAgICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1RSQUlMRVI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrVHJhaWxlckFwcGVuZChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tUcmFpbGVyQXBwZW5kKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgaWYgKG1fUG9zIDwgbV9kd0ZpbGVMZW4pIHsKICAgICAgICAgRlhfRklMRVNJWkUgZHdBcHBlbmRQb3MgPSBtX1BvcyArIG1fc3ludGF4UGFyc2VyLlNhdmVQb3MoKTsKICAgICAgICAgaW50MzJfdCBpU2l6ZSA9IChpbnQzMl90KShkd0FwcGVuZFBvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBkd0FwcGVuZFBvcyA6IDUxMik7CiAgICAgICAgIGlmICghbV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbChkd0FwcGVuZFBvcywgaVNpemUpKSB7CiAgICAgICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQoZHdBcHBlbmRQb3MsIGlTaXplKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAobV9kd1ByZXZYUmVmT2Zmc2V0KSB7CkBAIC0zOTgxLDkgKzM5ODEsOSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMQ1JTT1NTUkVGOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrVHJhaWxlcihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tUcmFpbGVyKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgaW50MzJfdCBpVHJhaWxlclNpemUgPSAoaW50MzJfdCkobV9Qb3MgKyA1MTIgPiBtX2R3RmlsZUxlbiA/IG1fZHdGaWxlTGVuIC0gbV9Qb3MgOiA1MTIpOwogICAgIGlmIChtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKG1fUG9zLCBpVHJhaWxlclNpemUpKSB7CkBAIC0zOTkyLDIxICszOTkyLDIxIEBACiAgICAgICAgIHVpbnQ4X3QqIHBCdWYgPSBidWYuR2V0QnVmZmVyKCk7CiAgICAgICAgIGlmICghcEJ1ZikgewogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmICghbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhwQnVmLCBtX2R3VHJhaWxlck9mZnNldCwgaVNpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgQ0ZYX1NtYXJ0UG9pbnRlcjxJRlhfRmlsZVN0cmVhbT4gZmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0ocEJ1ZiwgKHNpemVfdClpU2l6ZSwgRkFMU0UpKTsKKyAgICAgICAgQ0ZYX1NtYXJ0UG9pbnRlcjxJRlhfRmlsZVN0cmVhbT4gZmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0ocEJ1ZiwgKHNpemVfdClpU2l6ZSwgZmFsc2UpKTsKICAgICAgICAgbV9zeW50YXhQYXJzZXIuSW5pdFBhcnNlcihmaWxlLkdldCgpLCAwKTsKICAgICAgICAgQ1BERl9PYmplY3QgKnBUcmFpbGVyID0gbV9zeW50YXhQYXJzZXIuR2V0T2JqZWN0KE5VTEwsIDAsIDAsIDApOwogICAgICAgICBpZiAoIXBUcmFpbGVyKSB7CiAgICAgICAgICAgICBtX1BvcyArPSBtX3N5bnRheFBhcnNlci5TYXZlUG9zKCk7CiAgICAgICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlUcmFpbGVyU2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBUcmFpbGVyLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBDUERGX0RpY3Rpb25hcnkgKnBUcmFpbGVyRGljdCA9IHBUcmFpbGVyLT5HZXREaWN0KCk7CiAgICAgICAgIGlmIChwVHJhaWxlckRpY3QpIHsKQEAgLTQwMTQsNyArNDAxNCw3IEBACiAgICAgICAgICAgICBpZiAocEVuY3J5cHQgJiYgcEVuY3J5cHQtPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7CiAgICAgICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwogICAgICAgICAgICAgICAgIHBUcmFpbGVyLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgRlhfRFdPUkQgeHJlZnBvcyA9IEdldERpcmVjdEludGVnZXIocFRyYWlsZXItPkdldERpY3QoKSwgRlhfQlNUUkMoIlByZXYiKSk7CkBAIC00MDMyLDYwICs0MDMyLDYwIEBACiAgICAgICAgICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9UUkFJTEVSX0FQUEVORDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIG1fZHdQcmV2WFJlZk9mZnNldCA9IDA7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9UUkFJTEVSX0FQUEVORDsKICAgICAgICAgcFRyYWlsZXItPlJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlUcmFpbGVyU2l6ZSk7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZShpbnQzMl90IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7Ci0gICAgd2hpbGUgKFRSVUUpIHsKKyAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICBzd2l0Y2ggKG1fZG9jU3RhdHVzKSB7CiAgICAgICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfUEFHRVRSRUU6CiAgICAgICAgICAgICAgICAgaWYgKCFMb2FkRG9jUGFnZXMocEhpbnRzKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfUEFHRToKICAgICAgICAgICAgICAgICBpZiAoIUxvYWREb2NQYWdlKGlQYWdlLCBwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9FUlJPUjoKICAgICAgICAgICAgICAgICByZXR1cm4gTG9hZEFsbEZpbGUocEhpbnRzKTsKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgbV9iUGFnZXNUcmVlTG9hZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgbV9iUGFnZXNMb2FkID0gVFJVRTsKLSAgICAgICAgICAgICAgICBtX2JDdXJQYWdlRGljdExvYWRPSyA9IFRSVUU7CisgICAgICAgICAgICAgICAgbV9iUGFnZXNUcmVlTG9hZCA9IHRydWU7CisgICAgICAgICAgICAgICAgbV9iUGFnZXNMb2FkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtX2JDdXJQYWdlRGljdExvYWRPSyA9IHRydWU7CiAgICAgICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiB9Ci1GWF9CT09MCUNQREZfRGF0YUF2YWlsOjpDaGVja0FycmF5UGFnZU5vZGUoRlhfRFdPUkQgZHdQYWdlTm8sIENQREZfUGFnZU5vZGUgKnBQYWdlTm9kZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK2Jvb2wJQ1BERl9EYXRhQXZhaWw6OkNoZWNrQXJyYXlQYWdlTm9kZShGWF9EV09SRCBkd1BhZ2VObywgQ1BERl9QYWdlTm9kZSAqcFBhZ2VOb2RlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewotICAgIEZYX0JPT0wgYkV4aXN0ID0gRkFMU0U7CisgICAgYm9vbCBiRXhpc3QgPSBmYWxzZTsKICAgICBDUERGX09iamVjdCAqcFBhZ2VzID0gR2V0T2JqZWN0KGR3UGFnZU5vLCBwSGludHMsICZiRXhpc3QpOwogICAgIGlmICghYkV4aXN0KSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghcFBhZ2VzKSB7CiAgICAgICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0VSUk9SKSB7CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChwUGFnZXMtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKICAgICAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHBQYWdlTm9kZS0+bV90eXBlID0gUERGX1BBR0VOT0RFX1BBR0VTOwogICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwUGFnZXM7CkBAIC00MDk5LDMzICs0MDk5LDMzIEBACiAgICAgICAgIHBOb2RlLT5tX2R3UGFnZU5vID0gKChDUERGX1JlZmVyZW5jZSopcEtpZCktPkdldFJlZk9iak51bSgpOwogICAgIH0KICAgICBwUGFnZXMtPlJlbGVhc2UoKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrVW5rb3duUGFnZU5vZGUoRlhfRFdPUkQgZHdQYWdlTm8sIENQREZfUGFnZU5vZGUgKnBQYWdlTm9kZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrVW5rb3duUGFnZU5vZGUoRlhfRFdPUkQgZHdQYWdlTm8sIENQREZfUGFnZU5vZGUgKnBQYWdlTm9kZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKLSAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOworICAgIGJvb2wgYkV4aXN0ID0gZmFsc2U7CiAgICAgQ1BERl9PYmplY3QgKnBQYWdlID0gR2V0T2JqZWN0KGR3UGFnZU5vLCBwSGludHMsICZiRXhpc3QpOwogICAgIGlmICghYkV4aXN0KSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghcFBhZ2UpIHsKICAgICAgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBQYWdlLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CiAgICAgICAgIHBQYWdlTm9kZS0+bV9kd1BhZ2VObyA9IGR3UGFnZU5vOwogICAgICAgICBwUGFnZU5vZGUtPm1fdHlwZSA9IFBERl9QQUdFTk9ERV9BUlJBWTsKICAgICAgICAgcFBhZ2UtPlJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAocFBhZ2UtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewogICAgICAgICBwUGFnZS0+UmVsZWFzZSgpOwogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBwUGFnZU5vZGUtPm1fZHdQYWdlTm8gPSBkd1BhZ2VObzsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFBhZ2UtPkdldERpY3QoKTsKQEAgLTQxMzUsNyArNDEzNSw3IEBACiAgICAgICAgIENQREZfT2JqZWN0ICpwS2lkcyA9IHBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJLaWRzIikpOwogICAgICAgICBpZiAoIXBLaWRzKSB7CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgc3dpdGNoIChwS2lkcy0+R2V0VHlwZSgpKSB7CiAgICAgICAgICAgICBjYXNlIFBERk9CSl9SRUZFUkVOQ0U6IHsKQEAgLTQxNjYsMTcgKzQxNjYsMTcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBwUGFnZS0+UmVsZWFzZSgpOwogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBwUGFnZS0+UmVsZWFzZSgpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlTm9kZShDUERGX1BhZ2VOb2RlICZwYWdlTm9kZXMsIGludDMyX3QgaVBhZ2UsIGludDMyX3QgJmlDb3VudCwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZU5vZGUoQ1BERl9QYWdlTm9kZSAmcGFnZU5vZGVzLCBpbnQzMl90IGlQYWdlLCBpbnQzMl90ICZpQ291bnQsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgaW50MzJfdCBpU2l6ZSA9IHBhZ2VOb2Rlcy5tX2NoaWxkTm9kZS5HZXRTaXplKCk7CiAgICAgaWYgKGlTaXplIDw9IDAgfHwgaVBhZ2UgPj0gaVNpemUpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7ICsraSkgewogICAgICAgICBDUERGX1BhZ2VOb2RlICpwTm9kZSA9IChDUERGX1BhZ2VOb2RlKilwYWdlTm9kZXMubV9jaGlsZE5vZGUuR2V0QXQoaSk7CkBAIC00MTg2LDcgKzQxODYsNyBAQAogICAgICAgICBzd2l0Y2ggKHBOb2RlLT5tX3R5cGUpIHsKICAgICAgICAgICAgIGNhc2UgUERGX1BBR0VOT0RFX1VOS09XTjoKICAgICAgICAgICAgICAgICBpZiAoIUNoZWNrVW5rb3duUGFnZU5vZGUocE5vZGUtPm1fZHdQYWdlTm8sIHBOb2RlLCBwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAtLWk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC00MTk4LDE5OSArNDE5OCwxOTkgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUERGX1BBR0VOT0RFX1BBR0VTOgogICAgICAgICAgICAgICAgIGlmICghQ2hlY2tQYWdlTm9kZSgqcE5vZGUsIGlQYWdlLCBpQ291bnQsIHBIaW50cykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBQREZfUEFHRU5PREVfQVJSQVk6CiAgICAgICAgICAgICAgICAgaWYgKCFDaGVja0FycmF5UGFnZU5vZGUocE5vZGUtPm1fZHdQYWdlTm8sIHBOb2RlLCBwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAtLWk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlQYWdlID09IGlDb3VudCkgewogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0RPTkU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6TG9hZERvY1BhZ2UoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkxvYWREb2NQYWdlKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgaWYgKG1fcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSA8PSBpUGFnZSB8fCBtX3BEb2N1bWVudC0+bV9QYWdlTGlzdC5HZXRBdChpUGFnZSkpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0RPTkU7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKG1fcGFnZU5vZGVzLm1fdHlwZSA9PSBQREZfUEFHRU5PREVfUEFHRSkgewogICAgICAgICBpZiAoaVBhZ2UgPT0gMCkgewogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0RPTkU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpbnQzMl90IGlDb3VudCA9IC0xOwogICAgIHJldHVybiBDaGVja1BhZ2VOb2RlKG1fcGFnZU5vZGVzLCBpUGFnZSwgaUNvdW50LCBwSGludHMpOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlQ291bnQoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZUNvdW50KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7Ci0gICAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKKyAgICBib29sIGJFeGlzdCA9IGZhbHNlOwogICAgIENQREZfT2JqZWN0ICpwUGFnZXMgPSBHZXRPYmplY3QobV9QYWdlc09iak51bSwgcEhpbnRzLCAmYkV4aXN0KTsKICAgICBpZiAoIWJFeGlzdCkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoIXBQYWdlcykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXNEaWN0ID0gcFBhZ2VzLT5HZXREaWN0KCk7CiAgICAgaWYgKCFwUGFnZXNEaWN0KSB7CiAgICAgICAgIHBQYWdlcy0+UmVsZWFzZSgpOwogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoIXBQYWdlc0RpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJLaWRzIikpKSB7CiAgICAgICAgIHBQYWdlcy0+UmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGludCBjb3VudCA9IHBQYWdlc0RpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkNvdW50IikpOwogICAgIGlmIChjb3VudCA+IDApIHsKICAgICAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkxvYWREb2NQYWdlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6TG9hZERvY1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgaWYgKCFDaGVja1Vua293blBhZ2VOb2RlKG1fUGFnZXNPYmpOdW0sICZtX3BhZ2VOb2RlcywgcEhpbnRzKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKENoZWNrUGFnZUNvdW50KHBIaW50cykpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0U7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgbV9iVG90YWxMb2FkUGFnZVRyZWUgPSBUUlVFOwotICAgIHJldHVybiBGQUxTRTsKKyAgICBtX2JUb3RhbExvYWRQYWdlVHJlZSA9IHRydWU7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6TG9hZFBhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpMb2FkUGFnZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICB3aGlsZSAoIW1fYlBhZ2VzVHJlZUxvYWQpIHsKICAgICAgICAgaWYgKCFDaGVja1BhZ2VTdGF0dXMocEhpbnRzKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtX2JQYWdlc0xvYWQpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBtX3BEb2N1bWVudC0+TG9hZFBhZ2VzKCk7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrTGluZWFyaXplZERhdGEoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrTGluZWFyaXplZERhdGEoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBpZiAobV9iTGluZWFyZWREYXRhT0spIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIGlmICghbV9iTWFpblhSZWZMb2FkVHJpZWQpIHsKICAgICAgICAgRlhfU0FGRV9EV09SRCBkYXRhX3NpemUgPSBtX2R3RmlsZUxlbjsKICAgICAgICAgZGF0YV9zaXplIC09IG1fZHdMYXN0WFJlZk9mZnNldDsKICAgICAgICAgaWYgKCFkYXRhX3NpemUuSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKG1fZHdMYXN0WFJlZk9mZnNldCwgZGF0YV9zaXplLlZhbHVlT3JEaWUoKSkpIHsKICAgICAgICAgICAgIHBIaW50cy0+QWRkU2VnbWVudChtX2R3TGFzdFhSZWZPZmZzZXQsIGRhdGFfc2l6ZS5WYWx1ZU9yRGllKCkpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIEZYX0RXT1JEIGR3UmV0ID0gKChDUERGX1BhcnNlciAqKW1fcERvY3VtZW50LT5HZXRQYXJzZXIoKSktPkxvYWRMaW5lYXJpemVkTWFpblhSZWZUYWJsZSgpOwotICAgICAgICBtX2JNYWluWFJlZkxvYWRUcmllZCA9IFRSVUU7CisgICAgICAgIG1fYk1haW5YUmVmTG9hZFRyaWVkID0gdHJ1ZTsKICAgICAgICAgaWYgKGR3UmV0ICE9IFBERlBBUlNFX0VSUk9SX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoIVByZXBhcmVQYWdlSXRlbSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgbV9iTWFpblhSZWZMb2FkZWRPSyA9IFRSVUU7Ci0gICAgICAgIG1fYkxpbmVhcmVkRGF0YU9LICAgPSBUUlVFOworICAgICAgICBtX2JNYWluWFJlZkxvYWRlZE9LID0gdHJ1ZTsKKyAgICAgICAgbV9iTGluZWFyZWREYXRhT0sgICA9IHRydWU7CiAgICAgfQogCiAgICAgcmV0dXJuIG1fYkxpbmVhcmVkRGF0YU9LOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlQW5ub3RzKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VBbm5vdHMoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBpZiAoIW1fb2Jqc19hcnJheS5HZXRTaXplKCkpIHsKICAgICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwogICAgICAgICBtX29iam51bV9hcnJheS5SZW1vdmVBbGwoKTsKICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5ICpwUGFnZURpY3QgPSBtX3BEb2N1bWVudC0+R2V0UGFnZShpUGFnZSk7CiAgICAgICAgIGlmICghcFBhZ2VEaWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIENQREZfT2JqZWN0ICpwQW5ub3RzID0gcFBhZ2VEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJBbm5vdHMiKSk7CiAgICAgICAgIGlmICghcEFubm90cykgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBDRlhfUHRyQXJyYXkgb2JqX2FycmF5OwogICAgICAgICBvYmpfYXJyYXkuQWRkKHBBbm5vdHMpOwotICAgICAgICBGWF9CT09MIGJSZXQgPSBJc09iamVjdHNBdmFpbChvYmpfYXJyYXksIEZBTFNFLCBwSGludHMsIG1fb2Jqc19hcnJheSk7CisgICAgICAgIGJvb2wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG9ial9hcnJheSwgZmFsc2UsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKICAgICAgICAgaWYgKGJSZXQpIHsKICAgICAgICAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYlJldDsKICAgICB9CiAgICAgQ0ZYX1B0ckFycmF5IG5ld19vYmpzX2FycmF5OwotICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgRkFMU0UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOworICAgIGJvb2wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgZmFsc2UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOwogICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKICAgICBpZiAoIWJSZXQpIHsKICAgICAgICAgbV9vYmpzX2FycmF5LkFwcGVuZChuZXdfb2Jqc19hcnJheSk7CiAgICAgfQogICAgIHJldHVybiBiUmV0OwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tMaW5lYXJpemVkRmlyc3RQYWdlKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0xpbmVhcml6ZWRGaXJzdFBhZ2UoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBpZiAoIW1fYkFubm90c0xvYWQpIHsKICAgICAgICAgaWYgKCFDaGVja1BhZ2VBbm5vdHMoaVBhZ2UsIHBIaW50cykpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBtX2JBbm5vdHNMb2FkID0gVFJVRTsKKyAgICAgICAgbV9iQW5ub3RzTG9hZCA9IHRydWU7CiAgICAgfQogICAgIGlmIChtX2JBbm5vdHNMb2FkKSB7CiAgICAgICAgIGlmICghQ2hlY2tMaW5lYXJpemVkRGF0YShwSGludHMpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBtX2JQYWdlTG9hZGVkT0sgPSBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBtX2JQYWdlTG9hZGVkT0sgPSBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkhhdmVSZXNvdXJjZUFuY2VzdG9yKENQREZfRGljdGlvbmFyeSAqcERpY3QpCitib29sIENQREZfRGF0YUF2YWlsOjpIYXZlUmVzb3VyY2VBbmNlc3RvcihDUERGX0RpY3Rpb25hcnkgKnBEaWN0KQogewogICAgIENGWF9BdXRvUmVzdG9yZXI8aW50PiByZXN0b3Jlcigmc19DdXJyZW50RGF0YUF2YWlsUmVjdXJzaW9uRGVwdGgpOwogICAgIGlmICgrK3NfQ3VycmVudERhdGFBdmFpbFJlY3Vyc2lvbkRlcHRoID4ga01heERhdGFBdmFpbFJlY3Vyc2lvbkRlcHRoKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX09iamVjdCAqcFBhcmVudCA9IHBEaWN0LT5HZXRFbGVtZW50KCJQYXJlbnQiKTsKICAgICBpZiAoIXBQYXJlbnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSAqcFBhcmVudERpY3QgPSBwUGFyZW50LT5HZXREaWN0KCk7CiAgICAgaWYgKCFwUGFyZW50RGljdCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9PYmplY3QgKnBSZXQgPSBwUGFyZW50RGljdC0+R2V0RWxlbWVudCgiUmVzb3VyY2VzIik7CiAgICAgaWYgKHBSZXQpIHsKICAgICAgICAgbV9wUGFnZVJlc291cmNlID0gcFJldDsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gSGF2ZVJlc291cmNlQW5jZXN0b3IocFBhcmVudERpY3QpOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6SXNQYWdlQXZhaWwoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OklzUGFnZUF2YWlsKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgaWYgKCFtX3BEb2N1bWVudCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKElzRmlyc3RDaGVjayhpUGFnZSkpIHsKLSAgICAgICAgbV9iQ3VyUGFnZURpY3RMb2FkT0sgPSBGQUxTRTsKLSAgICAgICAgbV9iUGFnZUxvYWRlZE9LID0gRkFMU0U7Ci0gICAgICAgIG1fYkFubm90c0xvYWQgPSBGQUxTRTsKLSAgICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2UgPSBGQUxTRTsKKyAgICAgICAgbV9iQ3VyUGFnZURpY3RMb2FkT0sgPSBmYWxzZTsKKyAgICAgICAgbV9iUGFnZUxvYWRlZE9LID0gZmFsc2U7CisgICAgICAgIG1fYkFubm90c0xvYWQgPSBmYWxzZTsKKyAgICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2UgPSBmYWxzZTsKICAgICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwogICAgICAgICBtX29iam51bV9hcnJheS5SZW1vdmVBbGwoKTsKICAgICB9CkBAIC00Mzk5LDQ2ICs0Mzk5LDQ2IEBACiAgICAgfQogICAgIEZYX0RXT1JEIGR3UGFnZUxvYWQgPSAwOwogICAgIGlmIChtX3BhZ2VzTG9hZFN0YXRlLT5Mb29rdXAoaVBhZ2UsIGR3UGFnZUxvYWQpICYmIGR3UGFnZUxvYWQgIT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChtX2JMaW5lYXJpemVkKSB7CiAgICAgICAgIGlmICgoRlhfRFdPUkQpaVBhZ2UgPT0gbV9kd0ZpcnN0UGFnZU5vKSB7Ci0gICAgICAgICAgICBtX3BhZ2VzTG9hZFN0YXRlLT5TZXRBdChpUGFnZSwgVFJVRSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIG1fcGFnZXNMb2FkU3RhdGUtPlNldEF0KGlQYWdlLCB0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmICghQ2hlY2tMaW5lYXJpemVkRGF0YShwSGludHMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fYk1haW5YUmVmTG9hZGVkT0spIHsKICAgICAgICAgICAgIGlmIChtX2JUb3RhbExvYWRQYWdlVHJlZSkgewogICAgICAgICAgICAgICAgIGlmICghTG9hZFBhZ2VzKHBIaW50cykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoIW1fYkN1clBhZ2VEaWN0TG9hZE9LICYmICFDaGVja1BhZ2UoaVBhZ2UsIHBIaW50cykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKCFMb2FkQWxsRmlsZShwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICgoQ1BERl9QYXJzZXIgKiltX3BEb2N1bWVudC0+R2V0UGFyc2VyKCkpLT5SZWJ1aWxkQ3Jvc3NSZWYoKTsKICAgICAgICAgICAgIFJlc2V0Rmlyc3RDaGVjayhpUGFnZSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCFtX2JUb3RhbExvYWRQYWdlVHJlZSkgewogICAgICAgICAgICAgaWYgKCFtX2JDdXJQYWdlRGljdExvYWRPSyAmJiAhQ2hlY2tQYWdlKGlQYWdlLCBwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBpZiAobV9iSGF2ZUFjcm9Gb3JtICYmICFtX2JBY3JvRm9ybUxvYWQpIHsKICAgICAgICAgaWYgKCFDaGVja0Fjcm9Gb3JtU3ViT2JqZWN0KHBIaW50cykpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBtX2JBY3JvRm9ybUxvYWQgPSBUUlVFOworICAgICAgICBtX2JBY3JvRm9ybUxvYWQgPSB0cnVlOwogICAgIH0KICAgICBpZiAoIW1fYlBhZ2VMb2FkZWRPSykgewogICAgICAgICBpZiAoIW1fb2Jqc19hcnJheS5HZXRTaXplKCkpIHsKQEAgLTQ0NDcsMjMgKzQ0NDcsMjMgQEAKICAgICAgICAgICAgIG1fcFBhZ2VEaWN0ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2UoaVBhZ2UpOwogICAgICAgICAgICAgaWYgKCFtX3BQYWdlRGljdCkgewogICAgICAgICAgICAgICAgIFJlc2V0Rmlyc3RDaGVjayhpUGFnZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBDRlhfUHRyQXJyYXkgb2JqX2FycmF5OwogICAgICAgICAgICAgb2JqX2FycmF5LkFkZChtX3BQYWdlRGljdCk7Ci0gICAgICAgICAgICBGWF9CT09MIGJSZXQgPSBJc09iamVjdHNBdmFpbChvYmpfYXJyYXksIFRSVUUsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKKyAgICAgICAgICAgIGJvb2wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG9ial9hcnJheSwgdHJ1ZSwgcEhpbnRzLCBtX29ianNfYXJyYXkpOwogICAgICAgICAgICAgaWYgKGJSZXQpIHsKICAgICAgICAgICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICAgICAgbV9iUGFnZUxvYWRlZE9LID0gVFJVRTsKKyAgICAgICAgICAgICAgICBtX2JQYWdlTG9hZGVkT0sgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXR1cm4gYlJldDsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIENGWF9QdHJBcnJheSBuZXdfb2Jqc19hcnJheTsKLSAgICAgICAgICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgRkFMU0UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOworICAgICAgICAgICAgYm9vbCBiUmV0ID0gSXNPYmplY3RzQXZhaWwobV9vYmpzX2FycmF5LCBmYWxzZSwgcEhpbnRzLCBuZXdfb2Jqc19hcnJheSk7CiAgICAgICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgICAgICAgICBpZiAoYlJldCkgewotICAgICAgICAgICAgICAgIG1fYlBhZ2VMb2FkZWRPSyA9IFRSVUU7CisgICAgICAgICAgICAgICAgbV9iUGFnZUxvYWRlZE9LID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbV9vYmpzX2FycmF5LkFwcGVuZChuZXdfb2Jqc19hcnJheSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGJSZXQ7CkBAIC00NDczLDkgKzQ0NzMsOSBAQAogICAgIGlmIChtX2JQYWdlTG9hZGVkT0spIHsKICAgICAgICAgaWYgKCFtX2JBbm5vdHNMb2FkKSB7CiAgICAgICAgICAgICBpZiAoIUNoZWNrUGFnZUFubm90cyhpUGFnZSwgcEhpbnRzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2JBbm5vdHNMb2FkID0gVFJVRTsKKyAgICAgICAgICAgIG1fYkFubm90c0xvYWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtX3BQYWdlRGljdCAmJiAhbV9iTmVlZERvd25Mb2FkUmVzb3VyY2UpIHsKQEAgLTQ0ODMsMzcgKzQ0ODMsMzcgQEAKICAgICAgICAgaWYgKCFtX3BQYWdlUmVzb3VyY2UpIHsKICAgICAgICAgICAgIG1fYk5lZWREb3duTG9hZFJlc291cmNlID0gSGF2ZVJlc291cmNlQW5jZXN0b3IobV9wUGFnZURpY3QpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2UgPSBUUlVFOworICAgICAgICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2UgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSkgewotICAgICAgICBGWF9CT09MIGJSZXQgPSBDaGVja1Jlc291cmNlcyhwSGludHMpOworICAgICAgICBib29sIGJSZXQgPSBDaGVja1Jlc291cmNlcyhwSGludHMpOwogICAgICAgICBpZiAoIWJSZXQpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IEZBTFNFOworICAgICAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IGZhbHNlOwogICAgIH0KLSAgICBtX2JQYWdlTG9hZGVkT0sgPSBGQUxTRTsKLSAgICBtX2JBbm5vdHNMb2FkID0gRkFMU0U7Ci0gICAgbV9iQ3VyUGFnZURpY3RMb2FkT0sgPSBGQUxTRTsKKyAgICBtX2JQYWdlTG9hZGVkT0sgPSBmYWxzZTsKKyAgICBtX2JBbm5vdHNMb2FkID0gZmFsc2U7CisgICAgbV9iQ3VyUGFnZURpY3RMb2FkT0sgPSBmYWxzZTsKICAgICBSZXNldEZpcnN0Q2hlY2soaVBhZ2UpOwotICAgIG1fcGFnZXNMb2FkU3RhdGUtPlNldEF0KGlQYWdlLCBUUlVFKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBtX3BhZ2VzTG9hZFN0YXRlLT5TZXRBdChpUGFnZSwgdHJ1ZSk7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1Jlc291cmNlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tSZXNvdXJjZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBpZiAoIW1fb2Jqc19hcnJheS5HZXRTaXplKCkpIHsKICAgICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwogICAgICAgICBDRlhfUHRyQXJyYXkgb2JqX2FycmF5OwogICAgICAgICBvYmpfYXJyYXkuQWRkKG1fcFBhZ2VSZXNvdXJjZSk7Ci0gICAgICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG9ial9hcnJheSwgVFJVRSwgcEhpbnRzLCBtX29ianNfYXJyYXkpOworICAgICAgICBib29sIGJSZXQgPSBJc09iamVjdHNBdmFpbChvYmpfYXJyYXksIHRydWUsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKICAgICAgICAgaWYgKGJSZXQpIHsKICAgICAgICAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYlJldDsKICAgICB9CiAgICAgQ0ZYX1B0ckFycmF5IG5ld19vYmpzX2FycmF5OwotICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgRkFMU0UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOworICAgIGJvb2wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgZmFsc2UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOwogICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKICAgICBpZiAoIWJSZXQpIHsKICAgICAgICAgbV9vYmpzX2FycmF5LkFwcGVuZChuZXdfb2Jqc19hcnJheSk7CkBAIC00NTQ5LDEwICs0NTQ5LDEwIEBACiAgICAgICAgIGlmICghbV9vYmpzX2FycmF5LkdldFNpemUoKSkgewogICAgICAgICAgICAgbV9vYmpzX2FycmF5LkFkZChwQWNyb0Zvcm0tPkdldERpY3QoKSk7CiAgICAgICAgIH0KLSAgICAgICAgbV9iTGluZWFyaXplZEZvcm1QYXJhbUxvYWQgPSBUUlVFOworICAgICAgICBtX2JMaW5lYXJpemVkRm9ybVBhcmFtTG9hZCA9IHRydWU7CiAgICAgfQogICAgIENGWF9QdHJBcnJheSBuZXdfb2Jqc19hcnJheTsKLSAgICBGWF9CT09MIGJSZXQgPSBJc09iamVjdHNBdmFpbChtX29ianNfYXJyYXksIEZBTFNFLCBwSGludHMsIG5ld19vYmpzX2FycmF5KTsKKyAgICBib29sIGJSZXQgPSBJc09iamVjdHNBdmFpbChtX29ianNfYXJyYXksIGZhbHNlLCBwSGludHMsIG5ld19vYmpzX2FycmF5KTsKICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgaWYgKCFiUmV0KSB7CiAgICAgICAgIG1fb2Jqc19hcnJheS5BcHBlbmQobmV3X29ianNfYXJyYXkpOwpAQCAtNDU2OCwxMiArNDU2OCwxMiBAQAogICAgIH0KICAgICBtX251bWJlcl9hcnJheS5JbnNlcnRBdChpTmV4dCwgZHdPYmpOdW0pOwogfQotRlhfQk9PTCBDUERGX1NvcnRPYmpOdW1BcnJheTo6RmluZChGWF9EV09SRCBkd09iak51bSkKK2Jvb2wgQ1BERl9Tb3J0T2JqTnVtQXJyYXk6OkZpbmQoRlhfRFdPUkQgZHdPYmpOdW0pCiB7CiAgICAgaW50MzJfdCBpTmV4dCA9IDA7CiAgICAgcmV0dXJuIEJpbmFyeVNlYXJjaChkd09iak51bSwgaU5leHQpOwogfQotRlhfQk9PTCBDUERGX1NvcnRPYmpOdW1BcnJheTo6QmluYXJ5U2VhcmNoKEZYX0RXT1JEIHZhbHVlLCBpbnQzMl90ICZpTmV4dCkKK2Jvb2wgQ1BERl9Tb3J0T2JqTnVtQXJyYXk6OkJpbmFyeVNlYXJjaChGWF9EV09SRCB2YWx1ZSwgaW50MzJfdCAmaU5leHQpCiB7CiAgICAgaW50MzJfdCBpTG93ID0gMDsKICAgICBpbnQzMl90IGlIaWdoID0gbV9udW1iZXJfYXJyYXkuR2V0U2l6ZSgpIC0gMTsKQEAgLTQ1ODEsNyArNDU4MSw3IEBACiAgICAgICAgIGludDMyX3QgaU1pZCA9IChpTG93ICsgaUhpZ2gpIC8gMjsKICAgICAgICAgaWYgKG1fbnVtYmVyX2FycmF5LkdldEF0KGlNaWQpID09IHZhbHVlKSB7CiAgICAgICAgICAgICBpTmV4dCA9IGlNaWQ7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX251bWJlcl9hcnJheS5HZXRBdChpTWlkKSA+IHZhbHVlKSB7CiAgICAgICAgICAgICBpSGlnaCA9IGlNaWQgLSAxOwpAQCAtNDU5MCw3ICs0NTkwLDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpTmV4dCA9IGlMb3c7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIENQREZfUGFnZU5vZGU6On5DUERGX1BhZ2VOb2RlKCkKIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfdXRpbGl0eS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3V0aWxpdHkuY3BwCmluZGV4IDQ5MDMzMTIuLjc2ZTI0NWEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfdXRpbGl0eS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl91dGlsaXR5LmNwcApAQCAtMTk1LDcgKzE5NSw3IEBACiAgICAgfQogICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MocFN0YXJ0LCBkd1NpemUpOwogfQotRlhfQk9PTCBDUERGX1NpbXBsZVBhcnNlcjo6U2VhcmNoVG9rZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbikKK2Jvb2wgQ1BERl9TaW1wbGVQYXJzZXI6OlNlYXJjaFRva2VuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4pCiB7CiAgICAgaW50IHRva2VuX2xlbiA9IHRva2VuLkdldExlbmd0aCgpOwogICAgIHdoaWxlIChtX2R3Q3VyUG9zIDwgbV9kd1NpemUgLSB0b2tlbl9sZW4pIHsKQEAgLTIwNSwzMCArMjA1LDMwIEBACiAgICAgICAgIG1fZHdDdXJQb3MgKys7CiAgICAgfQogICAgIGlmIChtX2R3Q3VyUG9zID09IG1fZHdTaXplIC0gdG9rZW5fbGVuKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX2R3Q3VyUG9zICs9IHRva2VuX2xlbjsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9TaW1wbGVQYXJzZXI6OlNraXBXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4pCitib29sIENQREZfU2ltcGxlUGFyc2VyOjpTa2lwV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRva2VuKQogewogICAgIHdoaWxlICgxKSB7CiAgICAgICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gR2V0V29yZCgpOwogICAgICAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAod29yZCA9PSB0b2tlbikgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX1NpbXBsZVBhcnNlcjo6RmluZFRhZ1BhaXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdGFydF90b2tlbiwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBlbmRfdG9rZW4sCitib29sIENQREZfU2ltcGxlUGFyc2VyOjpGaW5kVGFnUGFpcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0YXJ0X3Rva2VuLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGVuZF90b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBzdGFydF9wb3MsIEZYX0RXT1JEJiBlbmRfcG9zKQogewogICAgIGlmICghc3RhcnRfdG9rZW4uSXNFbXB0eSgpKSB7CiAgICAgICAgIGlmICghU2tpcFdvcmQoc3RhcnRfdG9rZW4pKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgc3RhcnRfcG9zID0gbV9kd0N1clBvczsKICAgICB9CkBAIC0yMzYsMTUgKzIzNiwxNSBAQAogICAgICAgICBlbmRfcG9zID0gbV9kd0N1clBvczsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIHdvcmQgPSBHZXRXb3JkKCk7CiAgICAgICAgIGlmICh3b3JkLklzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmICh3b3JkID09IGVuZF90b2tlbikgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX1NpbXBsZVBhcnNlcjo6RmluZFRhZ1BhcmFtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4sIGludCBuUGFyYW1zKQorYm9vbCBDUERGX1NpbXBsZVBhcnNlcjo6RmluZFRhZ1BhcmFtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4sIGludCBuUGFyYW1zKQogewogICAgIG5QYXJhbXMgKys7CiAgICAgRlhfRFdPUkQqIHBCdWYgPSBGWF9BbGxvYyhGWF9EV09SRCwgblBhcmFtcyk7CkBAIC0yNjIsNyArMjYyLDcgQEAKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIHdvcmQgPSBHZXRXb3JkKCk7CiAgICAgICAgIGlmICh3b3JkLklzRW1wdHkoKSkgewogICAgICAgICAgICAgRlhfRnJlZShwQnVmKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAod29yZCA9PSB0b2tlbikgewogICAgICAgICAgICAgaWYgKGJ1Zl9jb3VudCA8IG5QYXJhbXMpIHsKQEAgLTI3MCwxMCArMjcwLDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtX2R3Q3VyUG9zID0gcEJ1ZltidWZfaW5kZXhdOwogICAgICAgICAgICAgRlhfRnJlZShwQnVmKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIHN0YXRpYyBpbnQgX2hleDJkZWMoY2hhciBjaCkKIHsKQEAgLTM2OCw3ICszNjgsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUERGT0JKX1NUUklORzogewogICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOwotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkhleCA9ICgoQ1BERl9TdHJpbmcqKXBPYmopLT5Jc0hleCgpOworICAgICAgICAgICAgICAgIGJvb2wgYkhleCA9ICgoQ1BERl9TdHJpbmcqKXBPYmopLT5Jc0hleCgpOwogICAgICAgICAgICAgICAgIGJ1ZiA8PCBQREZfRW5jb2RlU3RyaW5nKHN0ciwgYkhleCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC00MTcsMTMgKzQxNywxMyBAQAogICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwID0gKENQREZfU3RyZWFtKilwT2JqOwogICAgICAgICAgICAgICAgIGJ1ZiA8PCBwLT5HZXREaWN0KCkgPDwgRlhfQlNUUkMoInN0cmVhbVxyXG4iKTsKICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgICAgICAgICAgICAgYWNjLkxvYWRBbGxEYXRhKHAsIFRSVUUpOworICAgICAgICAgICAgICAgIGFjYy5Mb2FkQWxsRGF0YShwLCB0cnVlKTsKICAgICAgICAgICAgICAgICBidWYuQXBwZW5kQmxvY2soYWNjLkdldERhdGEoKSwgYWNjLkdldFNpemUoKSk7CiAgICAgICAgICAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCJcclxuZW5kc3RyZWFtIik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlQoRkFMU0UpOworICAgICAgICAgICAgQVNTRVJUKGZhbHNlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gYnVmOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlci5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyLmNwcAppbmRleCBmOGI1OTkxLi5hNzBmNWJmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyLmNwcApAQCAtMTgsMTAgKzE4LDEwIEBACiAKIENQREZfRG9jUmVuZGVyRGF0YTo6fkNQREZfRG9jUmVuZGVyRGF0YSgpCiB7Ci0gICAgQ2xlYXIoVFJVRSk7CisgICAgQ2xlYXIodHJ1ZSk7CiB9CiAKLXZvaWQgQ1BERl9Eb2NSZW5kZXJEYXRhOjpDbGVhcihGWF9CT09MIGJSZWxlYXNlKQordm9pZCBDUERGX0RvY1JlbmRlckRhdGE6OkNsZWFyKGJvb2wgYlJlbGVhc2UpCiB7CiAgICAgZm9yIChhdXRvIGl0ID0gbV9UeXBlM0ZhY2VNYXAuYmVnaW4oKTsgaXQgIT0gbV9UeXBlM0ZhY2VNYXAuZW5kKCk7KSB7CiAgICAgICAgIGF1dG8gY3Vycl9pdCA9IGl0Kys7CkBAIC00OCw3ICs0OCw3IEBACiAgICAgICAgICAgICBkZWxldGUgbV9wRm9udENhY2hlOwogICAgICAgICAgICAgbV9wRm9udENhY2hlID0gTlVMTDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fcEZvbnRDYWNoZS0+RnJlZUNhY2hlKEZBTFNFKTsKKyAgICAgICAgICAgIG1fcEZvbnRDYWNoZS0+RnJlZUNhY2hlKGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTExOCw3ICsxMTgsNyBAQAogdm9pZCBDUERGX1JlbmRlck1vZHVsZTo6Q2xlYXJEb2NEYXRhKENQREZfRG9jUmVuZGVyRGF0YSogcCkKIHsKICAgICBpZiAocCkgewotICAgICAgICBwLT5DbGVhcihGQUxTRSk7CisgICAgICAgIHAtPkNsZWFyKGZhbHNlKTsKICAgICB9CiB9CiB2b2lkIENQREZfUmVuZGVyTW9kdWxlOjpEZXN0cm95UGFnZUNhY2hlKENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUpCkBAIC0xODAsMTkgKzE4MCwxOSBAQAogQ1BERl9SZW5kZXJTdGF0dXM6OkNQREZfUmVuZGVyU3RhdHVzKCkKIHsKICAgICBtX3BDb250ZXh0ID0gTlVMTDsKLSAgICBtX2JTdG9wcGVkID0gRkFMU0U7CisgICAgbV9iU3RvcHBlZCA9IGZhbHNlOwogICAgIG1fcERldmljZSA9IE5VTEw7CiAgICAgbV9wQ3VyT2JqID0gTlVMTDsKICAgICBtX3BTdG9wT2JqID0gTlVMTDsKICAgICBtX0hhbGZ0b25lTGltaXQgPSAwOwogICAgIG1fcE9iamVjdFJlbmRlcmVyID0gTlVMTDsKLSAgICBtX2JQcmludCA9IEZBTFNFOworICAgIG1fYlByaW50ID0gZmFsc2U7CiAgICAgbV9UcmFuc3BhcmVuY3kgPSAwOwogICAgIG1fRGl0aGVyQml0cyA9IDA7Ci0gICAgbV9iRHJvcE9iamVjdHMgPSBGQUxTRTsKLSAgICBtX2JTdGRDUyA9IEZBTFNFOworICAgIG1fYkRyb3BPYmplY3RzID0gZmFsc2U7CisgICAgbV9iU3RkQ1MgPSBmYWxzZTsKICAgICBtX0dyb3VwRmFtaWx5ID0gMDsKLSAgICBtX2JMb2FkTWFzayA9IEZBTFNFOworICAgIG1fYkxvYWRNYXNrID0gZmFsc2U7CiAgICAgbV9wVHlwZTNDaGFyID0gTlVMTDsKICAgICBtX1QzRmlsbENvbG9yID0gMDsKICAgICBtX3BGb3JtUmVzb3VyY2UgPSBOVUxMOwpAQCAtMjA1LDEzICsyMDUsMTMgQEAKICAgICBkZWxldGUgbV9wT2JqZWN0UmVuZGVyZXI7CiB9CiAKLUZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OkluaXRpYWxpemUoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKK2Jvb2wgQ1BERl9SZW5kZXJTdGF0dXM6OkluaXRpYWxpemUoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcERldmljZU1hdHJpeCwgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3RvcE9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJTdGF0dXMqIHBQYXJlbnRTdGF0ZSwgY29uc3QgQ1BERl9HcmFwaGljU3RhdGVzKiBwSW5pdGlhbFN0YXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywgaW50IHRyYW5zcGFyZW5jeSwgRlhfQk9PTCBiRHJvcE9iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSwgRlhfQk9PTCBiU3RkQ1MsIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBpbnQgdHJhbnNwYXJlbmN5LCBib29sIGJEcm9wT2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlLCBib29sIGJTdGRDUywgQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbF9jb2xvciwgRlhfRFdPUkQgR3JvdXBGYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJMb2FkTWFzaykKIHsKICAgICBtX3BDb250ZXh0ID0gcENvbnRleHQ7CiAgICAgbV9wRGV2aWNlID0gcERldmljZTsKQEAgLTI1Myw3ICsyNTMsNyBAQAogICAgIH0KICAgICBtX3BPYmplY3RSZW5kZXJlciA9IE5VTEw7CiAgICAgbV9UcmFuc3BhcmVuY3kgPSB0cmFuc3BhcmVuY3k7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpSZW5kZXJPYmplY3RMaXN0KGNvbnN0IENQREZfUGFnZU9iamVjdHMqIHBPYmpzLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKIHsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogICAgICAgICBpbmRleCArKzsKICAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwQ3VyT2JqID0gcE9ianMtPkdldE5leHRPYmplY3QocG9zKTsKICAgICAgICAgaWYgKHBDdXJPYmogPT0gbV9wU3RvcE9iaikgewotICAgICAgICAgICAgbV9iU3RvcHBlZCA9IFRSVUU7CisgICAgICAgICAgICBtX2JTdG9wcGVkID0gdHJ1ZTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBpZiAoIXBDdXJPYmopIHsKQEAgLTMwMSw0MiArMzAxLDQyIEBACiAgICAgfQogICAgIFByb2Nlc3NPYmplY3ROb0NsaXAocE9iaiwgcE9iajJEZXZpY2UpOwogfQotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6Q29udGludWVTaW5nbGVPYmplY3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgSUZYX1BhdXNlKiBwUGF1c2UpCitib29sIENQREZfUmVuZGVyU3RhdHVzOjpDb250aW51ZVNpbmdsZU9iamVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICBpZiAobV9wT2JqZWN0UmVuZGVyZXIpIHsKICAgICAgICAgaWYgKG1fcE9iamVjdFJlbmRlcmVyLT5Db250aW51ZShwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmICghbV9wT2JqZWN0UmVuZGVyZXItPm1fUmVzdWx0KSB7CiAgICAgICAgICAgICBEcmF3T2JqV2l0aEJhY2tncm91bmQocE9iaiwgcE9iajJEZXZpY2UpOwogICAgICAgICB9CiAgICAgICAgIGRlbGV0ZSBtX3BPYmplY3RSZW5kZXJlcjsKICAgICAgICAgbV9wT2JqZWN0UmVuZGVyZXIgPSBOVUxMOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9wQ3VyT2JqID0gcE9iajsKICAgICBpZiAobV9PcHRpb25zLm1fcE9DQ29udGV4dCAmJiBwT2JqLT5tX0NvbnRlbnRNYXJrLk5vdE51bGwoKSkKICAgICAgICAgaWYgKCFtX09wdGlvbnMubV9wT0NDb250ZXh0LT5DaGVja09iamVjdFZpc2libGUocE9iaikpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIFByb2Nlc3NDbGlwUGF0aChwT2JqLT5tX0NsaXBQYXRoLCBwT2JqMkRldmljZSk7CiAgICAgaWYgKFByb2Nlc3NUcmFuc3BhcmVuY3kocE9iaiwgcE9iajJEZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAocE9iai0+bV9UeXBlID09IFBERlBBR0VfSU1BR0UpIHsKICAgICAgICAgbV9wT2JqZWN0UmVuZGVyZXIgPSBJUERGX09iamVjdFJlbmRlcmVyOjpDcmVhdGUocE9iai0+bV9UeXBlKTsKLSAgICAgICAgaWYgKCFtX3BPYmplY3RSZW5kZXJlci0+U3RhcnQodGhpcywgcE9iaiwgcE9iajJEZXZpY2UsIEZBTFNFKSkgeworICAgICAgICBpZiAoIW1fcE9iamVjdFJlbmRlcmVyLT5TdGFydCh0aGlzLCBwT2JqLCBwT2JqMkRldmljZSwgZmFsc2UpKSB7CiAgICAgICAgICAgICBpZiAoIW1fcE9iamVjdFJlbmRlcmVyLT5tX1Jlc3VsdCkgewogICAgICAgICAgICAgICAgIERyYXdPYmpXaXRoQmFja2dyb3VuZChwT2JqLCBwT2JqMkRldmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWxldGUgbV9wT2JqZWN0UmVuZGVyZXI7CiAgICAgICAgICAgICBtX3BPYmplY3RSZW5kZXJlciA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2luZ2xlT2JqZWN0KHBPYmosIHBPYmoyRGV2aWNlLCBwUGF1c2UpOwogICAgIH0KICAgICBQcm9jZXNzT2JqZWN0Tm9DbGlwKHBPYmosIHBPYmoyRGV2aWNlKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogSVBERl9PYmplY3RSZW5kZXJlciogSVBERl9PYmplY3RSZW5kZXJlcjo6Q3JlYXRlKGludCB0eXBlKQogewpAQCAtMzQ1LDcgKzM0NSw3IEBACiAgICAgfQogICAgIHJldHVybiBuZXcgQ1BERl9JbWFnZVJlbmRlcmVyOwogfQotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6R2V0T2JqZWN0Q2xpcHBlZFJlY3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiTG9naWNhbCwgRlhfUkVDVCAmcmVjdCkgY29uc3QKK2Jvb2wgQ1BERl9SZW5kZXJTdGF0dXM6OkdldE9iamVjdENsaXBwZWRSZWN0KGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIGJvb2wgYkxvZ2ljYWwsIEZYX1JFQ1QgJnJlY3QpIGNvbnN0CiB7CiAgICAgcmVjdCA9IHBPYmotPkdldEJCb3gocE9iajJEZXZpY2UpOwogICAgIEZYX1JFQ1QgcnRDbGlwID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7CkBAIC0zNzAsNyArMzcwLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBGWF9SRUNUIHJlY3Q7Ci0gICAgaWYgKEdldE9iamVjdENsaXBwZWRSZWN0KHBPYmosIHBPYmoyRGV2aWNlLCBGQUxTRSwgcmVjdCkpIHsKKyAgICBpZiAoR2V0T2JqZWN0Q2xpcHBlZFJlY3QocE9iaiwgcE9iajJEZXZpY2UsIGZhbHNlLCByZWN0KSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlmIChtX0RpdGhlckJpdHMgPT0gMikgewpAQCAtMzg2LDcgKzM4Niw3IEBACiB9CiB2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzT2JqZWN0Tm9DbGlwKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCiB7Ci0gICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7CisgICAgYm9vbCBiUmV0ID0gZmFsc2U7CiAgICAgc3dpdGNoIChwT2JqLT5tX1R5cGUpIHsKICAgICAgICAgY2FzZSBQREZQQUdFX1RFWFQ6CiAgICAgICAgICAgICBiUmV0ID0gUHJvY2Vzc1RleHQoKENQREZfVGV4dE9iamVjdCopcE9iaiwgcE9iajJEZXZpY2UsIE5VTEwpOwpAQCAtNDA4LDkgKzQwOCw5IEBACiAgICAgICAgIERyYXdPYmpXaXRoQmFja2dyb3VuZChwT2JqLCBwT2JqMkRldmljZSk7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6RHJhd09ialdpdGhCbGVuZChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQorYm9vbCBDUERGX1JlbmRlclN0YXR1czo6RHJhd09ialdpdGhCbGVuZChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQogewotICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOworICAgIGJvb2wgYlJldCA9IGZhbHNlOwogICAgIHN3aXRjaCAocE9iai0+bV9UeXBlKSB7CiAgICAgICAgIGNhc2UgUERGUEFHRV9QQVRIOgogICAgICAgICAgICAgYlJldCA9IFByb2Nlc3NQYXRoKChDUERGX1BhdGhPYmplY3QqKXBPYmosIHBPYmoyRGV2aWNlKTsKQEAgLTQzMyw3ICs0MzMsNyBAQAogdm9pZCBDUERGX1JlbmRlclN0YXR1czo6RHJhd09ialdpdGhCYWNrZ3JvdW5kKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCiB7CiAgICAgRlhfUkVDVCByZWN0OwotICAgIGlmIChHZXRPYmplY3RDbGlwcGVkUmVjdChwT2JqLCBwT2JqMkRldmljZSwgRkFMU0UsIHJlY3QpKSB7CisgICAgaWYgKEdldE9iamVjdENsaXBwZWRSZWN0KHBPYmosIHBPYmoyRGV2aWNlLCBmYWxzZSwgcmVjdCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpbnQgcmVzID0gMzAwOwpAQCAtNDU5LDExICs0NTksMTEgQEAKICAgICBzdGF0dXMuUmVuZGVyU2luZ2xlT2JqZWN0KHBPYmosICZtYXRyaXgpOwogICAgIGJ1ZmZlci5PdXRwdXRUb0RldmljZSgpOwogfQotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc0Zvcm0oQ1BERl9Gb3JtT2JqZWN0KiBwRm9ybU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCitib29sIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzRm9ybShDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBPQyA9IHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdChGWF9CU1RSQygiT0MiKSk7CiAgICAgaWYgKHBPQyAmJiBtX09wdGlvbnMubV9wT0NDb250ZXh0ICYmICFtX09wdGlvbnMubV9wT0NDb250ZXh0LT5DaGVja09DR1Zpc2libGUocE9DKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4ID0gcEZvcm1PYmotPm1fRm9ybU1hdHJpeDsKICAgICBtYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7CkBAIC00NzMsMTUgKzQ3MywxNSBAQAogICAgIH0KICAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7CiAgICAgc3RhdHVzLkluaXRpYWxpemUobV9wQ29udGV4dCwgbV9wRGV2aWNlLCBOVUxMLCBtX3BTdG9wT2JqLAotICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHBGb3JtT2JqLCAmbV9PcHRpb25zLCBtX1RyYW5zcGFyZW5jeSwgbV9iRHJvcE9iamVjdHMsIHBSZXNvdXJjZXMsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBwRm9ybU9iaiwgJm1fT3B0aW9ucywgbV9UcmFuc3BhcmVuY3ksIG1fYkRyb3BPYmplY3RzLCBwUmVzb3VyY2VzLCBmYWxzZSk7CiAgICAgc3RhdHVzLm1fY3VyQmxlbmQgPSBtX2N1ckJsZW5kOwogICAgIG1fcERldmljZS0+U2F2ZVN0YXRlKCk7CiAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QocEZvcm1PYmotPm1fcEZvcm0sICZtYXRyaXgpOwogICAgIG1fYlN0b3BwZWQgPSBzdGF0dXMubV9iU3RvcHBlZDsKICAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBJc0F2YWlsYWJsZU1hdHJpeChjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpCitib29sIElzQXZhaWxhYmxlTWF0cml4KGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCkKIHsKICAgICBpZiAobWF0cml4LmEgPT0gMCB8fCBtYXRyaXguZCA9PSAwKSB7CiAgICAgICAgIHJldHVybiBtYXRyaXguYiAhPSAwICYmIG1hdHJpeC5jICE9IDA7CkBAIC00ODksMTUgKzQ4OSwxNSBAQAogICAgIGlmIChtYXRyaXguYiA9PSAwIHx8IG1hdHJpeC5jID09IDApIHsKICAgICAgICAgcmV0dXJuIG1hdHJpeC5hICE9IDAgJiYgbWF0cml4LmQgIT0gMDsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzUGF0aChDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKK2Jvb2wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NQYXRoKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQogewogICAgIGludCBGaWxsVHlwZSA9IHBQYXRoT2JqLT5tX0ZpbGxUeXBlOwotICAgIEZYX0JPT0wgYlN0cm9rZSA9IHBQYXRoT2JqLT5tX2JTdHJva2U7CisgICAgYm9vbCBiU3Ryb2tlID0gcFBhdGhPYmotPm1fYlN0cm9rZTsKICAgICBQcm9jZXNzUGF0aFBhdHRlcm4ocFBhdGhPYmosIHBPYmoyRGV2aWNlLCBGaWxsVHlwZSwgYlN0cm9rZSk7CiAgICAgaWYgKEZpbGxUeXBlID09IDAgJiYgIWJTdHJva2UpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBGWF9EV09SRCBmaWxsX2FyZ2IgPSAwOwogICAgIGlmIChGaWxsVHlwZSkgewpAQCAtNTEwLDcgKzUxMCw3IEBACiAgICAgQ0ZYX0FmZmluZU1hdHJpeCBwYXRoX21hdHJpeCA9IHBQYXRoT2JqLT5tX01hdHJpeDsKICAgICBwYXRoX21hdHJpeC5Db25jYXQoKnBPYmoyRGV2aWNlKTsKICAgICBpZiAoIUlzQXZhaWxhYmxlTWF0cml4KHBhdGhfbWF0cml4KSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChGaWxsVHlwZSAmJiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfUkVDVF9BQSkpIHsKICAgICAgICAgRmlsbFR5cGUgfD0gRlhGSUxMX1JFQ1RfQUE7CkBAIC01NDYsNyArNTQ2LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIHBEb2NDYWNoZS0+R2V0VHJhbnNmZXJGdW5jKHBPYmopOwogfQotRlhfQVJHQiBDUERGX1JlbmRlclN0YXR1czo6R2V0RmlsbEFyZ2IoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBGWF9CT09MIGJUeXBlMykgY29uc3QKK0ZYX0FSR0IgQ1BERl9SZW5kZXJTdGF0dXM6OkdldEZpbGxBcmdiKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgYm9vbCBiVHlwZTMpIGNvbnN0CiB7CiAgICAgQ1BERl9Db2xvclN0YXRlRGF0YSogcENvbG9yRGF0YSA9IChDUERGX0NvbG9yU3RhdGVEYXRhKikoY29uc3QgQ1BERl9Db2xvclN0YXRlRGF0YSopcE9iai0+bV9Db2xvclN0YXRlOwogICAgIGlmIChtX3BUeXBlM0NoYXIgJiYgIWJUeXBlMyAmJiAoIW1fcFR5cGUzQ2hhci0+bV9iQ29sb3JlZCB8fCAobV9wVHlwZTNDaGFyLT5tX2JDb2xvcmVkICYmICghcENvbG9yRGF0YSB8fCBwQ29sb3JEYXRhLT5tX0ZpbGxDb2xvci5Jc051bGwoKSkpKSkgewpAQCAtNjEyLDcgKzYxMiw3IEBACiAgICAgICAgIGlmIChtX0xhc3RDbGlwUGF0aC5Jc051bGwoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKFRSVUUpOworICAgICAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSh0cnVlKTsKICAgICAgICAgbV9MYXN0Q2xpcFBhdGguU2V0TnVsbCgpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNjIwLDcgKzYyMCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbV9MYXN0Q2xpcFBhdGggPSBDbGlwUGF0aDsKLSAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZShUUlVFKTsKKyAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSh0cnVlKTsKICAgICBpbnQgbkNsaXBQYXRoID0gQ2xpcFBhdGguR2V0UGF0aENvdW50KCk7CiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IG5DbGlwUGF0aDsgaSsrKSB7CkBAIC02OTAsNyArNjkwLDcgQEAKICAgICAgICAgbV9wRGV2aWNlLT5EcmF3UGF0aChwUGF0aERhdGEsIHBPYmoyRGV2aWNlLCAmc3Ryb2tlX3N0YXRlLCAwLCAweGZmZmYwMDAwLCBmaWxsX21vZGUpOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OlNlbGVjdENsaXBQYXRoKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJTdHJva2UpCitib29sIENQREZfUmVuZGVyU3RhdHVzOjpTZWxlY3RDbGlwUGF0aChDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgYm9vbCBiU3Ryb2tlKQogewogICAgIENGWF9BZmZpbmVNYXRyaXggcGF0aF9tYXRyaXggPSBwUGF0aE9iai0+bV9NYXRyaXg7CiAgICAgcGF0aF9tYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7CkBAIC03MDcsMTIgKzcwNywxMiBAQAogICAgIH0KICAgICByZXR1cm4gbV9wRGV2aWNlLT5TZXRDbGlwX1BhdGhGaWxsKHBQYXRoT2JqLT5tX1BhdGgsICZwYXRoX21hdHJpeCwgZmlsbF9tb2RlKTsKIH0KLUZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NUcmFuc3BhcmVuY3koY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCitib29sIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzVHJhbnNwYXJlbmN5KGNvbnN0IENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQogewogICAgIGNvbnN0IENQREZfR2VuZXJhbFN0YXRlRGF0YSogcEdlbmVyYWxTdGF0ZSA9IHBQYWdlT2JqLT5tX0dlbmVyYWxTdGF0ZTsKICAgICBpbnQgYmxlbmRfdHlwZSA9IHBHZW5lcmFsU3RhdGUgPyBwR2VuZXJhbFN0YXRlLT5tX0JsZW5kVHlwZSA6IEZYRElCX0JMRU5EX05PUk1BTDsKICAgICBpZiAoYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9VTlNVUFBPUlRFRCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSogcFNNYXNrRGljdCA9IHBHZW5lcmFsU3RhdGUgPyAoQ1BERl9EaWN0aW9uYXJ5KilwR2VuZXJhbFN0YXRlLT5tX3BTb2Z0TWFzayA6IE5VTEw7CiAgICAgaWYgKHBTTWFza0RpY3QpIHsKQEAgLTcyNCw3ICs3MjQsNyBAQAogICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSA9IE5VTEw7CiAgICAgRlhfRkxPQVQgZ3JvdXBfYWxwaGEgPSAxLjBmOwogICAgIGludCBUcmFuc3BhcmVuY3kgPSBtX1RyYW5zcGFyZW5jeTsKLSAgICBGWF9CT09MIGJHcm91cFRyYW5zcGFyZW50ID0gRkFMU0U7CisgICAgYm9vbCBiR3JvdXBUcmFuc3BhcmVudCA9IGZhbHNlOwogICAgIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfRk9STSkgewogICAgICAgICBDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqID0gKENQREZfRm9ybU9iamVjdCopcFBhZ2VPYmo7CiAgICAgICAgIGNvbnN0IENQREZfR2VuZXJhbFN0YXRlRGF0YSAqcFN0YXRlRGF0YSA9IHBGb3JtT2JqLT5tX0dlbmVyYWxTdGF0ZS5HZXRPYmplY3QoKTsKQEAgLTczMiwxNSArNzMyLDE1IEBACiAgICAgICAgICAgICBncm91cF9hbHBoYSA9IHBTdGF0ZURhdGEtPm1fRmlsbEFscGhhOwogICAgICAgICB9CiAgICAgICAgIFRyYW5zcGFyZW5jeSA9IHBGb3JtT2JqLT5tX3BGb3JtLT5tX1RyYW5zcGFyZW5jeTsKLSAgICAgICAgYkdyb3VwVHJhbnNwYXJlbnQgPSBUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19JU09MQVRFRCA/IFRSVUUgOiBGQUxTRTsKKyAgICAgICAgYkdyb3VwVHJhbnNwYXJlbnQgPSBUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19JU09MQVRFRCA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgaWYgKHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdCkgewogICAgICAgICAgICAgcEZvcm1SZXNvdXJjZSA9IHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIik7CiAgICAgICAgIH0KICAgICB9Ci0gICAgRlhfQk9PTCBiVGV4dENsaXAgPSBGQUxTRTsKKyAgICBib29sIGJUZXh0Q2xpcCA9IGZhbHNlOwogICAgIGlmIChwUGFnZU9iai0+bV9DbGlwUGF0aC5Ob3ROdWxsKCkgJiYgcFBhZ2VPYmotPm1fQ2xpcFBhdGguR2V0VGV4dENvdW50KCkgJiYKICAgICAgICAgICAgIG1fcERldmljZS0+R2V0RGV2aWNlQ2xhc3MoKSA9PSBGWERDX0RJU1BMQVkgJiYgIShtX3BEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19SRU5ERVJfQ0FQUykgJiBGWFJDX1NPRlRfQ0xJUCkpIHsKLSAgICAgICAgYlRleHRDbGlwID0gVFJVRTsKKyAgICAgICAgYlRleHRDbGlwID0gdHJ1ZTsKICAgICB9CiAgICAgaWYgKChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9PVkVSUFJJTlQpICYmIHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9JTUFHRSAmJiBwR2VuZXJhbFN0YXRlICYmIHBHZW5lcmFsU3RhdGUtPm1fRmlsbE9QICYmIHBHZW5lcmFsU3RhdGUtPm1fU3Ryb2tlT1ApIHsKICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gTlVMTDsKQEAgLTc2MywxMSArNzYzLDExIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHBTTWFza0RpY3QgPT0gTlVMTCAmJiBncm91cF9hbHBoYSA9PSAxLjBmICYmIGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmICFiVGV4dENsaXAgJiYgIWJHcm91cFRyYW5zcGFyZW50KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBGWF9CT09MIGlzb2xhdGVkID0gVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQ7CisgICAgYm9vbCBpc29sYXRlZCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEOwogICAgIGlmIChtX2JQcmludCkgewotICAgICAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiUmV0ID0gZmFsc2U7CiAgICAgICAgIGludCByZW5kQ2FwcyA9IG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpOwogICAgICAgICBpZiAoISgoVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQpIHx8IHBTTWFza0RpY3QgfHwgYlRleHRDbGlwKSAmJiAocmVuZENhcHMgJiBGWFJDX0JMRU5EX01PREUpKSB7CiAgICAgICAgICAgICBpbnQgb2xkQmxlbmQgPSBtX2N1ckJsZW5kOwpAQCAtNzc4LDEyICs3NzgsMTIgQEAKICAgICAgICAgaWYgKCFiUmV0KSB7CiAgICAgICAgICAgICBEcmF3T2JqV2l0aEJhY2tncm91bmQocFBhZ2VPYmosIHBPYmoyRGV2aWNlKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIEZYX1JFQ1QgcmVjdCA9IHBQYWdlT2JqLT5HZXRCQm94KHBPYmoyRGV2aWNlKTsKICAgICByZWN0LkludGVyc2VjdChtX3BEZXZpY2UtPkdldENsaXBCb3goKSk7CiAgICAgaWYgKHJlY3QuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQ0ZYX01hdHJpeCBkZXZpY2VDVE0gPSBtX3BEZXZpY2UtPkdldENUTSgpOwogICAgIEZYX0ZMT0FUIHNjYWxlWCA9IEZYU1lTX2ZhYnMoZGV2aWNlQ1RNLmEpOwpAQCAtNzk1LDEyICs3OTUsMTIgQEAKICAgICBpZiAoIWlzb2xhdGVkICYmIChtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfR0VUX0JJVFMpKSB7CiAgICAgICAgIG9yaURldmljZSA9IG5ldyBDRlhfRElCaXRtYXA7CiAgICAgICAgIGlmICghbV9wRGV2aWNlLT5DcmVhdGVDb21wYXRpYmxlQml0bWFwKG9yaURldmljZSwgd2lkdGgsIGhlaWdodCkpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgbV9wRGV2aWNlLT5HZXRESUJpdHMob3JpRGV2aWNlLCByZWN0LmxlZnQsIHJlY3QudG9wKTsKICAgICB9CiAgICAgaWYgKCFiaXRtYXBfZGV2aWNlLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9BcmdiLCAwLCBvcmlEZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQ0ZYX0RJQml0bWFwKiBiaXRtYXAgPSBiaXRtYXBfZGV2aWNlLkdldEJpdG1hcCgpOwogICAgIGJpdG1hcC0+Q2xlYXIoMCk7CkBAIC04MTIsNyArODEyLDcgQEAKICAgICAgICAgcFRleHRNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKICAgICAgICAgaWYgKCFwVGV4dE1hc2stPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKICAgICAgICAgICAgIGRlbGV0ZSBwVGV4dE1hc2s7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHBUZXh0TWFzay0+Q2xlYXIoMCk7CiAgICAgICAgIENGWF9GeGdlRGV2aWNlIHRleHRfZGV2aWNlOwpAQCAtODMxLDcgKzgzMSw3IEBACiAgICAgfQogICAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7CiAgICAgYml0bWFwX3JlbmRlci5Jbml0aWFsaXplKG1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdG9wT2JqLCBOVUxMLCBOVUxMLCAmbV9PcHRpb25zLCAwLCBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0b3BPYmosIE5VTEwsIE5VTEwsICZtX09wdGlvbnMsIDAsIG1fYkRyb3BPYmplY3RzLCBwRm9ybVJlc291cmNlLCB0cnVlKTsKICAgICBiaXRtYXBfcmVuZGVyLlByb2Nlc3NPYmplY3ROb0NsaXAocFBhZ2VPYmosICZuZXdfbWF0cml4KTsKICAgICBtX2JTdG9wcGVkID0gYml0bWFwX3JlbmRlci5tX2JTdG9wcGVkOwogICAgIGlmIChwU01hc2tEaWN0KSB7CkBAIC04NTgsMTAgKzg1OCwxMCBAQAogICAgIH0KICAgICBDb21wb3NpdGVESUJpdG1hcChiaXRtYXAsIHJlY3QubGVmdCwgcmVjdC50b3AsIDAsIDI1NSwgYmxlbmRfdHlwZSwgVHJhbnNwYXJlbmN5KTsKICAgICBkZWxldGUgb3JpRGV2aWNlOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQ0ZYX0RJQml0bWFwKiBDUERGX1JlbmRlclN0YXR1czo6R2V0QmFja2Ryb3AoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBGWF9SRUNUJiByZWN0LCBpbnQmIGxlZnQsIGludCYgdG9wLAotICAgICAgICBGWF9CT09MIGJCYWNrQWxwaGFSZXF1aXJlZCkKKyAgICAgICAgYm9vbCBiQmFja0FscGhhUmVxdWlyZWQpCiB7CiAgICAgRlhfUkVDVCBiYm94ID0gcmVjdDsKICAgICBiYm94LkludGVyc2VjdChtX3BEZXZpY2UtPkdldENsaXBCb3goKSk7CkBAIC04ODIsNyArODgyLDcgQEAKICAgICAgICAgZGVsZXRlIHBCYWNrZHJvcDsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIEZYX0JPT0wgYk5lZWREcmF3OworICAgIGJvb2wgYk5lZWREcmF3OwogICAgIGlmIChwQmFja2Ryb3AtPkhhc0FscGhhKCkpIHsKICAgICAgICAgYk5lZWREcmF3ID0gIShtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQUxQSEFfT1VUUFVUKTsKICAgICB9IGVsc2UgewpAQCAtOTExLDcgKzkxMSw3IEBACiAgICAgZGV2aWNlLkZpbGxSZWN0KCZyZWN0LCAweGZmZmZmZmZmKTsKICAgICBSZW5kZXIoJmRldmljZSwgcE9iaiwgcE9wdGlvbnMsIHBGaW5hbE1hdHJpeCk7CiB9Ci1DUERGX0dyYXBoaWNTdGF0ZXMqIENQREZfUmVuZGVyU3RhdHVzOjpDbG9uZU9ialN0YXRlcyhjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMqIHBTcmNTdGF0ZXMsIEZYX0JPT0wgYlN0cm9rZSkKK0NQREZfR3JhcGhpY1N0YXRlcyogQ1BERl9SZW5kZXJTdGF0dXM6OkNsb25lT2JqU3RhdGVzKGNvbnN0IENQREZfR3JhcGhpY1N0YXRlcyogcFNyY1N0YXRlcywgYm9vbCBiU3Ryb2tlKQogewogICAgIGlmICghcFNyY1N0YXRlcykgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTkzMiwxNCArOTMyLDE0IEBACiB7CiB9CiB2b2lkIENQREZfUmVuZGVyQ29udGV4dDo6Q3JlYXRlKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwUGFnZUNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLCBGWF9CT09MIGJGaXJzdExheWVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLCBib29sIGJGaXJzdExheWVyKQogewogICAgIG1fcERvY3VtZW50ID0gcERvYzsKICAgICBtX3BQYWdlUmVzb3VyY2VzID0gcFBhZ2VSZXNvdXJjZXM7CiAgICAgbV9wUGFnZUNhY2hlID0gcFBhZ2VDYWNoZTsKICAgICBtX2JGaXJzdExheWVyID0gYkZpcnN0TGF5ZXI7CiB9Ci12b2lkIENQREZfUmVuZGVyQ29udGV4dDo6Q3JlYXRlKENQREZfUGFnZSogcFBhZ2UsIEZYX0JPT0wgYkZpcnN0TGF5ZXIpCit2b2lkIENQREZfUmVuZGVyQ29udGV4dDo6Q3JlYXRlKENQREZfUGFnZSogcFBhZ2UsIGJvb2wgYkZpcnN0TGF5ZXIpCiB7CiAgICAgbV9wRG9jdW1lbnQgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7CiAgICAgbV9wUGFnZVJlc291cmNlcyA9IHBQYWdlLT5tX3BQYWdlUmVzb3VyY2VzOwpAQCAtOTU0LDcgKzk1NCw3IEBACiAgICAgbV9wRG9jdW1lbnQgPSBOVUxMOwogICAgIG1fcFBhZ2VSZXNvdXJjZXMgPSBOVUxMOwogICAgIG1fcFBhZ2VDYWNoZSA9IE5VTEw7Ci0gICAgbV9iRmlyc3RMYXllciA9IFRSVUU7CisgICAgbV9iRmlyc3RMYXllciA9IHRydWU7CiAgICAgbV9Db250ZW50TGlzdC5SZW1vdmVBbGwoKTsKIH0KIHZvaWQgQ1BERl9SZW5kZXJDb250ZXh0OjpBcHBlbmRPYmplY3RMaXN0KENQREZfUGFnZU9iamVjdHMqIHBPYmpzLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSkKQEAgLTk4NCw3ICs5ODQsNyBAQAogICAgICAgICAgICAgRmluYWxNYXRyaXguQ29uY2F0KCpwTGFzdE1hdHJpeCk7CiAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7CiAgICAgICAgICAgICBzdGF0dXMuSW5pdGlhbGl6ZSh0aGlzLCBwRGV2aWNlLCBwTGFzdE1hdHJpeCwgcFN0b3BPYmosIE5VTEwsIE5VTEwsIHBPcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEl0ZW0tPm1fcE9iamVjdExpc3QtPm1fVHJhbnNwYXJlbmN5LCBGQUxTRSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSXRlbS0+bV9wT2JqZWN0TGlzdC0+bV9UcmFuc3BhcmVuY3ksIGZhbHNlLCBOVUxMKTsKICAgICAgICAgICAgIHN0YXR1cy5SZW5kZXJPYmplY3RMaXN0KHBJdGVtLT5tX3BPYmplY3RMaXN0LCAmRmluYWxNYXRyaXgpOwogICAgICAgICAgICAgaWYgKHN0YXR1cy5tX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9MSU1JVEVESU1BR0VDQUNIRSkgewogICAgICAgICAgICAgICAgIG1fcFBhZ2VDYWNoZS0+Q2FjaGVPcHRpbWl6YXRpb24oc3RhdHVzLm1fT3B0aW9ucy5tX2R3TGltaXRDYWNoZVNpemUpOwpAQCAtOTk2LDcgKzk5Niw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7CiAgICAgICAgICAgICBzdGF0dXMuSW5pdGlhbGl6ZSh0aGlzLCBwRGV2aWNlLCBOVUxMLCBwU3RvcE9iaiwgTlVMTCwgTlVMTCwgcE9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSXRlbS0+bV9wT2JqZWN0TGlzdC0+bV9UcmFuc3BhcmVuY3ksIEZBTFNFLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJdGVtLT5tX3BPYmplY3RMaXN0LT5tX1RyYW5zcGFyZW5jeSwgZmFsc2UsIE5VTEwpOwogICAgICAgICAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QocEl0ZW0tPm1fcE9iamVjdExpc3QsICZwSXRlbS0+bV9NYXRyaXgpOwogICAgICAgICAgICAgaWYgKHN0YXR1cy5tX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9MSU1JVEVESU1BR0VDQUNIRSkgewogICAgICAgICAgICAgICAgIG1fcFBhZ2VDYWNoZS0+Q2FjaGVPcHRpbWl6YXRpb24oc3RhdHVzLm1fT3B0aW9ucy5tX2R3TGltaXRDYWNoZVNpemUpOwpAQCAtMTA5MCw3ICsxMDkwLDcgQEAKICAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy5yZXNldChuZXcgQ1BERl9SZW5kZXJTdGF0dXMoKSk7CiAgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPkluaXRpYWxpemUoCiAgICAgICAgICAgICAgICAgbV9wQ29udGV4dCwgbV9wRGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBtX3BPcHRpb25zLAotICAgICAgICAgICAgICAgIHBJdGVtLT5tX3BPYmplY3RMaXN0LT5tX1RyYW5zcGFyZW5jeSwgRkFMU0UsIE5VTEwpOworICAgICAgICAgICAgICAgIHBJdGVtLT5tX3BPYmplY3RMaXN0LT5tX1RyYW5zcGFyZW5jeSwgZmFsc2UsIE5VTEwpOwogICAgICAgICAgICAgbV9wRGV2aWNlLT5TYXZlU3RhdGUoKTsKICAgICAgICAgICAgIG1fQ2xpcFJlY3QgPSBtX3BEZXZpY2UtPkdldENsaXBCb3goKTsKICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggZGV2aWNlMm9iamVjdDsKQEAgLTExNzEsMTAgKzExNzEsMTAgQEAKICAgICB9CiAKICAgICBDUERGX0Z1bmN0aW9uKiBwRnVuY3NbM10gPSB7IG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIgfTsKLSAgICBGWF9CT09MIGJVbmlUcmFuc2ZlciA9IFRSVUU7Ci0gICAgRlhfQk9PTCBiSWRlbnRpdHkgPSBUUlVFOworICAgIGJvb2wgYlVuaVRyYW5zZmVyID0gdHJ1ZTsKKyAgICBib29sIGJJZGVudGl0eSA9IHRydWU7CiAgICAgaWYgKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgYlVuaVRyYW5zZmVyID0gRkFMU0U7CisgICAgICAgIGJVbmlUcmFuc2ZlciA9IGZhbHNlOwogICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcE9iajsKICAgICAgICAgaWYgKHBBcnJheS0+R2V0Q291bnQoKSA8IDMpCiAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTEyMDgsNyArMTIwOCw3IEBACiAgICAgICAgICAgICAgICAgcEZ1bmNzWzBdLT5DYWxsKCZpbnB1dCwgMSwgb3V0cHV0LCBub3V0cHV0KTsKICAgICAgICAgICAgIGludCBvID0gRlhTWVNfcm91bmQob3V0cHV0WzBdICogMjU1KTsKICAgICAgICAgICAgIGlmIChvICE9IHYpCi0gICAgICAgICAgICAgICAgYklkZW50aXR5ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYklkZW50aXR5ID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgICAgICAgICAgICAgIHBUcmFuc2Zlci0+bV9TYW1wbGVzW2kgKiAyNTYgKyB2XSA9IG87CiAgICAgICAgICAgICB9CkBAIC0xMjE4LDcgKzEyMTgsNyBAQAogICAgICAgICAgICAgICAgICAgICBwRnVuY3NbaV0tPkNhbGwoJmlucHV0LCAxLCBvdXRwdXQsIG5vdXRwdXQpOwogICAgICAgICAgICAgICAgICAgICBpbnQgbyA9IEZYU1lTX3JvdW5kKG91dHB1dFswXSAqIDI1NSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvICE9IHYpCi0gICAgICAgICAgICAgICAgICAgICAgICBiSWRlbnRpdHkgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJJZGVudGl0eSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBwVHJhbnNmZXItPm1fU2FtcGxlc1tpICogMjU2ICsgdl0gPSBvOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2Zlci0+bV9TYW1wbGVzW2kgKiAyNTYgKyB2XSA9IHY7CkBAIC0xMjU4LDcgKzEyNTgsNyBAQAogewogICAgIGRlbGV0ZSBtX3BCaXRtYXA7CiB9Ci1GWF9CT09MIENQREZfRGV2aWNlQnVmZmVyOjpJbml0aWFsaXplKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIEZYX1JFQ1QqIHBSZWN0LAorYm9vbCBDUERGX0RldmljZUJ1ZmZlcjo6SW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBGWF9SRUNUKiBwUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBpbnQgbWF4X2RwaSkKIHsKICAgICBtX3BEZXZpY2UgPSBwRGV2aWNlOwpAQCAtMTI4OSw3ICsxMjg5LDcgQEAKICAgICBGWF9SRUNUIGJpdG1hcF9yZWN0ID0gcmVjdC5HZXRPdXR0ZXJSZWN0KCk7CiAgICAgbV9wQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKICAgICBtX3BCaXRtYXAtPkNyZWF0ZShiaXRtYXBfcmVjdC5XaWR0aCgpLCBiaXRtYXBfcmVjdC5IZWlnaHQoKSwgRlhESUJfQXJnYik7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENQREZfRGV2aWNlQnVmZmVyOjpPdXRwdXRUb0RldmljZSgpCiB7CkBAIC0xMzE2LDEzICsxMzE2LDEzIEBACiAgICAgZGVsZXRlIG1fcEJpdG1hcERldmljZTsKIH0KICNkZWZpbmUgX0ZQREZBUElfSU1BR0VTSVpFX0xJTUlUXwkoMzAgKiAxMDI0ICogMTAyNCkKLUZYX0JPT0wgQ1BERl9TY2FsZWRSZW5kZXJCdWZmZXI6OkluaXRpYWxpemUoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgRlhfUkVDVCogcFJlY3QsCitib29sIENQREZfU2NhbGVkUmVuZGVyQnVmZmVyOjpJbml0aWFsaXplKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIEZYX1JFQ1QqIHBSZWN0LAogICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyAqcE9wdGlvbnMsIGludCBtYXhfZHBpKQogewogICAgIEZYU1lTX2Fzc2VydChwUmVjdCAhPSBOVUxMKTsKICAgICBtX3BEZXZpY2UgPSBwRGV2aWNlOwogICAgIGlmIChtX3BEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19SRU5ERVJfQ0FQUykgJiBGWFJDX0dFVF9CSVRTKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgbV9wQ29udGV4dCA9IHBDb250ZXh0OwogICAgIG1fUmVjdCA9ICpwUmVjdDsKQEAgLTEzNTcsNyArMTM1Nyw3IEBACiAgICAgICAgIGlIZWlnaHQgPSBiaXRtYXBfcmVjdC5IZWlnaHQoKTsKICAgICAgICAgaVBpdGNoID0gKGlXaWR0aCAqIGJwcCArIDMxKSAvIDMyICogNDsKICAgICAgICAgaWYgKGlXaWR0aCAqIGlIZWlnaHQgPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlQaXRjaCAqIGlIZWlnaHQgPD0gX0ZQREZBUElfSU1BR0VTSVpFX0xJTUlUXyAmJgogICAgICAgICAgICAgICAgIG1fcEJpdG1hcERldmljZS0+Q3JlYXRlKGlXaWR0aCwgaUhlaWdodCwgZGliRm9ybWF0KSkgewpAQCAtMTM2Niw3ICsxMzY2LDcgQEAKICAgICAgICAgbV9NYXRyaXguU2NhbGUoMC41ZiwgMC41Zik7CiAgICAgfQogICAgIG1fcENvbnRleHQtPkdldEJhY2tncm91bmQobV9wQml0bWFwRGV2aWNlLT5HZXRCaXRtYXAoKSwgbV9wT2JqZWN0LCBwT3B0aW9ucywgJm1fTWF0cml4KTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ1BERl9TY2FsZWRSZW5kZXJCdWZmZXI6Ok91dHB1dFRvRGV2aWNlKCkKIHsKQEAgLTEzNzQsNyArMTM3NCw3IEBACiAgICAgICAgIG1fcERldmljZS0+U3RyZXRjaERJQml0cyhtX3BCaXRtYXBEZXZpY2UtPkdldEJpdG1hcCgpLCBtX1JlY3QubGVmdCwgbV9SZWN0LnRvcCwgbV9SZWN0LldpZHRoKCksIG1fUmVjdC5IZWlnaHQoKSk7CiAgICAgfQogfQotRlhfQk9PTCBJUERGX09DQ29udGV4dDo6Q2hlY2tPYmplY3RWaXNpYmxlKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaikKK2Jvb2wgSVBERl9PQ0NvbnRleHQ6OkNoZWNrT2JqZWN0VmlzaWJsZShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmopCiB7CiAgICAgY29uc3QgQ1BERl9Db250ZW50TWFya0RhdGEqIHBEYXRhID0gcE9iai0+bV9Db250ZW50TWFyazsKICAgICBpbnQgbkl0ZW1zID0gcERhdGEtPkNvdW50SXRlbXMoKTsKQEAgLTEzODMsOSArMTM4Myw5IEBACiAgICAgICAgIGlmIChpdGVtLkdldE5hbWUoKSA9PSBGWF9CU1RSQygiT0MiKSAmJiBpdGVtLkdldFBhcmFtVHlwZSgpID09IENQREZfQ29udGVudE1hcmtJdGVtOjpQcm9wZXJ0aWVzRGljdCkgewogICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwT0NHID0gKENQREZfRGljdGlvbmFyeSopaXRlbS5HZXRQYXJhbSgpOwogICAgICAgICAgICAgaWYgKCFDaGVja09DR1Zpc2libGUocE9DRykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9jYWNoZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2NhY2hlLmNwcAppbmRleCBjZGJlY2Q2Li5kOTc2N2I0IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2NhY2hlLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2NhY2hlLmNwcApAQCAtMTA4LDE2ICsxMDgsMTYgQEAKICAgICByZXR1cm4gcEltYWdlQ2FjaGUtPkVzdGltYXRlU2l6ZSgpOwogfQogdm9pZCBDUERGX1BhZ2VSZW5kZXJDYWNoZTo6R2V0Q2FjaGVkQml0bWFwKENQREZfU3RyZWFtKiBwU3RyZWFtLCBDRlhfRElCU291cmNlKiYgcEJpdG1hcCwgQ0ZYX0RJQlNvdXJjZSomIHBNYXNrLCBGWF9EV09SRCYgTWF0dGVDb2xvciwKLSAgICAgICAgRlhfQk9PTCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBGWF9CT09MIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsCisgICAgICAgIGJvb2wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgYm9vbCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLAogICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0KQogewogICAgIENQREZfSW1hZ2VDYWNoZSogcEltYWdlQ2FjaGU7Ci0gICAgRlhfQk9PTCBiRmluZCA9IG1fSW1hZ2VDYWNoZXMuTG9va3VwKHBTdHJlYW0sICh2b2lkKiYpcEltYWdlQ2FjaGUpOworICAgIGJvb2wgYkZpbmQgPSBtX0ltYWdlQ2FjaGVzLkxvb2t1cChwU3RyZWFtLCAodm9pZComKXBJbWFnZUNhY2hlKTsKICAgICBpZiAoIWJGaW5kKSB7CiAgICAgICAgIHBJbWFnZUNhY2hlID0gbmV3IENQREZfSW1hZ2VDYWNoZShtX3BQYWdlLT5tX3BEb2N1bWVudCwgcFN0cmVhbSk7CiAgICAgfQogICAgIG1fblRpbWVDb3VudCArKzsKLSAgICBGWF9CT09MIGJDYWNoZWQgPSBwSW1hZ2VDYWNoZS0+R2V0Q2FjaGVkQml0bWFwKHBCaXRtYXAsIHBNYXNrLCBNYXR0ZUNvbG9yLCBtX3BQYWdlLT5tX3BQYWdlUmVzb3VyY2VzLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2ssIHBSZW5kZXJTdGF0dXMsIGRvd25zYW1wbGVXaWR0aCwgZG93bnNhbXBsZUhlaWdodCk7CisgICAgYm9vbCBiQ2FjaGVkID0gcEltYWdlQ2FjaGUtPkdldENhY2hlZEJpdG1hcChwQml0bWFwLCBwTWFzaywgTWF0dGVDb2xvciwgbV9wUGFnZS0+bV9wUGFnZVJlc291cmNlcywgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrLCBwUmVuZGVyU3RhdHVzLCBkb3duc2FtcGxlV2lkdGgsIGRvd25zYW1wbGVIZWlnaHQpOwogICAgIGlmICghYkZpbmQpIHsKICAgICAgICAgbV9JbWFnZUNhY2hlcy5TZXRBdChwU3RyZWFtLCBwSW1hZ2VDYWNoZSk7CiAgICAgfQpAQCAtMTI1LDcgKzEyNSw3IEBACiAgICAgICAgIG1fbkNhY2hlU2l6ZSArPSBwSW1hZ2VDYWNoZS0+RXN0aW1hdGVTaXplKCk7CiAgICAgfQogfQotRlhfQk9PTAlDUERGX1BhZ2VSZW5kZXJDYWNoZTo6U3RhcnRHZXRDYWNoZWRCaXRtYXAoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgRlhfQk9PTCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLCBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0KQorYm9vbAlDUERGX1BhZ2VSZW5kZXJDYWNoZTo6U3RhcnRHZXRDYWNoZWRCaXRtYXAoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIGJvb2wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgYm9vbCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLCBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0KQogewogICAgIG1fYkN1ckZpbmRDYWNoZSA9IG1fSW1hZ2VDYWNoZXMuTG9va3VwKHBTdHJlYW0sICh2b2lkKiYpbV9wQ3VySW1hZ2VDYWNoZSk7CiAgICAgaWYgKCFtX2JDdXJGaW5kQ2FjaGUpIHsKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgIH0KICAgICBpbnQgcmV0ID0gbV9wQ3VySW1hZ2VDYWNoZS0+U3RhcnRHZXRDYWNoZWRCaXRtYXAocFJlbmRlclN0YXR1cy0+bV9wRm9ybVJlc291cmNlLCBtX3BQYWdlLT5tX3BQYWdlUmVzb3VyY2VzLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2ssIHBSZW5kZXJTdGF0dXMsIGRvd25zYW1wbGVXaWR0aCwgZG93bnNhbXBsZUhlaWdodCk7CiAgICAgaWYgKHJldCA9PSAyKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgbV9uVGltZUNvdW50ICsrOwogICAgIGlmICghbV9iQ3VyRmluZENhY2hlKSB7CkBAIC0xNDIsMTMgKzE0MiwxMyBAQAogICAgIGlmICghcmV0KSB7CiAgICAgICAgIG1fbkNhY2hlU2l6ZSArPSBtX3BDdXJJbWFnZUNhY2hlLT5Fc3RpbWF0ZVNpemUoKTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wJQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQorYm9vbAlDUERGX1BhZ2VSZW5kZXJDYWNoZTo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaW50IHJldCA9IG1fcEN1ckltYWdlQ2FjaGUtPkNvbnRpbnVlKHBQYXVzZSk7CiAgICAgaWYgKHJldCA9PSAyKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgbV9uVGltZUNvdW50ICsrOwogICAgIGlmICghbV9iQ3VyRmluZENhY2hlKSB7CkBAIC0xNTcsNyArMTU3LDcgQEAKICAgICBpZiAoIXJldCkgewogICAgICAgICBtX25DYWNoZVNpemUgKz0gbV9wQ3VySW1hZ2VDYWNoZS0+RXN0aW1hdGVTaXplKCk7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiB2b2lkIENQREZfUGFnZVJlbmRlckNhY2hlOjpSZXNldEJpdG1hcChDUERGX1N0cmVhbSogcFN0cmVhbSwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwKQogewpAQCAtMjIyLDE4ICsyMjIsMTggQEAKIHsKICAgICByZXR1cm4gcERJQiAmJiBwRElCLT5HZXRCdWZmZXIoKSA/IChGWF9EV09SRClwRElCLT5HZXRIZWlnaHQoKSAqIHBESUItPkdldFBpdGNoKCkgKyAoRlhfRFdPUkQpcERJQi0+R2V0UGFsZXR0ZVNpemUoKSAqIDQgOiAwOwogfQotRlhfQk9PTCBDUERGX0ltYWdlQ2FjaGU6OkdldENhY2hlZEJpdG1hcChDRlhfRElCU291cmNlKiYgcEJpdG1hcCwgQ0ZYX0RJQlNvdXJjZSomIHBNYXNrLCBGWF9EV09SRCYgTWF0dGVDb2xvciwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKLSAgICAgICAgRlhfQk9PTCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBGWF9CT09MIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsCitib29sIENQREZfSW1hZ2VDYWNoZTo6R2V0Q2FjaGVkQml0bWFwKENGWF9ESUJTb3VyY2UqJiBwQml0bWFwLCBDRlhfRElCU291cmNlKiYgcE1hc2ssIEZYX0RXT1JEJiBNYXR0ZUNvbG9yLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAorICAgICAgICBib29sIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIGJvb2wgYkxvYWRNYXNrLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywKICAgICAgICAgaW50MzJfdCBkb3duc2FtcGxlV2lkdGgsIGludDMyX3QgZG93bnNhbXBsZUhlaWdodCkKIHsKICAgICBpZiAobV9wQ2FjaGVkQml0bWFwKSB7CiAgICAgICAgIHBCaXRtYXAgPSBtX3BDYWNoZWRCaXRtYXA7CiAgICAgICAgIHBNYXNrID0gbV9wQ2FjaGVkTWFzazsKICAgICAgICAgTWF0dGVDb2xvciA9IG1fTWF0dGVDb2xvcjsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoIXBSZW5kZXJTdGF0dXMpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfUmVuZGVyQ29udGV4dCpwQ29udGV4dCA9IHBSZW5kZXJTdGF0dXMtPkdldENvbnRleHQoKTsKICAgICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcFBhZ2VSZW5kZXJDYWNoZSA9IHBDb250ZXh0LT5tX3BQYWdlQ2FjaGU7CkBAIC0yNDMsNyArMjQzLDcgQEAKICAgICBpZiAoIXBTcmMtPkxvYWQobV9wRG9jdW1lbnQsIG1fcFN0cmVhbSwgJnBNYXNrU3JjLCAmTWF0dGVDb2xvciwgcFJlbmRlclN0YXR1cy0+bV9wRm9ybVJlc291cmNlLCBwUGFnZVJlc291cmNlcywgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrKSkgewogICAgICAgICBkZWxldGUgcFNyYzsKICAgICAgICAgcEJpdG1hcCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX01hdHRlQ29sb3IgPSBNYXR0ZUNvbG9yOwogICAgIGlmIChwU3JjLT5HZXRQaXRjaCgpICogcFNyYy0+R2V0SGVpZ2h0KCkgPCBGUERGX0hVR0VfSU1BR0VfU0laRSkgewpAQCAtMjYwLDcgKzI2MCw3IEBACiAgICAgcEJpdG1hcCA9IG1fcENhY2hlZEJpdG1hcDsKICAgICBwTWFzayA9IG1fcENhY2hlZE1hc2s7CiAgICAgQ2FsY1NpemUoKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogQ0ZYX0RJQlNvdXJjZSogQ1BERl9JbWFnZUNhY2hlOjpEZXRhY2hCaXRtYXAoKQogewpAQCAtMjc0LDggKzI3NCw4IEBACiAgICAgbV9wQ3VyTWFzayA9IE5VTEw7CiAgICAgcmV0dXJuIHBESUJTb3VyY2U7CiB9Ci1pbnQJQ1BERl9JbWFnZUNhY2hlOjpTdGFydEdldENhY2hlZEJpdG1hcChDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLCBGWF9CT09MIGJTdGRDUywKLSAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywKK2ludAlDUERGX0ltYWdlQ2FjaGU6OlN0YXJ0R2V0Q2FjaGVkQml0bWFwKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsIGJvb2wgYlN0ZENTLAorICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSwgYm9vbCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLAogICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0KQogewogICAgIGlmIChtX3BDYWNoZWRCaXRtYXApIHsKQEAgLTI4OCw3ICsyODgsNyBAQAogICAgIH0KICAgICBtX3BSZW5kZXJTdGF0dXMgPSBwUmVuZGVyU3RhdHVzOwogICAgIG1fcEN1ckJpdG1hcCA9IG5ldyBDUERGX0RJQlNvdXJjZTsKLSAgICBpbnQgcmV0ID0gKChDUERGX0RJQlNvdXJjZSopbV9wQ3VyQml0bWFwKS0+U3RhcnRMb2FkRElCU291cmNlKG1fcERvY3VtZW50LCBtX3BTdHJlYW0sIFRSVUUsIHBGb3JtUmVzb3VyY2VzLCBwUGFnZVJlc291cmNlcywgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrKTsKKyAgICBpbnQgcmV0ID0gKChDUERGX0RJQlNvdXJjZSopbV9wQ3VyQml0bWFwKS0+U3RhcnRMb2FkRElCU291cmNlKG1fcERvY3VtZW50LCBtX3BTdHJlYW0sIHRydWUsIHBGb3JtUmVzb3VyY2VzLCBwUGFnZVJlc291cmNlcywgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrKTsKICAgICBpZiAocmV0ID09IDIpIHsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC0zNDcsNyArMzQ3LDcgQEAKICAgICBpZiAobV9wRG9jUmVuZGVyKSB7CiAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSA9IG1fcERvY1JlbmRlci0+R2V0Rm9udENhY2hlKCk7CiAgICAgICAgIGlmIChwQ2FjaGUpIHsKLSAgICAgICAgICAgIHBDYWNoZS0+RnJlZUNhY2hlKEZBTFNFKTsKKyAgICAgICAgICAgIHBDYWNoZS0+RnJlZUNhY2hlKGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfaW1hZ2UuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9pbWFnZS5jcHAKaW5kZXggZmE5MzI1YS4uMjU4YWQxMSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9pbWFnZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9pbWFnZS5jcHAKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlICIuLi9mcGRmX3BhZ2UvcGFnZWludC5oIgogI2luY2x1ZGUgInJlbmRlcl9pbnQuaCIKIAotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc0ltYWdlKENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCitib29sIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzSW1hZ2UoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKIHsKICAgICBDUERGX0ltYWdlUmVuZGVyZXIgcmVuZGVyOwogICAgIGlmIChyZW5kZXIuU3RhcnQodGhpcywgcEltYWdlT2JqLCBwT2JqMkRldmljZSwgbV9iU3RkQ1MsIG1fY3VyQmxlbmQpKSB7CkBAIC0yNyw4ICsyNyw4IEBACiAgICAgaWYgKHBESUJpdG1hcCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgRlhfQk9PTCBiSXNvbGF0ZWQgPSBUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19JU09MQVRFRDsKLSAgICBGWF9CT09MIGJHcm91cCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0dST1VQOworICAgIGJvb2wgYklzb2xhdGVkID0gVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQ7CisgICAgYm9vbCBiR3JvdXAgPSBUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19HUk9VUDsKICAgICBpZiAoYmxlbmRfbW9kZSA9PSBGWERJQl9CTEVORF9OT1JNQUwpIHsKICAgICAgICAgaWYgKCFwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKICAgICAgICAgICAgIGlmIChiaXRtYXBfYWxwaGEgPCAyNTUpIHsKQEAgLTQ3LDggKzQ3LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBGWF9CT09MIGJCYWNrQWxwaGFSZXF1aXJlZCA9IGJsZW5kX21vZGUgJiYgYklzb2xhdGVkICYmICFtX2JEcm9wT2JqZWN0czsKLSAgICBGWF9CT09MIGJHZXRCYWNrR3JvdW5kID0gKChtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQUxQSEFfT1VUUFVUKSkgfHwKKyAgICBib29sIGJCYWNrQWxwaGFSZXF1aXJlZCA9IGJsZW5kX21vZGUgJiYgYklzb2xhdGVkICYmICFtX2JEcm9wT2JqZWN0czsKKyAgICBib29sIGJHZXRCYWNrR3JvdW5kID0gKChtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQUxQSEFfT1VUUFVUKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCEobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0FMUEhBX09VVFBVVCkgJiYgKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBGWFJDX0dFVF9CSVRTKSAmJiAhYkJhY2tBbHBoYVJlcXVpcmVkKTsKICAgICBpZiAoYkdldEJhY2tHcm91bmQpIHsKQEAgLTYxLDkgKzYxLDkgQEAKICAgICAgICAgICAgIEZYX1JFQ1QgcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBwRElCaXRtYXAtPkdldFdpZHRoKCksIHRvcCArIHBESUJpdG1hcC0+R2V0SGVpZ2h0KCkpOwogICAgICAgICAgICAgcmVjdC5JbnRlcnNlY3QobV9wRGV2aWNlLT5HZXRDbGlwQm94KCkpOwogICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQ2xvbmUgPSBOVUxMOwotICAgICAgICAgICAgRlhfQk9PTCBiQ2xvbmUgPSBGQUxTRTsKKyAgICAgICAgICAgIGJvb2wgYkNsb25lID0gZmFsc2U7CiAgICAgICAgICAgICBpZiAobV9wRGV2aWNlLT5HZXRCYWNrRHJvcCgpICYmIG1fcERldmljZS0+R2V0Qml0bWFwKCkpIHsKLSAgICAgICAgICAgICAgICBiQ2xvbmUgPSBUUlVFOworICAgICAgICAgICAgICAgIGJDbG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgcENsb25lID0gbV9wRGV2aWNlLT5HZXRCYWNrRHJvcCgpLT5DbG9uZSgmcmVjdCk7CiAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwICpwRm9yZUJpdG1hcCA9IG1fcERldmljZS0+R2V0Qml0bWFwKCk7CiAgICAgICAgICAgICAgICAgcENsb25lLT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgcENsb25lLT5HZXRXaWR0aCgpLCBwQ2xvbmUtPkdldEhlaWdodCgpLCBwRm9yZUJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCk7CkBAIC0xMTgsNyArMTE4LDcgQEAKICAgICByZXR1cm4gRlhTWVNfUkdCKG1fU2FtcGxlc1tGWFNZU19HZXRSVmFsdWUocmdiKV0sIG1fU2FtcGxlc1syNTYgKyBGWFNZU19HZXRHVmFsdWUocmdiKV0sCiAgICAgICAgICAgICAgICAgICAgICBtX1NhbXBsZXNbNTEyICsgRlhTWVNfR2V0QlZhbHVlKHJnYildKTsKIH0KLUNGWF9ESUJTb3VyY2UqIENQREZfVHJhbnNmZXJGdW5jOjpUcmFuc2xhdGVJbWFnZShjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBGWF9CT09MIGJBdXRvRHJvcFNyYykKK0NGWF9ESUJTb3VyY2UqIENQREZfVHJhbnNmZXJGdW5jOjpUcmFuc2xhdGVJbWFnZShjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBib29sIGJBdXRvRHJvcFNyYykKIHsKICAgICBDUERGX0RJQlRyYW5zZmVyRnVuYyogcERlc3QgPSBuZXcgQ1BERl9ESUJUcmFuc2ZlckZ1bmModGhpcyk7CiAgICAgcERlc3QtPkxvYWRTcmMocFNyYywgYkF1dG9Ecm9wU3JjKTsKQEAgLTE0NCw3ICsxNDQsNyBAQAogdm9pZCBDUERGX0RJQlRyYW5zZmVyRnVuYzo6VHJhbnNsYXRlU2NhbmxpbmUodWludDhfdCogZGVzdF9idWYsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYpIGNvbnN0CiB7CiAgICAgaW50IGk7Ci0gICAgRlhfQk9PTCBiU2tpcCA9IEZBTFNFOworICAgIGJvb2wgYlNraXAgPSBmYWxzZTsKICAgICBzd2l0Y2ggKG1fcFNyYy0+R2V0Rm9ybWF0KCkpIHsKICAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOiB7CiAgICAgICAgICAgICAgICAgaW50IHIwID0gbV9SYW1wUlswXSwgZzAgPSBtX1JhbXBHWzBdLCBiMCA9IG1fUmFtcEJbMF07CkBAIC0yMTMsNyArMjEzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEZYRElCX1JnYjMyOgotICAgICAgICAgICAgYlNraXAgPSBUUlVFOworICAgICAgICAgICAgYlNraXAgPSB0cnVlOwogICAgICAgICBjYXNlIEZYRElCX0FyZ2I6CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9XaWR0aDsgaSArKykgewogICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wQlsqKHNyY19idWYrKyldOwpAQCAtMjY2LDMxICsyNjYsMzEgQEAKICAgICAgICAgICAgIH0KICAgICB9CiB9Ci1zdGF0aWMgRlhfQk9PTCBfSXNTdXBwb3J0ZWQoQ1BERl9Db2xvclNwYWNlKiBwQ1MpCitzdGF0aWMgYm9vbCBfSXNTdXBwb3J0ZWQoQ1BERl9Db2xvclNwYWNlKiBwQ1MpCiB7CiAgICAgaWYgKHBDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfREVWSUNFUkdCIHx8IHBDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfREVWSUNFR1JBWSB8fAogICAgICAgICAgICAgcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19ERVZJQ0VDTVlLIHx8IHBDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfQ0FMR1JBWSB8fAogICAgICAgICAgICAgcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19DQUxSR0IpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAocENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19JTkRFWEVEICYmIF9Jc1N1cHBvcnRlZChwQ1MtPkdldEJhc2VDUygpKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBDUERGX0ltYWdlUmVuZGVyZXI6OkNQREZfSW1hZ2VSZW5kZXJlcigpCiB7CiAgICAgbV9wUmVuZGVyU3RhdHVzID0gTlVMTDsKICAgICBtX3BJbWFnZU9iamVjdCA9IE5VTEw7Ci0gICAgbV9SZXN1bHQgPSBUUlVFOworICAgIG1fUmVzdWx0ID0gdHJ1ZTsKICAgICBtX1N0YXR1cyA9IDA7CiAgICAgbV9wUXVpY2tTdHJldGNoZXIgPSBOVUxMOwogICAgIG1fcFRyYW5zZm9ybWVyID0gTlVMTDsKICAgICBtX0RldmljZUhhbmRsZSA9IE5VTEw7CiAgICAgbV9Mb2FkSGFuZGxlID0gTlVMTDsKICAgICBtX3BDbG9uZSA9IE5VTEw7Ci0gICAgbV9iU3RkQ1MgPSBGQUxTRTsKLSAgICBtX2JQYXR0ZXJuQ29sb3IgPSBGQUxTRTsKKyAgICBtX2JTdGRDUyA9IGZhbHNlOworICAgIG1fYlBhdHRlcm5Db2xvciA9IGZhbHNlOwogICAgIG1fQmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMOwogICAgIG1fcFBhdHRlcm4gPSBOVUxMOwogICAgIG1fcE9iajJEZXZpY2UgPSBOVUxMOwpAQCAtMzA1LDcgKzMwNSw3IEBACiAgICAgZGVsZXRlIChDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGUqKW1fTG9hZEhhbmRsZTsKICAgICBkZWxldGUgbV9wQ2xvbmU7CiB9Ci1GWF9CT09MIENQREZfSW1hZ2VSZW5kZXJlcjo6U3RhcnRMb2FkRElCU291cmNlKCkKK2Jvb2wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydExvYWRESUJTb3VyY2UoKQogewogICAgIENGWF9GbG9hdFJlY3QgaW1hZ2VfcmVjdF9mID0gbV9JbWFnZU1hdHJpeC5HZXRVbml0UmVjdCgpOwogICAgIEZYX1JFQ1QgaW1hZ2VfcmVjdCA9IGltYWdlX3JlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7CkBAIC0zMjEsMTYgKzMyMSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fR3JvdXBGYW1pbHksIG1fcFJlbmRlclN0YXR1cy0+bV9iTG9hZE1hc2ssIG1fcFJlbmRlclN0YXR1cywgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpKSB7CiAgICAgICAgIGlmIChtX0xvYWRIYW5kbGUgIT0gTlVMTCkgewogICAgICAgICAgICAgbV9TdGF0dXMgPSA0OwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydFJlbmRlckRJQlNvdXJjZSgpCitib29sIENQREZfSW1hZ2VSZW5kZXJlcjo6U3RhcnRSZW5kZXJESUJTb3VyY2UoKQogewogICAgIGlmIChtX0xvYWRlci5tX3BCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9CaXRtYXBBbHBoYSA9IDI1NTsKICAgICBjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBHZW5lcmFsU3RhdGUgPSBtX3BJbWFnZU9iamVjdC0+bV9HZW5lcmFsU3RhdGU7CkBAIC0zNTAsMTggKzM1MCwxOCBAQAogICAgICAgICAgICAgaWYgKG1fTG9hZGVyLm1fYkNhY2hlZCAmJiBtX0xvYWRlci5tX3BNYXNrKSB7CiAgICAgICAgICAgICAgICAgbV9Mb2FkZXIubV9wTWFzayA9IG1fTG9hZGVyLm1fcE1hc2stPkNsb25lKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX0xvYWRlci5tX2JDYWNoZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIG1fTG9hZGVyLm1fYkNhY2hlZCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIG1fRmlsbEFyZ2IgPSAwOwotICAgIG1fYlBhdHRlcm5Db2xvciA9IEZBTFNFOworICAgIG1fYlBhdHRlcm5Db2xvciA9IGZhbHNlOwogICAgIG1fcFBhdHRlcm4gPSBOVUxMOwogICAgIGlmIChtX3BESUJTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKICAgICAgICAgQ1BERl9Db2xvciogcENvbG9yID0gbV9wSW1hZ2VPYmplY3QtPm1fQ29sb3JTdGF0ZS5HZXRGaWxsQ29sb3IoKTsKICAgICAgICAgaWYgKHBDb2xvciAmJiBwQ29sb3ItPklzUGF0dGVybigpKSB7CiAgICAgICAgICAgICBtX3BQYXR0ZXJuID0gcENvbG9yLT5HZXRQYXR0ZXJuKCk7CiAgICAgICAgICAgICBpZiAobV9wUGF0dGVybiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbV9iUGF0dGVybkNvbG9yID0gVFJVRTsKKyAgICAgICAgICAgICAgICBtX2JQYXR0ZXJuQ29sb3IgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1fRmlsbEFyZ2IgPSBtX3BSZW5kZXJTdGF0dXMtPkdldEZpbGxBcmdiKG1fcEltYWdlT2JqZWN0KTsKQEAgLTQzMCw3ICs0MzAsNyBAQAogICAgIH0KICAgICByZXR1cm4gU3RhcnRESUJTb3VyY2UoKTsKIH0KLUZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFN0YXR1cywgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiU3RkQ1MsIGludCBibGVuZFR5cGUpCitib29sIENQREZfSW1hZ2VSZW5kZXJlcjo6U3RhcnQoQ1BERl9SZW5kZXJTdGF0dXMqIHBTdGF0dXMsIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIGJvb2wgYlN0ZENTLCBpbnQgYmxlbmRUeXBlKQogewogICAgIG1fcFJlbmRlclN0YXR1cyA9IHBTdGF0dXM7CiAgICAgbV9iU3RkQ1MgPSBiU3RkQ1M7CkBAIC00MzksMTcgKzQzOSwxNyBAQAogICAgIG1fcE9iajJEZXZpY2UgPSBwT2JqMkRldmljZTsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBPQyA9IG1fcEltYWdlT2JqZWN0LT5tX3BJbWFnZS0+R2V0T0MoKTsKICAgICBpZiAocE9DICYmIG1fcFJlbmRlclN0YXR1cy0+bV9PcHRpb25zLm1fcE9DQ29udGV4dCAmJiAhbV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9wT0NDb250ZXh0LT5DaGVja09DR1Zpc2libGUocE9DKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9JbWFnZU1hdHJpeCA9IG1fcEltYWdlT2JqZWN0LT5tX01hdHJpeDsKICAgICBtX0ltYWdlTWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOwogICAgIGlmIChTdGFydExvYWRESUJTb3VyY2UoKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBTdGFydFJlbmRlckRJQlNvdXJjZSgpOwogfQotRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwU3RhdHVzLCBjb25zdCBDRlhfRElCU291cmNlKiBwRElCU291cmNlLCBGWF9BUkdCIGJpdG1hcF9hcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBJbWFnZTJEZXZpY2UsIEZYX0RXT1JEIGZsYWdzLCBGWF9CT09MIGJTdGRDUywgaW50IGJsZW5kVHlwZSkKK2Jvb2wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFN0YXR1cywgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcERJQlNvdXJjZSwgRlhfQVJHQiBiaXRtYXBfYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlLCBGWF9EV09SRCBmbGFncywgYm9vbCBiU3RkQ1MsIGludCBibGVuZFR5cGUpCiB7CiAgICAgbV9wUmVuZGVyU3RhdHVzID0gcFN0YXR1czsKICAgICBtX3BESUJTb3VyY2UgPSBwRElCU291cmNlOwpAQCAtNDYxLDE2ICs0NjEsMTYgQEAKICAgICBtX0JsZW5kVHlwZSA9IGJsZW5kVHlwZTsKICAgICByZXR1cm4gU3RhcnRESUJTb3VyY2UoKTsKIH0KLUZYX0JPT0wJQ1BERl9JbWFnZVJlbmRlcmVyOjpEcmF3UGF0dGVybkltYWdlKGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlKQorYm9vbAlDUERGX0ltYWdlUmVuZGVyZXI6OkRyYXdQYXR0ZXJuSW1hZ2UoY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UpCiB7CiAgICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9iUHJpbnQgJiYgIShtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19CTEVORF9NT0RFKSkgewotICAgICAgICBtX1Jlc3VsdCA9IEZBTFNFOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIG1fUmVzdWx0ID0gZmFsc2U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfUkVDVCByZWN0ID0gbV9JbWFnZU1hdHJpeC5HZXRVbml0UmVjdCgpLkdldE91dHRlclJlY3QoKTsKICAgICByZWN0LkludGVyc2VjdChtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsKICAgICBpZiAocmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9BZmZpbmVNYXRyaXggbmV3X21hdHJpeCA9IG1fSW1hZ2VNYXRyaXg7CiAgICAgbmV3X21hdHJpeC5UcmFuc2xhdGVJKC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7CkBAIC00NzgsMzIgKzQ3OCwzMiBAQAogICAgIGludCBoZWlnaHQgPSByZWN0LkhlaWdodCgpOwogICAgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2UxOwogICAgIGlmICghYml0bWFwX2RldmljZTEuQ3JlYXRlKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgRlhESUJfUmdiMzIpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPkNsZWFyKDB4ZmZmZmZmKTsKICAgICB7CiAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7CiAgICAgICAgIGJpdG1hcF9yZW5kZXIuSW5pdGlhbGl6ZShtX3BSZW5kZXJTdGF0dXMtPm1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlMSwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsICZtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucywgMCwgbV9wUmVuZGVyU3RhdHVzLT5tX2JEcm9wT2JqZWN0cywgTlVMTCwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCAmbV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMsIDAsIG1fcFJlbmRlclN0YXR1cy0+bV9iRHJvcE9iamVjdHMsIE5VTEwsIHRydWUpOwogICAgICAgICBDRlhfTWF0cml4IHBhdHRlcm5EZXZpY2UgPSAqcE9iajJEZXZpY2U7CiAgICAgICAgIHBhdHRlcm5EZXZpY2UuVHJhbnNsYXRlKChGWF9GTE9BVCkgLSByZWN0LmxlZnQsIChGWF9GTE9BVCkgLSByZWN0LnRvcCk7CiAgICAgICAgIGlmKG1fcFBhdHRlcm4tPm1fUGF0dGVyblR5cGUgPT0gUEFUVEVSTl9USUxJTkcpIHsKLSAgICAgICAgICAgIGJpdG1hcF9yZW5kZXIuRHJhd1RpbGluZ1BhdHRlcm4oKENQREZfVGlsaW5nUGF0dGVybiopbV9wUGF0dGVybiwgbV9wSW1hZ2VPYmplY3QsICZwYXR0ZXJuRGV2aWNlLCBGQUxTRSk7CisgICAgICAgICAgICBiaXRtYXBfcmVuZGVyLkRyYXdUaWxpbmdQYXR0ZXJuKChDUERGX1RpbGluZ1BhdHRlcm4qKW1fcFBhdHRlcm4sIG1fcEltYWdlT2JqZWN0LCAmcGF0dGVybkRldmljZSwgZmFsc2UpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYml0bWFwX3JlbmRlci5EcmF3U2hhZGluZ1BhdHRlcm4oKENQREZfU2hhZGluZ1BhdHRlcm4qKW1fcFBhdHRlcm4sIG1fcEltYWdlT2JqZWN0LCAmcGF0dGVybkRldmljZSwgRkFMU0UpOworICAgICAgICAgICAgYml0bWFwX3JlbmRlci5EcmF3U2hhZGluZ1BhdHRlcm4oKENQREZfU2hhZGluZ1BhdHRlcm4qKW1fcFBhdHRlcm4sIG1fcEltYWdlT2JqZWN0LCAmcGF0dGVybkRldmljZSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogICAgIHsKICAgICAgICAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTI7CiAgICAgICAgIGlmICghYml0bWFwX2RldmljZTIuQ3JlYXRlKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgRlhESUJfOGJwcFJnYikpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgYml0bWFwX2RldmljZTIuR2V0Qml0bWFwKCktPkNsZWFyKDApOwogICAgICAgICBDUERGX1JlbmRlclN0YXR1cyBiaXRtYXBfcmVuZGVyOwogICAgICAgICBiaXRtYXBfcmVuZGVyLkluaXRpYWxpemUobV9wUmVuZGVyU3RhdHVzLT5tX3BDb250ZXh0LCAmYml0bWFwX2RldmljZTIsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAwLCBtX3BSZW5kZXJTdGF0dXMtPm1fYkRyb3BPYmplY3RzLCBOVUxMLCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIDAsIG1fcFJlbmRlclN0YXR1cy0+bV9iRHJvcE9iamVjdHMsIE5VTEwsIHRydWUpOwogICAgICAgICBDUERGX0ltYWdlUmVuZGVyZXIgaW1hZ2VfcmVuZGVyOwotICAgICAgICBpZiAoaW1hZ2VfcmVuZGVyLlN0YXJ0KCZiaXRtYXBfcmVuZGVyLCBtX3BESUJTb3VyY2UsIDB4ZmZmZmZmZmYsIDI1NSwgJm5ld19tYXRyaXgsIG1fRmxhZ3MsIFRSVUUpKSB7CisgICAgICAgIGlmIChpbWFnZV9yZW5kZXIuU3RhcnQoJmJpdG1hcF9yZW5kZXIsIG1fcERJQlNvdXJjZSwgMHhmZmZmZmZmZiwgMjU1LCAmbmV3X21hdHJpeCwgbV9GbGFncywgdHJ1ZSkpIHsKICAgICAgICAgICAgIGltYWdlX3JlbmRlci5Db250aW51ZShOVUxMKTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9Mb2FkZXIubV9NYXR0ZUNvbG9yICE9IDB4ZmZmZmZmZmYpIHsKQEAgLTU0OSwxOCArNTQ5LDE4IEBACiAgICAgICAgIGJpdG1hcF9kZXZpY2UxLkdldEJpdG1hcCgpLT5NdWx0aXBseUFscGhhKDI1NSk7CiAgICAgfQogICAgIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TZXRESUJpdHMoYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCksIHJlY3QubGVmdCwgcmVjdC50b3AsIG1fQmxlbmRUeXBlKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OkRyYXdNYXNrZWRJbWFnZSgpCitib29sIENQREZfSW1hZ2VSZW5kZXJlcjo6RHJhd01hc2tlZEltYWdlKCkKIHsKICAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX2JQcmludCAmJiAhKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0JMRU5EX01PREUpKSB7Ci0gICAgICAgIG1fUmVzdWx0ID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgbV9SZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWF9SRUNUIHJlY3QgPSBtX0ltYWdlTWF0cml4LkdldFVuaXRSZWN0KCkuR2V0T3V0dGVyUmVjdCgpOwogICAgIHJlY3QuSW50ZXJzZWN0KG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRDbGlwQm94KCkpOwogICAgIGlmIChyZWN0LklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX0FmZmluZU1hdHJpeCBuZXdfbWF0cml4ID0gbV9JbWFnZU1hdHJpeDsKICAgICBuZXdfbWF0cml4LlRyYW5zbGF0ZUkoLXJlY3QubGVmdCwgLXJlY3QudG9wKTsKQEAgLTU2OCwyOSArNTY4LDI5IEBACiAgICAgaW50IGhlaWdodCA9IHJlY3QuSGVpZ2h0KCk7CiAgICAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTE7CiAgICAgaWYgKCFiaXRtYXBfZGV2aWNlMS5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfUmdiMzIpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPkNsZWFyKDB4ZmZmZmZmKTsKICAgICB7CiAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7CiAgICAgICAgIGJpdG1hcF9yZW5kZXIuSW5pdGlhbGl6ZShtX3BSZW5kZXJTdGF0dXMtPm1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlMSwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIDAsIG1fcFJlbmRlclN0YXR1cy0+bV9iRHJvcE9iamVjdHMsIE5VTEwsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgMCwgbV9wUmVuZGVyU3RhdHVzLT5tX2JEcm9wT2JqZWN0cywgTlVMTCwgdHJ1ZSk7CiAgICAgICAgIENQREZfSW1hZ2VSZW5kZXJlciBpbWFnZV9yZW5kZXI7Ci0gICAgICAgIGlmIChpbWFnZV9yZW5kZXIuU3RhcnQoJmJpdG1hcF9yZW5kZXIsIG1fcERJQlNvdXJjZSwgMCwgMjU1LCAmbmV3X21hdHJpeCwgbV9GbGFncywgVFJVRSkpIHsKKyAgICAgICAgaWYgKGltYWdlX3JlbmRlci5TdGFydCgmYml0bWFwX3JlbmRlciwgbV9wRElCU291cmNlLCAwLCAyNTUsICZuZXdfbWF0cml4LCBtX0ZsYWdzLCB0cnVlKSkgewogICAgICAgICAgICAgaW1hZ2VfcmVuZGVyLkNvbnRpbnVlKE5VTEwpOwogICAgICAgICB9CiAgICAgfQogICAgIHsKICAgICAgICAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTI7CiAgICAgICAgIGlmICghYml0bWFwX2RldmljZTIuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCXzhicHBSZ2IpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGJpdG1hcF9kZXZpY2UyLkdldEJpdG1hcCgpLT5DbGVhcigwKTsKICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgYml0bWFwX3JlbmRlcjsKICAgICAgICAgYml0bWFwX3JlbmRlci5Jbml0aWFsaXplKG1fcFJlbmRlclN0YXR1cy0+bV9wQ29udGV4dCwgJmJpdG1hcF9kZXZpY2UyLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgMCwgbV9wUmVuZGVyU3RhdHVzLT5tX2JEcm9wT2JqZWN0cywgTlVMTCwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAwLCBtX3BSZW5kZXJTdGF0dXMtPm1fYkRyb3BPYmplY3RzLCBOVUxMLCB0cnVlKTsKICAgICAgICAgQ1BERl9JbWFnZVJlbmRlcmVyIGltYWdlX3JlbmRlcjsKLSAgICAgICAgaWYgKGltYWdlX3JlbmRlci5TdGFydCgmYml0bWFwX3JlbmRlciwgbV9Mb2FkZXIubV9wTWFzaywgMHhmZmZmZmZmZiwgMjU1LCAmbmV3X21hdHJpeCwgbV9GbGFncywgVFJVRSkpIHsKKyAgICAgICAgaWYgKGltYWdlX3JlbmRlci5TdGFydCgmYml0bWFwX3JlbmRlciwgbV9Mb2FkZXIubV9wTWFzaywgMHhmZmZmZmZmZiwgMjU1LCAmbmV3X21hdHJpeCwgbV9GbGFncywgdHJ1ZSkpIHsKICAgICAgICAgICAgIGltYWdlX3JlbmRlci5Db250aW51ZShOVUxMKTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9Mb2FkZXIubV9NYXR0ZUNvbG9yICE9IDB4ZmZmZmZmZmYpIHsKQEAgLTYzOCw5ICs2MzgsOSBAQAogICAgICAgICB9CiAgICAgfQogICAgIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TZXRESUJpdHMoYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCksIHJlY3QubGVmdCwgcmVjdC50b3AsIG1fQmxlbmRUeXBlKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0RElCU291cmNlKCkKK2Jvb2wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydERJQlNvdXJjZSgpCiB7CiAgICAgaWYgKCEobV9GbGFncyAmIFJFTkRFUl9GT1JDRV9ET1dOU0FNUExFKSAmJiBtX3BESUJTb3VyY2UtPkdldEJQUCgpID4gMSkgewogICAgICAgICBpbnQgaW1hZ2Vfc2l6ZSA9IG1fcERJQlNvdXJjZS0+R2V0QlBQKCkgLyA4ICogbV9wRElCU291cmNlLT5HZXRXaWR0aCgpICogbV9wRElCU291cmNlLT5HZXRIZWlnaHQoKTsKQEAgLTY1Miw5ICs2NTIsOSBAQAogICAgICAgICAgICAgJm1fSW1hZ2VNYXRyaXgsIG1fRmxhZ3MsIG1fRGV2aWNlSGFuZGxlLCAwLCBOVUxMLCBtX0JsZW5kVHlwZSkpIHsKICAgICAgICAgaWYgKG1fRGV2aWNlSGFuZGxlICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1fU3RhdHVzID0gMzsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9GbG9hdFJlY3QgaW1hZ2VfcmVjdF9mID0gbV9JbWFnZU1hdHJpeC5HZXRVbml0UmVjdCgpOwogICAgIEZYX1JFQ1QgaW1hZ2VfcmVjdCA9IGltYWdlX3JlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7CkBAIC02NjMsMTUgKzY2MywxNSBAQAogICAgIGlmICgoRlhTWVNfZmFicyhtX0ltYWdlTWF0cml4LmIpID49IDAuNWYgfHwgbV9JbWFnZU1hdHJpeC5hID09IDApIHx8CiAgICAgICAgICAgICAoRlhTWVNfZmFicyhtX0ltYWdlTWF0cml4LmMpID49IDAuNWYgfHwgbV9JbWFnZU1hdHJpeC5kID09IDApICkgewogICAgICAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX2JQcmludCAmJiAhKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0JMRU5EX01PREUpKSB7Ci0gICAgICAgICAgICBtX1Jlc3VsdCA9IEZBTFNFOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgbV9SZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBGWF9SRUNUIGNsaXBfYm94ID0gbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkdldENsaXBCb3goKTsKICAgICAgICAgY2xpcF9ib3guSW50ZXJzZWN0KGltYWdlX3JlY3QpOwogICAgICAgICBtX1N0YXR1cyA9IDI7CiAgICAgICAgIG1fcFRyYW5zZm9ybWVyID0gbmV3IENGWF9JbWFnZVRyYW5zZm9ybWVyOwogICAgICAgICBtX3BUcmFuc2Zvcm1lci0+U3RhcnQobV9wRElCU291cmNlLCAmbV9JbWFnZU1hdHJpeCwgbV9GbGFncywgJmNsaXBfYm94KTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAobV9JbWFnZU1hdHJpeC5hIDwgMCkgewogICAgICAgICBkZXN0X3dpZHRoID0gLWRlc3Rfd2lkdGg7CkBAIC02ODUsNyArNjg1LDcgQEAKICAgICBpZiAobV9wRElCU291cmNlLT5Jc09wYXF1ZUltYWdlKCkgJiYgbV9CaXRtYXBBbHBoYSA9PSAyNTUpIHsKICAgICAgICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TdHJldGNoRElCaXRzKG1fcERJQlNvdXJjZSwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgbV9GbGFncywgTlVMTCwgbV9CbGVuZFR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1fcERJQlNvdXJjZS0+SXNBbHBoYU1hc2soKSkgewpAQCAtNjkzLDEyICs2OTMsMTIgQEAKICAgICAgICAgICAgIG1fRmlsbEFyZ2IgPSBGWEFSR0JfTVVMX0FMUEhBKG1fRmlsbEFyZ2IsIG1fQml0bWFwQWxwaGEpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U3RyZXRjaEJpdE1hc2sobV9wRElCU291cmNlLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgbV9GaWxsQXJnYiwgbV9GbGFncykpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX2JQcmludCAmJiAhKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0JMRU5EX01PREUpKSB7Ci0gICAgICAgIG1fUmVzdWx0ID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICBtX1Jlc3VsdCA9IGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgRlhfUkVDVCBjbGlwX2JveCA9IG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7CiAgICAgRlhfUkVDVCBkZXN0X3JlY3QgPSBjbGlwX2JveDsKQEAgLTcwOCwxMyArNzA4LDEzIEBACiAgICAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaGVkID0gbV9wRElCU291cmNlLT5TdHJldGNoVG8oZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIG1fRmxhZ3MsICZkZXN0X2NsaXApOwogICAgIGlmIChwU3RyZXRjaGVkKSB7CiAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+Q29tcG9zaXRlRElCaXRtYXAocFN0cmV0Y2hlZCwgZGVzdF9yZWN0LmxlZnQsIGRlc3RfcmVjdC50b3AsIG1fRmlsbEFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CaXRtYXBBbHBoYSwgbV9CbGVuZFR5cGUsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0JpdG1hcEFscGhhLCBtX0JsZW5kVHlwZSwgZmFsc2UpOwogICAgICAgICBkZWxldGUgcFN0cmV0Y2hlZDsKICAgICAgICAgcFN0cmV0Y2hlZCA9IE5VTEw7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZfSW1hZ2VSZW5kZXJlcjo6U3RhcnRCaXRtYXBBbHBoYSgpCitib29sIENQREZfSW1hZ2VSZW5kZXJlcjo6U3RhcnRCaXRtYXBBbHBoYSgpCiB7CiAgICAgaWYgKG1fcERJQlNvdXJjZS0+SXNPcGFxdWVJbWFnZSgpKSB7CiAgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoOwpAQCAtNzI4LDcgKzcyOCw3IEBACiAgICAgICAgICAgICBpbnQgbGVmdCwgdG9wOwogICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwVHJhbnNmb3JtZWQgPSBwQWxwaGFNYXNrLT5UcmFuc2Zvcm1UbygmbV9JbWFnZU1hdHJpeCwgbGVmdCwgdG9wKTsKICAgICAgICAgICAgIGlmIChwVHJhbnNmb3JtZWQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlNldEJpdE1hc2socFRyYW5zZm9ybWVkLCBsZWZ0LCB0b3AsIEFyZ2JFbmNvZGUoMHhmZiwgbV9CaXRtYXBBbHBoYSwgbV9CaXRtYXBBbHBoYSwgbV9CaXRtYXBBbHBoYSkpOwogICAgICAgICAgICAgZGVsZXRlIHBUcmFuc2Zvcm1lZDsKQEAgLTc0NiwxMyArNzQ2LDEzIEBACiAgICAgICAgICAgICBkZWxldGUgcEFscGhhTWFzazsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQorYm9vbCBDUERGX0ltYWdlUmVuZGVyZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQogewogICAgIGlmIChtX1N0YXR1cyA9PSAxKSB7CiAgICAgICAgIGlmIChtX3BRdWlja1N0cmV0Y2hlci0+Q29udGludWUocFBhdXNlKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9wUXVpY2tTdHJldGNoZXItPm1fcEJpdG1hcC0+SXNBbHBoYU1hc2soKSkKICAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TZXRCaXRNYXNrKG1fcFF1aWNrU3RyZXRjaGVyLT5tX3BCaXRtYXAsIG1fcFF1aWNrU3RyZXRjaGVyLT5tX1Jlc3VsdExlZnQsCkBAIC03NjAsMTUgKzc2MCwxNSBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U2V0RElCaXRzKG1fcFF1aWNrU3RyZXRjaGVyLT5tX3BCaXRtYXAsIG1fcFF1aWNrU3RyZXRjaGVyLT5tX1Jlc3VsdExlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFF1aWNrU3RyZXRjaGVyLT5tX1Jlc3VsdFRvcCwgbV9CbGVuZFR5cGUpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fU3RhdHVzID09IDIpIHsKICAgICAgICAgaWYgKG1fcFRyYW5zZm9ybWVyLT5Db250aW51ZShwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IG1fcFRyYW5zZm9ybWVyLT5tX1N0b3Jlci5EZXRhY2goKTsKICAgICAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChwQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7CiAgICAgICAgICAgICBpZiAobV9CaXRtYXBBbHBoYSAhPSAyNTUpIHsKQEAgLTc4NCwyMCArNzg0LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdExlZnQsIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdFRvcCwgbV9CbGVuZFR5cGUpOwogICAgICAgICB9CiAgICAgICAgIGRlbGV0ZSBwQml0bWFwOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fU3RhdHVzID09IDMpIHsKICAgICAgICAgcmV0dXJuIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5Db250aW51ZURJQml0cyhtX0RldmljZUhhbmRsZSwgcFBhdXNlKTsKICAgICB9CiAgICAgaWYgKG1fU3RhdHVzID09IDQpIHsKICAgICAgICAgaWYgKG1fTG9hZGVyLkNvbnRpbnVlKG1fTG9hZEhhbmRsZSwgcFBhdXNlKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoU3RhcnRSZW5kZXJESUJTb3VyY2UoKSkgewogICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlKHBQYXVzZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIENQREZfUXVpY2tTdHJldGNoZXI6OkNQREZfUXVpY2tTdHJldGNoZXIoKQogewpAQCAtODE1LDEwICs4MTUsMTAgQEAKIH0KIElDb2RlY19TY2FubGluZURlY29kZXIqIEZQREZBUElfQ3JlYXRlRmxhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgIGludCBuQ29tcHMsIGludCBicGMsIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhcmFtcyk7Ci1GWF9CT09MIENQREZfUXVpY2tTdHJldGNoZXI6OlN0YXJ0KENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwgY29uc3QgRlhfUkVDVCogcENsaXBCb3gpCitib29sIENQREZfUXVpY2tTdHJldGNoZXI6OlN0YXJ0KENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwgY29uc3QgRlhfUkVDVCogcENsaXBCb3gpCiB7CiAgICAgaWYgKEZYU1lTX2ZhYnMocEltYWdlMkRldmljZS0+YSkgPCBGWFNZU19mYWJzKHBJbWFnZTJEZXZpY2UtPmIpICogMTAgJiYgRlhTWVNfZmFicyhwSW1hZ2UyRGV2aWNlLT5kKSA8IEZYU1lTX2ZhYnMocEltYWdlMkRldmljZS0+YykgKiAxMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX0Zsb2F0UmVjdCBpbWFnZV9yZWN0X2YgPSBwSW1hZ2UyRGV2aWNlLT5HZXRVbml0UmVjdCgpOwogICAgIEZYX1JFQ1QgaW1hZ2VfcmVjdCA9IGltYWdlX3JlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7CkBAIC04MjksNyArODI5LDcgQEAKICAgICBGWF9SRUNUIHJlc3VsdF9yZWN0ID0gKnBDbGlwQm94OwogICAgIHJlc3VsdF9yZWN0LkludGVyc2VjdChpbWFnZV9yZWN0KTsKICAgICBpZiAocmVzdWx0X3JlY3QuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX1Jlc3VsdFdpZHRoID0gcmVzdWx0X3JlY3QuV2lkdGgoKTsKICAgICBtX1Jlc3VsdEhlaWdodCA9IHJlc3VsdF9yZWN0LkhlaWdodCgpOwpAQCAtODM5LDEwICs4MzksMTAgQEAKICAgICBtX0NsaXBUb3AgPSByZXN1bHRfcmVjdC50b3AgLSBpbWFnZV9yZWN0LnRvcDsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcEltYWdlT2JqLT5tX3BJbWFnZS0+R2V0RGljdCgpOwogICAgIGlmIChwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpKSAhPSA4KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAocERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJTTWFzayIpKSB8fCBwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIk1hc2siKSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fU3JjV2lkdGggPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiV2lkdGgiKSk7CiAgICAgbV9TcmNIZWlnaHQgPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiSGVpZ2h0IikpOwpAQCAtODUwLDE0ICs4NTAsMTQgQEAKICAgICBtX0JwcCA9IDM7CiAgICAgQ1BERl9PYmplY3QqIHBDU09iaiA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSk7CiAgICAgaWYgKHBDU09iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BDUyA9IENQREZfQ29sb3JTcGFjZTo6TG9hZChwSW1hZ2VPYmotPm1fcEltYWdlLT5HZXREb2N1bWVudCgpLCBwQ1NPYmopOwogICAgIGlmIChtX3BDUyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoIV9Jc1N1cHBvcnRlZChtX3BDUykpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fQnBwID0gbV9wQ1MtPkNvdW50Q29tcG9uZW50cygpOwogICAgIGlmIChtX3BDUy0+c1JHQigpKSB7CkBAIC04NjUsNyArODY1LDcgQEAKICAgICAgICAgbV9wQ1MgPSBOVUxMOwogICAgIH0KICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBJbWFnZU9iai0+bV9wSW1hZ2UtPkdldFN0cmVhbSgpOwotICAgIG1fU3RyZWFtQWNjLkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFLCBtX1NyY1dpZHRoICogbV9TcmNIZWlnaHQgKiBtX0JwcCwgVFJVRSk7CisgICAgbV9TdHJlYW1BY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgZmFsc2UsIG1fU3JjV2lkdGggKiBtX1NyY0hlaWdodCAqIG1fQnBwLCB0cnVlKTsKICAgICBtX3BEZWNvZGVyID0gTlVMTDsKICAgICBpZiAoIW1fU3RyZWFtQWNjLkdldEltYWdlRGVjb2RlcigpLklzRW1wdHkoKSkgewogICAgICAgICBpZiAobV9TdHJlYW1BY2MuR2V0SW1hZ2VEZWNvZGVyKCkgPT0gRlhfQlNUUkMoIkRDVERlY29kZSIpKSB7CkBAIC04NzgsNyArODc4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9TdHJlYW1BY2MuR2V0RGF0YSgpLCBtX1N0cmVhbUFjYy5HZXRTaXplKCksIG1fU3JjV2lkdGgsIG1fU3JjSGVpZ2h0LCBtX0JwcCwgOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9TdHJlYW1BY2MuR2V0SW1hZ2VQYXJhbSgpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBtX3BEZWNvZGVyLT5Eb3duU2NhbGUobV9EZXN0V2lkdGgsIG1fRGVzdEhlaWdodCk7CiAgICAgfQpAQCAtODg5LDkgKzg4OSw5IEBACiAgICAgbV9wQml0bWFwLT5DcmVhdGUobV9SZXN1bHRXaWR0aCwgbV9SZXN1bHRIZWlnaHQsIEZYRElCX1JnYik7CiAjZW5kaWYKICAgICBtX0xpbmVJbmRleCA9IDA7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfUXVpY2tTdHJldGNoZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQorYm9vbCBDUERGX1F1aWNrU3RyZXRjaGVyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICB1aW50OF90KiByZXN1bHRfYnVmID0gbV9wQml0bWFwLT5HZXRCdWZmZXIoKTsKICAgICBpbnQgc3JjX3dpZHRoID0gbV9wRGVjb2RlciA/IG1fcERlY29kZXItPkdldFdpZHRoKCkgOiBtX1NyY1dpZHRoOwpAQCAtOTQ1LDEwICs5NDUsMTAgQEAKICAgICAgICAgfQogICAgICAgICBtX0xpbmVJbmRleCArKzsKICAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIENGWF9ESUJpdG1hcCogQ1BERl9SZW5kZXJTdGF0dXM6OkxvYWRTTWFzayhDUERGX0RpY3Rpb25hcnkqIHBTTWFza0RpY3QsCiAgICAgICAgIEZYX1JFQ1QqIHBDbGlwUmVjdCwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCkKQEAgLTk1OSw3ICs5NTksNyBAQAogICAgIENGWF9ESUJpdG1hcCogcE1hc2sgPSBOVUxMOwogICAgIGludCB3aWR0aCA9IHBDbGlwUmVjdC0+cmlnaHQgLSBwQ2xpcFJlY3QtPmxlZnQ7CiAgICAgaW50IGhlaWdodCA9IHBDbGlwUmVjdC0+Ym90dG9tIC0gcENsaXBSZWN0LT50b3A7Ci0gICAgRlhfQk9PTCBiTHVtaW5vc2l0eSA9IEZBTFNFOworICAgIGJvb2wgYkx1bWlub3NpdHkgPSBmYWxzZTsKICAgICBiTHVtaW5vc2l0eSA9IHBTTWFza0RpY3QtPkdldENvbnN0U3RyaW5nKEZYX0JTVFJDKCJTIikpICE9IEZYX0JTVFJDKCJBbHBoYSIpOwogICAgIENQREZfU3RyZWFtKiBwR3JvdXAgPSBwU01hc2tEaWN0LT5HZXRTdHJlYW0oRlhfQlNUUkMoIkciKSk7CiAgICAgaWYgKHBHcm91cCA9PSBOVUxMKSB7CkBAIC0xMDMyLDcgKzEwMzIsNyBAQAogICAgIG9wdGlvbnMubV9Db2xvck1vZGUgPSBiTHVtaW5vc2l0eSA/IFJFTkRFUl9DT0xPUl9OT1JNQUwgOiBSRU5ERVJfQ09MT1JfQUxQSEE7CiAgICAgQ1BERl9SZW5kZXJTdGF0dXMgc3RhdHVzOwogICAgIHN0YXR1cy5Jbml0aWFsaXplKG1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICZvcHRpb25zLCAwLCBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSwgVFJVRSwgTlVMTCwgMCwgcENTID8gcENTLT5HZXRGYW1pbHkoKSA6IDAsIGJMdW1pbm9zaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucywgMCwgbV9iRHJvcE9iamVjdHMsIHBGb3JtUmVzb3VyY2UsIHRydWUsIE5VTEwsIDAsIHBDUyA/IHBDUy0+R2V0RmFtaWx5KCkgOiAwLCBiTHVtaW5vc2l0eSk7CiAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QoJmZvcm0sICZtYXRyaXgpOwogICAgIHBNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKICAgICBpZiAoIXBNYXNrLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2xvYWRpbWFnZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2xvYWRpbWFnZS5jcHAKaW5kZXggN2QxN2U3OC4uMDg2MTA0OCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9sb2FkaW1hZ2UuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfbG9hZGltYWdlLmNwcApAQCAtMTA1LDcgKzEwNSw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCi1DRlhfRElCU291cmNlKiBDUERGX0ltYWdlOjpMb2FkRElCU291cmNlKENGWF9ESUJTb3VyY2UqKiBwcE1hc2ssIEZYX0RXT1JEKiBwTWF0dGVDb2xvciwgRlhfQk9PTCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBGWF9CT09MIGJMb2FkTWFzaykgY29uc3QKK0NGWF9ESUJTb3VyY2UqIENQREZfSW1hZ2U6OkxvYWRESUJTb3VyY2UoQ0ZYX0RJQlNvdXJjZSoqIHBwTWFzaywgRlhfRFdPUkQqIHBNYXR0ZUNvbG9yLCBib29sIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIGJvb2wgYkxvYWRNYXNrKSBjb25zdAogewogICAgIENQREZfRElCU291cmNlKiBwU291cmNlID0gbmV3IENQREZfRElCU291cmNlOwogICAgIGlmIChwU291cmNlLT5Mb2FkKG1fcERvY3VtZW50LCBtX3BTdHJlYW0sIChDUERGX0RJQlNvdXJjZSoqKXBwTWFzaywgcE1hdHRlQ29sb3IsIE5VTEwsIE5VTEwsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzaykpIHsKQEAgLTEyNiwzNiArMTI2LDM2IEBACiAgICAgbV9wTWFzayA9IE5VTEw7CiAgICAgcmV0dXJuIHBCaXRtYXA7CiB9Ci1GWF9CT09MIENQREZfSW1hZ2U6OlN0YXJ0TG9hZERJQlNvdXJjZShDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZSwgRlhfQk9PTCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBGWF9CT09MIGJMb2FkTWFzaykKK2Jvb2wgQ1BERl9JbWFnZTo6U3RhcnRMb2FkRElCU291cmNlKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlLCBib29sIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIGJvb2wgYkxvYWRNYXNrKQogewogICAgIG1fcERJQlNvdXJjZSA9IG5ldyBDUERGX0RJQlNvdXJjZTsKLSAgICBpbnQgcmV0ID0gKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKS0+U3RhcnRMb2FkRElCU291cmNlKG1fcERvY3VtZW50LCBtX3BTdHJlYW0sIFRSVUUsIHBGb3JtUmVzb3VyY2UsIHBQYWdlUmVzb3VyY2UsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzayk7CisgICAgaW50IHJldCA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcERJQlNvdXJjZSktPlN0YXJ0TG9hZERJQlNvdXJjZShtX3BEb2N1bWVudCwgbV9wU3RyZWFtLCB0cnVlLCBwRm9ybVJlc291cmNlLCBwUGFnZVJlc291cmNlLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spOwogICAgIGlmIChyZXQgPT0gMikgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmICghcmV0KSB7CiAgICAgICAgIGRlbGV0ZSBtX3BESUJTb3VyY2U7CiAgICAgICAgIG1fcERJQlNvdXJjZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BNYXNrID0gKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKS0+RGV0YWNoTWFzaygpOwogICAgIG1fTWF0dGVDb2xvciA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcERJQlNvdXJjZSktPm1fTWF0dGVDb2xvcjsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX0ltYWdlOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKK2Jvb2wgQ1BERl9JbWFnZTo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaW50IHJldCA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcERJQlNvdXJjZSktPkNvbnRpbnVlTG9hZERJQlNvdXJjZShwUGF1c2UpOwogICAgIGlmIChyZXQgPT0gMikgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmICghcmV0KSB7CiAgICAgICAgIGRlbGV0ZSBtX3BESUJTb3VyY2U7CiAgICAgICAgIG1fcERJQlNvdXJjZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BNYXNrID0gKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKS0+RGV0YWNoTWFzaygpOwogICAgIG1fTWF0dGVDb2xvciA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcERJQlNvdXJjZSktPm1fTWF0dGVDb2xvcjsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogQ1BERl9ESUJTb3VyY2U6OkNQREZfRElCU291cmNlKCkKIHsKQEAgLTE2NSwyNiArMTY1LDI2IEBACiAgICAgbV9icHAgPSAwOwogICAgIG1fV2lkdGggPSBtX0hlaWdodCA9IDA7CiAgICAgbV9wQ29sb3JTcGFjZSA9IE5VTEw7Ci0gICAgbV9iRGVmYXVsdERlY29kZSA9IFRSVUU7Ci0gICAgbV9iSW1hZ2VNYXNrID0gRkFMU0U7Ci0gICAgbV9iRG9CcGNDaGVjayA9IFRSVUU7CisgICAgbV9iRGVmYXVsdERlY29kZSA9IHRydWU7CisgICAgbV9iSW1hZ2VNYXNrID0gZmFsc2U7CisgICAgbV9iRG9CcGNDaGVjayA9IHRydWU7CiAgICAgbV9wUGFsZXR0ZSA9IE5VTEw7CiAgICAgbV9wQ29tcERhdGEgPSBOVUxMOwotICAgIG1fYkNvbG9yS2V5ID0gRkFMU0U7CisgICAgbV9iQ29sb3JLZXkgPSBmYWxzZTsKICAgICBtX3BNYXNrZWRMaW5lID0gbV9wTGluZUJ1ZiA9IE5VTEw7CiAgICAgbV9wRGVjb2RlciA9IE5VTEw7CiAgICAgbV9uQ29tcG9uZW50cyA9IDA7CiAgICAgbV9icGMgPSAwOwotICAgIG1fYkxvYWRNYXNrID0gRkFMU0U7CisgICAgbV9iTG9hZE1hc2sgPSBmYWxzZTsKICAgICBtX0ZhbWlseSA9IDA7CiAgICAgbV9wTWFzayA9IE5VTEw7CiAgICAgbV9NYXR0ZUNvbG9yID0gMDsKICAgICBtX3BKYmlnMkNvbnRleHQgPSBOVUxMOwogICAgIG1fcEdsb2JhbFN0cmVhbSA9IE5VTEw7Ci0gICAgbV9iU3RkQ1MgPSBGQUxTRTsKKyAgICBtX2JTdGRDUyA9IGZhbHNlOwogICAgIG1fcE1hc2tTdHJlYW0gPSBOVUxMOwogICAgIG1fU3RhdHVzID0gMDsKLSAgICBtX2JIYXNNYXNrID0gRkFMU0U7CisgICAgbV9iSGFzTWFzayA9IGZhbHNlOwogfQogQ1BERl9ESUJTb3VyY2U6On5DUERGX0RJQlNvdXJjZSgpCiB7CkBAIC0yMjAsNDMgKzIyMCw0MyBAQAogICAgICAgICBkZWxldGUgcEJpdG1hcDsKICAgICB9CiB9Ci1GWF9CT09MIENQREZfRElCU291cmNlOjpMb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIGNvbnN0IENQREZfU3RyZWFtKiBwU3RyZWFtLCBDUERGX0RJQlNvdXJjZSoqIHBwTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBNYXR0ZUNvbG9yLCBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLCBGWF9CT09MIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrKQorYm9vbCBDUERGX0RJQlNvdXJjZTo6TG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwgQ1BERl9ESUJTb3VyY2UqKiBwcE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwTWF0dGVDb2xvciwgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywgYm9vbCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBib29sIGJMb2FkTWFzaykKIHsKICAgICBpZiAocFN0cmVhbSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BEb2N1bWVudCA9IHBEb2M7CiAgICAgbV9wRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKICAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BTdHJlYW0gPSBwU3RyZWFtOwogICAgIG1fV2lkdGggPSBtX3BEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJXaWR0aCIpKTsKICAgICBtX0hlaWdodCA9IG1fcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkhlaWdodCIpKTsKICAgICBpZiAobV9XaWR0aCA8PSAwIHx8IG1fSGVpZ2h0IDw9IDAgfHwgbV9XaWR0aCA+IDB4MDFmZmZmIHx8IG1fSGVpZ2h0ID4gMHgwMWZmZmYpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fR3JvdXBGYW1pbHkgPSBHcm91cEZhbWlseTsKICAgICBtX2JMb2FkTWFzayA9IGJMb2FkTWFzazsKICAgICBpZiAoIUxvYWRDb2xvckluZm8obV9wU3RyZWFtLT5HZXRPYmpOdW0oKSAhPSAwID8gTlVMTCA6IHBGb3JtUmVzb3VyY2VzLCBwUGFnZVJlc291cmNlcykpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX2JEb0JwY0NoZWNrICYmIChtX2JwYyA9PSAwIHx8IG1fbkNvbXBvbmVudHMgPT0gMCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX1NBRkVfRFdPUkQgc3JjX3BpdGNoID0KICAgICAgICAgQ2FsY3VsYXRlUGl0Y2g4KG1fYnBjLCBtX25Db21wb25lbnRzLCBtX1dpZHRoLCBtX0hlaWdodCk7CiAgICAgaWYgKCFzcmNfcGl0Y2guSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BTdHJlYW1BY2MgPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgbV9wU3RyZWFtQWNjLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSwgc3JjX3BpdGNoLlZhbHVlT3JEaWUoKSwgVFJVRSk7CisgICAgbV9wU3RyZWFtQWNjLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBmYWxzZSwgc3JjX3BpdGNoLlZhbHVlT3JEaWUoKSwgdHJ1ZSk7CiAgICAgaWYgKG1fcFN0cmVhbUFjYy0+R2V0U2l6ZSgpID09IDAgfHwgbV9wU3RyZWFtQWNjLT5HZXREYXRhKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCFDcmVhdGVEZWNvZGVyKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX2JJbWFnZU1hc2spIHsKICAgICAgICAgbV9icHAgPSAxOwpAQCAtMjcyLDExICsyNzIsMTEgQEAKICAgICB9CiAgICAgRlhfU0FGRV9EV09SRCBwaXRjaCA9IENhbGN1bGF0ZVBpdGNoMzIobV9icHAsIG1fV2lkdGgpOwogICAgIGlmICghcGl0Y2guSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BMaW5lQnVmID0gRlhfQWxsb2ModWludDhfdCwgcGl0Y2guVmFsdWVPckRpZSgpKTsKICAgICBpZiAobV9wQ29sb3JTcGFjZSAmJiBiU3RkQ1MpIHsKLSAgICAgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihUUlVFKTsKKyAgICAgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbih0cnVlKTsKICAgICB9CiAgICAgTG9hZFBhbGV0dGUoKTsKICAgICBpZiAobV9iQ29sb3JLZXkpIHsKQEAgLTI4NCw3ICsyODQsNyBAQAogICAgICAgICBtX0FscGhhRmxhZyA9IDI7CiAgICAgICAgIHBpdGNoID0gQ2FsY3VsYXRlUGl0Y2gzMihtX2JwcCwgbV9XaWR0aCk7CiAgICAgICAgIGlmICghcGl0Y2guSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbV9wTWFza2VkTGluZSA9IEZYX0FsbG9jKHVpbnQ4X3QsIHBpdGNoLlZhbHVlT3JEaWUoKSk7CiAgICAgfQpAQCAtMjkzLDkgKzI5Myw5IEBACiAgICAgICAgICpwcE1hc2sgPSBMb2FkTWFzaygqcE1hdHRlQ29sb3IpOwogICAgIH0KICAgICBpZiAobV9wQ29sb3JTcGFjZSAmJiBiU3RkQ1MpIHsKLSAgICAgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihGQUxTRSk7CisgICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oZmFsc2UpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGludAlDUERGX0RJQlNvdXJjZTo6Q29udGludWVUb0xvYWRNYXNrKCkKIHsKQEAgLTMyMCw3ICszMjAsNyBAQAogICAgIH0KICAgICBtX3BMaW5lQnVmID0gRlhfQWxsb2ModWludDhfdCwgcGl0Y2guVmFsdWVPckRpZSgpKTsKICAgICBpZiAobV9wQ29sb3JTcGFjZSAmJiBtX2JTdGRDUykgewotICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKFRSVUUpOworICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKHRydWUpOwogICAgIH0KICAgICBMb2FkUGFsZXR0ZSgpOwogICAgIGlmIChtX2JDb2xvcktleSkgewpAQCAtMzM1LDkgKzMzNSw5IEBACiAgICAgbV9QaXRjaCA9IHBpdGNoLlZhbHVlT3JEaWUoKTsKICAgICByZXR1cm4gMTsKIH0KLWludAlDUERGX0RJQlNvdXJjZTo6U3RhcnRMb2FkRElCU291cmNlKENQREZfRG9jdW1lbnQqIHBEb2MsIGNvbnN0IENQREZfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJIYXNNYXNrLAoraW50CUNQREZfRElCU291cmNlOjpTdGFydExvYWRESUJTb3VyY2UoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sIGJvb2wgYkhhc01hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBGWF9CT09MIGJMb2FkTWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgYm9vbCBiTG9hZE1hc2spCiB7CiAgICAgaWYgKHBTdHJlYW0gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gMDsKQEAgLTM2Niw3ICszNjYsNyBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgbV9wU3RyZWFtQWNjID0gbmV3IENQREZfU3RyZWFtQWNjOwotICAgIG1fcFN0cmVhbUFjYy0+TG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UsIHNyY19waXRjaC5WYWx1ZU9yRGllKCksIFRSVUUpOworICAgIG1fcFN0cmVhbUFjYy0+TG9hZEFsbERhdGEocFN0cmVhbSwgZmFsc2UsIHNyY19waXRjaC5WYWx1ZU9yRGllKCksIHRydWUpOwogICAgIGlmIChtX3BTdHJlYW1BY2MtPkdldFNpemUoKSA9PSAwIHx8IG1fcFN0cmVhbUFjYy0+R2V0RGF0YSgpID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMzkzLDcgKzM5Myw3IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIGlmIChtX3BDb2xvclNwYWNlICYmIG1fYlN0ZENTKSB7Ci0gICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oRkFMU0UpOworICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKGZhbHNlKTsKICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTQxMiw3ICs0MTIsNyBAQAogICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwR2xvYmFscyA9IG1fcFN0cmVhbUFjYy0+R2V0SW1hZ2VQYXJhbSgpLT5HZXRTdHJlYW0oRlhfQlNUUkMoIkpCSUcyR2xvYmFscyIpKTsKICAgICAgICAgICAgICAgICBpZiAocEdsb2JhbHMpIHsKICAgICAgICAgICAgICAgICAgICAgbV9wR2xvYmFsU3RyZWFtID0gbmV3IENQREZfU3RyZWFtQWNjOwotICAgICAgICAgICAgICAgICAgICBtX3BHbG9iYWxTdHJlYW0tPkxvYWRBbGxEYXRhKHBHbG9iYWxzLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIG1fcEdsb2JhbFN0cmVhbS0+TG9hZEFsbERhdGEocEdsb2JhbHMsIGZhbHNlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXQgPSBwSmJpZzJNb2R1bGUtPlN0YXJ0RGVjb2RlKG1fcEpiaWcyQ29udGV4dCwgbV9XaWR0aCwgbV9IZWlnaHQsIG1fcFN0cmVhbUFjYy0+R2V0RGF0YSgpLCBtX3BTdHJlYW1BY2MtPkdldFNpemUoKSwKQEAgLTQzOCw3ICs0MzgsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiByZXQxOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1fcENvbG9yU3BhY2UgJiYgbV9iU3RkQ1MpIHsKLSAgICAgICAgICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKEZBTFNFKTsKKyAgICAgICAgICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiByZXQxOwogICAgICAgICB9CkBAIC00NjMsNyArNDYzLDcgQEAKICAgICAgICAgICAgIHJldHVybiByZXQxOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX3BDb2xvclNwYWNlICYmIG1fYlN0ZENTKSB7Ci0gICAgICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKEZBTFNFKTsKKyAgICAgICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQxOwogICAgIH0KQEAgLTQ3MiwxMSArNDcyLDExIEBACiAgICAgfQogICAgIHJldHVybiAwOwogfQotRlhfQk9PTCBDUERGX0RJQlNvdXJjZTo6TG9hZENvbG9ySW5mbyhDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzKQorYm9vbCBDUERGX0RJQlNvdXJjZTo6TG9hZENvbG9ySW5mbyhDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzKQogewogICAgIG1fYnBjX29yaWcgPSBtX3BEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyQ29tcG9uZW50IikpOwogICAgIGlmIChtX3BEaWN0LT5HZXRJbnRlZ2VyKCJJbWFnZU1hc2siKSkgewotICAgICAgICBtX2JJbWFnZU1hc2sgPSBUUlVFOworICAgICAgICBtX2JJbWFnZU1hc2sgPSB0cnVlOwogICAgIH0KICAgICBpZiAobV9iSW1hZ2VNYXNrIHx8ICFtX3BEaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiQ29sb3JTcGFjZSIpKSkgewogICAgICAgICBpZiAoIW1fYkltYWdlTWFzaykgewpAQCAtNDg2LDI3ICs0ODYsMjcgQEAKICAgICAgICAgICAgICAgICBpZiAocEZpbHRlci0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IHBGaWx0ZXItPkdldFN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyID09IEZYX0JTVFJDKCJKUFhEZWNvZGUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9iRG9CcGNDaGVjayA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2JEb0JwY0NoZWNrID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocEZpbHRlci0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewogICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcEZpbHRlcjsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBBcnJheS0+R2V0U3RyaW5nKHBBcnJheS0+R2V0Q291bnQoKSAtIDEpID09IEZYX0JTVFJDKCJKUFhEZWNvZGUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9iRG9CcGNDaGVjayA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2JEb0JwY0NoZWNrID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtX2JJbWFnZU1hc2sgPSBUUlVFOworICAgICAgICBtX2JJbWFnZU1hc2sgPSB0cnVlOwogICAgICAgICBtX2JwYyA9IG1fbkNvbXBvbmVudHMgPSAxOwogICAgICAgICBDUERGX0FycmF5KiBwRGVjb2RlID0gbV9wRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkRlY29kZSIpKTsKICAgICAgICAgbV9iRGVmYXVsdERlY29kZSA9IHBEZWNvZGUgPT0gTlVMTCB8fCBwRGVjb2RlLT5HZXRJbnRlZ2VyKDApID09IDA7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQ1BERl9PYmplY3QqIHBDU09iaiA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQ29sb3JTcGFjZSIpKTsKICAgICBpZiAocENTT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfRG9jUGFnZURhdGEqIHBEb2NQYWdlRGF0YSA9IG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpOwogICAgIGlmIChwRm9ybVJlc291cmNlcykgewpAQCAtNTE2LDcgKzUxNiw3IEBACiAgICAgICAgIG1fcENvbG9yU3BhY2UgPSBwRG9jUGFnZURhdGEtPkdldENvbG9yU3BhY2UocENTT2JqLCBwUGFnZVJlc291cmNlcyk7CiAgICAgfQogICAgIGlmIChtX3BDb2xvclNwYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fRmFtaWx5ID0gbV9wQ29sb3JTcGFjZS0+R2V0RmFtaWx5KCk7CiAgICAgbV9uQ29tcG9uZW50cyA9IG1fcENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpOwpAQCAtNTMzLDExICs1MzMsMTEgQEAKICAgICBWYWxpZGF0ZURpY3RQYXJhbSgpOwogICAgIG1fcENvbXBEYXRhID0gR2V0RGVjb2RlQW5kTWFza0FycmF5KG1fYkRlZmF1bHREZWNvZGUsIG1fYkNvbG9yS2V5KTsKICAgICBpZiAobV9wQ29tcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1ESUJfQ09NUF9EQVRBKiBDUERGX0RJQlNvdXJjZTo6R2V0RGVjb2RlQW5kTWFza0FycmF5KEZYX0JPT0wmIGJEZWZhdWx0RGVjb2RlLCBGWF9CT09MJiBiQ29sb3JLZXkpCitESUJfQ09NUF9EQVRBKiBDUERGX0RJQlNvdXJjZTo6R2V0RGVjb2RlQW5kTWFza0FycmF5KGJvb2wmIGJEZWZhdWx0RGVjb2RlLCBib29sJiBiQ29sb3JLZXkpCiB7CiAgICAgaWYgKG1fcENvbG9yU3BhY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTU1Niw3ICs1NTYsNyBAQAogICAgICAgICAgICAgICAgIGRlZl9tYXggPSAoRlhfRkxPQVQpbWF4X2RhdGE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZGVmX21pbiAhPSBwQ29tcERhdGFbaV0ubV9EZWNvZGVNaW4gfHwgZGVmX21heCAhPSBtYXgpIHsKLSAgICAgICAgICAgICAgICBiRGVmYXVsdERlY29kZSA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJEZWZhdWx0RGVjb2RlID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtNTg0LDcgKzU4NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHBDb21wRGF0YVtpXS5tX0NvbG9yS2V5TWF4ID0gRlhfTUlOKG1heF9udW0sIG1heF9kYXRhKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBiQ29sb3JLZXkgPSBUUlVFOworICAgICAgICAgICAgYkNvbG9yS2V5ID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcENvbXBEYXRhOwpAQCAtNjEyLDcgKzYxMiw3IEBACiAgICAgICAgICAgICBzcmNfZGF0YSwgc3JjX3NpemUsIG1fV2lkdGgsIG1fSGVpZ2h0LCBtX25Db21wb25lbnRzLAogICAgICAgICAgICAgcFBhcmFtcyA/IHBQYXJhbXMtPkdldEludGVnZXIoIkNvbG9yVHJhbnNmb3JtIiwgMSkgOiAxKTsKICAgICAgICAgaWYgKCFtX3BEZWNvZGVyKSB7Ci0gICAgICAgICAgICBGWF9CT09MIGJUcmFuc2Zvcm0gPSBGQUxTRTsKKyAgICAgICAgICAgIGJvb2wgYlRyYW5zZm9ybSA9IGZhbHNlOwogICAgICAgICAgICAgaW50IGNvbXBzLCBicGM7CiAgICAgICAgICAgICBJQ29kZWNfSnBlZ01vZHVsZSogcEpwZWdNb2R1bGUgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKTsKICAgICAgICAgICAgIGlmIChwSnBlZ01vZHVsZS0+TG9hZEluZm8oc3JjX2RhdGEsIHNyY19zaXplLCBtX1dpZHRoLCBtX0hlaWdodCwgY29tcHMsIGJwYywgYlRyYW5zZm9ybSkpIHsKQEAgLTY5MywyOSArNjkzLDI5IEBACiAgICAgICAgIHJldHVybjsKIAogICAgIGludCBvdXRwdXRfbkNvbXBzOwotICAgIEZYX0JPT0wgYlRyYW5zbGF0ZUNvbG9yOwotICAgIEZYX0JPT0wgYlN3YXBSR0IgPSBGQUxTRTsKKyAgICBib29sIGJUcmFuc2xhdGVDb2xvcjsKKyAgICBib29sIGJTd2FwUkdCID0gZmFsc2U7CiAgICAgaWYgKG1fcENvbG9yU3BhY2UpIHsKICAgICAgICAgaWYgKGNvZGVzdHJlYW1fbkNvbXBzICE9IChGWF9EV09SRCltX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSkKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgb3V0cHV0X25Db21wcyA9IGNvZGVzdHJlYW1fbkNvbXBzOwotICAgICAgICBiVHJhbnNsYXRlQ29sb3IgPSBGQUxTRTsKKyAgICAgICAgYlRyYW5zbGF0ZUNvbG9yID0gZmFsc2U7CiAgICAgICAgIGlmIChtX3BDb2xvclNwYWNlID09IENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VSR0IpKSB7Ci0gICAgICAgICAgICBiU3dhcFJHQiA9IFRSVUU7CisgICAgICAgICAgICBiU3dhcFJHQiA9IHRydWU7CiAgICAgICAgICAgICBtX3BDb2xvclNwYWNlID0gbnVsbHB0cjsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGJUcmFuc2xhdGVDb2xvciA9IFRSVUU7CisgICAgICAgIGJUcmFuc2xhdGVDb2xvciA9IHRydWU7CiAgICAgICAgIGlmIChpbWFnZV9uQ29tcHMpIHsKICAgICAgICAgICAgIG91dHB1dF9uQ29tcHMgPSBpbWFnZV9uQ29tcHM7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBvdXRwdXRfbkNvbXBzID0gY29kZXN0cmVhbV9uQ29tcHM7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG91dHB1dF9uQ29tcHMgPT0gMykgewotICAgICAgICAgICAgYlN3YXBSR0IgPSBUUlVFOworICAgICAgICAgICAgYlN3YXBSR0IgPSB0cnVlOwogICAgICAgICB9IGVsc2UgaWYgKG91dHB1dF9uQ29tcHMgPT0gNCkgewogICAgICAgICAgICAgbV9wQ29sb3JTcGFjZSA9IENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VDTVlLKTsKLSAgICAgICAgICAgIGJUcmFuc2xhdGVDb2xvciA9IEZBTFNFOworICAgICAgICAgICAgYlRyYW5zbGF0ZUNvbG9yID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbV9uQ29tcG9uZW50cyA9IG91dHB1dF9uQ29tcHM7CiAgICAgfQpAQCAtODI5LDcgKzgyOSw3IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIGlmIChtX3BDb2xvclNwYWNlICYmIG1fYlN0ZENTKSB7Ci0gICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oRkFMU0UpOworICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKGZhbHNlKTsKICAgICB9CiAgICAgaWYgKCFyZXQpIHsKICAgICAgICAgZGVsZXRlIG1fcE1hc2s7CkBAIC04NDcsNyArODQ3LDcgQEAKIENQREZfRElCU291cmNlKiBDUERGX0RJQlNvdXJjZTo6TG9hZE1hc2tESUIoQ1BERl9TdHJlYW0qIHBNYXNrKQogewogICAgIENQREZfRElCU291cmNlKiBwTWFza1NvdXJjZSA9IG5ldyBDUERGX0RJQlNvdXJjZTsKLSAgICBpZiAoIXBNYXNrU291cmNlLT5Mb2FkKG1fcERvY3VtZW50LCBwTWFzaywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgVFJVRSkpIHsKKyAgICBpZiAoIXBNYXNrU291cmNlLT5Mb2FkKG1fcERvY3VtZW50LCBwTWFzaywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgdHJ1ZSkpIHsKICAgICAgICAgZGVsZXRlIHBNYXNrU291cmNlOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC04NTYsNyArODU2LDcgQEAKIGludCBDUERGX0RJQlNvdXJjZTo6U3RhcnRMb2FkTWFza0RJQigpCiB7CiAgICAgbV9wTWFzayA9IG5ldyBDUERGX0RJQlNvdXJjZTsKLSAgICBpbnQgcmV0ID0gbV9wTWFzay0+U3RhcnRMb2FkRElCU291cmNlKG1fcERvY3VtZW50LCAoQ1BERl9TdHJlYW0qKW1fcE1hc2tTdHJlYW0sIEZBTFNFLCBOVUxMLCBOVUxMLCBUUlVFKTsKKyAgICBpbnQgcmV0ID0gbV9wTWFzay0+U3RhcnRMb2FkRElCU291cmNlKG1fcERvY3VtZW50LCAoQ1BERl9TdHJlYW0qKW1fcE1hc2tTdHJlYW0sIGZhbHNlLCBOVUxMLCBOVUxMLCB0cnVlKTsKICAgICBpZiAocmV0ID09IDIpIHsKICAgICAgICAgaWYgKG1fU3RhdHVzID09IDApIHsKICAgICAgICAgICAgIG1fU3RhdHVzID0gMjsKQEAgLTEyMDksMTUgKzEyMDksMTUgQEAKICAgICB9CiAgICAgcmV0dXJuIHBTcmNMaW5lOwogfQotRlhfQk9PTCBDUERGX0RJQlNvdXJjZTo6U2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKSBjb25zdAorYm9vbCBDUERGX0RJQlNvdXJjZTo6U2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKSBjb25zdAogewogICAgIGlmIChtX3BEZWNvZGVyKSB7CiAgICAgICAgIHJldHVybiBtX3BEZWNvZGVyLT5Ta2lwVG9TY2FubGluZShsaW5lLCBwUGF1c2UpOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogdm9pZCBDUERGX0RJQlNvdXJjZTo6RG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLCB1aW50OF90KiBkZXN0X3NjYW4sIGludCBkZXN0X2JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgRlhfQk9PTCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBib29sIGJGbGlwWCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfd2lkdGgpIGNvbnN0CiB7CiAgICAgaWYgKGxpbmUgPCAwIHx8IGRlc3Rfc2NhbiA9PSBOVUxMIHx8IGRlc3RfYnBwIDw9IDAgfHwKICAgICAgICAgZGVzdF93aWR0aCA8PSAwIHx8IGNsaXBfbGVmdCA8IDAgfHwgY2xpcF93aWR0aCA8PSAwKSB7CkBAIC0xNDgwLDI2ICsxNDgwLDI2IEBACiBDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGU6On5DUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGUoKQogewogfQotRlhfQk9PTCBDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGU6OlN0YXJ0KENQREZfSW1hZ2VMb2FkZXIqIHBJbWFnZUxvYWRlciwgY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLCBGWF9CT09MIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywgaW50MzJfdCBuRG93bnNhbXBsZVdpZHRoLCBpbnQzMl90IG5Eb3duc2FtcGxlSGVpZ2h0KQorYm9vbCBDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGU6OlN0YXJ0KENQREZfSW1hZ2VMb2FkZXIqIHBJbWFnZUxvYWRlciwgY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLCBib29sIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIGJvb2wgYkxvYWRNYXNrLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywgaW50MzJfdCBuRG93bnNhbXBsZVdpZHRoLCBpbnQzMl90IG5Eb3duc2FtcGxlSGVpZ2h0KQogewogICAgIG1fcEltYWdlTG9hZGVyID0gcEltYWdlTG9hZGVyOwogICAgIG1fcENhY2hlID0gcENhY2hlOwogICAgIG1fcEltYWdlID0gKENQREZfSW1hZ2VPYmplY3QqKXBJbWFnZTsKICAgICBtX25Eb3duc2FtcGxlV2lkdGggPSBuRG93bnNhbXBsZVdpZHRoOwogICAgIG1fbkRvd25zYW1wbGVIZWlnaHQgPSBuRG93bnNhbXBsZUhlaWdodDsKLSAgICBGWF9CT09MIHJldDsKKyAgICBib29sIHJldDsKICAgICBpZiAocENhY2hlKSB7CiAgICAgICAgIHJldCA9IHBDYWNoZS0+U3RhcnRHZXRDYWNoZWRCaXRtYXAocEltYWdlLT5tX3BJbWFnZS0+R2V0U3RyZWFtKCksIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzaywgcFJlbmRlclN0YXR1cywgbV9uRG93bnNhbXBsZVdpZHRoLCBtX25Eb3duc2FtcGxlSGVpZ2h0KTsKLSAgICAgICAgaWYgKHJldCA9PSBGQUxTRSkgewotICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fYkNhY2hlZCA9IFRSVUU7CisgICAgICAgIGlmIChyZXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX2JDYWNoZWQgPSB0cnVlOwogICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fcEJpdG1hcCA9IHBDYWNoZS0+bV9wQ3VySW1hZ2VDYWNoZS0+RGV0YWNoQml0bWFwKCk7CiAgICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9wTWFzayA9IHBDYWNoZS0+bV9wQ3VySW1hZ2VDYWNoZS0+RGV0YWNoTWFzaygpOwogICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fTWF0dGVDb2xvciA9IHBDYWNoZS0+bV9wQ3VySW1hZ2VDYWNoZS0+bV9NYXR0ZUNvbG9yOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0ID0gcEltYWdlLT5tX3BJbWFnZS0+U3RhcnRMb2FkRElCU291cmNlKHBSZW5kZXJTdGF0dXMtPm1fcEZvcm1SZXNvdXJjZSwgcFJlbmRlclN0YXR1cy0+bV9wUGFnZVJlc291cmNlLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spOwotICAgICAgICBpZiAocmV0ID09IEZBTFNFKSB7Ci0gICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9iQ2FjaGVkID0gRkFMU0U7CisgICAgICAgIGlmIChyZXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX2JDYWNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BCaXRtYXAgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPkRldGFjaEJpdG1hcCgpOwogICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fcE1hc2sgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPkRldGFjaE1hc2soKTsKICAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX01hdHRlQ29sb3IgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPm1fTWF0dGVDb2xvcjsKQEAgLTE1MDcsMjEgKzE1MDcsMjEgQEAKICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KLUZYX0JPT0wgQ1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKK2Jvb2wgQ1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKIHsKLSAgICBGWF9CT09MIHJldDsKKyAgICBib29sIHJldDsKICAgICBpZiAobV9wQ2FjaGUpIHsKICAgICAgICAgcmV0ID0gbV9wQ2FjaGUtPkNvbnRpbnVlKHBQYXVzZSk7Ci0gICAgICAgIGlmIChyZXQgPT0gRkFMU0UpIHsKLSAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX2JDYWNoZWQgPSBUUlVFOworICAgICAgICBpZiAocmV0ID09IGZhbHNlKSB7CisgICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9iQ2FjaGVkID0gdHJ1ZTsKICAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BCaXRtYXAgPSBtX3BDYWNoZS0+bV9wQ3VySW1hZ2VDYWNoZS0+RGV0YWNoQml0bWFwKCk7CiAgICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9wTWFzayA9IG1fcENhY2hlLT5tX3BDdXJJbWFnZUNhY2hlLT5EZXRhY2hNYXNrKCk7CiAgICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9NYXR0ZUNvbG9yID0gbV9wQ2FjaGUtPm1fcEN1ckltYWdlQ2FjaGUtPm1fTWF0dGVDb2xvcjsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldCA9IG1fcEltYWdlLT5tX3BJbWFnZS0+Q29udGludWUocFBhdXNlKTsKLSAgICAgICAgaWYgKHJldCA9PSBGQUxTRSkgewotICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fYkNhY2hlZCA9IEZBTFNFOworICAgICAgICBpZiAocmV0ID09IGZhbHNlKSB7CisgICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9iQ2FjaGVkID0gZmFsc2U7CiAgICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9wQml0bWFwID0gbV9wSW1hZ2UtPm1fcEltYWdlLT5EZXRhY2hCaXRtYXAoKTsKICAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BNYXNrID0gbV9wSW1hZ2UtPm1fcEltYWdlLT5EZXRhY2hNYXNrKCk7CiAgICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9NYXR0ZUNvbG9yID0gbV9wSW1hZ2UtPm1fcEltYWdlLT5tX01hdHRlQ29sb3I7CkBAIC0xNTI5LDMwICsxNTI5LDMwIEBACiAgICAgfQogICAgIHJldHVybiByZXQ7CiB9Ci1GWF9CT09MIENQREZfSW1hZ2VMb2FkZXI6OkxvYWQoY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLCBGWF9CT09MIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cykKK2Jvb2wgQ1BERl9JbWFnZUxvYWRlcjo6TG9hZChjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsIGJvb2wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgYm9vbCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzKQogewogICAgIGlmIChwSW1hZ2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBDYWNoZSkgewogICAgICAgICBwQ2FjaGUtPkdldENhY2hlZEJpdG1hcChwSW1hZ2UtPm1fcEltYWdlLT5HZXRTdHJlYW0oKSwgbV9wQml0bWFwLCBtX3BNYXNrLCBtX01hdHRlQ29sb3IsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzaywgcFJlbmRlclN0YXR1cywgbV9uRG93bnNhbXBsZVdpZHRoLCBtX25Eb3duc2FtcGxlSGVpZ2h0KTsKLSAgICAgICAgbV9iQ2FjaGVkID0gVFJVRTsKKyAgICAgICAgbV9iQ2FjaGVkID0gdHJ1ZTsKICAgICB9IGVsc2UgewogICAgICAgICBtX3BCaXRtYXAgPSBwSW1hZ2UtPm1fcEltYWdlLT5Mb2FkRElCU291cmNlKCZtX3BNYXNrLCAmbV9NYXR0ZUNvbG9yLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spOwotICAgICAgICBtX2JDYWNoZWQgPSBGQUxTRTsKKyAgICAgICAgbV9iQ2FjaGVkID0gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZfSW1hZ2VMb2FkZXI6OlN0YXJ0TG9hZEltYWdlKGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwgdm9pZComIExvYWRIYW5kbGUsIEZYX0JPT0wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgRlhfQk9PTCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLCBpbnQzMl90IG5Eb3duc2FtcGxlV2lkdGgsIGludDMyX3QgbkRvd25zYW1wbGVIZWlnaHQpCitib29sIENQREZfSW1hZ2VMb2FkZXI6OlN0YXJ0TG9hZEltYWdlKGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwgdm9pZComIExvYWRIYW5kbGUsIGJvb2wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgYm9vbCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLCBpbnQzMl90IG5Eb3duc2FtcGxlV2lkdGgsIGludDMyX3QgbkRvd25zYW1wbGVIZWlnaHQpCiB7CiAgICAgbV9uRG93bnNhbXBsZVdpZHRoID0gbkRvd25zYW1wbGVXaWR0aDsKICAgICBtX25Eb3duc2FtcGxlSGVpZ2h0ID0gbkRvd25zYW1wbGVIZWlnaHQ7CiAgICAgQ1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlKiBwTG9hZGVySGFuZGxlID0gbmV3IENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZTsKLSAgICBGWF9CT09MIHJldCA9IHBMb2FkZXJIYW5kbGUtPlN0YXJ0KHRoaXMsIHBJbWFnZSwgcENhY2hlLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2ssIHBSZW5kZXJTdGF0dXMsIG1fbkRvd25zYW1wbGVXaWR0aCwgbV9uRG93bnNhbXBsZUhlaWdodCk7CisgICAgYm9vbCByZXQgPSBwTG9hZGVySGFuZGxlLT5TdGFydCh0aGlzLCBwSW1hZ2UsIHBDYWNoZSwgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrLCBwUmVuZGVyU3RhdHVzLCBtX25Eb3duc2FtcGxlV2lkdGgsIG1fbkRvd25zYW1wbGVIZWlnaHQpOwogICAgIExvYWRIYW5kbGUgPSBwTG9hZGVySGFuZGxlOwogICAgIHJldHVybiByZXQ7CiB9Ci1GWF9CT09MCUNQREZfSW1hZ2VMb2FkZXI6OkNvbnRpbnVlKHZvaWQqIExvYWRIYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKQorYm9vbAlDUERGX0ltYWdlTG9hZGVyOjpDb250aW51ZSh2b2lkKiBMb2FkSGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICByZXR1cm4gKChDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGUqKUxvYWRIYW5kbGUpLT5Db250aW51ZShwUGF1c2UpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9wYXR0ZXJuLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfcGF0dGVybi5jcHAKaW5kZXggM2VlMjIyMi4uZTA4NjQ5MCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9wYXR0ZXJuLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX3BhdHRlcm4uY3BwCkBAIC0yOSw3ICsyOSw3IEBACiAgICAgICAgIHRfbWluID0gcEFycmF5LT5HZXROdW1iZXIoMCk7CiAgICAgICAgIHRfbWF4ID0gcEFycmF5LT5HZXROdW1iZXIoMSk7CiAgICAgfQotICAgIEZYX0JPT0wgYlN0YXJ0RXh0ZW5kID0gRkFMU0UsIGJFbmRFeHRlbmQgPSBGQUxTRTsKKyAgICBib29sIGJTdGFydEV4dGVuZCA9IGZhbHNlLCBiRW5kRXh0ZW5kID0gZmFsc2U7CiAgICAgcEFycmF5ID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJFeHRlbmQiKSk7CiAgICAgaWYgKHBBcnJheSkgewogICAgICAgICBiU3RhcnRFeHRlbmQgPSBwQXJyYXktPkdldEludGVnZXIoMCk7CkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICAgICAgdF9taW4gPSBwQXJyYXktPkdldE51bWJlcigwKTsKICAgICAgICAgdF9tYXggPSBwQXJyYXktPkdldE51bWJlcigxKTsKICAgICB9Ci0gICAgRlhfQk9PTCBiU3RhcnRFeHRlbmQgPSBGQUxTRSwgYkVuZEV4dGVuZCA9IEZBTFNFOworICAgIGJvb2wgYlN0YXJ0RXh0ZW5kID0gZmFsc2UsIGJFbmRFeHRlbmQgPSBmYWxzZTsKICAgICBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkV4dGVuZCIpKTsKICAgICBpZiAocEFycmF5KSB7CiAgICAgICAgIGJTdGFydEV4dGVuZCA9IHBBcnJheS0+R2V0SW50ZWdlcigwKTsKQEAgLTE1NSwxMSArMTU1LDExIEBACiAgICAgaW50IHdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKTsKICAgICBpbnQgaGVpZ2h0ID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCk7CiAgICAgaW50IHBpdGNoID0gcEJpdG1hcC0+R2V0UGl0Y2goKTsKLSAgICBGWF9CT09MIGJEZWNyZWFzaW5nID0gRkFMU0U7CisgICAgYm9vbCBiRGVjcmVhc2luZyA9IGZhbHNlOwogICAgIGlmIChzdGFydF9yID4gZW5kX3IpIHsKICAgICAgICAgaW50IGxlbmd0aCA9IChpbnQpRlhTWVNfc3FydCgoRlhTWVNfTXVsKHN0YXJ0X3ggLSBlbmRfeCwgc3RhcnRfeCAtIGVuZF94KSArIEZYU1lTX011bChzdGFydF95IC0gZW5kX3ksIHN0YXJ0X3kgLSBlbmRfeSkpKTsKICAgICAgICAgaWYgKGxlbmd0aCA8IHN0YXJ0X3IgLSBlbmRfcikgewotICAgICAgICAgICAgYkRlY3JlYXNpbmcgPSBUUlVFOworICAgICAgICAgICAgYkRlY3JlYXNpbmcgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7CkBAIC0yODEsMjIgKzI4MSwyMiBAQAogICAgICAgICB9CiAgICAgfQogfQotRlhfQk9PTCBfR2V0U2NhbmxpbmVJbnRlcnNlY3QoaW50IHksIEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9GTE9BVCYgeCkKK2Jvb2wgX0dldFNjYW5saW5lSW50ZXJzZWN0KGludCB5LCBGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRkxPQVQmIHgpCiB7CiAgICAgaWYgKHkxID09IHkyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoeTEgPCB5MikgewogICAgICAgICBpZiAoeSA8IHkxIHx8IHkgPiB5MikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKHkgPCB5MiB8fCB5ID4geTEpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICB4ID0geDEgKyBGWFNZU19NdWxEaXYoeDIgLSB4MSwgeSAtIHkxLCB5MiAtIHkxKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHN0YXRpYyB2b2lkIF9EcmF3R291cmF1ZChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBhbHBoYSwgQ1BERl9NZXNoVmVydGV4IHRyaWFuZ2xlWzNdKQogewpAQCAtMzI1LDcgKzMyNSw3IEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSArKykgewogICAgICAgICAgICAgQ1BERl9NZXNoVmVydGV4JiB2ZXJ0ZXgxID0gdHJpYW5nbGVbaV07CiAgICAgICAgICAgICBDUERGX01lc2hWZXJ0ZXgmIHZlcnRleDIgPSB0cmlhbmdsZVsoaSArIDEpICUgM107Ci0gICAgICAgICAgICBGWF9CT09MIGJJbnRlcnNlY3QgPSBfR2V0U2NhbmxpbmVJbnRlcnNlY3QoeSwgdmVydGV4MS54LCB2ZXJ0ZXgxLnksCisgICAgICAgICAgICBib29sIGJJbnRlcnNlY3QgPSBfR2V0U2NhbmxpbmVJbnRlcnNlY3QoeSwgdmVydGV4MS54LCB2ZXJ0ZXgxLnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXgyLngsIHZlcnRleDIueSwgaW50ZXJfeFtuSW50ZXJzZWN0c10pOwogICAgICAgICAgICAgaWYgKCFiSW50ZXJzZWN0KSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC02MDEsNyArNjAxLDcgQEAKICAgICBpbnQJCQkJCWFscGhhOwogICAgIHZvaWQgRHJhdyhpbnQgeF9zY2FsZSwgaW50IHlfc2NhbGUsIGludCBsZWZ0LCBpbnQgYm90dG9tLCBDb29uX0JlemllciBDMSwgQ29vbl9CZXppZXIgQzIsIENvb25fQmV6aWVyIEQxLCBDb29uX0JlemllciBEMikKICAgICB7Ci0gICAgICAgIEZYX0JPT0wgYlNtYWxsID0gQzEuRGlzdGFuY2UoKSA8IDIgJiYgQzIuRGlzdGFuY2UoKSA8IDIgJiYgRDEuRGlzdGFuY2UoKSA8IDIgJiYgRDIuRGlzdGFuY2UoKSA8IDI7CisgICAgICAgIGJvb2wgYlNtYWxsID0gQzEuRGlzdGFuY2UoKSA8IDIgJiYgQzIuRGlzdGFuY2UoKSA8IDIgJiYgRDEuRGlzdGFuY2UoKSA8IDIgJiYgRDIuRGlzdGFuY2UoKSA8IDI7CiAgICAgICAgIENvb25fQ29sb3IgZGl2X2NvbG9yc1s0XTsKICAgICAgICAgaW50IGRfYm90dG9tLCBkX2xlZnQsIGRfdG9wLCBkX3JpZ2h0OwogICAgICAgICBkaXZfY29sb3JzWzBdLkJpSW50ZXJwb2wocGF0Y2hfY29sb3JzLCBsZWZ0LCBib3R0b20sIHhfc2NhbGUsIHlfc2NhbGUpOwpAQCAtNjYzLDkgKzY2Myw5IEBACiAgICAgfQogfTsKIAotRlhfQk9PTCBfQ2hlY2tDb29uVGVuc29yUGFyYShjb25zdCBDUERGX01lc2hTdHJlYW0gJnN0cmVhbSkKK2Jvb2wgX0NoZWNrQ29vblRlbnNvclBhcmEoY29uc3QgQ1BERl9NZXNoU3RyZWFtICZzdHJlYW0pCiB7Ci0gICAgRlhfQk9PTCBiQ29vckJpdHMgPSAoIHN0cmVhbS5tX25Db29yZEJpdHM9PSAxICAgfHwKKyAgICBib29sIGJDb29yQml0cyA9ICggc3RyZWFtLm1fbkNvb3JkQml0cz09IDEgICB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29vcmRCaXRzID09IDIgIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db29yZEJpdHMgPT0gNCAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvb3JkQml0cyA9PSA4ICB8fApAQCAtNjc0LDIxICs2NzQsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvb3JkQml0cyA9PSAyNCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29vcmRCaXRzID09IDMyICAgKTsKIAotICAgIEZYX0JPT0wgYkNvbXBCaXRzID0gKCBzdHJlYW0ubV9uQ29tcEJpdHMgPT0gMSAgfHwKKyAgICBib29sIGJDb21wQml0cyA9ICggc3RyZWFtLm1fbkNvbXBCaXRzID09IDEgIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db21wQml0cyA9PSAyICB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29tcEJpdHMgPT0gNCAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvbXBCaXRzID09IDggIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db21wQml0cyA9PSAxMiB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29tcEJpdHMgPT0gMTYgICApOwogCi0gICAgRlhfQk9PTCBiRmxhZ0JpdHMgPSAoIHN0cmVhbS5tX25GbGFnQml0cyA9PSAyICB8fAorICAgIGJvb2wgYkZsYWdCaXRzID0gKCBzdHJlYW0ubV9uRmxhZ0JpdHMgPT0gMiAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkZsYWdCaXRzID09IDQgIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25GbGFnQml0cyA9PSA4ICAgICk7CiAKICAgICByZXR1cm4gYkNvb3JCaXRzICYmIGJDb21wQml0cyAmJiBiRmxhZ0JpdHM7CiB9CiAKLXN0YXRpYyB2b2lkIF9EcmF3Q29vblBhdGNoTWVzaGVzKEZYX0JPT0wgYlRlbnNvciwgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCwKK3N0YXRpYyB2b2lkIF9EcmF3Q29vblBhdGNoTWVzaGVzKGJvb2wgYlRlbnNvciwgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU2hhZGluZ1N0cmVhbSwgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywgaW50IG5GdW5jcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ29sb3JTcGFjZSogcENTLCBpbnQgZmlsbF9tb2RlLCBpbnQgYWxwaGEpCiB7CkBAIC03NjgsNyArNzY4LDcgQEAKICAgICB9CiB9CiB2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3U2hhZGluZyhDUERGX1NoYWRpbmdQYXR0ZXJuKiBwUGF0dGVybiwgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QmIGNsaXBfcmVjdCwgaW50IGFscGhhLCBGWF9CT09MIGJBbHBoYU1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9SRUNUJiBjbGlwX3JlY3QsIGludCBhbHBoYSwgYm9vbCBiQWxwaGFNb2RlKQogewogICAgIENQREZfRnVuY3Rpb24qKiBwRnVuY3MgPSBwUGF0dGVybi0+bV9wRnVuY3Rpb25zOwogICAgIGludCBuRnVuY3MgPSBwUGF0dGVybi0+bV9uRnVuY3M7CkBAIC04NDAsNyArODQwLDcgQEAKICAgICB9CiAgICAgYnVmZmVyLk91dHB1dFRvRGV2aWNlKCk7CiB9Ci12b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3U2hhZGluZ1BhdHRlcm4oQ1BERl9TaGFkaW5nUGF0dGVybiogcGF0dGVybiwgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIEZYX0JPT0wgYlN0cm9rZSkKK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdTaGFkaW5nUGF0dGVybihDUERGX1NoYWRpbmdQYXR0ZXJuKiBwYXR0ZXJuLCBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgYm9vbCBiU3Ryb2tlKQogewogICAgIGlmICghcGF0dGVybi0+TG9hZCgpKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTg1OCw3ICs4NTgsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIEZYX1JFQ1QgcmVjdDsKLSAgICBpZiAoR2V0T2JqZWN0Q2xpcHBlZFJlY3QocFBhZ2VPYmosIHBPYmoyRGV2aWNlLCBGQUxTRSwgcmVjdCkpIHsKKyAgICBpZiAoR2V0T2JqZWN0Q2xpcHBlZFJlY3QocFBhZ2VPYmosIHBPYmoyRGV2aWNlLCBmYWxzZSwgcmVjdCkpIHsKICAgICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTg2OSwxOSArODY5LDE5IEBACiAgICAgRHJhd1NoYWRpbmcocGF0dGVybiwgJm1hdHJpeCwgcmVjdCwgYWxwaGEsIG1fT3B0aW9ucy5tX0NvbG9yTW9kZSA9PSBSRU5ERVJfQ09MT1JfQUxQSEEpOwogICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CiB9Ci1GWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzU2hhZGluZyhDUERGX1NoYWRpbmdPYmplY3QqIHBTaGFkaW5nT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKK2Jvb2wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NTaGFkaW5nKENQREZfU2hhZGluZ09iamVjdCogcFNoYWRpbmdPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQogewogICAgIEZYX1JFQ1QgcmVjdCA9IHBTaGFkaW5nT2JqLT5HZXRCQm94KHBPYmoyRGV2aWNlKTsKICAgICBGWF9SRUNUIGNsaXBfYm94ID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7CiAgICAgcmVjdC5JbnRlcnNlY3QoY2xpcF9ib3gpOwogICAgIGlmIChyZWN0LklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4ID0gcFNoYWRpbmdPYmotPm1fTWF0cml4OwogICAgIG1hdHJpeC5Db25jYXQoKnBPYmoyRGV2aWNlKTsKLSAgICBEcmF3U2hhZGluZyhwU2hhZGluZ09iai0+bV9wU2hhZGluZywgJm1hdHJpeCwgcmVjdCwgcFNoYWRpbmdPYmotPm1fR2VuZXJhbFN0YXRlLkdldEFscGhhKEZBTFNFKSwKKyAgICBEcmF3U2hhZGluZyhwU2hhZGluZ09iai0+bV9wU2hhZGluZywgJm1hdHJpeCwgcmVjdCwgcFNoYWRpbmdPYmotPm1fR2VuZXJhbFN0YXRlLkdldEFscGhhKGZhbHNlKSwKICAgICAgICAgICAgICAgICBtX09wdGlvbnMubV9Db2xvck1vZGUgPT0gUkVOREVSX0NPTE9SX0FMUEhBKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHN0YXRpYyBDRlhfRElCaXRtYXAqIERyYXdQYXR0ZXJuQml0bWFwKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1RpbGluZ1BhdHRlcm4qIHBQYXR0ZXJuLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKQEAgLTkxNCw3ICs5MTQsNyBAQAogICAgIGNvbnRleHQuRHJhd09iamVjdExpc3QoJmJpdG1hcF9kZXZpY2UsIHBQYXR0ZXJuLT5tX3BGb3JtLCAmbXRQYXR0ZXJuMkJpdG1hcCwgJm9wdGlvbnMpOwogICAgIHJldHVybiBwQml0bWFwOwogfQotdm9pZCBDUERGX1JlbmRlclN0YXR1czo6RHJhd1RpbGluZ1BhdHRlcm4oQ1BERl9UaWxpbmdQYXR0ZXJuKiBwUGF0dGVybiwgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIEZYX0JPT0wgYlN0cm9rZSkKK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdUaWxpbmdQYXR0ZXJuKENQREZfVGlsaW5nUGF0dGVybiogcFBhdHRlcm4sIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBib29sIGJTdHJva2UpCiB7CiAgICAgaWYgKCFwUGF0dGVybi0+TG9hZCgpKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTk0NCwxMSArOTQ0LDExIEBACiAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtdFBhdHRlcm4yRGV2aWNlID0gcFBhdHRlcm4tPm1fUGF0dGVybjJGb3JtOwogICAgIG10UGF0dGVybjJEZXZpY2UuQ29uY2F0KCpwT2JqMkRldmljZSk7CiAgICAgR2V0U2NhbGVkTWF0cml4KG10UGF0dGVybjJEZXZpY2UpOwotICAgIEZYX0JPT0wgYkFsaWduZWQgPSBGQUxTRTsKKyAgICBib29sIGJBbGlnbmVkID0gZmFsc2U7CiAgICAgaWYgKHBQYXR0ZXJuLT5tX0JCb3gubGVmdCA9PSAwICYmIHBQYXR0ZXJuLT5tX0JCb3guYm90dG9tID09IDAgJiYKICAgICAgICAgICAgIHBQYXR0ZXJuLT5tX0JCb3gucmlnaHQgPT0gcFBhdHRlcm4tPm1fWFN0ZXAgJiYgcFBhdHRlcm4tPm1fQkJveC50b3AgPT0gcFBhdHRlcm4tPm1fWVN0ZXAgJiYKICAgICAgICAgICAgIChtdFBhdHRlcm4yRGV2aWNlLklzU2NhbGVkKCkgfHwgbXRQYXR0ZXJuMkRldmljZS5JczkwUm90YXRlZCgpKSkgewotICAgICAgICBiQWxpZ25lZCA9IFRSVUU7CisgICAgICAgIGJBbGlnbmVkID0gdHJ1ZTsKICAgICB9CiAgICAgQ0ZYX0Zsb2F0UmVjdCBjZWxsX2Jib3ggPSBwUGF0dGVybi0+bV9CQm94OwogICAgIG10UGF0dGVybjJEZXZpY2UuVHJhbnNmb3JtUmVjdChjZWxsX2Jib3gpOwpAQCAtMTA3NSwxMSArMTA3NSwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIENvbXBvc2l0ZURJQml0bWFwKCZzY3JlZW4sIGNsaXBfYm94LmxlZnQsIGNsaXBfYm94LnRvcCwgMCwgMjU1LCBGWERJQl9CTEVORF9OT1JNQUwsIEZBTFNFKTsKKyAgICBDb21wb3NpdGVESUJpdG1hcCgmc2NyZWVuLCBjbGlwX2JveC5sZWZ0LCBjbGlwX2JveC50b3AsIDAsIDI1NSwgRlhESUJfQkxFTkRfTk9STUFMLCBmYWxzZSk7CiAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKICAgICBkZWxldGUgcFBhdHRlcm5CaXRtYXA7CiB9Ci12b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3UGF0aFdpdGhQYXR0ZXJuKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBDUERGX0NvbG9yKiBwQ29sb3IsIEZYX0JPT0wgYlN0cm9rZSkKK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdQYXRoV2l0aFBhdHRlcm4oQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIENQREZfQ29sb3IqIHBDb2xvciwgYm9vbCBiU3Ryb2tlKQogewogICAgIENQREZfUGF0dGVybiogcGF0dGVybiA9IHBDb2xvci0+R2V0UGF0dGVybigpOwogICAgIGlmIChwYXR0ZXJuID09IE5VTEwpIHsKQEAgLTEwOTEsMjAgKzEwOTEsMjAgQEAKICAgICAgICAgRHJhd1NoYWRpbmdQYXR0ZXJuKChDUERGX1NoYWRpbmdQYXR0ZXJuKilwYXR0ZXJuLCBwUGF0aE9iaiwgcE9iajJEZXZpY2UsIGJTdHJva2UpOwogICAgIH0KIH0KLXZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NQYXRoUGF0dGVybihDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgaW50JiBmaWxsdHlwZSwgRlhfQk9PTCYgYlN0cm9rZSkKK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NQYXRoUGF0dGVybihDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgaW50JiBmaWxsdHlwZSwgYm9vbCYgYlN0cm9rZSkKIHsKICAgICBpZihmaWxsdHlwZSkgewogICAgICAgICBDUERGX0NvbG9yJiBGaWxsQ29sb3IgPSAqcFBhdGhPYmotPm1fQ29sb3JTdGF0ZS5HZXRGaWxsQ29sb3IoKTsKICAgICAgICAgaWYoRmlsbENvbG9yLm1fcENTICYmIEZpbGxDb2xvci5tX3BDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfUEFUVEVSTikgewotICAgICAgICAgICAgRHJhd1BhdGhXaXRoUGF0dGVybihwUGF0aE9iaiwgcE9iajJEZXZpY2UsICZGaWxsQ29sb3IsIEZBTFNFKTsKKyAgICAgICAgICAgIERyYXdQYXRoV2l0aFBhdHRlcm4ocFBhdGhPYmosIHBPYmoyRGV2aWNlLCAmRmlsbENvbG9yLCBmYWxzZSk7CiAgICAgICAgICAgICBmaWxsdHlwZSA9IDA7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYoYlN0cm9rZSkgewogICAgICAgICBDUERGX0NvbG9yJiBTdHJva2VDb2xvciA9ICpwUGF0aE9iai0+bV9Db2xvclN0YXRlLkdldFN0cm9rZUNvbG9yKCk7CiAgICAgICAgIGlmKFN0cm9rZUNvbG9yLm1fcENTICYmIFN0cm9rZUNvbG9yLm1fcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19QQVRURVJOKSB7Ci0gICAgICAgICAgICBEcmF3UGF0aFdpdGhQYXR0ZXJuKHBQYXRoT2JqLCBwT2JqMkRldmljZSwgJlN0cm9rZUNvbG9yLCBUUlVFKTsKLSAgICAgICAgICAgIGJTdHJva2UgPSBGQUxTRTsKKyAgICAgICAgICAgIERyYXdQYXRoV2l0aFBhdHRlcm4ocFBhdGhPYmosIHBPYmoyRGV2aWNlLCAmU3Ryb2tlQ29sb3IsIHRydWUpOworICAgICAgICAgICAgYlN0cm9rZSA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl90ZXh0LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfdGV4dC5jcHAKaW5kZXggYWQ1ZGM1OC4uMjYxMzhhOSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl90ZXh0LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX3RleHQuY3BwCkBAIC05LDcgKzksNyBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaCIKICNpbmNsdWRlICIuLi9mcGRmX3BhZ2UvcGFnZWludC5oIgogI2luY2x1ZGUgInJlbmRlcl9pbnQuaCIKLWV4dGVybiBGWF9CT09MIElzQXZhaWxhYmxlTWF0cml4KGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCk7CitleHRlcm4gYm9vbCBJc0F2YWlsYWJsZU1hdHJpeChjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpOwogQ1BERl9UeXBlM0NhY2hlOjp+Q1BERl9UeXBlM0NhY2hlKCkKIHsKICAgICBGWF9QT1NJVElPTiBwb3MgPSBtX1NpemVNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwpAQCAtNzYsMjggKzc2LDI4IEBACiAgICAgdG9wX2xpbmUgPSBfQWRqdXN0Qmx1ZSh0b3AsIG1fVG9wQmx1ZUNvdW50LCBtX1RvcEJsdWUpOwogICAgIGJvdHRvbV9saW5lID0gX0FkanVzdEJsdWUoYm90dG9tLCBtX0JvdHRvbUJsdWVDb3VudCwgbV9Cb3R0b21CbHVlKTsKIH0KLXN0YXRpYyBGWF9CT09MIF9Jc1NjYW5MaW5lMWJwcCh1aW50OF90KiBwQnVmLCBpbnQgd2lkdGgpCitzdGF0aWMgYm9vbCBfSXNTY2FuTGluZTFicHAodWludDhfdCogcEJ1ZiwgaW50IHdpZHRoKQogewogICAgIGludCBzaXplID0gd2lkdGggLyA4OwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArKykKICAgICAgICAgaWYgKHBCdWZbaV0pIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICBpZiAod2lkdGggJSA4KQogICAgICAgICBpZiAocEJ1Zlt3aWR0aCAvIDhdICYgKDB4ZmYgPDwgKDggLSB3aWR0aCAlIDgpKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1zdGF0aWMgRlhfQk9PTCBfSXNTY2FuTGluZThicHAodWludDhfdCogcEJ1ZiwgaW50IHdpZHRoKQorc3RhdGljIGJvb2wgX0lzU2NhbkxpbmU4YnBwKHVpbnQ4X3QqIHBCdWYsIGludCB3aWR0aCkKIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpZHRoOyBpICsrKQogICAgICAgICBpZiAocEJ1ZltpXSA+IDB4NDApIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotc3RhdGljIGludCBfRGV0ZWN0Rmlyc3RMYXN0U2Nhbihjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIEZYX0JPT0wgYkZpcnN0KQorc3RhdGljIGludCBfRGV0ZWN0Rmlyc3RMYXN0U2Nhbihjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGJvb2wgYkZpcnN0KQogewogICAgIGludCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKSwgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpLCB3aWR0aCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7CiAgICAgaW50IGJwcCA9IHBCaXRtYXAtPkdldEJQUCgpOwpAQCAtMTM3LDEyICsxMzcsMTIgQEAKICAgICBpbnQgbGVmdCwgdG9wOwogICAgIGlmIChGWFNZU19mYWJzKGltYWdlX21hdHJpeC5iKSA8IEZYU1lTX2ZhYnMoaW1hZ2VfbWF0cml4LmEpIC8gMTAwICYmIEZYU1lTX2ZhYnMoaW1hZ2VfbWF0cml4LmMpIDwgRlhTWVNfZmFicyhpbWFnZV9tYXRyaXguZCkgLyAxMDApIHsKICAgICAgICAgaW50IHRvcF9saW5lLCBib3R0b21fbGluZTsKLSAgICAgICAgdG9wX2xpbmUgPSBfRGV0ZWN0Rmlyc3RMYXN0U2NhbihwQml0bWFwLCBUUlVFKTsKLSAgICAgICAgYm90dG9tX2xpbmUgPSBfRGV0ZWN0Rmlyc3RMYXN0U2NhbihwQml0bWFwLCBGQUxTRSk7CisgICAgICAgIHRvcF9saW5lID0gX0RldGVjdEZpcnN0TGFzdFNjYW4ocEJpdG1hcCwgdHJ1ZSk7CisgICAgICAgIGJvdHRvbV9saW5lID0gX0RldGVjdEZpcnN0TGFzdFNjYW4ocEJpdG1hcCwgZmFsc2UpOwogICAgICAgICBpZiAodG9wX2xpbmUgPT0gMCAmJiBib3R0b21fbGluZSA9PSBwQml0bWFwLT5HZXRIZWlnaHQoKSAtIDEpIHsKICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcF95ID0gaW1hZ2VfbWF0cml4LmQgKyBpbWFnZV9tYXRyaXguZjsKICAgICAgICAgICAgIEZYX0ZMT0FUIGJvdHRvbV95ID0gaW1hZ2VfbWF0cml4LmY7Ci0gICAgICAgICAgICBGWF9CT09MIGJGbGlwcGVkID0gdG9wX3kgPiBib3R0b21feTsKKyAgICAgICAgICAgIGJvb2wgYkZsaXBwZWQgPSB0b3BfeSA+IGJvdHRvbV95OwogICAgICAgICAgICAgaWYgKGJGbGlwcGVkKSB7CiAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdGVtcCA9IHRvcF95OwogICAgICAgICAgICAgICAgIHRvcF95ID0gYm90dG9tX3k7CkBAIC0xODUsNzYgKzE4NSw3NiBAQAogICAgIHZhX2VuZChhcmdMaXN0KTsKICAgICBtX0tleUxlbiA9IGNvdW50ICogc2l6ZW9mKEZYX0RXT1JEKTsKIH0KLUZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NUZXh0KGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIENGWF9QYXRoRGF0YSogcENsaXBwaW5nUGF0aCkKK2Jvb2wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NUZXh0KGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIENGWF9QYXRoRGF0YSogcENsaXBwaW5nUGF0aCkKIHsKICAgICBpZih0ZXh0b2JqLT5tX25DaGFycyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaW50IHRleHRfcmVuZGVyX21vZGUgPSB0ZXh0b2JqLT5tX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9UZXh0TW9kZTsKICAgICBpZiAodGV4dF9yZW5kZXJfbW9kZSA9PSAzKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQ1BERl9Gb250KiBwRm9udCA9IHRleHRvYmotPm1fVGV4dFN0YXRlLkdldEZvbnQoKTsKICAgICBpZiAocEZvbnQtPkdldEZvbnRUeXBlKCkgPT0gUERGRk9OVF9UWVBFMykgewogICAgICAgICByZXR1cm4gUHJvY2Vzc1R5cGUzVGV4dCh0ZXh0b2JqLCBwT2JqMkRldmljZSk7CiAgICAgfQotICAgIEZYX0JPT0wgYkZpbGwgPSBGQUxTRSwgYlN0cm9rZSA9IEZBTFNFLCBiQ2xpcCA9IEZBTFNFOworICAgIGJvb2wgYkZpbGwgPSBmYWxzZSwgYlN0cm9rZSA9IGZhbHNlLCBiQ2xpcCA9IGZhbHNlOwogICAgIGlmIChwQ2xpcHBpbmdQYXRoKSB7Ci0gICAgICAgIGJDbGlwID0gVFJVRTsKKyAgICAgICAgYkNsaXAgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHN3aXRjaCAodGV4dF9yZW5kZXJfbW9kZSkgewogICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIGJGaWxsID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiRmlsbCA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgaWYgKHBGb250LT5HZXRGYWNlKCkgPT0gTlVMTCAmJiAhKHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX0dMWVBIUEFUSCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYkZpbGwgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBiRmlsbCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYlN0cm9rZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJTdHJva2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICBpZiAocEZvbnQtPkdldEZhY2UoKSA9PSBOVUxMICYmICEocEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfR0xZUEhQQVRIKSkgewotICAgICAgICAgICAgICAgICAgICBiRmlsbCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJGaWxsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiRmlsbCA9IGJTdHJva2UgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBiRmlsbCA9IGJTdHJva2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYkZpbGwgPSBUUlVFOworICAgICAgICAgICAgICAgIGJGaWxsID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICBGWF9BUkdCIHN0cm9rZV9hcmdiID0gMCwgZmlsbF9hcmdiID0gMDsKLSAgICBGWF9CT09MIGJQYXR0ZXJuID0gRkFMU0U7CisgICAgYm9vbCBiUGF0dGVybiA9IGZhbHNlOwogICAgIGlmIChiU3Ryb2tlKSB7CiAgICAgICAgIGlmICh0ZXh0b2JqLT5tX0NvbG9yU3RhdGUuR2V0U3Ryb2tlQ29sb3IoKS0+SXNQYXR0ZXJuKCkpIHsKLSAgICAgICAgICAgIGJQYXR0ZXJuID0gVFJVRTsKKyAgICAgICAgICAgIGJQYXR0ZXJuID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN0cm9rZV9hcmdiID0gR2V0U3Ryb2tlQXJnYih0ZXh0b2JqKTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoYkZpbGwpIHsKICAgICAgICAgaWYgKHRleHRvYmotPm1fQ29sb3JTdGF0ZS5HZXRGaWxsQ29sb3IoKS0+SXNQYXR0ZXJuKCkpIHsKLSAgICAgICAgICAgIGJQYXR0ZXJuID0gVFJVRTsKKyAgICAgICAgICAgIGJQYXR0ZXJuID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZpbGxfYXJnYiA9IEdldEZpbGxBcmdiKHRleHRvYmopOwogICAgICAgICB9CiAgICAgfQogICAgIENGWF9BZmZpbmVNYXRyaXggdGV4dF9tYXRyaXg7CiAgICAgdGV4dG9iai0+R2V0VGV4dE1hdHJpeCgmdGV4dF9tYXRyaXgpOwotICAgIGlmKElzQXZhaWxhYmxlTWF0cml4KHRleHRfbWF0cml4KSA9PSBGQUxTRSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICBpZihJc0F2YWlsYWJsZU1hdHJpeCh0ZXh0X21hdHJpeCkgPT0gZmFsc2UpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSA9IHRleHRvYmotPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCk7CiAgICAgaWYgKGJQYXR0ZXJuKSB7CiAgICAgICAgIERyYXdUZXh0UGF0aFdpdGhQYXR0ZXJuKHRleHRvYmosIHBPYmoyRGV2aWNlLCBwRm9udCwgZm9udF9zaXplLCAmdGV4dF9tYXRyaXgsIGJGaWxsLCBiU3Ryb2tlKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoYkNsaXAgfHwgYlN0cm9rZSkgewogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwRGV2aWNlTWF0cml4ID0gcE9iajJEZXZpY2U7CkBAIC0yOTMsNyArMjkzLDcgQEAKICAgICBpZiAocEZvbnQtPm1fcERvY3VtZW50ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHBGb250LT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0Rm9udChwRm9udC0+R2V0Rm9udERpY3QoKSwgRkFMU0UpOworICAgIHBGb250LT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0Rm9udChwRm9udC0+R2V0Rm9udERpY3QoKSwgZmFsc2UpOwogICAgIHJldHVybiBwRm9udC0+bV9wRG9jdW1lbnQtPkdldFJlbmRlckRhdGEoKS0+R2V0Q2FjaGVkVHlwZTMocEZvbnQpOwogfQogc3RhdGljIHZvaWQgUmVsZWFzZUNhY2hlZFR5cGUzKENQREZfVHlwZTNGb250KiBwRm9udCkKQEAgLTMwNCwxMCArMzA0LDEwIEBACiAgICAgcEZvbnQtPm1fcERvY3VtZW50LT5HZXRSZW5kZXJEYXRhKCktPlJlbGVhc2VDYWNoZWRUeXBlMyhwRm9udCk7CiAgICAgcEZvbnQtPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlRm9udChwRm9udC0+R2V0Rm9udERpY3QoKSk7CiB9Ci1GWF9CT09MIENQREZfVHlwZTNDaGFyOjpMb2FkQml0bWFwKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQpCitib29sIENQREZfVHlwZTNDaGFyOjpMb2FkQml0bWFwKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQpCiB7CiAgICAgaWYgKG1fcEJpdG1hcCAhPSBOVUxMIHx8IG1fcEZvcm0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChtX3BGb3JtLT5Db3VudE9iamVjdHMoKSA9PSAxICYmICFtX2JDb2xvcmVkKSB7CiAgICAgICAgIENQREZfUGFnZU9iamVjdCAqcFBhZ2VPYmogPSBtX3BGb3JtLT5HZXRPYmplY3RBdChtX3BGb3JtLT5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCkpOwpAQCAtMzIxLDEwICszMjEsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlbGV0ZSBtX3BGb3JtOwogICAgICAgICAgICAgbV9wRm9ybSA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBjbGFzcyBDUERGX1JlZlR5cGUzQ2FjaGUKIHsKQEAgLTM0MywxMiArMzQzLDEyIEBACiAgICAgRlhfRFdPUkQgbV9kd0NvdW50OwogICAgIENQREZfVHlwZTNGb250KiBtX3BUeXBlM0ZvbnQ7CiB9OwotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1R5cGUzVGV4dChjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQorYm9vbCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1R5cGUzVGV4dChjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQogewogICAgIENQREZfVHlwZTNGb250KiBwVHlwZTNGb250ID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udCgpLT5HZXRUeXBlM0ZvbnQoKTsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1fVHlwZTNGb250Q2FjaGUuR2V0U2l6ZSgpOyBqKyspCiAgICAgICAgIGlmICgoQ1BERl9UeXBlM0ZvbnQqKW1fVHlwZTNGb250Q2FjaGUuR2V0QXQoaikgPT0gcFR5cGUzRm9udCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIENGWF9NYXRyaXggZENUTSA9IG1fcERldmljZS0+R2V0Q1RNKCk7CiAgICAgRlhfRkxPQVQgc2EgPSBGWFNZU19mYWJzKGRDVE0uYSk7CkBAIC0zNTgsMTQgKzM1OCwxNCBAQAogICAgIENGWF9BZmZpbmVNYXRyaXggY2hhcl9tYXRyaXggPSBwVHlwZTNGb250LT5HZXRGb250TWF0cml4KCk7CiAgICAgRlhfRkxPQVQgZm9udF9zaXplID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsKICAgICBjaGFyX21hdHJpeC5TY2FsZShmb250X3NpemUsIGZvbnRfc2l6ZSk7Ci0gICAgRlhfQVJHQiBmaWxsX2FyZ2IgPSBHZXRGaWxsQXJnYih0ZXh0b2JqLCBUUlVFKTsKKyAgICBGWF9BUkdCIGZpbGxfYXJnYiA9IEdldEZpbGxBcmdiKHRleHRvYmosIHRydWUpOwogICAgIGludCBmaWxsX2FscGhhID0gRlhBUkdCX0EoZmlsbF9hcmdiKTsKICAgICBpbnQgZGV2aWNlX2NsYXNzID0gbV9wRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpOwogICAgIEZYVEVYVF9HTFlQSFBPUyogcEdseXBoQW5kUG9zID0gTlVMTDsKICAgICBpZiAoZGV2aWNlX2NsYXNzID09IEZYRENfRElTUExBWSkgewogICAgICAgICBwR2x5cGhBbmRQb3MgPSBGWF9BbGxvYyhGWFRFWFRfR0xZUEhQT1MsIHRleHRvYmotPm1fbkNoYXJzKTsKICAgICB9IGVsc2UgaWYgKGZpbGxfYWxwaGEgPCAyNTUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfUmVmVHlwZTNDYWNoZSByZWZUeXBlQ2FjaGUocFR5cGUzRm9udCk7CiAgICAgRlhfRFdPUkQgKnBDaGFycyA9IHRleHRvYmotPm1fcENoYXJDb2RlczsKQEAgLTM5OSw3ICszOTksNyBAQAogICAgICAgICAgICAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKICAgICAgICAgICAgICAgICBwR2x5cGhBbmRQb3MgPSBOVUxMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQ1BERl9HcmFwaGljU3RhdGVzKiBwU3RhdGVzID0gQ2xvbmVPYmpTdGF0ZXModGV4dG9iaiwgRkFMU0UpOworICAgICAgICAgICAgQ1BERl9HcmFwaGljU3RhdGVzKiBwU3RhdGVzID0gQ2xvbmVPYmpTdGF0ZXModGV4dG9iaiwgZmFsc2UpOwogICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zIE9wdGlvbnMgPSBtX09wdGlvbnM7CiAgICAgICAgICAgICBPcHRpb25zLm1fRmxhZ3MgfD0gUkVOREVSX0ZPUkNFX0hBTEZUT05FIHwgUkVOREVSX1JFQ1RfQUE7CiAgICAgICAgICAgICBPcHRpb25zLm1fRmxhZ3MgJj0gflJFTkRFUl9GT1JDRV9ET1dOU0FNUExFOwpAQCAtNDEwLDcgKzQxMCw3IEBACiAgICAgICAgICAgICBpZiAoZmlsbF9hbHBoYSA9PSAyNTUpIHsKICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7CiAgICAgICAgICAgICAgICAgc3RhdHVzLkluaXRpYWxpemUobV9wQ29udGV4dCwgbV9wRGV2aWNlLCBOVUxMLCBOVUxMLCB0aGlzLCBwU3RhdGVzLCAmT3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHlwZTNDaGFyLT5tX3BGb3JtLT5tX1RyYW5zcGFyZW5jeSwgbV9iRHJvcE9iamVjdHMsIHBGb3JtUmVzb3VyY2UsIEZBTFNFLCBwVHlwZTNDaGFyLCBmaWxsX2FyZ2IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUeXBlM0NoYXItPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5LCBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSwgZmFsc2UsIHBUeXBlM0NoYXIsIGZpbGxfYXJnYik7CiAgICAgICAgICAgICAgICAgc3RhdHVzLm1fVHlwZTNGb250Q2FjaGUuQXBwZW5kKG1fVHlwZTNGb250Q2FjaGUpOwogICAgICAgICAgICAgICAgIHN0YXR1cy5tX1R5cGUzRm9udENhY2hlLkFkZChwVHlwZTNGb250KTsKICAgICAgICAgICAgICAgICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOwpAQCAtNDIyLDEyICs0MjIsMTIgQEAKICAgICAgICAgICAgICAgICBGWF9SRUNUIHJlY3QgPSByZWN0X2YuR2V0T3V0dGVyUmVjdCgpOwogICAgICAgICAgICAgICAgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2U7CiAgICAgICAgICAgICAgICAgaWYgKCFiaXRtYXBfZGV2aWNlLkNyZWF0ZSgoaW50KShyZWN0LldpZHRoKCkgKiBzYSksIChpbnQpKHJlY3QuSGVpZ2h0KCkgKiBzZCksIEZYRElCX0FyZ2IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYml0bWFwX2RldmljZS5HZXRCaXRtYXAoKS0+Q2xlYXIoMCk7CiAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgc3RhdHVzOwogICAgICAgICAgICAgICAgIHN0YXR1cy5Jbml0aWFsaXplKG1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlLCBOVUxMLCBOVUxMLCB0aGlzLCBwU3RhdGVzLCAmT3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHlwZTNDaGFyLT5tX3BGb3JtLT5tX1RyYW5zcGFyZW5jeSwgbV9iRHJvcE9iamVjdHMsIHBGb3JtUmVzb3VyY2UsIEZBTFNFLCBwVHlwZTNDaGFyLCBmaWxsX2FyZ2IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUeXBlM0NoYXItPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5LCBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSwgZmFsc2UsIHBUeXBlM0NoYXIsIGZpbGxfYXJnYik7CiAgICAgICAgICAgICAgICAgc3RhdHVzLm1fVHlwZTNGb250Q2FjaGUuQXBwZW5kKG1fVHlwZTNGb250Q2FjaGUpOwogICAgICAgICAgICAgICAgIHN0YXR1cy5tX1R5cGUzRm9udENhY2hlLkFkZChwVHlwZTNGb250KTsKICAgICAgICAgICAgICAgICBtYXRyaXguVHJhbnNsYXRlSSgtcmVjdC5sZWZ0LCAtcmVjdC50b3ApOwpAQCAtNDU3LDExICs0NTcsMTEgQEAKICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4IGltYWdlX21hdHJpeCA9IHBUeXBlM0NoYXItPm1fSW1hZ2VNYXRyaXg7CiAgICAgICAgICAgICAgICAgaW1hZ2VfbWF0cml4LkNvbmNhdChtYXRyaXgpOwogICAgICAgICAgICAgICAgIENQREZfSW1hZ2VSZW5kZXJlciByZW5kZXJlcjsKLSAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIuU3RhcnQodGhpcywgcFR5cGUzQ2hhci0+bV9wQml0bWFwLCBmaWxsX2FyZ2IsIDI1NSwgJmltYWdlX21hdHJpeCwgMCwgRkFMU0UpKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLlN0YXJ0KHRoaXMsIHBUeXBlM0NoYXItPm1fcEJpdG1hcCwgZmlsbF9hcmdiLCAyNTUsICZpbWFnZV9tYXRyaXgsIDAsIGZhbHNlKSkgewogICAgICAgICAgICAgICAgICAgICByZW5kZXJlci5Db250aW51ZShOVUxMKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKCFyZW5kZXJlci5tX1Jlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ3MSw3ICs0NzEsNyBAQAogICAgICAgICBDRlhfRElCaXRtYXAgYml0bWFwOwogICAgICAgICBpZiAoIWJpdG1hcC5DcmVhdGUoKGludCkocmVjdC5XaWR0aCgpICogc2EpLCAoaW50KShyZWN0LkhlaWdodCgpICogc2QpLCBGWERJQl84YnBwTWFzaykpIHsKICAgICAgICAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgYml0bWFwLkNsZWFyKDApOwogICAgICAgICBmb3IgKGludCBpQ2hhciA9IDA7IGlDaGFyIDwgdGV4dG9iai0+bV9uQ2hhcnM7IGlDaGFyICsrKSB7CkBAIC00ODcsNyArNDg3LDcgQEAKICAgICAgICAgbV9wRGV2aWNlLT5TZXRCaXRNYXNrKCZiaXRtYXAsIHJlY3QubGVmdCwgcmVjdC50b3AsIGZpbGxfYXJnYik7CiAgICAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBjbGFzcyBDUERGX0NoYXJQb3NMaXN0CiB7CkBAIC01MTUsMTMgKzUxNSwxMyBAQAogICAgIG1fcENoYXJQb3MgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgbkNoYXJzKTsKICAgICBtX25DaGFycyA9IDA7CiAgICAgQ1BERl9DSURGb250KiBwQ0lERm9udCA9IHBGb250LT5HZXRDSURGb250KCk7Ci0gICAgRlhfQk9PTCBiVmVydFdyaXRpbmcgPSBwQ0lERm9udCAmJiBwQ0lERm9udC0+SXNWZXJ0V3JpdGluZygpOworICAgIGJvb2wgYlZlcnRXcml0aW5nID0gcENJREZvbnQgJiYgcENJREZvbnQtPklzVmVydFdyaXRpbmcoKTsKICAgICBmb3IgKGludCBpQ2hhciA9IDA7IGlDaGFyIDwgbkNoYXJzOyBpQ2hhciArKykgewogICAgICAgICBGWF9EV09SRCBDaGFyQ29kZSA9IG5DaGFycyA9PSAxID8gKEZYX0RXT1JEKSh1aW50cHRyX3QpcENoYXJDb2RlcyA6IHBDaGFyQ29kZXNbaUNoYXJdOwogICAgICAgICBpZiAoQ2hhckNvZGUgPT0gKEZYX0RXT1JEKSAtIDEpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIEZYX0JPT0wgYlZlcnQgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiVmVydCA9IGZhbHNlOwogICAgICAgICBGWFRFWFRfQ0hBUlBPUyYgY2hhcnBvcyA9IG1fcENoYXJQb3NbbV9uQ2hhcnMrK107CiAgICAgICAgIGlmIChwQ0lERm9udCkgewogICAgICAgICAgICAgY2hhcnBvcy5tX2JGb250U3R5bGUgPSBwQ0lERm9udC0+SXNGb250U3R5bGVGcm9tQ2hhckNvZGUoQ2hhckNvZGUpOwpAQCAtNTM3LDcgKzUzNyw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2hhcnBvcy5tX09yaWdpblggPSBpQ2hhciA/IHBDaGFyUG9zW2lDaGFyIC0gMV0gOiAwOwogICAgICAgICBjaGFycG9zLm1fT3JpZ2luWSA9IDA7Ci0gICAgICAgIGNoYXJwb3MubV9iR2x5cGhBZGp1c3QgPSBGQUxTRTsKKyAgICAgICAgY2hhcnBvcy5tX2JHbHlwaEFkanVzdCA9IGZhbHNlOwogICAgICAgICBpZiAocENJREZvbnQgPT0gTlVMTCkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KQEAgLTU1OCwxMSArNTU4LDExIEBACiAgICAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzNdID0gX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVszXSk7CiAgICAgICAgICAgICBjaGFycG9zLm1fT3JpZ2luWCArPSBfQ0lEVHJhbnNmb3JtVG9GbG9hdChwVHJhbnNmb3JtWzRdKSAqIEZvbnRTaXplOwogICAgICAgICAgICAgY2hhcnBvcy5tX09yaWdpblkgKz0gX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVs1XSkgKiBGb250U2l6ZTsKLSAgICAgICAgICAgIGNoYXJwb3MubV9iR2x5cGhBZGp1c3QgPSBUUlVFOworICAgICAgICAgICAgY2hhcnBvcy5tX2JHbHlwaEFkanVzdCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiB9Ci1GWF9CT09MIENQREZfVGV4dFJlbmRlcmVyOjpEcmF3VGV4dFBhdGgoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgaW50IG5DaGFycywgRlhfRFdPUkQqIHBDaGFyQ29kZXMsIEZYX0ZMT0FUKiBwQ2hhclBvcywKK2Jvb2wgQ1BERl9UZXh0UmVuZGVyZXI6OkRyYXdUZXh0UGF0aChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBpbnQgbkNoYXJzLCBGWF9EV09SRCogcENoYXJDb2RlcywgRlhfRkxPQVQqIHBDaGFyUG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJVc2VyLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKQEAgLTYzMiw3ICs2MzIsNyBAQAogICAgICAgICBGWF9GcmVlKHBDaGFyUG9zKTsKICAgICB9CiB9Ci1GWF9CT09MIENQREZfVGV4dFJlbmRlcmVyOjpEcmF3Tm9ybWFsVGV4dChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBpbnQgbkNoYXJzLCBGWF9EV09SRCogcENoYXJDb2RlcywgRlhfRkxPQVQqIHBDaGFyUG9zLAorYm9vbCBDUERGX1RleHRSZW5kZXJlcjo6RHJhd05vcm1hbFRleHQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgaW50IG5DaGFycywgRlhfRFdPUkQqIHBDaGFyQ29kZXMsIEZYX0ZMT0FUKiBwQ2hhclBvcywKICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZm9udF9zaXplLAogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJEZXZpY2UsCiAgICAgICAgIEZYX0FSR0IgZmlsbF9hcmdiLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKQpAQCAtNjcxLDEzICs2NzEsMTMgQEAKIH0KIHZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdUZXh0UGF0aFdpdGhQYXR0ZXJuKGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsCiAgICAgICAgIENQREZfRm9udCogcEZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKLSAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHRNYXRyaXgsIEZYX0JPT0wgYkZpbGwsIEZYX0JPT0wgYlN0cm9rZSkKKyAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHRNYXRyaXgsIGJvb2wgYkZpbGwsIGJvb2wgYlN0cm9rZSkKIHsKICAgICBpZiAoIWJTdHJva2UpIHsKICAgICAgICAgQ1BERl9QYXRoT2JqZWN0IHBhdGg7CiAgICAgICAgIENQREZfVGV4dE9iamVjdCogcENvcHkgPSBuZXcgQ1BERl9UZXh0T2JqZWN0OwogICAgICAgICBwQ29weS0+Q29weSh0ZXh0b2JqKTsKLSAgICAgICAgcGF0aC5tX2JTdHJva2UgPSBGQUxTRTsKKyAgICAgICAgcGF0aC5tX2JTdHJva2UgPSBmYWxzZTsKICAgICAgICAgcGF0aC5tX0ZpbGxUeXBlID0gRlhGSUxMX1dJTkRJTkc7CiAgICAgICAgIHBhdGgubV9DbGlwUGF0aC5BcHBlbmRUZXh0cygmcENvcHksIDEpOwogICAgICAgICBwYXRoLm1fQ29sb3JTdGF0ZSA9IHRleHRvYmotPm1fQ29sb3JTdGF0ZTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvcmVuZGVyX2ludC5oIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9yZW5kZXJfaW50LmgKaW5kZXggZTVmYjgzMS4uYzljODk0NCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9yZW5kZXJfaW50LmgKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9yZW5kZXJfaW50LmgKQEAgLTQ5LDkgKzQ5LDkgQEAKIHB1YmxpYzoKICAgICBDUERGX0RvY3VtZW50KgltX3BQREZEb2M7CiAgICAgdWludDhfdAkJCW1fU2FtcGxlc1syNTYgKiAzXTsKLSAgICBGWF9CT09MCQkJbV9iSWRlbnRpdHk7CisgICAgYm9vbAkJCW1fYklkZW50aXR5OwogCi0gICAgQ0ZYX0RJQlNvdXJjZSoJVHJhbnNsYXRlSW1hZ2UoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywgRlhfQk9PTCBiQXV0b0Ryb3BTcmMpOworICAgIENGWF9ESUJTb3VyY2UqCVRyYW5zbGF0ZUltYWdlKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIGJvb2wgYkF1dG9Ecm9wU3JjKTsKICAgICBGWF9DT0xPUlJFRgkJVHJhbnNsYXRlQ29sb3IoRlhfQ09MT1JSRUYgc3JjKTsKIH07CiAKQEAgLTY2LDcgKzY2LDcgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BGb250Q2FjaGU7CiAgICAgfQotICAgIHZvaWQJCQkJQ2xlYXIoRlhfQk9PTCBiUmVsZWFzZSA9IEZBTFNFKTsKKyAgICB2b2lkCQkJCUNsZWFyKGJvb2wgYlJlbGVhc2UgPSBmYWxzZSk7CiAgICAgdm9pZAkJCQlSZWxlYXNlQ2FjaGVkVHlwZTMoQ1BERl9UeXBlM0ZvbnQqIHBGb250KTsKICAgICB2b2lkCQkJCVJlbGVhc2VUcmFuc2ZlckZ1bmMoQ1BERl9PYmplY3QqIHBPYmopOwogcHJpdmF0ZToKQEAgLTkxLDI0ICs5MSwyNCBAQAogcHVibGljOgogICAgIHN0YXRpYyBJUERGX09iamVjdFJlbmRlcmVyKiBDcmVhdGUoaW50IHR5cGUpOwogICAgIHZpcnR1YWwgfklQREZfT2JqZWN0UmVuZGVyZXIoKSB7fQotICAgIHZpcnR1YWwgRlhfQk9PTCBTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiU3RkQ1MsIGludCBibGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpID0gMDsKLSAgICBGWF9CT09MCQltX1Jlc3VsdDsKKyAgICB2aXJ0dWFsIGJvb2wgU3RhcnQoQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIGJvb2wgYlN0ZENTLCBpbnQgYmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMKSA9IDA7CisgICAgdmlydHVhbCBib29sIENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSA9IDA7CisgICAgYm9vbAkJbV9SZXN1bHQ7CiB9OwogY2xhc3MgQ1BERl9SZW5kZXJTdGF0dXMKIHsKIHB1YmxpYzoKICAgICBDUERGX1JlbmRlclN0YXR1cygpOwogICAgIH5DUERGX1JlbmRlclN0YXR1cygpOwotICAgIEZYX0JPT0wJCQlJbml0aWFsaXplKGNsYXNzIENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBEZXZpY2VNYXRyaXgsCisgICAgYm9vbAkJCUluaXRpYWxpemUoY2xhc3MgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcERldmljZU1hdHJpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTdG9wT2JqLCBjb25zdCBDUERGX1JlbmRlclN0YXR1cyogcFBhcmVudFN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMqIHBJbml0aWFsU3RhdGVzLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc3BhcmVuY3ksIEZYX0JPT0wgYkRyb3BPYmplY3RzLCBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsCUNQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyID0gTlVMTCwgRlhfQVJHQiBmaWxsX2NvbG9yID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc3BhcmVuY3ksIGJvb2wgYkRyb3BPYmplY3RzLCBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0ZENTID0gZmFsc2UsCUNQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyID0gTlVMTCwgRlhfQVJHQiBmaWxsX2NvbG9yID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIGJvb2wgYkxvYWRNYXNrID0gZmFsc2UpOwogICAgIHZvaWQJCQlSZW5kZXJPYmplY3RMaXN0KGNvbnN0IENQREZfUGFnZU9iamVjdHMqIHBPYmpzLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7CiAgICAgdm9pZAkJCVJlbmRlclNpbmdsZU9iamVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgICBGWF9CT09MCQkJQ29udGludWVTaW5nbGVPYmplY3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIGJvb2wJCQlDb250aW51ZVNpbmdsZU9iamVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBJRlhfUGF1c2UqIHBQYXVzZSk7CiAgICAgQ1BERl9SZW5kZXJPcHRpb25zCW1fT3B0aW9uczsKICAgICBDUERGX0RpY3Rpb25hcnkqICAgIG1fcEZvcm1SZXNvdXJjZTsKICAgICBDUERGX0RpY3Rpb25hcnkqICAgIG1fcFBhZ2VSZXNvdXJjZTsKQEAgLTEyMiw0NSArMTIyLDQ1IEBACiAgICAgZnJpZW5kIGNsYXNzCUNQREZfUmVuZGVyQ29udGV4dDsKICAgICB2b2lkCQkJUHJvY2Vzc0NsaXBQYXRoKENQREZfQ2xpcFBhdGggQ2xpcFBhdGgsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKICAgICB2b2lkCQkJRHJhd0NsaXBQYXRoKENQREZfQ2xpcFBhdGggQ2xpcFBhdGgsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgICBGWF9CT09MCQkJUHJvY2Vzc1RyYW5zcGFyZW5jeShjb25zdCBDUERGX1BhZ2VPYmplY3QqIFBhZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKKyAgICBib29sCQkJUHJvY2Vzc1RyYW5zcGFyZW5jeShjb25zdCBDUERGX1BhZ2VPYmplY3QqIFBhZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKICAgICB2b2lkCQkJUHJvY2Vzc09iamVjdE5vQ2xpcChjb25zdCBDUERGX1BhZ2VPYmplY3QqIFBhZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKICAgICB2b2lkCQkJRHJhd09ialdpdGhCYWNrZ3JvdW5kKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIEZYX0JPT0wgICAgICAgICBEcmF3T2JqV2l0aEJsZW5kKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIEZYX0JPT0wJCQlQcm9jZXNzUGF0aChDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7Ci0gICAgdm9pZAkJCVByb2Nlc3NQYXRoUGF0dGVybihDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgaW50JiBmaWxsdHlwZSwgRlhfQk9PTCYgYlN0cm9rZSk7Ci0gICAgdm9pZAkJCURyYXdQYXRoV2l0aFBhdHRlcm4oQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIENQREZfQ29sb3IqIHBDb2xvciwgRlhfQk9PTCBiU3Ryb2tlKTsKLSAgICB2b2lkCQkJRHJhd1RpbGluZ1BhdHRlcm4oQ1BERl9UaWxpbmdQYXR0ZXJuKiBwUGF0dGVybiwgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIEZYX0JPT0wgYlN0cm9rZSk7Ci0gICAgdm9pZAkJCURyYXdTaGFkaW5nUGF0dGVybihDUERGX1NoYWRpbmdQYXR0ZXJuKiBwUGF0dGVybiwgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIEZYX0JPT0wgYlN0cm9rZSk7Ci0gICAgRlhfQk9PTAkJCVNlbGVjdENsaXBQYXRoKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJTdHJva2UpOwotICAgIEZYX0JPT0wJCQlQcm9jZXNzSW1hZ2UoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7Ci0gICAgRlhfQk9PTAkJCU91dHB1dEJpdG1hcEFscGhhKENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSk7Ci0gICAgRlhfQk9PTAkJCU91dHB1dEltYWdlKENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSk7Ci0gICAgRlhfQk9PTAkJCU91dHB1dERJQlNvdXJjZShjb25zdCBDRlhfRElCU291cmNlKiBwT3V0cHV0Qml0bWFwLCBGWF9BUkdCIGZpbGxfYXJnYiwgaW50IGJpdG1hcF9hbHBoYSwKKyAgICBib29sICAgICAgICAgRHJhd09ialdpdGhCbGVuZChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKKyAgICBib29sCQkJUHJvY2Vzc1BhdGgoQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOworICAgIHZvaWQJCQlQcm9jZXNzUGF0aFBhdHRlcm4oQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIGludCYgZmlsbHR5cGUsIGJvb2wmIGJTdHJva2UpOworICAgIHZvaWQJCQlEcmF3UGF0aFdpdGhQYXR0ZXJuKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBDUERGX0NvbG9yKiBwQ29sb3IsIGJvb2wgYlN0cm9rZSk7CisgICAgdm9pZAkJCURyYXdUaWxpbmdQYXR0ZXJuKENQREZfVGlsaW5nUGF0dGVybiogcFBhdHRlcm4sIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBib29sIGJTdHJva2UpOworICAgIHZvaWQJCQlEcmF3U2hhZGluZ1BhdHRlcm4oQ1BERl9TaGFkaW5nUGF0dGVybiogcFBhdHRlcm4sIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBib29sIGJTdHJva2UpOworICAgIGJvb2wJCQlTZWxlY3RDbGlwUGF0aChDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgYm9vbCBiU3Ryb2tlKTsKKyAgICBib29sCQkJUHJvY2Vzc0ltYWdlKENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOworICAgIGJvb2wJCQlPdXRwdXRCaXRtYXBBbHBoYShDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBJbWFnZTJEZXZpY2UpOworICAgIGJvb2wJCQlPdXRwdXRJbWFnZShDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBJbWFnZTJEZXZpY2UpOworICAgIGJvb2wJCQlPdXRwdXRESUJTb3VyY2UoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE91dHB1dEJpdG1hcCwgRlhfQVJHQiBmaWxsX2FyZ2IsIGludCBiaXRtYXBfYWxwaGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlLCBDUERGX0ltYWdlQ2FjaGUqIHBJbWFnZUNhY2hlLCBGWF9EV09SRCBmbGFncyk7CiAgICAgdm9pZAkJCUNvbXBvc2l0ZURJQml0bWFwKENGWF9ESUJpdG1hcCogcERJQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgRlhfQVJHQiBtYXNrX2FyZ2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsIGludCBibGVuZF9tb2RlLCBpbnQgYklzb2xhdGVkKTsKLSAgICBGWF9CT09MCQkJUHJvY2Vzc1NoYWRpbmcoQ1BERl9TaGFkaW5nT2JqZWN0KiBwU2hhZGluZ09iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOworICAgIGJvb2wJCQlQcm9jZXNzU2hhZGluZyhDUERGX1NoYWRpbmdPYmplY3QqIHBTaGFkaW5nT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7CiAgICAgdm9pZAkJCURyYXdTaGFkaW5nKENQREZfU2hhZGluZ1BhdHRlcm4qIHBQYXR0ZXJuLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9SRUNUJiBjbGlwX3JlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSwgRlhfQk9PTCBiQWxwaGFNb2RlKTsKLSAgICBGWF9CT09MCQkJUHJvY2Vzc1R5cGUzVGV4dChjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgICBGWF9CT09MCQkJUHJvY2Vzc1RleHQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhLCBib29sIGJBbHBoYU1vZGUpOworICAgIGJvb2wJCQlQcm9jZXNzVHlwZTNUZXh0KGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOworICAgIGJvb2wJCQlQcm9jZXNzVGV4dChjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBDRlhfUGF0aERhdGEqIHBDbGlwcGluZ1BhdGgpOwogICAgIHZvaWQJCQlEcmF3VGV4dFBhdGhXaXRoUGF0dGVybihjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250LCBGWF9GTE9BVCBmb250X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0TWF0cml4LCBGWF9CT09MIGJGaWxsLCBGWF9CT09MIGJTdHJva2UpOwotICAgIEZYX0JPT0wJCQlQcm9jZXNzRm9ybShDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0TWF0cml4LCBib29sIGJGaWxsLCBib29sIGJTdHJva2UpOworICAgIGJvb2wJCQlQcm9jZXNzRm9ybShDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7CiAgICAgQ0ZYX0RJQml0bWFwKglHZXRCYWNrZHJvcChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IEZYX1JFQ1QmIHJlY3QsIGludCYgbGVmdCwgaW50JiB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJhY2tBbHBoYVJlcXVpcmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQmFja0FscGhhUmVxdWlyZWQpOwogICAgIENGWF9ESUJpdG1hcCoJTG9hZFNNYXNrKENQREZfRGljdGlvbmFyeSogcFNNYXNrRGljdCwgRlhfUkVDVCogcENsaXBSZWN0LCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KTsKICAgICB2b2lkCQkJSW5pdChDUERGX1JlbmRlckNvbnRleHQqIHBQYXJlbnQpOwogICAgIHN0YXRpYyBjbGFzcyBDUERGX1R5cGUzQ2FjaGUqCUdldENhY2hlZFR5cGUzKENQREZfVHlwZTNGb250KiBwRm9udCk7Ci0gICAgc3RhdGljIENQREZfR3JhcGhpY1N0YXRlcyogQ2xvbmVPYmpTdGF0ZXMoY29uc3QgQ1BERl9HcmFwaGljU3RhdGVzKiBwUGF0aE9iaiwgRlhfQk9PTCBiU3Ryb2tlKTsKKyAgICBzdGF0aWMgQ1BERl9HcmFwaGljU3RhdGVzKiBDbG9uZU9ialN0YXRlcyhjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMqIHBQYXRoT2JqLCBib29sIGJTdHJva2UpOwogICAgIENQREZfVHJhbnNmZXJGdW5jKglHZXRUcmFuc2ZlckZ1bmMoQ1BERl9PYmplY3QqIHBPYmplY3QpIGNvbnN0OwotICAgIEZYX0FSR0IJCQlHZXRGaWxsQXJnYihjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIEZYX0JPT0wgYlR5cGUzID0gRkFMU0UpIGNvbnN0OworICAgIEZYX0FSR0IJCQlHZXRGaWxsQXJnYihjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGJvb2wgYlR5cGUzID0gZmFsc2UpIGNvbnN0OwogICAgIEZYX0FSR0IJCQlHZXRTdHJva2VBcmdiKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaikgY29uc3Q7CiAgICAgQ1BERl9SZW5kZXJDb250ZXh0KgkJbV9wQ29udGV4dDsKLSAgICBGWF9CT09MCQkJCQltX2JTdG9wcGVkOworICAgIGJvb2wJCQkJCW1fYlN0b3BwZWQ7CiAgICAgdm9pZAkJCURpdGhlck9iamVjdEFyZWEoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7Ci0gICAgRlhfQk9PTAkJCUdldE9iamVjdENsaXBwZWRSZWN0KGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIEZYX0JPT0wgYkxvZ2ljYWwsIEZYX1JFQ1QgJnJlY3QpIGNvbnN0OworICAgIGJvb2wJCQlHZXRPYmplY3RDbGlwcGVkUmVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBib29sIGJMb2dpY2FsLCBGWF9SRUNUICZyZWN0KSBjb25zdDsKICAgICB2b2lkCQkJR2V0U2NhbGVkTWF0cml4KENGWF9NYXRyaXggJm1hdHJpeCkgY29uc3Q7CiAKIHByb3RlY3RlZDoKQEAgLTE3NSwxMyArMTc1LDEzIEBACiAgICAgQ1BERl9HcmFwaGljU3RhdGVzCQltX0luaXRpYWxTdGF0ZXM7CiAgICAgaW50CQkJCQkJbV9IYWxmdG9uZUxpbWl0OwogICAgIElQREZfT2JqZWN0UmVuZGVyZXIqCW1fcE9iamVjdFJlbmRlcmVyOwotICAgIEZYX0JPT0wJCQkJCW1fYlByaW50OworICAgIGJvb2wJCQkJCW1fYlByaW50OwogICAgIGludAkJCQkJCW1fVHJhbnNwYXJlbmN5OwogICAgIGludAkJCQkJCW1fRGl0aGVyQml0czsKLSAgICBGWF9CT09MCQkJCQltX2JEcm9wT2JqZWN0czsKLSAgICBGWF9CT09MCQkJCQltX2JTdGRDUzsKKyAgICBib29sCQkJCQltX2JEcm9wT2JqZWN0czsKKyAgICBib29sCQkJCQltX2JTdGRDUzsKICAgICBGWF9EV09SRCAgICAgICAgICAgICAgICBtX0dyb3VwRmFtaWx5OwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIG1fYkxvYWRNYXNrOworICAgIGJvb2wgICAgICAgICAgICAgICAgIG1fYkxvYWRNYXNrOwogICAgIENQREZfVHlwZTNDaGFyICogICAgICAgIG1fcFR5cGUzQ2hhcjsKICAgICBGWF9BUkdCCQkJCQltX1QzRmlsbENvbG9yOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1fY3VyQmxlbmQ7CkBAIC0xOTQsMjAgKzE5NCwyMCBAQAogICAgICAgICBtX3BCaXRtYXAgPSBOVUxMOwogICAgICAgICBtX3BNYXNrID0gTlVMTDsKICAgICAgICAgbV9NYXR0ZUNvbG9yID0gMDsKLSAgICAgICAgbV9iQ2FjaGVkID0gRkFMU0U7CisgICAgICAgIG1fYkNhY2hlZCA9IGZhbHNlOwogICAgICAgICBtX25Eb3duc2FtcGxlV2lkdGggPSAwOwogICAgICAgICBtX25Eb3duc2FtcGxlSGVpZ2h0ID0gMDsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCQlMb2FkKGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwpOworICAgIGJvb2wJCQkJCUxvYWQoY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLCBib29sIGJTdGRDUyA9IGZhbHNlLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIGJvb2wgYkxvYWRNYXNrID0gZmFsc2UsIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJCQlTdGFydExvYWRJbWFnZShjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsIHZvaWQqJiBMb2FkSGFuZGxlLCBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzID0gTlVMTCwgaW50MzJfdCBuRG93bnNhbXBsZVdpZHRoID0gMCwgaW50MzJfdCBuRG93bnNhbXBsZUhlaWdodCA9IDApOwotICAgIEZYX0JPT0wJCQkJCUNvbnRpbnVlKHZvaWQqIExvYWRIYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICBib29sCQkJCQlTdGFydExvYWRJbWFnZShjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsIHZvaWQqJiBMb2FkSGFuZGxlLCBib29sIGJTdGRDUyA9IGZhbHNlLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIGJvb2wgYkxvYWRNYXNrID0gZmFsc2UsIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzID0gTlVMTCwgaW50MzJfdCBuRG93bnNhbXBsZVdpZHRoID0gMCwgaW50MzJfdCBuRG93bnNhbXBsZUhlaWdodCA9IDApOworICAgIGJvb2wJCQkJCUNvbnRpbnVlKHZvaWQqIExvYWRIYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKTsKICAgICB+Q1BERl9JbWFnZUxvYWRlcigpOwogICAgIENGWF9ESUJTb3VyY2UqCQkJbV9wQml0bWFwOwogICAgIENGWF9ESUJTb3VyY2UqCQkJbV9wTWFzazsKICAgICBGWF9EV09SRAkJCQltX01hdHRlQ29sb3I7Ci0gICAgRlhfQk9PTAkJCQkJbV9iQ2FjaGVkOworICAgIGJvb2wJCQkJCW1fYkNhY2hlZDsKIHByb3RlY3RlZDoKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgIG1fbkRvd25zYW1wbGVXaWR0aDsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgIG1fbkRvd25zYW1wbGVIZWlnaHQ7CkBAIC0yMTgsOCArMjE4LDggQEAKICAgICBDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGUoKTsKICAgICB+Q1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlKCk7CiAKLSAgICBGWF9CT09MCQkJU3RhcnQoQ1BERl9JbWFnZUxvYWRlciogcEltYWdlTG9hZGVyLCBjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSwgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMgPSBOVUxMLCBpbnQzMl90IG5Eb3duc2FtcGxlV2lkdGggPSAwLCBpbnQzMl90IG5Eb3duc2FtcGxlSGVpZ2h0ID0gMCk7Ci0gICAgRlhfQk9PTAkJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICBib29sCQkJU3RhcnQoQ1BERl9JbWFnZUxvYWRlciogcEltYWdlTG9hZGVyLCBjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsIGJvb2wgYlN0ZENTID0gZmFsc2UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgYm9vbCBiTG9hZE1hc2sgPSBmYWxzZSwgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMgPSBOVUxMLCBpbnQzMl90IG5Eb3duc2FtcGxlV2lkdGggPSAwLCBpbnQzMl90IG5Eb3duc2FtcGxlSGVpZ2h0ID0gMCk7CisgICAgYm9vbAkJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKIHByb3RlY3RlZDoKICAgICBDUERGX0ltYWdlTG9hZGVyKgltX3BJbWFnZUxvYWRlcjsKICAgICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogbV9wQ2FjaGU7CkBAIC0yMzMsMTAgKzIzMywxMCBAQAogcHVibGljOgogICAgIENQREZfSW1hZ2VSZW5kZXJlcigpOwogICAgIH5DUERGX0ltYWdlUmVuZGVyZXIoKTsKLSAgICBGWF9CT09MCQlTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFN0YXR1cywgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiU3RkQ1MsIGludCBibGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwotICAgIEZYX0JPT0wJCVN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwU3RhdHVzLCBjb25zdCBDRlhfRElCU291cmNlKiBwRElCU291cmNlLCBGWF9BUkdCIGJpdG1hcF9hcmdiLAotICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBJbWFnZTJEZXZpY2UsIEZYX0RXT1JEIGZsYWdzLCBGWF9CT09MIGJTdGRDUywgaW50IGJsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7Ci0gICAgRlhfQk9PTAkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIGJvb2wJCVN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwU3RhdHVzLCBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBib29sIGJTdGRDUywgaW50IGJsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CisgICAgYm9vbAkJU3RhcnQoQ1BERl9SZW5kZXJTdGF0dXMqIHBTdGF0dXMsIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBESUJTb3VyY2UsIEZYX0FSR0IgYml0bWFwX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwgRlhfRFdPUkQgZmxhZ3MsIGJvb2wgYlN0ZENTLCBpbnQgYmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKKyAgICBib29sCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CiBwcm90ZWN0ZWQ6CiAgICAgQ1BERl9SZW5kZXJTdGF0dXMqCW1fcFJlbmRlclN0YXR1czsKICAgICBDUERGX0ltYWdlT2JqZWN0KgltX3BJbWFnZU9iamVjdDsKQEAgLTI0Nyw3ICsyNDcsNyBAQAogICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqCQltX3BESUJTb3VyY2U7CiAgICAgQ0ZYX0RJQml0bWFwKgkJbV9wQ2xvbmU7CiAgICAgaW50CQkJCQltX0JpdG1hcEFscGhhOwotICAgIEZYX0JPT0wJCQkJbV9iUGF0dGVybkNvbG9yOworICAgIGJvb2wJCQkJbV9iUGF0dGVybkNvbG9yOwogICAgIENQREZfUGF0dGVybioJCW1fcFBhdHRlcm47CiAgICAgRlhfQVJHQgkJCQltX0ZpbGxBcmdiOwogICAgIEZYX0RXT1JECQkJbV9GbGFnczsKQEAgLTI1NSwyMSArMjU1LDIxIEBACiAgICAgQ0ZYX0ltYWdlVHJhbnNmb3JtZXIqCW1fcFRyYW5zZm9ybWVyOwogICAgIHZvaWQqCQkJbV9EZXZpY2VIYW5kbGU7CiAgICAgdm9pZCogICAgICAgICAgIG1fTG9hZEhhbmRsZTsKLSAgICBGWF9CT09MCQkJCW1fYlN0ZENTOworICAgIGJvb2wJCQkJbV9iU3RkQ1M7CiAgICAgaW50CQkJCQltX0JsZW5kVHlwZTsKLSAgICBGWF9CT09MCQkJCVN0YXJ0Qml0bWFwQWxwaGEoKTsKLSAgICBGWF9CT09MCQkJCVN0YXJ0RElCU291cmNlKCk7Ci0gICAgRlhfQk9PTAkJCQlTdGFydFJlbmRlckRJQlNvdXJjZSgpOwotICAgIEZYX0JPT0wJCQkJU3RhcnRMb2FkRElCU291cmNlKCk7Ci0gICAgRlhfQk9PTAkJCQlEcmF3TWFza2VkSW1hZ2UoKTsKLSAgICBGWF9CT09MCQkJCURyYXdQYXR0ZXJuSW1hZ2UoY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UpOworICAgIGJvb2wJCQkJU3RhcnRCaXRtYXBBbHBoYSgpOworICAgIGJvb2wJCQkJU3RhcnRESUJTb3VyY2UoKTsKKyAgICBib29sCQkJCVN0YXJ0UmVuZGVyRElCU291cmNlKCk7CisgICAgYm9vbAkJCQlTdGFydExvYWRESUJTb3VyY2UoKTsKKyAgICBib29sCQkJCURyYXdNYXNrZWRJbWFnZSgpOworICAgIGJvb2wJCQkJRHJhd1BhdHRlcm5JbWFnZShjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSk7CiB9OwogY2xhc3MgQ1BERl9TY2FsZWRSZW5kZXJCdWZmZXIKIHsKIHB1YmxpYzoKICAgICBDUERGX1NjYWxlZFJlbmRlckJ1ZmZlcigpOwogICAgIH5DUERGX1NjYWxlZFJlbmRlckJ1ZmZlcigpOwotICAgIEZYX0JPT0wJCQkJSW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBGWF9SRUNUKiBwUmVjdCwKKyAgICBib29sCQkJCUluaXRpYWxpemUoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgRlhfUkVDVCogcFJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zICpwT3B0aW9ucyA9IE5VTEwsIGludCBtYXhfZHBpID0gMCk7CiAgICAgQ0ZYX1JlbmRlckRldmljZSoJR2V0RGV2aWNlKCkKICAgICB7CkBAIC0yOTQsMTMgKzI5NCwxMyBAQAogcHVibGljOgogICAgIENQREZfUXVpY2tTdHJldGNoZXIoKTsKICAgICB+Q1BERl9RdWlja1N0cmV0Y2hlcigpOwotICAgIEZYX0JPT0wJCVN0YXJ0KENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwgY29uc3QgRlhfUkVDVCogcENsaXBCb3gpOwotICAgIEZYX0JPT0wJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICBib29sCQlTdGFydChDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmosIENGWF9BZmZpbmVNYXRyaXgqIHBJbWFnZTJEZXZpY2UsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwQm94KTsKKyAgICBib29sCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CiAgICAgQ0ZYX0RJQml0bWFwKgltX3BCaXRtYXA7CiAgICAgaW50CQkJbV9SZXN1bHRMZWZ0LCBtX1Jlc3VsdFRvcCwgbV9DbGlwTGVmdCwgbV9DbGlwVG9wOwogICAgIGludAkJCW1fRGVzdFdpZHRoLCBtX0Rlc3RIZWlnaHQsIG1fUmVzdWx0V2lkdGgsIG1fUmVzdWx0SGVpZ2h0OwogICAgIGludAkJCW1fQnBwLCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodDsKLSAgICBGWF9CT09MCQltX2JGbGlwWCwgbV9iRmxpcFk7CisgICAgYm9vbAkJbV9iRmxpcFgsIG1fYkZsaXBZOwogICAgIENQREZfQ29sb3JTcGFjZSoJbV9wQ1M7CiAgICAgSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJbV9wRGVjb2RlcjsKICAgICBDUERGX1N0cmVhbUFjYyBtX1N0cmVhbUFjYzsKQEAgLTMxMSw3ICszMTEsNyBAQAogcHVibGljOgogICAgIENQREZfRGV2aWNlQnVmZmVyKCk7CiAgICAgfkNQREZfRGV2aWNlQnVmZmVyKCk7Ci0gICAgRlhfQk9PTAkJCQlJbml0aWFsaXplKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIEZYX1JFQ1QqIHBSZWN0LAorICAgIGJvb2wJCQkJSW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBGWF9SRUNUKiBwUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBpbnQgbWF4X2RwaSA9IDApOwogICAgIHZvaWQJCQkJT3V0cHV0VG9EZXZpY2UoKTsKICAgICBDRlhfRElCaXRtYXAqCQlHZXRCaXRtYXAoKSBjb25zdApAQCAtMzM3LDggKzMzNyw4IEBACiAgICAgfkNQREZfSW1hZ2VDYWNoZSgpOwogICAgIHZvaWQJCQkJQ2xlYXJJbWFnZURhdGEoKTsKICAgICB2b2lkCQkJCVJlc2V0KGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCk7Ci0gICAgRlhfQk9PTAkJCQlHZXRDYWNoZWRCaXRtYXAoQ0ZYX0RJQlNvdXJjZSomIHBCaXRtYXAsIENGWF9ESUJTb3VyY2UqJiBwTWFzaywgRlhfRFdPUkQmIE1hdHRlQ29sb3IsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFLAorICAgIGJvb2wJCQkJR2V0Q2FjaGVkQml0bWFwKENGWF9ESUJTb3VyY2UqJiBwQml0bWFwLCBDRlhfRElCU291cmNlKiYgcE1hc2ssIEZYX0RXT1JEJiBNYXR0ZUNvbG9yLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0ZENTID0gZmFsc2UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgYm9vbCBiTG9hZE1hc2sgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsIGludDMyX3QgZG93bnNhbXBsZVdpZHRoID0gMCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0ID0gMCk7CiAgICAgRlhfRFdPUkQJCQlFc3RpbWF0ZVNpemUoKSBjb25zdAogICAgIHsKQEAgLTM1OSw4ICszNTksOCBAQAogICAgIGludAkJCQkJbV9kd1RpbWVDb3VudDsKIHB1YmxpYzoKICAgICBpbnQJCQkJCVN0YXJ0R2V0Q2FjaGVkQml0bWFwKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCi0gICAgICAgICAgICBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsCi0gICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsIGludDMyX3QgZG93bnNhbXBsZVdpZHRoID0gMCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0ID0gMCk7CisgICAgICAgICAgICBib29sIGJTdGRDUyA9IGZhbHNlLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsCisgICAgICAgICAgICBib29sIGJMb2FkTWFzayA9IGZhbHNlLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsIGludDMyX3QgZG93bnNhbXBsZVdpZHRoID0gMCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0ID0gMCk7CiAgICAgaW50CQkJCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CiAgICAgaW50IAkJCQlDb250aW51ZUdldENhY2hlZEJpdG1hcCgpOwogICAgIENGWF9ESUJTb3VyY2UqCQlEZXRhY2hCaXRtYXAoKTsKQEAgLTM4OCwyMyArMzg4LDIzIEBACiBwdWJsaWM6CiAgICAgQ1BERl9ESUJTb3VyY2UoKTsKICAgICB2aXJ0dWFsIH5DUERGX0RJQlNvdXJjZSgpOwotICAgIEZYX0JPT0wJCQkJTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwKKyAgICBib29sCQkJCUxvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRElCU291cmNlKiogcHBNYXNrLCBGWF9EV09SRCogcE1hdHRlQ29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpIGNvbnN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdGRDUyA9IGZhbHNlLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIGJvb2wgYkxvYWRNYXNrID0gZmFsc2UpOworICAgIHZpcnR1YWwgYm9vbAkJU2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKSBjb25zdDsKICAgICB2aXJ0dWFsCXVpbnQ4X3QqCUdldEJ1ZmZlcigpIGNvbnN0OwogICAgIHZpcnR1YWwgY29uc3QgdWludDhfdCoJR2V0U2NhbmxpbmUoaW50IGxpbmUpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZAkJRG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLCB1aW50OF90KiBkZXN0X3NjYW4sIGludCBkZXN0X2JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgRlhfQk9PTCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgYm9vbCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQJCVNldERvd25TYW1wbGVTaXplKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpIGNvbnN0OwogICAgIENGWF9ESUJpdG1hcCoJCUdldEJpdG1hcCgpIGNvbnN0OwogICAgIHZvaWQJCQkJUmVsZWFzZUJpdG1hcChDRlhfRElCaXRtYXAqKSBjb25zdDsKICAgICB2b2lkCQkJCUNsZWFySW1hZ2VEYXRhKCk7CiBwdWJsaWM6Ci0gICAgaW50CQkJCQlTdGFydExvYWRESUJTb3VyY2UoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYkhhc01hc2ssCisgICAgaW50CQkJCQlTdGFydExvYWRESUJTb3VyY2UoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sIGJvb2wgYkhhc01hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0ZENTID0gZmFsc2UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgYm9vbCBiTG9hZE1hc2sgPSBmYWxzZSk7CiAgICAgaW50CQkJCQlDb250aW51ZUxvYWRESUJTb3VyY2UoSUZYX1BhdXNlKiBwUGF1c2UpOwogICAgIGludAkJCQkJU3RyYXRMb2FkTWFzaygpOwogICAgIGludAkJCQkJU3RhcnRMb2FkTWFza0RJQigpOwpAQCAtNDE1LDEzICs0MTUsMTMgQEAKICAgICBGWF9EV09SRAkJCW1fTWF0dGVDb2xvcjsKICAgICB2b2lkKgkJCW1fcEpiaWcyQ29udGV4dDsKICAgICBDUERGX1N0cmVhbUFjYyoJCW1fcEdsb2JhbFN0cmVhbTsKLSAgICBGWF9CT09MCQkJCW1fYlN0ZENTOworICAgIGJvb2wJCQkJbV9iU3RkQ1M7CiAgICAgaW50CQkJCQltX1N0YXR1czsKICAgICBDUERGX09iamVjdCoJCW1fcE1hc2tTdHJlYW07Ci0gICAgRlhfQk9PTAkJCQltX2JIYXNNYXNrOworICAgIGJvb2wJCQkJbV9iSGFzTWFzazsKIHByb3RlY3RlZDoKLSAgICBGWF9CT09MCQkJCUxvYWRDb2xvckluZm8oQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcyk7Ci0gICAgRElCX0NPTVBfREFUQSogICAgICBHZXREZWNvZGVBbmRNYXNrQXJyYXkoRlhfQk9PTCYgYkRlZmF1bHREZWNvZGUsIEZYX0JPT0wmIGJDb2xvcktleSk7CisgICAgYm9vbAkJCQlMb2FkQ29sb3JJbmZvKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMpOworICAgIERJQl9DT01QX0RBVEEqICAgICAgR2V0RGVjb2RlQW5kTWFza0FycmF5KGJvb2wmIGJEZWZhdWx0RGVjb2RlLCBib29sJiBiQ29sb3JLZXkpOwogICAgIENQREZfRElCU291cmNlKgkJTG9hZE1hc2soRlhfRFdPUkQmIE1hdHRlQ29sb3IpOwogICAgIENQREZfRElCU291cmNlKgkJTG9hZE1hc2tESUIoQ1BERl9TdHJlYW0qIHBNYXNrKTsKICAgICB2b2lkCQkJCUxvYWRKcHhCaXRtYXAoKTsKQEAgLTQzOSwxMSArNDM5LDExIEBACiAgICAgRlhfRFdPUkQJCQltX2JwY19vcmlnOwogICAgIEZYX0RXT1JECQkJbV9uQ29tcG9uZW50czsKICAgICBGWF9EV09SRAkJCW1fR3JvdXBGYW1pbHk7Ci0gICAgRlhfQk9PTAkJCQltX2JMb2FkTWFzazsKLSAgICBGWF9CT09MCQkJCW1fYkRlZmF1bHREZWNvZGU7Ci0gICAgRlhfQk9PTAkJCQltX2JJbWFnZU1hc2s7Ci0gICAgRlhfQk9PTAkJCQltX2JEb0JwY0NoZWNrOwotICAgIEZYX0JPT0wJCQkJbV9iQ29sb3JLZXk7CisgICAgYm9vbAkJCQltX2JMb2FkTWFzazsKKyAgICBib29sCQkJCW1fYkRlZmF1bHREZWNvZGU7CisgICAgYm9vbAkJCQltX2JJbWFnZU1hc2s7CisgICAgYm9vbAkJCQltX2JEb0JwY0NoZWNrOworICAgIGJvb2wJCQkJbV9iQ29sb3JLZXk7CiAgICAgRElCX0NPTVBfREFUQSoJCW1fcENvbXBEYXRhOwogICAgIHVpbnQ4X3QqCQkJbV9wTGluZUJ1ZjsKICAgICB1aW50OF90KgkJCW1fcE1hc2tlZExpbmU7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19hY3Rpb24uY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfYWN0aW9uLmNwcAppbmRleCA4NTFiMmQ2Li5lN2EzMzljIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19hY3Rpb24uY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2FjdGlvbi5jcHAKQEAgLTI4OSwxMCArMjg5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldDIiwgIldTIiwgIkRTIiwgIldQIiwgIkRQIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLUZYX0JPT0wgQ1BERl9BQWN0aW9uOjpBY3Rpb25FeGlzdChBQWN0aW9uVHlwZSBlVHlwZSkgY29uc3QKK2Jvb2wgQ1BERl9BQWN0aW9uOjpBY3Rpb25FeGlzdChBQWN0aW9uVHlwZSBlVHlwZSkgY29uc3QKIHsKICAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gbV9wRGljdC0+S2V5RXhpc3QoZ19zQUFUeXBlc1soaW50KWVUeXBlXSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19hbm5vdC5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19hbm5vdC5jcHAKaW5kZXggMGE3NDYxOS4uNTQzMDA3OSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfYW5ub3QuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Fubm90LmNwcApAQCAtMjIsNyArMjIsNyBAQAogICAgIH0KICAgICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBBY3JvRm9ybSA9IHBSb290LT5HZXREaWN0KCJBY3JvRm9ybSIpOwotICAgIEZYX0JPT0wgYlJlZ2VuZXJhdGVBUCA9IHBBY3JvRm9ybSAmJiBwQWNyb0Zvcm0tPkdldEJvb2xlYW4oIk5lZWRBcHBlYXJhbmNlcyIpOworICAgIGJvb2wgYlJlZ2VuZXJhdGVBUCA9IHBBY3JvRm9ybSAmJiBwQWNyb0Zvcm0tPkdldEJvb2xlYW4oIk5lZWRBcHBlYXJhbmNlcyIpOwogICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQW5ub3RzLT5HZXRDb3VudCgpOyArK2kpIHsKICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBBbm5vdHMtPkdldEVsZW1lbnRWYWx1ZShpKTsKICAgICAgICAgaWYgKHBEaWN0ID09IE5VTEwgfHwgcERpY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewpAQCAtNTUsMTIgKzU1LDEyIEBACiAgICAgfQogfQogdm9pZCBDUERGX0Fubm90TGlzdDo6RGlzcGxheVBhc3MoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIEZYX0JPT0wgYlByaW50aW5nLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2lkZ2V0UGFzcywgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywgRlhfUkVDVCogY2xpcF9yZWN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgYm9vbCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJXaWRnZXRQYXNzLCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBGWF9SRUNUKiBjbGlwX3JlY3QpCiB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX0Fubm90TGlzdC5HZXRTaXplKCk7ICsraSkgewogICAgICAgICBDUERGX0Fubm90KiBwQW5ub3QgPSAoQ1BERl9Bbm5vdCopbV9Bbm5vdExpc3RbaV07Ci0gICAgICAgIEZYX0JPT0wgYldpZGdldCA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiOworICAgICAgICBib29sIGJXaWRnZXQgPSBwQW5ub3QtPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0IjsKICAgICAgICAgaWYgKChiV2lkZ2V0UGFzcyAmJiAhYldpZGdldCkgfHwgKCFiV2lkZ2V0UGFzcyAmJiBiV2lkZ2V0KSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KQEAgLTEwMywyNCArMTAzLDI0IEBACiB9CiB2b2lkIENQREZfQW5ub3RMaXN0OjpEaXNwbGF5QW5ub3RzKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hvd1dpZGdldCwgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hvd1dpZGdldCwgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykKIHsKICAgICBGWF9SRUNUIGNsaXBfcmVjdDsKICAgICBpZiAocERldmljZSkgewogICAgICAgICBjbGlwX3JlY3QgPSBwRGV2aWNlLT5HZXRDbGlwQm94KCk7CiAgICAgfQotICAgIEZYX0JPT0wgYlByaW50aW5nID0gcERldmljZS0+R2V0RGV2aWNlQ2xhc3MoKSA9PSBGWERDX1BSSU5URVIgfHwgKHBPcHRpb25zICYmIChwT3B0aW9ucy0+bV9GbGFncyAmIFJFTkRFUl9QUklOVFBSRVZJRVcpKTsKKyAgICBib29sIGJQcmludGluZyA9IHBEZXZpY2UtPkdldERldmljZUNsYXNzKCkgPT0gRlhEQ19QUklOVEVSIHx8IChwT3B0aW9ucyAmJiAocE9wdGlvbnMtPm1fRmxhZ3MgJiBSRU5ERVJfUFJJTlRQUkVWSUVXKSk7CiAgICAgRGlzcGxheUFubm90cyhwUGFnZSwgcERldmljZSwgTlVMTCwgYlByaW50aW5nLCBwVXNlcjJEZXZpY2UsIGJTaG93V2lkZ2V0ID8gMyA6IDEsIHBPcHRpb25zLCAmY2xpcF9yZWN0KTsKIH0KIHZvaWQgQ1BERl9Bbm5vdExpc3Q6OkRpc3BsYXlBbm5vdHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwgRlhfRFdPUkQgZHdBbm5vdEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJQcmludGluZywgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLCBGWF9EV09SRCBkd0Fubm90RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIEZYX1JFQ1QqIHBDbGlwUmVjdCkKIHsKICAgICBpZiAoZHdBbm5vdEZsYWdzICYgMHgwMSkgewotICAgICAgICBEaXNwbGF5UGFzcyhwUGFnZSwgcERldmljZSwgcENvbnRleHQsIGJQcmludGluZywgcFVzZXIyRGV2aWNlLCBGQUxTRSwgcE9wdGlvbnMsIHBDbGlwUmVjdCk7CisgICAgICAgIERpc3BsYXlQYXNzKHBQYWdlLCBwRGV2aWNlLCBwQ29udGV4dCwgYlByaW50aW5nLCBwVXNlcjJEZXZpY2UsIGZhbHNlLCBwT3B0aW9ucywgcENsaXBSZWN0KTsKICAgICB9CiAgICAgaWYgKGR3QW5ub3RGbGFncyAmIDB4MDIpIHsKLSAgICAgICAgRGlzcGxheVBhc3MocFBhZ2UsIHBEZXZpY2UsIHBDb250ZXh0LCBiUHJpbnRpbmcsIHBVc2VyMkRldmljZSwgVFJVRSwgcE9wdGlvbnMsIHBDbGlwUmVjdCk7CisgICAgICAgIERpc3BsYXlQYXNzKHBQYWdlLCBwRGV2aWNlLCBwQ29udGV4dCwgYlByaW50aW5nLCBwVXNlcjJEZXZpY2UsIHRydWUsIHBPcHRpb25zLCBwQ2xpcFJlY3QpOwogICAgIH0KIH0KIGludCBDUERGX0Fubm90TGlzdDo6R2V0SW5kZXgoQ1BERl9Bbm5vdCogcEFubm90KQpAQCAtMjQ2LDI4ICsyNDYsMjggQEAKICAgICBtYXRyaXguQ29uY2F0KCpwVXNlcjJEZXZpY2UpOwogICAgIHJldHVybiBwRm9ybTsKIH0KLUZYX0JPT0wgQ1BERl9Bbm5vdDo6RHJhd0FwcGVhcmFuY2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLAorYm9vbCBDUERGX0Fubm90OjpEcmF3QXBwZWFyYW5jZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGVhcmFuY2VNb2RlIG1vZGUsIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpCiB7CiAgICAgQ0ZYX01hdHJpeCBtYXRyaXg7CiAgICAgQ1BERl9Gb3JtKiBwRm9ybSA9IEZQREZET0NfQW5ub3RfR2V0TWF0cml4KHBQYWdlLCB0aGlzLCBtb2RlLCBwVXNlcjJEZXZpY2UsIG1hdHJpeCk7CiAgICAgaWYgKCFwRm9ybSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9SZW5kZXJDb250ZXh0IGNvbnRleHQ7CiAgICAgY29udGV4dC5DcmVhdGUoKENQREZfUGFnZSopcFBhZ2UpOwogICAgIGNvbnRleHQuRHJhd09iamVjdExpc3QocERldmljZSwgcEZvcm0sICZtYXRyaXgsIHBPcHRpb25zKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9Bbm5vdDo6RHJhd0luQ29udGV4dChjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBjb25zdCBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsIEFwcGVhcmFuY2VNb2RlIG1vZGUpCitib29sIENQREZfQW5ub3Q6OkRyYXdJbkNvbnRleHQoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgY29uc3QgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLCBBcHBlYXJhbmNlTW9kZSBtb2RlKQogewogICAgIENGWF9NYXRyaXggbWF0cml4OwogICAgIENQREZfRm9ybSogcEZvcm0gPSBGUERGRE9DX0Fubm90X0dldE1hdHJpeChwUGFnZSwgdGhpcywgbW9kZSwgcFVzZXIyRGV2aWNlLCBtYXRyaXgpOwogICAgIGlmICghcEZvcm0pIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgICgoQ1BERl9SZW5kZXJDb250ZXh0KilwQ29udGV4dCktPkFwcGVuZE9iamVjdExpc3QocEZvcm0sICZtYXRyaXgpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDUERGX0Fubm90OjpEcmF3Qm9yZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykKIHsKQEAgLTI3OCw3ICsyNzgsNyBAQAogICAgIGlmIChhbm5vdF9mbGFncyAmIEFOTk9URkxBR19ISURERU4pIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBGWF9CT09MIGJQcmludGluZyA9IHBEZXZpY2UtPkdldERldmljZUNsYXNzKCkgPT0gRlhEQ19QUklOVEVSIHx8IChwT3B0aW9ucyAmJiAocE9wdGlvbnMtPm1fRmxhZ3MgJiBSRU5ERVJfUFJJTlRQUkVWSUVXKSk7CisgICAgYm9vbCBiUHJpbnRpbmcgPSBwRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpID09IEZYRENfUFJJTlRFUiB8fCAocE9wdGlvbnMgJiYgKHBPcHRpb25zLT5tX0ZsYWdzICYgUkVOREVSX1BSSU5UUFJFVklFVykpOwogICAgIGlmIChiUHJpbnRpbmcgJiYgKGFubm90X2ZsYWdzICYgQU5OT1RGTEFHX1BSSU5UKSA9PSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19hcC5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19hcC5jcHAKaW5kZXggZjk0YTRkNi4uNGYzZjE3OCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfYXAuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2FwLmNwcApAQCAtOCwxMCArOCwxMCBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3Z0LmgiCiAjaW5jbHVkZSAicGRmX3Z0LmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfYXAuaCIKLUZYX0JPT0wgRlBERl9HZW5lcmF0ZUFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkKK2Jvb2wgRlBERl9HZW5lcmF0ZUFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkKIHsKICAgICBpZiAoIXBBbm5vdERpY3QgfHwgcEFubm90RGljdC0+R2V0Q29uc3RTdHJpbmcoIlN1YnR5cGUiKSAhPSBGWF9CU1RSQygiV2lkZ2V0IikpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIGZpZWxkX3R5cGUgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiRlQiKS0+R2V0U3RyaW5nKCk7CiAgICAgRlhfRFdPUkQgZmxhZ3MgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiRmYiKT8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkZmIiktPkdldEludGVnZXIoKSA6IDA7CkBAIC0zNCw3ICszNCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIGNsYXNzIENQVlRfRm9udE1hcCA6IHB1YmxpYyBJUFZUX0ZvbnRNYXAKIHsKQEAgLTE1NCwxMiArMTU0LDEyIEBACiAgICAgICAgIH0KICAgICByZXR1cm4gLTE7CiB9Ci1GWF9CT09MIENQVlRfUHJvdmlkZXI6OklzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCkKK2Jvb2wgQ1BWVF9Qcm92aWRlcjo6SXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKQogewogICAgIGlmICgod29yZCA+PSAweDYxICYmIHdvcmQgPD0gMHg3QSkgfHwgKHdvcmQgPj0gMHg0MSAmJiB3b3JkIDw9IDB4NUEpIHx8IHdvcmQgPT0gMHgyRCB8fCB3b3JkID09IDB4MjcpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogaW50MzJfdCBDUFZUX1Byb3ZpZGVyOjpHZXREZWZhdWx0Rm9udEluZGV4KCkKIHsKQEAgLTI0NCwxNCArMjQ0LDE0IEBACiAgICAgfQogICAgIHJldHVybiBydDsKIH0KLXN0YXRpYyBGWF9CT09MIEdlbmVyYXRlV2lkZ2V0QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0LCBjb25zdCBpbnQzMl90ICYgbldpZGdldFR5cGUpCitzdGF0aWMgYm9vbCBHZW5lcmF0ZVdpZGdldEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwgY29uc3QgaW50MzJfdCAmIG5XaWRnZXRUeXBlKQogewogICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0ID0gTlVMTDsKICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5ICogcFJvb3REaWN0ID0gcERvYy0+R2V0Um9vdCgpKSB7CiAgICAgICAgIHBGb3JtRGljdCA9IHBSb290RGljdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKICAgICB9CiAgICAgaWYgKCFwRm9ybURpY3QpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIERBOwogICAgIGlmIChDUERGX09iamVjdCogcERBT2JqID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkRBIikpIHsKQEAgLTI2MSwyMyArMjYxLDIzIEBACiAgICAgICAgIERBID0gcEZvcm1EaWN0LT5HZXRTdHJpbmcoIkRBIik7CiAgICAgfQogICAgIGlmIChEQS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChEQSk7CiAgICAgc3ludGF4LkZpbmRUYWdQYXJhbSgiVGYiLCAyKTsKICAgICBDRlhfQnl0ZVN0cmluZyBzRm9udE5hbWUgPSBzeW50YXguR2V0V29yZCgpOwogICAgIHNGb250TmFtZSA9IFBERl9OYW1lRGVjb2RlKHNGb250TmFtZSk7CiAgICAgaWYgKHNGb250TmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7CiAgICAgQ1BWVF9Db2xvciBjclRleHQgPSBQYXJzZUNvbG9yKERBKTsKLSAgICBGWF9CT09MIGJVc2VGb3JtUmVzID0gRkFMU0U7CisgICAgYm9vbCBiVXNlRm9ybVJlcyA9IGZhbHNlOwogICAgIENQREZfRGljdGlvbmFyeSAqIHBGb250RGljdCA9IE5VTEw7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRFJEaWN0ID0gcEFubm90RGljdC0+R2V0RGljdChGWF9CU1RSQygiRFIiKSk7CiAgICAgaWYgKHBEUkRpY3QgPT0gTlVMTCkgewogICAgICAgICBwRFJEaWN0ID0gcEZvcm1EaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJEUiIpKTsKLSAgICAgICAgYlVzZUZvcm1SZXMgPSBUUlVFOworICAgICAgICBiVXNlRm9ybVJlcyA9IHRydWU7CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSAqIHBEUkZvbnREaWN0ID0gTlVMTDsKICAgICBpZiAocERSRGljdCAmJiAocERSRm9udERpY3QgPSBwRFJEaWN0LT5HZXREaWN0KCJGb250IikpKSB7CkBAIC0yOTEsMTIgKzI5MSwxMiBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmICghcERSRm9udERpY3QpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghcEZvbnREaWN0KSB7CiAgICAgICAgIHBGb250RGljdCA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7CiAgICAgICAgIGlmIChwRm9udERpY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHBGb250RGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJUeXBlIiksICJGb250Iik7CiAgICAgICAgIHBGb250RGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJTdWJ0eXBlIiksICJUeXBlMSIpOwpAQCAtMzA3LDcgKzMwNyw3IEBACiAgICAgfQogICAgIENQREZfRm9udCogcERlZkZvbnQgPSBwRG9jLT5Mb2FkRm9udChwRm9udERpY3QpOwogICAgIGlmICghcERlZkZvbnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfUmVjdCByY0Fubm90ID0gcEFubm90RGljdC0+R2V0UmVjdCgiUmVjdCIpOwogICAgIGludDMyX3QgblJvdGF0ZSA9IDA7CkBAIC0zNzgsNyArMzc4LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBDRlhfQnl0ZVRleHRCdWYgc0FwcFN0cmVhbTsKLSAgICBDRlhfQnl0ZVN0cmluZyBzQkcgPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjckJHLCBUUlVFKTsKKyAgICBDRlhfQnl0ZVN0cmluZyBzQkcgPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjckJHLCB0cnVlKTsKICAgICBpZiAoc0JHLkdldExlbmd0aCgpID4gMCkgewogICAgICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IHNCRyA8PCByY0JCb3gubGVmdCA8PCAiICIgPDwgcmNCQm94LmJvdHRvbSA8PCAiICIKICAgICAgICAgICAgICAgICAgICA8PCByY0JCb3guV2lkdGgoKSA8PCAiICIgPDwgcmNCQm94LkhlaWdodCgpIDw8ICIgcmUgZlxuIiA8PCAiUVxuIjsKQEAgLTM5NSw3ICszOTUsNyBAQAogICAgIGlmIChwQVBEaWN0ID09IE5VTEwpIHsKICAgICAgICAgcEFQRGljdCA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7CiAgICAgICAgIGlmIChwQVBEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBwQW5ub3REaWN0LT5TZXRBdCgiQVAiLCBwQVBEaWN0KTsKICAgICB9CkBAIC00MDMsNyArNDAzLDcgQEAKICAgICBpZiAocE5vcm1hbFN0cmVhbSA9PSBOVUxMKSB7CiAgICAgICAgIHBOb3JtYWxTdHJlYW0gPSBDUERGX1N0cmVhbTo6Q3JlYXRlKE5VTEwsIDAsIE5VTEwpOwogICAgICAgICBpZiAocE5vcm1hbFN0cmVhbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaW50MzJfdCBvYmpudW0gPSBwRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwTm9ybWFsU3RyZWFtKTsKICAgICAgICAgcEFubm90RGljdC0+R2V0RGljdCgiQVAiKS0+U2V0QXRSZWZlcmVuY2UoIk4iLCBwRG9jLCBvYmpudW0pOwpAQCAtNDE4LDcgKzQxOCw3IEBACiAgICAgICAgICAgICBpZiAoIXBTdHJlYW1SZXNGb250TGlzdCkgewogICAgICAgICAgICAgICAgIHBTdHJlYW1SZXNGb250TGlzdCA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7CiAgICAgICAgICAgICAgICAgaWYgKHBTdHJlYW1SZXNGb250TGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwU3RyZWFtUmVzTGlzdC0+U2V0QXQoIkZvbnQiLCBwU3RyZWFtUmVzRm9udExpc3QpOwogICAgICAgICAgICAgfQpAQCAtNDQzLDIxICs0NDMsMjEgQEAKICAgICAgICAgICAgICAgICB2dC5TZXRQbGF0ZVJlY3QocmNCb2R5KTsKICAgICAgICAgICAgICAgICB2dC5TZXRBbGlnbm1lbnQobkFsaWduKTsKICAgICAgICAgICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgewotICAgICAgICAgICAgICAgICAgICB2dC5TZXRBdXRvRm9udFNpemUoVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIHZ0LlNldEF1dG9Gb250U2l6ZSh0cnVlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICB2dC5TZXRGb250U2l6ZShmRm9udFNpemUpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWF9CT09MIGJNdWx0aUxpbmUgPSAoZHdGbGFncyA+PiAxMikgJiAxOworICAgICAgICAgICAgICAgIGJvb2wgYk11bHRpTGluZSA9IChkd0ZsYWdzID4+IDEyKSAmIDE7CiAgICAgICAgICAgICAgICAgaWYgKGJNdWx0aUxpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgdnQuU2V0TXVsdGlMaW5lKFRSVUUpOwotICAgICAgICAgICAgICAgICAgICB2dC5TZXRBdXRvUmV0dXJuKFRSVUUpOworICAgICAgICAgICAgICAgICAgICB2dC5TZXRNdWx0aUxpbmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHZ0LlNldEF1dG9SZXR1cm4odHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEZYX1dPUkQgc3ViV29yZCA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKChkd0ZsYWdzID4+IDEzKSAmIDEpIHsKICAgICAgICAgICAgICAgICAgICAgc3ViV29yZCA9ICcqJzsKICAgICAgICAgICAgICAgICAgICAgdnQuU2V0UGFzc3dvcmRDaGFyKHN1YldvcmQpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQXJyYXkgPSAoZHdGbGFncyA+PiAyNCkgJiAxOworICAgICAgICAgICAgICAgIGJvb2wgYkNoYXJBcnJheSA9IChkd0ZsYWdzID4+IDI0KSAmIDE7CiAgICAgICAgICAgICAgICAgaWYgKGJDaGFyQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgdnQuU2V0Q2hhckFycmF5KGR3TWF4TGVuKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNDc5LDcgKzQ3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHJjQm9keS5sZWZ0IDw8ICIgIiA8PCByY0JvZHkuYm90dG9tIDw8ICIgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCByY0JvZHkuV2lkdGgoKSA8PCAiICIgPDwgcmNCb2R5LkhlaWdodCgpIDw8ICIgcmVcbldcbm5cbiI7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCAiQlRcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY3JUZXh0LCBUUlVFKSA8PCBzQm9keSA8PCAiRVRcbiIgPDwgIlFcbkVNQ1xuIjsKKyAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCAiQlRcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY3JUZXh0LCB0cnVlKSA8PCBzQm9keSA8PCAiRVRcbiIgPDwgIlFcbkVNQ1xuIjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogICAgICAgICAgICAgICAgIHJjRWRpdC5Ob3JtYWxpemUoKTsKICAgICAgICAgICAgICAgICB2dC5TZXRQbGF0ZVJlY3QocmNFZGl0KTsKICAgICAgICAgICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgewotICAgICAgICAgICAgICAgICAgICB2dC5TZXRBdXRvRm9udFNpemUoVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIHZ0LlNldEF1dG9Gb250U2l6ZSh0cnVlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICB2dC5TZXRGb250U2l6ZShmRm9udFNpemUpOwogICAgICAgICAgICAgICAgIH0KQEAgLTUwNiwxNCArNTA2LDE0IEBACiAgICAgICAgICAgICAgICAgdnQuUmVhcnJhbmdlQWxsKCk7CiAgICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjQ29udGVudCA9IHZ0LkdldENvbnRlbnRSZWN0KCk7CiAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludCBwdE9mZnNldCA9IENQREZfUG9pbnQoMC4wZiwgKHJjQ29udGVudC5IZWlnaHQoKSAtIHJjRWRpdC5IZWlnaHQoKSkgLyAyLjBmKTsKLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzRWRpdCA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVFZGl0QVAoJm1hcCwgdnQuR2V0SXRlcmF0b3IoKSwgcHRPZmZzZXQsIFRSVUUsIDApOworICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNFZGl0ID0gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUVkaXRBUCgmbWFwLCB2dC5HZXRJdGVyYXRvcigpLCBwdE9mZnNldCwgdHJ1ZSwgMCk7CiAgICAgICAgICAgICAgICAgaWYgKHNFZGl0LkdldExlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8ICIvVHggQk1DXG4iIDw8ICJxXG4iOwogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHJjRWRpdC5sZWZ0IDw8ICIgIiA8PCByY0VkaXQuYm90dG9tIDw8ICIgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJjRWRpdC5XaWR0aCgpIDw8ICIgIiA8PCByY0VkaXQuSGVpZ2h0KCkgPDwgIiByZVxuV1xublxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCAiQlRcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY3JUZXh0LCBUUlVFKSA8PCBzRWRpdCA8PCAiRVRcbiIgPDwgIlFcbkVNQ1xuIjsKKyAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCAiQlRcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY3JUZXh0LCB0cnVlKSA8PCBzRWRpdCA8PCAiRVRcbiIgPDwgIlFcbkVNQ1xuIjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0J1dHRvbiA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKENQVlRfQ29sb3IoQ1RfUkdCLCAyMjAuMGYgLyAyNTUuMGYsIDIyMC4wZiAvIDI1NS4wZiwgMjIwLjBmIC8gMjU1LjBmKSwgVFJVRSk7CisgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0J1dHRvbiA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKENQVlRfQ29sb3IoQ1RfUkdCLCAyMjAuMGYgLyAyNTUuMGYsIDIyMC4wZiAvIDI1NS4wZiwgMjIwLjBmIC8gMjU1LjBmKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgaWYgKHNCdXR0b24uR2V0TGVuZ3RoKCkgPiAwICYmICFyY0J1dHRvbi5Jc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQnV0dG9uOwogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHJjQnV0dG9uLmxlZnQgPDwgIiAiIDw8IHJjQnV0dG9uLmJvdHRvbSA8PCAiICIKQEAgLTU1NSwxMSArNTU1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwT3B0LT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3SXRlbSA9ICgoQ1BERl9BcnJheSopcE9wdCktPkdldEVsZW1lbnRWYWx1ZSgxKS0+R2V0VW5pY29kZVRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsZWN0ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZWxlY3RlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwU2VscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIHMgPSAwLCBzc3ogPSBwU2Vscy0+R2V0Q291bnQoKTsgcyA8IHNzejsgcysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBwU2Vscy0+R2V0SW50ZWdlcihzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZWxlY3RlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTc4LDExICs1NzgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmSXRlbUhlaWdodCA9IHZ0LkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJTZWxlY3RlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlY3QgcmNJdGVtID0gQ1BERl9SZWN0KHJjQm9keS5sZWZ0LCBmeSAtIGZJdGVtSGVpZ2h0LCByY0JvZHkucmlnaHQsIGZ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JvZHkgPDwgInFcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoQ1BWVF9Db2xvcihDVF9SR0IsIDAsIDUxLjBmIC8gMjU1LjBmLCAxMTMuMGYgLyAyNTUuMGYpLCBUUlVFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQm9keSA8PCAicVxuIiA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChDUFZUX0NvbG9yKENUX1JHQiwgMCwgNTEuMGYgLyAyNTUuMGYsIDExMy4wZiAvIDI1NS4wZiksIHRydWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJjSXRlbS5sZWZ0IDw8ICIgIiA8PCByY0l0ZW0uYm90dG9tIDw8ICIgIiA8PCByY0l0ZW0uV2lkdGgoKSA8PCAiICIgPDwgcmNJdGVtLkhlaWdodCgpIDw8ICIgcmUgZlxuIiA8PCAiUVxuIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JvZHkgPDwgIkJUXG4iIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKENQVlRfQ29sb3IoQ1RfR1JBWSwgMSksIFRSVUUpIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVFZGl0QVAoJm1hcCwgdnQuR2V0SXRlcmF0b3IoKSwgQ1BERl9Qb2ludCgwLjBmLCBmeSksIFRSVUUsIDApIDw8ICJFVFxuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JvZHkgPDwgIkJUXG4iIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKENQVlRfQ29sb3IoQ1RfR1JBWSwgMSksIHRydWUpIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVFZGl0QVAoJm1hcCwgdnQuR2V0SXRlcmF0b3IoKSwgQ1BERl9Qb2ludCgwLjBmLCBmeSksIHRydWUsIDApIDw8ICJFVFxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQm9keSA8PCAiQlRcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY3JUZXh0LCBUUlVFKSA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlRWRpdEFQKCZtYXAsIHZ0LkdldEl0ZXJhdG9yKCksIENQREZfUG9pbnQoMC4wZiwgZnkpLCBUUlVFLCAwKSA8PCAiRVRcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNCb2R5IDw8ICJCVFxuIiA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjclRleHQsIHRydWUpIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVFZGl0QVAoJm1hcCwgdnQuR2V0SXRlcmF0b3IoKSwgQ1BERl9Qb2ludCgwLjBmLCBmeSksIHRydWUsIDApIDw8ICJFVFxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnkgLT0gZkl0ZW1IZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC01OTgsNyArNTk4LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBpZiAocE5vcm1hbFN0cmVhbSkgewotICAgICAgICBwTm9ybWFsU3RyZWFtLT5TZXREYXRhKCh1aW50OF90KilzQXBwU3RyZWFtLkdldEJ1ZmZlcigpLCBzQXBwU3RyZWFtLkdldFNpemUoKSwgRkFMU0UsIEZBTFNFKTsKKyAgICAgICAgcE5vcm1hbFN0cmVhbS0+U2V0RGF0YSgodWludDhfdCopc0FwcFN0cmVhbS5HZXRCdWZmZXIoKSwgc0FwcFN0cmVhbS5HZXRTaXplKCksIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgIHBTdHJlYW1EaWN0ID0gcE5vcm1hbFN0cmVhbS0+R2V0RGljdCgpOwogICAgICAgICBpZiAocFN0cmVhbURpY3QpIHsKICAgICAgICAgICAgIHBTdHJlYW1EaWN0LT5TZXRBdE1hdHJpeCgiTWF0cml4IiwgbWF0cml4KTsKQEAgLTYwOSw3ICs2MDksNyBAQAogICAgICAgICAgICAgICAgIGlmICghcFN0cmVhbVJlc0ZvbnRMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1SZXNGb250TGlzdCA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwU3RyZWFtUmVzRm9udExpc3QgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1SZXNMaXN0LT5TZXRBdCgiRm9udCIsIHBTdHJlYW1SZXNGb250TGlzdCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNjIyLDIxICs2MjIsMjEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZVRleHRGaWVsZEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkKK2Jvb2wgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZVRleHRGaWVsZEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkKIHsKICAgICByZXR1cm4gR2VuZXJhdGVXaWRnZXRBUChwRG9jLCBwQW5ub3REaWN0LCAwKTsKIH0KLUZYX0JPT0wgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbWJvQm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KQorYm9vbCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29tYm9Cb3hBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpCiB7CiAgICAgcmV0dXJuIEdlbmVyYXRlV2lkZ2V0QVAocERvYywgcEFubm90RGljdCwgMSk7CiB9Ci1GWF9CT09MIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVMaXN0Qm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KQorYm9vbCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlTGlzdEJveEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkKIHsKICAgICByZXR1cm4gR2VuZXJhdGVXaWRnZXRBUChwRG9jLCBwQW5ub3REaWN0LCAyKTsKIH0KLUNGWF9CeXRlU3RyaW5nIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVFZGl0QVAoSVBWVF9Gb250TWFwICogcEZvbnRNYXAsIElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKiBwSXRlcmF0b3IsIGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCwgRlhfQk9PTCBiQ29udGludW91cywgRlhfV09SRCBTdWJXb3JkLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBWaXNpYmxlKQorQ0ZYX0J5dGVTdHJpbmcgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUVkaXRBUChJUFZUX0ZvbnRNYXAgKiBwRm9udE1hcCwgSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciwgY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0LCBib29sIGJDb250aW51b3VzLCBGWF9XT1JEIFN1YldvcmQsIGNvbnN0IENQVlRfV29yZFJhbmdlICogcFZpc2libGUpCiB7CiAgICAgQ0ZYX0J5dGVUZXh0QnVmIHNFZGl0U3RyZWFtLCBzTGluZVN0cmVhbSwgc1dvcmRzOwogICAgIENQREZfUG9pbnQgcHRPbGQoMC4wZiwgMC4wZiksIHB0TmV3KDAuMGYsIDAuMGYpOwpAQCAtNzI2LDcgKzcyNiw3IEBACiAgICAgICAgIHN3aXRjaCAoblN0eWxlKSB7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgY2FzZSBQQlNfU09MSUQ6Ci0gICAgICAgICAgICAgICAgc0NvbG9yID0gR2VuZXJhdGVDb2xvckFQKGNvbG9yLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY29sb3IsIHRydWUpOwogICAgICAgICAgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOwogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0IDw8ICIgIiA8PCBmQm90dG9tIDw8ICIgIiA8PCBmUmlnaHQgLSBmTGVmdCA8PCAiICIgPDwgZlRvcCAtIGZCb3R0b20gPDwgIiByZVxuIjsKQEAgLTczNiw3ICs3MzYsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUEJTX0RBU0g6Ci0gICAgICAgICAgICAgICAgc0NvbG9yID0gR2VuZXJhdGVDb2xvckFQKGNvbG9yLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgc0NvbG9yID0gR2VuZXJhdGVDb2xvckFQKGNvbG9yLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZldpZHRoIDw8ICIgdyIgPDwgIiBbIiA8PCBkYXNoLm5EYXNoIDw8ICIgIiA8PCBkYXNoLm5HYXAgPDwgIl0gIiA8PCBkYXNoLm5QaGFzZSA8PCAiIGRcbiI7CkBAIC03NDksNyArNzQ5LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUEJTX0JFVkVMRUQ6CiAgICAgICAgICAgICBjYXNlIFBCU19JTlNFVDoKLSAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY3JMZWZ0VG9wLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY3JMZWZ0VG9wLCB0cnVlKTsKICAgICAgICAgICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNDb2xvcjsKICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggPDwgIiAiIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoIDw8ICIgbVxuIjsKQEAgLTc1OSw3ICs3NTksNyBAQAogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoICogMiA8PCAiIGxcbiI7CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyIDw8ICIgbCBmXG4iOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY3JSaWdodEJvdHRvbSwgVFJVRSk7CisgICAgICAgICAgICAgICAgc0NvbG9yID0gR2VuZXJhdGVDb2xvckFQKGNyUmlnaHRCb3R0b20sIHRydWUpOwogICAgICAgICAgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOwogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggPDwgIiAiIDw8CWZUb3AgLSBmSGFsZldpZHRoIDw8ICIgbVxuIjsKQEAgLTc2OSw3ICs3NjksNyBAQAogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIgPDwgIiBsXG4iOwogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aCAqIDIgPDwgIiBsIGZcbiI7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjb2xvciwgVFJVRSk7CisgICAgICAgICAgICAgICAgc0NvbG9yID0gR2VuZXJhdGVDb2xvckFQKGNvbG9yLCB0cnVlKTsKICAgICAgICAgICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNDb2xvcjsKICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCA8PCAiICIgPDwgZkJvdHRvbSA8PCAiICIgPDwJZlJpZ2h0IC0gZkxlZnQgPDwgIiAiIDw8IGZUb3AgLSBmQm90dG9tIDw8ICIgcmVcbiI7CkBAIC03NzgsNyArNzc4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFBCU19VTkRFUkxJTkVEOgotICAgICAgICAgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjb2xvciwgRkFMU0UpOworICAgICAgICAgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjb2xvciwgZmFsc2UpOwogICAgICAgICAgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOwogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZXaWR0aCA8PCAiIHdcbiI7CkBAIC03OTAsNyArNzkwLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIHNBcHBTdHJlYW0uR2V0Qnl0ZVN0cmluZygpOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY29uc3QgQ1BWVF9Db2xvciAmIGNvbG9yLCBjb25zdCBGWF9CT09MICYgYkZpbGxPclN0cm9rZSkKK0NGWF9CeXRlU3RyaW5nIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKGNvbnN0IENQVlRfQ29sb3IgJiBjb2xvciwgY29uc3QgYm9vbCAmIGJGaWxsT3JTdHJva2UpCiB7CiAgICAgQ0ZYX0J5dGVUZXh0QnVmIHNDb2xvclN0cmVhbTsKICAgICBzd2l0Y2ggKGNvbG9yLm5Db2xvclR5cGUpIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Jhc2ljLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Jhc2ljLmNwcAppbmRleCAzYmExMDliLi42NDdiN2NiIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19iYXNpYy5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfYmFzaWMuY3BwCkBAIC0zMTMsMTAgKzMxMywxMCBAQAogICAgIHJldHVybiBmaWxlcGF0aDsKICNlbmRpZgogfQotRlhfQk9PTCBDUERGX0ZpbGVTcGVjOjpHZXRGaWxlTmFtZShDRlhfV2lkZVN0cmluZyAmY3NGaWxlTmFtZSkgY29uc3QKK2Jvb2wgQ1BERl9GaWxlU3BlYzo6R2V0RmlsZU5hbWUoQ0ZYX1dpZGVTdHJpbmcgJmNzRmlsZU5hbWUpIGNvbnN0CiB7CiAgICAgaWYgKG1fcE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9wT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKW1fcE9iajsKQEAgLTMyNSw3ICszMjUsNyBAQAogICAgICAgICAgICAgY3NGaWxlTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiRiIpKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkZTIikpID09IEZYX0JTVFJDKCJVUkwiKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoY3NGaWxlTmFtZS5Jc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGlmIChwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIkRPUyIpKSkgewpAQCAtMzM1LDE0ICszMzUsMTQgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAocERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJVbml4IikpKSB7CiAgICAgICAgICAgICAgICAgY3NGaWxlTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiVW5peCIpKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBjc0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChtX3BPYmotPkdldFN0cmluZygpKTsKICAgICB9CiAgICAgY3NGaWxlTmFtZSA9IEZJTEVTUEVDX0RlY29kZUZpbGVOYW1lKGNzRmlsZU5hbWUpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQ1BERl9GaWxlU3BlYzo6Q1BERl9GaWxlU3BlYygpCiB7CkBAIC0zNTEsMTMgKzM1MSwxMyBAQAogICAgICAgICAoKENQREZfRGljdGlvbmFyeSopbV9wT2JqKS0+U2V0QXROYW1lKEZYX0JTVFJDKCJUeXBlIiksIEZYX0JTVFJDKCJGaWxlc3BlYyIpKTsKICAgICB9CiB9Ci1GWF9CT09MIENQREZfRmlsZVNwZWM6OklzVVJMKCkgY29uc3QKK2Jvb2wgQ1BERl9GaWxlU3BlYzo6SXNVUkwoKSBjb25zdAogewogICAgIGlmIChtX3BPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fcE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gKChDUERGX0RpY3Rpb25hcnkqKW1fcE9iaiktPkdldFN0cmluZyhGWF9CU1RSQygiRlMiKSkgPT0gRlhfQlNUUkMoIlVSTCIpOwogfQpAQCAtNDE2LDcgKzQxNiw3IEBACiAgICAgfQogICAgIHJldHVybiBOVUxMOwogfQotc3RhdGljIHZvaWQgRlBERkRPQ19GSUxFU1BFQ19TZXRGaWxlTmFtZShDUERGX09iamVjdCAqcE9iaiwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZpbGVOYW1lLCBGWF9CT09MIGJVUkwpCitzdGF0aWMgdm9pZCBGUERGRE9DX0ZJTEVTUEVDX1NldEZpbGVOYW1lKENQREZfT2JqZWN0ICpwT2JqLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsZU5hbWUsIGJvb2wgYlVSTCkKIHsKICAgICBBU1NFUlQocE9iaiAhPSBOVUxMKTsKICAgICBDRlhfV2lkZVN0cmluZyB3c1N0cjsKQEAgLTQzNCw3ICs0MzQsNyBAQAogICAgICAgICBwRGljdC0+U2V0QXRTdHJpbmcoRlhfQlNUUkMoIlVGIiksIFBERl9FbmNvZGVUZXh0KHdzU3RyKSk7CiAgICAgfQogfQotdm9pZCBDUERGX0ZpbGVTcGVjOjpTZXRGaWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsZU5hbWUsIEZYX0JPT0wgYlVSTCkKK3ZvaWQgQ1BERl9GaWxlU3BlYzo6U2V0RmlsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZpbGVOYW1lLCBib29sIGJVUkwpCiB7CiAgICAgQVNTRVJUKG1fcE9iaiAhPSBOVUxMKTsKICAgICBpZiAobV9wT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkgJiYgYlVSTCkgewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybS5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtLmNwcAppbmRleCA3MzUyMzFjLi42MDU3ZjU2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtLmNwcApAQCAtMjQxLDEyICsyNDEsMTIgQEAKICAgICB9CiAgICAgcmV0dXJuIHBOb2RlOwogfQotQ1BERl9JbnRlckZvcm06OkNQREZfSW50ZXJGb3JtKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgRlhfQk9PTCBiR2VuZXJhdGVBUCkgOiBDRlhfUHJpdmF0ZURhdGEoKQorQ1BERl9JbnRlckZvcm06OkNQREZfSW50ZXJGb3JtKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgYm9vbCBiR2VuZXJhdGVBUCkgOiBDRlhfUHJpdmF0ZURhdGEoKQogewogICAgIG1fcERvY3VtZW50ID0gcERvY3VtZW50OwogICAgIG1fYkdlbmVyYXRlQVAgPSBiR2VuZXJhdGVBUDsKICAgICBtX3BGb3JtTm90aWZ5ID0gTlVMTDsKLSAgICBtX2JVcGRhdGVkID0gRkFMU0U7CisgICAgbV9iVXBkYXRlZCA9IGZhbHNlOwogICAgIG1fcEZpZWxkVHJlZSA9IG5ldyBDRmllbGRUcmVlOwogICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOwogICAgIG1fcEZvcm1EaWN0ID0gcFJvb3QtPkdldERpY3QoIkFjcm9Gb3JtIik7CkBAIC0yODAsMTIgKzI4MCwxMiBAQAogICAgICAgICBkZWxldGUgbV9wRmllbGRUcmVlOwogICAgIH0KIH0KLUZYX0JPT0wJQ1BERl9JbnRlckZvcm06Om1fYlVwZGF0ZUFQID0gVFJVRTsKLUZYX0JPT0wgQ1BERl9JbnRlckZvcm06OlVwZGF0aW5nQVBFbmFibGVkKCkKK2Jvb2wJQ1BERl9JbnRlckZvcm06Om1fYlVwZGF0ZUFQID0gdHJ1ZTsKK2Jvb2wgQ1BERl9JbnRlckZvcm06OlVwZGF0aW5nQVBFbmFibGVkKCkKIHsKICAgICByZXR1cm4gbV9iVXBkYXRlQVA7CiB9Ci12b2lkIENQREZfSW50ZXJGb3JtOjpFbmFibGVVcGRhdGVBUChGWF9CT09MIGJVcGRhdGVBUCkKK3ZvaWQgQ1BERl9JbnRlckZvcm06OkVuYWJsZVVwZGF0ZUFQKGJvb2wgYlVwZGF0ZUFQKQogewogICAgIG1fYlVwZGF0ZUFQID0gYlVwZGF0ZUFQOwogfQpAQCAtMzI4LDcgKzMyOCw3IEBACiAgICAgfQogICAgIGludCBudW0gPSAwOwogICAgIENGWF9CeXRlU3RyaW5nIGJzTnVtOwotICAgIHdoaWxlIChUUlVFKSB7CisgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgaWYgKCFwRGljdC0+S2V5RXhpc3QoY3NUbXAgKyBic051bSkpIHsKICAgICAgICAgICAgIHJldHVybiBjc1RtcCArIGJzTnVtOwogICAgICAgICB9CkBAIC0zNDMsNyArMzQzLDcgQEAKIH0KICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCiB0eXBlZGVmIHN0cnVjdCBfUERGX0ZPTlREQVRBIHsKLSAgICBGWF9CT09MCQliRmluZDsKKyAgICBib29sCQliRmluZDsKICAgICBMT0dGT05UQQlsZjsKIH0gUERGX0ZPTlREQVRBLCBGQVIqIExQREZfRk9OVERBVEE7CiBzdGF0aWMgaW50IENBTExCQUNLIEVudW1Gb250RmFtRXhQcm9jKAlFTlVNTE9HRk9OVEVYQSAqbHBlbGZlLApAQCAtMzU3LDEwICszNTcsMTAgQEAKICAgICB9CiAgICAgTFBERl9GT05UREFUQSBwRGF0YSA9IChMUERGX0ZPTlREQVRBKWxQYXJhbTsKICAgICBtZW1jcHkoJnBEYXRhLT5sZiwgJmxwZWxmZS0+ZWxmTG9nRm9udCwgc2l6ZW9mKExPR0ZPTlRBKSk7Ci0gICAgcERhdGEtPmJGaW5kID0gVFJVRTsKKyAgICBwRGF0YS0+YkZpbmQgPSB0cnVlOwogICAgIHJldHVybiAwOwogfQotc3RhdGljIEZYX0JPT0wgUmV0cmlldmVTcGVjaWZpY0ZvbnQoTE9HRk9OVEEmIGxmKQorc3RhdGljIGJvb2wgUmV0cmlldmVTcGVjaWZpY0ZvbnQoTE9HRk9OVEEmIGxmKQogewogICAgIFBERl9GT05UREFUQSBmZDsKICAgICBtZW1zZXQoJmZkLCAwLCBzaXplb2YoUERGX0ZPTlREQVRBKSk7CkBAIC0zNzIsNyArMzcyLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIGZkLmJGaW5kOwogfQotc3RhdGljIEZYX0JPT0wgUmV0cmlldmVTcGVjaWZpY0ZvbnQodWludDhfdCBjaGFyU2V0LCB1aW50OF90IHBpdGNoQW5kRmFtaWx5LCBMUENTVFIgcGNzRm9udE5hbWUsIExPR0ZPTlRBJiBsZikKK3N0YXRpYyBib29sIFJldHJpZXZlU3BlY2lmaWNGb250KHVpbnQ4X3QgY2hhclNldCwgdWludDhfdCBwaXRjaEFuZEZhbWlseSwgTFBDU1RSIHBjc0ZvbnROYW1lLCBMT0dGT05UQSYgbGYpCiB7CiAgICAgbWVtc2V0KCZsZiwgMCwgc2l6ZW9mKExPR0ZPTlRBKSk7CiAgICAgbGYubGZDaGFyU2V0ID0gY2hhclNldDsKQEAgLTM4Miw3ICszODIsNyBAQAogICAgIH0KICAgICByZXR1cm4gUmV0cmlldmVTcGVjaWZpY0ZvbnQobGYpOwogfQotc3RhdGljIEZYX0JPT0wgUmV0cmlldmVTdG9ja0ZvbnQoaW50IGlGb250T2JqZWN0LCB1aW50OF90IGNoYXJTZXQsIExPR0ZPTlRBJiBsZikKK3N0YXRpYyBib29sIFJldHJpZXZlU3RvY2tGb250KGludCBpRm9udE9iamVjdCwgdWludDhfdCBjaGFyU2V0LCBMT0dGT05UQSYgbGYpCiB7CiAgICAgSEZPTlQgaEZvbnQgPSAoSEZPTlQpOjpHZXRTdG9ja09iamVjdChpRm9udE9iamVjdCk7CiAgICAgaWYgKGhGb250ICE9IE5VTEwpIHsKQEAgLTM5Miw3ICszOTIsNyBAQAogICAgICAgICAgICAgcmV0dXJuIFJldHJpZXZlU3BlY2lmaWNGb250KGxmKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogI2VuZGlmCiBDUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGRTeXN0ZW1EZWZhdWx0Rm9udChjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpCkBAIC00MDMsMTMgKzQwMywxMyBAQAogICAgIENQREZfRm9udCogcEZvbnQgPSBOVUxMOwogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KICAgICBMT0dGT05UQSBsZjsKLSAgICBGWF9CT09MIGJSZXQ7CisgICAgYm9vbCBiUmV0OwogICAgIGJSZXQgPSBSZXRyaWV2ZVN0b2NrRm9udChERUZBVUxUX0dVSV9GT05ULCAyNTUsIGxmKTsKICAgICBpZiAoIWJSZXQpIHsKICAgICAgICAgYlJldCA9IFJldHJpZXZlU3RvY2tGb250KFNZU1RFTV9GT05ULCAyNTUsIGxmKTsKICAgICB9CiAgICAgaWYgKGJSZXQpIHsKLSAgICAgICAgcEZvbnQgPSAoKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudCktPkFkZFdpbmRvd3NGb250KCZsZiwgRkFMU0UsIFRSVUUpOworICAgICAgICBwRm9udCA9ICgoQ1BERl9Eb2N1bWVudCopcERvY3VtZW50KS0+QWRkV2luZG93c0ZvbnQoJmxmLCBmYWxzZSwgdHJ1ZSk7CiAgICAgfQogI2VuZGlmCiAgICAgcmV0dXJuIHBGb250OwpAQCAtNDMwLDcgKzQzMCw3IEBACiAgICAgICAgIDo6R2V0T2JqZWN0QShoRm9udCwgc2l6ZW9mKExPR0ZPTlRBKSwgJmxmKTsKICAgICAgICAgOjpEZWxldGVPYmplY3QoaEZvbnQpOwogICAgICAgICBpZiAoc3RybGVuKGxmLmxmRmFjZU5hbWUpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuICgoQ1BERl9Eb2N1bWVudCopcERvY3VtZW50KS0+QWRkV2luZG93c0ZvbnQoJmxmLCBGQUxTRSwgVFJVRSk7CisgICAgICAgICAgICByZXR1cm4gKChDUERGX0RvY3VtZW50KilwRG9jdW1lbnQpLT5BZGRXaW5kb3dzRm9udCgmbGYsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgfQogICAgIH0KICNlbmRpZgpAQCAtNDUyLDcgKzQ1Miw3IEBACiAgICAgICAgIDo6R2V0T2JqZWN0KGhGb250LCBzaXplb2YoTE9HRk9OVEEpLCAmbGYpOwogICAgICAgICA6OkRlbGV0ZU9iamVjdChoRm9udCk7CiAgICAgICAgIGlmIChzdHJsZW4obGYubGZGYWNlTmFtZSkgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChDUERGX0RvY3VtZW50KilwRG9jdW1lbnQpLT5BZGRXaW5kb3dzRm9udCgmbGYsIEZBTFNFLCBUUlVFKTsKKyAgICAgICAgICAgIHJldHVybiAoKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudCktPkFkZFdpbmRvd3NGb250KCZsZiwgZmFsc2UsIHRydWUpOwogICAgICAgICB9CiAgICAgfQogI2VuZGlmCkBAIC00NzcsMTIgKzQ3NywxMiBAQAogICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWU7CiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwogICAgIExPR0ZPTlRBIGxmOwotICAgIEZYX0JPT0wgYlJldDsKKyAgICBib29sIGJSZXQ7CiAgICAgaWYgKGNoYXJTZXQgPT0gQU5TSV9DSEFSU0VUKSB7CiAgICAgICAgIGNzRm9udE5hbWUgPSAiSGVsdmV0aWNhIjsKICAgICAgICAgcmV0dXJuIGNzRm9udE5hbWU7CiAgICAgfQotICAgIGJSZXQgPSBGQUxTRTsKKyAgICBiUmV0ID0gZmFsc2U7CiAgICAgaWYgKGNoYXJTZXQgPT0gU0hJRlRKSVNfQ0hBUlNFVCkgewogICAgICAgICBiUmV0ID0gUmV0cmlldmVTcGVjaWZpY0ZvbnQoY2hhclNldCwgREVGQVVMVF9QSVRDSCB8IEZGX0RPTlRDQVJFLCAiTVMgTWluY2hvIiwgbGYpOwogICAgIH0gZWxzZSBpZiAoY2hhclNldCA9PSBHQjIzMTJfQ0hBUlNFVCkgewpAQCAtNTkxLDcgKzU5MSw3IEBACiAgICAgICAgIGlmIChjc0ZvbnROYW1lID09ICJIZWx2ZXRpY2EiKSB7CiAgICAgICAgICAgICBwRm9udCA9IEFkZFN0YW5kYXJkRm9udChwRG9jdW1lbnQsIGNzRm9udE5hbWUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEZvbnQgPSAoKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudCktPkFkZFdpbmRvd3NGb250KCZsZiwgRkFMU0UsIFRSVUUpOworICAgICAgICAgICAgcEZvbnQgPSAoKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudCktPkFkZFdpbmRvd3NGb250KCZsZiwgZmFsc2UsIHRydWUpOwogICAgICAgICB9CiAgICAgfQogI2VuZGlmCkBAIC02MDcsMTUgKzYwNywxNSBAQAogICAgIHBGb250ID0gQWRkTmF0aXZlRm9udChjaGFyU2V0LCBwRG9jdW1lbnQpOwogICAgIHJldHVybiBwRm9udDsKIH0KLUZYX0JPT0wgQ1BERl9JbnRlckZvcm06OlZhbGlkYXRlRmllbGROYW1lKENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSwgaW50IGlUeXBlLCBjb25zdCBDUERGX0Zvcm1GaWVsZCogcEV4Y2x1ZGVkRmllbGQsIGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBFeGNsdWRlZENvbnRyb2wpCitib29sIENQREZfSW50ZXJGb3JtOjpWYWxpZGF0ZUZpZWxkTmFtZShDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUsIGludCBpVHlwZSwgY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBFeGNsdWRlZEZpZWxkLCBjb25zdCBDUERGX0Zvcm1Db250cm9sKiBwRXhjbHVkZWRDb250cm9sKQogewogICAgIGlmIChjc05ld0ZpZWxkTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGludCBpUG9zID0gMDsKICAgICBpbnQgaUxlbmd0aCA9IGNzTmV3RmllbGROYW1lLkdldExlbmd0aCgpOwogICAgIENGWF9XaWRlU3RyaW5nIGNzU3ViOwotICAgIHdoaWxlIChUUlVFKSB7CisgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgd2hpbGUgKGlQb3MgPCBpTGVuZ3RoICYmIChjc05ld0ZpZWxkTmFtZVtpUG9zXSA9PSBMJy4nIHx8IGNzTmV3RmllbGROYW1lW2lQb3NdID09IEwnICcpKSB7CiAgICAgICAgICAgICBpUG9zICsrOwogICAgICAgICB9CkBAIC02NTEsMTUgKzY1MSwxNSBAQAogICAgICAgICAgICAgaW50IGlSZXQgPSBDb21wYXJlRmllbGROYW1lKGNzU3ViLCBjc0Z1bGxOYW1lKTsKICAgICAgICAgICAgIGlmIChpUmV0ID09IDEpIHsKICAgICAgICAgICAgICAgICBpZiAocEZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBpVHlwZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGlSZXQgPT0gMiAmJiBjc1N1YiA9PSBjc05ld0ZpZWxkTmFtZSkgewogICAgICAgICAgICAgICAgIGlmIChjc0Z1bGxOYW1lW2lQb3NdID09IEwnLicpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChpUmV0ID09IDMgJiYgY3NTdWIgPT0gY3NOZXdGaWVsZE5hbWUpIHsKICAgICAgICAgICAgICAgICBpZiAoY3NOZXdGaWVsZE5hbWVbY3NGdWxsTmFtZS5HZXRMZW5ndGgoKV0gPT0gTCcuJykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTY2OCwyNiArNjY4LDI2IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGNzU3ViLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgY3NOZXdGaWVsZE5hbWUgPSBjc1N1YjsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9JbnRlckZvcm06OlZhbGlkYXRlRmllbGROYW1lKENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSwgaW50IGlUeXBlKQorYm9vbCBDUERGX0ludGVyRm9ybTo6VmFsaWRhdGVGaWVsZE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lLCBpbnQgaVR5cGUpCiB7CiAgICAgcmV0dXJuIFZhbGlkYXRlRmllbGROYW1lKGNzTmV3RmllbGROYW1lLCBpVHlwZSwgTlVMTCwgTlVMTCk7CiB9Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpWYWxpZGF0ZUZpZWxkTmFtZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUpCitib29sIENQREZfSW50ZXJGb3JtOjpWYWxpZGF0ZUZpZWxkTmFtZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUpCiB7CiAgICAgaWYgKHBGaWVsZCA9PSBOVUxMIHx8IGNzTmV3RmllbGROYW1lLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIFZhbGlkYXRlRmllbGROYW1lKGNzTmV3RmllbGROYW1lLCAoKENQREZfRm9ybUZpZWxkKilwRmllbGQpLT5HZXRGaWVsZFR5cGUoKSwgcEZpZWxkLCBOVUxMKTsKIH0KLUZYX0JPT0wgQ1BERl9JbnRlckZvcm06OlZhbGlkYXRlRmllbGROYW1lKGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sLCBDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUpCitib29sIENQREZfSW50ZXJGb3JtOjpWYWxpZGF0ZUZpZWxkTmFtZShjb25zdCBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCwgQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lKQogewogICAgIGlmIChwQ29udHJvbCA9PSBOVUxMIHx8IGNzTmV3RmllbGROYW1lLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9ICgoQ1BERl9Gb3JtQ29udHJvbCopcENvbnRyb2wpLT5HZXRGaWVsZCgpOwogICAgIHJldHVybiBWYWxpZGF0ZUZpZWxkTmFtZShjc05ld0ZpZWxkTmFtZSwgcEZpZWxkLT5HZXRGaWVsZFR5cGUoKSwgcEZpZWxkLCBwQ29udHJvbCk7CkBAIC03NjQsMTkgKzc2NCwxOSBAQAogICAgICAgICB9CiAgICAgfQogfQotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6SXNWYWxpZEZvcm1GaWVsZChjb25zdCB2b2lkKiBwRmllbGQpCitib29sIENQREZfSW50ZXJGb3JtOjpJc1ZhbGlkRm9ybUZpZWxkKGNvbnN0IHZvaWQqIHBGaWVsZCkKIHsKICAgICBpZiAocEZpZWxkID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKICAgICAgICAgQ1BERl9Gb3JtRmllbGQgKnBGb3JtRmllbGQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZChpKTsKICAgICAgICAgaWYgKHBGaWVsZCA9PSBwRm9ybUZpZWxkKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBDUERGX0Zvcm1GaWVsZCogQ1BERl9JbnRlckZvcm06OkdldEZpZWxkQnlEaWN0KENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCkgY29uc3QKIHsKQEAgLTgwOCwxMCArODA4LDEwIEBACiAgICAgfQogICAgIHJldHVybiBOVUxMOwogfQotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6SXNWYWxpZEZvcm1Db250cm9sKGNvbnN0IHZvaWQqIHBDb250cm9sKQorYm9vbCBDUERGX0ludGVyRm9ybTo6SXNWYWxpZEZvcm1Db250cm9sKGNvbnN0IHZvaWQqIHBDb250cm9sKQogewogICAgIGlmIChwQ29udHJvbCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWF9QT1NJVElPTiBwb3MgPSBtX0NvbnRyb2xNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwogICAgIHdoaWxlIChwb3MpIHsKQEAgLTgxOSwxMCArODE5LDEwIEBACiAgICAgICAgIHZvaWQqIHBGb3JtQ29udHJvbCA9IE5VTEw7CiAgICAgICAgIG1fQ29udHJvbE1hcC5HZXROZXh0QXNzb2MocG9zLCAodm9pZComKXBXaWRnZXREaWN0LCBwRm9ybUNvbnRyb2wpOwogICAgICAgICBpZiAocENvbnRyb2wgPT0gcEZvcm1Db250cm9sKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBpbnQgQ1BERl9JbnRlckZvcm06OkNvdW50UGFnZUNvbnRyb2xzKENQREZfUGFnZSogcFBhZ2UpIGNvbnN0CiB7CkBAIC05MTksNyArOTE5LDcgQEAKICAgICAgICAgICAgIGNzU3ViICs9IGNzRmllbGROYW1lW2lQb3MgKytdOwogICAgICAgICB9CiAgICAgICAgIGludCBpQ291bnQgPSBwQXJyYXktPkdldENvdW50KCk7Ci0gICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiRmluZCA9IGZhbHNlOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewogICAgICAgICAgICAgcERpY3QgPSBwQXJyYXktPkdldERpY3QoaSk7CiAgICAgICAgICAgICBpZiAocERpY3QgPT0gTlVMTCkgewpAQCAtOTI3LDcgKzkyNyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1QgPSBwRGljdC0+R2V0VW5pY29kZVRleHQoIlQiKTsKICAgICAgICAgICAgIGlmIChjc1QgPT0gY3NTdWIpIHsKLSAgICAgICAgICAgICAgICBiRmluZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYkZpbmQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC05NzAsNyArOTcwLDcgQEAKICAgICAgICAgICAgIGNzU3ViICs9IGNzRmllbGROYW1lW2lQb3MgKytdOwogICAgICAgICB9CiAgICAgICAgIGludCBpQ291bnQgPSBwQXJyYXktPkdldENvdW50KCk7Ci0gICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiRmluZCA9IGZhbHNlOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewogICAgICAgICAgICAgcERpY3QgPSBwQXJyYXktPkdldERpY3QoaSk7CiAgICAgICAgICAgICBpZiAocERpY3QgPT0gTlVMTCkgewpAQCAtOTc4LDcgKzk3OCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1QgPSBwRGljdC0+R2V0VW5pY29kZVRleHQoIlQiKTsKICAgICAgICAgICAgIGlmIChjc1QgPT0gY3NTdWIpIHsKLSAgICAgICAgICAgICAgICBiRmluZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYkZpbmQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC05OTYsMTQgKzk5NiwxNCBAQAogICAgIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheSgiS2lkcyIpOwogICAgIHJldHVybiBwQXJyYXkgPyBwQXJyYXktPkdldERpY3QoaW5kZXgpIDogcERpY3Q7CiB9Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpOZWVkQ29uc3RydWN0QVAoKQorYm9vbCBDUERGX0ludGVyRm9ybTo6TmVlZENvbnN0cnVjdEFQKCkKIHsKICAgICBpZiAobV9wRm9ybURpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIG1fcEZvcm1EaWN0LT5HZXRCb29sZWFuKCJOZWVkQXBwZWFyYW5jZXMiKTsKIH0KLXZvaWQgQ1BERl9JbnRlckZvcm06Ok5lZWRDb25zdHJ1Y3RBUChGWF9CT09MIGJOZWVkQVApCit2b2lkIENQREZfSW50ZXJGb3JtOjpOZWVkQ29uc3RydWN0QVAoYm9vbCBiTmVlZEFQKQogewogICAgIGlmIChtX3BGb3JtRGljdCA9PSBOVUxMKSB7CiAgICAgICAgIEluaXRJbnRlckZvcm1EaWN0KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCk7CkBAIC0xMDc4LDM3ICsxMDc4LDM3IEBACiB7CiAgICAgcmV0dXJuIEdldE5hdGl2ZUludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIG1fcERvY3VtZW50LCBjc05hbWVUYWcpOwogfQotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6RmluZEZvcm1Gb250KGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCitib29sIENQREZfSW50ZXJGb3JtOjpGaW5kRm9ybUZvbnQoY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKIHsKICAgICByZXR1cm4gRmluZEludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIHBGb250LCBjc05hbWVUYWcpOwogfQotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6RmluZEZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsIENQREZfRm9udComIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQorYm9vbCBDUERGX0ludGVyRm9ybTo6RmluZEZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsIENQREZfRm9udComIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQogewogICAgIHJldHVybiBGaW5kSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGNzRm9udE5hbWUsIHBGb250LCBjc05hbWVUYWcpOwogfQogdm9pZCBDUERGX0ludGVyRm9ybTo6QWRkRm9ybUZvbnQoY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKIHsKICAgICBBZGRJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCwgcEZvbnQsIGNzTmFtZVRhZyk7Ci0gICAgbV9iVXBkYXRlZCA9IFRSVUU7CisgICAgbV9iVXBkYXRlZCA9IHRydWU7CiB9CiBDUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGROYXRpdmVGb3JtRm9udCh1aW50OF90IGNoYXJTZXQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCiB7Ci0gICAgbV9iVXBkYXRlZCA9IFRSVUU7CisgICAgbV9iVXBkYXRlZCA9IHRydWU7CiAgICAgcmV0dXJuIEFkZE5hdGl2ZUludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIG1fcERvY3VtZW50LCBjaGFyU2V0LCBjc05hbWVUYWcpOwogfQogQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6QWRkTmF0aXZlRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKIHsKLSAgICBtX2JVcGRhdGVkID0gVFJVRTsKKyAgICBtX2JVcGRhdGVkID0gdHJ1ZTsKICAgICByZXR1cm4gQWRkTmF0aXZlSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGNzTmFtZVRhZyk7CiB9CiB2b2lkIENQREZfSW50ZXJGb3JtOjpSZW1vdmVGb3JtRm9udChjb25zdCBDUERGX0ZvbnQqIHBGb250KQogewotICAgIG1fYlVwZGF0ZWQgPSBUUlVFOworICAgIG1fYlVwZGF0ZWQgPSB0cnVlOwogICAgIFJlbW92ZUludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIHBGb250KTsKIH0KIHZvaWQgQ1BERl9JbnRlckZvcm06OlJlbW92ZUZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZykKIHsKLSAgICBtX2JVcGRhdGVkID0gVFJVRTsKKyAgICBtX2JVcGRhdGVkID0gdHJ1ZTsKICAgICBSZW1vdmVJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBjc05hbWVUYWcpOwogfQogQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBDUERGX0ludGVyRm9ybTo6R2V0RGVmYXVsdEFwcGVhcmFuY2UoKQpAQCAtMTEzMSwxMiArMTEzMSwxMiBAQAogICAgIH0KICAgICByZXR1cm4gbV9wRm9ybURpY3QtPkdldEludGVnZXIoIlEiLCAwKTsKIH0KLUZYX0JPT0wgQ1BERl9JbnRlckZvcm06OlJlc2V0Rm9ybShjb25zdCBDRlhfUHRyQXJyYXkmIGZpZWxkcywgRlhfQk9PTCBiSW5jbHVkZU9yRXhjbHVkZSwgRlhfQk9PTCBiTm90aWZ5KQorYm9vbCBDUERGX0ludGVyRm9ybTo6UmVzZXRGb3JtKGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLCBib29sIGJJbmNsdWRlT3JFeGNsdWRlLCBib29sIGJOb3RpZnkpCiB7CiAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgIGludCBpUmV0ID0gbV9wRm9ybU5vdGlmeS0+QmVmb3JlRm9ybVJlc2V0KHRoaXMpOwogICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBpbnQgbkNvdW50ID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuQ291bnRGaWVsZHMoKTsKQEAgLTExNDUsMTEgKzExNDUsMTEgQEAKICAgICAgICAgaWYgKHBGaWVsZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJGaW5kID0gRkFMU0U7CisgICAgICAgIGJvb2wgYkZpbmQgPSBmYWxzZTsKICAgICAgICAgaW50IGlDb3VudCA9IGZpZWxkcy5HZXRTaXplKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7CiAgICAgICAgICAgICBpZiAocEZpZWxkID09IChDUERGX0Zvcm1GaWVsZCopZmllbGRzW2ldKSB7Ci0gICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJGaW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTE2MCwxNCArMTE2MCwxNCBAQAogICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICBtX3BGb3JtTm90aWZ5LT5BZnRlckZvcm1SZXNldCh0aGlzKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpSZXNldEZvcm0oRlhfQk9PTCBiTm90aWZ5KQorYm9vbCBDUERGX0ludGVyRm9ybTo6UmVzZXRGb3JtKGJvb2wgYk5vdGlmeSkKIHsKICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtTm90aWZ5LT5CZWZvcmVGb3JtUmVzZXQodGhpcyk7CiAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwpAQCAtMTE4MSw3ICsxMTgxLDcgQEAKICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgbV9wRm9ybU5vdGlmeS0+QWZ0ZXJGb3JtUmVzZXQodGhpcyk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDUERGX0ludGVyRm9ybTo6UmVsb2FkRm9ybSgpCiB7CkBAIC0xMjQyLDcgKzEyNDIsNyBAQAogICAgICAgICBBZGRUZXJtaW5hbEZpZWxkKHBGaWVsZERpY3QpOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9JbnRlckZvcm06Okhhc1hGQUZvcm0oKSBjb25zdAorYm9vbCBDUERGX0ludGVyRm9ybTo6SGFzWEZBRm9ybSgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fcEZvcm1EaWN0ICYmIG1fcEZvcm1EaWN0LT5HZXRBcnJheShGWF9CU1RSQygiWEZBIikpICE9IE5VTEw7CiB9CkBAIC0xMzAzLDcgKzEzMDMsNyBAQAogICAgICAgICBwRmllbGQgPSBuZXcgQ1BERl9Gb3JtRmllbGQodGhpcywgcFBhcmVudCk7CiAgICAgICAgIENQREZfT2JqZWN0KiBwVE9iaiA9IHBEaWN0LT5HZXRFbGVtZW50KCJUIik7CiAgICAgICAgIGlmIChwVE9iaiAmJiBwVE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwQ2xvbmUgPSBwVE9iai0+Q2xvbmUoVFJVRSk7CisgICAgICAgICAgICBDUERGX09iamVjdCogcENsb25lID0gcFRPYmotPkNsb25lKHRydWUpOwogICAgICAgICAgICAgaWYgKHBDbG9uZSkgewogICAgICAgICAgICAgICAgIHBEaWN0LT5TZXRBdCgiVCIsIHBDbG9uZSk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTM0Miw3ICsxMzQyLDcgQEAKICAgICAoKENQREZfRm9ybUZpZWxkKilwRmllbGQpLT5tX0NvbnRyb2xMaXN0LkFkZChwQ29udHJvbCk7CiAgICAgcmV0dXJuIHBDb250cm9sOwogfQotQ1BERl9Gb3JtRmllbGQqIENQREZfSW50ZXJGb3JtOjpDaGVja1JlcXVpcmVkRmllbGRzKGNvbnN0IENGWF9QdHJBcnJheSAqZmllbGRzLCBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlKSBjb25zdAorQ1BERl9Gb3JtRmllbGQqIENQREZfSW50ZXJGb3JtOjpDaGVja1JlcXVpcmVkRmllbGRzKGNvbnN0IENGWF9QdHJBcnJheSAqZmllbGRzLCBib29sIGJJbmNsdWRlT3JFeGNsdWRlKSBjb25zdAogewogICAgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKQEAgLTEzNTgsNyArMTM1OCw3IEBACiAgICAgICAgIGlmIChkd0ZsYWdzICYgMHgwNCkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCBiRmluZCA9IFRSVUU7CisgICAgICAgIGJvb2wgYkZpbmQgPSB0cnVlOwogICAgICAgICBpZiAoZmllbGRzICE9IE5VTEwpIHsKICAgICAgICAgICAgIGJGaW5kID0gZmllbGRzLT5GaW5kKHBGaWVsZCwgMCkgPj0gMDsKICAgICAgICAgfQpAQCAtMTM3MSw3ICsxMzcxLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIE5VTEw7CiB9Ci1DRkRGX0RvY3VtZW50KiBDUERGX0ludGVyRm9ybTo6RXhwb3J0VG9GREYoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwZGZfcGF0aCwgRlhfQk9PTCBiU2ltcGxlRmlsZVNwZWMpIGNvbnN0CitDRkRGX0RvY3VtZW50KiBDUERGX0ludGVyRm9ybTo6RXhwb3J0VG9GREYoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwZGZfcGF0aCwgYm9vbCBiU2ltcGxlRmlsZVNwZWMpIGNvbnN0CiB7CiAgICAgQ0ZYX1B0ckFycmF5IGZpZWxkczsKICAgICBpbnQgbkNvdW50ID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuQ291bnRGaWVsZHMoKTsKQEAgLTEzNzksMTAgKzEzNzksMTAgQEAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGkpOwogICAgICAgICBmaWVsZHMuQWRkKHBGaWVsZCk7CiAgICAgfQotICAgIHJldHVybiBFeHBvcnRUb0ZERihwZGZfcGF0aCwgZmllbGRzLCBUUlVFLCBiU2ltcGxlRmlsZVNwZWMpOworICAgIHJldHVybiBFeHBvcnRUb0ZERihwZGZfcGF0aCwgZmllbGRzLCB0cnVlLCBiU2ltcGxlRmlsZVNwZWMpOwogfQogQ0ZYX1dpZGVTdHJpbmcgRklMRVNQRUNfRW5jb2RlRmlsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlcGF0aCk7Ci1DRkRGX0RvY3VtZW50KiBDUERGX0ludGVyRm9ybTo6RXhwb3J0VG9GREYoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwZGZfcGF0aCwgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUsIEZYX0JPT0wgYlNpbXBsZUZpbGVTcGVjKSBjb25zdAorQ0ZERl9Eb2N1bWVudCogQ1BERl9JbnRlckZvcm06OkV4cG9ydFRvRkRGKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcGRmX3BhdGgsIENGWF9QdHJBcnJheSYgZmllbGRzLCBib29sIGJJbmNsdWRlT3JFeGNsdWRlLCBib29sIGJTaW1wbGVGaWxlU3BlYykgY29uc3QKIHsKICAgICBDRkRGX0RvY3VtZW50KiBwRG9jID0gQ0ZERl9Eb2N1bWVudDo6Q3JlYXRlTmV3RG9jKCk7CiAgICAgaWYgKHBEb2MgPT0gTlVMTCkgewpAQCAtMTQxNSw3ICsxNDE1LDcgQEAKICAgICAgICAgaWYgKGR3RmxhZ3MgJiAweDA0KSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJGaW5kID0gZmllbGRzLkZpbmQocEZpZWxkLCAwKSA+PSAwOworICAgICAgICBib29sIGJGaW5kID0gZmllbGRzLkZpbmQocEZpZWxkLCAwKSA+PSAwOwogICAgICAgICBpZiAoKGJJbmNsdWRlT3JFeGNsdWRlICYmIGJGaW5kKSB8fCAoIWJJbmNsdWRlT3JFeGNsdWRlICYmICFiRmluZCkpIHsKICAgICAgICAgICAgIGlmICgoZHdGbGFncyAmIDB4MDIpICE9IDAgJiYgcEZpZWxkLT5tX3BEaWN0LT5HZXRTdHJpbmcoIlYiKS5Jc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTE0MzIsNyArMTQzMiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwRmllbGREaWN0LT5TZXRBdCgiVCIsIHBTdHJpbmcpOwogICAgICAgICAgICAgaWYgKHBGaWVsZC0+R2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fCBwRmllbGQtPkdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6UmFkaW9CdXR0b24pIHsKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0V4cG9ydCA9IHBGaWVsZC0+R2V0Q2hlY2tWYWx1ZShGQUxTRSk7CisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NFeHBvcnQgPSBwRmllbGQtPkdldENoZWNrVmFsdWUoZmFsc2UpOwogICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzQkV4cG9ydCA9IFBERl9FbmNvZGVUZXh0KGNzRXhwb3J0KTsKICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9wdCA9IEZQREZfR2V0RmllbGRBdHRyKHBGaWVsZC0+bV9wRGljdCwgIk9wdCIpOwogICAgICAgICAgICAgICAgIGlmIChwT3B0ID09IE5VTEwpIHsKQEAgLTE0NDMsNyArMTQ0Myw3IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwViA9IEZQREZfR2V0RmllbGRBdHRyKHBGaWVsZC0+bV9wRGljdCwgIlYiKTsKICAgICAgICAgICAgICAgICBpZiAocFYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBwRmllbGREaWN0LT5TZXRBdCgiViIsIHBWLT5DbG9uZShUUlVFKSk7CisgICAgICAgICAgICAgICAgICAgIHBGaWVsZERpY3QtPlNldEF0KCJWIiwgcFYtPkNsb25lKHRydWUpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwRmllbGRzLT5BZGQocEZpZWxkRGljdCk7CkBAIC0xNDgzLDcgKzE0ODMsNyBAQAogICAgICAgICBjc1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChjc0JWYWx1ZSk7CiAgICAgfQogfQotdm9pZCBDUERGX0ludGVyRm9ybTo6RkRGX0ltcG9ydEZpZWxkKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHBhcmVudF9uYW1lLCBGWF9CT09MIGJOb3RpZnksIGludCBuTGV2ZWwpCit2b2lkIENQREZfSW50ZXJGb3JtOjpGREZfSW1wb3J0RmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgcGFyZW50X25hbWUsIGJvb2wgYk5vdGlmeSwgaW50IG5MZXZlbCkKIHsKICAgICBDRlhfV2lkZVN0cmluZyBuYW1lOwogICAgIGlmICghcGFyZW50X25hbWUuSXNFbXB0eSgpKSB7CkBAIC0xNTMxLDcgKzE1MzEsNyBAQAogICAgIHBGaWVsZC0+U2V0VmFsdWUoY3NXVmFsdWUpOwogICAgIENQREZfRm9ybUZpZWxkOjpUeXBlIGVUeXBlID0gcEZpZWxkLT5HZXRUeXBlKCk7CiAgICAgaWYgKChlVHlwZSA9PSBDUERGX0Zvcm1GaWVsZDo6TGlzdEJveCB8fCBlVHlwZSA9PSBDUERGX0Zvcm1GaWVsZDo6Q29tYm9Cb3gpICYmIHBGaWVsZERpY3QtPktleUV4aXN0KCJPcHQiKSkgewotICAgICAgICBwRmllbGQtPm1fcERpY3QtPlNldEF0KCJPcHQiLCBwRmllbGREaWN0LT5HZXRFbGVtZW50VmFsdWUoIk9wdCIpLT5DbG9uZShUUlVFKSk7CisgICAgICAgIHBGaWVsZC0+bV9wRGljdC0+U2V0QXQoIk9wdCIsIHBGaWVsZERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiT3B0IiktPkNsb25lKHRydWUpKTsKICAgICB9CiAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgIGlmIChpVHlwZSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1ggfHwgaVR5cGUgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSB7CkBAIC0xNTQ2LDI0ICsxNTQ2LDI0IEBACiAgICAgICAgIHBGaWVsZC0+VXBkYXRlQVAoTlVMTCk7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6SW1wb3J0RnJvbUZERihjb25zdCBDRkRGX0RvY3VtZW50KiBwRkRGLCBGWF9CT09MIGJOb3RpZnkpCitib29sIENQREZfSW50ZXJGb3JtOjpJbXBvcnRGcm9tRkRGKGNvbnN0IENGREZfRG9jdW1lbnQqIHBGREYsIGJvb2wgYk5vdGlmeSkKIHsKICAgICBpZiAocEZERiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX0RpY3Rpb25hcnkqIHBNYWluRGljdCA9IHBGREYtPkdldFJvb3QoKS0+R2V0RGljdCgiRkRGIik7CiAgICAgaWYgKHBNYWluRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX0FycmF5KiBwRmllbGRzID0gcE1haW5EaWN0LT5HZXRBcnJheSgiRmllbGRzIik7CiAgICAgaWYgKHBGaWVsZHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9ic0VuY29kaW5nID0gcE1haW5EaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkVuY29kaW5nIikpOwogICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICBpbnQgaVJldCA9IG1fcEZvcm1Ob3RpZnktPkJlZm9yZUZvcm1JbXBvcnREYXRhKHRoaXMpOwogICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEZpZWxkcy0+R2V0Q291bnQoKTsgaSArKykgewpAQCAtMTU3NiwxMyArMTU3NiwxMyBAQAogICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICBtX3BGb3JtTm90aWZ5LT5BZnRlckZvcm1JbXBvcnREYXRhKHRoaXMpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ1BERl9JbnRlckZvcm06OlNldEZvcm1Ob3RpZnkoY29uc3QgQ1BERl9Gb3JtTm90aWZ5KiBwTm90aWZ5KQogewogICAgIG1fcEZvcm1Ob3RpZnkgPSAoQ1BERl9Gb3JtTm90aWZ5KilwTm90aWZ5OwogfQotaW50IENQREZfSW50ZXJGb3JtOjpHZXRQYWdlV2l0aFdpZGdldChpbnQgaUN1clBhZ2UsIEZYX0JPT0wgYk5leHQpCitpbnQgQ1BERl9JbnRlckZvcm06OkdldFBhZ2VXaXRoV2lkZ2V0KGludCBpQ3VyUGFnZSwgYm9vbCBiTmV4dCkKIHsKICAgICBpZiAoaUN1clBhZ2UgPCAwKSB7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTE2MjIsNiArMTYyMiw2IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGlOZXdQYWdlOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfSB3aGlsZSAoVFJVRSk7CisgICAgfSB3aGlsZSAodHJ1ZSk7CiAgICAgcmV0dXJuIC0xOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybWNvbnRyb2wuY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybWNvbnRyb2wuY3BwCmluZGV4IDg3ZWVlOTIuLjYyZWI1OTEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Zvcm1jb250cm9sLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtY29udHJvbC5jcHAKQEAgLTExMywyNSArMTEzLDI1IEBACiAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NXT24gPSBQREZfRGVjb2RlVGV4dChjc09uKTsKICAgICByZXR1cm4gY3NXT247CiB9Ci1GWF9CT09MIENQREZfRm9ybUNvbnRyb2w6OklzQ2hlY2tlZCgpCitib29sIENQREZfRm9ybUNvbnRyb2w6OklzQ2hlY2tlZCgpCiB7CiAgICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbik7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NPbiA9IEdldE9uU3RhdGVOYW1lKCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NBUyA9IG1fcFdpZGdldERpY3QtPkdldFN0cmluZygiQVMiKTsKICAgICByZXR1cm4gY3NBUyA9PSBjc09uOwogfQotRlhfQk9PTCBDUERGX0Zvcm1Db250cm9sOjpJc0RlZmF1bHRDaGVja2VkKCkKK2Jvb2wgQ1BERl9Gb3JtQ29udHJvbDo6SXNEZWZhdWx0Q2hlY2tlZCgpCiB7CiAgICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbik7CiAgICAgQ1BERl9PYmplY3QqIHBEViA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5tX3BEaWN0LCAiRFYiKTsKICAgICBpZiAocERWID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIGNzRFYgPSBwRFYtPkdldFN0cmluZygpOwogICAgIENGWF9CeXRlU3RyaW5nIGNzT24gPSBHZXRPblN0YXRlTmFtZSgpOwogICAgIHJldHVybiAoY3NEViA9PSBjc09uKTsKIH0KLXZvaWQgQ1BERl9Gb3JtQ29udHJvbDo6Q2hlY2tDb250cm9sKEZYX0JPT0wgYkNoZWNrZWQpCit2b2lkIENQREZfRm9ybUNvbnRyb2w6OkNoZWNrQ29udHJvbChib29sIGJDaGVja2VkKQogewogICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8IEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6UmFkaW9CdXR0b24pOwogICAgIENGWF9CeXRlU3RyaW5nIGNzT24gPSBHZXRPblN0YXRlTmFtZSgpOwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbV9wV2lkZ2V0RGljdC0+U2V0QXROYW1lKCJBUyIsIGNzQVMpOwotICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOworICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSB0cnVlOwogfQogQ1BERl9TdHJlYW0qIEZQREZET0NfR2V0QW5ub3RBUChDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QsIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpOwogdm9pZCBDUERGX0Zvcm1Db250cm9sOjpEcmF3Q29udHJvbChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBDUERGX1BhZ2UqIHBQYWdlLApAQCAtMTg2LDcgKzE4Niw3IEBACiAgICAgfQogICAgIHJldHVybiBJbnZlcnQ7CiB9Ci1DUERGX0FwU2V0dGluZ3MgQ1BERl9Gb3JtQ29udHJvbDo6R2V0TUsoRlhfQk9PTCBiQ3JlYXRlKQorQ1BERl9BcFNldHRpbmdzIENQREZfRm9ybUNvbnRyb2w6OkdldE1LKGJvb2wgYkNyZWF0ZSkKIHsKICAgICBpZiAoIW1fcFdpZGdldERpY3QpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yMDEsNDkgKzIwMSw0OSBAQAogICAgIH0KICAgICByZXR1cm4gbWs7CiB9Ci1GWF9CT09MIENQREZfRm9ybUNvbnRyb2w6Okhhc01LRW50cnkoQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSkKK2Jvb2wgQ1BERl9Gb3JtQ29udHJvbDo6SGFzTUtFbnRyeShDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KQogewotICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKEZBTFNFKTsKKyAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhmYWxzZSk7CiAgICAgcmV0dXJuIG1rLkhhc01LRW50cnkoY3NFbnRyeSk7CiB9CiBpbnQgQ1BERl9Gb3JtQ29udHJvbDo6R2V0Um90YXRpb24oKQogewotICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKEZBTFNFKTsKKyAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhmYWxzZSk7CiAgICAgcmV0dXJuIG1rLkdldFJvdGF0aW9uKCk7CiB9CiBGWF9BUkdCIENQREZfRm9ybUNvbnRyb2w6OkdldENvbG9yKGludCYgaUNvbG9yVHlwZSwgQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSkKIHsKLSAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhGQUxTRSk7CisgICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoZmFsc2UpOwogICAgIHJldHVybiBtay5HZXRDb2xvcihpQ29sb3JUeXBlLCBjc0VudHJ5KTsKIH0KIEZYX0ZMT0FUIENQREZfRm9ybUNvbnRyb2w6OkdldE9yaWdpbmFsQ29sb3IoaW50IGluZGV4LCBDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KQogewotICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKEZBTFNFKTsKKyAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhmYWxzZSk7CiAgICAgcmV0dXJuIG1rLkdldE9yaWdpbmFsQ29sb3IoaW5kZXgsIGNzRW50cnkpOwogfQogdm9pZCBDUERGX0Zvcm1Db250cm9sOjpHZXRPcmlnaW5hbENvbG9yKGludCYgaUNvbG9yVHlwZSwgRlhfRkxPQVQgZmNbNF0sIENGWF9CeXRlU3RyaW5nIGNzRW50cnkpCiB7Ci0gICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOworICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKGZhbHNlKTsKICAgICBtay5HZXRPcmlnaW5hbENvbG9yKGlDb2xvclR5cGUsIGZjLCBjc0VudHJ5KTsKIH0KIENGWF9XaWRlU3RyaW5nIENQREZfRm9ybUNvbnRyb2w6OkdldENhcHRpb24oQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSkKIHsKLSAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhGQUxTRSk7CisgICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoZmFsc2UpOwogICAgIHJldHVybiBtay5HZXRDYXB0aW9uKGNzRW50cnkpOwogfQogQ1BERl9TdHJlYW0qIENQREZfRm9ybUNvbnRyb2w6OkdldEljb24oQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSkKIHsKLSAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhGQUxTRSk7CisgICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoZmFsc2UpOwogICAgIHJldHVybiBtay5HZXRJY29uKGNzRW50cnkpOwogfQogQ1BERl9JY29uRml0IENQREZfRm9ybUNvbnRyb2w6OkdldEljb25GaXQoKQogewotICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKEZBTFNFKTsKKyAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhmYWxzZSk7CiAgICAgcmV0dXJuIG1rLkdldEljb25GaXQoKTsKIH0KIGludCBDUERGX0Zvcm1Db250cm9sOjpHZXRUZXh0UG9zaXRpb24oKQogewotICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKEZBTFNFKTsKKyAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhmYWxzZSk7CiAgICAgcmV0dXJuIG1rLkdldFRleHRQb3NpdGlvbigpOwogfQogQ1BERl9BY3Rpb24gQ1BERl9Gb3JtQ29udHJvbDo6R2V0QWN0aW9uKCkKQEAgLTM0MywxMCArMzQzLDEwIEBACiAgICAgfQogICAgIHJldHVybiBwT2JqLT5HZXRJbnRlZ2VyKCk7CiB9Ci1GWF9CT09MIENQREZfQXBTZXR0aW5nczo6SGFzTUtFbnRyeShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRW50cnkpCitib29sIENQREZfQXBTZXR0aW5nczo6SGFzTUtFbnRyeShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRW50cnkpCiB7CiAgICAgaWYgKG1fcERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIG1fcERpY3QtPktleUV4aXN0KGNzRW50cnkpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybWZpZWxkLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Zvcm1maWVsZC5jcHAKaW5kZXggMDg3ZWJhOC4uOGQ5ODg3ZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybWZpZWxkLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtZmllbGQuY3BwCkBAIC03LDExICs3LDExIEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCiAjaW5jbHVkZSAiZG9jX3V0aWxzLmgiCiAKLUZYX0JPT0wgUERGX0Zvcm1GaWVsZF9Jc1VuaXNvbihDUERGX0Zvcm1GaWVsZCAqcEZpZWxkKQorYm9vbCBQREZfRm9ybUZpZWxkX0lzVW5pc29uKENQREZfRm9ybUZpZWxkICpwRmllbGQpCiB7Ci0gICAgRlhfQk9PTCBiVW5pc29uID0gRkFMU0U7CisgICAgYm9vbCBiVW5pc29uID0gZmFsc2U7CiAgICAgaWYgKHBGaWVsZC0+R2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCkgewotICAgICAgICBiVW5pc29uID0gVFJVRTsKKyAgICAgICAgYlVuaXNvbiA9IHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyA9IHBGaWVsZC0+R2V0RmllbGRGbGFncygpOwogICAgICAgICBiVW5pc29uID0gKChkd0ZsYWdzICYgMHgyMDAwMDAwKSAhPSAwKTsKQEAgLTEwMCw3ICsxMDAsNyBAQAogewogICAgIHJldHVybiA6OkdldEZ1bGxOYW1lKG1fcERpY3QpOwogfQotRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6UmVzZXRGaWVsZChGWF9CT09MIGJOb3RpZnkpCitib29sIENQREZfRm9ybUZpZWxkOjpSZXNldEZpZWxkKGJvb2wgYk5vdGlmeSkKIHsKICAgICBzd2l0Y2ggKG1fVHlwZSkgewogICAgICAgICBjYXNlIENQREZfRm9ybUZpZWxkOjpDaGVja0JveDoKQEAgLTExMywxMyArMTEzLDEzIEBACiAgICAgICAgICAgICAgICAgaWYgKGlDb3VudCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoUERGX0Zvcm1GaWVsZF9Jc1VuaXNvbih0aGlzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tDb250cm9sKGksIEdldENvbnRyb2woaSktPklzRGVmYXVsdENoZWNrZWQoKSwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQ29udHJvbChpLCBHZXRDb250cm9sKGkpLT5Jc0RlZmF1bHRDaGVja2VkKCksIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRDb250cm9sKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoZWNrZWQgPSBwQ29udHJvbC0+SXNEZWZhdWx0Q2hlY2tlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQ29udHJvbChpLCBiQ2hlY2tlZCwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoZWNrZWQgPSBwQ29udHJvbC0+SXNEZWZhdWx0Q2hlY2tlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQ29udHJvbChpLCBiQ2hlY2tlZCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMTM4LDEwICsxMzgsMTAgQEAKICAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU2V0SXRlbVNlbGVjdGlvbihpSW5kZXgsIFRSVUUpOworICAgICAgICAgICAgICAgIFNldEl0ZW1TZWxlY3Rpb24oaUluZGV4LCB0cnVlKTsKICAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xNTcsMTAgKzE1NywxMCBAQAogICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBpbnQgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVNlbGVjdGlvbkNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU2V0SXRlbVNlbGVjdGlvbihpSW5kZXgsIFRSVUUpOworICAgICAgICAgICAgICAgIFNldEl0ZW1TZWxlY3Rpb24oaUluZGV4LCB0cnVlKTsKICAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJTZWxlY3Rpb25DaGFuZ2UodGhpcyk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTgyLDEyICsxODIsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBSViA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJSViIpOwogICAgICAgICAgICAgICAgIGlmICghcFJWICYmIChjc0RWYWx1ZSA9PSBjc1ZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGludCBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NEVmFsdWUpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAocERWID09IE5VTEwpIHsKQEAgLTE5Niw3ICsxOTYsNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwQ2xvbmUgPSBwRFYtPkNsb25lKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwQ2xvbmUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1fcERpY3QtPlNldEF0KCJWIiwgcENsb25lKTsKICAgICAgICAgICAgICAgICAgICAgaWYocFJWKSB7CkBAIC0yMDcsMTEgKzIwNywxMSBAQAogICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGludCBDUERGX0Zvcm1GaWVsZDo6R2V0Q29udHJvbEluZGV4KGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sKQogewpAQCAtMjk5LDcgKzI5OSw3IEBACiAgICAgfQogICAgIHJldHVybiBwT2JqLT5HZXRVbmljb2RlVGV4dCgpOwogfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldFZhbHVlKEZYX0JPT0wgYkRlZmF1bHQpCitDRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0VmFsdWUoYm9vbCBiRGVmYXVsdCkKIHsKICAgICBpZiAoR2V0VHlwZSgpID09IENoZWNrQm94IHx8IEdldFR5cGUoKSA9PSBSYWRpb0J1dHRvbikgewogICAgICAgICByZXR1cm4gR2V0Q2hlY2tWYWx1ZShiRGVmYXVsdCk7CkBAIC0zMzMsMTkgKzMzMywxOSBAQAogfQogQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldFZhbHVlKCkKIHsKLSAgICByZXR1cm4gR2V0VmFsdWUoRkFMU0UpOworICAgIHJldHVybiBHZXRWYWx1ZShmYWxzZSk7CiB9CiBDRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0RGVmYXVsdFZhbHVlKCkKIHsKLSAgICByZXR1cm4gR2V0VmFsdWUoVFJVRSk7CisgICAgcmV0dXJuIEdldFZhbHVlKHRydWUpOwogfQotRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6U2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBGWF9CT09MIGJEZWZhdWx0LCBGWF9CT09MIGJOb3RpZnkpCitib29sIENQREZfRm9ybUZpZWxkOjpTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsIGJvb2wgYkRlZmF1bHQsIGJvb2wgYk5vdGlmeSkKIHsKICAgICBzd2l0Y2ggKG1fVHlwZSkgewogICAgICAgICBjYXNlIENoZWNrQm94OgogICAgICAgICBjYXNlIFJhZGlvQnV0dG9uOiB7CiAgICAgICAgICAgICAgICAgU2V0Q2hlY2tWYWx1ZSh2YWx1ZSwgYkRlZmF1bHQsIGJOb3RpZnkpOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICBjYXNlIEZpbGU6CiAgICAgICAgIGNhc2UgUmljaFRleHQ6CkBAIC0zNTUsNyArMzU1LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW50IGlJbmRleCA9IEZpbmRPcHRpb25WYWx1ZShjc1ZhbHVlKTsKQEAgLTM3MSwzOSArMzcxLDM5IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChiRGVmYXVsdCkgewogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQ2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldEl0ZW1TZWxlY3Rpb24oaUluZGV4LCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldEl0ZW1TZWxlY3Rpb24oaUluZGV4LCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBMaXN0Qm94OiB7CiAgICAgICAgICAgICAgICAgaW50IGlJbmRleCA9IEZpbmRPcHRpb25WYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgaWYgKGlJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChiRGVmYXVsdCAmJiBpSW5kZXggPT0gR2V0RGVmYXVsdFNlbGVjdGVkSXRlbSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICBpbnQgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVNlbGVjdGlvbkNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGJEZWZhdWx0KSB7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQ2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgU2V0SXRlbVNlbGVjdGlvbihpSW5kZXgsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICBTZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclNlbGVjdGlvbkNoYW5nZSh0aGlzKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CkBAIC00MTIsMTEgKzQxMiwxMSBAQAogICAgIGlmIChDUERGX0ludGVyRm9ybTo6bV9iVXBkYXRlQVApIHsKICAgICAgICAgVXBkYXRlQVAoTlVMTCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6U2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBGWF9CT09MIGJOb3RpZnkpCitib29sIENQREZfRm9ybUZpZWxkOjpTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsIGJvb2wgYk5vdGlmeSkKIHsKLSAgICByZXR1cm4gU2V0VmFsdWUodmFsdWUsIEZBTFNFLCBiTm90aWZ5KTsKKyAgICByZXR1cm4gU2V0VmFsdWUodmFsdWUsIGZhbHNlLCBiTm90aWZ5KTsKIH0KIGludCBDUERGX0Zvcm1GaWVsZDo6R2V0TWF4TGVuKCkKIHsKQEAgLTUwNiw3ICs1MDYsNyBAQAogICAgIH0KICAgICByZXR1cm4gLTE7CiB9Ci1GWF9CT09MIENQREZfRm9ybUZpZWxkOjpDbGVhclNlbGVjdGlvbihGWF9CT09MIGJOb3RpZnkpCitib29sIENQREZfRm9ybUZpZWxkOjpDbGVhclNlbGVjdGlvbihib29sIGJOb3RpZnkpCiB7CiAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgIGludCBpUmV0ID0gMDsKQEAgLTUyMiw3ICs1MjIsNyBAQAogICAgICAgICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIG1fcERpY3QtPlJlbW92ZUF0KCJWIik7CkBAIC01MzgsNDMgKzUzOCw0MyBAQAogICAgIGlmIChDUERGX0ludGVyRm9ybTo6bV9iVXBkYXRlQVApIHsKICAgICAgICAgVXBkYXRlQVAoTlVMTCk7CiAgICAgfQotICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOwotICAgIHJldHVybiBUUlVFOworICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6SXNJdGVtU2VsZWN0ZWQoaW50IGluZGV4KQorYm9vbCBDUERGX0Zvcm1GaWVsZDo6SXNJdGVtU2VsZWN0ZWQoaW50IGluZGV4KQogewogICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ29tYm9Cb3ggfHwgR2V0VHlwZSgpID09IExpc3RCb3gpOwogICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQ291bnRPcHRpb25zKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChJc09wdGlvblNlbGVjdGVkKGluZGV4KSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIENGWF9XaWRlU3RyaW5nIG9wdF92YWx1ZSA9IEdldE9wdGlvblZhbHVlKGluZGV4KTsKICAgICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlYiKTsKICAgICBpZiAocFZhbHVlID09IE5VTEwpIHsKICAgICAgICAgcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkkiKTsKICAgICAgICAgaWYgKHBWYWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKICAgICAgICAgaWYgKHBWYWx1ZS0+R2V0VW5pY29kZVRleHQoKSA9PSBvcHRfdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChwVmFsdWUtPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7CiAgICAgICAgIGlmIChwVmFsdWUtPkdldFN0cmluZygpLklzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChwVmFsdWUtPkdldEludGVnZXIoKSA9PSBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBWYWx1ZTsKICAgICBpbnQgaVBvcyA9IC0xOwpAQCAtNTg2LDE1ICs1ODYsMTUgQEAKICAgICB9CiAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBcnJheS0+R2V0Q291bnQoKTsgaSArKykKICAgICAgICAgaWYgKHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpLT5HZXRVbmljb2RlVGV4dCgpID09IG9wdF92YWx1ZSAmJiAoaW50KWkgPT0gaVBvcykgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZfRm9ybUZpZWxkOjpTZXRJdGVtU2VsZWN0aW9uKGludCBpbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQsIEZYX0JPT0wgYk5vdGlmeSkKK2Jvb2wgQ1BERl9Gb3JtRmllbGQ6OlNldEl0ZW1TZWxlY3Rpb24oaW50IGluZGV4LCBib29sIGJTZWxlY3RlZCwgYm9vbCBiTm90aWZ5KQogewogICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ29tYm9Cb3ggfHwgR2V0VHlwZSgpID09IExpc3RCb3gpOwogICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQ291bnRPcHRpb25zKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9XaWRlU3RyaW5nIG9wdF92YWx1ZSA9IEdldE9wdGlvblZhbHVlKGluZGV4KTsKICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKQEAgLTYwNiwxNCArNjA2LDE0IEBACiAgICAgICAgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgb3B0X3ZhbHVlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoIWJTZWxlY3RlZCkgewogICAgICAgICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlYiKTsKICAgICAgICAgaWYgKHBWYWx1ZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICBpZiAobV9UeXBlID09IExpc3RCb3gpIHsKLSAgICAgICAgICAgICAgICBTZWxlY3RPcHRpb24oaW5kZXgsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICBTZWxlY3RPcHRpb24oaW5kZXgsIGZhbHNlKTsKICAgICAgICAgICAgICAgICBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUklORykgewogICAgICAgICAgICAgICAgICAgICBpZiAocFZhbHVlLT5HZXRVbmljb2RlVGV4dCgpID09IG9wdF92YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGljdC0+UmVtb3ZlQXQoIlYiKTsKQEAgLTYyMSw3ICs2MjEsNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CiAgICAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpbnQgaUNvdW50ID0gQ291bnRPcHRpb25zKCk7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7CkBAIC02NDUsMjEgKzY0NSwyMSBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKG1fVHlwZSA9PSBMaXN0Qm94KSB7Ci0gICAgICAgICAgICBTZWxlY3RPcHRpb24oaW5kZXgsIFRSVUUpOworICAgICAgICAgICAgU2VsZWN0T3B0aW9uKGluZGV4LCB0cnVlKTsKICAgICAgICAgICAgIGlmICghKG1fRmxhZ3MgJiBGT1JNTElTVF9NVUxUSVNFTEVDVCkpIHsKICAgICAgICAgICAgICAgICBtX3BEaWN0LT5TZXRBdFN0cmluZygiViIsIFBERl9FbmNvZGVUZXh0KG9wdF92YWx1ZSkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBDUERGX0FycmF5OjpDcmVhdGUoKTsKICAgICAgICAgICAgICAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbGVjdGVkOworICAgICAgICAgICAgICAgIGJvb2wgYlNlbGVjdGVkOwogICAgICAgICAgICAgICAgIGludCBpQ291bnQgPSBDb3VudE9wdGlvbnMoKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewogICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSBpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYlNlbGVjdGVkID0gSXNJdGVtU2VsZWN0ZWQoaSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiU2VsZWN0ZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYlNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoYlNlbGVjdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfdmFsdWUgPSBHZXRPcHRpb25WYWx1ZShpKTsKQEAgLTY3Miw3ICs2NzIsNyBAQAogICAgICAgICAgICAgbV9wRGljdC0+U2V0QXRTdHJpbmcoIlYiLCBQREZfRW5jb2RlVGV4dChvcHRfdmFsdWUpKTsKICAgICAgICAgICAgIENQREZfQXJyYXkqIHBJID0gQ1BERl9BcnJheTo6Q3JlYXRlKCk7CiAgICAgICAgICAgICBpZiAocEkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwSS0+QWRkSW50ZWdlcihpbmRleCk7CiAgICAgICAgICAgICBtX3BEaWN0LT5TZXRBdCgiSSIsIHBJKTsKQEAgLTY4OSwxOCArNjg5LDE4IEBACiAgICAgaWYgKENQREZfSW50ZXJGb3JtOjptX2JVcGRhdGVBUCkgewogICAgICAgICBVcGRhdGVBUChOVUxMKTsKICAgICB9Ci0gICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfRm9ybUZpZWxkOjpJc0l0ZW1EZWZhdWx0U2VsZWN0ZWQoaW50IGluZGV4KQorYm9vbCBDUERGX0Zvcm1GaWVsZDo6SXNJdGVtRGVmYXVsdFNlbGVjdGVkKGludCBpbmRleCkKIHsKICAgICBBU1NFUlQoR2V0VHlwZSgpID09IENvbWJvQm94IHx8IEdldFR5cGUoKSA9PSBMaXN0Qm94KTsKICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IENvdW50T3B0aW9ucygpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbnQgaURWSW5kZXggPSBHZXREZWZhdWx0U2VsZWN0ZWRJdGVtKCk7CiAgICAgaWYgKGlEVkluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIChpRFZJbmRleCA9PSBpbmRleCk7CiB9CkBAIC03OTgsMTUgKzc5OCwxNSBAQAogICAgIH0KICAgICByZXR1cm4gLTE7CiB9Ci1GWF9CT09MIENQREZfRm9ybUZpZWxkOjpDaGVja0NvbnRyb2woaW50IGlDb250cm9sSW5kZXgsIEZYX0JPT0wgYkNoZWNrZWQsIEZYX0JPT0wgYk5vdGlmeSkKK2Jvb2wgQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQ29udHJvbChpbnQgaUNvbnRyb2xJbmRleCwgYm9vbCBiQ2hlY2tlZCwgYm9vbCBiTm90aWZ5KQogewogICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IFJhZGlvQnV0dG9uKTsKICAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldENvbnRyb2woaUNvbnRyb2xJbmRleCk7CiAgICAgaWYgKHBDb250cm9sID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghYkNoZWNrZWQgJiYgcENvbnRyb2wtPklzQ2hlY2tlZCgpID09IGJDaGVja2VkKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRlhfQnl0ZUFycmF5IHN0YXR1c0FycmF5OwogICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewpAQCAtODE1LDcgKzgxNSw3IEBACiAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NXRXhwb3J0ID0gcENvbnRyb2wtPkdldEV4cG9ydFZhbHVlKCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCRXhwb3J0ID0gUERGX0VuY29kZVRleHQoY3NXRXhwb3J0KTsKICAgICBpbnQgaUNvdW50ID0gQ291bnRDb250cm9scygpOwotICAgIEZYX0JPT0wgYlVuaXNvbiA9IFBERl9Gb3JtRmllbGRfSXNVbmlzb24odGhpcyk7CisgICAgYm9vbCBiVW5pc29uID0gUERGX0Zvcm1GaWVsZF9Jc1VuaXNvbih0aGlzKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewogICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwQ3RybCA9IEdldENvbnRyb2woaSk7CiAgICAgICAgIGlmIChiVW5pc29uKSB7CkBAIC04MjQsMTYgKzgyNCwxNiBAQAogICAgICAgICAgICAgICAgIGlmIChwQ3RybC0+R2V0T25TdGF0ZU5hbWUoKSA9PSBwQ29udHJvbC0+R2V0T25TdGF0ZU5hbWUoKSkgewogICAgICAgICAgICAgICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKGJDaGVja2VkKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJDaGVja2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDdHJsLT5DaGVja0NvbnRyb2woRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKGZhbHNlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGJDaGVja2VkKSB7Ci0gICAgICAgICAgICAgICAgcEN0cmwtPkNoZWNrQ29udHJvbChGQUxTRSk7CisgICAgICAgICAgICAgICAgcEN0cmwtPkNoZWNrQ29udHJvbChmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoaSA9PSBpQ29udHJvbEluZGV4KSB7CiAgICAgICAgICAgICAgICAgcEN0cmwtPkNoZWNrQ29udHJvbChiQ2hlY2tlZCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGJDaGVja2VkKSB7Ci0gICAgICAgICAgICAgICAgcEN0cmwtPkNoZWNrQ29udHJvbChGQUxTRSk7CisgICAgICAgICAgICAgICAgcEN0cmwtPkNoZWNrQ29udHJvbChmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC04NTksMTQgKzg1OSwxNCBAQAogICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlckNoZWNrZWRTdGF0dXNDaGFuZ2UodGhpcywgc3RhdHVzQXJyYXkpOwogICAgIH0KLSAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUNGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRDaGVja1ZhbHVlKEZYX0JPT0wgYkRlZmF1bHQpCitDRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0Q2hlY2tWYWx1ZShib29sIGJEZWZhdWx0KQogewogICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IFJhZGlvQnV0dG9uKTsKICAgICBDRlhfV2lkZVN0cmluZyBjc0V4cG9ydCA9IEwiT2ZmIjsKLSAgICBGWF9CT09MIGJDaGVja2VkOworICAgIGJvb2wgYkNoZWNrZWQ7CiAgICAgaW50IGlDb3VudCA9IENvdW50Q29udHJvbHMoKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewogICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldENvbnRyb2woaSk7CkBAIC04ODIsNyArODgyLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIGNzRXhwb3J0OwogfQotRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6U2V0Q2hlY2tWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsIEZYX0JPT0wgYkRlZmF1bHQsIEZYX0JPT0wgYk5vdGlmeSkKK2Jvb2wgQ1BERl9Gb3JtRmllbGQ6OlNldENoZWNrVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBib29sIGJEZWZhdWx0LCBib29sIGJOb3RpZnkpCiB7CiAgICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDaGVja0JveCB8fCBHZXRUeXBlKCkgPT0gUmFkaW9CdXR0b24pOwogICAgIENGWF9CeXRlQXJyYXkgc3RhdHVzQXJyYXk7CkBAIC04OTYsMjEgKzg5NiwyMSBAQAogICAgICAgICBpZiAoY3NFeHBvcnQgPT0gdmFsdWUpIHsKICAgICAgICAgICAgIGlmIChiRGVmYXVsdCkgewogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDaGVja0NvbnRyb2woR2V0Q29udHJvbEluZGV4KHBDb250cm9sKSwgVFJVRSk7CisgICAgICAgICAgICAgICAgQ2hlY2tDb250cm9sKEdldENvbnRyb2xJbmRleChwQ29udHJvbCksIHRydWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoYkRlZmF1bHQpIHsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ2hlY2tDb250cm9sKEdldENvbnRyb2xJbmRleChwQ29udHJvbCksIEZBTFNFKTsKKyAgICAgICAgICAgICAgICBDaGVja0NvbnRyb2woR2V0Q29udHJvbEluZGV4KHBDb250cm9sKSwgZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlckNoZWNrZWRTdGF0dXNDaGFuZ2UodGhpcywgc3RhdHVzQXJyYXkpOwogICAgIH0KLSAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGludCBDUERGX0Zvcm1GaWVsZDo6R2V0VG9wVmlzaWJsZUluZGV4KCkKIHsKQEAgLTk0OCw0MyArOTQ4LDQzIEBACiAgICAgfQogICAgIHJldHVybiAtMTsKIH0KLUZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OklzT3B0aW9uU2VsZWN0ZWQoaW50IGlPcHRJbmRleCkKK2Jvb2wgQ1BERl9Gb3JtRmllbGQ6OklzT3B0aW9uU2VsZWN0ZWQoaW50IGlPcHRJbmRleCkKIHsKICAgICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJJIik7CiAgICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gcE9iai0+R2V0QXJyYXkoKTsKICAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGludCBpQ291bnQgPSAoaW50KXBBcnJheS0+R2V0Q291bnQoKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewogICAgICAgICBpZiAocEFycmF5LT5HZXRJbnRlZ2VyKGkpID09IGlPcHRJbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6U2VsZWN0T3B0aW9uKGludCBpT3B0SW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkLCBGWF9CT09MIGJOb3RpZnkpCitib29sIENQREZfRm9ybUZpZWxkOjpTZWxlY3RPcHRpb24oaW50IGlPcHRJbmRleCwgYm9vbCBiU2VsZWN0ZWQsIGJvb2wgYk5vdGlmeSkKIHsKICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBtX3BEaWN0LT5HZXRBcnJheSgiSSIpOwogICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewogICAgICAgICBpZiAoIWJTZWxlY3RlZCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBwQXJyYXkgPSBDUERGX0FycmF5OjpDcmVhdGUoKTsKICAgICAgICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbV9wRGljdC0+U2V0QXQoIkkiLCBwQXJyYXkpOwogICAgIH0KLSAgICBGWF9CT09MIGJSZXR1cm4gPSBGQUxTRTsKKyAgICBib29sIGJSZXR1cm4gPSBmYWxzZTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpcEFycmF5LT5HZXRDb3VudCgpOyBpICsrKSB7CiAgICAgICAgIGludCBpRmluZCA9IHBBcnJheS0+R2V0SW50ZWdlcihpKTsKICAgICAgICAgaWYgKGlGaW5kID09IGlPcHRJbmRleCkgewogICAgICAgICAgICAgaWYgKGJTZWxlY3RlZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaW50IGlSZXQgPSAwOwpAQCAtOTk2LDExICs5OTYsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcEFycmF5LT5SZW1vdmVBdChpKTsKLSAgICAgICAgICAgIGJSZXR1cm4gPSBUUlVFOworICAgICAgICAgICAgYlJldHVybiA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfSBlbHNlIGlmIChpRmluZCA+IGlPcHRJbmRleCkgewogICAgICAgICAgICAgaWYgKCFiU2VsZWN0ZWQpIHsKQEAgLTEwMTYsMTUgKzEwMTYsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgQ1BERl9OdW1iZXIqIHBOdW0gPSBDUERGX051bWJlcjo6Q3JlYXRlKGlPcHRJbmRleCk7CiAgICAgICAgICAgICBpZiAocE51bSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBBcnJheS0+SW5zZXJ0QXQoaSwgcE51bSk7Ci0gICAgICAgICAgICBiUmV0dXJuID0gVFJVRTsKKyAgICAgICAgICAgIGJSZXR1cm4gPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDQ0LDEwICsxMDQ0LDEwIEBACiAgICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOwogICAgICAgICB9CiAgICAgfQotICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOwotICAgIHJldHVybiBUUlVFOworICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6Q2xlYXJTZWxlY3RlZE9wdGlvbnMoRlhfQk9PTCBiTm90aWZ5KQorYm9vbCBDUERGX0Zvcm1GaWVsZDo6Q2xlYXJTZWxlY3RlZE9wdGlvbnMoYm9vbCBiTm90aWZ5KQogewogICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICBpbnQgaVJldCA9IDA7CkBAIC0xMDYzLDcgKzEwNjMsNyBAQAogICAgICAgICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIG1fcERpY3QtPlJlbW92ZUF0KCJJIik7CkBAIC0xMDc1LDggKzEwNzUsOCBAQAogICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKICAgICAgICAgfQogICAgIH0KLSAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ1BERl9Gb3JtRmllbGQ6OkxvYWREQSgpCiB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19tZXRhZGF0YS5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19tZXRhZGF0YS5jcHAKaW5kZXggYWVlYjFkMS4uMzNlMWUyMyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfbWV0YWRhdGEuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX21ldGFkYXRhLmNwcApAQCAtNTgsNyArNTgsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIENQREZfU3RyZWFtQWNjIGFjYzsKLSAgICBhY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UpOworICAgIGFjYy5Mb2FkQWxsRGF0YShwU3RyZWFtLCBmYWxzZSk7CiAgICAgaW50IHNpemUgPSBhY2MuR2V0U2l6ZSgpOwogICAgIGNvbnN0IHVpbnQ4X3QqIHBCdWYgPSBhY2MuR2V0RGF0YSgpOwogICAgIENYTUxfRWxlbWVudCAqJnBYbWxFbG1udCA9ICgoUERGRE9DX0xQTUVUQURBVEEpbV9wRGF0YSktPm1fcFhtbEVsbW50OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2Nfb2NnLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX29jZy5jcHAKaW5kZXggZDUyNTIyNy4uNmU4ODMwOSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2Nfb2NnLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19vY2cuY3BwCkBAIC0yNSw3ICsyNSw3IEBACiAgICAgfQogICAgIHJldHVybiAtMTsKIH0KLXN0YXRpYyBGWF9CT09MIEZQREZET0NfT0NHX0hhc0ludGVudChjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBEaWN0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRWxlbWVudCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0RlZiA9IEZYX0JTVFJDKCIiKSkKK3N0YXRpYyBib29sIEZQREZET0NfT0NHX0hhc0ludGVudChjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBEaWN0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRWxlbWVudCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0RlZiA9IEZYX0JTVFJDKCIiKSkKIHsKICAgICBGWFNZU19hc3NlcnQocERpY3QgIT0gTlVMTCk7CiAgICAgQ1BERl9PYmplY3QgKnBJbnRlbnQgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJJbnRlbnQiKSk7CkBAIC0zOCwxMCArMzgsMTAgQEAKICAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGR3Q291bnQ7IGkrKykgewogICAgICAgICAgICAgYnNJbnRlbnQgPSAoKENQREZfQXJyYXkqKXBJbnRlbnQpLT5HZXRTdHJpbmcoaSk7CiAgICAgICAgICAgICBpZiAoYnNJbnRlbnQgPT0gRlhfQlNUUkMoIkFsbCIpIHx8IGJzSW50ZW50ID09IGNzRWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBic0ludGVudCA9IHBJbnRlbnQtPkdldFN0cmluZygpOwogICAgIHJldHVybiBic0ludGVudCA9PSBGWF9CU1RSQygiQWxsIikgfHwgYnNJbnRlbnQgPT0gY3NFbGVtZW50OwpAQCAtMTAxLDI0ICsxMDEsMjQgQEAKIHsKICAgICBtX09DR1N0YXRlcy5jbGVhcigpOwogfQotRlhfQk9PTCBDUERGX09DQ29udGV4dDo6TG9hZE9DR1N0YXRlRnJvbUNvbmZpZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzQ29uZmlnLCBjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ0dEaWN0LCBGWF9CT09MICZiVmFsaWRDb25maWcpIGNvbnN0Citib29sIENQREZfT0NDb250ZXh0OjpMb2FkT0NHU3RhdGVGcm9tQ29uZmlnKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NDb25maWcsIGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QsIGJvb2wgJmJWYWxpZENvbmZpZykgY29uc3QKIHsKICAgICBDUERGX0RpY3Rpb25hcnkgKnBDb25maWcgPSBGUERGRE9DX09DR19HZXRDb25maWcobV9wRG9jdW1lbnQsIHBPQ0dEaWN0LCBjc0NvbmZpZyk7CiAgICAgaWYgKCFwQ29uZmlnKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgYlZhbGlkQ29uZmlnID0gVFJVRTsKLSAgICBGWF9CT09MIGJTdGF0ZSA9IHBDb25maWctPkdldFN0cmluZyhGWF9CU1RSQygiQmFzZVN0YXRlIiksIEZYX0JTVFJDKCJPTiIpKSAhPSBGWF9CU1RSQygiT0ZGIik7CisgICAgYlZhbGlkQ29uZmlnID0gdHJ1ZTsKKyAgICBib29sIGJTdGF0ZSA9IHBDb25maWctPkdldFN0cmluZyhGWF9CU1RSQygiQmFzZVN0YXRlIiksIEZYX0JTVFJDKCJPTiIpKSAhPSBGWF9CU1RSQygiT0ZGIik7CiAgICAgQ1BERl9BcnJheSAqcEFycmF5ID0gcENvbmZpZy0+R2V0QXJyYXkoRlhfQlNUUkMoIk9OIikpOwogICAgIGlmIChwQXJyYXkpIHsKICAgICAgICAgaWYgKEZQREZET0NfT0NHX0ZpbmRHcm91cChwQXJyYXksIHBPQ0dEaWN0KSA+PSAwKSB7Ci0gICAgICAgICAgICBiU3RhdGUgPSBUUlVFOworICAgICAgICAgICAgYlN0YXRlID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICBwQXJyYXkgPSBwQ29uZmlnLT5HZXRBcnJheShGWF9CU1RSQygiT0ZGIikpOwogICAgIGlmIChwQXJyYXkpIHsKICAgICAgICAgaWYgKEZQREZET0NfT0NHX0ZpbmRHcm91cChwQXJyYXksIHBPQ0dEaWN0KSA+PSAwKSB7Ci0gICAgICAgICAgICBiU3RhdGUgPSBGQUxTRTsKKyAgICAgICAgICAgIGJTdGF0ZSA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIHBBcnJheSA9IHBDb25maWctPkdldEFycmF5KEZYX0JTVFJDKCJBUyIpKTsKQEAgLTE0OSwxMCArMTQ5LDEwIEBACiAgICAgfQogICAgIHJldHVybiBiU3RhdGU7CiB9Ci1GWF9CT09MIENQREZfT0NDb250ZXh0OjpMb2FkT0NHU3RhdGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCkgY29uc3QKK2Jvb2wgQ1BERl9PQ0NvbnRleHQ6OkxvYWRPQ0dTdGF0ZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ0dEaWN0KSBjb25zdAogewogICAgIGlmICghRlBERkRPQ19PQ0dfSGFzSW50ZW50KHBPQ0dEaWN0LCBGWF9CU1RSQygiVmlldyIpLCBGWF9CU1RSQygiVmlldyIpKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIGNzU3RhdGUgPSBGUERGRE9DX09DR19HZXRVc2FnZVR5cGVTdHJpbmcobV9lVXNhZ2VUeXBlKTsKICAgICBDUERGX0RpY3Rpb25hcnkgKnBVc2FnZSA9IHBPQ0dEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJVc2FnZSIpKTsKQEAgLTE3MSwzMSArMTcxLDMxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgRlhfQk9PTCBiRGVmVmFsaWQgPSBGQUxTRTsKKyAgICBib29sIGJEZWZWYWxpZCA9IGZhbHNlOwogICAgIHJldHVybiBMb2FkT0NHU3RhdGVGcm9tQ29uZmlnKGNzU3RhdGUsIHBPQ0dEaWN0LCBiRGVmVmFsaWQpOwogfQogCi1GWF9CT09MIENQREZfT0NDb250ZXh0OjpHZXRPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcE9DR0RpY3QpCitib29sIENQREZfT0NDb250ZXh0OjpHZXRPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcE9DR0RpY3QpCiB7CiAgICAgaWYgKCFwT0NHRGljdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBjb25zdCBhdXRvIGl0ID0gbV9PQ0dTdGF0ZXMuZmluZChwT0NHRGljdCk7CiAgICAgaWYgKGl0ICE9IG1fT0NHU3RhdGVzLmVuZCgpKQogICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKIAotICAgIEZYX0JPT0wgYlN0YXRlID0gTG9hZE9DR1N0YXRlKHBPQ0dEaWN0KTsKKyAgICBib29sIGJTdGF0ZSA9IExvYWRPQ0dTdGF0ZShwT0NHRGljdCk7CiAgICAgbV9PQ0dTdGF0ZXNbcE9DR0RpY3RdID0gYlN0YXRlOwogICAgIHJldHVybiBiU3RhdGU7CiB9CiAKLUZYX0JPT0wgQ1BERl9PQ0NvbnRleHQ6OkdldE9DR1ZFKENQREZfQXJyYXkgKnBFeHByZXNzaW9uLCBGWF9CT09MIGJGcm9tQ29uZmlnLCBpbnQgbkxldmVsKQorYm9vbCBDUERGX09DQ29udGV4dDo6R2V0T0NHVkUoQ1BERl9BcnJheSAqcEV4cHJlc3Npb24sIGJvb2wgYkZyb21Db25maWcsIGludCBuTGV2ZWwpCiB7CiAgICAgaWYgKG5MZXZlbCA+IDMyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAocEV4cHJlc3Npb24gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50MzJfdCBpQ291bnQgPSBwRXhwcmVzc2lvbi0+R2V0Q291bnQoKTsKICAgICBDUERGX09iamVjdCAqcE9DR09iajsKQEAgLTIwMyw3ICsyMDMsNyBAQAogICAgIGlmIChjc09wZXJhdG9yID09IEZYX0JTVFJDKCJOb3QiKSkgewogICAgICAgICBwT0NHT2JqID0gcEV4cHJlc3Npb24tPkdldEVsZW1lbnRWYWx1ZSgxKTsKICAgICAgICAgaWYgKHBPQ0dPYmogPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChwT0NHT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKICAgICAgICAgICAgIHJldHVybiAhKGJGcm9tQ29uZmlnID8gTG9hZE9DR1N0YXRlKChDUERGX0RpY3Rpb25hcnkqKXBPQ0dPYmopIDogR2V0T0NHVmlzaWJsZSgoQ1BERl9EaWN0aW9uYXJ5KilwT0NHT2JqKSk7CkBAIC0yMTEsMTYgKzIxMSwxNiBAQAogICAgICAgICBpZiAocE9DR09iai0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewogICAgICAgICAgICAgcmV0dXJuICFHZXRPQ0dWRSgoQ1BERl9BcnJheSopcE9DR09iaiwgYkZyb21Db25maWcsIG5MZXZlbCArIDEpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoY3NPcGVyYXRvciA9PSBGWF9CU1RSQygiT3IiKSB8fCBjc09wZXJhdG9yID09IEZYX0JTVFJDKCJBbmQiKSkgewotICAgICAgICBGWF9CT09MIGJWYWx1ZSA9IEZBTFNFOworICAgICAgICBib29sIGJWYWx1ZSA9IGZhbHNlOwogICAgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBpQ291bnQ7IGkgKyspIHsKICAgICAgICAgICAgIHBPQ0dPYmogPSBwRXhwcmVzc2lvbi0+R2V0RWxlbWVudFZhbHVlKDEpOwogICAgICAgICAgICAgaWYgKHBPQ0dPYmogPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfQk9PTCBiSXRlbSA9IEZBTFNFOworICAgICAgICAgICAgYm9vbCBiSXRlbSA9IGZhbHNlOwogICAgICAgICAgICAgaWYgKHBPQ0dPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewogICAgICAgICAgICAgICAgIGJJdGVtID0gYkZyb21Db25maWcgPyBMb2FkT0NHU3RhdGUoKENQREZfRGljdGlvbmFyeSopcE9DR09iaikgOiBHZXRPQ0dWaXNpYmxlKChDUERGX0RpY3Rpb25hcnkqKXBPQ0dPYmopOwogICAgICAgICAgICAgfSBlbHNlIGlmIChwT0NHT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CkBAIC0yMzgsOSArMjM4LDkgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYlZhbHVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX09DQ29udGV4dDo6TG9hZE9DTURTdGF0ZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ01ERGljdCwgRlhfQk9PTCBiRnJvbUNvbmZpZykKK2Jvb2wgQ1BERl9PQ0NvbnRleHQ6OkxvYWRPQ01EU3RhdGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NNRERpY3QsIGJvb2wgYkZyb21Db25maWcpCiB7CiAgICAgRlhTWVNfYXNzZXJ0KHBPQ01ERGljdCAhPSBOVUxMKTsKICAgICBDUERGX0FycmF5ICpwVkUgPSBwT0NNRERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJWRSIpKTsKQEAgLTI1MCw1MCArMjUwLDUwIEBACiAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NQID0gcE9DTUREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlAiKSwgRlhfQlNUUkMoIkFueU9uIikpOwogICAgIENQREZfT2JqZWN0ICpwT0NHT2JqID0gcE9DTUREaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIk9DR3MiKSk7CiAgICAgaWYgKHBPQ0dPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChwT0NHT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKICAgICAgICAgcmV0dXJuIGJGcm9tQ29uZmlnID8gTG9hZE9DR1N0YXRlKChDUERGX0RpY3Rpb25hcnkqKXBPQ0dPYmopIDogR2V0T0NHVmlzaWJsZSgoQ1BERl9EaWN0aW9uYXJ5KilwT0NHT2JqKTsKICAgICB9CiAgICAgaWYgKHBPQ0dPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICBGWF9CT09MIGJTdGF0ZSA9IEZBTFNFOworICAgIGJvb2wgYlN0YXRlID0gZmFsc2U7CiAgICAgaWYgKGNzUCA9PSBGWF9CU1RSQygiQWxsT24iKSB8fCBjc1AgPT0gRlhfQlNUUkMoIkFsbE9mZiIpKSB7Ci0gICAgICAgIGJTdGF0ZSA9IFRSVUU7CisgICAgICAgIGJTdGF0ZSA9IHRydWU7CiAgICAgfQogICAgIGludDMyX3QgaUNvdW50ID0gKChDUERGX0FycmF5KilwT0NHT2JqKS0+R2V0Q291bnQoKTsKICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKLSAgICAgICAgRlhfQk9PTCBiSXRlbSA9IFRSVUU7CisgICAgICAgIGJvb2wgYkl0ZW0gPSB0cnVlOwogICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBJdGVtRGljdCA9ICgoQ1BERl9BcnJheSopcE9DR09iaiktPkdldERpY3QoaSk7CiAgICAgICAgIGlmIChwSXRlbURpY3QpIHsKICAgICAgICAgICAgIGJJdGVtID0gYkZyb21Db25maWcgPyBMb2FkT0NHU3RhdGUocEl0ZW1EaWN0KSA6IEdldE9DR1Zpc2libGUocEl0ZW1EaWN0KTsKICAgICAgICAgfQogICAgICAgICBpZiAoY3NQID09IEZYX0JTVFJDKCJBbnlPbiIpICYmIGJJdGVtKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChjc1AgPT0gRlhfQlNUUkMoIkFueU9mZiIpICYmICFiSXRlbSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoY3NQID09IEZYX0JTVFJDKCJBbGxPbiIpICYmICFiSXRlbSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChjc1AgPT0gRlhfQlNUUkMoIkFsbE9mZiIpICYmIGJJdGVtKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGJTdGF0ZTsKIH0KLUZYX0JPT0wgQ1BERl9PQ0NvbnRleHQ6OkNoZWNrT0NHVmlzaWJsZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ0dEaWN0KQorYm9vbCBDUERGX09DQ29udGV4dDo6Q2hlY2tPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QpCiB7CiAgICAgaWYgKCFwT0NHRGljdCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIGNzVHlwZSA9IHBPQ0dEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlR5cGUiKSwgRlhfQlNUUkMoIk9DRyIpKTsKICAgICBpZiAoY3NUeXBlID09IEZYX0JTVFJDKCJPQ0ciKSkgewogICAgICAgICByZXR1cm4gR2V0T0NHVmlzaWJsZShwT0NHRGljdCk7CiAgICAgfQotICAgIHJldHVybiBMb2FkT0NNRFN0YXRlKHBPQ0dEaWN0LCBGQUxTRSk7CisgICAgcmV0dXJuIExvYWRPQ01EU3RhdGUocE9DR0RpY3QsIGZhbHNlKTsKIH0KIHZvaWQgQ1BERl9PQ0NvbnRleHQ6OlJlc2V0T0NDb250ZXh0KCkKIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3RhZ2dlZC5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY190YWdnZWQuY3BwCmluZGV4IGU5ZjBjNTUuLjNlNDRiMWEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3RhZ2dlZC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfdGFnZ2VkLmNwcApAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZkb2MvZnBkZl90YWdnZWQuaCIKICNpbmNsdWRlICJ0YWdnZWRfaW50LmgiCiBjb25zdCBpbnQgbk1heFJlY3Vyc2lvbiA9IDMyOwotc3RhdGljIEZYX0JPT0wgSXNUYWdnZWQoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYykKK3N0YXRpYyBib29sIElzVGFnZ2VkKGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2MpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ2F0YWxvZyA9IHBEb2MtPkdldFJvb3QoKTsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBNYXJrSW5mbyA9IHBDYXRhbG9nLT5HZXREaWN0KEZYX0JTVFJDKCJNYXJrSW5mbyIpKTsKQEAgLTEzOCw3ICsxMzgsNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcFBhcmVudEVsZW1lbnQgPSBBZGRQYWdlTm9kZShwUGFyZW50LCBtYXAsIG5MZXZlbCArIDEpOwotICAgICAgICBGWF9CT09MIGJTYXZlID0gRkFMU0U7CisgICAgICAgIGJvb2wgYlNhdmUgPSBmYWxzZTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwUGFyZW50RWxlbWVudC0+bV9LaWRzLkdldFNpemUoKTsgaSArKykgewogICAgICAgICAgICAgaWYgKHBQYXJlbnRFbGVtZW50LT5tX0tpZHNbaV0ubV9UeXBlICE9IENQREZfU3RydWN0S2lkOjpFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0xNDcsNyArMTQ3LDcgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBQYXJlbnRFbGVtZW50LT5tX0tpZHNbaV0ubV9FbGVtZW50Lm1fcEVsZW1lbnQgPSBwRWxlbWVudC0+UmV0YWluKCk7Ci0gICAgICAgICAgICBiU2F2ZSA9IFRSVUU7CisgICAgICAgICAgICBiU2F2ZSA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFiU2F2ZSkgewogICAgICAgICAgICAgcEVsZW1lbnQtPlJlbGVhc2UoKTsKQEAgLTE1NiwxMSArMTU2LDExIEBACiAgICAgfQogICAgIHJldHVybiBwRWxlbWVudDsKIH0KLUZYX0JPT0wgQ1BERl9TdHJ1Y3RUcmVlSW1wbDo6QWRkVG9wTGV2ZWxOb2RlKENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfU3RydWN0RWxlbWVudEltcGwqIHBFbGVtZW50KQorYm9vbCBDUERGX1N0cnVjdFRyZWVJbXBsOjpBZGRUb3BMZXZlbE5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcEVsZW1lbnQpCiB7CiAgICAgQ1BERl9PYmplY3QgKnBPYmogPSBtX3BUcmVlUm9vdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJLIikpOwogICAgIGlmICghcE9iaikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewogICAgICAgICBpZiAocE9iai0+R2V0T2JqTnVtKCkgPT0gcERpY3QtPkdldE9iak51bSgpKSB7CkBAIC0xNjksMTMgKzE2OSwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbV9LaWRzWzBdID0gcEVsZW1lbnQtPlJldGFpbigpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CiAgICAgICAgIENQREZfQXJyYXkqIHBUb3BLaWRzID0gKENQREZfQXJyYXkqKXBPYmo7CiAgICAgICAgIEZYX0RXT1JEIGk7Ci0gICAgICAgIEZYX0JPT0wgYlNhdmUgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiU2F2ZSA9IGZhbHNlOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFRvcEtpZHMtPkdldENvdW50KCk7IGkgKyspIHsKICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwS2lkUmVmID0gcFRvcEtpZHMtPkdldEVsZW1lbnQoaSk7CiAgICAgICAgICAgICBpZiAocEtpZFJlZiA9PSBOVUxMIHx8IHBLaWRSZWYtPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKSB7CkBAIC0xODgsMTMgKzE4OCwxMyBAQAogICAgICAgICAgICAgICAgIG1fS2lkc1tpXS0+UmVsZWFzZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbV9LaWRzW2ldID0gcEVsZW1lbnQtPlJldGFpbigpOwotICAgICAgICAgICAgYlNhdmUgPSBUUlVFOworICAgICAgICAgICAgYlNhdmUgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmICghYlNhdmUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIENQREZfU3RydWN0RWxlbWVudEltcGw6OkNQREZfU3RydWN0RWxlbWVudEltcGwoQ1BERl9TdHJ1Y3RUcmVlSW1wbCogcFRyZWUsIENQREZfU3RydWN0RWxlbWVudEltcGwqIHBQYXJlbnQsIENQREZfRGljdGlvbmFyeSogcERpY3QpCiAgICAgOiBtX1JlZkNvdW50KDApCkBAIC0zNDAsMjAgKzM0MCwyMCBAQAogICAgIH0KICAgICByZXR1cm4gTlVMTDsKIH0KLUNQREZfT2JqZWN0KiBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXRBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUsIEZYX0ZMT0FUIGZMZXZlbCkKK0NQREZfT2JqZWN0KiBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXRBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgYm9vbCBiSW5oZXJpdGFibGUsIEZYX0ZMT0FUIGZMZXZlbCkKIHsKICAgICBpZiAoZkxldmVsID4gbk1heFJlY3Vyc2lvbikgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKGJJbmhlcml0YWJsZSkgewotICAgICAgICBDUERGX09iamVjdCogcEF0dHIgPSBHZXRBdHRyKG93bmVyLCBuYW1lLCBGQUxTRSk7CisgICAgICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIGZhbHNlKTsKICAgICAgICAgaWYgKHBBdHRyKSB7CiAgICAgICAgICAgICByZXR1cm4gcEF0dHI7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fcFBhcmVudCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbV9wUGFyZW50LT5HZXRBdHRyKG93bmVyLCBuYW1lLCBUUlVFLCBmTGV2ZWwgKyAxKTsKKyAgICAgICAgcmV0dXJuIG1fcFBhcmVudC0+R2V0QXR0cihvd25lciwgbmFtZSwgdHJ1ZSwgZkxldmVsICsgMSk7CiAgICAgfQogICAgIENQREZfT2JqZWN0KiBwQSA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQSIpKTsKICAgICBpZiAocEEpIHsKQEAgLTM5MSw3ICszOTEsNyBAQAogICAgIH0KICAgICByZXR1cm4gTlVMTDsKIH0KLUNQREZfT2JqZWN0KiBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXRBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUsIGludCBzdWJpbmRleCkKK0NQREZfT2JqZWN0KiBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXRBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgYm9vbCBiSW5oZXJpdGFibGUsIGludCBzdWJpbmRleCkKIHsKICAgICBDUERGX09iamVjdCogcEF0dHIgPSBHZXRBdHRyKG93bmVyLCBuYW1lLCBiSW5oZXJpdGFibGUpOwogICAgIGlmIChwQXR0ciA9PSBOVUxMIHx8IHN1YmluZGV4ID09IC0xIHx8IHBBdHRyLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7CkBAIC00MDMsNyArNDAzLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKHN1YmluZGV4KTsKIH0KLUNGWF9CeXRlU3RyaW5nIENQREZfU3RydWN0RWxlbWVudEltcGw6OkdldE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlLCBpbnQgc3ViaW5kZXgpCitDRlhfQnl0ZVN0cmluZyBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBkZWZhdWx0X3ZhbHVlLCBib29sIGJJbmhlcml0YWJsZSwgaW50IHN1YmluZGV4KQogewogICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIGJJbmhlcml0YWJsZSwgc3ViaW5kZXgpOwogICAgIGlmIChwQXR0ciA9PSBOVUxMIHx8IHBBdHRyLT5HZXRUeXBlKCkgIT0gUERGT0JKX05BTUUpIHsKQEAgLTQxMSw3ICs0MTEsNyBAQAogICAgIH0KICAgICByZXR1cm4gcEF0dHItPkdldFN0cmluZygpOwogfQotRlhfQVJHQglDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXRDb2xvcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0FSR0IgZGVmYXVsdF92YWx1ZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUsIGludCBzdWJpbmRleCkKK0ZYX0FSR0IJQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6R2V0Q29sb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9BUkdCIGRlZmF1bHRfdmFsdWUsIGJvb2wgYkluaGVyaXRhYmxlLCBpbnQgc3ViaW5kZXgpCiB7CiAgICAgQ1BERl9PYmplY3QqIHBBdHRyID0gR2V0QXR0cihvd25lciwgbmFtZSwgYkluaGVyaXRhYmxlLCBzdWJpbmRleCk7CiAgICAgaWYgKHBBdHRyID09IE5VTEwgfHwgcEF0dHItPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKQEAgLTQyMCw3ICs0MjAsNyBAQAogICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwQXR0cjsKICAgICByZXR1cm4gMHhmZjAwMDAwMCB8ICgoaW50KShwQXJyYXktPkdldE51bWJlcigwKSAqIDI1NSkgPDwgMTYpIHwgKChpbnQpKHBBcnJheS0+R2V0TnVtYmVyKDEpICogMjU1KSA8PCA4KSB8IChpbnQpKHBBcnJheS0+R2V0TnVtYmVyKDIpICogMjU1KTsKIH0KLUZYX0ZMT0FUIENQREZfU3RydWN0RWxlbWVudEltcGw6OkdldE51bWJlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0ZMT0FUIGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlLCBpbnQgc3ViaW5kZXgpCitGWF9GTE9BVCBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9GTE9BVCBkZWZhdWx0X3ZhbHVlLCBib29sIGJJbmhlcml0YWJsZSwgaW50IHN1YmluZGV4KQogewogICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIGJJbmhlcml0YWJsZSwgc3ViaW5kZXgpOwogICAgIGlmIChwQXR0ciA9PSBOVUxMIHx8IHBBdHRyLT5HZXRUeXBlKCkgIT0gUERGT0JKX05VTUJFUikgewpAQCAtNDI4LDcgKzQyOCw3IEBACiAgICAgfQogICAgIHJldHVybiBwQXR0ci0+R2V0TnVtYmVyKCk7CiB9Ci1pbnQJQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6R2V0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSwgaW50IHN1YmluZGV4KQoraW50CUNQREZfU3RydWN0RWxlbWVudEltcGw6OkdldEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBpbnQgZGVmYXVsdF92YWx1ZSwgYm9vbCBiSW5oZXJpdGFibGUsIGludCBzdWJpbmRleCkKIHsKICAgICBDUERGX09iamVjdCogcEF0dHIgPSBHZXRBdHRyKG93bmVyLCBuYW1lLCBiSW5oZXJpdGFibGUsIHN1YmluZGV4KTsKICAgICBpZiAocEF0dHIgPT0gTlVMTCB8fCBwQXR0ci0+R2V0VHlwZSgpICE9IFBERk9CSl9OVU1CRVIpIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3V0aWxzLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3V0aWxzLmNwcAppbmRleCA5NmQyY2NmLi4yNmM5M2YxIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY191dGlscy5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfdXRpbHMuY3BwCkBAIC0yNiwxMCArMjYsMTAgQEAKICAgICB9CiAgICAgcmV0dXJuIGZ1bGxfbmFtZTsKIH0KLUZYX0JPT0wgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6SGFzRm9udCgpCitib29sIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6Okhhc0ZvbnQoKQogewogICAgIGlmIChtX2NzREEuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKICAgICByZXR1cm4gc3ludGF4LkZpbmRUYWdQYXJhbSgiVGYiLCAyKTsKQEAgLTY1LDIzICs2NSwyMyBAQAogICAgIH0KICAgICBjc0ZvbnROYW1lVGFnID0gUERGX05hbWVEZWNvZGUoY3NGb250TmFtZVRhZyk7CiB9Ci1GWF9CT09MIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6Okhhc0NvbG9yKEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uKQorYm9vbCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpIYXNDb2xvcihib29sIGJTdHJva2luZ09wZXJhdGlvbikKIHsKICAgICBpZiAobV9jc0RBLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQSk7CiAgICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIkciIDogImciLCAxKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHN5bnRheC5TZXRQb3MoMCk7CiAgICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIlJHIiA6ICJyZyIsIDMpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgc3ludGF4LlNldFBvcygwKTsKICAgICByZXR1cm4gc3ludGF4LkZpbmRUYWdQYXJhbShiU3Ryb2tpbmdPcGVyYXRpb24gPyAiSyIgOiAiayIsIDQpOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6R2V0Q29sb3JTdHJpbmcoRlhfQk9PTCBiU3Ryb2tpbmdPcGVyYXRpb24pCitDRlhfQnl0ZVN0cmluZyBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRDb2xvclN0cmluZyhib29sIGJTdHJva2luZ09wZXJhdGlvbikKIHsKICAgICBDRlhfQnl0ZVN0cmluZyBjc0NvbG9yOwogICAgIGlmIChtX2NzREEuSXNFbXB0eSgpKSB7CkBAIC0xMTksNyArMTE5LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIGNzQ29sb3I7CiB9Ci12b2lkIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6OkdldENvbG9yKGludCYgaUNvbG9yVHlwZSwgRlhfRkxPQVQgZmNbNF0sIEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uKQordm9pZCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRDb2xvcihpbnQmIGlDb2xvclR5cGUsIEZYX0ZMT0FUIGZjWzRdLCBib29sIGJTdHJva2luZ09wZXJhdGlvbikKIHsKICAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOwogICAgIGZvciAoaW50IGMgPSAwOyBjIDwgNDsgYyArKykgewpAQCAtMTUxLDcgKzE1MSw3IEBACiAgICAgICAgIGZjWzNdID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7CiAgICAgfQogfQotdm9pZCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRDb2xvcihGWF9BUkdCJiBjb2xvciwgaW50JiBpQ29sb3JUeXBlLCBGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbikKK3ZvaWQgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6R2V0Q29sb3IoRlhfQVJHQiYgY29sb3IsIGludCYgaUNvbG9yVHlwZSwgYm9vbCBiU3Ryb2tpbmdPcGVyYXRpb24pCiB7CiAgICAgY29sb3IgPSAwOwogICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ7CkBAIC0xODcsMTAgKzE4NywxMCBAQAogICAgICAgICBjb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCAoaW50KShyICogMjU1ICsgMC41ZiksIChpbnQpKGcgKiAyNTUgKyAwLjVmKSwgKGludCkoYiAqIDI1NSArIDAuNWYpKTsKICAgICB9CiB9Ci1GWF9CT09MIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6Okhhc1RleHRNYXRyaXgoKQorYm9vbCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpIYXNUZXh0TWF0cml4KCkKIHsKICAgICBpZiAobV9jc0RBLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQSk7CiAgICAgcmV0dXJuIHN5bnRheC5GaW5kVGFnUGFyYW0oIlRtIiwgNik7CkBAIC00NjgsMTggKzQ2OCwxOCBAQAogICAgIH0KICAgICByZXR1cm4gR2V0TmF0aXZlSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBEb2N1bWVudCwgY2hhclNldCwgY3NOYW1lVGFnKTsKIH0KLUZYX0JPT0wgRmluZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCitib29sIEZpbmRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBjb25zdCBDUERGX0ZvbnQqIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQogewogICAgIGlmIChwRm9ybURpY3QgPT0gTlVMTCB8fCBwRm9udCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX0RpY3Rpb25hcnkqIHBEUiA9IHBGb3JtRGljdC0+R2V0RGljdCgiRFIiKTsKICAgICBpZiAocERSID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7CiAgICAgaWYgKHBGb250cyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWF9QT1NJVElPTiBwb3MgPSBwRm9udHMtPkdldFN0YXJ0UG9zKCk7CiAgICAgd2hpbGUgKHBvcykgewpAQCAtNDk5LDIzICs0OTksMjMgQEAKICAgICAgICAgfQogICAgICAgICBpZiAocEZvbnQtPkdldEZvbnREaWN0KCkgPT0gcEVsZW1lbnQpIHsKICAgICAgICAgICAgIGNzTmFtZVRhZyA9IGNzS2V5OwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBGaW5kSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lLCBDUERGX0ZvbnQqJiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKK2Jvb2wgRmluZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCiB7CiAgICAgaWYgKHBGb3JtRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX0RpY3Rpb25hcnkqIHBEUiA9IHBGb3JtRGljdC0+R2V0RGljdCgiRFIiKTsKICAgICBpZiAocERSID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7CiAgICAgaWYgKHBGb250cyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoY3NGb250TmFtZS5HZXRMZW5ndGgoKSA+IDApIHsKICAgICAgICAgY3NGb250TmFtZS5SZW1vdmUoJyAnKTsKQEAgLTU0NSwxMCArNTQ1LDEwIEBACiAgICAgICAgIGNzQmFzZUZvbnQuUmVtb3ZlKCcgJyk7CiAgICAgICAgIGlmIChjc0Jhc2VGb250ID09IGNzRm9udE5hbWUpIHsKICAgICAgICAgICAgIGNzTmFtZVRhZyA9IGNzS2V5OwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogdm9pZCBBZGRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSomIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDUERGX0ZvbnQqIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQogewpAQCAtNjcwLDEwICs2NzAsMTAgQEAKICAgICB9CiAgICAgcmV0dXJuIEFsd2F5czsKIH0KLUZYX0JPT0wgQ1BERl9JY29uRml0OjpJc1Byb3BvcnRpb25hbFNjYWxlKCkKK2Jvb2wgQ1BERl9JY29uRml0OjpJc1Byb3BvcnRpb25hbFNjYWxlKCkKIHsKICAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIG1fcERpY3QtPkdldFN0cmluZygiUyIsICJQIikgIT0gIkEiOwogfQpAQCAtNjk0LDEwICs2OTQsMTAgQEAKICAgICAgICAgfQogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9JY29uRml0OjpHZXRGaXR0aW5nQm91bmRzKCkKK2Jvb2wgQ1BERl9JY29uRml0OjpHZXRGaXR0aW5nQm91bmRzKCkKIHsKICAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiRkIiKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3V0aWxzLmggYi9jb3JlL3NyYy9mcGRmZG9jL2RvY191dGlscy5oCmluZGV4IDZiYjFkMzAuLjZkY2Y1YjAgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3V0aWxzLmgKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfdXRpbHMuaApAQCAtMTUsOCArMTUsOCBAQAogQ1BERl9Gb250KgkJR2V0SW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lLCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKIENQREZfRm9udCoJCUdldE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgdWludDhfdCBjaGFyU2V0LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKIENQREZfRm9udCoJCUdldE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7Ci1GWF9CT09MCQkJRmluZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotRlhfQk9PTAkJCUZpbmRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsIENQREZfRm9udComIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKK2Jvb2wJCQlGaW5kSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7Citib29sCQkJRmluZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwogdm9pZAkJCUFkZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwogQ1BERl9Gb250KgkJQWRkTmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgdWludDhfdCBjaGFyU2V0LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKIENQREZfRm9udCoJCUFkZE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwpAQCAtMjUsOCArMjUsOCBAQAogQ1BERl9Gb250KgkJR2V0RGVmYXVsdEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiB2b2lkCQkJU2V0RGVmYXVsdEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfRm9udCogcEZvbnQpOwogdm9pZAkJCVNhdmVDaGVja2VkRmllbGRTdGF0dXMoQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgQ0ZYX0J5dGVBcnJheSYgc3RhdHVzQXJyYXkpOwotRlhfQk9PTAkJCU5lZWRQREZFbmNvZGVGb3JGaWVsZEZ1bGxOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSk7Ci1GWF9CT09MCQkJTmVlZFBERkVuY29kZUZvckZpZWxkVHJlZShDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QsIGludCBuTGV2ZWwgPSAwKTsKK2Jvb2wJCQlOZWVkUERGRW5jb2RlRm9yRmllbGRGdWxsTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NGaWVsZE5hbWUpOworYm9vbAkJCU5lZWRQREZFbmNvZGVGb3JGaWVsZFRyZWUoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LCBpbnQgbkxldmVsID0gMCk7CiB2b2lkCQkJRW5jb2RlRmllbGROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc05hbWUsIENGWF9CeXRlU3RyaW5nJiBjc1QpOwogdm9pZAkJCVVwZGF0ZUVuY29kZUZpZWxkTmFtZShDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QsIGludCBuTGV2ZWwgPSAwKTsKIApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2Nfdmlld2VyUHJlZmVyZW5jZXMuY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2Nfdmlld2VyUHJlZmVyZW5jZXMuY3BwCmluZGV4IGViODI0ZWIuLjFjMDE0ZGIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3ZpZXdlclByZWZlcmVuY2VzLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY192aWV3ZXJQcmVmZXJlbmNlcy5jcHAKQEAgLTExLDIxICsxMSwyMSBAQAogQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczo6fkNQREZfVmlld2VyUHJlZmVyZW5jZXMoKQogewogfQotRlhfQk9PTCBDUERGX1ZpZXdlclByZWZlcmVuY2VzOjpJc0RpcmVjdGlvblIyTCgpIGNvbnN0Citib29sIENQREZfVmlld2VyUHJlZmVyZW5jZXM6OklzRGlyZWN0aW9uUjJMKCkgY29uc3QKIHsKICAgICBDUERGX0RpY3Rpb25hcnkgKnBEaWN0ID0gbV9wRG9jLT5HZXRSb290KCk7CiAgICAgcERpY3QgPSBwRGljdC0+R2V0RGljdChGWF9CU1RSQygiVmlld2VyUHJlZmVyZW5jZXMiKSk7CiAgICAgaWYgKCFwRGljdCkJewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIEZYX0JTVFJDKCJSMkwiKSA9PSBwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJEaXJlY3Rpb24iKSk7CiB9Ci1GWF9CT09MIENQREZfVmlld2VyUHJlZmVyZW5jZXM6OlByaW50U2NhbGluZygpIGNvbnN0Citib29sIENQREZfVmlld2VyUHJlZmVyZW5jZXM6OlByaW50U2NhbGluZygpIGNvbnN0CiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5ICpwRGljdCA9IG1fcERvYy0+R2V0Um9vdCgpOwogICAgIHBEaWN0ID0gcERpY3QtPkdldERpY3QoRlhfQlNUUkMoIlZpZXdlclByZWZlcmVuY2VzIikpOwogICAgIGlmICghcERpY3QpCXsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gRlhfQlNUUkMoIk5vbmUiKSAhPSBwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJQcmludFNjYWxpbmciKSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY192dC5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY192dC5jcHAKaW5kZXggMjMwYmE3Ni4uOGNjNmI3YyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfdnQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3Z0LmNwcApAQCAtMTgzLDggKzE4Myw4IEBACiB7CiAgICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwogICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKLSAgICBGWF9CT09MIGJVcCA9IFRSVUU7Ci0gICAgRlhfQk9PTCBiRG93biA9IFRSVUU7CisgICAgYm9vbCBiVXAgPSB0cnVlOworICAgIGJvb2wgYkRvd24gPSB0cnVlOwogICAgIGludDMyX3QgbkxlZnQgPSAwOwogICAgIGludDMyX3QgblJpZ2h0ID0gbV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMTsKICAgICBpbnQzMl90IG5NaWQgPSBtX0xpbmVBcnJheS5HZXRTaXplKCkgLyAyOwpAQCAtMTk1LDEwICsxOTUsMTAgQEAKICAgICAgICAgICAgIGZUb3AgPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZVkgLSBwTGluZS0+bV9MaW5lSW5mby5mTGluZUFzY2VudCAtIG1fcFZULT5HZXRMaW5lTGVhZGluZyhtX1NlY0luZm8pOwogICAgICAgICAgICAgZkJvdHRvbSA9IHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWSAtIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lRGVzY2VudDsKICAgICAgICAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHBvaW50LnksIGZUb3ApKSB7Ci0gICAgICAgICAgICAgICAgYlVwID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYlVwID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoSXNGbG9hdFNtYWxsZXIocG9pbnQueSwgZkJvdHRvbSkpIHsKLSAgICAgICAgICAgICAgICBiRG93biA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJEb3duID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoSXNGbG9hdFNtYWxsZXIocG9pbnQueSwgZlRvcCkpIHsKICAgICAgICAgICAgICAgICBuUmlnaHQgPSBuTWlkIC0gMTsKQEAgLTM5NCw3ICszOTQsNyBAQAogewogICAgIEFTU0VSVChtX3BTZWN0aW9uICE9IE5VTEwpOwogICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKLSAgICBTcGxpdExpbmVzKEZBTFNFLCBmRm9udFNpemUpOworICAgIFNwbGl0TGluZXMoZmFsc2UsIGZGb250U2l6ZSk7CiAgICAgcmV0dXJuIENQVlRfU2l6ZShtX3JjUmV0LldpZHRoKCksIG1fcmNSZXQuSGVpZ2h0KCkpOwogfQogQ1BWVF9GbG9hdFJlY3QgQ1R5cGVzZXQ6OlR5cGVzZXQoKQpAQCAtNDAyLDcgKzQwMiw3IEBACiAgICAgQVNTRVJUKG1fcFNlY3Rpb24gIT0gTlVMTCk7CiAgICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwogICAgIG1fcFNlY3Rpb24tPm1fTGluZUFycmF5LkVtcHR5KCk7Ci0gICAgU3BsaXRMaW5lcyhUUlVFLCAwLjBmKTsKKyAgICBTcGxpdExpbmVzKHRydWUsIDAuMGYpOwogICAgIG1fcFNlY3Rpb24tPm1fTGluZUFycmF5LkNsZWFyKCk7CiAgICAgT3V0cHV0TGluZXMoKTsKICAgICByZXR1cm4gbV9yY1JldDsKQEAgLTQyNSwxMSArNDI1LDExIEBACiAgICAgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsCiAgICAgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDBDLCAweDAwMDAsIDB4MDAwOCwgMHgwMDAwLCAweDAwMDAsCiB9Owotc3RhdGljIEZYX0JPT0wgSXNMYXRpbihGWF9XT1JEIHdvcmQpCitzdGF0aWMgYm9vbCBJc0xhdGluKEZYX1dPUkQgd29yZCkKIHsKICAgICBpZiAod29yZCA8PSAweDAwN0YpIHsKICAgICAgICAgaWYgKHNwZWNpYWxfY2hhcnNbd29yZF0gJiAweDAwMDEpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCh3b3JkID49IDB4MDBDMCAmJiB3b3JkIDw9IDB4MDBGRikgfHwKQEAgLTQzOSwxNSArNDM5LDE1IEBACiAgICAgICAgICAgICAod29yZCA+PSAweEE3MjAgJiYgd29yZCA8PSAweEE3RkYpIHx8CiAgICAgICAgICAgICAod29yZCA+PSAweEZGMjEgJiYgd29yZCA8PSAweEZGM0EpIHx8CiAgICAgICAgICAgICAod29yZCA+PSAweEZGNDEgJiYgd29yZCA8PSAweEZGNUEpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLXN0YXRpYyBGWF9CT09MIElzRGlnaXQoRlhfRFdPUkQgd29yZCkKK3N0YXRpYyBib29sIElzRGlnaXQoRlhfRFdPUkQgd29yZCkKIHsKLSAgICByZXR1cm4gKHdvcmQgPj0gMHgwMDMwICYmIHdvcmQgPD0gMHgwMDM5KSA/IFRSVUUgOiBGQUxTRTsKKyAgICByZXR1cm4gKHdvcmQgPj0gMHgwMDMwICYmIHdvcmQgPD0gMHgwMDM5KSA/IHRydWUgOiBmYWxzZTsKIH0KLXN0YXRpYyBGWF9CT09MIElzQ0pLKEZYX0RXT1JEIHdvcmQpCitzdGF0aWMgYm9vbCBJc0NKSyhGWF9EV09SRCB3b3JkKQogewogICAgIGlmICgod29yZCA+PSAweDExMDAgJiYgd29yZCA8PSAweDExRkYpIHx8CiAgICAgICAgICAgICAod29yZCA+PSAweDJFODAgJiYgd29yZCA8PSAweDJGRkYpIHx8CkBAIC00NTcsMzMgKzQ1NywzMyBAQAogICAgICAgICAgICAgKHdvcmQgPj0gMHhGRTMwICYmIHdvcmQgPD0gMHhGRTRGKSB8fAogICAgICAgICAgICAgKHdvcmQgPj0gMHgyMDAwMCAmJiB3b3JkIDw9IDB4MkE2REYpIHx8CiAgICAgICAgICAgICAod29yZCA+PSAweDJGODAwICYmIHdvcmQgPD0gMHgyRkExRikpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAod29yZCA+PSAweDMwMDAgJiYgd29yZCA8PSAweDMwM0YpIHsKICAgICAgICAgaWYgKHdvcmQgPT0gMHgzMDA1IHx8IHdvcmQgPT0gMHgzMDA2IHx8IHdvcmQgPT0gMHgzMDIxIHx8IHdvcmQgPT0gMHgzMDIyIHx8CiAgICAgICAgICAgICAgICAgd29yZCA9PSAweDMwMjMgfHwgd29yZCA9PSAweDMwMjQgfHwgd29yZCA9PSAweDMwMjUgfHwgd29yZCA9PSAweDMwMjYgfHwKICAgICAgICAgICAgICAgICB3b3JkID09IDB4MzAyNyB8fCB3b3JkID09IDB4MzAyOCB8fCB3b3JkID09IDB4MzAyOSB8fCB3b3JkID09IDB4MzAzMSB8fAogICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgzMDMyIHx8IHdvcmQgPT0gMHgzMDMzIHx8IHdvcmQgPT0gMHgzMDM0IHx8IHdvcmQgPT0gMHgzMDM1KSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAod29yZCA+PSAweEZGNjYgJiYgd29yZCA8PSAweEZGOUQpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotc3RhdGljIEZYX0JPT0wgSXNQdW5jdHVhdGlvbihGWF9EV09SRCB3b3JkKQorc3RhdGljIGJvb2wgSXNQdW5jdHVhdGlvbihGWF9EV09SRCB3b3JkKQogewogICAgIGlmICh3b3JkIDw9IDB4MDA3RikgewogICAgICAgICBpZiAoKHNwZWNpYWxfY2hhcnNbd29yZF0gPj4gMykgJiAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICh3b3JkID49IDB4MDA4MCAmJiB3b3JkIDw9IDB4MDBGRikgewogICAgICAgICBpZiAod29yZCA9PSAweDAwODIgfHwgd29yZCA9PSAweDAwODQgfHwgd29yZCA9PSAweDAwODUgfHwgd29yZCA9PSAweDAwOTEgfHwKICAgICAgICAgICAgICAgICB3b3JkID09IDB4MDA5MiB8fCB3b3JkID09IDB4MDA5MyB8fCB3b3JkIDw9IDB4MDA5NCB8fCB3b3JkID09IDB4MDA5NiB8fAogICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgwMEI0IHx8IHdvcmQgPT0gMHgwMEI4KSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICh3b3JkID49IDB4MjAwMCAmJiB3b3JkIDw9IDB4MjA2RikgewogICAgICAgICBpZiAod29yZCA9PSAweDIwMTAgfHwgd29yZCA9PSAweDIwMTEgfHwgd29yZCA9PSAweDIwMTIgfHwgd29yZCA9PSAweDIwMTMgfHwKQEAgLTQ5Miw3ICs0OTIsNyBAQAogICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgyMDMyIHx8IHdvcmQgPT0gMHgyMDMzIHx8IHdvcmQgPT0gMHgyMDM0IHx8IHdvcmQgPT0gMHgyMDM1IHx8CiAgICAgICAgICAgICAgICAgd29yZCA9PSAweDIwMzYgfHwgd29yZCA9PSAweDIwMzcgfHwgd29yZCA9PSAweDIwM0MgfHwgd29yZCA9PSAweDIwM0QgfHwKICAgICAgICAgICAgICAgICB3b3JkID09IDB4MjAzRSB8fCB3b3JkID09IDB4MjA0NCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAod29yZCA+PSAweDMwMDAgJiYgd29yZCA8PSAweDMwM0YpIHsKICAgICAgICAgaWYgKHdvcmQgPT0gMHgzMDAxIHx8IHdvcmQgPT0gMHgzMDAyIHx8IHdvcmQgPT0gMHgzMDAzIHx8IHdvcmQgPT0gMHgzMDA1IHx8CkBAIC01MDEsMTEgKzUwMSwxMSBAQAogICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgzMDExIHx8IHdvcmQgPT0gMHgzMDE0IHx8IHdvcmQgPT0gMHgzMDE1IHx8IHdvcmQgPT0gMHgzMDE2IHx8CiAgICAgICAgICAgICAgICAgd29yZCA9PSAweDMwMTcgfHwgd29yZCA9PSAweDMwMTggfHwgd29yZCA9PSAweDMwMTkgfHwgd29yZCA9PSAweDMwMUEgfHwKICAgICAgICAgICAgICAgICB3b3JkID09IDB4MzAxQiB8fCB3b3JkID09IDB4MzAxRCB8fCB3b3JkID09IDB4MzAxRSB8fCB3b3JkID09IDB4MzAxRikgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAod29yZCA+PSAweEZFNTAgJiYgd29yZCA8PSAweEZFNkYpIHsKICAgICAgICAgaWYgKCh3b3JkID49IDB4RkU1MCAmJiB3b3JkIDw9IDB4RkU1RSkgfHwgd29yZCA9PSAweEZFNjMpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHdvcmQgPj0gMHhGRjAwICYmIHdvcmQgPD0gMHhGRkVGKSB7CiAgICAgICAgIGlmICh3b3JkID09IDB4RkYwMSB8fCB3b3JkID09IDB4RkYwMiB8fCB3b3JkID09IDB4RkYwNyB8fCB3b3JkID09IDB4RkYwOCB8fApAQCAtNTE0LDgzICs1MTQsODMgQEAKICAgICAgICAgICAgICAgICB3b3JkID09IDB4RkYzRCB8fCB3b3JkID09IDB4RkY0MCB8fCB3b3JkID09IDB4RkY1QiB8fCB3b3JkID09IDB4RkY1QyB8fAogICAgICAgICAgICAgICAgIHdvcmQgPT0gMHhGRjVEIHx8IHdvcmQgPT0gMHhGRjYxIHx8IHdvcmQgPT0gMHhGRjYyIHx8IHdvcmQgPT0gMHhGRjYzIHx8CiAgICAgICAgICAgICAgICAgd29yZCA9PSAweEZGNjQgfHwgd29yZCA9PSAweEZGNjUgfHwgd29yZCA9PSAweEZGOUUgfHwgd29yZCA9PSAweEZGOUYpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLXN0YXRpYyBGWF9CT09MIElzQ29ubmVjdGl2ZVN5bWJvbChGWF9EV09SRCB3b3JkKQorc3RhdGljIGJvb2wgSXNDb25uZWN0aXZlU3ltYm9sKEZYX0RXT1JEIHdvcmQpCiB7CiAgICAgaWYgKHdvcmQgPD0gMHgwMDdGKSB7CiAgICAgICAgIGlmICgoc3BlY2lhbF9jaGFyc1t3b3JkXSA+PiA1KSAmIDEpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLXN0YXRpYyBGWF9CT09MIElzT3BlblN0eWxlUHVuY3R1YXRpb24oRlhfRFdPUkQgd29yZCkKK3N0YXRpYyBib29sIElzT3BlblN0eWxlUHVuY3R1YXRpb24oRlhfRFdPUkQgd29yZCkKIHsKICAgICBpZiAod29yZCA8PSAweDAwN0YpIHsKICAgICAgICAgaWYgKChzcGVjaWFsX2NoYXJzW3dvcmRdID4+IDIpICYgMSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAod29yZCA9PSAweDMwMEEgfHwgd29yZCA9PSAweDMwMEMgfHwgd29yZCA9PSAweDMwMEUgfHwgd29yZCA9PSAweDMwMTAgfHwKICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgzMDE0IHx8IHdvcmQgPT0gMHgzMDE2IHx8IHdvcmQgPT0gMHgzMDE4IHx8IHdvcmQgPT0gMHgzMDFBIHx8CiAgICAgICAgICAgICAgICB3b3JkID09IDB4RkYwOCB8fCB3b3JkID09IDB4RkYzQiB8fCB3b3JkID09IDB4RkY1QiB8fCB3b3JkID09IDB4RkY2MikgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1zdGF0aWMgRlhfQk9PTCBJc0N1cnJlbmN5U3ltYm9sKEZYX1dPUkQgd29yZCkKK3N0YXRpYyBib29sIElzQ3VycmVuY3lTeW1ib2woRlhfV09SRCB3b3JkKQogewogICAgIGlmICh3b3JkID09IDB4MDAyNCB8fCB3b3JkID09IDB4MDA4MCB8fCB3b3JkID09IDB4MDBBMiB8fCB3b3JkID09IDB4MDBBMyB8fAogICAgICAgICAgICAgd29yZCA9PSAweDAwQTQgfHwgd29yZCA9PSAweDAwQTUgfHwgKHdvcmQgPj0gMHgyMEEwICYmIHdvcmQgPD0gMHgyMENGKSB8fAogICAgICAgICAgICAgd29yZCA9PSAweEZFNjkgfHwgd29yZCA9PSAweEZGMDQgfHwgd29yZCA9PSAweEZGRTAgfHwgd29yZCA9PSAweEZGRTEgfHwKICAgICAgICAgICAgIHdvcmQgPT0gMHhGRkU1IHx8IHdvcmQgPT0gMHhGRkU2KSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLXN0YXRpYyBGWF9CT09MIElzUHJlZml4U3ltYm9sKEZYX1dPUkQgd29yZCkKK3N0YXRpYyBib29sIElzUHJlZml4U3ltYm9sKEZYX1dPUkQgd29yZCkKIHsKICAgICBpZiAoSXNDdXJyZW5jeVN5bWJvbCh3b3JkKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmICh3b3JkID09IDB4MjExNikgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1zdGF0aWMgRlhfQk9PTCBJc1NwYWNlKEZYX1dPUkQgd29yZCkKK3N0YXRpYyBib29sIElzU3BhY2UoRlhfV09SRCB3b3JkKQogewotICAgIHJldHVybiAod29yZCA9PSAweDAwMjAgfHwgd29yZCA9PSAweDMwMDApID8gVFJVRSA6IEZBTFNFOworICAgIHJldHVybiAod29yZCA9PSAweDAwMjAgfHwgd29yZCA9PSAweDMwMDApID8gdHJ1ZSA6IGZhbHNlOwogfQotc3RhdGljIEZYX0JPT0wgTmVlZERpdmlzaW9uKEZYX1dPUkQgcHJldldvcmQsIEZYX1dPUkQgY3VyV29yZCkKK3N0YXRpYyBib29sIE5lZWREaXZpc2lvbihGWF9XT1JEIHByZXZXb3JkLCBGWF9XT1JEIGN1cldvcmQpCiB7CiAgICAgaWYgKChJc0xhdGluKHByZXZXb3JkKSB8fCBJc0RpZ2l0KHByZXZXb3JkKSkgJiYgKElzTGF0aW4oY3VyV29yZCkgfHwgSXNEaWdpdChjdXJXb3JkKSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChJc1NwYWNlKGN1cldvcmQpIHx8IElzUHVuY3R1YXRpb24oY3VyV29yZCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChJc0Nvbm5lY3RpdmVTeW1ib2wocHJldldvcmQpIHx8IElzQ29ubmVjdGl2ZVN5bWJvbChjdXJXb3JkKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKElzU3BhY2UocHJldldvcmQpIHx8IElzUHVuY3R1YXRpb24ocHJldldvcmQpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKElzUHJlZml4U3ltYm9sKHByZXZXb3JkKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKElzUHJlZml4U3ltYm9sKGN1cldvcmQpIHx8IElzQ0pLKGN1cldvcmQpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKElzQ0pLKHByZXZXb3JkKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci12b2lkIENUeXBlc2V0OjpTcGxpdExpbmVzKEZYX0JPT0wgYlR5cGVzZXQsIEZYX0ZMT0FUIGZGb250U2l6ZSkKK3ZvaWQgQ1R5cGVzZXQ6OlNwbGl0TGluZXMoYm9vbCBiVHlwZXNldCwgRlhfRkxPQVQgZkZvbnRTaXplKQogewogICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKICAgICBBU1NFUlQobV9wU2VjdGlvbiAhPSBOVUxMKTsKQEAgLTYwMSwxNCArNjAxLDE0IEBACiAgICAgRlhfRkxPQVQgZkxpbmVBc2NlbnQgPSAwLjBmLCBmQmFja3VwTGluZUFzY2VudCA9IDAuMGY7CiAgICAgRlhfRkxPQVQgZkxpbmVEZXNjZW50ID0gMC4wZiwgZkJhY2t1cExpbmVEZXNjZW50ID0gMC4wZjsKICAgICBpbnQzMl90IG5Xb3JkU3RhcnRQb3MgPSAwOwotICAgIEZYX0JPT0wgYkZ1bGxXb3JkID0gRkFMU0U7CisgICAgYm9vbCBiRnVsbFdvcmQgPSBmYWxzZTsKICAgICBpbnQzMl90IG5MaW5lRnVsbFdvcmRJbmRleCA9IDA7CiAgICAgaW50MzJfdCBuQ2hhckluZGV4ID0gMDsKICAgICBDUFZUX0xpbmVJbmZvIGxpbmU7CiAgICAgRlhfRkxPQVQgZldvcmRXaWR0aCA9IDA7CiAgICAgRlhfRkxPQVQgZlR5cGVzZXRXaWR0aCA9IEZQREZfTUFYKG1fcFZULT5HZXRQbGF0ZVdpZHRoKCkgLSBtX3BWVC0+R2V0TGluZUluZGVudChtX3BTZWN0aW9uLT5tX1NlY0luZm8pLCAwLjBmKTsKICAgICBpbnQzMl90IG5Ub3RhbFdvcmRzID0gbV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpOwotICAgIEZYX0JPT0wgYk9wZW5lZCA9IEZBTFNFOworICAgIGJvb2wgYk9wZW5lZCA9IGZhbHNlOwogICAgIGlmIChuVG90YWxXb3JkcyA+IDApIHsKICAgICAgICAgaW50MzJfdCBpID0gMDsKICAgICAgICAgd2hpbGUgKGkgPCBuVG90YWxXb3JkcykgewpAQCAtNjE5LDggKzYxOSw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocFdvcmQpIHsKICAgICAgICAgICAgICAgICBpZiAoYlR5cGVzZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgZkxpbmVBc2NlbnQgPSBGUERGX01BWChmTGluZUFzY2VudCwgbV9wVlQtPkdldFdvcmRBc2NlbnQoKnBXb3JkLCBUUlVFKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZMaW5lRGVzY2VudCA9IEZQREZfTUlOKGZMaW5lRGVzY2VudCwgbV9wVlQtPkdldFdvcmREZXNjZW50KCpwV29yZCwgVFJVRSkpOworICAgICAgICAgICAgICAgICAgICBmTGluZUFzY2VudCA9IEZQREZfTUFYKGZMaW5lQXNjZW50LCBtX3BWVC0+R2V0V29yZEFzY2VudCgqcFdvcmQsIHRydWUpKTsKKyAgICAgICAgICAgICAgICAgICAgZkxpbmVEZXNjZW50ID0gRlBERl9NSU4oZkxpbmVEZXNjZW50LCBtX3BWVC0+R2V0V29yZERlc2NlbnQoKnBXb3JkLCB0cnVlKSk7CiAgICAgICAgICAgICAgICAgICAgIGZXb3JkV2lkdGggPSBtX3BWVC0+R2V0V29yZFdpZHRoKCpwV29yZCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgZkxpbmVBc2NlbnQgPSBGUERGX01BWChmTGluZUFzY2VudCwgbV9wVlQtPkdldFdvcmRBc2NlbnQoKnBXb3JkLCBmRm9udFNpemUpKTsKQEAgLTYzNiwyMCArNjM2LDIwIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICghYk9wZW5lZCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoSXNPcGVuU3R5bGVQdW5jdHVhdGlvbihwV29yZC0+V29yZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJPcGVuZWQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgYkZ1bGxXb3JkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJPcGVuZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYkZ1bGxXb3JkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwT2xkV29yZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTmVlZERpdmlzaW9uKHBPbGRXb3JkLT5Xb3JkLCBwV29yZC0+V29yZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRnVsbFdvcmQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGdWxsV29yZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoIUlzU3BhY2UocFdvcmQtPldvcmQpICYmICFJc09wZW5TdHlsZVB1bmN0dWF0aW9uKHBXb3JkLT5Xb3JkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYk9wZW5lZCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgYk9wZW5lZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChiRnVsbFdvcmQpIHsKLSAgICAgICAgICAgICAgICAgICAgYkZ1bGxXb3JkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJGdWxsV29yZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBpZiAobkNoYXJJbmRleCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG5MaW5lRnVsbFdvcmRJbmRleCArKzsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNjkxLDcgKzY5MSw3IEBACiAgICAgICAgICAgICAgICAgZkxpbmVEZXNjZW50ID0gMC4wZjsKICAgICAgICAgICAgICAgICBuQ2hhckluZGV4ID0gMDsKICAgICAgICAgICAgICAgICBuTGluZUZ1bGxXb3JkSW5kZXggPSAwOwotICAgICAgICAgICAgICAgIGJGdWxsV29yZCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJGdWxsV29yZCA9IGZhbHNlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBmTGluZVdpZHRoICs9IGZXb3JkV2lkdGg7CiAgICAgICAgICAgICAgICAgaSsrOwpAQCAtODA5LDE3ICs4MDksMTcgQEAKIENQREZfVmFyaWFibGVUZXh0OjpDUERGX1ZhcmlhYmxlVGV4dCgpIDoKICAgICBtX25MaW1pdENoYXIoMCksCiAgICAgbV9uQ2hhckFycmF5KDApLAotICAgIG1fYk11bHRpTGluZShGQUxTRSksCi0gICAgbV9iTGltaXRXaWR0aChGQUxTRSksCi0gICAgbV9iQXV0b0ZvbnRTaXplKEZBTFNFKSwKKyAgICBtX2JNdWx0aUxpbmUoZmFsc2UpLAorICAgIG1fYkxpbWl0V2lkdGgoZmFsc2UpLAorICAgIG1fYkF1dG9Gb250U2l6ZShmYWxzZSksCiAgICAgbV9uQWxpZ25tZW50KDApLAogICAgIG1fZkxpbmVMZWFkaW5nKDAuMGYpLAogICAgIG1fZkNoYXJTcGFjZSgwLjBmKSwKICAgICBtX25Ib3J6U2NhbGUoMTAwKSwKICAgICBtX3dTdWJXb3JkKDApLAogICAgIG1fZkZvbnRTaXplKDAuMGYpLAotICAgIG1fYkluaXRpYWwoRkFMU0UpLAotICAgIG1fYlJpY2hUZXh0KEZBTFNFKSwKKyAgICBtX2JJbml0aWFsKGZhbHNlKSwKKyAgICBtX2JSaWNoVGV4dChmYWxzZSksCiAgICAgbV9wVlRQcm92aWRlcihOVUxMKSwKICAgICBtX3BWVEl0ZXJhdG9yKE5VTEwpCiB7CkBAIC04NDgsMTIgKzg0OCwxMiBAQAogICAgICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KDApKSB7CiAgICAgICAgICAgICBwU2VjdGlvbi0+UmVzZXRMaW5lUGxhY2UoKTsKICAgICAgICAgfQotICAgICAgICBtX2JJbml0aWFsID0gVFJVRTsKKyAgICAgICAgbV9iSW5pdGlhbCA9IHRydWU7CiAgICAgfQogfQogdm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6UmVzZXRBbGwoKQogewotICAgIG1fYkluaXRpYWwgPSBGQUxTRTsKKyAgICBtX2JJbml0aWFsID0gZmFsc2U7CiAgICAgUmVzZXRTZWN0aW9uQXJyYXkoKTsKIH0KIENQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpJbnNlcnRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0LApAQCAtOTU2LDcgKzk1Niw3IEBACiB9CiBDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6RGVsZXRlV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKQogewotICAgIEZYX0JPT0wgYkxhc3RTZWNQb3MgPSBGQUxTRTsKKyAgICBib29sIGJMYXN0U2VjUG9zID0gZmFsc2U7CiAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChQbGFjZVJhbmdlLkVuZFBvcy5uU2VjSW5kZXgpKSB7CiAgICAgICAgIGJMYXN0U2VjUG9zID0gKFBsYWNlUmFuZ2UuRW5kUG9zID09IHBTZWN0aW9uLT5HZXRFbmRXb3JkUGxhY2UoKSk7CiAgICAgfQpAQCAtOTcxLDExICs5NzEsMTEgQEAKIH0KIENQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpEZWxldGVXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCiB7Ci0gICAgcmV0dXJuIENsZWFyUmlnaHRXb3JkKEFqdXN0TGluZUhlYWRlcihwbGFjZSwgVFJVRSkpOworICAgIHJldHVybiBDbGVhclJpZ2h0V29yZChBanVzdExpbmVIZWFkZXIocGxhY2UsIHRydWUpKTsKIH0KIENQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpCYWNrU3BhY2VXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCiB7Ci0gICAgcmV0dXJuIENsZWFyTGVmdFdvcmQoQWp1c3RMaW5lSGVhZGVyKHBsYWNlLCBUUlVFKSk7CisgICAgcmV0dXJuIENsZWFyTGVmdFdvcmQoQWp1c3RMaW5lSGVhZGVyKHBsYWNlLCB0cnVlKSk7CiB9CiB2b2lkIENQREZfVmFyaWFibGVUZXh0OjpTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LCBpbnQzMl90IGNoYXJzZXQsIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcykKQEAgLTEwNDQsNyArMTA0NCw3IEBACiAgICAgaWYgKHBsYWNlLm5TZWNJbmRleCA+PSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkpIHsKICAgICAgICAgcGxhY2UgPSBHZXRFbmRXb3JkUGxhY2UoKTsKICAgICB9Ci0gICAgcGxhY2UgPSBBanVzdExpbmVIZWFkZXIocGxhY2UsIFRSVUUpOworICAgIHBsYWNlID0gQWp1c3RMaW5lSGVhZGVyKHBsYWNlLCB0cnVlKTsKICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKICAgICAgICAgcFNlY3Rpb24tPlVwZGF0ZVdvcmRQbGFjZShwbGFjZSk7CiAgICAgfQpAQCAtMTA3MywxOSArMTA3MywxOSBAQAogewogICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKICAgICBpbnQzMl90IG5PbGRJbmRleCA9IDAgLCBuSW5kZXggPSAwOwotICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKKyAgICBib29sIGJGaW5kID0gZmFsc2U7CiAgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKICAgICAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChpKSkgewogICAgICAgICAgICAgbkluZGV4ICs9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7CiAgICAgICAgICAgICBpZiAobkluZGV4ID09IGluZGV4KSB7CiAgICAgICAgICAgICAgICAgcGxhY2UgPSBwU2VjdGlvbi0+R2V0RW5kV29yZFBsYWNlKCk7Ci0gICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJGaW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobkluZGV4ID4gaW5kZXgpIHsKICAgICAgICAgICAgICAgICBwbGFjZS5uU2VjSW5kZXggPSBpOwogICAgICAgICAgICAgICAgIHBsYWNlLm5Xb3JkSW5kZXggPSBpbmRleCAtIG5PbGRJbmRleCAtIDE7CiAgICAgICAgICAgICAgICAgcFNlY3Rpb24tPlVwZGF0ZVdvcmRQbGFjZShwbGFjZSk7Ci0gICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJGaW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChpICE9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSAtIDEpIHsKQEAgLTExNTUsMTUgKzExNTUsMTUgQEAKICAgICBpbnQzMl90IG5MZWZ0ID0gMDsKICAgICBpbnQzMl90IG5SaWdodCA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSAtIDE7CiAgICAgaW50MzJfdCBuTWlkID0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIC8gMjsKLSAgICBGWF9CT09MIGJVcCA9IFRSVUU7Ci0gICAgRlhfQk9PTCBiRG93biA9IFRSVUU7CisgICAgYm9vbCBiVXAgPSB0cnVlOworICAgIGJvb2wgYkRvd24gPSB0cnVlOwogICAgIHdoaWxlIChuTGVmdCA8PSBuUmlnaHQpIHsKICAgICAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChuTWlkKSkgewogICAgICAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIocHQueSwgcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24udG9wKSkgewotICAgICAgICAgICAgICAgIGJVcCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJVcCA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIocFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24uYm90dG9tLCBwdC55KSkgewotICAgICAgICAgICAgICAgIGJEb3duID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYkRvd24gPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihwdC55LCBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi50b3ApKSB7CiAgICAgICAgICAgICAgICAgblJpZ2h0ID0gbk1pZCAtIDE7CkBAIC0xMzAzLDQ5ICsxMzAzLDQ5IEBACiAgICAgfQogICAgIHJldHVybiBwbGFjZTsKIH0KLUZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIENQVlRfV29yZEluZm8gJiB3b3JkaW5mbykKK2Jvb2wgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIENQVlRfV29yZEluZm8gJiB3b3JkaW5mbykKIHsKICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKICAgICAgICAgaWYgKENQVlRfV29yZEluZm8gKiBwV29yZCA9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdChwbGFjZS5uV29yZEluZGV4KSkgewogICAgICAgICAgICAgd29yZGluZm8gPSAqcFdvcmQ7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZfVmFyaWFibGVUZXh0OjpTZXRXb3JkSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRJbmZvICYgd29yZGluZm8pCitib29sIENQREZfVmFyaWFibGVUZXh0OjpTZXRXb3JkSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRJbmZvICYgd29yZGluZm8pCiB7CiAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7CiAgICAgICAgIGlmIChDUFZUX1dvcmRJbmZvICogcFdvcmQgPSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQocGxhY2UubldvcmRJbmRleCkpIHsKICAgICAgICAgICAgICpwV29yZCA9IHdvcmRpbmZvOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0TGluZUluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9MaW5lSW5mbyAmIGxpbmVpbmZvKQorYm9vbCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0TGluZUluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9MaW5lSW5mbyAmIGxpbmVpbmZvKQogewogICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewogICAgICAgICBpZiAoQ0xpbmUgKiBwTGluZSA9IHBTZWN0aW9uLT5tX0xpbmVBcnJheS5HZXRBdChwbGFjZS5uTGluZUluZGV4KSkgewogICAgICAgICAgICAgbGluZWluZm8gPSBwTGluZS0+bV9MaW5lSW5mbzsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFNlY3Rpb25JbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIENQVlRfU2VjdGlvbkluZm8gJiBzZWNpbmZvKQorYm9vbCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0U2VjdGlvbkluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9TZWN0aW9uSW5mbyAmIHNlY2luZm8pCiB7CiAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7CiAgICAgICAgIHNlY2luZm8gPSBwU2VjdGlvbi0+bV9TZWNJbmZvOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBDUERGX1JlY3QgQ1BERl9WYXJpYWJsZVRleHQ6OkdldENvbnRlbnRSZWN0KCkgY29uc3QKIHsKICAgICByZXR1cm4gSW5Ub091dChDUERGX0VkaXRDb250YWluZXI6OkdldENvbnRlbnRSZWN0KCkpOwogfQotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRGb250U2l6ZShjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8sIEZYX0JPT0wgYkZhY3RGb250U2l6ZSkKK0ZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkRm9udFNpemUoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBib29sIGJGYWN0Rm9udFNpemUpCiB7CiAgICAgcmV0dXJuIG1fYlJpY2hUZXh0ICYmIFdvcmRJbmZvLnBXb3JkUHJvcHMgPyAoV29yZEluZm8ucFdvcmRQcm9wcy0+blNjcmlwdFR5cGUgPT0gUFZUV09SRF9TQ1JJUFRfTk9STUFMIHx8IGJGYWN0Rm9udFNpemUgPyBXb3JkSW5mby5wV29yZFByb3BzLT5mRm9udFNpemUgOiBXb3JkSW5mby5wV29yZFByb3BzLT5mRm9udFNpemUgKiBQVlRfSEFMRikgOiBHZXRGb250U2l6ZSgpOwogfQpAQCAtMTM5MSwxMSArMTM5MSwxMSBAQAogewogICAgIHJldHVybiBHZXRGb250RGVzY2VudChHZXRXb3JkRm9udEluZGV4KFdvcmRJbmZvKSwgZkZvbnRTaXplKTsKIH0KLUZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkQXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgRlhfQk9PTCBiRmFjdEZvbnRTaXplKQorRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRBc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBib29sIGJGYWN0Rm9udFNpemUpCiB7CiAgICAgcmV0dXJuIEdldEZvbnRBc2NlbnQoR2V0V29yZEZvbnRJbmRleChXb3JkSW5mbyksIEdldFdvcmRGb250U2l6ZShXb3JkSW5mbywgYkZhY3RGb250U2l6ZSkpOwogfQotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmREZXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgRlhfQk9PTCBiRmFjdEZvbnRTaXplKQorRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmREZXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgYm9vbCBiRmFjdEZvbnRTaXplKQogewogICAgIHJldHVybiBHZXRGb250RGVzY2VudChHZXRXb3JkRm9udEluZGV4KFdvcmRJbmZvKSwgR2V0V29yZEZvbnRTaXplKFdvcmRJbmZvLCBiRmFjdEZvbnRTaXplKSk7CiB9CkBAIC0xNDIxLDcgKzE0MjEsNyBAQAogfQogdm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6Q2xlYXJTZWN0aW9uUmlnaHRXb3Jkcyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKQogewotICAgIENQVlRfV29yZFBsYWNlIHdvcmRwbGFjZSA9IEFqdXN0TGluZUhlYWRlcihwbGFjZSwgVFJVRSk7CisgICAgQ1BWVF9Xb3JkUGxhY2Ugd29yZHBsYWNlID0gQWp1c3RMaW5lSGVhZGVyKHBsYWNlLCB0cnVlKTsKICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKICAgICAgICAgZm9yIChpbnQzMl90IHcgPSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpIC0gMTsgdyA+IHdvcmRwbGFjZS5uV29yZEluZGV4OyB3LS0pIHsKICAgICAgICAgICAgIGRlbGV0ZSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQodyk7CkBAIC0xNDI5LDI2ICsxNDI5LDI2IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1DUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6QWp1c3RMaW5lSGVhZGVyKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIEZYX0JPT0wgYlByZXZPck5leHQpIGNvbnN0CitDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6QWp1c3RMaW5lSGVhZGVyKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGJvb2wgYlByZXZPck5leHQpIGNvbnN0CiB7CiAgICAgaWYgKHBsYWNlLm5Xb3JkSW5kZXggPCAwICYmIHBsYWNlLm5MaW5lSW5kZXggPiAwKSB7CiAgICAgICAgIHJldHVybiBiUHJldk9yTmV4dCA/IEdldFByZXZXb3JkUGxhY2UocGxhY2UpIDogR2V0TmV4dFdvcmRQbGFjZShwbGFjZSk7CiAgICAgfQogICAgIHJldHVybiBwbGFjZTsKIH0KLUZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHQ6OkNsZWFyRW1wdHlTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCitib29sIENQREZfVmFyaWFibGVUZXh0OjpDbGVhckVtcHR5U2VjdGlvbihjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKQogewogICAgIGlmIChwbGFjZS5uU2VjSW5kZXggPT0gMCAmJiBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgPT0gMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7CiAgICAgICAgIGlmIChwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpID09IDApIHsKICAgICAgICAgICAgIGRlbGV0ZSBwU2VjdGlvbjsKICAgICAgICAgICAgIG1fU2VjdGlvbkFycmF5LlJlbW92ZUF0KHBsYWNlLm5TZWNJbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiB2b2lkIENQREZfVmFyaWFibGVUZXh0OjpDbGVhckVtcHR5U2VjdGlvbnMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKQogewpAQCAtMTQ2MCw3ICsxNDYwLDcgQEAKIH0KIHZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OkxpbmtMYXR0ZXJTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCiB7Ci0gICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2UgPSBBanVzdExpbmVIZWFkZXIocGxhY2UsIFRSVUUpOworICAgIENQVlRfV29yZFBsYWNlIG9sZHBsYWNlID0gQWp1c3RMaW5lSGVhZGVyKHBsYWNlLCB0cnVlKTsKICAgICBpZiAoQ1NlY3Rpb24gKiBwTmV4dFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXggKyAxKSkgewogICAgICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KG9sZHBsYWNlLm5TZWNJbmRleCkpIHsKICAgICAgICAgICAgIGZvciAoaW50MzJfdCB3ID0gMCwgc3ogPSBwTmV4dFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKTsgdyA8IHN6OyB3KyspIHsKQEAgLTE0NzcsOCArMTQ3Nyw4IEBACiB2b2lkIENQREZfVmFyaWFibGVUZXh0OjpDbGVhcldvcmRzKGNvbnN0IENQVlRfV29yZFJhbmdlICYgUGxhY2VSYW5nZSkKIHsKICAgICBDUFZUX1dvcmRSYW5nZSBOZXdSYW5nZTsKLSAgICBOZXdSYW5nZS5CZWdpblBvcyA9IEFqdXN0TGluZUhlYWRlcihQbGFjZVJhbmdlLkJlZ2luUG9zLCBUUlVFKTsKLSAgICBOZXdSYW5nZS5FbmRQb3MgPSBBanVzdExpbmVIZWFkZXIoUGxhY2VSYW5nZS5FbmRQb3MsIFRSVUUpOworICAgIE5ld1JhbmdlLkJlZ2luUG9zID0gQWp1c3RMaW5lSGVhZGVyKFBsYWNlUmFuZ2UuQmVnaW5Qb3MsIHRydWUpOworICAgIE5ld1JhbmdlLkVuZFBvcyA9IEFqdXN0TGluZUhlYWRlcihQbGFjZVJhbmdlLkVuZFBvcywgdHJ1ZSk7CiAgICAgZm9yIChpbnQzMl90IHMgPSBOZXdSYW5nZS5FbmRQb3MublNlY0luZGV4OyBzID49IE5ld1JhbmdlLkJlZ2luUG9zLm5TZWNJbmRleDsgcy0tKSB7CiAgICAgICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocykpIHsKICAgICAgICAgICAgIHBTZWN0aW9uLT5DbGVhcldvcmRzKE5ld1JhbmdlKTsKQEAgLTE1MDcsNyArMTUwNyw3IEBACiBDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6Q2xlYXJSaWdodFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkKIHsKICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKLSAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcmlnaHRwbGFjZSA9IEFqdXN0TGluZUhlYWRlcihHZXROZXh0V29yZFBsYWNlKHBsYWNlKSwgRkFMU0UpOworICAgICAgICBDUFZUX1dvcmRQbGFjZSByaWdodHBsYWNlID0gQWp1c3RMaW5lSGVhZGVyKEdldE5leHRXb3JkUGxhY2UocGxhY2UpLCBmYWxzZSk7CiAgICAgICAgIGlmIChyaWdodHBsYWNlICE9IHBsYWNlKSB7CiAgICAgICAgICAgICBpZihyaWdodHBsYWNlLm5TZWNJbmRleCAhPSBwbGFjZS5uU2VjSW5kZXgpIHsKICAgICAgICAgICAgICAgICBMaW5rTGF0dGVyU2VjdGlvbihwbGFjZSk7CkBAIC0xNTY4LDkgKzE1NjgsOSBAQAogICAgIH0KICAgICByZXR1cm4gKEZYX0ZMT0FUKWdGb250U2l6ZVN0ZXBzW25NaWRdOwogfQotRlhfQk9PTAlDUERGX1ZhcmlhYmxlVGV4dDo6SXNCaWdnZXIoRlhfRkxPQVQgZkZvbnRTaXplKQorYm9vbAlDUERGX1ZhcmlhYmxlVGV4dDo6SXNCaWdnZXIoRlhfRkxPQVQgZkZvbnRTaXplKQogewotICAgIEZYX0JPT0wgYkJpZ2dlciA9ICBGQUxTRTsKKyAgICBib29sIGJCaWdnZXIgPSAgZmFsc2U7CiAgICAgQ1BWVF9TaXplIHN6VG90YWw7CiAgICAgZm9yIChpbnQzMl90IHMgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgcyA8IHN6OyBzKyspIHsKICAgICAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChzKSkgewpAQCAtMTU4MCw3ICsxNTgwLDcgQEAKICAgICAgICAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHN6VG90YWwueCwgR2V0UGxhdGVXaWR0aCgpKQogICAgICAgICAgICAgICAgICAgICB8fCBJc0Zsb2F0QmlnZ2VyKHN6VG90YWwueSwgR2V0UGxhdGVIZWlnaHQoKSkKICAgICAgICAgICAgICAgICkgewotICAgICAgICAgICAgICAgIGJCaWdnZXIgPSBUUlVFOworICAgICAgICAgICAgICAgIGJCaWdnZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNjUyLDkgKzE2NTIsOSBAQAogewogICAgIHJldHVybiBtX3BWVFByb3ZpZGVyID8gbV9wVlRQcm92aWRlci0+R2V0RGVmYXVsdEZvbnRJbmRleCgpIDogLTE7CiB9Ci1GWF9CT09MCUNQREZfVmFyaWFibGVUZXh0OjpJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpCitib29sCUNQREZfVmFyaWFibGVUZXh0OjpJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpCiB7Ci0gICAgcmV0dXJuIG1fcFZUUHJvdmlkZXIgPyBtX3BWVFByb3ZpZGVyLT5Jc0xhdGluV29yZCh3b3JkKSA6IEZBTFNFOworICAgIHJldHVybiBtX3BWVFByb3ZpZGVyID8gbV9wVlRQcm92aWRlci0+SXNMYXRpbldvcmQod29yZCkgOiBmYWxzZTsKIH0KIElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogQ1BERl9WYXJpYWJsZVRleHQ6OkdldEl0ZXJhdG9yKCkKIHsKQEAgLTE2ODcsNzAgKzE2ODcsNzAgQEAKICAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7CiAgICAgbV9DdXJQb3MgPSBwbGFjZTsKIH0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6Ok5leHRXb3JkKCkKK2Jvb2wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6Ok5leHRXb3JkKCkKIHsKICAgICBpZiAobV9DdXJQb3MgPT0gbV9wVlQtPkdldEVuZFdvcmRQbGFjZSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX0N1clBvcyA9IG1fcFZULT5HZXROZXh0V29yZFBsYWNlKG1fQ3VyUG9zKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlByZXZXb3JkKCkKK2Jvb2wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlByZXZXb3JkKCkKIHsKICAgICBpZiAobV9DdXJQb3MgPT0gbV9wVlQtPkdldEJlZ2luV29yZFBsYWNlKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fQ3VyUG9zID0gbV9wVlQtPkdldFByZXZXb3JkUGxhY2UobV9DdXJQb3MpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6TmV4dExpbmUoKQorYm9vbAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6TmV4dExpbmUoKQogewogICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldEF0KG1fQ3VyUG9zLm5TZWNJbmRleCkpIHsKICAgICAgICAgaWYgKG1fQ3VyUG9zLm5MaW5lSW5kZXggPCBwU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMSkgewogICAgICAgICAgICAgbV9DdXJQb3MgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXgsIG1fQ3VyUG9zLm5MaW5lSW5kZXggKyAxLCAtMSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX0N1clBvcy5uU2VjSW5kZXggPCBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIC0gMSkgewogICAgICAgICAgICAgbV9DdXJQb3MgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXggKyAxLCAwLCAtMSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpQcmV2TGluZSgpCitib29sCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpQcmV2TGluZSgpCiB7CiAgICAgaWYgKG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7CiAgICAgICAgIGlmIChtX0N1clBvcy5uTGluZUluZGV4ID4gMCkgewogICAgICAgICAgICAgbV9DdXJQb3MgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXgsIG1fQ3VyUG9zLm5MaW5lSW5kZXggLSAxLCAtMSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX0N1clBvcy5uU2VjSW5kZXggPiAwKSB7CiAgICAgICAgICAgICBpZiAoQ1NlY3Rpb24gKiBwTGFzdFNlY3Rpb24gPSBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0QXQobV9DdXJQb3MublNlY0luZGV4IC0gMSkpIHsKICAgICAgICAgICAgICAgICBtX0N1clBvcyA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCAtIDEsIHBMYXN0U2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMSwgLTEpOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpOZXh0U2VjdGlvbigpCitib29sCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpOZXh0U2VjdGlvbigpCiB7CiAgICAgaWYgKG1fQ3VyUG9zLm5TZWNJbmRleCA8IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxKSB7CiAgICAgICAgIG1fQ3VyUG9zID0gQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4ICsgMSwgMCwgLTEpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpQcmV2U2VjdGlvbigpCitib29sCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpQcmV2U2VjdGlvbigpCiB7CiAgICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwogICAgIGlmIChtX0N1clBvcy5uU2VjSW5kZXggPiAwKSB7CiAgICAgICAgIG1fQ3VyUG9zID0gQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4IC0gMSwgMCwgLTEpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0Citib29sCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0CiB7CiAgICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwogICAgIHdvcmQuV29yZFBsYWNlID0gbV9DdXJQb3M7CkBAIC0xNzcwLDEzICsxNzcwLDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHdvcmQubkZvbnRJbmRleCA9IG1fcFZULT5HZXRXb3JkRm9udEluZGV4KCpwV29yZCk7CiAgICAgICAgICAgICAgICAgd29yZC5mRm9udFNpemUgPSBtX3BWVC0+R2V0V29yZEZvbnRTaXplKCpwV29yZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlNldFdvcmQoY29uc3QgQ1BWVF9Xb3JkICYgd29yZCkKK2Jvb2wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlNldFdvcmQoY29uc3QgQ1BWVF9Xb3JkICYgd29yZCkKIHsKICAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7CiAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0QXQobV9DdXJQb3MublNlY0luZGV4KSkgewpAQCAtMTc4NCwxMiArMTc4NCwxMiBAQAogICAgICAgICAgICAgaWYgKHBXb3JkLT5wV29yZFByb3BzKSB7CiAgICAgICAgICAgICAgICAgKnBXb3JkLT5wV29yZFByb3BzID0gd29yZC5Xb3JkUHJvcHM7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0Citib29sCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0CiB7CiAgICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwogICAgIGxpbmUubGluZXBsYWNlID0gQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4LCBtX0N1clBvcy5uTGluZUluZGV4LCAtMSk7CkBAIC0xODAyLDEyICsxODAyLDEyIEBACiAgICAgICAgICAgICBsaW5lLmZMaW5lQXNjZW50ID0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVBc2NlbnQ7CiAgICAgICAgICAgICBsaW5lLmZMaW5lRGVzY2VudCA9IHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lRGVzY2VudDsKICAgICAgICAgICAgIGxpbmUubGluZUVuZCA9IHBMaW5lLT5HZXRFbmRXb3JkUGxhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OkdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QKK2Jvb2wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OkdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QKIHsKICAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7CiAgICAgc2VjdGlvbi5zZWNwbGFjZSA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCwgMCwgLTEpOwpAQCAtMTgxOSwxMSArMTgxOSwxMSBAQAogICAgICAgICBpZiAocFNlY3Rpb24tPm1fU2VjSW5mby5wV29yZFByb3BzKSB7CiAgICAgICAgICAgICBzZWN0aW9uLldvcmRQcm9wcyA9ICpwU2VjdGlvbi0+bV9TZWNJbmZvLnBXb3JkUHJvcHM7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6U2V0U2VjdGlvbihjb25zdCBDUFZUX1NlY3Rpb24gJiBzZWN0aW9uKQorYm9vbAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6U2V0U2VjdGlvbihjb25zdCBDUFZUX1NlY3Rpb24gJiBzZWN0aW9uKQogewogICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7CkBAIC0xODMzLDcgKzE4MzMsNyBAQAogICAgICAgICBpZiAocFNlY3Rpb24tPm1fU2VjSW5mby5wV29yZFByb3BzKSB7CiAgICAgICAgICAgICAqcFNlY3Rpb24tPm1fU2VjSW5mby5wV29yZFByb3BzID0gc2VjdGlvbi5Xb3JkUHJvcHM7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9wZGZfdnQuaCBiL2NvcmUvc3JjL2ZwZGZkb2MvcGRmX3Z0LmgKaW5kZXggYTc1NDkwZi4uZmI3OTEwYiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9wZGZfdnQuaAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL3BkZl92dC5oCkBAIC0xOTEsNyArMTkxLDcgQEAKIHRlbXBsYXRlPGNsYXNzIFRZUEU+IGNsYXNzIENQVlRfQXJyYXlUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPgogewogcHVibGljOgotICAgIEZYX0JPT0wgSXNFbXB0eSgpCisgICAgYm9vbCBJc0VtcHR5KCkKICAgICB7CiAgICAgICAgIHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpIDw9IDA7CiAgICAgfQpAQCAtMzE2LDcgKzMxNiw3IEBACiAgICAgQ1BWVF9GbG9hdFJlY3QJCQkJCQkJVHlwZXNldCgpOwogICAgIENQVlRfRmxvYXRSZWN0CQkJCQkJCUNoYXJBcnJheSgpOwogcHJpdmF0ZToKLSAgICB2b2lkCQkJCQkJCQkJU3BsaXRMaW5lcyhGWF9CT09MIGJUeXBlc2V0LCBGWF9GTE9BVCBmRm9udFNpemUpOworICAgIHZvaWQJCQkJCQkJCQlTcGxpdExpbmVzKGJvb2wgYlR5cGVzZXQsIEZYX0ZMT0FUIGZGb250U2l6ZSk7CiAgICAgdm9pZAkJCQkJCQkJCU91dHB1dExpbmVzKCk7CiAKICAgICBDUFZUX0Zsb2F0UmVjdAkJCQkJCQltX3JjUmV0OwpAQCAtNDIzLDExICs0MjMsMTEgQEAKICAgICB7CiAgICAgICAgIG1fbkhvcnpTY2FsZSA9IG5Ib3J6U2NhbGU7CiAgICAgfQotICAgIHZvaWQJCQkJCQkJCQlTZXRNdWx0aUxpbmUoRlhfQk9PTCBiTXVsdGlMaW5lID0gVFJVRSkKKyAgICB2b2lkCQkJCQkJCQkJU2V0TXVsdGlMaW5lKGJvb2wgYk11bHRpTGluZSA9IHRydWUpCiAgICAgewogICAgICAgICBtX2JNdWx0aUxpbmUgPSBiTXVsdGlMaW5lOwogICAgIH0KLSAgICB2b2lkCQkJCQkJCQkJU2V0QXV0b1JldHVybihGWF9CT09MIGJBdXRvID0gVFJVRSkKKyAgICB2b2lkCQkJCQkJCQkJU2V0QXV0b1JldHVybihib29sIGJBdXRvID0gdHJ1ZSkKICAgICB7CiAgICAgICAgIG1fYkxpbWl0V2lkdGggPSBiQXV0bzsKICAgICB9CkBAIC00MzksMTEgKzQzOSwxMSBAQAogICAgIHsKICAgICAgICAgbV9uQ2hhckFycmF5ID0gbkNoYXJBcnJheTsKICAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCVNldEF1dG9Gb250U2l6ZShGWF9CT09MIGJBdXRvID0gVFJVRSkKKyAgICB2b2lkCQkJCQkJCQkJU2V0QXV0b0ZvbnRTaXplKGJvb2wgYkF1dG8gPSB0cnVlKQogICAgIHsKICAgICAgICAgbV9iQXV0b0ZvbnRTaXplID0gYkF1dG87CiAgICAgfQotICAgIHZvaWQJCQkJCQkJCQlTZXRSaWNoVGV4dChGWF9CT09MIGJSaWNoVGV4dCkKKyAgICB2b2lkCQkJCQkJCQkJU2V0UmljaFRleHQoYm9vbCBiUmljaFRleHQpCiAgICAgewogICAgICAgICBtX2JSaWNoVGV4dCA9IGJSaWNoVGV4dDsKICAgICB9CkBAIC00NTIsMTEgKzQ1MiwxMSBAQAogICAgICAgICBtX2ZMaW5lTGVhZGluZyA9IGZMaW5lTGVhZGluZzsKICAgICB9CiAgICAgdm9pZAkJCQkJCQkJCUluaXRpYWxpemUoKTsKLSAgICBGWF9CT09MCQkJCQkJCQkJSXNWYWxpZCgpIGNvbnN0CisgICAgYm9vbAkJCQkJCQkJCUlzVmFsaWQoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYkluaXRpYWw7CiAgICAgfQotICAgIEZYX0JPT0wJCQkJCQkJCQlJc1JpY2hUZXh0KCkgY29uc3QKKyAgICBib29sCQkJCQkJCQkJSXNSaWNoVGV4dCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iUmljaFRleHQ7CiAgICAgfQpAQCAtNDk2LDcgKzQ5Niw3IEBACiAgICAgewogICAgICAgICByZXR1cm4gbV9uTGltaXRDaGFyOwogICAgIH0KLSAgICBGWF9CT09MCQkJCQkJCQkJSXNNdWx0aUxpbmUoKSBjb25zdAorICAgIGJvb2wJCQkJCQkJCQlJc011bHRpTGluZSgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iTXVsdGlMaW5lOwogICAgIH0KQEAgLTUzNywyNSArNTM3LDI1IEBACiAgICAgaW50MzJfdAkJCQkJCQkJR2V0VHlwZURlc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KTsKICAgICBpbnQzMl90CQkJCQkJCQlHZXRXb3JkRm9udEluZGV4KEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0LCBpbnQzMl90IG5Gb250SW5kZXgpOwogICAgIGludDMyX3QJCQkJCQkJCUdldERlZmF1bHRGb250SW5kZXgoKTsKLSAgICBGWF9CT09MCQkJCQkJCQkJSXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKTsKKyAgICBib29sCQkJCQkJCQkJSXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKTsKIHByaXZhdGU6CiAKICAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlBZGRTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfU2VjdGlvbkluZm8gJiBzZWNpbmZvKTsKICAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlBZGRMaW5lKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfTGluZUluZm8gJiBsaW5laW5mbyk7CiAgICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJQWRkV29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRJbmZvICYgd29yZGluZm8pOwotICAgIEZYX0JPT0wJCQkJCQkJCQlHZXRXb3JkSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBDUFZUX1dvcmRJbmZvICYgd29yZGluZm8pOwotICAgIEZYX0JPT0wJCQkJCQkJCQlTZXRXb3JkSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRJbmZvICYgd29yZGluZm8pOwotICAgIEZYX0JPT0wJCQkJCQkJCQlHZXRMaW5lSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBDUFZUX0xpbmVJbmZvICYgbGluZWluZm8pOwotICAgIEZYX0JPT0wJCQkJCQkJCQlHZXRTZWN0aW9uSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBDUFZUX1NlY3Rpb25JbmZvICYgc2VjaW5mbyk7Ci0gICAgRlhfRkxPQVQJCQkJCQkJCUdldFdvcmRGb250U2l6ZShjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8sIEZYX0JPT0wgYkZhY3RGb250U2l6ZSA9IEZBTFNFKTsKKyAgICBib29sCQkJCQkJCQkJR2V0V29yZEluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9Xb3JkSW5mbyAmIHdvcmRpbmZvKTsKKyAgICBib29sCQkJCQkJCQkJU2V0V29yZEluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIHdvcmRpbmZvKTsKKyAgICBib29sCQkJCQkJCQkJR2V0TGluZUluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9MaW5lSW5mbyAmIGxpbmVpbmZvKTsKKyAgICBib29sCQkJCQkJCQkJR2V0U2VjdGlvbkluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9TZWN0aW9uSW5mbyAmIHNlY2luZm8pOworICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRXb3JkRm9udFNpemUoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBib29sIGJGYWN0Rm9udFNpemUgPSBmYWxzZSk7CiAgICAgRlhfRkxPQVQJCQkJCQkJCUdldFdvcmRXaWR0aChpbnQzMl90IG5Gb250SW5kZXgsIEZYX1dPUkQgV29yZCwgRlhfV09SRCBTdWJXb3JkLAogICAgICAgICAgICAgRlhfRkxPQVQgZkNoYXJTcGFjZSwgaW50MzJfdCBuSG9yelNjYWxlLAogICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9GTE9BVCBmV29yZFRhaWwsIGludDMyX3QgbldvcmRTdHlsZSk7CiAgICAgRlhfRkxPQVQJCQkJCQkJCUdldFdvcmRXaWR0aChjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8pOwogICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRXb3JkQXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgRlhfRkxPQVQgZkZvbnRTaXplKTsKICAgICBGWF9GTE9BVAkJCQkJCQkJR2V0V29yZERlc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9GTE9BVCBmRm9udFNpemUpOwotICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRXb3JkQXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgRlhfQk9PTCBiRmFjdEZvbnRTaXplID0gRkFMU0UpOwotICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRXb3JkRGVzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8sIEZYX0JPT0wgYkZhY3RGb250U2l6ZSA9IEZBTFNFKTsKKyAgICBGWF9GTE9BVAkJCQkJCQkJR2V0V29yZEFzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8sIGJvb2wgYkZhY3RGb250U2l6ZSA9IGZhbHNlKTsKKyAgICBGWF9GTE9BVAkJCQkJCQkJR2V0V29yZERlc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBib29sIGJGYWN0Rm9udFNpemUgPSBmYWxzZSk7CiAgICAgRlhfRkxPQVQJCQkJCQkJCUdldExpbmVBc2NlbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyAmIFNlY0luZm8pOwogICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRMaW5lRGVzY2VudChjb25zdCBDUFZUX1NlY3Rpb25JbmZvICYgU2VjSW5mbyk7CiAgICAgRlhfRkxPQVQJCQkJCQkJCUdldEZvbnRBc2NlbnQoaW50MzJfdCBuRm9udEluZGV4LCBGWF9GTE9BVCBmRm9udFNpemUpOwpAQCAtNTY4LDggKzU2OCw4IEBACiAgICAgaW50MzJfdAkJCQkJCQkJR2V0QWxpZ25tZW50KGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIFNlY0luZm8pOwogCiAgICAgdm9pZAkJCQkJCQkJCUNsZWFyU2VjdGlvblJpZ2h0V29yZHMoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSk7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJQWp1c3RMaW5lSGVhZGVyKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIEZYX0JPT0wgYlByZXZPck5leHQpIGNvbnN0OwotICAgIEZYX0JPT0wJCQkJCQkJCQlDbGVhckVtcHR5U2VjdGlvbihjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKTsKKyAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlBanVzdExpbmVIZWFkZXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgYm9vbCBiUHJldk9yTmV4dCkgY29uc3Q7CisgICAgYm9vbAkJCQkJCQkJCUNsZWFyRW1wdHlTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpOwogICAgIHZvaWQJCQkJCQkJCQlDbGVhckVtcHR5U2VjdGlvbnMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKTsKICAgICB2b2lkCQkJCQkJCQkJTGlua0xhdHRlclNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSk7CiAgICAgdm9pZAkJCQkJCQkJCUNsZWFyV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKTsKQEAgLTU3OCw3ICs1NzgsNyBAQAogcHJpdmF0ZToKICAgICBDUFZUX0Zsb2F0UmVjdAkJCQkJCQlSZWFycmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKTsKICAgICBGWF9GTE9BVAkJCQkJCQkJR2V0QXV0b0ZvbnRTaXplKCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUlzQmlnZ2VyKEZYX0ZMT0FUIGZGb250U2l6ZSk7CisgICAgYm9vbAkJCQkJCQkJCUlzQmlnZ2VyKEZYX0ZMT0FUIGZGb250U2l6ZSk7CiAgICAgQ1BWVF9GbG9hdFJlY3QJCQkJCQkJUmVhcnJhbmdlU2VjdGlvbnMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKTsKIHByaXZhdGU6CiAgICAgdm9pZAkJCQkJCQkJCVJlc2V0U2VjdGlvbkFycmF5KCk7CkBAIC01ODYsOSArNTg2LDkgQEAKICAgICBDUFZUX0FycmF5VGVtcGxhdGU8Q1NlY3Rpb24qPgkJCW1fU2VjdGlvbkFycmF5OwogICAgIGludDMyX3QJCQkJCQkJCW1fbkxpbWl0Q2hhcjsKICAgICBpbnQzMl90CQkJCQkJCQltX25DaGFyQXJyYXk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCW1fYk11bHRpTGluZTsKLSAgICBGWF9CT09MCQkJCQkJCQkJbV9iTGltaXRXaWR0aDsKLSAgICBGWF9CT09MCQkJCQkJCQkJbV9iQXV0b0ZvbnRTaXplOworICAgIGJvb2wJCQkJCQkJCQltX2JNdWx0aUxpbmU7CisgICAgYm9vbAkJCQkJCQkJCW1fYkxpbWl0V2lkdGg7CisgICAgYm9vbAkJCQkJCQkJCW1fYkF1dG9Gb250U2l6ZTsKICAgICBpbnQzMl90CQkJCQkJCQltX25BbGlnbm1lbnQ7CiAgICAgRlhfRkxPQVQJCQkJCQkJCW1fZkxpbmVMZWFkaW5nOwogICAgIEZYX0ZMT0FUCQkJCQkJCQltX2ZDaGFyU3BhY2U7CkBAIC01OTcsOCArNTk3LDggQEAKICAgICBGWF9GTE9BVAkJCQkJCQkJbV9mRm9udFNpemU7CiAKIHByaXZhdGU6Ci0gICAgRlhfQk9PTAkJCQkJCQkJCW1fYkluaXRpYWw7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCW1fYlJpY2hUZXh0OworICAgIGJvb2wJCQkJCQkJCQltX2JJbml0aWFsOworICAgIGJvb2wJCQkJCQkJCQltX2JSaWNoVGV4dDsKICAgICBJUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlciAqCQkJbV9wVlRQcm92aWRlcjsKICAgICBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqCQkJbV9wVlRJdGVyYXRvcjsKIH07CkBAIC02MDcsMTcgKzYwNywxNyBAQAogcHVibGljOgogICAgIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKENQREZfVmFyaWFibGVUZXh0ICogcFZUKTsKICAgICB2aXJ0dWFsIH5DUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcigpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlOZXh0V29yZCgpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlQcmV2V29yZCgpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlOZXh0TGluZSgpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlQcmV2TGluZSgpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlOZXh0U2VjdGlvbigpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlQcmV2U2VjdGlvbigpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlTZXRXb3JkKGNvbnN0IENQVlRfV29yZCAmIHdvcmQpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0OwotICAgIEZYX0JPT0wJCQkJCQkJCQlHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0OwotICAgIEZYX0JPT0wJCQkJCQkJCQlHZXRTZWN0aW9uKENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pIGNvbnN0OwotICAgIEZYX0JPT0wJCQkJCQkJCQlTZXRTZWN0aW9uKGNvbnN0IENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pOworICAgIGJvb2wJCQkJCQkJCQlOZXh0V29yZCgpOworICAgIGJvb2wJCQkJCQkJCQlQcmV2V29yZCgpOworICAgIGJvb2wJCQkJCQkJCQlOZXh0TGluZSgpOworICAgIGJvb2wJCQkJCQkJCQlQcmV2TGluZSgpOworICAgIGJvb2wJCQkJCQkJCQlOZXh0U2VjdGlvbigpOworICAgIGJvb2wJCQkJCQkJCQlQcmV2U2VjdGlvbigpOworICAgIGJvb2wJCQkJCQkJCQlTZXRXb3JkKGNvbnN0IENQVlRfV29yZCAmIHdvcmQpOworICAgIGJvb2wJCQkJCQkJCQlHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0OworICAgIGJvb2wJCQkJCQkJCQlHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0OworICAgIGJvb2wJCQkJCQkJCQlHZXRTZWN0aW9uKENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pIGNvbnN0OworICAgIGJvb2wJCQkJCQkJCQlTZXRTZWN0aW9uKGNvbnN0IENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pOwogICAgIHZvaWQJCQkJCQkJCQlTZXRBdChpbnQzMl90IG5Xb3JkSW5kZXgpOwogICAgIHZvaWQJCQkJCQkJCQlTZXRBdChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKTsKICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSAmCQkJCQlHZXRBdCgpIGNvbnN0CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL3RhZ2dlZF9pbnQuaCBiL2NvcmUvc3JjL2ZwZGZkb2MvdGFnZ2VkX2ludC5oCmluZGV4IDljNjQzYTYuLjEyNzk2MTcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvdGFnZ2VkX2ludC5oCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvdGFnZ2VkX2ludC5oCkBAIC0yNiw3ICsyNiw3IEBACiAgICAgdm9pZAkJTG9hZERvY1RyZWUoKTsKICAgICB2b2lkCQlMb2FkUGFnZVRyZWUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QpOwogICAgIENQREZfU3RydWN0RWxlbWVudEltcGwqIEFkZFBhZ2VOb2RlKENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQsIENGWF9NYXBQdHJUb1B0ciYgbWFwLCBpbnQgbkxldmVsID0gMCk7Ci0gICAgRlhfQk9PTAkJQWRkVG9wTGV2ZWxOb2RlKENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfU3RydWN0RWxlbWVudEltcGwqIHBFbGVtZW50KTsKKyAgICBib29sCQlBZGRUb3BMZXZlbE5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcEVsZW1lbnQpOwogcHJvdGVjdGVkOgogICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSoJbV9wVHJlZVJvb3Q7CiAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KgltX3BSb2xlTWFwOwpAQCAtNjcsMTYgKzY3LDE2IEBACiAgICAgICAgIHJldHVybiAmbV9PYmplY3RBcnJheTsKICAgICB9CiAKLSAgICBDUERGX09iamVjdCoJCQlHZXRBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwgRlhfRkxPQVQgZkxldmVsID0gMC4wRik7CisgICAgQ1BERl9PYmplY3QqCQkJR2V0QXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGJvb2wgYkluaGVyaXRhYmxlID0gZmFsc2UsIEZYX0ZMT0FUIGZMZXZlbCA9IDAuMEYpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBpbnQgc3ViaW5kZXggPSAtMSk7Ci0gICAgRlhfQVJHQgkJCQkJR2V0Q29sb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9BUkdCIGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsIGludCBzdWJpbmRleCA9IC0xKTsKLSAgICBGWF9GTE9BVAkJCQlHZXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9GTE9BVCBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBpbnQgc3ViaW5kZXggPSAtMSk7Ci0gICAgaW50CQkJCQkJR2V0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBpbnQgc3ViaW5kZXggPSAtMSk7CisgICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBkZWZhdWx0X3ZhbHVlLCBib29sIGJJbmhlcml0YWJsZSA9IGZhbHNlLCBpbnQgc3ViaW5kZXggPSAtMSk7CisgICAgRlhfQVJHQgkJCQkJR2V0Q29sb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9BUkdCIGRlZmF1bHRfdmFsdWUsIGJvb2wgYkluaGVyaXRhYmxlID0gZmFsc2UsIGludCBzdWJpbmRleCA9IC0xKTsKKyAgICBGWF9GTE9BVAkJCQlHZXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9GTE9BVCBkZWZhdWx0X3ZhbHVlLCBib29sIGJJbmhlcml0YWJsZSA9IGZhbHNlLCBpbnQgc3ViaW5kZXggPSAtMSk7CisgICAgaW50CQkJCQkJR2V0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCBkZWZhdWx0X3ZhbHVlLCBib29sIGJJbmhlcml0YWJsZSA9IGZhbHNlLCBpbnQgc3ViaW5kZXggPSAtMSk7CiAgICAgQ0ZYX1B0ckFycmF5CQkJbV9PYmplY3RBcnJheTsKICAgICB2b2lkCQkJCQlMb2FkS2lkcyhDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKICAgICB2b2lkCQkJCQlMb2FkS2lkKEZYX0RXT1JEIFBhZ2VPYmpOdW0sIENQREZfT2JqZWN0KiBwT2JqLCBDUERGX1N0cnVjdEtpZCogcEtpZCk7Ci0gICAgQ1BERl9PYmplY3QqCQkJR2V0QXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlLCBpbnQgc3ViaW5kZXgpOworICAgIENQREZfT2JqZWN0KgkJCUdldEF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBib29sIGJJbmhlcml0YWJsZSwgaW50IHN1YmluZGV4KTsKICAgICBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKglSZXRhaW4oKTsKICAgICB2b2lkCQkJCQlSZWxlYXNlKCk7CiBwcm90ZWN0ZWQ6CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHQuY3BwIGIvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0LmNwcAppbmRleCA3MjAzYTY5Li43ZDcyOGE4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5jcHAKQEAgLTI4OSw3ICsyODksNyBAQAogfQogdm9pZCBOb3JtYWxpemVDb21wb3NpdGVDaGFyKEZYX1dDSEFSIHdDaGFyLCBDRlhfV2lkZVN0cmluZyYgc0Rlc3QpCiB7Ci0gICAgd0NoYXIgPSBGWF9HZXRNaXJyb3JDaGFyKHdDaGFyLCBUUlVFLCBGQUxTRSk7CisgICAgd0NoYXIgPSBGWF9HZXRNaXJyb3JDaGFyKHdDaGFyLCB0cnVlLCBmYWxzZSk7CiAgICAgRlhfV0NIQVIqIHBEc3QgPSBOVUxMOwogICAgIEZYX1NUUlNJWkUgbkNvdW50ID0gRlhfVW5pY29kZV9HZXROb3JtYWxpemF0aW9uKHdDaGFyLCBwRHN0KTsKICAgICBpZiAobkNvdW50IDwgMSApIHsKQEAgLTMxMSw3ICszMTEsNyBAQAogICAgIENGWF9XaWRlU3RyaW5nIHNCdWZmZXI7CiAgICAgbm9uc3RkOjp1bmlxdWVfcHRyPElGWF9CaWRpQ2hhcj4gcEJpZGlDaGFyKElGWF9CaWRpQ2hhcjo6Q3JlYXRlKCkpOwogICAgIENGWF9Xb3JkQXJyYXkgb3JkZXI7Ci0gICAgRlhfQk9PTCBiUjJMID0gRkFMU0U7CisgICAgYm9vbCBiUjJMID0gZmFsc2U7CiAgICAgaW50MzJfdCBzdGFydCA9IDAsIGNvdW50ID0gMCwgaSA9IDA7CiAgICAgaW50IG5SMkwgPSAwLCBuTDJSID0gMDsKICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyLkdldExlbmd0aCgpOyBpKyspIHsKQEAgLTM0Myw3ICszNDMsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmKG5SMkwgPiAwICYmIG5SMkwgPj0gbkwyUikgewotICAgICAgICBiUjJMID0gVFJVRTsKKyAgICAgICAgYlIyTCA9IHRydWU7CiAgICAgfQogICAgIGlmKGJSMkwpIHsKICAgICAgICAgaW50IGNvdW50ID0gb3JkZXIuR2V0U2l6ZSgpOwpAQCAtMzU3LDcgKzM1Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpID0gajsKLSAgICAgICAgICAgICAgICBGWF9CT09MIGJTeW1ib2wgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBib29sIGJTeW1ib2wgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB3aGlsZShpID4gMCAmJiBvcmRlci5HZXRBdChpKSAhPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgIGJTeW1ib2wgPSAhb3JkZXIuR2V0QXQoaSk7CiAgICAgICAgICAgICAgICAgICAgIGkgLT0gMzsKQEAgLTM4OSw3ICszODksNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaW50IGNvdW50ID0gb3JkZXIuR2V0U2l6ZSgpOwotICAgICAgICBGWF9CT09MIGJMMlIgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiTDJSID0gZmFsc2U7CiAgICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBjb3VudDsgaiArPSAzKSB7CiAgICAgICAgICAgICBpbnQgcmV0ID0gb3JkZXIuR2V0QXQoaiArIDIpOwogICAgICAgICAgICAgaW50IHN0YXJ0ID0gb3JkZXIuR2V0QXQoaik7CkBAIC00MDUsNyArNDA1LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYoaSA9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgIGogPSAtMzsKLSAgICAgICAgICAgICAgICAgICAgYkwyUiA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJMMlIgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW50IGVuZCA9IHN0ci5HZXRMZW5ndGgoKSAtIDE7CkBAIC00MjcsMTUgKzQyNywxNSBAQAogICAgIHN0ci5FbXB0eSgpOwogICAgIHN0ciArPSBzQnVmZmVyOwogfQotc3RhdGljIEZYX0JPT0wgSXNOdW1iZXIoQ0ZYX1dpZGVTdHJpbmcmIHN0cikKK3N0YXRpYyBib29sIElzTnVtYmVyKENGWF9XaWRlU3RyaW5nJiBzdHIpCiB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIuR2V0TGVuZ3RoKCk7IGkgKyspIHsKICAgICAgICAgRlhfV0NIQVIgY2ggPSBzdHJbaV07CiAgICAgICAgIGlmICgoY2ggPCAnMCcgfHwgY2ggPiAnOScpICYmIGNoICE9ICctJyAmJiBjaCAhPSAnKycgJiYgY2ggIT0gJy4nICYmIGNoICE9ICcgJykgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDVGV4dFBhZ2U6OkZpbmRDb2x1bW5zKCkKIHsKQEAgLTUzNCwxOCArNTM0LDE4IEBACiAgICAgcFRleHQtPm1fcENvbHVtbiA9IE5VTEw7CiAgICAgbV9UZXh0TGlzdC5JbnNlcnRBdChpLCBwVGV4dCk7CiB9Ci1GWF9CT09MIEdldEludGVyc2VjdGlvbihGWF9GTE9BVCBsb3cxLCBGWF9GTE9BVCBoaWdoMSwgRlhfRkxPQVQgbG93MiwgRlhfRkxPQVQgaGlnaDIsCitib29sIEdldEludGVyc2VjdGlvbihGWF9GTE9BVCBsb3cxLCBGWF9GTE9BVCBoaWdoMSwgRlhfRkxPQVQgbG93MiwgRlhfRkxPQVQgaGlnaDIsCiAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgaW50ZXJsb3csIEZYX0ZMT0FUJiBpbnRlcmhpZ2gpOwotRlhfQk9PTCBDVGV4dEJhc2VMaW5lOjpDYW5NZXJnZShDVGV4dEJhc2VMaW5lKiBwT3RoZXIpCitib29sIENUZXh0QmFzZUxpbmU6OkNhbk1lcmdlKENUZXh0QmFzZUxpbmUqIHBPdGhlcikKIHsKICAgICBGWF9GTE9BVCBpbnRlcl90b3AsIGludGVyX2JvdHRvbTsKICAgICBpZiAoIUdldEludGVyc2VjdGlvbihtX0JvdHRvbSwgbV9Ub3AsIHBPdGhlci0+bV9Cb3R0b20sIHBPdGhlci0+bV9Ub3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJfYm90dG9tLCBpbnRlcl90b3ApKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWF9GTE9BVCBpbnRlcl9oID0gaW50ZXJfdG9wIC0gaW50ZXJfYm90dG9tOwogICAgIGlmIChpbnRlcl9oIDwgKG1fVG9wIC0gbV9Cb3R0b20pIC8gMiAmJiBpbnRlcl9oIDwgKHBPdGhlci0+bV9Ub3AgLSBwT3RoZXItPm1fQm90dG9tKSAvIDIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX0ZMT0FUIGR5ID0gKEZYX0ZMT0FUKUZYU1lTX2ZhYnMobV9CYXNlTGluZSAtIHBPdGhlci0+bV9CYXNlTGluZSk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1RleHRMaXN0LkdldFNpemUoKTsgaSArKykgewpAQCAtNTYzLDExICs1NjMsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChkeSA+PSAocFRleHQtPm1fQm90dG9tIC0gcFRleHQtPm1fVG9wKSAvIDIgfHwKICAgICAgICAgICAgICAgICAgICAgZHkgPj0gKHBPdGhlclRleHQtPm1fQm90dG9tIC0gcE90aGVyVGV4dC0+bV9Ub3ApIC8gMikgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENUZXh0QmFzZUxpbmU6Ok1lcmdlKENUZXh0QmFzZUxpbmUqIHBPdGhlcikKIHsKQEAgLTU3Nyw3ICs1NzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIHBUZXh0LT5tX1NwYWNlV2lkdGgsIHBUZXh0LT5tX0ZvbnRTaXplViwgcFRleHQtPm1fVGV4dCk7CiAgICAgfQogfQotRlhfQk9PTCBDVGV4dEJhc2VMaW5lOjpHZXRXaWR0aChGWF9GTE9BVCYgbGVmdHgsIEZYX0ZMT0FUJiByaWdodHgpCitib29sIENUZXh0QmFzZUxpbmU6OkdldFdpZHRoKEZYX0ZMT0FUJiBsZWZ0eCwgRlhfRkxPQVQmIHJpZ2h0eCkKIHsKICAgICBpbnQgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgbV9UZXh0TGlzdC5HZXRTaXplKCk7IGkgKyspIHsKQEAgLTU4Nyw3ICs1ODcsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChpID09IG1fVGV4dExpc3QuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDVGV4dEJveCogcFRleHQgPSAoQ1RleHRCb3gqKW1fVGV4dExpc3QuR2V0QXQoaSk7CiAgICAgbGVmdHggPSBwVGV4dC0+bV9MZWZ0OwpAQCAtNTk5LDcgKzU5OSw3IEBACiAgICAgfQogICAgIHBUZXh0ID0gKENUZXh0Qm94KiltX1RleHRMaXN0LkdldEF0KGkpOwogICAgIHJpZ2h0eCA9IHBUZXh0LT5tX1JpZ2h0OwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDVGV4dEJhc2VMaW5lOjpNZXJnZUJveGVzKCkKIHsKQEAgLTcyNCw4ICs3MjQsOCBAQAogICAgIENQREZfUGFnZSBwYWdlOwogICAgIHBhZ2UuTG9hZChwRG9jLCBwUGFnZSk7CiAgICAgQ1BERl9QYXJzZU9wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLm1fYlRleHRPbmx5ID0gVFJVRTsKLSAgICBvcHRpb25zLm1fYlNlcGFyYXRlRm9ybSA9IEZBTFNFOworICAgIG9wdGlvbnMubV9iVGV4dE9ubHkgPSB0cnVlOworICAgIG9wdGlvbnMubV9iU2VwYXJhdGVGb3JtID0gZmFsc2U7CiAgICAgcGFnZS5QYXJzZUNvbnRlbnQoJm9wdGlvbnMpOwogICAgIENGWF9GbG9hdFJlY3QgcGFnZV9iYm94ID0gcGFnZS5HZXRQYWdlQkJveCgpOwogICAgIGlmIChmbGFncyAmIFBERjJUWFRfQVVUT19ST1RBVEUpIHsKQEAgLTczNCw3ICs3MzQsNyBAQAogICAgIENUZXh0UGFnZSB0ZXh0czsKICAgICB0ZXh0cy5tX2JBdXRvV2lkdGggPSBmbGFncyAmIFBERjJUWFRfQVVUT19XSURUSDsKICAgICB0ZXh0cy5tX2JLZWVwQ29sdW1uID0gZmxhZ3MgJiBQREYyVFhUX0tFRVBfQ09MVU1OOwotICAgIHRleHRzLm1fYkJyZWFrU3BhY2UgPSBUUlVFOworICAgIHRleHRzLm1fYkJyZWFrU3BhY2UgPSB0cnVlOwogICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBhZ2UuR2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOwogICAgIHdoaWxlIChwb3MpIHsKICAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqZWN0ID0gcGFnZS5HZXROZXh0T2JqZWN0KHBvcyk7CkBAIC03NjMsNyArNzYzLDcgQEAKICAgICAgICAgbGluZXMuQWRkKHN0cik7CiAgICAgfQogfQotZXh0ZXJuIHZvaWQgX1BERl9HZXRUZXh0U3RyZWFtX1VuaWNvZGUoQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsIENQREZfUGFnZU9iamVjdHMqIHBQYWdlLCBGWF9CT09MIGJVc2VMRiwKK2V4dGVybiB2b2lkIF9QREZfR2V0VGV4dFN0cmVhbV9Vbmljb2RlKENGWF9XaWRlVGV4dEJ1ZiYgYnVmZmVyLCBDUERGX1BhZ2VPYmplY3RzKiBwUGFnZSwgYm9vbCBiVXNlTEYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHBPYmpBcnJheSk7CiB2b2lkIFBERl9HZXRUZXh0U3RyZWFtX1VuaWNvZGUoQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsIENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcFBhZ2UsIEZYX0RXT1JEIGZsYWdzKQogewpAQCAtNzcxLDggKzc3MSw4IEBACiAgICAgQ1BERl9QYWdlIHBhZ2U7CiAgICAgcGFnZS5Mb2FkKHBEb2MsIHBQYWdlKTsKICAgICBDUERGX1BhcnNlT3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMubV9iVGV4dE9ubHkgPSBUUlVFOwotICAgIG9wdGlvbnMubV9iU2VwYXJhdGVGb3JtID0gRkFMU0U7CisgICAgb3B0aW9ucy5tX2JUZXh0T25seSA9IHRydWU7CisgICAgb3B0aW9ucy5tX2JTZXBhcmF0ZUZvcm0gPSBmYWxzZTsKICAgICBwYWdlLlBhcnNlQ29udGVudCgmb3B0aW9ucyk7Ci0gICAgX1BERl9HZXRUZXh0U3RyZWFtX1VuaWNvZGUoYnVmZmVyLCAmcGFnZSwgVFJVRSwgTlVMTCk7CisgICAgX1BERl9HZXRUZXh0U3RyZWFtX1VuaWNvZGUoYnVmZmVyLCAmcGFnZSwgdHJ1ZSwgTlVMTCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHRfaW50LmNwcCBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9pbnQuY3BwCmluZGV4IGMxYWFhZDguLmY3NzdhM2QgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9pbnQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9pbnQuY3BwCkBAIC0xOSwxMCArMTksMTAgQEAKIAogbmFtZXNwYWNlIHsKIAotRlhfQk9PTCBfSXNJZ25vcmVTcGFjZUNoYXJhY3RlcihGWF9XQ0hBUiBjdXJDaGFyKQorYm9vbCBfSXNJZ25vcmVTcGFjZUNoYXJhY3RlcihGWF9XQ0hBUiBjdXJDaGFyKQogewogICAgIGlmKGN1ckNoYXIgPCAyNTUgKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoIChjdXJDaGFyID49IDB4MDYwMCAmJiBjdXJDaGFyIDw9IDB4MDZGRikKICAgICAgICAgICAgIHx8IChjdXJDaGFyID49IDB4RkU3MCAmJiBjdXJDaGFyIDw9IDB4RkVGRikKQEAgLTMzLDkgKzMzLDkgQEAKICAgICAgICAgICAgIHx8IChjdXJDaGFyID49IDB4MkRFMCAmJiBjdXJDaGFyIDw9IDB4MkRGRikKICAgICAgICAgICAgIHx8IGN1ckNoYXIgPT0gODQ2NwogICAgICAgICAgICAgfHwgKGN1ckNoYXIgPj0gMHgyMDAwICYmIGN1ckNoYXIgPD0gMHgyMDZGKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIEZYX0ZMT0FUIF9Ob3JtYWxpemVUaHJlc2hvbGQoRlhfRkxPQVQgdGhyZXNob2xkKQpAQCAtNTgsNyArNTgsNyBAQAogICAgIEZYX0ZMT0FUIGJhc2VTcGFjZSA9IDAuMDsKICAgICBjb25zdCBpbnQgbkl0ZW1zID0gcFRleHRPYmotPkNvdW50SXRlbXMoKTsKICAgICBpZiAocFRleHRPYmotPm1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX0NoYXJTcGFjZSAmJiBuSXRlbXMgPj0gMykgewotICAgICAgICBGWF9CT09MIGJBbGxDaGFyID0gVFJVRTsKKyAgICAgICAgYm9vbCBiQWxsQ2hhciA9IHRydWU7CiAgICAgICAgIEZYX0ZMT0FUIHNwYWNpbmcgPSBtYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UoCiAgICAgICAgICAgICBwVGV4dE9iai0+bV9UZXh0U3RhdGUuR2V0T2JqZWN0KCktPm1fQ2hhclNwYWNlKTsKICAgICAgICAgYmFzZVNwYWNlID0gc3BhY2luZzsKQEAgLTY5LDcgKzY5LDcgQEAKICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250c2l6ZV9oID0gcFRleHRPYmotPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplSCgpOwogICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGtlcm5pbmcgPSAtZm9udHNpemVfaCAqIGl0ZW0ubV9PcmlnaW5YIC8gMTAwMDsKICAgICAgICAgICAgICAgICBiYXNlU3BhY2UgPSBzdGQ6Om1pbihiYXNlU3BhY2UsIGtlcm5pbmcgKyBzcGFjaW5nKTsKLSAgICAgICAgICAgICAgICBiQWxsQ2hhciA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJBbGxDaGFyID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJhc2VTcGFjZSA8IDAuMCB8fCAobkl0ZW1zID09IDMgJiYgIWJBbGxDaGFyKSkgewpAQCAtODIsNyArODIsNyBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIENQREZUZXh0X1BhcnNlT3B0aW9uczo6Q1BERlRleHRfUGFyc2VPcHRpb25zKCkKLSAgICA6IG1fYkdldENoYXJDb2RlT25seShGQUxTRSksIG1fYk5vcm1hbGl6ZU9ianMoVFJVRSksIG1fYk91dHB1dEh5cGhlbihGQUxTRSkKKyAgICA6IG1fYkdldENoYXJDb2RlT25seShmYWxzZSksIG1fYk5vcm1hbGl6ZU9ianModHJ1ZSksIG1fYk91dHB1dEh5cGhlbihmYWxzZSkKIHsKIH0KIElQREZfVGV4dFBhZ2UqIElQREZfVGV4dFBhZ2U6OkNyZWF0ZVRleHRQYWdlKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIENQREZUZXh0X1BhcnNlT3B0aW9ucyBQYXJzZXJPcHRpb25zKQpAQCAtMTIwLDcgKzEyMCw3IEBACiAgICAgOiBtX2NoYXJMaXN0KDUxMiksCiAgICAgICBtX1RlbXBDaGFyTGlzdCg1MCksCiAgICAgICBtX3BQcmVUZXh0T2JqKE5VTEwpLAotICAgICAgbV9Jc1BhcnNlcmVkKEZBTFNFKSwKKyAgICAgIG1fSXNQYXJzZXJlZChmYWxzZSksCiAgICAgICBtX1RleHRsaW5lRGlyKC0xKSwKICAgICAgIG1fQ3VybGluZVJlY3QoMCwgMCwgMCwgMCkKIHsKQEAgLTEzNCw3ICsxMzQsNyBAQAogICAgICwgbV9jaGFyTGlzdCg1MTIpCiAgICAgLCBtX1RlbXBDaGFyTGlzdCg1MCkKICAgICAsIG1fcFByZVRleHRPYmooTlVMTCkKLSAgICAsIG1fSXNQYXJzZXJlZChGQUxTRSkKKyAgICAsIG1fSXNQYXJzZXJlZChmYWxzZSkKICAgICAsIG1fVGV4dGxpbmVEaXIoLTEpCiAgICAgLCBtX0N1cmxpbmVSZWN0KDAsIDAsIDAsIDApCiB7CkBAIC0xNDcsNyArMTQ3LDcgQEAKICAgICA6IG1fY2hhckxpc3QoNTEyKSwKICAgICAgIG1fVGVtcENoYXJMaXN0KDUwKSwKICAgICAgIG1fcFByZVRleHRPYmooTlVMTCksCi0gICAgICBtX0lzUGFyc2VyZWQoRkFMU0UpLAorICAgICAgbV9Jc1BhcnNlcmVkKGZhbHNlKSwKICAgICAgIG1fVGV4dGxpbmVEaXIoLTEpLAogICAgICAgbV9DdXJsaW5lUmVjdCgwLCAwLCAwLCAwKQogewpAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgQ0ZYX0Zsb2F0UmVjdCBwYWdlUmVjdCA9IHBQYWdlLT5DYWxjQm91bmRpbmdCb3goKTsKICAgICBtX0Rpc3BsYXlNYXRyaXggPSBDRlhfQWZmaW5lTWF0cml4KDEsIDAsIDAsIC0xLCBwYWdlUmVjdC5yaWdodCwgcGFnZVJlY3QudG9wKTsKIH0KLXZvaWQgQ1BERl9UZXh0UGFnZTo6Tm9ybWFsaXplT2JqZWN0cyhGWF9CT09MIGJOb3JtYWxpemUpCit2b2lkIENQREZfVGV4dFBhZ2U6Ok5vcm1hbGl6ZU9iamVjdHMoYm9vbCBiTm9ybWFsaXplKQogewogICAgIG1fUGFyc2VPcHRpb25zLm1fYk5vcm1hbGl6ZU9ianMgPSBiTm9ybWFsaXplOwogfQpAQCAtMTc3LDE4ICsxNzcsMTggQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9Ci1GWF9CT09MIENQREZfVGV4dFBhZ2U6OlBhcnNlVGV4dFBhZ2UoKQorYm9vbCBDUERGX1RleHRQYWdlOjpQYXJzZVRleHRQYWdlKCkKIHsKICAgICBpZiAoIW1fcFBhZ2UpIHsKLSAgICAgICAgbV9Jc1BhcnNlcmVkID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgbV9Jc1BhcnNlcmVkID0gZmFsc2U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgbV9Jc1BhcnNlcmVkID0gRkFMU0U7CisgICAgbV9Jc1BhcnNlcmVkID0gZmFsc2U7CiAgICAgbV9UZXh0QnVmLkNsZWFyKCk7CiAgICAgbV9jaGFyTGlzdC5SZW1vdmVBbGwoKTsKICAgICBtX3BQcmVUZXh0T2JqID0gTlVMTDsKICAgICBQcm9jZXNzT2JqZWN0KCk7Ci0gICAgbV9Jc1BhcnNlcmVkID0gVFJVRTsKKyAgICBtX0lzUGFyc2VyZWQgPSB0cnVlOwogICAgIGlmKCFtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKICAgICAgICAgbV9DaGFySW5kZXguUmVtb3ZlQWxsKCk7CiAgICAgICAgIGludCBuQ291bnQgPSBtX2NoYXJMaXN0LkdldFNpemUoKTsKQEAgLTE5NywxNSArMTk3LDE1IEBACiAgICAgICAgIH0KICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7CiAgICAgICAgICAgICBpbnQgaW5kZXhTaXplID0gbV9DaGFySW5kZXguR2V0U2l6ZSgpOwotICAgICAgICAgICAgRlhfQk9PTCBiTm9ybWFsID0gRkFMU0U7CisgICAgICAgICAgICBib29sIGJOb3JtYWwgPSBmYWxzZTsKICAgICAgICAgICAgIFBBR0VDSEFSX0lORk8gY2hhcmluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoaSk7CiAgICAgICAgICAgICBpZihjaGFyaW5mby5tX0ZsYWcgPT0gRlBERlRFWFRfQ0hBUl9HRU5FUkFURUQpIHsKLSAgICAgICAgICAgICAgICBiTm9ybWFsID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiTm9ybWFsID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYoY2hhcmluZm8ubV9Vbmljb2RlID09IDAgfHwgSXNDb250cm9sQ2hhcihjaGFyaW5mbykpCi0gICAgICAgICAgICAgICAgYk5vcm1hbCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJOb3JtYWwgPSBmYWxzZTsKICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGJOb3JtYWwgPSBUUlVFOworICAgICAgICAgICAgICAgIGJOb3JtYWwgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYoYk5vcm1hbCkgewogICAgICAgICAgICAgICAgIGlmKGluZGV4U2l6ZSAlIDIpIHsKQEAgLTIzMiw3ICsyMzIsNyBAQAogICAgICAgICAgICAgbV9DaGFySW5kZXguUmVtb3ZlQXQoaW5kZXhTaXplIC0gMSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBpbnQJQ1BERl9UZXh0UGFnZTo6Q291bnRDaGFycygpIGNvbnN0CiB7CkBAIC0yODMsNyArMjgzLDcgQEAKICAgICBDUERGX1RleHRPYmplY3QqCXBDdXJPYmogPSBOVUxMOwogICAgIENGWF9GbG9hdFJlY3QJCXJlY3Q7CiAgICAgaW50CQkJCQljdXJQb3MgPSBzdGFydDsKLSAgICBGWF9CT09MCQkJCWZsYWdOZXdSZWN0ID0gVFJVRTsKKyAgICBib29sCQkJCWZsYWdOZXdSZWN0ID0gdHJ1ZTsKICAgICBpZiAobkNvdW50ICsgc3RhcnQgPiBtX2NoYXJMaXN0LkdldFNpemUoKSB8fCBuQ291bnQgPT0gLTEpIHsKICAgICAgICAgbkNvdW50ID0gbV9jaGFyTGlzdC5HZXRTaXplKCkgLSBzdGFydDsKICAgICB9CkBAIC0zMDEsNyArMzAxLDcgQEAKICAgICAgICAgaWYgKHBDdXJPYmogIT0gaW5mb19jdXJjaGFyLm1fcFRleHRPYmopIHsKICAgICAgICAgICAgIHJlY3RBcnJheS5BZGQocmVjdCk7CiAgICAgICAgICAgICBwQ3VyT2JqID0gaW5mb19jdXJjaGFyLm1fcFRleHRPYmo7Ci0gICAgICAgICAgICBmbGFnTmV3UmVjdCA9IFRSVUU7CisgICAgICAgICAgICBmbGFnTmV3UmVjdCA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZsYWdOZXdSZWN0KSB7CiAgICAgICAgICAgICBGWF9GTE9BVCBvcmdYID0gaW5mb19jdXJjaGFyLm1fT3JpZ2luWCwgb3JnWSA9IGluZm9fY3VyY2hhci5tX09yaWdpblk7CkBAIC0zMjYsNyArMzI2LDcgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmVjdC50b3AgPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94LnRvcDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsYWdOZXdSZWN0ID0gRkFMU0U7CisgICAgICAgICAgICBmbGFnTmV3UmVjdCA9IGZhbHNlOwogICAgICAgICAgICAgcmVjdCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3g7CiAgICAgICAgICAgICByZWN0Lk5vcm1hbGl6ZSgpOwogICAgICAgICB9IGVsc2UgewpAQCAtMzk5LDggKzM5OSw4IEBACiAgICAgaW50IG5Db3VudCA9IG1fY2hhckxpc3QuR2V0U2l6ZSgpOwogICAgIGludCBwb3MgPSAwOwogICAgIEZYX0ZMT0FUIHBvc3kgPSAwOwotICAgIEZYX0JPT0wgSXNDb250YWluUHJlQ2hhciA9IEZBTFNFOwotICAgIEZYX0JPT0wJSVNBZGRMaW5lRmVlZCA9IEZBTFNFOworICAgIGJvb2wgSXNDb250YWluUHJlQ2hhciA9IGZhbHNlOworICAgIGJvb2wJSVNBZGRMaW5lRmVlZCA9IGZhbHNlOwogICAgIHdoaWxlIChwb3MgPCBuQ291bnQpIHsKICAgICAgICAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChwb3MrKyk7CiAgICAgICAgIGlmIChJc1JlY3RJbnRlcnNlY3QocmVjdCwgY2hhcmluZm8ubV9DaGFyQm94KSkgewpAQCAtNDEwLDIwICs0MTAsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgc3RyVGV4dCArPSBMIlxyXG4iOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBUUlVFOwotICAgICAgICAgICAgSVNBZGRMaW5lRmVlZCA9IEZBTFNFOworICAgICAgICAgICAgSXNDb250YWluUHJlQ2hhciA9IHRydWU7CisgICAgICAgICAgICBJU0FkZExpbmVGZWVkID0gZmFsc2U7CiAgICAgICAgICAgICBpZiAoY2hhcmluZm8ubV9Vbmljb2RlKSB7CiAgICAgICAgICAgICAgICAgc3RyVGV4dCArPSBjaGFyaW5mby5tX1VuaWNvZGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoY2hhcmluZm8ubV9Vbmljb2RlID09IDMyKSB7CiAgICAgICAgICAgICBpZiAoSXNDb250YWluUHJlQ2hhciAmJiBjaGFyaW5mby5tX1VuaWNvZGUpIHsKICAgICAgICAgICAgICAgICBzdHJUZXh0ICs9IGNoYXJpbmZvLm1fVW5pY29kZTsKLSAgICAgICAgICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgSVNBZGRMaW5lRmVlZCA9IEZBTFNFOworICAgICAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBJU0FkZExpbmVGZWVkID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gRkFMU0U7Ci0gICAgICAgICAgICBJU0FkZExpbmVGZWVkID0gVFJVRTsKKyAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBmYWxzZTsKKyAgICAgICAgICAgIElTQWRkTGluZUZlZWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBzdHJUZXh0OwpAQCAtNDM3LDcgKzQzNyw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgQ0ZYX0Zsb2F0UmVjdAkJY3VyUmVjdDsKLSAgICBGWF9CT09MCQkJCWZsYWdOZXdSZWN0ID0gVFJVRTsKKyAgICBib29sCQkJCWZsYWdOZXdSZWN0ID0gdHJ1ZTsKICAgICBDUERGX1RleHRPYmplY3QqCXBDdXJPYmogPSBOVUxMOwogICAgIGludCBuQ291bnQgPSBtX2NoYXJMaXN0LkdldFNpemUoKTsKICAgICBpbnQgcG9zID0gMDsKQEAgLTQ1MywxMSArNDUzLDExIEBACiAgICAgICAgICAgICBpZiAocEN1ck9iaiAhPSBpbmZvX2N1cmNoYXIubV9wVGV4dE9iaikgewogICAgICAgICAgICAgICAgIHJlc1JlY3RBcnJheS5BZGQoY3VyUmVjdCk7CiAgICAgICAgICAgICAgICAgcEN1ck9iaiA9IGluZm9fY3VyY2hhci5tX3BUZXh0T2JqOwotICAgICAgICAgICAgICAgIGZsYWdOZXdSZWN0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBmbGFnTmV3UmVjdCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZmxhZ05ld1JlY3QpIHsKICAgICAgICAgICAgICAgICBjdXJSZWN0ID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveDsKLSAgICAgICAgICAgICAgICBmbGFnTmV3UmVjdCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGZsYWdOZXdSZWN0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgY3VyUmVjdC5Ob3JtYWxpemUoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaW5mb19jdXJjaGFyLm1fQ2hhckJveC5Ob3JtYWxpemUoKTsKQEAgLTYyNiwxMyArNjI2LDEzIEBACiAgICAgcmlnaHQgPSBtX1NlbFJlY3RzLkdldEF0KHJlY3RJbmRleCkucmlnaHQ7CiAgICAgYm90dG9tID0gbV9TZWxSZWN0cy5HZXRBdChyZWN0SW5kZXgpLmJvdHRvbTsKIH0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6R2V0QmFzZWxpbmVSb3RhdGUoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQmIFJvdGF0ZSkKK2Jvb2wgQ1BERl9UZXh0UGFnZTo6R2V0QmFzZWxpbmVSb3RhdGUoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQmIFJvdGF0ZSkKIHsKICAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmKGVuZCA9PSBzdGFydCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfRkxPQVQgZHgsIGR5OwogICAgIEZQREZfQ0hBUl9JTkZPIGluZm8xLCBpbmZvMjsKQEAgLTY0MSw3ICs2NDEsNyBAQAogICAgIHdoaWxlKGluZm8yLm1fQ2hhckJveC5XaWR0aCgpID09IDAgfHwgaW5mbzIubV9DaGFyQm94LkhlaWdodCgpID09IDApIHsKICAgICAgICAgZW5kLS07CiAgICAgICAgIGlmKGVuZCA8PSBzdGFydCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIEdldENoYXJJbmZvKGVuZCwgaW5mbzIpOwogICAgIH0KQEAgLTY2NCwxNiArNjY0LDE2IEBACiAgICAgfSBlbHNlIGlmKFJvdGF0ZSA+IDApIHsKICAgICAgICAgUm90YXRlID0gMzYwIC0gUm90YXRlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wJQ1BERl9UZXh0UGFnZTo6R2V0QmFzZWxpbmVSb3RhdGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCAsIGludCYgUm90YXRlKQorYm9vbAlDUERGX1RleHRQYWdlOjpHZXRCYXNlbGluZVJvdGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0ICwgaW50JiBSb3RhdGUpCiB7CiAgICAgaWYobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBpbnQgc3RhcnQsIGVuZCwgY291bnQsIG4gPSBDb3VudEJvdW5kZWRTZWdtZW50cyhyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwgVFJVRSk7CisgICAgaW50IHN0YXJ0LCBlbmQsIGNvdW50LCBuID0gQ291bnRCb3VuZGVkU2VnbWVudHMocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sIHRydWUpOwogICAgIGlmKG4gPCAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZihuID4gMSkgewogICAgICAgICBHZXRCb3VuZGVkU2VnbWVudChuIC0gMSwgc3RhcnQsIGNvdW50KTsKQEAgLTY4NSwxOCArNjg1LDE4IEBACiAgICAgfQogICAgIHJldHVybiBHZXRCYXNlbGluZVJvdGF0ZShzdGFydCwgZW5kLCBSb3RhdGUpOwogfQotRlhfQk9PTAlDUERGX1RleHRQYWdlOjpHZXRCYXNlbGluZVJvdGF0ZShpbnQgcmVjdEluZGV4LCBpbnQmIFJvdGF0ZSkKK2Jvb2wJQ1BERl9UZXh0UGFnZTo6R2V0QmFzZWxpbmVSb3RhdGUoaW50IHJlY3RJbmRleCwgaW50JiBSb3RhdGUpCiB7CiAgICAgaWYobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoIW1fSXNQYXJzZXJlZCB8fCByZWN0SW5kZXggPCAwIHx8IHJlY3RJbmRleCA+IG1fU2VsUmVjdHMuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBtX1NlbFJlY3RzLkdldEF0KHJlY3RJbmRleCk7CiAgICAgcmV0dXJuIEdldEJhc2VsaW5lUm90YXRlKHJlY3QgLCBSb3RhdGUpOwogfQotaW50CUNQREZfVGV4dFBhZ2U6OkNvdW50Qm91bmRlZFNlZ21lbnRzKEZYX0ZMT0FUIGxlZnQsIEZYX0ZMT0FUIHRvcCwgRlhfRkxPQVQgcmlnaHQsIEZYX0ZMT0FUIGJvdHRvbSwgRlhfQk9PTCBiQ29udGFpbnMgKQoraW50CUNQREZfVGV4dFBhZ2U6OkNvdW50Qm91bmRlZFNlZ21lbnRzKEZYX0ZMT0FUIGxlZnQsIEZYX0ZMT0FUIHRvcCwgRlhfRkxPQVQgcmlnaHQsIEZYX0ZMT0FUIGJvdHRvbSwgYm9vbCBiQ29udGFpbnMgKQogewogICAgIGlmKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgewogICAgICAgICByZXR1cm4gLTE7CkBAIC03MTIsOCArNzEyLDggQEAKICAgICBGUERGX1NFR01FTlQJc2VnbWVudDsKICAgICBzZWdtZW50Lm1fU3RhcnQgPSAwOwogICAgIHNlZ21lbnQubV9uQ291bnQgPSAwOwotICAgIEZYX0JPT0wJCXNlZ21lbnRTdGF0dXMgPSAwOwotICAgIEZYX0JPT0wJCUlzQ29udGFpblByZUNoYXIgPSBGQUxTRTsKKyAgICBib29sCQlzZWdtZW50U3RhdHVzID0gMDsKKyAgICBib29sCQlJc0NvbnRhaW5QcmVDaGFyID0gZmFsc2U7CiAgICAgd2hpbGUgKHBvcyA8IG5Db3VudCkgewogICAgICAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KHBvcyk7CiAgICAgICAgIGlmKGJDb250YWlucyAmJiByZWN0LkNvbnRhaW5zKGNoYXJpbmZvLm1fQ2hhckJveCkpIHsKQEAgLTcyNCw3ICs3MjQsNyBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChzZWdtZW50U3RhdHVzID09IDEpIHsKICAgICAgICAgICAgICAgICBzZWdtZW50Lm1fbkNvdW50Kys7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gVFJVRTsKKyAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSB0cnVlOwogICAgICAgICB9IGVsc2UgaWYgKCFiQ29udGFpbnMgJiYgKElzUmVjdEludGVyc2VjdChyZWN0LCBjaGFyaW5mby5tX0NoYXJCb3gpIHx8IHJlY3QuQ29udGFpbnMoY2hhcmluZm8ubV9PcmlnaW5YLCBjaGFyaW5mby5tX09yaWdpblkpKSkgewogICAgICAgICAgICAgaWYgKHNlZ21lbnRTdGF0dXMgPT0gMCB8fCBzZWdtZW50U3RhdHVzID09IDIpIHsKICAgICAgICAgICAgICAgICBzZWdtZW50Lm1fU3RhcnQgPSBwb3M7CkBAIC03MzMsOSArNzMzLDkgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VnbWVudFN0YXR1cyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgc2VnbWVudC5tX25Db3VudCsrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgSXNDb250YWluUHJlQ2hhciA9IFRSVUU7CisgICAgICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIGlmIChjaGFyaW5mby5tX1VuaWNvZGUgPT0gMzIpIHsKLSAgICAgICAgICAgIGlmIChJc0NvbnRhaW5QcmVDaGFyID09IFRSVUUpIHsKKyAgICAgICAgICAgIGlmIChJc0NvbnRhaW5QcmVDaGFyID09IHRydWUpIHsKICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudFN0YXR1cyA9PSAwIHx8IHNlZ21lbnRTdGF0dXMgPT0gMikgewogICAgICAgICAgICAgICAgICAgICBzZWdtZW50Lm1fU3RhcnQgPSBwb3M7CiAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQubV9uQ291bnQgPSAxOwpAQCAtNzQzLDcgKzc0Myw3IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWdtZW50U3RhdHVzID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5tX25Db3VudCsrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gRkFMU0U7CisgICAgICAgICAgICAgICAgSXNDb250YWluUHJlQ2hhciA9IGZhbHNlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudFN0YXR1cyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRTdGF0dXMgPSAyOwpAQCAtNzU5LDcgKzc1OSw3IEBACiAgICAgICAgICAgICAgICAgc2VnbWVudC5tX1N0YXJ0ID0gMDsKICAgICAgICAgICAgICAgICBzZWdtZW50Lm1fbkNvdW50ID0gMDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBGQUxTRTsKKyAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBwb3MrKzsKICAgICB9CkBAIC0xMDUzLDcgKzEwNTMsNyBAQAogICAgIFBBR0VDSEFSX0lORk8gSW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9UZW1wQ2hhckxpc3QuR2V0QXQoaSk7CiAgICAgaWYoIUlzQ29udHJvbENoYXIoSW5mbykpIHsKICAgICAgICAgSW5mby5tX0luZGV4ID0gbV9UZXh0QnVmLkdldExlbmd0aCgpOwotICAgICAgICBGWF9XQ0hBUiB3Q2hhciA9IEZYX0dldE1pcnJvckNoYXIoc3RyLkdldEF0KGkpLCBUUlVFLCBGQUxTRSk7CisgICAgICAgIEZYX1dDSEFSIHdDaGFyID0gRlhfR2V0TWlycm9yQ2hhcihzdHIuR2V0QXQoaSksIHRydWUsIGZhbHNlKTsKICAgICAgICAgRlhfV0NIQVIqIHBEc3QgPSBOVUxMOwogICAgICAgICBGWF9TVFJTSVpFIG5Db3VudCA9IEZYX1VuaWNvZGVfR2V0Tm9ybWFsaXphdGlvbih3Q2hhciwgcERzdCk7CiAgICAgICAgIGlmIChuQ291bnQgPj0gMSkgewpAQCAtMTA4OSwxMCArMTA4OSwxMCBAQAogICAgIG5vbnN0ZDo6dW5pcXVlX3B0cjxJRlhfQmlkaUNoYXI+IHBCaWRpQ2hhcihJRlhfQmlkaUNoYXI6OkNyZWF0ZSgpKTsKICAgICBDRlhfV2lkZVN0cmluZyBzdHIgPSBtX1RlbXBUZXh0QnVmLkdldFdpZGVTdHJpbmcoKTsKICAgICBDRlhfV29yZEFycmF5IG9yZGVyOwotICAgIEZYX0JPT0wgYlIyTCA9IEZBTFNFOworICAgIGJvb2wgYlIyTCA9IGZhbHNlOwogICAgIGludDMyX3Qgc3RhcnQgPSAwLCBjb3VudCA9IDA7CiAgICAgaW50IG5SMkwgPSAwLCBuTDJSID0gMDsKLSAgICBGWF9CT09MIGJQcmV2U3BhY2UgPSBGQUxTRTsKKyAgICBib29sIGJQcmV2U3BhY2UgPSBmYWxzZTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5HZXRMZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgIGlmKHN0ci5HZXRBdChpKSA9PSAzMikgewogICAgICAgICAgICAgaWYoYlByZXZTcGFjZSkgewpAQCAtMTEwMyw5ICsxMTAzLDkgQEAKICAgICAgICAgICAgICAgICBpLS07CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBiUHJldlNwYWNlID0gVFJVRTsKKyAgICAgICAgICAgIGJQcmV2U3BhY2UgPSB0cnVlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYlByZXZTcGFjZSA9IEZBTFNFOworICAgICAgICAgICAgYlByZXZTcGFjZSA9IGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmKHBCaWRpQ2hhci0+QXBwZW5kQ2hhcihzdHIuR2V0QXQoaSkpKSB7CiAgICAgICAgICAgICBpbnQzMl90IHJldCA9IHBCaWRpQ2hhci0+R2V0QmlkaUluZm8oc3RhcnQsIGNvdW50KTsKQEAgLTExMzUsNyArMTEzNSw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYoblIyTCA+IDAgJiYgblIyTCA+PSBuTDJSKSB7Ci0gICAgICAgIGJSMkwgPSBUUlVFOworICAgICAgICBiUjJMID0gdHJ1ZTsKICAgICB9CiAgICAgaWYgKG1fcGFyc2VyZmxhZyA9PSBGUERGVEVYVF9STFRCIHx8IGJSMkwpIHsKICAgICAgICAgaW50IGNvdW50ID0gb3JkZXIuR2V0U2l6ZSgpOwpAQCAtMTE0OSw3ICsxMTQ5LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGludCBqID0gaTsKLSAgICAgICAgICAgICAgICBGWF9CT09MIGJTeW1ib2wgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBib29sIGJTeW1ib2wgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB3aGlsZShqID4gMCAmJiBvcmRlci5HZXRBdChqKSAhPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgIGJTeW1ib2wgPSAhb3JkZXIuR2V0QXQoaik7CiAgICAgICAgICAgICAgICAgICAgIGogLT0gMzsKQEAgLTExODEsNyArMTE4MSw3IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpbnQgY291bnQgPSBvcmRlci5HZXRTaXplKCk7Ci0gICAgICAgIEZYX0JPT0wgYkwyUiA9IEZBTFNFOworICAgICAgICBib29sIGJMMlIgPSBmYWxzZTsKICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpICs9IDMpIHsKICAgICAgICAgICAgIGludCByZXQgPSBvcmRlci5HZXRBdChpICsgMik7CiAgICAgICAgICAgICBpbnQgc3RhcnQgPSBvcmRlci5HZXRBdChpKTsKQEAgLTExOTcsNyArMTE5Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmKGogPT0gMykgewogICAgICAgICAgICAgICAgICAgICBpID0gLTM7Ci0gICAgICAgICAgICAgICAgICAgIGJMMlIgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBiTDJSID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGludCBlbmQgPSBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCkgLSAxOwpAQCAtMTMwNyw3ICsxMzA3LDcgQEAKICAgICAgICAgcmV0dXJuIEZQREZURVhUX01DX1BBU1M7CiAgICAgfQogICAgIENGWF9XaWRlU3RyaW5nIGFjdFRleHQ7Ci0gICAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKKyAgICBib29sIGJFeGlzdCA9IGZhbHNlOwogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBOVUxMOwogICAgIGludCBuID0gMDsKICAgICBmb3IgKG4gPSAwOyBuIDwgbkNvbnRlbnRNYXJrOyBuKyspIHsKQEAgLTEzMTYsNyArMTMxNiw3IEBACiAgICAgICAgIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopaXRlbS5HZXRQYXJhbSgpOwogICAgICAgICBDUERGX1N0cmluZyogdGVtcCA9IChDUERGX1N0cmluZyopKHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIkFjdHVhbFRleHQiKSkgOiBOVUxMKTsKICAgICAgICAgaWYgKHRlbXApIHsKLSAgICAgICAgICAgIGJFeGlzdCA9IFRSVUU7CisgICAgICAgICAgICBiRXhpc3QgPSB0cnVlOwogICAgICAgICAgICAgYWN0VGV4dCA9IHRlbXAtPkdldFVuaWNvZGVUZXh0KCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzM4LDI0ICsxMzM4LDI0IEBACiAgICAgaWYgKG5JdGVtcyA8IDEpIHsKICAgICAgICAgcmV0dXJuIEZQREZURVhUX01DX1BBU1M7CiAgICAgfQotICAgIGJFeGlzdCA9IEZBTFNFOworICAgIGJFeGlzdCA9IGZhbHNlOwogICAgIGZvciAoRlhfU1RSU0laRSBpID0gMDsgaSA8IG5JdGVtczsgaSsrKSB7CiAgICAgICAgIEZYX1dDSEFSIHdDaGFyID0gYWN0VGV4dC5HZXRBdChpKTsKICAgICAgICAgaWYgKC0xID09IHBGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKHdDaGFyKSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiRXhpc3QgPSBUUlVFOworICAgICAgICAgICAgYkV4aXN0ID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogICAgIGlmICghYkV4aXN0KSB7CiAgICAgICAgIHJldHVybiBGUERGVEVYVF9NQ19QQVNTOwogICAgIH0KLSAgICBiRXhpc3QgPSBGQUxTRTsKKyAgICBiRXhpc3QgPSBmYWxzZTsKICAgICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBuSXRlbXM7IGkrKykgewogICAgICAgICBGWF9XQ0hBUiB3Q2hhciA9IGFjdFRleHQuR2V0QXQoaSk7CiAgICAgICAgIGlmICgod0NoYXIgPiAweDgwICYmIHdDaGFyIDwgMHhGRkZEKSB8fCAod0NoYXIgPD0gMHg4MCAmJiBpc3ByaW50KHdDaGFyKSkpIHsKLSAgICAgICAgICAgIGJFeGlzdCA9IFRSVUU7CisgICAgICAgICAgICBiRXhpc3QgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTM5LDggKzE1MzksOCBAQAogICAgIGludCBuSXRlbXMgPSBwVGV4dE9iai0+Q291bnRJdGVtcygpOwogICAgIEZYX0ZMT0FUIGJhc2VTcGFjZSA9IF9DYWxjdWxhdGVCYXNlU3BhY2UocFRleHRPYmosIG1hdHJpeCk7CiAKLSAgICBjb25zdCBGWF9CT09MIGJSMkwgPSBJc1JpZ2h0VG9MZWZ0KHBUZXh0T2JqLCBwRm9udCwgbkl0ZW1zKTsKLSAgICBjb25zdCBGWF9CT09MIGJJc0JpZGlBbmRNaXJyb3JJbnZlcnNlID0KKyAgICBjb25zdCBib29sIGJSMkwgPSBJc1JpZ2h0VG9MZWZ0KHBUZXh0T2JqLCBwRm9udCwgbkl0ZW1zKTsKKyAgICBjb25zdCBib29sIGJJc0JpZGlBbmRNaXJyb3JJbnZlcnNlID0KICAgICAgICAgYlIyTCAmJiAobWF0cml4LmEgKiBtYXRyaXguZCAtIG1hdHJpeC5iICogbWF0cml4LmMpIDwgMDsKICAgICBpbnQzMl90IGlCdWZTdGFydEFwcGVuZCA9IG1fVGVtcFRleHRCdWYuR2V0TGVuZ3RoKCk7CiAgICAgaW50MzJfdCBpQ2hhckxpc3RTdGFydEFwcGVuZCA9IG1fVGVtcENoYXJMaXN0LkdldFNpemUoKTsKQEAgLTE2MDksNyArMTYwOSw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3BhY2luZyA9IDA7CiAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzdHJJdGVtID0gcEZvbnQtPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKLSAgICAgICAgRlhfQk9PTCBiTm9Vbmljb2RlID0gRkFMU0U7CisgICAgICAgIGJvb2wgYk5vVW5pY29kZSA9IGZhbHNlOwogICAgICAgICBGWF9XQ0hBUiB3Q2hhciA9IHdzdHJJdGVtLkdldEF0KDApOwogICAgICAgICBpZiAoKHdzdHJJdGVtLklzRW1wdHkoKSB8fCB3Q2hhciA9PSAwKSAmJiBpdGVtLm1fQ2hhckNvZGUpIHsKICAgICAgICAgICAgIGlmKHdzdHJJdGVtLklzRW1wdHkoKSkgewpAQCAtMTYxNyw3ICsxNjE3LDcgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgd3N0ckl0ZW0uU2V0QXQoMCwgKEZYX1dDSEFSKWl0ZW0ubV9DaGFyQ29kZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBiTm9Vbmljb2RlID0gVFJVRTsKKyAgICAgICAgICAgIGJOb1VuaWNvZGUgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGNoYXJpbmZvLm1fSW5kZXggPSAtMTsKICAgICAgICAgY2hhcmluZm8ubV9DaGFyQ29kZSA9IGl0ZW0ubV9DaGFyQ29kZTsKQEAgLTE2NTEsNyArMTY1MSw3IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGludCBuVG90YWwgPSB3c3RySXRlbS5HZXRMZW5ndGgoKTsKLSAgICAgICAgICAgIEZYX0JPT0wgYkRlbCA9IEZBTFNFOworICAgICAgICAgICAgYm9vbCBiRGVsID0gZmFsc2U7CiAgICAgICAgICAgICBjb25zdCBpbnQgY291bnQgPSBzdGQ6Om1pbihtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCksIDcpOwogICAgICAgICAgICAgRlhfRkxPQVQgdGhyZXNob2xkID0gY2hhcmluZm8ubV9NYXRyaXguVHJhbnNmb3JtWERpc3RhbmNlKChGWF9GTE9BVClURVhUX0NIQVJSQVRJT19HQVBERUxUQSAqIHBUZXh0T2JqLT5HZXRGb250U2l6ZSgpKTsKICAgICAgICAgICAgIGZvciAoaW50IG4gPSBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCk7CkBAIC0xNjYyLDcgKzE2NjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmluZm8xLT5tX3BUZXh0T2JqLT5HZXRGb250KCkgPT0gY2hhcmluZm8ubV9wVGV4dE9iai0+R2V0Rm9udCgpICAmJgogICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfZmFicyhjaGFyaW5mbzEtPm1fT3JpZ2luWCAtIGNoYXJpbmZvLm1fT3JpZ2luWCkgPCB0aHJlc2hvbGQgICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19mYWJzKGNoYXJpbmZvMS0+bV9PcmlnaW5ZIC0gY2hhcmluZm8ubV9PcmlnaW5ZKSA8IHRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgICAgICBiRGVsID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYkRlbCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTE3MDcsNyArMTcwNyw3IEBACiAgICAgICAgIHN0ZDo6c3dhcChwVGVtcEJ1ZmZlcltpXSwgcFRlbXBCdWZmZXJbal0pOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6SXNSaWdodFRvTGVmdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLAorYm9vbCBDUERGX1RleHRQYWdlOjpJc1JpZ2h0VG9MZWZ0KGNvbnN0IENQREZfVGV4dE9iamVjdCogcFRleHRPYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Gb250KiBwRm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkl0ZW1zKSBjb25zdAogewpAQCAtMTc3OSw3ICsxNzc5LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIG1fVGV4dGxpbmVEaXI7CiB9Ci1GWF9CT09MIENQREZfVGV4dFBhZ2U6OklzSHlwaGVuKEZYX1dDSEFSIGN1ckNoYXIpCitib29sIENQREZfVGV4dFBhZ2U6OklzSHlwaGVuKEZYX1dDSEFSIGN1ckNoYXIpCiB7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyQ3VyVGV4dCA9IG1fVGVtcFRleHRCdWYuR2V0V2lkZVN0cmluZygpOwogICAgIGlmKHN0ckN1clRleHQuR2V0TGVuZ3RoKCkgPT0gMCkgewpAQCAtMTc5Niw3ICsxNzk2LDcgQEAKICAgICAgICAgICAgIEZYX1dDSEFSIHByZUNoYXIgPSBzdHJDdXJUZXh0LkdldEF0KChuSW5kZXgpKTsKICAgICAgICAgICAgIGlmICgoKHByZUNoYXIgPj0gTCdBJyAmJiBwcmVDaGFyIDw9IEwnWicpIHx8IChwcmVDaGFyID49IEwnYScgJiYgcHJlQ2hhciA8PSBMJ3onKSkKICAgICAgICAgICAgICAgICAgICAgJiYgKChjdXJDaGFyID49IEwnQScgJiYgY3VyQ2hhciA8PSBMJ1onKSB8fCAoY3VyQ2hhciA+PSBMJ2EnICYmIGN1ckNoYXIgPD0gTCd6JykpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaW50IHNpemUgPSBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCk7CkBAIC0xODA2LDIxICsxODA2LDIxIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzaXplID0gbV9jaGFyTGlzdC5HZXRTaXplKCk7CiAgICAgICAgICAgICBpZihzaXplID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHJlQ2hhciA9IChQQUdFQ0hBUl9JTkZPKW1fY2hhckxpc3Rbc2l6ZSAtIDFdOwogICAgICAgICB9CiAgICAgICAgIGlmIChGUERGVEVYVF9DSEFSX1BJRUNFID09IHByZUNoYXIubV9GbGFnKQogICAgICAgICAgICAgaWYgKDB4QUQgPT0gcHJlQ2hhci5tX1VuaWNvZGUgfHwgMHgyRCA9PSBwcmVDaGFyLm1fVW5pY29kZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogaW50IENQREZfVGV4dFBhZ2U6OlByb2Nlc3NJbnNlcnRPYmplY3QoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBmb3JtTWF0cml4KQogewogICAgIEZpbmRQcmV2aW91c1RleHRPYmplY3QoKTsKLSAgICBGWF9CT09MIGJOZXdsaW5lID0gRkFMU0U7CisgICAgYm9vbCBiTmV3bGluZSA9IGZhbHNlOwogICAgIGludCBXcml0aW5nTW9kZSA9IEdldFRleHRPYmplY3RXcml0aW5nTW9kZShwT2JqKTsKICAgICBpZihXcml0aW5nTW9kZSA9PSAtMSkgewogICAgICAgICBXcml0aW5nTW9kZSA9IEdldFRleHRPYmplY3RXcml0aW5nTW9kZShtX3BQcmVUZXh0T2JqKTsKQEAgLTE4ODQsOCArMTg4NCw4IEBACiAgICAgcmVjdDEuSW50ZXJzZWN0KHJlY3QyKTsKICAgICBpZiAoV3JpdGluZ01vZGUgPT0gMCkgewogICAgICAgICBpZiAoKHJlY3QxLklzRW1wdHkoKSAmJiByZWN0Mi5IZWlnaHQoKSA+IDUgJiYgcmVjdDMuSGVpZ2h0KCkgPiA1KQotICAgICAgICAgICAgICAgIHx8ICgoeSA+IHRocmVzaG9sZCAqIDIgfHwgeSA8IHRocmVzaG9sZCAqIC0zKSAmJiAoRlhTWVNfZmFicyh5KSA8IDEgPyBGWFNZU19mYWJzKHgpIDwgRlhTWVNfZmFicyh5KSA6IFRSVUUpKSkgewotICAgICAgICAgICAgYk5ld2xpbmUgPSBUUlVFOworICAgICAgICAgICAgICAgIHx8ICgoeSA+IHRocmVzaG9sZCAqIDIgfHwgeSA8IHRocmVzaG9sZCAqIC0zKSAmJiAoRlhTWVNfZmFicyh5KSA8IDEgPyBGWFNZU19mYWJzKHgpIDwgRlhTWVNfZmFicyh5KSA6IHRydWUpKSkgeworICAgICAgICAgICAgYk5ld2xpbmUgPSB0cnVlOwogICAgICAgICAgICAgaWYobkl0ZW0gPiAxICkgewogICAgICAgICAgICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gdGVtcEl0ZW07CiAgICAgICAgICAgICAgICAgbV9wUHJlVGV4dE9iai0+R2V0SXRlbUluZm8oMCwgJnRlbXBJdGVtKTsKQEAgLTE4OTcsMTEgKzE4OTcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICYmIG0uYiA8IDAuMSAmJiBtLmMgPCAwLjEgKSB7CiAgICAgICAgICAgICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmUoMCwgbV9wUHJlVGV4dE9iai0+bV9Cb3R0b20sIDEwMDAsIG1fcFByZVRleHRPYmotPm1fVG9wKTsKICAgICAgICAgICAgICAgICAgICAgaWYocmUuQ29udGFpbnMocE9iai0+R2V0UG9zWCgpLCBwT2JqLT5HZXRQb3NZKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiTmV3bGluZSA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgYk5ld2xpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmUoMCwgcE9iai0+bV9Cb3R0b20sIDEwMDAsIHBPYmotPm1fVG9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlLkNvbnRhaW5zKG1fcFByZVRleHRPYmotPkdldFBvc1goKSwgbV9wUHJlVGV4dE9iai0+R2V0UG9zWSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOZXdsaW5lID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5ld2xpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTE5NTIsMTAgKzE5NTIsMTAgQEAKICAgICAgICAgfQogICAgIHJldHVybiAwOwogfQotRlhfQk9PTCBDUERGX1RleHRQYWdlOjpJc1NhbWVUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCogcFRleHRPYmoxLCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMikKK2Jvb2wgQ1BERl9UZXh0UGFnZTo6SXNTYW1lVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMSwgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajIpCiB7CiAgICAgaWYgKCFwVGV4dE9iajEgfHwgIXBUZXh0T2JqMikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX0Zsb2F0UmVjdCByY1ByZU9iaihwVGV4dE9iajItPm1fTGVmdCwgcFRleHRPYmoyLT5tX0JvdHRvbSwgcFRleHRPYmoyLT5tX1JpZ2h0LCBwVGV4dE9iajItPm1fVG9wKTsKICAgICBDRlhfRmxvYXRSZWN0IHJjQ3VyT2JqKHBUZXh0T2JqMS0+bV9MZWZ0LCBwVGV4dE9iajEtPm1fQm90dG9tLCBwVGV4dE9iajEtPm1fUmlnaHQsIHBUZXh0T2JqMS0+bV9Ub3ApOwpAQCAtMTk2Niw0NiArMTk2Niw0NiBAQAogICAgICAgICAgICAgUEFHRUNIQVJfSU5GTyBwZXJDaGFyVGVtcCA9IChQQUdFQ0hBUl9JTkZPKW1fY2hhckxpc3RbbkNvdW50IC0gMl07CiAgICAgICAgICAgICBGWF9GTE9BVCBkYlNwYWNlID0gcGVyQ2hhclRlbXAubV9DaGFyQm94LldpZHRoKCk7CiAgICAgICAgICAgICBpZiAoZGJYZGlmID4gZGJTcGFjZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCFyY1ByZU9iai5Jc0VtcHR5KCkgfHwgIXJjQ3VyT2JqLklzRW1wdHkoKSkgewogICAgICAgICByY1ByZU9iai5JbnRlcnNlY3QocmNDdXJPYmopOwogICAgICAgICBpZiAocmNQcmVPYmouSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKEZYU1lTX2ZhYnMocmNQcmVPYmouV2lkdGgoKSAtIHJjQ3VyT2JqLldpZHRoKCkpID4gcmNDdXJPYmouV2lkdGgoKSAvIDIpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAocFRleHRPYmoyLT5HZXRGb250U2l6ZSgpICE9IHBUZXh0T2JqMS0+R2V0Rm9udFNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGludCBuUHJlQ291bnQgPSBwVGV4dE9iajItPkNvdW50SXRlbXMoKTsKICAgICBpbnQgbkN1ckNvdW50ID0gcFRleHRPYmoxLT5Db3VudEl0ZW1zKCk7CiAgICAgaWYgKG5QcmVDb3VudCAhPSBuQ3VyQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbVBlciwgaXRlbUN1cjsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5QcmVDb3VudDsgaSsrKSB7CiAgICAgICAgIHBUZXh0T2JqMi0+R2V0SXRlbUluZm8oaSwgJml0ZW1QZXIpOwogICAgICAgICBwVGV4dE9iajEtPkdldEl0ZW1JbmZvKGksICZpdGVtQ3VyKTsKICAgICAgICAgaWYgKGl0ZW1DdXIubV9DaGFyQ29kZSAhPSBpdGVtUGVyLm1fQ2hhckNvZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBpZihGWFNZU19mYWJzKHBUZXh0T2JqMS0+R2V0UG9zWCgpIC0gcFRleHRPYmoyLT5HZXRQb3NYKCkpID4gR2V0Q2hhcldpZHRoKGl0ZW1QZXIubV9DaGFyQ29kZSwgcFRleHRPYmoyLT5HZXRGb250KCkpKnBUZXh0T2JqMi0+R2V0Rm9udFNpemUoKSAvIDEwMDAgKiAwLjkgfHwKICAgICAgICAgICAgIEZYU1lTX2ZhYnMocFRleHRPYmoxLT5HZXRQb3NZKCkgLSBwVGV4dE9iajItPkdldFBvc1koKSkgPgogICAgICAgICAgICAgRlhfTUFYKEZYX01BWChyY1ByZU9iai5IZWlnaHQoKSAsIHJjUHJlT2JqLldpZHRoKCkpLCBwVGV4dE9iajItPkdldEZvbnRTaXplKCkpIC8gOCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfVGV4dFBhZ2U6OklzU2FtZUFzUHJlVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLCBGWF9QT1NJVElPTiBPYmpQb3MpCitib29sIENQREZfVGV4dFBhZ2U6OklzU2FtZUFzUHJlVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLCBGWF9QT1NJVElPTiBPYmpQb3MpCiB7CiAgICAgaWYgKCFwVGV4dE9iaikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IGkgPSAwOwogICAgIGlmICghT2JqUG9zKSB7CkBAIC0yMDIxLDEzICsyMDIxLDEzIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBpZihJc1NhbWVUZXh0T2JqZWN0KChDUERGX1RleHRPYmplY3QqKXBPYmosIHBUZXh0T2JqKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpKys7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZfVGV4dFBhZ2U6OkdlbmVyYXRlQ2hhckluZm8oRlhfV0NIQVIgdW5pY29kZSwgUEFHRUNIQVJfSU5GTyYgaW5mbykKK2Jvb2wgQ1BERl9UZXh0UGFnZTo6R2VuZXJhdGVDaGFySW5mbyhGWF9XQ0hBUiB1bmljb2RlLCBQQUdFQ0hBUl9JTkZPJiBpbmZvKQogewogICAgIGludCBzaXplID0gbV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpOwogICAgIFBBR0VDSEFSX0lORk8gcHJlQ2hhcjsKQEAgLTIwMzYsNyArMjAzNiw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgc2l6ZSA9IG1fY2hhckxpc3QuR2V0U2l6ZSgpOwogICAgICAgICBpZihzaXplID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBwcmVDaGFyID0gKFBBR0VDSEFSX0lORk8pbV9jaGFyTGlzdFtzaXplIC0gMV07CiAgICAgfQpAQCAtMjA2MSwzNyArMjA2MSwzNyBAQAogICAgIGluZm8ubV9PcmlnaW5YID0gcHJlQ2hhci5tX09yaWdpblggKyBwcmVXaWR0aCAqIChmcykgLyAxMDAwOwogICAgIGluZm8ubV9PcmlnaW5ZID0gcHJlQ2hhci5tX09yaWdpblk7CiAgICAgaW5mby5tX0NoYXJCb3ggPSBDRlhfRmxvYXRSZWN0KGluZm8ubV9PcmlnaW5YLCBpbmZvLm1fT3JpZ2luWSwgaW5mby5tX09yaWdpblgsIGluZm8ubV9PcmlnaW5ZKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6SXNSZWN0SW50ZXJzZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QxLCBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0MikKK2Jvb2wgQ1BERl9UZXh0UGFnZTo6SXNSZWN0SW50ZXJzZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QxLCBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0MikKIHsKICAgICBDRlhfRmxvYXRSZWN0IHJlY3QgPSByZWN0MTsKICAgICByZWN0LkludGVyc2VjdChyZWN0Mik7CiAgICAgcmV0dXJuICFyZWN0LklzRW1wdHkoKTsKIH0KLUZYX0JPT0wJQ1BERl9UZXh0UGFnZTo6SXNMZXR0ZXIoRlhfV0NIQVIgdW5pY29kZSkKK2Jvb2wJQ1BERl9UZXh0UGFnZTo6SXNMZXR0ZXIoRlhfV0NIQVIgdW5pY29kZSkKIHsKICAgICBpZiAodW5pY29kZSA8IEwnQScpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICh1bmljb2RlID4gTCdaJyAmJiB1bmljb2RlIDwgTCdhJykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHVuaWNvZGUgPiBMJ3onKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIENQREZfVGV4dFBhZ2VGaW5kOjpDUERGX1RleHRQYWdlRmluZChjb25zdCBJUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpCiAgICAgOiBtX3BUZXh0UGFnZShwVGV4dFBhZ2UpLAogICAgICAgbV9mbGFncygwKSwKICAgICAgIG1fZmluZE5leHRTdGFydCgtMSksCiAgICAgICBtX2ZpbmRQcmVTdGFydCgtMSksCi0gICAgICBtX2JNYXRjaENhc2UoRkFMU0UpLAotICAgICAgbV9iTWF0Y2hXaG9sZVdvcmQoRkFMU0UpLAorICAgICAgbV9iTWF0Y2hDYXNlKGZhbHNlKSwKKyAgICAgIG1fYk1hdGNoV2hvbGVXb3JkKGZhbHNlKSwKICAgICAgIG1fcmVzU3RhcnQoMCksCiAgICAgICBtX3Jlc0VuZCgtMSksCi0gICAgICBtX0lzRmluZChGQUxTRSkKKyAgICAgIG1fSXNGaW5kKGZhbHNlKQogewogICAgIG1fc3RyVGV4dCA9IG1fcFRleHRQYWdlLT5HZXRQYWdlVGV4dCgpOwogICAgIGludCBuQ291bnQgPSBwVGV4dFBhZ2UtPkNvdW50Q2hhcnMoKTsKQEAgLTIxNDAsMTAgKzIxNDAsMTAgQEAKICAgICB9CiAgICAgcmV0dXJuIC0xOwogfQotRlhfQk9PTAlDUERGX1RleHRQYWdlRmluZDo6RmluZEZpcnN0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmaW5kd2hhdCwgaW50IGZsYWdzLCBpbnQgc3RhcnRQb3MpCitib29sCUNQREZfVGV4dFBhZ2VGaW5kOjpGaW5kRmlyc3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZpbmR3aGF0LCBpbnQgZmxhZ3MsIGludCBzdGFydFBvcykKIHsKICAgICBpZiAoIW1fcFRleHRQYWdlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9zdHJUZXh0LklzRW1wdHkoKSB8fCBtX2JNYXRjaENhc2UgIT0gKGZsYWdzICYgRlBERlRFWFRfTUFUQ0hDQVNFKSkgewogICAgICAgICBtX3N0clRleHQgPSBtX3BUZXh0UGFnZS0+R2V0UGFnZVRleHQoKTsKQEAgLTIxNTMsOCArMjE1Myw4IEBACiAgICAgbV9mbGFncyA9IGZsYWdzOwogICAgIG1fYk1hdGNoQ2FzZSA9IGZsYWdzICYgRlBERlRFWFRfTUFUQ0hDQVNFOwogICAgIGlmIChtX3N0clRleHQuSXNFbXB0eSgpKSB7Ci0gICAgICAgIG1fSXNGaW5kID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICBtX0lzRmluZCA9IGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgRlhfU1RSU0laRSBsZW4gPSBmaW5kd2hhdFN0ci5HZXRMZW5ndGgoKTsKICAgICBpZiAoIW1fYk1hdGNoQ2FzZSkgewpAQCAtMjE4MiwzNiArMjE4MiwzNiBAQAogICAgICAgICBtX2NzRmluZFdoYXRBcnJheS5BZGQoZmluZHdoYXRTdHIpOwogICAgIH0KICAgICBpZihtX2NzRmluZFdoYXRBcnJheS5HZXRTaXplKCkgPD0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgbV9Jc0ZpbmQgPSBUUlVFOworICAgIG1fSXNGaW5kID0gdHJ1ZTsKICAgICBtX3Jlc1N0YXJ0ID0gMDsKICAgICBtX3Jlc0VuZCA9IC0xOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX1RleHRQYWdlRmluZDo6RmluZE5leHQoKQorYm9vbCBDUERGX1RleHRQYWdlRmluZDo6RmluZE5leHQoKQogewogICAgIGlmICghbV9wVGV4dFBhZ2UpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcmVzQXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgaWYobV9maW5kTmV4dFN0YXJ0ID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZihtX3N0clRleHQuSXNFbXB0eSgpKSB7Ci0gICAgICAgIG1fSXNGaW5kID0gRkFMU0U7CisgICAgICAgIG1fSXNGaW5kID0gZmFsc2U7CiAgICAgICAgIHJldHVybiBtX0lzRmluZDsKICAgICB9CiAgICAgaW50IHN0ckxlbiA9IG1fc3RyVGV4dC5HZXRMZW5ndGgoKTsKICAgICBpZiAobV9maW5kTmV4dFN0YXJ0ID4gc3RyTGVuIC0gMSkgewotICAgICAgICBtX0lzRmluZCA9IEZBTFNFOworICAgICAgICBtX0lzRmluZCA9IGZhbHNlOwogICAgICAgICByZXR1cm4gbV9Jc0ZpbmQ7CiAgICAgfQogICAgIGludCBuQ291bnQgPSBtX2NzRmluZFdoYXRBcnJheS5HZXRTaXplKCk7CiAgICAgaW50IG5SZXN1bHRQb3MgPSAwOwogICAgIGludAluU3RhcnRQb3MgPSAwOwogICAgIG5TdGFydFBvcyA9IG1fZmluZE5leHRTdGFydDsKLSAgICBGWF9CT09MIGJTcGFjZVN0YXJ0ID0gRkFMU0U7CisgICAgYm9vbCBiU3BhY2VTdGFydCA9IGZhbHNlOwogICAgIGZvcihpbnQgaVdvcmQgPSAwOyBpV29yZCA8IG5Db3VudDsgaVdvcmQrKykgewogICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1dvcmQgPSBtX2NzRmluZFdoYXRBcnJheVtpV29yZF07CiAgICAgICAgIGlmKGNzV29yZC5Jc0VtcHR5KCkpIHsKQEAgLTIyMjMsMzMgKzIyMjMsMzMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaVdvcmQgPSAtMTsKICAgICAgICAgICAgIH0gZWxzZSBpZihpV29yZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYlNwYWNlU3RhcnQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJTcGFjZVN0YXJ0ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIGludCBlbmRJbmRleDsKICAgICAgICAgblJlc3VsdFBvcyA9IG1fc3RyVGV4dC5GaW5kKGNzV29yZC5jX3N0cigpLCBuU3RhcnRQb3MpOwogICAgICAgICBpZiAoblJlc3VsdFBvcyA9PSAtMSkgewotICAgICAgICAgICAgbV9Jc0ZpbmQgPSBGQUxTRTsKKyAgICAgICAgICAgIG1fSXNGaW5kID0gZmFsc2U7CiAgICAgICAgICAgICByZXR1cm4gbV9Jc0ZpbmQ7CiAgICAgICAgIH0KICAgICAgICAgZW5kSW5kZXggPSBuUmVzdWx0UG9zICsgY3NXb3JkLkdldExlbmd0aCgpIC0gMTsKICAgICAgICAgaWYoaVdvcmQgPT0gMCkgewogICAgICAgICAgICAgbV9yZXNTdGFydCA9IG5SZXN1bHRQb3M7CiAgICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCBiTWF0Y2ggPSBUUlVFOworICAgICAgICBib29sIGJNYXRjaCA9IHRydWU7CiAgICAgICAgIGlmKGlXb3JkICE9IDAgJiYgIWJTcGFjZVN0YXJ0KSB7CiAgICAgICAgICAgICBpbnQgUHJlUmVzRW5kUG9zID0gblN0YXJ0UG9zOwogICAgICAgICAgICAgaW50IGN1ckNoYXIgPSBjc1dvcmQuR2V0QXQoMCk7CiAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBsYXN0V29yZCA9IG1fY3NGaW5kV2hhdEFycmF5W2lXb3JkIC0gMV07CiAgICAgICAgICAgICBpbnQgbGFzdENoYXIgPSBsYXN0V29yZC5HZXRBdChsYXN0V29yZC5HZXRMZW5ndGgoKSAtIDEpOwogICAgICAgICAgICAgaWYoblN0YXJ0UG9zID09IG5SZXN1bHRQb3MgJiYgIShfSXNJZ25vcmVTcGFjZUNoYXJhY3RlcihsYXN0Q2hhcikgfHwgX0lzSWdub3JlU3BhY2VDaGFyYWN0ZXIoY3VyQ2hhcikpKSB7Ci0gICAgICAgICAgICAgICAgYk1hdGNoID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYk1hdGNoID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IoaW50IGQgPSBQcmVSZXNFbmRQb3M7IGQgPCBuUmVzdWx0UG9zOyBkKyspIHsKICAgICAgICAgICAgICAgICBGWF9XQ0hBUiBzdHJJbnNlcnQgPSBtX3N0clRleHQuR2V0QXQoZCk7CiAgICAgICAgICAgICAgICAgaWYoc3RySW5zZXJ0ICE9IFRFWFRfTElORUZFRURfQ0hBUiAmJiBzdHJJbnNlcnQgIT0gVEVYVF9CTEFOS19DSEFSICYmIHN0ckluc2VydCAhPSBURVhUX1JFVFVSTl9DSEFSICYmIHN0ckluc2VydCAhPSAxNjApIHsKLSAgICAgICAgICAgICAgICAgICAgYk1hdGNoID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJNYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMjU3LDcgKzIyNTcsNyBAQAogICAgICAgICAgICAgaWYoblJlc3VsdFBvcyA+IDApIHsKICAgICAgICAgICAgICAgICBGWF9XQ0hBUiBzdHJJbnNlcnQgPSBtX3N0clRleHQuR2V0QXQoblJlc3VsdFBvcyAtIDEpOwogICAgICAgICAgICAgICAgIGlmKHN0ckluc2VydCAhPSBURVhUX0xJTkVGRUVEX0NIQVIgJiYgc3RySW5zZXJ0ICE9IFRFWFRfQkxBTktfQ0hBUiAmJiBzdHJJbnNlcnQgIT0gVEVYVF9SRVRVUk5fQ0hBUiAmJiBzdHJJbnNlcnQgIT0gMTYwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJNYXRjaCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBiTWF0Y2ggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgbV9yZXNTdGFydCA9IG5SZXN1bHRQb3M7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbV9yZXNTdGFydCA9IG5SZXN1bHRQb3MgLSAxOwpAQCAtMjI3OCw3ICsyMjc4LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBtX3Jlc0VuZCA9IG5SZXN1bHRQb3MgKyBtX2NzRmluZFdoYXRBcnJheVttX2NzRmluZFdoYXRBcnJheS5HZXRTaXplKCkgLSAxXS5HZXRMZW5ndGgoKSAtIDE7Ci0gICAgbV9Jc0ZpbmQgPSBUUlVFOworICAgIG1fSXNGaW5kID0gdHJ1ZTsKICAgICBpbnQgcmVzU3RhcnQgPSBHZXRDaGFySW5kZXgobV9yZXNTdGFydCk7CiAgICAgaW50IHJlc0VuZCA9IEdldENoYXJJbmRleChtX3Jlc0VuZCk7CiAgICAgbV9wVGV4dFBhZ2UtPkdldFJlY3RBcnJheShyZXNTdGFydCwgcmVzRW5kIC0gcmVzU3RhcnQgKyAxLCBtX3Jlc0FycmF5KTsKQEAgLTIyOTEsMjAgKzIyOTEsMjAgQEAKICAgICB9CiAgICAgcmV0dXJuIG1fSXNGaW5kOwogfQotRlhfQk9PTCBDUERGX1RleHRQYWdlRmluZDo6RmluZFByZXYoKQorYm9vbCBDUERGX1RleHRQYWdlRmluZDo6RmluZFByZXYoKQogewogICAgIGlmICghbV9wVGV4dFBhZ2UpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcmVzQXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgaWYobV9zdHJUZXh0LklzRW1wdHkoKSB8fCBtX2ZpbmRQcmVTdGFydCA8IDApIHsKLSAgICAgICAgbV9Jc0ZpbmQgPSBGQUxTRTsKKyAgICAgICAgbV9Jc0ZpbmQgPSBmYWxzZTsKICAgICAgICAgcmV0dXJuIG1fSXNGaW5kOwogICAgIH0KICAgICBDUERGX1RleHRQYWdlRmluZCBmaW5kRW5naW5lKG1fcFRleHRQYWdlKTsKLSAgICBGWF9CT09MIHJldCA9IGZpbmRFbmdpbmUuRmluZEZpcnN0KG1fZmluZFdoYXQsIG1fZmxhZ3MpOworICAgIGJvb2wgcmV0ID0gZmluZEVuZ2luZS5GaW5kRmlyc3QobV9maW5kV2hhdCwgbV9mbGFncyk7CiAgICAgaWYoIXJldCkgewotICAgICAgICBtX0lzRmluZCA9IEZBTFNFOworICAgICAgICBtX0lzRmluZCA9IGZhbHNlOwogICAgICAgICByZXR1cm4gbV9Jc0ZpbmQ7CiAgICAgfQogICAgIGludAlvcmRlciA9IC0xLCBNYXRjaGVkQ291bnQgPSAwOwpAQCAtMjMyMSwxMiArMjMyMSwxMiBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmKG9yZGVyID09IC0xKSB7Ci0gICAgICAgIG1fSXNGaW5kID0gRkFMU0U7CisgICAgICAgIG1fSXNGaW5kID0gZmFsc2U7CiAgICAgICAgIHJldHVybiBtX0lzRmluZDsKICAgICB9CiAgICAgbV9yZXNTdGFydCA9IG1fcFRleHRQYWdlLT5UZXh0SW5kZXhGcm9tQ2hhckluZGV4KG9yZGVyKTsKICAgICBtX3Jlc0VuZCA9IG1fcFRleHRQYWdlLT5UZXh0SW5kZXhGcm9tQ2hhckluZGV4KG9yZGVyICsgTWF0Y2hlZENvdW50IC0gMSk7Ci0gICAgbV9Jc0ZpbmQgPSBUUlVFOworICAgIG1fSXNGaW5kID0gdHJ1ZTsKICAgICBtX3BUZXh0UGFnZS0+R2V0UmVjdEFycmF5KG9yZGVyLCBNYXRjaGVkQ291bnQsIG1fcmVzQXJyYXkpOwogICAgIGlmKG1fZmxhZ3MgJiBGUERGVEVYVF9DT05TRUNVVElWRSkgewogICAgICAgICBtX2ZpbmROZXh0U3RhcnQgPSBtX3Jlc1N0YXJ0ICsgMTsKQEAgLTIzODUsMTYgKzIzODUsMTYgQEAKICAgICAgICAgaW5kZXgrKzsKICAgICB9CiB9Ci1GWF9CT09MIENQREZfVGV4dFBhZ2VGaW5kOjpJc01hdGNoV2hvbGVXb3JkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc1BhZ2VUZXh0LCBpbnQgc3RhcnRQb3MsIGludCBlbmRQb3MpCitib29sIENQREZfVGV4dFBhZ2VGaW5kOjpJc01hdGNoV2hvbGVXb3JkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc1BhZ2VUZXh0LCBpbnQgc3RhcnRQb3MsIGludCBlbmRQb3MpCiB7CiAgICAgaW50IGNoYXJfbGVmdCA9IDA7CiAgICAgaW50IGNoYXJfcmlnaHQgPSAwOwogICAgIGludCBjaGFyX2NvdW50ID0gZW5kUG9zIC0gc3RhcnRQb3MgKyAxOwogICAgIGlmKGNoYXJfY291bnQgPCAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoY2hhcl9jb3VudCA9PSAxICYmIGNzUGFnZVRleHQuR2V0QXQoc3RhcnRQb3MpID4gMjU1KSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYoc3RhcnRQb3MgLSAxID49IDAgKSB7CiAgICAgICAgIGNoYXJfbGVmdCA9IGNzUGFnZVRleHQuR2V0QXQoc3RhcnRQb3MgLSAxKTsKQEAgLTI0MDQsMzMgKzI0MDQsMzMgQEAKICAgICB9CiAgICAgaWYgKChjaGFyX2xlZnQgPiAnQScgJiYgY2hhcl9sZWZ0IDwgJ2EnKSB8fCAoY2hhcl9sZWZ0ID4gJ2EnICYmIGNoYXJfbGVmdCA8ICd6JykgfHwgKGNoYXJfbGVmdCA+IDB4ZmIwMCAmJiBjaGFyX2xlZnQgPCAweGZiMDYpIHx8IChjaGFyX2xlZnQgPj0gJzAnICYmIGNoYXJfbGVmdCA8PSAnOScpIHx8CiAgICAgICAgICAgICAoY2hhcl9yaWdodCA+ICdBJyAmJiBjaGFyX3JpZ2h0IDwgJ2EnKSB8fCAoY2hhcl9yaWdodCA+ICdhJyAmJiBjaGFyX3JpZ2h0IDwgJ3onKSB8fCAoY2hhcl9yaWdodCA+IDB4ZmIwMCAmJiBjaGFyX3JpZ2h0IDwgMHhmYjA2KSB8fCAoY2hhcl9yaWdodCA+PSAnMCcgJiYgY2hhcl9yaWdodCA8PSAnOScpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZighKCgnQScgPiBjaGFyX2xlZnQgfHwgY2hhcl9sZWZ0ID4gJ1onKSAgJiYgKCdhJyA+IGNoYXJfbGVmdCB8fCBjaGFyX2xlZnQgPiAneicpCiAgICAgICAgICAgICAmJiAoJ0EnID4gY2hhcl9yaWdodCB8fCBjaGFyX3JpZ2h0ID4gJ1onKSAgJiYgKCdhJyA+IGNoYXJfcmlnaHQgfHwgY2hhcl9yaWdodCA+ICd6JykpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoY2hhcl9jb3VudCA+IDApIHsKICAgICAgICAgaWYgKGNzUGFnZVRleHQuR2V0QXQoc3RhcnRQb3MpID49IEwnMCcgJiYgY3NQYWdlVGV4dC5HZXRBdChzdGFydFBvcykgPD0gTCc5JyAmJiBjaGFyX2xlZnQgPj0gTCcwJyAmJiBjaGFyX2xlZnQgPD0gTCc5JykgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChjc1BhZ2VUZXh0LkdldEF0KGVuZFBvcykgPj0gTCcwJyAmJiBjc1BhZ2VUZXh0LkdldEF0KGVuZFBvcykgPD0gTCc5JyAmJiBjaGFyX3JpZ2h0ID49IEwnMCcgJiYgY2hhcl9yaWdodCA8PSBMJzknKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfVGV4dFBhZ2VGaW5kOjpFeHRyYWN0U3ViU3RyaW5nKENGWF9XaWRlU3RyaW5nJiByU3RyaW5nLCBjb25zdCBGWF9XQ0hBUiogbHBzekZ1bGxTdHJpbmcsCitib29sIENQREZfVGV4dFBhZ2VGaW5kOjpFeHRyYWN0U3ViU3RyaW5nKENGWF9XaWRlU3RyaW5nJiByU3RyaW5nLCBjb25zdCBGWF9XQ0hBUiogbHBzekZ1bGxTdHJpbmcsCiAgICAgICAgIGludCBpU3ViU3RyaW5nLCBGWF9XQ0hBUiBjaFNlcCkKIHsKICAgICBpZiAobHBzekZ1bGxTdHJpbmcgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgd2hpbGUgKGlTdWJTdHJpbmctLSkgewogICAgICAgICBscHN6RnVsbFN0cmluZyA9IEZYU1lTX3djc2NocihscHN6RnVsbFN0cmluZywgY2hTZXApOwogICAgICAgICBpZiAobHBzekZ1bGxTdHJpbmcgPT0gTlVMTCkgewogICAgICAgICAgICAgclN0cmluZy5FbXB0eSgpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGxwc3pGdWxsU3RyaW5nKys7CiAgICAgICAgIHdoaWxlKCpscHN6RnVsbFN0cmluZyA9PSBjaFNlcCkgewpAQCAtMjQ0Myw3ICsyNDQzLDcgQEAKICAgICBBU1NFUlQobkxlbiA+PSAwKTsKICAgICBGWFNZU19tZW1jcHkoclN0cmluZy5HZXRCdWZmZXIobkxlbiksIGxwc3pGdWxsU3RyaW5nLCBuTGVuICogc2l6ZW9mKEZYX1dDSEFSKSk7CiAgICAgclN0cmluZy5SZWxlYXNlQnVmZmVyKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBDRlhfV2lkZVN0cmluZyBDUERGX1RleHRQYWdlRmluZDo6TWFrZVJldmVyc2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikKIHsKQEAgLTI0NzEsMjcgKzI0NzEsMjcgQEAKIH0KIENQREZfTGlua0V4dHJhY3Q6OkNQREZfTGlua0V4dHJhY3QoKQogICAgIDogbV9wVGV4dFBhZ2UoTlVMTCksCi0gICAgICBtX0lzUGFyc2VyZChGQUxTRSkKKyAgICAgIG1fSXNQYXJzZXJkKGZhbHNlKQogewogfQogQ1BERl9MaW5rRXh0cmFjdDo6fkNQREZfTGlua0V4dHJhY3QoKQogewogICAgIERlbGV0ZUxpbmtMaXN0KCk7CiB9Ci1GWF9CT09MIENQREZfTGlua0V4dHJhY3Q6OkV4dHJhY3RMaW5rcyhjb25zdCBJUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpCitib29sIENQREZfTGlua0V4dHJhY3Q6OkV4dHJhY3RMaW5rcyhjb25zdCBJUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpCiB7CiAgICAgaWYgKCFwVGV4dFBhZ2UgfHwgIXBUZXh0UGFnZS0+SXNQYXJzZXJlZCgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BUZXh0UGFnZSA9IChjb25zdCBDUERGX1RleHRQYWdlKilwVGV4dFBhZ2U7CiAgICAgbV9zdHJQYWdlVGV4dCA9IG1fcFRleHRQYWdlLT5HZXRQYWdlVGV4dCgwLCAtMSk7CiAgICAgRGVsZXRlTGlua0xpc3QoKTsKICAgICBpZiAobV9zdHJQYWdlVGV4dC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHBhcnNlckxpbmsoKTsKLSAgICBtX0lzUGFyc2VyZCA9IFRSVUU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgbV9Jc1BhcnNlcmQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDUERGX0xpbmtFeHRyYWN0OjpEZWxldGVMaW5rTGlzdCgpCiB7CkBAIC0yNTQ2LDQyICsyNTQ2LDQyIEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1GWF9CT09MIENQREZfTGlua0V4dHJhY3Q6OkNoZWNrV2ViTGluayhDRlhfV2lkZVN0cmluZyYgc3RyQmVDaGVjaykKK2Jvb2wgQ1BERl9MaW5rRXh0cmFjdDo6Q2hlY2tXZWJMaW5rKENGWF9XaWRlU3RyaW5nJiBzdHJCZUNoZWNrKQogewogICAgIENGWF9XaWRlU3RyaW5nIHN0ciA9IHN0ckJlQ2hlY2s7CiAgICAgc3RyLk1ha2VMb3dlcigpOwogICAgIGlmIChzdHIuRmluZChMImh0dHA6Ly93d3cuIikgIT0gLTEpIHsKICAgICAgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJodHRwOi8vd3d3LiIpKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoc3RyLkZpbmQoTCJodHRwOi8vIikgIT0gLTEpIHsKICAgICAgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJodHRwOi8vIikpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChzdHIuRmluZChMImh0dHBzOi8vd3d3LiIpICE9IC0xKSB7CiAgICAgICAgIHN0ckJlQ2hlY2sgPSBzdHJCZUNoZWNrLlJpZ2h0KHN0ci5HZXRMZW5ndGgoKSAtIHN0ci5GaW5kKEwiaHR0cHM6Ly93d3cuIikpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChzdHIuRmluZChMImh0dHBzOi8vIikgIT0gLTEpIHsKICAgICAgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJodHRwczovLyIpKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoc3RyLkZpbmQoTCJ3d3cuIikgIT0gLTEpIHsKICAgICAgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJ3d3cuIikpOwogICAgICAgICBzdHJCZUNoZWNrID0gTCJodHRwOi8vIiArIHN0ckJlQ2hlY2s7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9MaW5rRXh0cmFjdDo6Q2hlY2tNYWlsTGluayhDRlhfV2lkZVN0cmluZyYgc3RyKQorYm9vbCBDUERGX0xpbmtFeHRyYWN0OjpDaGVja01haWxMaW5rKENGWF9XaWRlU3RyaW5nJiBzdHIpCiB7CiAgICAgc3RyLk1ha2VMb3dlcigpOwogICAgIGludCBhUG9zID0gc3RyLkZpbmQoTCdAJyk7CiAgICAgaWYgKGFQb3MgPCAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoc3RyLkdldEF0KGFQb3MgLSAxKSA9PSBMJy4nIHx8IHN0ci5HZXRBdChhUG9zIC0gMSkgPT0gTCdfJykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gYVBvcyAtIDE7IGkgPj0gMDsgaS0tKSB7CkBAIC0yNTkwLDcgKzI1OTAsNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoaSA9PSBhUG9zIC0gMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdHIgPSBzdHIuUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gaSAtIDEpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNTk4LDcgKzI1OTgsNyBAQAogICAgIH0KICAgICBhUG9zID0gc3RyLkZpbmQoTCdAJyk7CiAgICAgaWYgKGFQb3MgPCAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRlhfV2lkZVN0cmluZyBzdHJ0ZW1wID0gTCIiOwogICAgIGZvciAoaSA9IDA7IGkgPCBhUG9zOyBpKyspIHsKQEAgLTI2MTQsMTMgKzI2MTQsMTMgQEAKICAgICB9CiAgICAgYVBvcyA9IHN0ci5GaW5kKEwnQCcpOwogICAgIGlmIChhUG9zIDwgMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgc3RyLlRyaW1SaWdodChMJy4nKTsKICAgICBzdHJ0ZW1wID0gc3RyOwogICAgIGludCBlUG9zID0gc3RyLkZpbmQoTCcuJyk7CiAgICAgaWYgKGVQb3MgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHdoaWxlIChlUG9zICE9IC0xKSB7CiAgICAgICAgIHN0cnRlbXAgPSBzdHJ0ZW1wLlJpZ2h0KHN0cnRlbXAuR2V0TGVuZ3RoKCkgLSBlUG9zIC0gMSk7CkBAIC0yNjQzLDIyICsyNjQzLDIyIEBACiAgICAgICAgIGlmICh3Y2ggPT0gTCctJyB8fCB3Y2ggPT0gTCcuJyB8fCAod2NoID49IEwnYScgJiYgd2NoIDw9IEwneicpIHx8ICh3Y2ggPj0gTCcwJyAmJiB3Y2ggPD0gTCc5JykpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChzdHIuRmluZChMIm1haWx0bzoiKSA9PSAtMSkgewogICAgICAgICBzdHIgPSBMIm1haWx0bzoiICsgc3RyOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9MaW5rRXh0cmFjdDo6QXBwZW5kVG9MaW5rTGlzdChpbnQgc3RhcnQsIGludCBjb3VudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clVybCkKK2Jvb2wgQ1BERl9MaW5rRXh0cmFjdDo6QXBwZW5kVG9MaW5rTGlzdChpbnQgc3RhcnQsIGludCBjb3VudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clVybCkKIHsKICAgICBDUERGX0xpbmtFeHQqIGxpbmtJbmZvID0gbmV3IENQREZfTGlua0V4dDsKICAgICBsaW5rSW5mby0+bV9zdHJVcmwgPSBzdHJVcmw7CiAgICAgbGlua0luZm8tPm1fU3RhcnQgPSBzdGFydDsKICAgICBsaW5rSW5mby0+bV9Db3VudCA9IGNvdW50OwogICAgIG1fTGlua0xpc3QuQWRkKGxpbmtJbmZvKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIENGWF9XaWRlU3RyaW5nIENQREZfTGlua0V4dHJhY3Q6OkdldFVSTChpbnQgaW5kZXgpIGNvbnN0CiB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHRfc2VhcmNoLmNwcCBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9zZWFyY2guY3BwCmluZGV4IDIxYTI1NjQuLmQ4OGU5ZTEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9zZWFyY2guY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9zZWFyY2guY3BwCkBAIC05LDU2ICs5LDU2IEBACiBjbGFzcyBDUERGX1RleHRTdHJlYW0KIHsKIHB1YmxpYzoKLSAgICBDUERGX1RleHRTdHJlYW0oQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsIEZYX0JPT0wgYlVzZUxGLCBDRlhfUHRyQXJyYXkqIHBPYmpBcnJheSk7CisgICAgQ1BERl9UZXh0U3RyZWFtKENGWF9XaWRlVGV4dEJ1ZiYgYnVmZmVyLCBib29sIGJVc2VMRiwgQ0ZYX1B0ckFycmF5KiBwT2JqQXJyYXkpOwogICAgIH5DUERGX1RleHRTdHJlYW0oKSB7fQotICAgIEZYX0JPT0wgUHJvY2Vzc09iamVjdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBPYmosIEZYX0JPT0wgYkZpcnN0TGluZSk7CisgICAgYm9vbCBQcm9jZXNzT2JqZWN0KGNvbnN0IENQREZfVGV4dE9iamVjdCogcE9iaiwgYm9vbCBiRmlyc3RMaW5lKTsKICAgICBDRlhfV2lkZVRleHRCdWYmCW1fQnVmZmVyOwotICAgIEZYX0JPT0wJCQkJbV9iVXNlTEY7CisgICAgYm9vbAkJCQltX2JVc2VMRjsKICAgICBDRlhfUHRyQXJyYXkqCQltX3BPYmpBcnJheTsKICAgICBjb25zdCBDUERGX1RleHRPYmplY3QqCW1fcExhc3RPYmo7CiB9OwotQ1BERl9UZXh0U3RyZWFtOjpDUERGX1RleHRTdHJlYW0oQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsIEZYX0JPT0wgYlVzZUxGLCBDRlhfUHRyQXJyYXkqIHBPYmpBcnJheSkgOiBtX0J1ZmZlcihidWZmZXIpCitDUERGX1RleHRTdHJlYW06OkNQREZfVGV4dFN0cmVhbShDRlhfV2lkZVRleHRCdWYmIGJ1ZmZlciwgYm9vbCBiVXNlTEYsIENGWF9QdHJBcnJheSogcE9iakFycmF5KSA6IG1fQnVmZmVyKGJ1ZmZlcikKIHsKICAgICBtX3BMYXN0T2JqID0gTlVMTDsKICAgICBtX2JVc2VMRiA9IGJVc2VMRjsKICAgICBtX3BPYmpBcnJheSA9IHBPYmpBcnJheTsKIH0KLUZYX0JPT0wgRlBERlRleHRfSXNTYW1lVGV4dE9iamVjdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMSwgY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajIpCitib29sIEZQREZUZXh0X0lzU2FtZVRleHRPYmplY3QoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajEsIGNvbnN0IENQREZfVGV4dE9iamVjdCogcFRleHRPYmoyKQogewogICAgIGlmICghcFRleHRPYmoxIHx8ICFwVGV4dE9iajIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9GbG9hdFJlY3QgcmNQcmVPYmoocFRleHRPYmoyLT5tX0xlZnQsIHBUZXh0T2JqMi0+bV9Cb3R0b20sIHBUZXh0T2JqMi0+bV9SaWdodCwgcFRleHRPYmoyLT5tX1RvcCk7CiAgICAgQ0ZYX0Zsb2F0UmVjdCByY0N1ck9iaihwVGV4dE9iajEtPm1fTGVmdCwgcFRleHRPYmoxLT5tX0JvdHRvbSwgcFRleHRPYmoxLT5tX1JpZ2h0LCBwVGV4dE9iajEtPm1fVG9wKTsKICAgICBpZiAocmNQcmVPYmouSXNFbXB0eSgpICYmIHJjQ3VyT2JqLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmICghcmNQcmVPYmouSXNFbXB0eSgpIHx8ICFyY0N1ck9iai5Jc0VtcHR5KCkpIHsKICAgICAgICAgcmNQcmVPYmouSW50ZXJzZWN0KHJjQ3VyT2JqKTsKICAgICAgICAgaWYgKHJjUHJlT2JqLklzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChGWFNZU19mYWJzKHJjUHJlT2JqLldpZHRoKCkgLSByY0N1ck9iai5XaWR0aCgpKSA+IHJjQ3VyT2JqLldpZHRoKCkgLyAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBUZXh0T2JqMi0+R2V0Rm9udFNpemUoKSAhPSBwVGV4dE9iajEtPkdldEZvbnRTaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBpbnQgblByZUNvdW50ID0gcFRleHRPYmoyLT5Db3VudEl0ZW1zKCk7CiAgICAgaW50IG5DdXJDb3VudCA9IHBUZXh0T2JqMS0+Q291bnRJdGVtcygpOwogICAgIGlmIChuUHJlQ291bnQgIT0gbkN1ckNvdW50KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5QcmVDb3VudDsgaSsrKSB7CiAgICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbVBlciwgaXRlbUN1cjsKICAgICAgICAgcFRleHRPYmoyLT5HZXRJdGVtSW5mbyhpLCAmaXRlbVBlcik7CiAgICAgICAgIHBUZXh0T2JqMS0+R2V0SXRlbUluZm8oaSwgJml0ZW1DdXIpOwogICAgICAgICBpZiAoaXRlbUN1ci5tX0NoYXJDb2RlICE9IGl0ZW1QZXIubV9DaGFyQ29kZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogaW50IEdldENoYXJXaWR0aChGWF9EV09SRCBjaGFyQ29kZSwgQ1BERl9Gb250KiBwRm9udCkKIHsKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgIH0KICAgICByZXR1cm4gMDsKIH0KLUZYX0JPT0wgQ1BERl9UZXh0U3RyZWFtOjpQcm9jZXNzT2JqZWN0KGNvbnN0IENQREZfVGV4dE9iamVjdCogcE9iaiwgRlhfQk9PTCBiRmlyc3RMaW5lKQorYm9vbCBDUERGX1RleHRTdHJlYW06OlByb2Nlc3NPYmplY3QoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwT2JqLCBib29sIGJGaXJzdExpbmUpCiB7CiAgICAgQ1BERl9Gb250KiBwRm9udCA9IHBPYmotPkdldEZvbnQoKTsKICAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKQEAgLTE1MCw3ICsxNTAsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGJGaXJzdExpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobV9iVXNlTEYpIHsKICAgICAgICAgICAgICAgICAgICAgbV9CdWZmZXIuQXBwZW5kQ2hhcihMJ1xyJyk7CkBAIC0xNzYsNyArMTc2LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gLTEpIHsKICAgICAgICAgICAgIG1fcExhc3RPYmogPSBwT2JqOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSAzKSB7CiAgICAgICAgICAgICBpdGVtX2luZGV4ID0gMTsKICAgICAgICAgfQpAQCAtMjc3LDkgKzI3Nyw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLXZvaWQgX1BERl9HZXRUZXh0U3RyZWFtX1VuaWNvZGUoQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsIENQREZfUGFnZU9iamVjdHMqIHBQYWdlLCBGWF9CT09MIGJVc2VMRiwKK3ZvaWQgX1BERl9HZXRUZXh0U3RyZWFtX1VuaWNvZGUoQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsIENQREZfUGFnZU9iamVjdHMqIHBQYWdlLCBib29sIGJVc2VMRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5KiBwT2JqQXJyYXkpCiB7CiAgICAgQ1BERl9UZXh0U3RyZWFtIHRleHRzdHJlYW0oYnVmZmVyLCBiVXNlTEYsIHBPYmpBcnJheSk7CkBAIC0yOTIsNyArMjkyLDcgQEAKICAgICAgICAgaWYgKHBPYmplY3QtPm1fVHlwZSAhPSBQREZQQUdFX1RFWFQpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIHRleHRzdHJlYW0uUHJvY2Vzc09iamVjdCgoQ1BERl9UZXh0T2JqZWN0KilwT2JqZWN0LCBGQUxTRSk7CisgICAgICAgIHRleHRzdHJlYW0uUHJvY2Vzc09iamVjdCgoQ1BERl9UZXh0T2JqZWN0KilwT2JqZWN0LCBmYWxzZSk7CiAgICAgfQogfQogQ0ZYX1dpZGVTdHJpbmcgUERGX0dldEZpcnN0VGV4dExpbmVfVW5pY29kZShDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlKQpAQCAtMzAyLDE3ICszMDIsMTcgQEAKICAgICBDUERGX1BhZ2UgcGFnZTsKICAgICBwYWdlLkxvYWQocERvYywgcFBhZ2UpOwogICAgIENQREZfUGFyc2VPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5tX2JUZXh0T25seSA9IFRSVUU7Ci0gICAgb3B0aW9ucy5tX2JTZXBhcmF0ZUZvcm0gPSBGQUxTRTsKKyAgICBvcHRpb25zLm1fYlRleHRPbmx5ID0gdHJ1ZTsKKyAgICBvcHRpb25zLm1fYlNlcGFyYXRlRm9ybSA9IGZhbHNlOwogICAgIHBhZ2UuUGFyc2VDb250ZW50KCZvcHRpb25zKTsKLSAgICBDUERGX1RleHRTdHJlYW0gdGV4dHN0cmVhbShidWZmZXIsIEZBTFNFLCBOVUxMKTsKKyAgICBDUERGX1RleHRTdHJlYW0gdGV4dHN0cmVhbShidWZmZXIsIGZhbHNlLCBOVUxMKTsKICAgICBGWF9QT1NJVElPTiBwb3MgPSBwYWdlLkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKICAgICB3aGlsZSAocG9zKSB7CiAgICAgICAgIENQREZfUGFnZU9iamVjdCogcE9iamVjdCA9IHBhZ2UuR2V0TmV4dE9iamVjdChwb3MpOwogICAgICAgICBpZiAocE9iamVjdC0+bV9UeXBlICE9IFBERlBBR0VfVEVYVCkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHRleHRzdHJlYW0uUHJvY2Vzc09iamVjdCgoQ1BERl9UZXh0T2JqZWN0KilwT2JqZWN0LCBUUlVFKSkgeworICAgICAgICBpZiAodGV4dHN0cmVhbS5Qcm9jZXNzT2JqZWN0KChDUERGX1RleHRPYmplY3QqKXBPYmplY3QsIHRydWUpKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L3RleHRfaW50LmggYi9jb3JlL3NyYy9mcGRmdGV4dC90ZXh0X2ludC5oCmluZGV4IGNlNTIzNzEuLmJjYWNjNTcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L3RleHRfaW50LmgKKysrIGIvY29yZS9zcmMvZnBkZnRleHQvdGV4dF9pbnQuaApAQCAtNDgsOSArNDgsOSBAQAogICAgIENQREZfVGV4dFBhZ2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgaW50IGZsYWdzID0gMCk7CiAgICAgQ1BERl9UZXh0UGFnZShjb25zdCBDUERGX1BhZ2VPYmplY3RzKiBwUGFnZSwgaW50IGZsYWdzID0gMCk7CiAgICAgQ1BERl9UZXh0UGFnZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDUERGVGV4dF9QYXJzZU9wdGlvbnMgUGFyc2VyT3B0aW9ucyk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCQlQYXJzZVRleHRQYWdlKCk7Ci0gICAgdmlydHVhbCB2b2lkCQkJCQlOb3JtYWxpemVPYmplY3RzKEZYX0JPT0wgYk5vcm1hbGl6ZSk7Ci0gICAgdmlydHVhbAlGWF9CT09MCQkJCQlJc1BhcnNlcmVkKCkgY29uc3QKKyAgICB2aXJ0dWFsIGJvb2wJCQkJCVBhcnNlVGV4dFBhZ2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQJCQkJCU5vcm1hbGl6ZU9iamVjdHMoYm9vbCBiTm9ybWFsaXplKTsKKyAgICB2aXJ0dWFsCWJvb2wJCQkJCUlzUGFyc2VyZWQoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fSXNQYXJzZXJlZDsKICAgICB9CkBAIC03MSwxMCArNzEsMTAgQEAKICAgICB2aXJ0dWFsIGludAkJCQkJCUNvdW50UmVjdHMoaW50IHN0YXJ0LCBpbnQgbkNvdW50KTsKICAgICB2aXJ0dWFsCXZvaWQJCQkJCUdldFJlY3QoaW50IHJlY3RJbmRleCwgRlhfRkxPQVQmIGxlZnQsIEZYX0ZMT0FUJiB0b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBGWF9GTE9BVCYgcmlnaHQsIEZYX0ZMT0FUICZib3R0b20pIGNvbnN0OwotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJR2V0QmFzZWxpbmVSb3RhdGUoaW50IHJlY3RJbmRleCwgaW50JiBSb3RhdGUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJR2V0QmFzZWxpbmVSb3RhdGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwgaW50JiBSb3RhdGUpOworICAgIHZpcnR1YWwgYm9vbAkJCQkJR2V0QmFzZWxpbmVSb3RhdGUoaW50IHJlY3RJbmRleCwgaW50JiBSb3RhdGUpOworICAgIHZpcnR1YWwgYm9vbAkJCQkJR2V0QmFzZWxpbmVSb3RhdGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwgaW50JiBSb3RhdGUpOwogICAgIHZpcnR1YWwJaW50CQkJCQkJQ291bnRCb3VuZGVkU2VnbWVudHMoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgdG9wLAotICAgICAgICAgICAgRlhfRkxPQVQgcmlnaHQsIEZYX0ZMT0FUIGJvdHRvbSwgRlhfQk9PTCBiQ29udGFpbnMgPSBGQUxTRSk7CisgICAgICAgICAgICBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgYm90dG9tLCBib29sIGJDb250YWlucyA9IGZhbHNlKTsKICAgICB2aXJ0dWFsCXZvaWQJCQkJCUdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwgaW50JiBzdGFydCwgaW50JiBjb3VudCkgY29uc3Q7CiAgICAgdmlydHVhbCBpbnQJCQkJCQlHZXRXb3JkQnJlYWsoaW50IGluZGV4LCBpbnQgZGlyZWN0aW9uKSBjb25zdDsKIHB1YmxpYzoKQEAgLTgyLDIwICs4MiwyMCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuICZtX2NoYXJMaXN0OwogICAgIH0KLSAgICBzdGF0aWMJRlhfQk9PTAkJCQkJSXNSZWN0SW50ZXJzZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QxLCBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0Mik7Ci0gICAgc3RhdGljCUZYX0JPT0wJCQkJCUlzTGV0dGVyKEZYX1dDSEFSIHVuaWNvZGUpOworICAgIHN0YXRpYwlib29sCQkJCQlJc1JlY3RJbnRlcnNlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdDEsIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QyKTsKKyAgICBzdGF0aWMJYm9vbAkJCQkJSXNMZXR0ZXIoRlhfV0NIQVIgdW5pY29kZSk7CiBwcml2YXRlOgotICAgIEZYX0JPT0wJCQkJCQkJSXNIeXBoZW4oRlhfV0NIQVIgY3VyQ2hhcik7CisgICAgYm9vbAkJCQkJCQlJc0h5cGhlbihGWF9XQ0hBUiBjdXJDaGFyKTsKICAgICBib29sCQkJCQkJCUlzQ29udHJvbENoYXIoY29uc3QgUEFHRUNIQVJfSU5GTyYgY2hhckluZm8pOwotICAgIEZYX0JPT0wJCQkJCQkJR2V0QmFzZWxpbmVSb3RhdGUoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQmIFJvdGF0ZSk7CisgICAgYm9vbAkJCQkJCQlHZXRCYXNlbGluZVJvdGF0ZShpbnQgc3RhcnQsIGludCBlbmQsIGludCYgUm90YXRlKTsKICAgICB2b2lkCQkJCQkJCVByb2Nlc3NPYmplY3QoKTsKICAgICB2b2lkCQkJCQkJCVByb2Nlc3NGb3JtT2JqZWN0KENQREZfRm9ybU9iamVjdCoJcEZvcm1PYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIGZvcm1NYXRyaXgpOwogICAgIHZvaWQJCQkJCQkJUHJvY2Vzc1RleHRPYmplY3QoUERGVEVYVF9PYmogcE9iaik7CiAgICAgdm9pZAkJCQkJCQlQcm9jZXNzVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqCXBUZXh0T2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBmb3JtTWF0cml4LCBGWF9QT1NJVElPTiBPYmpQb3MpOwogICAgIGludAkJCQkJCQkJUHJvY2Vzc0luc2VydE9iamVjdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIGZvcm1NYXRyaXgpOwotICAgIEZYX0JPT0wJCQkJCQkJR2VuZXJhdGVDaGFySW5mbyhGWF9XQ0hBUiB1bmljb2RlLCBQQUdFQ0hBUl9JTkZPJiBpbmZvKTsKLSAgICBGWF9CT09MCQkJCQkJCUlzU2FtZUFzUHJlVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLCBGWF9QT1NJVElPTiBPYmpQb3MpOwotICAgIEZYX0JPT0wJCQkJCQkJSXNTYW1lVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMSwgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajIpOworICAgIGJvb2wJCQkJCQkJR2VuZXJhdGVDaGFySW5mbyhGWF9XQ0hBUiB1bmljb2RlLCBQQUdFQ0hBUl9JTkZPJiBpbmZvKTsKKyAgICBib29sCQkJCQkJCUlzU2FtZUFzUHJlVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLCBGWF9QT1NJVElPTiBPYmpQb3MpOworICAgIGJvb2wJCQkJCQkJSXNTYW1lVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMSwgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajIpOwogICAgIGludAkJCQkJCQkJR2V0Q2hhcldpZHRoKEZYX0RXT1JEIGNoYXJDb2RlLCBDUERGX0ZvbnQqIHBGb250KSBjb25zdDsKICAgICB2b2lkCQkJCQkJCUNsb3NlVGVtcExpbmUoKTsKICAgICB2b2lkCQkJCQkJCU9uUGllY2UoSUZYX0JpZGlDaGFyKiBwQmlkaSwgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CkBAIC0xMDksNyArMTA5LDcgQEAKICAgICBpbnQzMl90CUZpbmRUZXh0bGluZUZsb3dEaXJlY3Rpb24oKTsKICAgICB2b2lkIFN3YXBUZW1wVGV4dEJ1ZihpbnQzMl90IGlDaGFyTGlzdFN0YXJ0QXBwZW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJ1ZlN0YXJ0QXBwZW5kKTsKLSAgICBGWF9CT09MIElzUmlnaHRUb0xlZnQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwKKyAgICBib29sIElzUmlnaHRUb0xlZnQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Gb250KiBwRm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5JdGVtcykgY29uc3Q7CiBwcm90ZWN0ZWQ6CkBAIC0xMjMsMTMgKzEyMywxMyBAQAogICAgIGludAkJCQkJCQkJbV9wYXJzZXJmbGFnOwogICAgIENQREZfVGV4dE9iamVjdCoJCQkJbV9wUHJlVGV4dE9iajsKICAgICBDRlhfQWZmaW5lTWF0cml4CQkJCW1fcGVyTWF0cml4OwotICAgIEZYX0JPT0wJCQkJCQkJbV9Jc1BhcnNlcmVkOworICAgIGJvb2wJCQkJCQkJbV9Jc1BhcnNlcmVkOwogICAgIENGWF9BZmZpbmVNYXRyaXgJCQkJbV9EaXNwbGF5TWF0cml4OwogCiAgICAgU0VHTUVOVF9BcnJheQkJCQkJbV9TZWdtZW50OwogICAgIENGWF9SZWN0QXJyYXkJCQkJCW1fU2VsUmVjdHM7CiAgICAgTElORU9CSgkJCQkJCQltX0xpbmVPYmo7Ci0gICAgRlhfQk9PTAkJCQkJCQltX1RleHRsaW5lRGlyOworICAgIGJvb2wJCQkJCQkJbV9UZXh0bGluZURpcjsKICAgICBDRlhfRmxvYXRSZWN0CQkJCQltX0N1cmxpbmVSZWN0OwogfTsKIGNsYXNzIENQREZfVGV4dFBhZ2VGaW5kOiBwdWJsaWMgSVBERl9UZXh0UGFnZUZpbmQKQEAgLTEzOCwxNyArMTM4LDE3IEBACiAgICAgQ1BERl9UZXh0UGFnZUZpbmQoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKTsKICAgICB2aXJ0dWFsCQkJCQkJCX5DUERGX1RleHRQYWdlRmluZCgpIHt9OwogcHVibGljOgotICAgIHZpcnR1YWwJRlhfQk9PTAkJCQkJRmluZEZpcnN0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmaW5kd2hhdCwgaW50IGZsYWdzLCBpbnQgc3RhcnRQb3MgPSAwKTsKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJCUZpbmROZXh0KCk7Ci0gICAgdmlydHVhbAlGWF9CT09MCQkJCQlGaW5kUHJldigpOworICAgIHZpcnR1YWwJYm9vbAkJCQkJRmluZEZpcnN0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmaW5kd2hhdCwgaW50IGZsYWdzLCBpbnQgc3RhcnRQb3MgPSAwKTsKKyAgICB2aXJ0dWFsCWJvb2wJCQkJCUZpbmROZXh0KCk7CisgICAgdmlydHVhbAlib29sCQkJCQlGaW5kUHJldigpOwogCiAgICAgdmlydHVhbCB2b2lkCQkJCQlHZXRSZWN0QXJyYXkoQ0ZYX1JlY3RBcnJheSYgcmVjdHMpIGNvbnN0OwogICAgIHZpcnR1YWwgaW50CQkJCQkJR2V0Q3VyT3JkZXIoKSBjb25zdDsKICAgICB2aXJ0dWFsIGludAkJCQkJCUdldE1hdGNoZWRDb3VudCgpY29uc3Q7CiBwcm90ZWN0ZWQ6CiAgICAgdm9pZAkJCQkJCQlFeHRyYWN0RmluZFdoYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZpbmR3aGF0KTsKLSAgICBGWF9CT09MCQkJCQkJCUlzTWF0Y2hXaG9sZVdvcmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzUGFnZVRleHQsIGludCBzdGFydFBvcywgaW50IGVuZFBvcyk7Ci0gICAgRlhfQk9PTAkJCQkJCQlFeHRyYWN0U3ViU3RyaW5nKENGWF9XaWRlU3RyaW5nJiByU3RyaW5nLCBjb25zdCBGWF9XQ0hBUiogbHBzekZ1bGxTdHJpbmcsCisgICAgYm9vbAkJCQkJCQlJc01hdGNoV2hvbGVXb3JkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc1BhZ2VUZXh0LCBpbnQgc3RhcnRQb3MsIGludCBlbmRQb3MpOworICAgIGJvb2wJCQkJCQkJRXh0cmFjdFN1YlN0cmluZyhDRlhfV2lkZVN0cmluZyYgclN0cmluZywgY29uc3QgRlhfV0NIQVIqIGxwc3pGdWxsU3RyaW5nLAogICAgICAgICAgICAgaW50IGlTdWJTdHJpbmcsIEZYX1dDSEFSIGNoU2VwKTsKICAgICBDRlhfV2lkZVN0cmluZwkJCQkJTWFrZVJldmVyc2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CiAgICAgaW50CQkJCQkJCQlSZXZlcnNlRmluZChjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NQYWdlVGV4dCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzV29yZCwgaW50IG5TdGFydFBvcywgaW50JiBXb3JkTGVuZ3RoKTsKQEAgLTE2MiwxMiArMTYyLDEyIEBACiAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheQkJCQltX2NzRmluZFdoYXRBcnJheTsKICAgICBpbnQJCQkJCQkJCW1fZmluZE5leHRTdGFydDsKICAgICBpbnQJCQkJCQkJCW1fZmluZFByZVN0YXJ0OwotICAgIEZYX0JPT0wJCQkJCQkJbV9iTWF0Y2hDYXNlOwotICAgIEZYX0JPT0wJCQkJCQkJbV9iTWF0Y2hXaG9sZVdvcmQ7CisgICAgYm9vbAkJCQkJCQltX2JNYXRjaENhc2U7CisgICAgYm9vbAkJCQkJCQltX2JNYXRjaFdob2xlV29yZDsKICAgICBpbnQJCQkJCQkJCW1fcmVzU3RhcnQ7CiAgICAgaW50CQkJCQkJCQltX3Jlc0VuZDsKICAgICBDRlhfUmVjdEFycmF5CQkJCQltX3Jlc0FycmF5OwotICAgIEZYX0JPT0wJCQkJCQkJbV9Jc0ZpbmQ7CisgICAgYm9vbAkJCQkJCQltX0lzRmluZDsKIH07CiBjbGFzcyBDUERGX0xpbmtFeHQKIHsKQEAgLTE4NCw4ICsxODQsOCBAQAogcHVibGljOgogICAgIENQREZfTGlua0V4dHJhY3QoKTsKICAgICB2aXJ0dWFsCQkJCQkJCX5DUERGX0xpbmtFeHRyYWN0KCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCQlFeHRyYWN0TGlua3MoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKTsKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJCUlzRXh0cmFjdCgpIGNvbnN0CisgICAgdmlydHVhbCBib29sCQkJCQlFeHRyYWN0TGlua3MoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKTsKKyAgICB2aXJ0dWFsCWJvb2wJCQkJCUlzRXh0cmFjdCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9Jc1BhcnNlcmQ7CiAgICAgfQpAQCAtMTk3LDE0ICsxOTcsMTQgQEAKIHByb3RlY3RlZDoKICAgICB2b2lkCQkJCQkJCXBhcnNlckxpbmsoKTsKICAgICB2b2lkCQkJCQkJCURlbGV0ZUxpbmtMaXN0KCk7Ci0gICAgRlhfQk9PTAkJCQkJCQlDaGVja1dlYkxpbmsoQ0ZYX1dpZGVTdHJpbmcmIHN0ckJlQ2hlY2spOwotICAgIEZYX0JPT0wJCQkJCQkJQ2hlY2tNYWlsTGluayhDRlhfV2lkZVN0cmluZyYgc3RyKTsKLSAgICBGWF9CT09MCQkJCQkJCUFwcGVuZFRvTGlua0xpc3QoaW50IHN0YXJ0LCBpbnQgY291bnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJVcmwpOworICAgIGJvb2wJCQkJCQkJQ2hlY2tXZWJMaW5rKENGWF9XaWRlU3RyaW5nJiBzdHJCZUNoZWNrKTsKKyAgICBib29sCQkJCQkJCUNoZWNrTWFpbExpbmsoQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CisgICAgYm9vbAkJCQkJCQlBcHBlbmRUb0xpbmtMaXN0KGludCBzdGFydCwgaW50IGNvdW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVXJsKTsKIHByaXZhdGU6CiAgICAgTElOS19JbmZvQXJyYXkJCQkJCW1fTGlua0xpc3Q7CiAgICAgY29uc3QgQ1BERl9UZXh0UGFnZSoJCQltX3BUZXh0UGFnZTsKICAgICBDRlhfV2lkZVN0cmluZwkJCQkJbV9zdHJQYWdlVGV4dDsKLSAgICBGWF9CT09MCQkJCQkJCW1fSXNQYXJzZXJkOworICAgIGJvb2wJCQkJCQkJbV9Jc1BhcnNlcmQ7CiB9OwogRlhfU1RSU0laRSBGWF9Vbmljb2RlX0dldE5vcm1hbGl6YXRpb24oRlhfV0NIQVIgd2NoLCBGWF9XQ0hBUiogcERzdCk7CiB2b2lkIE5vcm1hbGl6ZVN0cmluZyhDRlhfV2lkZVN0cmluZyYgc3RyKTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L3R4dHByb2MuaCBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L3R4dHByb2MuaAppbmRleCAyNzVhYWJkLi5lZmU5ZmY5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmdGV4dC90eHRwcm9jLmgKKysrIGIvY29yZS9zcmMvZnBkZnRleHQvdHh0cHJvYy5oCkBAIC0zMyw4ICszMyw4IEBACiAgICAgfkNUZXh0QmFzZUxpbmUoKTsKICAgICB2b2lkCUluc2VydFRleHRCb3goRlhfRkxPQVQgbGVmdHgsIEZYX0ZMT0FUIHJpZ2h0eCwgRlhfRkxPQVQgdG9weSwgRlhfRkxPQVQgYm90dG9teSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3BhY2V3LCBGWF9GTE9BVCBmb250c2l6ZV92LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKLSAgICBGWF9CT09MCUdldFdpZHRoKEZYX0ZMT0FUJiBsZWZ0eCwgRlhfRkxPQVQmIHJpZ2h0eCk7Ci0gICAgRlhfQk9PTAlDYW5NZXJnZShDVGV4dEJhc2VMaW5lKiBwT3RoZXIpOworICAgIGJvb2wJR2V0V2lkdGgoRlhfRkxPQVQmIGxlZnR4LCBGWF9GTE9BVCYgcmlnaHR4KTsKKyAgICBib29sCUNhbk1lcmdlKENUZXh0QmFzZUxpbmUqIHBPdGhlcik7CiAgICAgdm9pZAlNZXJnZShDVGV4dEJhc2VMaW5lKiBwT3RoZXIpOwogICAgIHZvaWQJTWVyZ2VCb3hlcygpOwogICAgIHZvaWQJQ291bnRDaGFycyhpbnQmIGNvdW50LCBGWF9GTE9BVCYgd2lkdGgsIGludCYgbWluY2hhcnMpOwpAQCAtNTcsOSArNTcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmlnaHR4LCBGWF9GTE9BVCB0b3B5LCBGWF9GTE9BVCBib3R0b215LCBGWF9GTE9BVCBzcGFjZXcsIEZYX0ZMT0FUIGZvbnRzaXplX3YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyLCBDUERGX0ZvbnQqIHBGb250KTsKICAgICB2b2lkCVdyaXRlT3V0cHV0KENGWF9XaWRlU3RyaW5nQXJyYXkmIGxpbmVzLCBpbnQgaU1pbldpZHRoKTsKLSAgICBGWF9CT09MCW1fYkF1dG9XaWR0aDsKLSAgICBGWF9CT09MCW1fYktlZXBDb2x1bW47Ci0gICAgRlhfQk9PTAltX2JCcmVha1NwYWNlOworICAgIGJvb2wJbV9iQXV0b1dpZHRoOworICAgIGJvb2wJbV9iS2VlcENvbHVtbjsKKyAgICBib29sCW1fYkJyZWFrU3BhY2U7CiAKIHByaXZhdGU6CiAgICAgQ0ZYX1B0ckFycmF5CW1fQmFzZUxpbmVzOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9jb2RlY19pbnQuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvY29kZWNfaW50LmgKaW5kZXggNzY2OGY4NC4uZGM2NDc0OCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9jb2RlY19pbnQuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oCkBAIC0xNyw5ICsxNyw5IEBACiBjbGFzcyBDQ29kZWNfQmFzaWNNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0Jhc2ljTW9kdWxlCiB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbCBGWF9CT09MCVJ1bkxlbmd0aEVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLAorICAgIHZpcnR1YWwgYm9vbAlSdW5MZW5ndGhFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAlBODVFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICB2aXJ0dWFsIGJvb2wJQTg1RW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKTsKICAgICB2aXJ0dWFsIElDb2RlY19TY2FubGluZURlY29kZXIqCUNyZWF0ZVJ1bkxlbmd0aERlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgIGludCBuQ29tcHMsIGludCBicGMpOwpAQCAtNDYsNyArNDYsNyBAQAogCiAgICAgdWludDhfdCoJCQlHZXRTY2FubGluZShpbnQgbGluZSk7CiAKLSAgICBGWF9CT09MCQkJCVNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgYm9vbAkJCQlTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpOwogCiAgICAgaW50CQkJCQlHZXRXaWR0aCgpCiAgICAgewpAQCAtNjgsNyArNjgsNyBAQAogICAgICAgICByZXR1cm4gbV9icGM7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCQlJc0NvbG9yVHJhbnNmb3JtZWQoKQorICAgIGJvb2wJCQkJSXNDb2xvclRyYW5zZm9ybWVkKCkKICAgICB7CiAgICAgICAgIHJldHVybiBtX2JDb2xvclRyYW5zZm9ybWVkOwogICAgIH0KQEAgLTk4LDExICs5OCwxMSBAQAogCiAgICAgaW50CQkJCQltX1BpdGNoOwogCi0gICAgRlhfQk9PTAkJCQltX2JDb2xvclRyYW5zZm9ybWVkOworICAgIGJvb2wJCQkJbV9iQ29sb3JUcmFuc2Zvcm1lZDsKIAogICAgIHVpbnQ4X3QqCQkJUmVhZE5leHRMaW5lKCk7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfUmV3aW5kKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJdl9SZXdpbmQoKSA9IDA7CiAKICAgICB2aXJ0dWFsIHVpbnQ4X3QqCXZfR2V0TmV4dExpbmUoKSA9IDA7CiAKQEAgLTExOCwyMSArMTE4LDIxIEBACiB7CiBwdWJsaWM6CiAgICAgdmlydHVhbCBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICBpbnQgSywgRlhfQk9PTCBFbmRPZkxpbmUsIEZYX0JPT0wgRW5jb2RlZEJ5dGVBbGlnbiwgRlhfQk9PTCBCbGFja0lzMSwgaW50IENvbHVtbnMsIGludCBSb3dzKTsKLSAgICBGWF9CT09MCQlFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcGl0Y2gsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CisgICAgICAgICAgICBpbnQgSywgYm9vbCBFbmRPZkxpbmUsIGJvb2wgRW5jb2RlZEJ5dGVBbGlnbiwgYm9vbCBCbGFja0lzMSwgaW50IENvbHVtbnMsIGludCBSb3dzKTsKKyAgICBib29sCQlFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcGl0Y2gsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CiB9OwogY2xhc3MgQ0NvZGVjX0ZsYXRlTW9kdWxlIDogcHVibGljIElDb2RlY19GbGF0ZU1vZHVsZQogewogcHVibGljOgogICAgIHZpcnR1YWwgSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJQ3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgaW50IG5Db21wcywgaW50IGJwYywgaW50IHByZWRpY3RvciwgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zKTsKLSAgICB2aXJ0dWFsIEZYX0RXT1JEIEZsYXRlT3JMWldEZWNvZGUoRlhfQk9PTCBiTFpXLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgRlhfQk9PTCBiRWFybHlDaGFuZ2UsCisgICAgdmlydHVhbCBGWF9EV09SRCBGbGF0ZU9yTFpXRGVjb2RlKGJvb2wgYkxaVywgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGJvb2wgYkVhcmx5Q2hhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOwotICAgIHZpcnR1YWwgRlhfQk9PTCBFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgdmlydHVhbCBib29sIEVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CisgICAgdmlydHVhbCBib29sCQlFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CiB9OwogY2xhc3MgQ0NvZGVjX0pwZWdNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0pwZWdNb2R1bGUKIHsKQEAgLTE0MywxNyArMTQzLDE3IEBACiAgICAgICAgIG1fcEV4dFByb3ZpZGVyID0gcEpQOwogICAgIH0KICAgICBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbkNvbXBzLCBGWF9CT09MIENvbG9yVHJhbnNmb3JtKTsKLSAgICBGWF9CT09MCQlMb2FkSW5mbyhjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50JiB3aWR0aCwgaW50JiBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBudW1fY29tcG9uZW50cywgaW50JiBiaXRzX3Blcl9jb21wb25lbnRzLCBGWF9CT09MJiBjb2xvcl90cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIGJvb2wgQ29sb3JUcmFuc2Zvcm0pOworICAgIGJvb2wJCUxvYWRJbmZvKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLCBpbnQmIGJpdHNfcGVyX2NvbXBvbmVudHMsIGJvb2wmIGNvbG9yX3RyYW5zZm9ybSwKICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogaWNjX2J1Zl9wdHIsIEZYX0RXT1JEKiBpY2NfbGVuZ3RoKTsKLSAgICBGWF9CT09MCQlFbmNvZGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9TVFJTSVpFJiBkZXN0X3NpemUsIGludCBxdWFsaXR5LCBjb25zdCB1aW50OF90KiBpY2NfYnVmLCBGWF9EV09SRCBpY2NfbGVuZ3RoKTsKKyAgICBib29sCQlFbmNvZGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9TVFJTSVpFJiBkZXN0X3NpemUsIGludCBxdWFsaXR5LCBjb25zdCB1aW50OF90KiBpY2NfYnVmLCBGWF9EV09SRCBpY2NfbGVuZ3RoKTsKICAgICB2aXJ0dWFsIHZvaWQqCQlTdGFydCgpOwogICAgIHZpcnR1YWwgdm9pZAkJRmluaXNoKHZvaWQqIHBDb250ZXh0KTsKICAgICB2aXJ0dWFsIHZvaWQJCUlucHV0KHZvaWQqIHBDb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSk7CiAgICAgdmlydHVhbCBpbnQJCQlSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwgaW50KiBuQ29tcHMpOwogICAgIHZpcnR1YWwgaW50CQkJU3RhcnRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgaW50IGRvd25fc2NhbGUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVhZFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiBkZXN0X2J1Zik7CisgICAgdmlydHVhbCBib29sCQlSZWFkU2NhbmxpbmUodm9pZCogcENvbnRleHQsIHVpbnQ4X3QqIGRlc3RfYnVmKTsKICAgICB2aXJ0dWFsIEZYX0RXT1JECUdldEF2YWlsSW5wdXQodm9pZCogcENvbnRleHQsIHVpbnQ4X3QqKiBhdmFpbF9idWZfcHRyKTsKIHByb3RlY3RlZDoKICAgICBJRlhfSnBlZ1Byb3ZpZGVyKiBtX3BFeHRQcm92aWRlcjsKQEAgLTE5OSwxMCArMTk5LDEwIEBACiB7CiBwdWJsaWM6CiAgICAgQ0NvZGVjX0pweE1vZHVsZSgpOwotICAgIHZvaWQqCQlDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBGWF9CT09MIHVzZUNvbG9yU3BhY2UgPSBGQUxTRSk7CisgICAgdm9pZCoJCUNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGJvb2wgdXNlQ29sb3JTcGFjZSA9IGZhbHNlKTsKICAgICB2b2lkCQlHZXRJbWFnZUluZm8odm9pZCogY3R4LCBGWF9EV09SRCYgd2lkdGgsIEZYX0RXT1JEJiBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBjb2Rlc3RyZWFtX25Db21wcywgRlhfRFdPUkQmIG91dHB1dF9uQ29tcHMpOwotICAgIEZYX0JPT0wJCURlY29kZSh2b2lkKiBjdHgsIHVpbnQ4X3QqIGRlc3RfZGF0YSwgaW50IHBpdGNoLCBGWF9CT09MIGJUcmFuc2xhdGVDb2xvciwgdWludDhfdCogb2Zmc2V0cyk7CisgICAgYm9vbAkJRGVjb2RlKHZvaWQqIGN0eCwgdWludDhfdCogZGVzdF9kYXRhLCBpbnQgcGl0Y2gsIGJvb2wgYlRyYW5zbGF0ZUNvbG9yLCB1aW50OF90KiBvZmZzZXRzKTsKICAgICB2b2lkCQlEZXN0cm95RGVjb2Rlcih2b2lkKiBjdHgpOwogfTsKIGNsYXNzIENQREZfSmJpZzJJbnRlcmZhY2UgOiBwdWJsaWMgQ0pCaWcyX01vZHVsZQpAQCAtMjUzLDcgKzI1Myw3IEBACiAgICAgRlhfRFdPUkQgbV9nbG9iYWxfc2l6ZTsKICAgICB1aW50OF90KiBtX2Rlc3RfYnVmOwogICAgIEZYX0RXT1JEIG1fZGVzdF9waXRjaDsKLSAgICBGWF9CT09MCW1fYkZpbGVSZWFkZXI7CisgICAgYm9vbAltX2JGaWxlUmVhZGVyOwogICAgIElGWF9QYXVzZSogbV9wUGF1c2U7CiAgICAgQ0pCaWcyX0NvbnRleHQqIG1fcENvbnRleHQ7CiAgICAgQ0pCaWcyX0ltYWdlKiBtX2Rlc3RfaW1hZ2U7CkBAIC0yNjMsOSArMjYzLDkgQEAKIHB1YmxpYzoKICAgICBDQ29kZWNfSmJpZzJNb2R1bGUoKSB7fTsKICAgICB+Q0NvZGVjX0piaWcyTW9kdWxlKCk7Ci0gICAgRlhfQk9PTAkJRGVjb2RlKEZYX0RXT1JEIHdpZHRoLCBGWF9EV09SRCBoZWlnaHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAorICAgIGJvb2wJCURlY29kZShGWF9EV09SRCB3aWR0aCwgRlhfRFdPUkQgaGVpZ2h0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZ2xvYmFsX2RhdGEsIEZYX0RXT1JEIGdsb2JhbF9zaXplLCB1aW50OF90KiBkZXN0X2J1ZiwgRlhfRFdPUkQgZGVzdF9waXRjaCk7Ci0gICAgRlhfQk9PTAkJRGVjb2RlKElGWF9GaWxlUmVhZCogZmlsZV9wdHIsCisgICAgYm9vbAkJRGVjb2RlKElGWF9GaWxlUmVhZCogZmlsZV9wdHIsCiAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwgRlhfRFdPUkQmIHBpdGNoLCB1aW50OF90KiYgZGVzdF9idWYpOwogICAgIHZvaWQqCQkJCUNyZWF0ZUpiaWcyQ29udGV4dCgpOwogICAgIEZYQ09ERUNfU1RBVFVTCQlTdGFydERlY29kZSh2b2lkKiBwSmJpZzJDb250ZXh0LCBGWF9EV09SRCB3aWR0aCwgRlhfRFdPUkQgaGVpZ2h0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWMuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlYy5jcHAKaW5kZXggOWJiY2NlMS4uOGVkZmRlNSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlYy5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlYy5jcHAKQEAgLTQ5LDEzICs0OSwxMyBAQAogICAgIG1fTmV4dExpbmUgKys7CiAgICAgcmV0dXJuIG1fcExhc3RTY2FubGluZTsKIH0KLUZYX0JPT0wgQ0NvZGVjX1NjYW5saW5lRGVjb2Rlcjo6U2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKQorYm9vbCBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjpTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaWYgKG1fcERhdGFDYWNoZSAmJiBsaW5lIDwgbV9wRGF0YUNhY2hlLT5tX25DYWNoZWRMaW5lcykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fTmV4dExpbmUgPT0gbGluZSB8fCBtX05leHRMaW5lID09IGxpbmUgKyAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9OZXh0TGluZSA8IDAgfHwgbV9OZXh0TGluZSA+IGxpbmUpIHsKICAgICAgICAgdl9SZXdpbmQoKTsKQEAgLTY2LDEwICs2NiwxMCBAQAogICAgICAgICBtX3BMYXN0U2NhbmxpbmUgPSBSZWFkTmV4dExpbmUoKTsKICAgICAgICAgbV9OZXh0TGluZSArKzsKICAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIHVpbnQ4X3QqIENDb2RlY19TY2FubGluZURlY29kZXI6OlJlYWROZXh0TGluZSgpCiB7CkBAIC0xMDcsMTAgKzEwNywxMCBAQAogICAgIG1fcERhdGFDYWNoZS0+bV9XaWR0aCA9IG1fT3V0cHV0V2lkdGg7CiAgICAgbV9wRGF0YUNhY2hlLT5tX25DYWNoZWRMaW5lcyA9IDA7CiB9Ci1GWF9CT09MIENDb2RlY19CYXNpY01vZHVsZTo6UnVuTGVuZ3RoRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsCitib29sIENDb2RlY19CYXNpY01vZHVsZTo6UnVuTGVuZ3RoRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsCiAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIGV4dGVybiAiQyIgZG91YmxlIEZYc3RydG9kKGNvbnN0IGNoYXIqIG5wdHIsIGNoYXIqKiBlbmRwdHIpCiB7CkBAIC0yMTYsMjYgKzIxNiwyNiBAQAogICAgIH0KICAgICByZXR1cm4gaXNfbmVnYXRpdmUgPyAtcmV0IDogcmV0OwogfQotRlhfQk9PTCBDQ29kZWNfQmFzaWNNb2R1bGU6OkE4NUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLAorYm9vbCBDQ29kZWNfQmFzaWNNb2R1bGU6OkE4NUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBjbGFzcyBDQ29kZWNfUkxTY2FubGluZURlY29kZXIgOiBwdWJsaWMgQ0NvZGVjX1NjYW5saW5lRGVjb2RlcgogewogcHVibGljOgogICAgIENDb2RlY19STFNjYW5saW5lRGVjb2RlcigpOwogICAgIHZpcnR1YWwgfkNDb2RlY19STFNjYW5saW5lRGVjb2RlcigpOwotICAgIEZYX0JPT0wJCQkJQ3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIGludCBicGMpOworICAgIGJvb2wJCQkJQ3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIGludCBicGMpOwogICAgIHZpcnR1YWwgdm9pZAkJdl9Eb3duU2NhbGUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkge30KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfUmV3aW5kKCk7CisgICAgdmlydHVhbCBib29sCQl2X1Jld2luZCgpOwogICAgIHZpcnR1YWwgdWludDhfdCoJdl9HZXROZXh0TGluZSgpOwogICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0U3JjT2Zmc2V0KCkKICAgICB7CiAgICAgICAgIHJldHVybiBtX1NyY09mZnNldDsKICAgICB9CiBwcm90ZWN0ZWQ6Ci0gICAgRlhfQk9PTAkJCQlDaGVja0Rlc3RTaXplKCk7CisgICAgYm9vbAkJCQlDaGVja0Rlc3RTaXplKCk7CiAgICAgdm9pZAkJCQlHZXROZXh0T3BlcmF0b3IoKTsKICAgICB2b2lkCQkJCVVwZGF0ZU9wZXJhdG9yKHVpbnQ4X3QgdXNlZF9ieXRlcyk7CiAKQEAgLTI0NCw3ICsyNDQsNyBAQAogICAgIEZYX0RXT1JECQkJbV9TcmNTaXplOwogICAgIEZYX0RXT1JECQkJbV9kd0xpbmVCeXRlczsKICAgICBGWF9EV09SRAkJCW1fU3JjT2Zmc2V0OwotICAgIEZYX0JPT0wJCQkJbV9iRU9EOworICAgIGJvb2wJCQkJbV9iRU9EOwogICAgIHVpbnQ4X3QJCQkJbV9PcGVyYXRvcjsKIH07CiBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OkNDb2RlY19STFNjYW5saW5lRGVjb2RlcigpCkBAIC0yNTMsNyArMjUzLDcgQEAKICAgICAsIG1fU3JjU2l6ZSgwKQogICAgICwgbV9kd0xpbmVCeXRlcygwKQogICAgICwgbV9TcmNPZmZzZXQoMCkKLSAgICAsIG1fYkVPRChGQUxTRSkKKyAgICAsIG1fYkVPRChmYWxzZSkKICAgICAsIG1fT3BlcmF0b3IoMCkKIHsKIH0KQEAgLTI2Myw3ICsyNjMsNyBAQAogICAgICAgICBGWF9GcmVlKG1fcFNjYW5saW5lKTsKICAgICB9CiB9Ci1GWF9CT09MIENDb2RlY19STFNjYW5saW5lRGVjb2Rlcjo6Q2hlY2tEZXN0U2l6ZSgpCitib29sIENDb2RlY19STFNjYW5saW5lRGVjb2Rlcjo6Q2hlY2tEZXN0U2l6ZSgpCiB7CiAgICAgRlhfRFdPUkQgaSA9IDA7CiAgICAgRlhfRFdPUkQgb2xkX3NpemUgPSAwOwpAQCAtMjczLDE0ICsyNzMsMTQgQEAKICAgICAgICAgICAgIG9sZF9zaXplID0gZGVzdF9zaXplOwogICAgICAgICAgICAgZGVzdF9zaXplICs9IG1fcFNyY0J1ZltpXSArIDE7CiAgICAgICAgICAgICBpZiAoZGVzdF9zaXplIDwgb2xkX3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaSArPSBtX3BTcmNCdWZbaV0gKyAyOwogICAgICAgICB9IGVsc2UgaWYgKG1fcFNyY0J1ZltpXSA+IDEyOCkgewogICAgICAgICAgICAgb2xkX3NpemUgPSBkZXN0X3NpemU7CiAgICAgICAgICAgICBkZXN0X3NpemUgKz0gMjU3IC0gbV9wU3JjQnVmW2ldOwogICAgICAgICAgICAgaWYgKGRlc3Rfc2l6ZSA8IG9sZF9zaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgfSBlbHNlIHsKQEAgLTI4OCwxMSArMjg4LDExIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCgoRlhfRFdPUkQpbV9PcmlnV2lkdGggKiBtX25Db21wcyAqIG1fYnBjICogbV9PcmlnSGVpZ2h0ICsgNykgLyA4ID4gZGVzdF9zaXplKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOjpDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywgaW50IGJwYykKK2Jvb2wgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOjpDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywgaW50IGJwYykKIHsKICAgICBtX3BTcmNCdWYgPSBzcmNfYnVmOwogICAgIG1fU3JjU2l6ZSA9IHNyY19zaXplOwpAQCAtMzAwLDIwICszMDAsMjAgQEAKICAgICBtX091dHB1dEhlaWdodCA9IG1fT3JpZ0hlaWdodCA9IGhlaWdodDsKICAgICBtX25Db21wcyA9IG5Db21wczsKICAgICBtX2JwYyA9IGJwYzsKLSAgICBtX2JDb2xvclRyYW5zZm9ybWVkID0gRkFMU0U7CisgICAgbV9iQ29sb3JUcmFuc2Zvcm1lZCA9IGZhbHNlOwogICAgIG1fRG93blNjYWxlID0gMTsKICAgICBtX1BpdGNoID0gKHdpZHRoICogbkNvbXBzICogYnBjICsgMzEpIC8gMzIgKiA0OwogICAgIG1fZHdMaW5lQnl0ZXMgPSAod2lkdGggKiBuQ29tcHMgKiBicGMgKyA3KSAvIDg7CiAgICAgbV9wU2NhbmxpbmUgPSBGWF9BbGxvYyh1aW50OF90LCBtX1BpdGNoKTsKICAgICByZXR1cm4gQ2hlY2tEZXN0U2l6ZSgpOwogfQotRlhfQk9PTCBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OnZfUmV3aW5kKCkKK2Jvb2wgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOjp2X1Jld2luZCgpCiB7CiAgICAgRlhTWVNfbWVtc2V0KG1fcFNjYW5saW5lLCAwLCBtX1BpdGNoKTsKICAgICBtX1NyY09mZnNldCA9IDA7Ci0gICAgbV9iRU9EID0gRkFMU0U7CisgICAgbV9iRU9EID0gZmFsc2U7CiAgICAgbV9PcGVyYXRvciA9IDA7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB1aW50OF90KiBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OnZfR2V0TmV4dExpbmUoKQogewpAQCAtMzI2LDE3ICszMjYsMTcgQEAKICAgICB9CiAgICAgRlhTWVNfbWVtc2V0KG1fcFNjYW5saW5lLCAwLCBtX1BpdGNoKTsKICAgICBGWF9EV09SRCBjb2xfcG9zID0gMDsKLSAgICBGWF9CT09MCWVvbCA9IEZBTFNFOworICAgIGJvb2wJZW9sID0gZmFsc2U7CiAgICAgd2hpbGUgKG1fU3JjT2Zmc2V0IDwgbV9TcmNTaXplICYmICFlb2wpIHsKICAgICAgICAgaWYgKG1fT3BlcmF0b3IgPCAxMjgpIHsKICAgICAgICAgICAgIEZYX0RXT1JEIGNvcHlfbGVuID0gbV9PcGVyYXRvciArIDE7CiAgICAgICAgICAgICBpZiAoY29sX3BvcyArIGNvcHlfbGVuID49IG1fZHdMaW5lQnl0ZXMpIHsKICAgICAgICAgICAgICAgICBjb3B5X2xlbiA9IG1fZHdMaW5lQnl0ZXMgLSBjb2xfcG9zOwotICAgICAgICAgICAgICAgIGVvbCA9IFRSVUU7CisgICAgICAgICAgICAgICAgZW9sID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChjb3B5X2xlbiA+PSBtX1NyY1NpemUgLSBtX1NyY09mZnNldCkgewogICAgICAgICAgICAgICAgIGNvcHlfbGVuID0gbV9TcmNTaXplIC0gbV9TcmNPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgbV9iRU9EID0gVFJVRTsKKyAgICAgICAgICAgICAgICBtX2JFT0QgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcFNjYW5saW5lICsgY29sX3BvcywgbV9wU3JjQnVmICsgbV9TcmNPZmZzZXQsIGNvcHlfbGVuKTsKICAgICAgICAgICAgIGNvbF9wb3MgKz0gY29weV9sZW47CkBAIC0zNDksMTMgKzM0OSwxMyBAQAogICAgICAgICAgICAgRlhfRFdPUkQgZHVwbGljYXRlX2xlbiA9IDI1NyAtIG1fT3BlcmF0b3I7CiAgICAgICAgICAgICBpZiAoY29sX3BvcyArIGR1cGxpY2F0ZV9sZW4gPj0gbV9kd0xpbmVCeXRlcykgewogICAgICAgICAgICAgICAgIGR1cGxpY2F0ZV9sZW4gPSBtX2R3TGluZUJ5dGVzIC0gY29sX3BvczsKLSAgICAgICAgICAgICAgICBlb2wgPSBUUlVFOworICAgICAgICAgICAgICAgIGVvbCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBGWFNZU19tZW1zZXQobV9wU2NhbmxpbmUgKyBjb2xfcG9zLCBmaWxsLCBkdXBsaWNhdGVfbGVuKTsKICAgICAgICAgICAgIGNvbF9wb3MgKz0gZHVwbGljYXRlX2xlbjsKICAgICAgICAgICAgIFVwZGF0ZU9wZXJhdG9yKCh1aW50OF90KWR1cGxpY2F0ZV9sZW4pOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9iRU9EID0gVFJVRTsKKyAgICAgICAgICAgIG1fYkVPRCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmF4LmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmF4LmNwcAppbmRleCBkNDU2MDAzLi4zNDQ2ZDBhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZheC5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19mYXguY3BwCkBAIC03OSw3ICs3OSw3IEBACiAgICAgfQogICAgIHJldHVybiBwb3M7CiB9Ci12b2lkIF9GYXhHNEZpbmRCMUIyKGNvbnN0IHVpbnQ4X3QqIHJlZl9idWYsIGludCBjb2x1bW5zLCBpbnQgYTAsIEZYX0JPT0wgYTBjb2xvciwgaW50JiBiMSwgaW50JiBiMikKK3ZvaWQgX0ZheEc0RmluZEIxQjIoY29uc3QgdWludDhfdCogcmVmX2J1ZiwgaW50IGNvbHVtbnMsIGludCBhMCwgYm9vbCBhMGNvbG9yLCBpbnQmIGIxLCBpbnQmIGIyKQogewogICAgIGlmIChhMGNvbG9yKSB7CiAgICAgICAgIGEwY29sb3IgPSAxOwpAQCAtNDAwLDI3ICs0MDAsMjcgQEAKICAgICAgICAgfQogICAgIH0KIH0KLUZYX0JPT0wgX0ZheEc0R2V0Um93KGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQmIGJpdHBvcywgdWludDhfdCogZGVzdF9idWYsIGNvbnN0IHVpbnQ4X3QqIHJlZl9idWYsIGludCBjb2x1bW5zKQorYm9vbCBfRmF4RzRHZXRSb3coY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zLCB1aW50OF90KiBkZXN0X2J1ZiwgY29uc3QgdWludDhfdCogcmVmX2J1ZiwgaW50IGNvbHVtbnMpCiB7CiAgICAgaW50IGEwID0gLTEsIGEwY29sb3IgPSAxOwogICAgIHdoaWxlICgxKSB7CiAgICAgICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGludCBhMSwgYTIsIGIxLCBiMjsKICAgICAgICAgX0ZheEc0RmluZEIxQjIocmVmX2J1ZiwgY29sdW1ucywgYTAsIGEwY29sb3IsIGIxLCBiMik7Ci0gICAgICAgIEZYX0JPT0wgYml0ID0gTkVYVEJJVDsKKyAgICAgICAgYm9vbCBiaXQgPSBORVhUQklUOwogICAgICAgICBpbnQgdl9kZWx0YSA9IDA7CiAgICAgICAgIGlmIChiaXQpIHsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9CT09MIGJpdDEgPSBORVhUQklUOworICAgICAgICAgICAgYm9vbCBiaXQxID0gTkVYVEJJVDsKICAgICAgICAgICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9CT09MIGJpdDIgPSBORVhUQklUOworICAgICAgICAgICAgYm9vbCBiaXQyID0gTkVYVEJJVDsKICAgICAgICAgICAgIGlmIChiaXQxICYmIGJpdDIpIHsKICAgICAgICAgICAgICAgICB2X2RlbHRhID0gMTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYml0MSkgewpAQCAtNDU3LDEwICs0NTcsMTAgQEAKICAgICAgICAgICAgICAgICBpZiAoYTAgPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBiaXQgPSBORVhUQklUOwogICAgICAgICAgICAgICAgIGlmIChiaXQpIHsKQEAgLTQ2OCwyNiArNDY4LDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBfRmF4RmlsbEJpdHMoZGVzdF9idWYsIGNvbHVtbnMsIGEwLCBiMik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKGIyID49IGNvbHVtbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYTAgPSBiMjsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiaXQxID0gTkVYVEJJVDsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiaXQxID0gTkVYVEJJVDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiaXQyID0gTkVYVEJJVDsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiaXQyID0gTkVYVEJJVDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdDEgJiYgYml0MikgewogICAgICAgICAgICAgICAgICAgICAgICAgdl9kZWx0YSA9IDI7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYml0MSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdl9kZWx0YSA9IC0yOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJpdDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgPSBORVhUQklUOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdCkgewpAQCAtNDk3LDcgKzQ5Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0cG9zID49IGJpdHNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYml0ID0gTkVYVEJJVDsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXQpIHsKQEAgLTUwNSw3ICs1MDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRwb3MgKz0gNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTUxNiwxMyArNTE2LDEzIEBACiAgICAgICAgICAgICBfRmF4RmlsbEJpdHMoZGVzdF9idWYsIGNvbHVtbnMsIGEwLCBhMSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGExID49IGNvbHVtbnMpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgYTAgPSBhMTsKICAgICAgICAgYTBjb2xvciA9ICFhMGNvbG9yOwogICAgIH0KIH0KLUZYX0JPT0wgX0ZheFNraXBFT0woY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zKQorYm9vbCBfRmF4U2tpcEVPTChjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MpCiB7CiAgICAgaW50IHN0YXJ0Yml0ID0gYml0cG9zOwogICAgIHdoaWxlIChiaXRwb3MgPCBiaXRzaXplKSB7CkBAIC01MzEsMTggKzUzMSwxOCBAQAogICAgICAgICAgICAgaWYgKGJpdHBvcyAtIHN0YXJ0Yml0IDw9IDExKSB7CiAgICAgICAgICAgICAgICAgYml0cG9zID0gc3RhcnRiaXQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIF9GYXhHZXQxRExpbmUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zLCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGNvbHVtbnMpCitib29sIF9GYXhHZXQxRExpbmUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zLCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGNvbHVtbnMpCiB7Ci0gICAgaW50IGNvbG9yID0gVFJVRTsKKyAgICBpbnQgY29sb3IgPSB0cnVlOwogICAgIGludCBzdGFydHBvcyA9IDA7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaW50IHJ1bl9sZW4gPSAwOwogICAgICAgICB3aGlsZSAoMSkgewpAQCAtNTUxLDEwICs1NTEsMTAgQEAKICAgICAgICAgICAgICAgICB3aGlsZSAoYml0cG9zIDwgYml0c2l6ZSkgewogICAgICAgICAgICAgICAgICAgICBpbnQgYml0ID0gTkVYVEJJVDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcnVuX2xlbiArPSBydW47CiAgICAgICAgICAgICBpZiAocnVuIDwgNjQpIHsKQEAgLTU3MCwxNyArNTcwLDE3IEBACiAgICAgICAgIH0KICAgICAgICAgY29sb3IgPSAhY29sb3I7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogY2xhc3MgQ0NvZGVjX0ZheERlY29kZXIgOiBwdWJsaWMgQ0NvZGVjX1NjYW5saW5lRGVjb2RlcgogewogcHVibGljOgogICAgIENDb2RlY19GYXhEZWNvZGVyKCk7CiAgICAgdmlydHVhbCB+Q0NvZGVjX0ZheERlY29kZXIoKTsKLSAgICBGWF9CT09MCQkJCUNyZWF0ZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBLLCBGWF9CT09MIEVuZE9mTGluZSwgRlhfQk9PTCBFbmNvZGVkQnl0ZUFsaWduLCBGWF9CT09MIEJsYWNrSXMxLCBpbnQgQ29sdW1ucywgaW50IFJvd3MpOworICAgIGJvb2wJCQkJQ3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEssIGJvb2wgRW5kT2ZMaW5lLCBib29sIEVuY29kZWRCeXRlQWxpZ24sIGJvb2wgQmxhY2tJczEsIGludCBDb2x1bW5zLCBpbnQgUm93cyk7CiAgICAgdmlydHVhbCB2b2lkCQl2X0Rvd25TY2FsZShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KSB7fQotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9SZXdpbmQoKTsKKyAgICB2aXJ0dWFsIGJvb2wJCXZfUmV3aW5kKCk7CiAgICAgdmlydHVhbCB1aW50OF90Kgl2X0dldE5leHRMaW5lKCk7CiAgICAgdmlydHVhbCBGWF9EV09SRAlHZXRTcmNPZmZzZXQoKTsKICAgICBpbnQJCQltX0VuY29kaW5nLCBtX2JFbmRPZkxpbmUsIG1fYkJ5dGVBbGlnbiwgbV9iQmxhY2s7CkBAIC02MDQsOCArNjA0LDggQEAKICAgICAgICAgRlhfRnJlZShtX3BSZWZCdWYpOwogICAgIH0KIH0KLUZYX0JPT0wgQ0NvZGVjX0ZheERlY29kZXI6OkNyZWF0ZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBLLCBGWF9CT09MIEVuZE9mTGluZSwgRlhfQk9PTCBFbmNvZGVkQnl0ZUFsaWduLCBGWF9CT09MIEJsYWNrSXMxLCBpbnQgQ29sdW1ucywgaW50IFJvd3MpCitib29sIENDb2RlY19GYXhEZWNvZGVyOjpDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgSywgYm9vbCBFbmRPZkxpbmUsIGJvb2wgRW5jb2RlZEJ5dGVBbGlnbiwgYm9vbCBCbGFja0lzMSwgaW50IENvbHVtbnMsIGludCBSb3dzKQogewogICAgIG1fRW5jb2RpbmcgPSBLOwogICAgIG1fYkVuZE9mTGluZSA9IEVuZE9mTGluZTsKQEAgLTYyOCwxNCArNjI4LDE0IEBACiAgICAgbV9TcmNTaXplID0gc3JjX3NpemU7CiAgICAgbV9uQ29tcHMgPSAxOwogICAgIG1fYnBjID0gMTsKLSAgICBtX2JDb2xvclRyYW5zZm9ybWVkID0gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgbV9iQ29sb3JUcmFuc2Zvcm1lZCA9IGZhbHNlOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDQ29kZWNfRmF4RGVjb2Rlcjo6dl9SZXdpbmQoKQorYm9vbCBDQ29kZWNfRmF4RGVjb2Rlcjo6dl9SZXdpbmQoKQogewogICAgIEZYU1lTX21lbXNldChtX3BSZWZCdWYsIDB4ZmYsIG1fUGl0Y2gpOwogICAgIGJpdHBvcyA9IDA7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB1aW50OF90KiBDQ29kZWNfRmF4RGVjb2Rlcjo6dl9HZXROZXh0TGluZSgpCiB7CkBAIC02NTEsNyArNjUxLDcgQEAKICAgICB9IGVsc2UgaWYgKG1fRW5jb2RpbmcgPT0gMCkgewogICAgICAgICBfRmF4R2V0MURMaW5lKG1fcFNyY0J1ZiwgYml0c2l6ZSwgYml0cG9zLCBtX3BTY2FubGluZUJ1ZiwgbV9PcmlnV2lkdGgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYX0JPT0wgYk5leHQxRCA9IG1fcFNyY0J1ZltiaXRwb3MgLyA4XSAmICgxIDw8ICg3IC0gYml0cG9zICUgOCkpOworICAgICAgICBib29sIGJOZXh0MUQgPSBtX3BTcmNCdWZbYml0cG9zIC8gOF0gJiAoMSA8PCAoNyAtIGJpdHBvcyAlIDgpKTsKICAgICAgICAgYml0cG9zICsrOwogICAgICAgICBpZiAoYk5leHQxRCkgewogICAgICAgICAgICAgX0ZheEdldDFETGluZShtX3BTcmNCdWYsIGJpdHNpemUsIGJpdHBvcywgbV9wU2NhbmxpbmVCdWYsIG1fT3JpZ1dpZHRoKTsKQEAgLTY2OSw3ICs2NjksNyBAQAogICAgICAgICB3aGlsZSAobV9iQnl0ZUFsaWduICYmIGJpdHBvczAgPCBiaXRwb3MxKSB7CiAgICAgICAgICAgICBpbnQgYml0ID0gbV9wU3JjQnVmW2JpdHBvczAgLyA4XSAmICgxIDw8ICg3IC0gYml0cG9zMCAlIDgpKTsKICAgICAgICAgICAgIGlmIChiaXQgIT0gMCkgewotICAgICAgICAgICAgICAgIG1fYkJ5dGVBbGlnbiA9IEZBTFNFOworICAgICAgICAgICAgICAgIG1fYkJ5dGVBbGlnbiA9IGZhbHNlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBiaXRwb3MwICsrOwogICAgICAgICAgICAgfQpAQCAtODQ2LDcgKzg0Niw3IEBACiAgICAgICAgIGRlc3RfYml0cG9zICsrOwogICAgIH0KIH0KLXN0YXRpYyB2b2lkIF9GYXhFbmNvZGVSdW4odWludDhfdCogZGVzdF9idWYsIGludCYgZGVzdF9iaXRwb3MsIGludCBydW4sIEZYX0JPT0wgYldoaXRlKQorc3RhdGljIHZvaWQgX0ZheEVuY29kZVJ1bih1aW50OF90KiBkZXN0X2J1ZiwgaW50JiBkZXN0X2JpdHBvcywgaW50IHJ1biwgYm9vbCBiV2hpdGUpCiB7CiAgICAgd2hpbGUgKHJ1biA+PSAyNTYwKSB7CiAgICAgICAgIF9BZGRCaXRTdHJlYW0oZGVzdF9idWYsIGRlc3RfYml0cG9zLCAweDFmLCAxMik7CkBAIC05NzIsMTQgKzk3MiwxNCBAQAogICAgIGRlc3Rfc2l6ZSA9IG1fRGVzdEJ1Zi5HZXRTaXplKCk7CiAgICAgbV9EZXN0QnVmLkRldGFjaEJ1ZmZlcigpOwogfQotRlhfQk9PTAlDQ29kZWNfRmF4TW9kdWxlOjpFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcGl0Y2gsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKK2Jvb2wJQ0NvZGVjX0ZheE1vZHVsZTo6RW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHBpdGNoLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCiB7CiAgICAgQ0NvZGVjX0ZheEVuY29kZXIgZW5jb2RlcihzcmNfYnVmLCB3aWR0aCwgaGVpZ2h0LCBwaXRjaCk7CiAgICAgZW5jb2Rlci5FbmNvZGUoZGVzdF9idWYsIGRlc3Rfc2l6ZSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDQ29kZWNfRmF4TW9kdWxlOjpDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgIGludCBLLCBGWF9CT09MIEVuZE9mTGluZSwgRlhfQk9PTCBFbmNvZGVkQnl0ZUFsaWduLCBGWF9CT09MIEJsYWNrSXMxLCBpbnQgQ29sdW1ucywgaW50IFJvd3MpCisgICAgICAgIGludCBLLCBib29sIEVuZE9mTGluZSwgYm9vbCBFbmNvZGVkQnl0ZUFsaWduLCBib29sIEJsYWNrSXMxLCBpbnQgQ29sdW1ucywgaW50IFJvd3MpCiB7CiAgICAgQ0NvZGVjX0ZheERlY29kZXIqIHBEZWNvZGVyID0gbmV3IENDb2RlY19GYXhEZWNvZGVyOwogICAgIHBEZWNvZGVyLT5DcmVhdGUoc3JjX2J1Ziwgc3JjX3NpemUsIHdpZHRoLCBoZWlnaHQsIEssIEVuZE9mTGluZSwgRW5jb2RlZEJ5dGVBbGlnbiwgQmxhY2tJczEsIENvbHVtbnMsIFJvd3MpOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19mbGF0ZS5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZsYXRlLmNwcAppbmRleCBkMTI5ZTM2Li5hNjFiZTc1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZsYXRlLmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZsYXRlLmNwcApAQCAtODQsNyArODQsNyBAQAogY2xhc3MgQ0xaV0RlY29kZXIKIHsKIHB1YmxpYzoKLSAgICBpbnQgRGVjb2RlKHVpbnQ4X3QqIG91dHB1dCwgRlhfRFdPUkQmIG91dGxlbiwgY29uc3QgdWludDhfdCogaW5wdXQsIEZYX0RXT1JEJiBzaXplLCBGWF9CT09MIGJFYXJseUNoYW5nZSk7CisgICAgaW50IERlY29kZSh1aW50OF90KiBvdXRwdXQsIEZYX0RXT1JEJiBvdXRsZW4sIGNvbnN0IHVpbnQ4X3QqIGlucHV0LCBGWF9EV09SRCYgc2l6ZSwgYm9vbCBiRWFybHlDaGFuZ2UpOwogCiBwcml2YXRlOgogICAgIHZvaWQgQWRkQ29kZShGWF9EV09SRCBwcmVmaXhfY29kZSwgdWludDhfdCBhcHBlbmRfY2hhcik7CkBAIC05NCw3ICs5NCw3IEBACiAgICAgRlhfRFdPUkQJbV9PdXRQb3M7CiAgICAgdWludDhfdCoJbV9wT3V0cHV0OwogICAgIGNvbnN0IHVpbnQ4X3QqCW1fcElucHV0OwotICAgIEZYX0JPT0wJCW1fRWFybHk7CisgICAgYm9vbAkJbV9FYXJseTsKICAgICBGWF9EV09SRAltX0NvZGVBcnJheVs1MDIxXTsKICAgICBGWF9EV09SRAltX25Db2RlczsKICAgICB1aW50OF90CQltX0RlY29kZVN0YWNrWzQwMDBdOwpAQCAtMTM0LDcgKzEzNCw3IEBACiAgICAgfQogICAgIG1fRGVjb2RlU3RhY2tbbV9TdGFja0xlbisrXSA9ICh1aW50OF90KWNvZGU7CiB9Ci1pbnQgQ0xaV0RlY29kZXI6OkRlY29kZSh1aW50OF90KiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQmIHNyY19zaXplLCBGWF9CT09MIGJFYXJseUNoYW5nZSkKK2ludCBDTFpXRGVjb2Rlcjo6RGVjb2RlKHVpbnQ4X3QqIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCYgc3JjX3NpemUsIGJvb2wgYkVhcmx5Q2hhbmdlKQogewogICAgIG1fQ29kZUxlbiA9IDk7CiAgICAgbV9JblBvcyA9IDA7CkBAIC0yMzgsMTQgKzIzOCwxNCBAQAogICAgIH0KICAgICByZXR1cm4gKHVpbnQ4X3QpYzsKIH0KLXN0YXRpYyBGWF9CT09MIFBOR19QcmVkaWN0b3JFbmNvZGUodWludDhfdComIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9zaXplLAorc3RhdGljIGJvb2wgUE5HX1ByZWRpY3RvckVuY29kZSh1aW50OF90KiYgZGF0YV9idWYsIEZYX0RXT1JEJiBkYXRhX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucykKIHsKICAgICBjb25zdCBpbnQgQnl0ZXNQZXJQaXhlbCA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICsgNykgLyA4OwogICAgIGNvbnN0IGludCByb3dfc2l6ZSA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICogQ29sdW1ucyArIDcpIC8gODsKICAgICBpZiAocm93X3NpemUgPD0gMCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgY29uc3QgaW50IHJvd19jb3VudCA9IChkYXRhX3NpemUgKyByb3dfc2l6ZSAtIDEpIC8gcm93X3NpemU7CiAgICAgY29uc3QgaW50IGxhc3Rfcm93X3NpemUgPSBkYXRhX3NpemUgJSByb3dfc2l6ZTsKICAgICB1aW50OF90KiBkZXN0X2J1ZiA9IEZYX0FsbG9jMkQodWludDhfdCwgcm93X3NpemUgKyAxLCByb3dfY291bnQpOwpAQCAtMzI4LDcgKzMyOCw3IEBACiAgICAgRlhfRnJlZShkYXRhX2J1Zik7CiAgICAgZGF0YV9idWYgPSBkZXN0X2J1ZjsKICAgICBkYXRhX3NpemUgPSAocm93X3NpemUgKyAxKSAqIHJvd19jb3VudCAtIChsYXN0X3Jvd19zaXplID4gMCA/IChyb3dfc2l6ZSAtIGxhc3Rfcm93X3NpemUpIDogMCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBzdGF0aWMgdm9pZCBQTkdfUHJlZGljdExpbmUodWludDhfdCogcERlc3REYXRhLCBjb25zdCB1aW50OF90KiBwU3JjRGF0YSwgY29uc3QgdWludDhfdCogcExhc3RMaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicGMsIGludCBuQ29sb3JzLCBpbnQgblBpeGVscykKQEAgLTM5MywxMyArMzkzLDEzIEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1zdGF0aWMgRlhfQk9PTCBQTkdfUHJlZGljdG9yKHVpbnQ4X3QqJiBkYXRhX2J1ZiwgRlhfRFdPUkQmIGRhdGFfc2l6ZSwKK3N0YXRpYyBib29sIFBOR19QcmVkaWN0b3IodWludDhfdComIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMpCiB7CiAgICAgY29uc3QgaW50IEJ5dGVzUGVyUGl4ZWwgPSAoQ29sb3JzICogQml0c1BlckNvbXBvbmVudCArIDcpIC8gODsKICAgICBjb25zdCBpbnQgcm93X3NpemUgPSAoQ29sb3JzICogQml0c1BlckNvbXBvbmVudCAqIENvbHVtbnMgKyA3KSAvIDg7CiAgICAgaWYgKHJvd19zaXplIDw9IDApCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGNvbnN0IGludCByb3dfY291bnQgPSAoZGF0YV9zaXplICsgcm93X3NpemUpIC8gKHJvd19zaXplICsgMSk7CiAgICAgY29uc3QgaW50IGxhc3Rfcm93X3NpemUgPSBkYXRhX3NpemUgJSAocm93X3NpemUgKyAxKTsKICAgICB1aW50OF90KiBkZXN0X2J1ZiA9IEZYX0FsbG9jMkQodWludDhfdCwgcm93X3NpemUsIHJvd19jb3VudCk7CkBAIC00NzksNyArNDc5LDcgQEAKICAgICBGWF9GcmVlKGRhdGFfYnVmKTsKICAgICBkYXRhX2J1ZiA9IGRlc3RfYnVmOwogICAgIGRhdGFfc2l6ZSA9IHJvd19zaXplICogcm93X2NvdW50IC0gKGxhc3Rfcm93X3NpemUgPiAwID8gKHJvd19zaXplICsgMSAtIGxhc3Rfcm93X3NpemUpIDogMCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBzdGF0aWMgdm9pZCBUSUZGX1ByZWRpY3RvckVuY29kZUxpbmUodWludDhfdCogZGVzdF9idWYsIGludCByb3dfc2l6ZSwgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2xvcnMsIGludCBDb2x1bW5zKQogewpAQCAtNTE4LDEyICs1MTgsMTIgQEAKICAgICAgICAgfQogICAgIH0KIH0KLXN0YXRpYyBGWF9CT09MIFRJRkZfUHJlZGljdG9yRW5jb2RlKHVpbnQ4X3QqJiBkYXRhX2J1ZiwgRlhfRFdPUkQmIGRhdGFfc2l6ZSwKK3N0YXRpYyBib29sIFRJRkZfUHJlZGljdG9yRW5jb2RlKHVpbnQ4X3QqJiBkYXRhX2J1ZiwgRlhfRFdPUkQmIGRhdGFfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucykKIHsKICAgICBpbnQgcm93X3NpemUgPSAoQ29sb3JzICogQml0c1BlckNvbXBvbmVudCAqIENvbHVtbnMgKyA3KSAvIDg7CiAgICAgaWYgKHJvd19zaXplID09IDApCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGNvbnN0IGludCByb3dfY291bnQgPSAoZGF0YV9zaXplICsgcm93X3NpemUgLSAxKSAvIHJvd19zaXplOwogICAgIGNvbnN0IGludCBsYXN0X3Jvd19zaXplID0gZGF0YV9zaXplICUgcm93X3NpemU7CiAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcm93X2NvdW50OyByb3crKykgewpAQCAtNTMzLDcgKzUzMyw3IEBACiAgICAgICAgIH0KICAgICAgICAgVElGRl9QcmVkaWN0b3JFbmNvZGVMaW5lKHNjYW5fbGluZSwgcm93X3NpemUsIEJpdHNQZXJDb21wb25lbnQsIENvbG9ycywgQ29sdW1ucyk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogc3RhdGljIHZvaWQgVElGRl9QcmVkaWN0TGluZSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IHJvd19zaXplLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbG9ycywgaW50IENvbHVtbnMpCiB7CkBAIC01NjgsMTIgKzU2OCwxMiBAQAogICAgICAgICB9CiAgICAgfQogfQotc3RhdGljIEZYX0JPT0wgVElGRl9QcmVkaWN0b3IodWludDhfdComIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9zaXplLAorc3RhdGljIGJvb2wgVElGRl9QcmVkaWN0b3IodWludDhfdComIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zKQogewogICAgIGludCByb3dfc2l6ZSA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICogQ29sdW1ucyArIDcpIC8gODsKICAgICBpZiAocm93X3NpemUgPT0gMCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgY29uc3QgaW50IHJvd19jb3VudCA9IChkYXRhX3NpemUgKyByb3dfc2l6ZSAtIDEpIC8gcm93X3NpemU7CiAgICAgY29uc3QgaW50IGxhc3Rfcm93X3NpemUgPSBkYXRhX3NpemUgJSByb3dfc2l6ZTsKICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCByb3dfY291bnQ7IHJvdyArKykgewpAQCAtNTgzLDcgKzU4Myw3IEBACiAgICAgICAgIH0KICAgICAgICAgVElGRl9QcmVkaWN0TGluZShzY2FuX2xpbmUsIHJvd19zaXplLCBCaXRzUGVyQ29tcG9uZW50LCBDb2xvcnMsIENvbHVtbnMpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGNsYXNzIENDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2RlciA6IHB1YmxpYyBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyCiB7CkBAIC01OTcsNyArNTk3LDcgQEAKICAgICAgICAgZGVsZXRlIHRoaXM7CiAgICAgfQogICAgIHZpcnR1YWwgdm9pZAkJdl9Eb3duU2NhbGUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkge30KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfUmV3aW5kKCk7CisgICAgdmlydHVhbCBib29sCQl2X1Jld2luZCgpOwogICAgIHZpcnR1YWwgdWludDhfdCoJdl9HZXROZXh0TGluZSgpOwogICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0U3JjT2Zmc2V0KCk7CiAgICAgdm9pZCoJCQkJbV9wRmxhdGU7CkBAIC02NDYsNyArNjQ2LDcgQEAKICAgICBtX091dHB1dEhlaWdodCA9IG1fT3JpZ0hlaWdodCA9IGhlaWdodDsKICAgICBtX25Db21wcyA9IG5Db21wczsKICAgICBtX2JwYyA9IGJwYzsKLSAgICBtX2JDb2xvclRyYW5zZm9ybWVkID0gRkFMU0U7CisgICAgbV9iQ29sb3JUcmFuc2Zvcm1lZCA9IGZhbHNlOwogICAgIG1fUGl0Y2ggPSAod2lkdGggKiBuQ29tcHMgKiBicGMgKyA3KSAvIDg7CiAgICAgbV9wU2NhbmxpbmUgPSBGWF9BbGxvYyh1aW50OF90LCBtX1BpdGNoKTsKICAgICBtX1ByZWRpY3RvciA9IDA7CkBAIC02NzIsMTggKzY3MiwxOCBAQAogICAgICAgICB9CiAgICAgfQogfQotRlhfQk9PTCBDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXI6OnZfUmV3aW5kKCkKK2Jvb2wgQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyOjp2X1Jld2luZCgpCiB7CiAgICAgaWYgKG1fcEZsYXRlKSB7CiAgICAgICAgIEZQREZBUElfRmxhdGVFbmQobV9wRmxhdGUpOwogICAgIH0KICAgICBtX3BGbGF0ZSA9IEZQREZBUElfRmxhdGVJbml0KG15X2FsbG9jX2Z1bmMsIG15X2ZyZWVfZnVuYyk7CiAgICAgaWYgKG1fcEZsYXRlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZQREZBUElfRmxhdGVJbnB1dChtX3BGbGF0ZSwgbV9TcmNCdWYsIG1fU3JjU2l6ZSk7CiAgICAgbV9MZWZ0T3ZlciA9IDA7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB1aW50OF90KiBDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXI6OnZfR2V0TmV4dExpbmUoKQogewpAQCAtNzMyLDcgKzczMiw3IEBACiBzdGF0aWMgdm9pZCBGbGF0ZVVuY29tcHJlc3MoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIEZYX0RXT1JEIG9yaWdfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUsIEZYX0RXT1JEJiBvZmZzZXQpCiB7Ci0gICAgY29uc3QgRlhfQk9PTCB1c2VPbGRJbXBsID0gc3JjX3NpemUgPCAxMDI0MDsKKyAgICBjb25zdCBib29sIHVzZU9sZEltcGwgPSBzcmNfc2l6ZSA8IDEwMjQwOwogICAgIEZYX0RXT1JEIGd1ZXNzX3NpemUgPSBvcmlnX3NpemUgPyBvcmlnX3NpemUgOiBzcmNfc2l6ZSAqIDI7CiAgICAgRlhfRFdPUkQgYWxsb2Nfc3RlcCA9IG9yaWdfc2l6ZSA/IDEwMjQwIDogKHNyY19zaXplIDwgMTAyNDAgPyAxMDI0MCA6IHNyY19zaXplKTsKICAgICBzdGF0aWMgY29uc3QgRlhfRFdPUkQga01heEluaXRpYWxBbGxvY1NpemUgPSAxMDAwMDAwMDsKQEAgLTgzOSw3ICs4MzksNyBAQAogICAgIHBEZWNvZGVyLT5DcmVhdGUoc3JjX2J1Ziwgc3JjX3NpemUsIHdpZHRoLCBoZWlnaHQsIG5Db21wcywgYnBjLCBwcmVkaWN0b3IsIENvbG9ycywgQml0c1BlckNvbXBvbmVudCwgQ29sdW1ucyk7CiAgICAgcmV0dXJuIHBEZWNvZGVyOwogfQotRlhfRFdPUkQgQ0NvZGVjX0ZsYXRlTW9kdWxlOjpGbGF0ZU9yTFpXRGVjb2RlKEZYX0JPT0wgYkxaVywgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIEZYX0JPT0wgYkVhcmx5Q2hhbmdlLAorRlhfRFdPUkQgQ0NvZGVjX0ZsYXRlTW9kdWxlOjpGbGF0ZU9yTFpXRGVjb2RlKGJvb2wgYkxaVywgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGJvb2wgYkVhcmx5Q2hhbmdlLAogICAgICAgICBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMsCiAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCiB7CkBAIC04NzYsNyArODc2LDcgQEAKICAgICBpZiAocHJlZGljdG9yX3R5cGUgPT0gMCkgewogICAgICAgICByZXR1cm4gb2Zmc2V0OwogICAgIH0KLSAgICBGWF9CT09MIHJldCA9IFRSVUU7CisgICAgYm9vbCByZXQgPSB0cnVlOwogICAgIGlmIChwcmVkaWN0b3JfdHlwZSA9PSAyKSB7CiAgICAgICAgIHJldCA9IFBOR19QcmVkaWN0b3IoZGVzdF9idWYsIGRlc3Rfc2l6ZSwgQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbnMpOwpAQCAtODg2LDcgKzg4Niw3IEBACiAgICAgfQogICAgIHJldHVybiByZXQgPyBvZmZzZXQgOiAtMTsKIH0KLUZYX0JPT0wgQ0NvZGVjX0ZsYXRlTW9kdWxlOjpFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCitib29sIENDb2RlY19GbGF0ZU1vZHVsZTo6RW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKIHsKQEAgLTg5Niw3ICs4OTYsNyBAQAogICAgIHVpbnQ4X3QqIHBTcmNCdWYgPSBOVUxMOwogICAgIHBTcmNCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBzcmNfc2l6ZSk7CiAgICAgRlhTWVNfbWVtY3B5KHBTcmNCdWYsIHNyY19idWYsIHNyY19zaXplKTsKLSAgICBGWF9CT09MIHJldCA9IFRSVUU7CisgICAgYm9vbCByZXQgPSB0cnVlOwogICAgIGlmIChwcmVkaWN0b3IgPT0gMikgewogICAgICAgICByZXQgPSBUSUZGX1ByZWRpY3RvckVuY29kZShwU3JjQnVmLCBzcmNfc2l6ZSwgQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5zKTsKQEAgLTkwOSwxMiArOTA5LDEyIEBACiAgICAgRlhfRnJlZShwU3JjQnVmKTsKICAgICByZXR1cm4gcmV0OwogfQotRlhfQk9PTCBDQ29kZWNfRmxhdGVNb2R1bGU6OkVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQorYm9vbCBDQ29kZWNfRmxhdGVNb2R1bGU6OkVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQogewogICAgIGRlc3Rfc2l6ZSA9IHNyY19zaXplICsgc3JjX3NpemUgLyAxMDAwICsgMTI7CiAgICAgZGVzdF9idWYgPSBGWF9BbGxvYyggdWludDhfdCwgZGVzdF9zaXplKTsKICAgICB1bnNpZ25lZCBsb25nIHRlbXBfc2l6ZSA9IGRlc3Rfc2l6ZTsKICAgICBGUERGQVBJX0ZsYXRlQ29tcHJlc3MoZGVzdF9idWYsICZ0ZW1wX3NpemUsIHNyY19idWYsIHNyY19zaXplKTsKICAgICBkZXN0X3NpemUgPSAoRlhfRFdPUkQpdGVtcF9zaXplOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19pY2MuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19pY2MuY3BwCmluZGV4IDc1MDdmZTUuLjBjY2ZlMWYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfaWNjLmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ljYy5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKIGNvbnN0IEZYX0RXT1JEIE5fQ09NUE9ORU5UX0NNWUsgPSA0OwogY29uc3QgRlhfRFdPUkQgTl9DT01QT05FTlRfREVGQVVMVCA9IDM7CiAKLUZYX0JPT0wgTUQ1Q29tcHV0ZUlEKCBjb25zdCB2b2lkKiBidWYsIEZYX0RXT1JEIGR3U2l6ZSwgdWludDhfdCBJRFsxNl0gKQorYm9vbCBNRDVDb21wdXRlSUQoIGNvbnN0IHZvaWQqIGJ1ZiwgRlhfRFdPUkQgZHdTaXplLCB1aW50OF90IElEWzE2XSApCiB7CiAgICAgcmV0dXJuIGNtc01ENWNvbXB1dGVJREV4dChidWYsIGR3U2l6ZSwgSUQpOwogfQpAQCAtMjIsNTAgKzIyLDUwIEBACiAgICAgY21zSFRSQU5TRk9STSBtX2hUcmFuc2Zvcm07CiAgICAgaW50CQkJbV9uU3JjQ29tcG9uZW50czsKICAgICBpbnQJCQltX25Ec3RDb21wb25lbnRzOwotICAgIEZYX0JPT0wJCW1fYkxhYjsKKyAgICBib29sCQltX2JMYWI7CiB9OwogZXh0ZXJuICJDIiB7CiAgICAgaW50IG91ckhhbmRsZXIoaW50IEVycm9yQ29kZSwgY29uc3QgY2hhciAqRXJyb3JUZXh0KQogICAgIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIH07Ci1GWF9CT09MIENoZWNrQ29tcG9uZW50cyhjbXNDb2xvclNwYWNlU2lnbmF0dXJlIGNzLCBpbnQgbkNvbXBvbmVudHMsIEZYX0JPT0wgYkRzdCkKK2Jvb2wgQ2hlY2tDb21wb25lbnRzKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgY3MsIGludCBuQ29tcG9uZW50cywgYm9vbCBiRHN0KQogewogICAgIGlmIChuQ29tcG9uZW50cyA8PSAwIHx8IG5Db21wb25lbnRzID4gMTUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHN3aXRjaChjcykgewogICAgICAgICBjYXNlIGNtc1NpZ0xhYkRhdGE6CiAgICAgICAgICAgICBpZiAobkNvbXBvbmVudHMgPCAzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIGNtc1NpZ0dyYXlEYXRhOgogICAgICAgICAgICAgaWYgKGJEc3QgJiYgbkNvbXBvbmVudHMgIT0gMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIWJEc3QgJiYgbkNvbXBvbmVudHMgPiAyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIGNtc1NpZ1JnYkRhdGE6CiAgICAgICAgICAgICBpZiAoYkRzdCAmJiBuQ29tcG9uZW50cyAhPSAzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIGNtc1NpZ0NteWtEYXRhOgogICAgICAgICAgICAgaWYgKGJEc3QgJiYgbkNvbXBvbmVudHMgIT0gNCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGlmIChuQ29tcG9uZW50cyAhPSAzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGludDMyX3QgR2V0Q1NDb21wb25lbnRzKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgY3MpCiB7CkBAIC0xMTIsMTIgKzExMiwxMiBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaW50IHNyY0Zvcm1hdDsKLSAgICBGWF9CT09MIGJMYWIgPSBGQUxTRTsKKyAgICBib29sIGJMYWIgPSBmYWxzZTsKICAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIHNyY0NTID0gY21zR2V0Q29sb3JTcGFjZShzcmNQcm9maWxlKTsKICAgICBuU3JjQ29tcG9uZW50cyA9IEdldENTQ29tcG9uZW50cyhzcmNDUyk7CiAgICAgaWYgKHNyY0NTID09IGNtc1NpZ0xhYkRhdGEpIHsKICAgICAgICAgc3JjRm9ybWF0ID0gQ09MT1JTUEFDRV9TSChQVF9MYWIpIHwgQ0hBTk5FTFNfU0goblNyY0NvbXBvbmVudHMpIHwgQllURVNfU0goMCk7Ci0gICAgICAgIGJMYWIgPSBUUlVFOworICAgICAgICBiTGFiID0gdHJ1ZTsKICAgICB9IGVsc2UgewogICAgICAgICBzcmNGb3JtYXQgPSBDT0xPUlNQQUNFX1NIKFBUX0FOWSkgfCBDSEFOTkVMU19TSChuU3JjQ29tcG9uZW50cykgfCBCWVRFU19TSCgxKTsKICAgICAgICAgaWYgKHNyY0NTID09IGNtc1NpZ1JnYkRhdGEgJiYgVF9ET1NXQVAoZHdTcmNGb3JtYXQpKSB7CkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIGRzdENTID0gY21zR2V0Q29sb3JTcGFjZShkc3RQcm9maWxlKTsKLSAgICBpZiAoIUNoZWNrQ29tcG9uZW50cyhkc3RDUywgbkRzdENvbXBvbmVudHMsIFRSVUUpKSB7CisgICAgaWYgKCFDaGVja0NvbXBvbmVudHMoZHN0Q1MsIG5Ec3RDb21wb25lbnRzLCB0cnVlKSkgewogICAgICAgICBjbXNDbG9zZVByb2ZpbGUoc3JjUHJvZmlsZSk7CiAgICAgICAgIGNtc0Nsb3NlUHJvZmlsZShkc3RQcm9maWxlKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2piaWcuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qYmlnLmNwcAppbmRleCA1MTE4NDMwLi5jMTNhMmY5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2piaWcuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfamJpZy5jcHAKQEAgLTI2LDI4ICsyNiwyOCBAQAogICAgIH0KICAgICBwSmJpZzJDb250ZW50ID0gTlVMTDsKIH0KLUZYX0JPT0wgQ0NvZGVjX0piaWcyTW9kdWxlOjpEZWNvZGUoRlhfRFdPUkQgd2lkdGgsIEZYX0RXT1JEIGhlaWdodCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCitib29sIENDb2RlY19KYmlnMk1vZHVsZTo6RGVjb2RlKEZYX0RXT1JEIHdpZHRoLCBGWF9EV09SRCBoZWlnaHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBnbG9iYWxfZGF0YSwgRlhfRFdPUkQgZ2xvYmFsX3NpemUsIHVpbnQ4X3QqIGRlc3RfYnVmLCBGWF9EV09SRCBkZXN0X3BpdGNoKQogewogICAgIEZYU1lTX21lbXNldChkZXN0X2J1ZiwgMCwgaGVpZ2h0ICogZGVzdF9waXRjaCk7CiAgICAgQ0pCaWcyX0NvbnRleHQqIHBDb250ZXh0ID0gQ0pCaWcyX0NvbnRleHQ6OkNyZWF0ZUNvbnRleHQoJm1fTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KilnbG9iYWxfZGF0YSwgZ2xvYmFsX3NpemUsICh1aW50OF90KilzcmNfYnVmLCBzcmNfc2l6ZSwgSkJJRzJfRU1CRURfU1RSRUFNLCAmbV9TeW1ib2xEaWN0Q2FjaGUpOwogICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbnQgcmV0ID0gcENvbnRleHQtPmdldEZpcnN0UGFnZShkZXN0X2J1Ziwgd2lkdGgsIGhlaWdodCwgZGVzdF9waXRjaCwgTlVMTCk7CiAgICAgQ0pCaWcyX0NvbnRleHQ6OkRlc3Ryb3lDb250ZXh0KHBDb250ZXh0KTsKICAgICBpZiAocmV0ICE9IEpCSUcyX1NVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGludCBkd29yZF9zaXplID0gaGVpZ2h0ICogZGVzdF9waXRjaCAvIDQ7CiAgICAgRlhfRFdPUkQqIGR3b3JkX2J1ZiA9IChGWF9EV09SRCopZGVzdF9idWY7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkd29yZF9zaXplOyBpICsrKSB7CiAgICAgICAgIGR3b3JkX2J1ZltpXSA9IH5kd29yZF9idWZbaV07CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDQ29kZWNfSmJpZzJNb2R1bGU6OkRlY29kZShJRlhfRmlsZVJlYWQqIGZpbGVfcHRyLAorYm9vbCBDQ29kZWNfSmJpZzJNb2R1bGU6OkRlY29kZShJRlhfRmlsZVJlYWQqIGZpbGVfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgd2lkdGgsIEZYX0RXT1JEJiBoZWlnaHQsIEZYX0RXT1JEJiBwaXRjaCwgdWludDhfdComIGRlc3RfYnVmKQogewogICAgIENKQmlnMl9Db250ZXh0KiBwQ29udGV4dCA9IE5VTEw7CkBAIC03MSwxNSArNzEsMTUgQEAKICAgICBoZWlnaHQgPSAoRlhfRFdPUkQpZGVzdF9pbWFnZS0+bV9uSGVpZ2h0OwogICAgIHBpdGNoID0gKEZYX0RXT1JEKWRlc3RfaW1hZ2UtPm1fblN0cmlkZTsKICAgICBkZXN0X2J1ZiA9IGRlc3RfaW1hZ2UtPm1fcERhdGE7Ci0gICAgZGVzdF9pbWFnZS0+bV9iTmVlZEZyZWUgPSBGQUxTRTsKKyAgICBkZXN0X2ltYWdlLT5tX2JOZWVkRnJlZSA9IGZhbHNlOwogICAgIGRlbGV0ZSBkZXN0X2ltYWdlOwogICAgIEZYX0ZyZWUoc3JjX2J1Zik7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiBmYWlsZWQ6CiAgICAgaWYoc3JjX2J1ZikgewogICAgICAgICBGWF9GcmVlKHNyY19idWYpOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogRlhDT0RFQ19TVEFUVVMgQ0NvZGVjX0piaWcyTW9kdWxlOjpTdGFydERlY29kZSh2b2lkKiBwSmJpZzJDb250ZXh0LCBGWF9EV09SRCB3aWR0aCwgRlhfRFdPUkQgaGVpZ2h0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKICAgICAgICAgY29uc3QgdWludDhfdCogZ2xvYmFsX2RhdGEsIEZYX0RXT1JEIGdsb2JhbF9zaXplLCB1aW50OF90KiBkZXN0X2J1ZiwgRlhfRFdPUkQgZGVzdF9waXRjaCwgSUZYX1BhdXNlKiBwUGF1c2UpCkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfYnVmID0gZGVzdF9idWY7CiAgICAgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfcGl0Y2ggPSBkZXN0X3BpdGNoOwogICAgIG1fcEpiaWcyQ29udGV4dC0+bV9wUGF1c2UgPSBwUGF1c2U7Ci0gICAgbV9wSmJpZzJDb250ZXh0LT5tX2JGaWxlUmVhZGVyID0gRkFMU0U7CisgICAgbV9wSmJpZzJDb250ZXh0LT5tX2JGaWxlUmVhZGVyID0gZmFsc2U7CiAgICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmLCAwLCBoZWlnaHQgKiBkZXN0X3BpdGNoKTsKICAgICBtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQgPSBDSkJpZzJfQ29udGV4dDo6Q3JlYXRlQ29udGV4dCgmbV9Nb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKWdsb2JhbF9kYXRhLCBnbG9iYWxfc2l6ZSwgKHVpbnQ4X3QqKXNyY19idWYsIHNyY19zaXplLCBKQklHMl9FTUJFRF9TVFJFQU0sICZtX1N5bWJvbERpY3RDYWNoZSwgcFBhdXNlKTsKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUzsKICAgICB9CiAgICAgQ0NvZGVjX0piaWcyQ29udGV4dCogbV9wSmJpZzJDb250ZXh0ID0gKENDb2RlY19KYmlnMkNvbnRleHQqKXBKYmlnMkNvbnRleHQ7Ci0gICAgbV9wSmJpZzJDb250ZXh0LT5tX2JGaWxlUmVhZGVyID0gVFJVRTsKKyAgICBtX3BKYmlnMkNvbnRleHQtPm1fYkZpbGVSZWFkZXIgPSB0cnVlOwogICAgIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlID0gTlVMTDsKICAgICBtX3BKYmlnMkNvbnRleHQtPm1fc3JjX3NpemUgPSAoRlhfRFdPUkQpZmlsZV9wdHItPkdldFNpemUoKTsKICAgICBtX3BKYmlnMkNvbnRleHQtPm1fc3JjX2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfc2l6ZSk7CkBAIC0xNDUsNyArMTQ1LDcgQEAKICAgICAgICAgaGVpZ2h0ID0gKEZYX0RXT1JEKW1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLT5tX25IZWlnaHQ7CiAgICAgICAgIHBpdGNoID0gKEZYX0RXT1JEKW1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLT5tX25TdHJpZGU7CiAgICAgICAgIGRlc3RfYnVmID0gbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fcERhdGE7Ci0gICAgICAgIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLT5tX2JOZWVkRnJlZSA9IEZBTFNFOworICAgICAgICBtX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9pbWFnZS0+bV9iTmVlZEZyZWUgPSBmYWxzZTsKICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CiAgICAgfQogICAgIENKQmlnMl9Db250ZXh0OjpEZXN0cm95Q29udGV4dChtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQpOwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgaGVpZ2h0ID0gKEZYX0RXT1JEKW1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLT5tX25IZWlnaHQ7CiAgICAgcGl0Y2ggPSAoRlhfRFdPUkQpbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fblN0cmlkZTsKICAgICBkZXN0X2J1ZiA9IG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLT5tX3BEYXRhOwotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLT5tX2JOZWVkRnJlZSA9IEZBTFNFOworICAgIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLT5tX2JOZWVkRnJlZSA9IGZhbHNlOwogICAgIGRlbGV0ZSBtX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9pbWFnZTsKICAgICBGWF9GcmVlKG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfYnVmKTsKICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanBlZy5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pwZWcuY3BwCmluZGV4IDY4MzlkMzEuLjFhYzJmMDMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanBlZy5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcGVnLmNwcApAQCAtNzgsMTUgKzc4LDE1IEBACiAjZGVmaW5lCUpQRUdfTUFSS0VSX0FVVEhPUlRJTUUJKEpQRUdfQVBQMCArIDMpCiAjZGVmaW5lCUpQRUdfTUFSS0VSX01BWFNJWkUJMHhGRkZGCiAjZGVmaW5lCUpQRUdfT1ZFUkhFQURfTEVOCTE0Ci1zdGF0aWMJRlhfQk9PTCBfSnBlZ0VtYmVkSWNjUHJvZmlsZShqX2NvbXByZXNzX3B0ciBjaW5mbywgY29uc3QgdWludDhfdCogaWNjX2J1Zl9wdHIsIEZYX0RXT1JEIGljY19sZW5ndGgpCitzdGF0aWMJYm9vbCBfSnBlZ0VtYmVkSWNjUHJvZmlsZShqX2NvbXByZXNzX3B0ciBjaW5mbywgY29uc3QgdWludDhfdCogaWNjX2J1Zl9wdHIsIEZYX0RXT1JEIGljY19sZW5ndGgpCiB7CiAgICAgaWYoaWNjX2J1Zl9wdHIgPT0gTlVMTCB8fCBpY2NfbGVuZ3RoID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX0RXT1JEIGljY19zZWdtZW50X3NpemUgPSAoSlBFR19NQVJLRVJfTUFYU0laRSAtIDIgLSBKUEVHX09WRVJIRUFEX0xFTik7CiAgICAgRlhfRFdPUkQgaWNjX3NlZ21lbnRfbnVtID0gKGljY19sZW5ndGggLyBpY2Nfc2VnbWVudF9zaXplKSArIDE7CiAgICAgaWYgKGljY19zZWdtZW50X251bSA+IDI1NSkJewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfRFdPUkQgaWNjX2RhdGFfbGVuZ3RoID0gSlBFR19PVkVSSEVBRF9MRU4gKyAoaWNjX3NlZ21lbnRfbnVtID4gMSA/IGljY19zZWdtZW50X3NpemUgOiBpY2NfbGVuZ3RoKTsKICAgICB1aW50OF90KiBpY2NfZGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIGljY19kYXRhX2xlbmd0aCk7CkBAIC0xMDIsNyArMTAyLDcgQEAKICAgICBGWFNZU19tZW1jcHkoaWNjX2RhdGEgKyBKUEVHX09WRVJIRUFEX0xFTiwgaWNjX2J1Zl9wdHIgKyBpY2Nfc2l6ZSwgaWNjX2xlbmd0aCAtIGljY19zaXplKTsKICAgICBqcGVnX3dyaXRlX21hcmtlcihjaW5mbywgSlBFR19NQVJLRVJfSUNDLCBpY2NfZGF0YSwgSlBFR19PVkVSSEVBRF9MRU4gKyBpY2NfbGVuZ3RoIC0gaWNjX3NpemUpOwogICAgIEZYX0ZyZWUoaWNjX2RhdGEpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogZXh0ZXJuICJDIiB7CiAgICAgc3RhdGljIHZvaWQgX2Rlc3RfZG9fbm90aGluZyhqX2NvbXByZXNzX3B0ciBjaW5mbykge30KQEAgLTExMCw3ICsxMTAsNyBAQAogZXh0ZXJuICJDIiB7CiAgICAgc3RhdGljIGJvb2xlYW4gX2Rlc3RfZW1wdHkoal9jb21wcmVzc19wdHIgY2luZm8pCiAgICAgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9OwogI2RlZmluZQlKUEVHX0JMT0NLX1NJWkUJMTA0ODU3NgpAQCAtMTc4LDkgKzE3OCw5IEBACiAgICAgfQogICAgIGpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7CiAgICAgaWYocXVhbGl0eSAhPSA3NSkgewotICAgICAgICBqcGVnX3NldF9xdWFsaXR5KCZjaW5mbywgcXVhbGl0eSwgVFJVRSk7CisgICAgICAgIGpwZWdfc2V0X3F1YWxpdHkoJmNpbmZvLCBxdWFsaXR5LCB0cnVlKTsKICAgICB9Ci0gICAganBlZ19zdGFydF9jb21wcmVzcygmY2luZm8sIFRSVUUpOworICAgIGpwZWdfc3RhcnRfY29tcHJlc3MoJmNpbmZvLCB0cnVlKTsKICAgICBfSnBlZ0VtYmVkSWNjUHJvZmlsZSgmY2luZm8sIGljY19idWYsIGljY19sZW5ndGgpOwogICAgIEpTQU1QUk9XIHJvd19wb2ludGVyWzFdOwogICAgIEpESU1FTlNJT04gcm93OwpAQCAtMjIxLDggKzIyMSw4IEBACiAgICAgfQogICAgIGRlc3Rfc2l6ZSA9IGRlc3RfYnVmX2xlbmd0aCAtIChGWF9TVFJTSVpFKWRlc3QuZnJlZV9pbl9idWZmZXI7CiB9Ci1zdGF0aWMgRlhfQk9PTCBfSnBlZ0xvYWRJbmZvKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBudW1fY29tcG9uZW50cywgaW50JiBiaXRzX3Blcl9jb21wb25lbnRzLCBGWF9CT09MJiBjb2xvcl90cmFuc2Zvcm0sCitzdGF0aWMgYm9vbCBfSnBlZ0xvYWRJbmZvKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBudW1fY29tcG9uZW50cywgaW50JiBiaXRzX3Blcl9jb21wb25lbnRzLCBib29sJiBjb2xvcl90cmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBpY2NfYnVmX3B0ciwgRlhfRFdPUkQqIGljY19sZW5ndGgpCiB7CiAgICAgX0pwZWdTY2FuU09JKHNyY19idWYsIHNyY19zaXplKTsKQEAgLTIzOCw3ICsyMzgsNyBAQAogICAgIGptcF9idWYgbWFyazsKICAgICBjaW5mby5jbGllbnRfZGF0YSA9ICZtYXJrOwogICAgIGlmIChzZXRqbXAobWFyaykgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoJmNpbmZvKTsKICAgICBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyIHNyYzsKQEAgLTI1MiwxNSArMjUyLDE1IEBACiAgICAgY2luZm8uc3JjID0gJnNyYzsKICAgICBpZiAoc2V0am1wKG1hcmspID09IC0xKSB7CiAgICAgICAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZihpY2NfYnVmX3B0ciAmJiBpY2NfbGVuZ3RoKSB7CiAgICAgICAgIGpwZWdfc2F2ZV9tYXJrZXJzKCZjaW5mbywgSlBFR19NQVJLRVJfSUNDLCBKUEVHX01BUktFUl9NQVhTSVpFKTsKICAgICB9Ci0gICAgaW50IHJldCA9IGpwZWdfcmVhZF9oZWFkZXIoJmNpbmZvLCBUUlVFKTsKKyAgICBpbnQgcmV0ID0ganBlZ19yZWFkX2hlYWRlcigmY2luZm8sIHRydWUpOwogICAgIGlmIChyZXQgIT0gSlBFR19IRUFERVJfT0spIHsKICAgICAgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHdpZHRoID0gY2luZm8uaW1hZ2Vfd2lkdGg7CiAgICAgaGVpZ2h0ID0gY2luZm8uaW1hZ2VfaGVpZ2h0OwpAQCAtMjc0LDIxICsyNzQsMjEgQEAKICAgICAgICAgKmljY19sZW5ndGggPSAwOwogICAgIH0KICAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogY2xhc3MgQ0NvZGVjX0pwZWdEZWNvZGVyIDogcHVibGljIENDb2RlY19TY2FubGluZURlY29kZXIKIHsKIHB1YmxpYzoKICAgICBDQ29kZWNfSnBlZ0RlY29kZXIoKTsKICAgICB+Q0NvZGVjX0pwZWdEZWNvZGVyKCk7Ci0gICAgRlhfQk9PTAkJCQlDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIENvbG9yVHJhbnNmb3JtLCBJRlhfSnBlZ1Byb3ZpZGVyKiBwSlApOworICAgIGJvb2wJCQkJQ3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb2xvclRyYW5zZm9ybSwgSUZYX0pwZWdQcm92aWRlciogcEpQKTsKICAgICB2aXJ0dWFsIHZvaWQJCURlc3Ryb3koKQogICAgIHsKICAgICAgICAgZGVsZXRlIHRoaXM7CiAgICAgfQogICAgIHZpcnR1YWwgdm9pZAkJdl9Eb3duU2NhbGUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQl2X1Jld2luZCgpOworICAgIHZpcnR1YWwgYm9vbAkJdl9SZXdpbmQoKTsKICAgICB2aXJ0dWFsIHVpbnQ4X3QqCXZfR2V0TmV4dExpbmUoKTsKICAgICB2aXJ0dWFsIEZYX0RXT1JECUdldFNyY09mZnNldCgpOwogICAgIGptcF9idWYJCW1fSm1wQnVmOwpAQCAtMjk4LDggKzI5OCw4IEBACiAgICAgY29uc3QgdWludDhfdCoJbV9TcmNCdWY7CiAgICAgRlhfRFdPUkQJbV9TcmNTaXplOwogICAgIHVpbnQ4X3QqCW1fcFNjYW5saW5lQnVmOwotICAgIEZYX0JPT0wJCUluaXREZWNvZGUoKTsKLSAgICBGWF9CT09MCQltX2JJbml0ZWQsIG1fYlN0YXJ0ZWQsIG1fYkpwZWdUcmFuc2Zvcm07CisgICAgYm9vbAkJSW5pdERlY29kZSgpOworICAgIGJvb2wJCW1fYkluaXRlZCwgbV9iU3RhcnRlZCwgbV9iSnBlZ1RyYW5zZm9ybTsKIHByb3RlY3RlZDoKICAgICBJRlhfSnBlZ1Byb3ZpZGVyKgltX3BFeHRQcm92aWRlcjsKICAgICB2b2lkKgkJCQltX3BFeHRDb250ZXh0OwpAQCAtMzA5LDggKzMwOSw4IEBACiB7CiAgICAgbV9wU2NhbmxpbmVCdWYgPSBOVUxMOwogICAgIG1fRG93blNjYWxlID0gMTsKLSAgICBtX2JTdGFydGVkID0gRkFMU0U7Ci0gICAgbV9iSW5pdGVkID0gRkFMU0U7CisgICAgbV9iU3RhcnRlZCA9IGZhbHNlOworICAgIG1fYkluaXRlZCA9IGZhbHNlOwogICAgIG1fcEV4dFByb3ZpZGVyID0gTlVMTDsKICAgICBtX3BFeHRDb250ZXh0ID0gTlVMTDsKICAgICBGWFNZU19tZW1zZXQoJmNpbmZvLCAwLCBzaXplb2YoY2luZm8pKTsKQEAgLTMzMSwzMSArMzMxLDMxIEBACiAgICAgICAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7CiAgICAgfQogfQotRlhfQk9PTCBDQ29kZWNfSnBlZ0RlY29kZXI6OkluaXREZWNvZGUoKQorYm9vbCBDQ29kZWNfSnBlZ0RlY29kZXI6OkluaXREZWNvZGUoKQogewogICAgIGNpbmZvLmVyciA9ICZqZXJyOwogICAgIGNpbmZvLmNsaWVudF9kYXRhID0gJm1fSm1wQnVmOwogICAgIGlmIChzZXRqbXAobV9KbXBCdWYpID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCZjaW5mbyk7Ci0gICAgbV9iSW5pdGVkID0gVFJVRTsKKyAgICBtX2JJbml0ZWQgPSB0cnVlOwogICAgIGNpbmZvLnNyYyA9ICZzcmM7CiAgICAgc3JjLmJ5dGVzX2luX2J1ZmZlciA9IG1fU3JjU2l6ZTsKICAgICBzcmMubmV4dF9pbnB1dF9ieXRlID0gbV9TcmNCdWY7CiAgICAgaWYgKHNldGptcChtX0ptcEJ1ZikgPT0gLTEpIHsKICAgICAgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKLSAgICAgICAgbV9iSW5pdGVkID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgbV9iSW5pdGVkID0gZmFsc2U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgY2luZm8uaW1hZ2Vfd2lkdGggPSBtX09yaWdXaWR0aDsKICAgICBjaW5mby5pbWFnZV9oZWlnaHQgPSBtX09yaWdIZWlnaHQ7Ci0gICAgaW50IHJldCA9IGpwZWdfcmVhZF9oZWFkZXIoJmNpbmZvLCBUUlVFKTsKKyAgICBpbnQgcmV0ID0ganBlZ19yZWFkX2hlYWRlcigmY2luZm8sIHRydWUpOwogICAgIGlmIChyZXQgIT0gSlBFR19IRUFERVJfT0spIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChjaW5mby5zYXdfQWRvYmVfbWFya2VyKSB7Ci0gICAgICAgIG1fYkpwZWdUcmFuc2Zvcm0gPSBUUlVFOworICAgICAgICBtX2JKcGVnVHJhbnNmb3JtID0gdHJ1ZTsKICAgICB9CiAgICAgaWYgKGNpbmZvLm51bV9jb21wb25lbnRzID09IDMgJiYgIW1fYkpwZWdUcmFuc2Zvcm0pIHsKICAgICAgICAgY2luZm8ub3V0X2NvbG9yX3NwYWNlID0gY2luZm8uanBlZ19jb2xvcl9zcGFjZTsKQEAgLTM2NSwxMCArMzY1LDEwIEBACiAgICAgbV9PdXRwdXRXaWR0aCA9IG1fT3JpZ1dpZHRoOwogICAgIG1fT3V0cHV0SGVpZ2h0ID0gbV9PcmlnSGVpZ2h0OwogICAgIG1fbkRlZmF1bHRTY2FsZURlbm9tID0gY2luZm8uc2NhbGVfZGVub207Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENDb2RlY19KcGVnRGVjb2Rlcjo6Q3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29tcHMsIEZYX0JPT0wgQ29sb3JUcmFuc2Zvcm0sIElGWF9KcGVnUHJvdmlkZXIqIHBKUCkKK2Jvb2wgQ0NvZGVjX0pwZWdEZWNvZGVyOjpDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db21wcywgYm9vbCBDb2xvclRyYW5zZm9ybSwgSUZYX0pwZWdQcm92aWRlciogcEpQKQogewogICAgIGlmIChwSlApIHsKICAgICAgICAgbV9wRXh0UHJvdmlkZXIgPSBwSlA7CkBAIC0zOTYsMjEgKzM5NiwyMSBAQAogICAgIG1fT3V0cHV0V2lkdGggPSBtX09yaWdXaWR0aCA9IHdpZHRoOwogICAgIG1fT3V0cHV0SGVpZ2h0ID0gbV9PcmlnSGVpZ2h0ID0gaGVpZ2h0OwogICAgIGlmICghSW5pdERlY29kZSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoY2luZm8ubnVtX2NvbXBvbmVudHMgPCBuQ29tcHMpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICgoaW50KWNpbmZvLmltYWdlX3dpZHRoIDwgd2lkdGgpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fUGl0Y2ggPSAoY2luZm8uaW1hZ2Vfd2lkdGggKiBjaW5mby5udW1fY29tcG9uZW50cyArIDMpIC8gNCAqIDQ7CiAgICAgbV9wU2NhbmxpbmVCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBtX1BpdGNoKTsKICAgICBtX25Db21wcyA9IGNpbmZvLm51bV9jb21wb25lbnRzOwogICAgIG1fYnBjID0gODsKLSAgICBtX2JDb2xvclRyYW5zZm9ybWVkID0gRkFMU0U7Ci0gICAgbV9iU3RhcnRlZCA9IEZBTFNFOwotICAgIHJldHVybiBUUlVFOworICAgIG1fYkNvbG9yVHJhbnNmb3JtZWQgPSBmYWxzZTsKKyAgICBtX2JTdGFydGVkID0gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CiB9CiBleHRlcm4gIkMiIHsKICAgICBpbnQzMl90IEZYX0dldERvd25zYW1wbGVSYXRpbyhpbnQzMl90IG9yaWdpbldpZHRoLCBpbnQzMl90IG9yaWdpbkhlaWdodCwgaW50MzJfdCBkb3duc2FtcGxlV2lkdGgsIGludDMyX3QgZG93bnNhbXBsZUhlaWdodCkKQEAgLTQ0NSw3ICs0NDUsNyBAQAogICAgICAgICBtX05leHRMaW5lID0gLTE7CiAgICAgfQogfQotRlhfQk9PTCBDQ29kZWNfSnBlZ0RlY29kZXI6OnZfUmV3aW5kKCkKK2Jvb2wgQ0NvZGVjX0pwZWdEZWNvZGVyOjp2X1Jld2luZCgpCiB7CiAgICAgaWYgKG1fcEV4dFByb3ZpZGVyKSB7CiAgICAgICAgIHJldHVybiBtX3BFeHRQcm92aWRlci0+UmV3aW5kKG1fcEV4dENvbnRleHQpOwpAQCAtNDUzLDI1ICs0NTMsMjUgQEAKICAgICBpZiAobV9iU3RhcnRlZCkgewogICAgICAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwogICAgICAgICBpZiAoIUluaXREZWNvZGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChzZXRqbXAobV9KbXBCdWYpID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBjaW5mby5zY2FsZV9kZW5vbSA9IG1fbkRlZmF1bHRTY2FsZURlbm9tICogbV9Eb3duU2NhbGU7CiAgICAgbV9PdXRwdXRXaWR0aCA9IChtX09yaWdXaWR0aCArIG1fRG93blNjYWxlIC0gMSkgLyBtX0Rvd25TY2FsZTsKICAgICBtX091dHB1dEhlaWdodCA9IChtX09yaWdIZWlnaHQgKyBtX0Rvd25TY2FsZSAtIDEpIC8gbV9Eb3duU2NhbGU7CiAgICAgaWYgKCFqcGVnX3N0YXJ0X2RlY29tcHJlc3MoJmNpbmZvKSkgewogICAgICAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKChpbnQpY2luZm8ub3V0cHV0X3dpZHRoID4gbV9PcmlnV2lkdGgpIHsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBGWFNZU19hc3NlcnQoZmFsc2UpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIG1fYlN0YXJ0ZWQgPSBUUlVFOwotICAgIHJldHVybiBUUlVFOworICAgIG1fYlN0YXJ0ZWQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOwogfQogdWludDhfdCogQ0NvZGVjX0pwZWdEZWNvZGVyOjp2X0dldE5leHRMaW5lKCkKIHsKQEAgLTQ5Miw3ICs0OTIsNyBAQAogICAgIHJldHVybiAoRlhfRFdPUkQpKG1fU3JjU2l6ZSAtIHNyYy5ieXRlc19pbl9idWZmZXIpOwogfQogSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJQ0NvZGVjX0pwZWdNb2R1bGU6OkNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywgRlhfQk9PTCBDb2xvclRyYW5zZm9ybSkKKyAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbkNvbXBzLCBib29sIENvbG9yVHJhbnNmb3JtKQogewogICAgIGlmIChzcmNfYnVmID09IE5VTEwgfHwgc3JjX3NpemUgPT0gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTUwNCw4ICs1MDQsOCBAQAogICAgIH0KICAgICByZXR1cm4gcERlY29kZXI7CiB9Ci1GWF9CT09MIENDb2RlY19KcGVnTW9kdWxlOjpMb2FkSW5mbyhjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50JiB3aWR0aCwgaW50JiBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLCBpbnQmIGJpdHNfcGVyX2NvbXBvbmVudHMsIEZYX0JPT0wmIGNvbG9yX3RyYW5zZm9ybSwKK2Jvb2wgQ0NvZGVjX0pwZWdNb2R1bGU6OkxvYWRJbmZvKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbnVtX2NvbXBvbmVudHMsIGludCYgYml0c19wZXJfY29tcG9uZW50cywgYm9vbCYgY29sb3JfdHJhbnNmb3JtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGljY19idWZfcHRyLCBGWF9EV09SRCogaWNjX2xlbmd0aCkKIHsKICAgICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKQEAgLTUxNSwxNyArNTE1LDE3IEBACiAgICAgfQogICAgIHJldHVybiBfSnBlZ0xvYWRJbmZvKHNyY19idWYsIHNyY19zaXplLCB3aWR0aCwgaGVpZ2h0LCBudW1fY29tcG9uZW50cywgYml0c19wZXJfY29tcG9uZW50cywgY29sb3JfdHJhbnNmb3JtLCBpY2NfYnVmX3B0ciwgaWNjX2xlbmd0aCk7CiB9Ci1GWF9CT09MIENDb2RlY19KcGVnTW9kdWxlOjpFbmNvZGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9TVFJTSVpFJiBkZXN0X3NpemUsIGludCBxdWFsaXR5LCBjb25zdCB1aW50OF90KiBpY2NfYnVmLCBGWF9EV09SRCBpY2NfbGVuZ3RoKQorYm9vbCBDQ29kZWNfSnBlZ01vZHVsZTo6RW5jb2RlKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfU1RSU0laRSYgZGVzdF9zaXplLCBpbnQgcXVhbGl0eSwgY29uc3QgdWludDhfdCogaWNjX2J1ZiwgRlhfRFdPUkQgaWNjX2xlbmd0aCkKIHsKICAgICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKICAgICAgICAgcmV0dXJuIG1fcEV4dFByb3ZpZGVyLT5FbmNvZGUocFNvdXJjZSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSwgcXVhbGl0eSwgaWNjX2J1ZiwgaWNjX2xlbmd0aCk7CiAgICAgfQogICAgIGlmKHBTb3VyY2UtPkdldEJQUCgpIDwgOCB8fCBwU291cmNlLT5HZXRQYWxldHRlKCkgIT0gTlVMTCkgewogICAgICAgICBBU1NFUlQocFNvdXJjZS0+R2V0QlBQKCkgPj0gOCAmJiBwU291cmNlLT5HZXRQYWxldHRlKCkgPT0gTlVMTCk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBfSnBlZ0VuY29kZShwU291cmNlLCBkZXN0X2J1ZiwgZGVzdF9zaXplLCBxdWFsaXR5LCBpY2NfYnVmLCBpY2NfbGVuZ3RoKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHN0cnVjdCBGWEpQRUdfQ29udGV4dCB7CiAgICAgam1wX2J1ZgkJCW1fSnVtcE1hcms7CkBAIC02NTMsMTQgKzY1MywxNCBAQAogICAgIHAtPm1fSW5mby5zY2FsZV9kZW5vbSA9IGRvd25fc2NhbGU7CiAgICAgcmV0dXJuIGpwZWdfc3RhcnRfZGVjb21wcmVzcygmcC0+bV9JbmZvKTsKIH0KLUZYX0JPT0wgQ0NvZGVjX0pwZWdNb2R1bGU6OlJlYWRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgdW5zaWduZWQgY2hhciogZGVzdF9idWYpCitib29sIENDb2RlY19KcGVnTW9kdWxlOjpSZWFkU2NhbmxpbmUodm9pZCogcENvbnRleHQsIHVuc2lnbmVkIGNoYXIqIGRlc3RfYnVmKQogewogICAgIGlmIChtX3BFeHRQcm92aWRlcikgewogICAgICAgICByZXR1cm4gbV9wRXh0UHJvdmlkZXItPlJlYWRTY2FubGluZShwQ29udGV4dCwgZGVzdF9idWYpOwogICAgIH0KICAgICBGWEpQRUdfQ29udGV4dCogcCA9IChGWEpQRUdfQ29udGV4dCopcENvbnRleHQ7CiAgICAgaWYgKHNldGptcChwLT5tX0p1bXBNYXJrKSA9PSAtMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IG5saW5lcyA9IGpwZWdfcmVhZF9zY2FubGluZXMoJnAtPm1fSW5mbywgJmRlc3RfYnVmLCAxKTsKICAgICByZXR1cm4gbmxpbmVzID09IDE7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pweF9vcGouY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcHhfb3BqLmNwcAppbmRleCAyZDM5NWIwLi45MmFmNjI2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pweF9vcGouY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanB4X29wai5jcHAKQEAgLTU4NywxNyArNTg3LDE3IEBACiBwdWJsaWM6CiAgICAgQ0pQWF9EZWNvZGVyKCk7CiAgICAgfkNKUFhfRGVjb2RlcigpOwotICAgIEZYX0JPT0wJSW5pdChjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmNfZGF0YSwgaW50IHNyY19zaXplKTsKKyAgICBib29sCUluaXQoY29uc3QgdW5zaWduZWQgY2hhciogc3JjX2RhdGEsIGludCBzcmNfc2l6ZSk7CiAgICAgdm9pZAlHZXRJbmZvKEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwgRlhfRFdPUkQmIGNvZGVzdHJlYW1fbkNvbXBzLCBGWF9EV09SRCYgb3V0cHV0X25Db21wcyk7Ci0gICAgRlhfQk9PTAlEZWNvZGUodWludDhfdCogZGVzdF9idWYsIGludCBwaXRjaCwgRlhfQk9PTCBiVHJhbnNsYXRlQ29sb3IsIHVpbnQ4X3QqIG9mZnNldHMpOworICAgIGJvb2wJRGVjb2RlKHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgcGl0Y2gsIGJvb2wgYlRyYW5zbGF0ZUNvbG9yLCB1aW50OF90KiBvZmZzZXRzKTsKICAgICBjb25zdCB1aW50OF90KiBtX1NyY0RhdGE7CiAgICAgaW50IG1fU3JjU2l6ZTsKICAgICBvcGpfaW1hZ2VfdCAqaW1hZ2U7CiAgICAgb3BqX2NvZGVjX3QqIGxfY29kZWM7CiAgICAgb3BqX3N0cmVhbV90ICpsX3N0cmVhbTsKLSAgICBGWF9CT09MIG1fdXNlQ29sb3JTcGFjZTsKKyAgICBib29sIG1fdXNlQ29sb3JTcGFjZTsKIH07Ci1DSlBYX0RlY29kZXI6OkNKUFhfRGVjb2RlcigpOiBpbWFnZShOVUxMKSwgbF9jb2RlYyhOVUxMKSwgbF9zdHJlYW0oTlVMTCksIG1fdXNlQ29sb3JTcGFjZShGQUxTRSkKK0NKUFhfRGVjb2Rlcjo6Q0pQWF9EZWNvZGVyKCk6IGltYWdlKE5VTEwpLCBsX2NvZGVjKE5VTEwpLCBsX3N0cmVhbShOVUxMKSwgbV91c2VDb2xvclNwYWNlKGZhbHNlKQogewogfQogQ0pQWF9EZWNvZGVyOjp+Q0pQWF9EZWNvZGVyKCkKQEAgLTYxMiwxMSArNjEyLDExIEBACiAgICAgICAgIG9wal9pbWFnZV9kZXN0cm95KGltYWdlKTsKICAgICB9CiB9Ci1GWF9CT09MIENKUFhfRGVjb2Rlcjo6SW5pdChjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmNfZGF0YSwgaW50IHNyY19zaXplKQorYm9vbCBDSlBYX0RlY29kZXI6OkluaXQoY29uc3QgdW5zaWduZWQgY2hhciogc3JjX2RhdGEsIGludCBzcmNfc2l6ZSkKIHsKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzekpQMkhlYWRlcltdID0geyAweDAwLCAweDAwLCAweDAwLCAweDBjLCAweDZhLCAweDUwLCAweDIwLCAweDIwLCAweDBkLCAweDBhLCAweDg3LCAweDBhIH07CiAgICAgaWYgKCFzcmNfZGF0YSB8fCBzcmNfc2l6ZSA8IHNpemVvZihzekpQMkhlYWRlcikpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGltYWdlID0gTlVMTDsKICAgICBtX1NyY0RhdGEgPSBzcmNfZGF0YTsKQEAgLTYyNCw3ICs2MjQsNyBAQAogICAgIERlY29kZURhdGEgc3JjRGF0YShjb25zdF9jYXN0PHVuc2lnbmVkIGNoYXIqPihzcmNfZGF0YSksIHNyY19zaXplKTsKICAgICBsX3N0cmVhbSA9IGZ4X29wal9zdHJlYW1fY3JlYXRlX21lbW9yeV9zdHJlYW0oJnNyY0RhdGEsIE9QSl9KMktfU1RSRUFNX0NIVU5LX1NJWkUsIDEpOwogICAgIGlmIChsX3N0cmVhbSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBvcGpfZHBhcmFtZXRlcnNfdCBwYXJhbWV0ZXJzOwogICAgIG9wal9zZXRfZGVmYXVsdF9kZWNvZGVyX3BhcmFtZXRlcnMoJnBhcmFtZXRlcnMpOwpAQCAtNjM3LDMzICs2MzcsMzMgQEAKICAgICAgICAgbF9jb2RlYyA9IG9wal9jcmVhdGVfZGVjb21wcmVzcyhPUEpfQ09ERUNfSjJLKTsKICAgICB9CiAgICAgaWYoIWxfY29kZWMpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG9wal9zZXRfaW5mb19oYW5kbGVyKGxfY29kZWMsIGZ4X2luZm9fY2FsbGJhY2ssIDAwKTsKICAgICBvcGpfc2V0X3dhcm5pbmdfaGFuZGxlcihsX2NvZGVjLCBmeF93YXJuaW5nX2NhbGxiYWNrLCAwMCk7CiAgICAgb3BqX3NldF9lcnJvcl9oYW5kbGVyKGxfY29kZWMsIGZ4X2Vycm9yX2NhbGxiYWNrLCAwMCk7CiAgICAgaWYgKCAhb3BqX3NldHVwX2RlY29kZXIobF9jb2RlYywgJnBhcmFtZXRlcnMpICkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYoISBvcGpfcmVhZF9oZWFkZXIobF9zdHJlYW0sIGxfY29kZWMsICZpbWFnZSkpIHsKICAgICAgICAgaW1hZ2UgPSBOVUxMOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCFwYXJhbWV0ZXJzLm5iX3RpbGVfdG9fZGVjb2RlKSB7CiAgICAgICAgIGlmICghb3BqX3NldF9kZWNvZGVfYXJlYShsX2NvZGVjLCBpbWFnZSwgcGFyYW1ldGVycy5EQV94MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuREFfeTAsIHBhcmFtZXRlcnMuREFfeDEsIHBhcmFtZXRlcnMuREFfeTEpKSB7CiAgICAgICAgICAgICBvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7CiAgICAgICAgICAgICBpbWFnZSA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCEob3BqX2RlY29kZShsX2NvZGVjLCBsX3N0cmVhbSwgaW1hZ2UpICYmIG9wal9lbmRfZGVjb21wcmVzcyhsX2NvZGVjLCBsX3N0cmVhbSkpKSB7CiAgICAgICAgICAgICBvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7CiAgICAgICAgICAgICBpbWFnZSA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIW9wal9nZXRfZGVjb2RlZF90aWxlKGxfY29kZWMsIGxfc3RyZWFtLCBpbWFnZSwgcGFyYW1ldGVycy50aWxlX2luZGV4KSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIG9wal9zdHJlYW1fZGVzdHJveShsX3N0cmVhbSk7CkBAIC02ODQsOSArNjg0LDkgQEAKICAgICAgICAgaW1hZ2UtPmljY19wcm9maWxlX2xlbiA9IDA7CiAgICAgfQogICAgIGlmKCFpbWFnZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENKUFhfRGVjb2Rlcjo6R2V0SW5mbyhGWF9EV09SRCYgd2lkdGgsIEZYX0RXT1JEJiBoZWlnaHQsIEZYX0RXT1JEJiBjb2Rlc3RyZWFtX25Db21wcywgRlhfRFdPUkQmIG91dHB1dF9uQ29tcHMpCiB7CkBAIC02OTQsNyArNjk0LDcgQEAKICAgICBoZWlnaHQgPSAoRlhfRFdPUkQpaW1hZ2UtPnkxOwogICAgIG91dHB1dF9uQ29tcHMgPSBjb2Rlc3RyZWFtX25Db21wcyA9IChGWF9EV09SRClpbWFnZS0+bnVtY29tcHM7CiB9Ci1GWF9CT09MIENKUFhfRGVjb2Rlcjo6RGVjb2RlKHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgcGl0Y2gsIEZYX0JPT0wgYlRyYW5zbGF0ZUNvbG9yLCB1aW50OF90KiBvZmZzZXRzKQorYm9vbCBDSlBYX0RlY29kZXI6OkRlY29kZSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IHBpdGNoLCBib29sIGJUcmFuc2xhdGVDb2xvciwgdWludDhfdCogb2Zmc2V0cykKIHsKICAgICBpbnQgaSwgd2lkLCBoZWksIHJvdywgY29sLCBjaGFubmVsLCBzcmM7CiAgICAgdWludDhfdCogcENoYW5uZWw7CkBAIC03MDIsMTQgKzcwMiwxNCBAQAogICAgIHVpbnQ4X3QqIHBQaXhlbDsKIAogICAgIGlmKGltYWdlLT5jb21wc1swXS53ICE9IGltYWdlLT54MSB8fCBpbWFnZS0+Y29tcHNbMF0uaCAhPSBpbWFnZS0+eTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmKHBpdGNoIDwgKGludCkoaW1hZ2UtPmNvbXBzWzBdLncgKiA4ICogaW1hZ2UtPm51bWNvbXBzICsgMzEpID4+IDUgPDwgMikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmLCAweGZmLCBpbWFnZS0+eTEgKiBwaXRjaCk7CiAgICAgdWludDhfdCoqIGNoYW5uZWxfYnVmcyA9IEZYX0FsbG9jKHVpbnQ4X3QqLCBpbWFnZS0+bnVtY29tcHMpOwotICAgIEZYX0JPT0wgcmVzdWx0ID0gRkFMU0U7CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKICAgICBpbnQqIGFkanVzdF9jb21wcyA9IEZYX0FsbG9jKGludCwgaW1hZ2UtPm51bWNvbXBzKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgKGludClpbWFnZS0+bnVtY29tcHM7IGkgKyspIHsKICAgICAgICAgY2hhbm5lbF9idWZzW2ldID0gZGVzdF9idWYgKyBvZmZzZXRzW2ldOwpAQCAtNzY1LDcgKzc2NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmVzdWx0ID0gVFJVRTsKKyAgICByZXN1bHQgPSB0cnVlOwogCiBkb25lOgogICAgIEZYX0ZyZWUoY2hhbm5lbF9idWZzKTsKQEAgLTc3OCw3ICs3NzgsNyBAQAogQ0NvZGVjX0pweE1vZHVsZTo6Q0NvZGVjX0pweE1vZHVsZSgpCiB7CiB9Ci12b2lkKiBDQ29kZWNfSnB4TW9kdWxlOjpDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplICwgRlhfQk9PTCB1c2VDb2xvclNwYWNlKQordm9pZCogQ0NvZGVjX0pweE1vZHVsZTo6Q3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSAsIGJvb2wgdXNlQ29sb3JTcGFjZSkKIHsKICAgICBDSlBYX0RlY29kZXIqIHBEZWNvZGVyID0gbmV3IENKUFhfRGVjb2RlcjsKICAgICBwRGVjb2Rlci0+bV91c2VDb2xvclNwYWNlID0gdXNlQ29sb3JTcGFjZTsKQEAgLTc5NCw3ICs3OTQsNyBAQAogICAgIENKUFhfRGVjb2RlciogcERlY29kZXIgPSAoQ0pQWF9EZWNvZGVyKiljdHg7CiAgICAgcERlY29kZXItPkdldEluZm8od2lkdGgsIGhlaWdodCwgY29kZXN0cmVhbV9uQ29tcHMsIG91dHB1dF9uQ29tcHMpOwogfQotRlhfQk9PTCBDQ29kZWNfSnB4TW9kdWxlOjpEZWNvZGUodm9pZCogY3R4LCB1aW50OF90KiBkZXN0X2RhdGEsIGludCBwaXRjaCwgRlhfQk9PTCBiVHJhbnNsYXRlQ29sb3IsIHVpbnQ4X3QqIG9mZnNldHMpCitib29sIENDb2RlY19KcHhNb2R1bGU6OkRlY29kZSh2b2lkKiBjdHgsIHVpbnQ4X3QqIGRlc3RfZGF0YSwgaW50IHBpdGNoLCBib29sIGJUcmFuc2xhdGVDb2xvciwgdWludDhfdCogb2Zmc2V0cykKIHsKICAgICBDSlBYX0RlY29kZXIqIHBEZWNvZGVyID0gKENKUFhfRGVjb2RlciopY3R4OwogICAgIHJldHVybiBwRGVjb2Rlci0+RGVjb2RlKGRlc3RfZGF0YSwgcGl0Y2gsIGJUcmFuc2xhdGVDb2xvciwgb2Zmc2V0cyk7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0JpdFN0cmVhbS5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9CaXRTdHJlYW0uaAppbmRleCBmZjBiOWZjLi5mY2QxMWY0IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0JpdFN0cmVhbS5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmgKQEAgLTIzLDcgKzIzLDcgQEAKIAogICAgIGludDMyX3QgcmVhZDFCaXQoRlhfRFdPUkQgKmR3UmVzdWx0KTsKIAotICAgIGludDMyX3QgcmVhZDFCaXQoRlhfQk9PTCAgKmJSZXN1bHQpOworICAgIGludDMyX3QgcmVhZDFCaXQoYm9vbCAgKmJSZXN1bHQpOwogCiAgICAgaW50MzJfdCByZWFkMUJ5dGUodWludDhfdCAqY1Jlc3VsdCk7CiAKQEAgLTE2NSw3ICsxNjUsNyBAQAogICAgIH0KIH0KIAotaW5saW5lIGludDMyX3QgQ0pCaWcyX0JpdFN0cmVhbTo6cmVhZDFCaXQoRlhfQk9PTCAqYlJlc3VsdCkKK2lubGluZSBpbnQzMl90IENKQmlnMl9CaXRTdHJlYW06OnJlYWQxQml0KGJvb2wgKmJSZXN1bHQpCiB7CiAgICAgaWYobV9kd0J5dGVJZHggPCBtX2R3TGVuZ3RoKSB7CiAgICAgICAgICpiUmVzdWx0ID0gKG1fcEJ1ZlttX2R3Qnl0ZUlkeF0gPj4gKDcgLSBtX2R3Qml0SWR4KSkgJiAweDAxOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5jcHAKaW5kZXggNjhjOTczNS4uMGI3MWM0NyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0NvbnRleHQuY3BwCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgSkJJRzJfQUxMT0MobV9wU2VnbWVudExpc3QsIENKQmlnMl9MaXN0PENKQmlnMl9TZWdtZW50Pik7CiAgICAgSkJJRzJfQUxMT0MobV9wUGFnZUluZm9MaXN0LCBDSkJpZzJfTGlzdDxKQmlnMlBhZ2VJbmZvPigxKSk7CiAgICAgbV9wUGFnZSA9IE5VTEw7Ci0gICAgbV9iQnVmU3BlY2lmaWVkID0gRkFMU0U7CisgICAgbV9iQnVmU3BlY2lmaWVkID0gZmFsc2U7CiAgICAgbV9wUGF1c2UgPSBwUGF1c2U7CiAgICAgbV9uU2VnbWVudERlY29kZWQgPSAwOwogICAgIG1fUGF1c2VTdGVwID0gMTA7CkBAIC0yMzEsMTEgKzIzMSwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIG5SZXQ7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbV9iRmlyc3RQYWdlID0gVFJVRTsKKyAgICBtX2JGaXJzdFBhZ2UgPSB0cnVlOwogICAgIG1fUGF1c2VTdGVwID0gMDsKICAgICBkZWxldGUgbV9wUGFnZTsKICAgICBKQklHMl9BTExPQyhtX3BQYWdlLCBDSkJpZzJfSW1hZ2Uod2lkdGgsIGhlaWdodCwgc3RyaWRlLCBwQnVmKSk7Ci0gICAgbV9iQnVmU3BlY2lmaWVkID0gVFJVRTsKKyAgICBtX2JCdWZTcGVjaWZpZWQgPSB0cnVlOwogICAgIGlmKG1fcFBhZ2UgJiYgcFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewogICAgICAgICBtX1BhdXNlU3RlcCA9IDE7CiAgICAgICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CkBAIC0yOTgsMTEgKzI5OCwxMSBAQAogaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6Z2V0TmV4dFBhZ2UodWludDhfdCAqcEJ1ZiwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3Qgc3RyaWRlLCBJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICBpbnQzMl90IG5SZXQgPSBKQklHMl9FUlJPUl9TVFJFQU1fVFlQRTsKLSAgICBtX2JGaXJzdFBhZ2UgPSBGQUxTRTsKKyAgICBtX2JGaXJzdFBhZ2UgPSBmYWxzZTsKICAgICBtX1BhdXNlU3RlcCA9IDA7CiAgICAgZGVsZXRlIG1fcFBhZ2U7CiAgICAgSkJJRzJfQUxMT0MobV9wUGFnZSwgQ0pCaWcyX0ltYWdlKHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcEJ1ZikpOwotICAgIG1fYkJ1ZlNwZWNpZmllZCA9IFRSVUU7CisgICAgbV9iQnVmU3BlY2lmaWVkID0gdHJ1ZTsKICAgICBpZihtX3BQYWdlICYmIHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKICAgICAgICAgbV9QYXVzZVN0ZXAgPSAxOwogICAgICAgICBtX1Byb2Nlc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwpAQCAtMzMwLDcgKzMzMCw3IEBACiBpbnQzMl90IENKQmlnMl9Db250ZXh0OjpnZXRGaXJzdFBhZ2UoQ0pCaWcyX0ltYWdlICoqaW1hZ2UsIElGWF9QYXVzZSogcFBhdXNlKQogewogICAgIGludDMyX3QgblJldDsKLSAgICBtX2JGaXJzdFBhZ2UgPSBUUlVFOworICAgIG1fYkZpcnN0UGFnZSA9IHRydWU7CiAgICAgbV9QYXVzZVN0ZXAgPSAwOwogICAgIGlmKG1fcEdsb2JhbENvbnRleHQpIHsKICAgICAgICAgblJldCA9IG1fcEdsb2JhbENvbnRleHQtPmRlY29kZV9FbWJlZE9yZ25hemF0aW9uKHBQYXVzZSk7CkBAIC0zMzgsMTQgKzMzOCwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIG5SZXQ7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbV9iQnVmU3BlY2lmaWVkID0gRkFMU0U7CisgICAgbV9iQnVmU3BlY2lmaWVkID0gZmFsc2U7CiAgICAgcmV0dXJuIENvbnRpbnVlKHBQYXVzZSk7CiB9CiBpbnQzMl90IENKQmlnMl9Db250ZXh0OjpnZXROZXh0UGFnZShDSkJpZzJfSW1hZ2UgKippbWFnZSwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaW50MzJfdCBuUmV0OwotICAgIG1fYkJ1ZlNwZWNpZmllZCA9IEZBTFNFOwotICAgIG1fYkZpcnN0UGFnZSA9IEZBTFNFOworICAgIG1fYkJ1ZlNwZWNpZmllZCA9IGZhbHNlOworICAgIG1fYkZpcnN0UGFnZSA9IGZhbHNlOwogICAgIG1fUGF1c2VTdGVwID0gMDsKICAgICBzd2l0Y2gobV9uU3RyZWFtVHlwZSkgewogICAgICAgICBjYXNlIEpCSUcyX0ZJTEVfU1RSRUFNOgpAQCAtNjAxLDE0ICs2MDEsMTQgQEAKICAgICBDSkJpZzJfSHVmZm1hblRhYmxlICpUYWJsZV9CMSA9IE5VTEwsICpUYWJsZV9CMiA9IE5VTEwsICpUYWJsZV9CMyA9IE5VTEwsICpUYWJsZV9CNCA9IE5VTEwsICpUYWJsZV9CNSA9IE5VTEw7CiAgICAgaW50MzJfdCBpLCBuSW5kZXgsIG5SZXQ7CiAgICAgQ0pCaWcyX1NlZ21lbnQgKnBTZWcgPSBOVUxMLCAqcExSU2VnID0gTlVMTDsKLSAgICBGWF9CT09MIGJVc2VkOworICAgIGJvb2wgYlVzZWQ7CiAgICAgQ0pCaWcyX0ltYWdlICoqIFNESU5TWU1TID0gTlVMTDsKICAgICBDSkJpZzJfU0REUHJvYyAqcFN5bWJvbERpY3REZWNvZGVyOwogICAgIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCA9IE5VTEwsICpnckNvbnRleHQgPSBOVUxMOwogICAgIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXI7CiAgICAgSkJJRzJfQUxMT0MocFN5bWJvbERpY3REZWNvZGVyLCBDSkJpZzJfU0REUHJvYygpKTsKICAgICB1aW50OF90ICprZXkgPSBwU2VnbWVudC0+bV9wRGF0YTsKLSAgICBGWF9CT09MIGNhY2hlX2hpdCA9IGZhbHNlOworICAgIGJvb2wgY2FjaGVfaGl0ID0gZmFsc2U7CiAgICAgaWYobV9wU3RyZWFtLT5yZWFkU2hvcnRJbnRlZ2VyKCZ3RmxhZ3MpICE9IDApIHsKICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKQEAgLTgyNSwxNiArODI1LDE2IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYod0ZsYWdzICYgMHgwMjAwKSB7Ci0gICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5zZC0+bV9iQ29udGV4dFJldGFpbmVkID0gVFJVRTsKKyAgICAgICAgcFNlZ21lbnQtPm1fUmVzdWx0LnNkLT5tX2JDb250ZXh0UmV0YWluZWQgPSB0cnVlOwogICAgICAgICBpZihwU3ltYm9sRGljdERlY29kZXItPlNESFVGRiA9PSAwKSB7CiAgICAgICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuc2QtPm1fZ2JDb250ZXh0ID0gZ2JDb250ZXh0OwogICAgICAgICB9CiAgICAgICAgIGlmKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RSRUZBR0cgPT0gMSkgewogICAgICAgICAgICAgcFNlZ21lbnQtPm1fUmVzdWx0LnNkLT5tX2dyQ29udGV4dCA9IGdyQ29udGV4dDsKICAgICAgICAgfQotICAgICAgICBiVXNlZCA9IFRSVUU7CisgICAgICAgIGJVc2VkID0gdHJ1ZTsKICAgICB9IGVsc2UgewotICAgICAgICBiVXNlZCA9IEZBTFNFOworICAgICAgICBiVXNlZCA9IGZhbHNlOwogICAgIH0KICAgICBkZWxldGUgcFN5bWJvbERpY3REZWNvZGVyOwogICAgIGlmKFNESU5TWU1TKSB7CkBAIC04NDUsNyArODQ1LDcgQEAKICAgICBkZWxldGUgVGFibGVfQjM7CiAgICAgZGVsZXRlIFRhYmxlX0I0OwogICAgIGRlbGV0ZSBUYWJsZV9CNTsKLSAgICBpZihiVXNlZCA9PSBGQUxTRSkgeworICAgIGlmKGJVc2VkID09IGZhbHNlKSB7CiAgICAgICAgIGlmKGdiQ29udGV4dCkgewogICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKGdiQ29udGV4dCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmgKaW5kZXggZTZhMGQ3Yi4uMDJkNDE5MiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmgKQEAgLTEyMywxMyArMTIzLDEzIEBACiAKICAgICBDSkJpZzJfSW1hZ2UgKm1fcFBhZ2U7CiAKLSAgICBGWF9CT09MIG1fYkJ1ZlNwZWNpZmllZDsKKyAgICBib29sIG1fYkJ1ZlNwZWNpZmllZDsKIAogICAgIGludDMyX3QgbV9uU2VnbWVudERlY29kZWQ7CiAgICAgSUZYX1BhdXNlKgltX3BQYXVzZTsKICAgICBpbnQzMl90CW1fUGF1c2VTdGVwOwogICAgIEZYQ09ERUNfU1RBVFVTIG1fUHJvY2Vzc2l2ZVN0YXR1czsKLSAgICBGWF9CT09MCW1fYkZpcnN0UGFnZTsKKyAgICBib29sCW1fYkZpcnN0UGFnZTsKICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyICptX3BBcml0aERlY29kZXI7CiAgICAgQ0pCaWcyX0dSRFByb2MgKm1fcEdSRDsKICAgICBKQmlnMkFyaXRoQ3R4ICptX2diQ29udGV4dDsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR2VuZXJhbERlY29kZXIuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5jcHAKaW5kZXggY2FiY2Q0Yy4uMWUzMzhhNSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5jcHAKQEAgLTEwMSw3ICsxMDEsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQogewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOwpAQCAtMTQ2LDcgKzE0Niw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX29wdDIoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQogewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7CkBAIC0yMTMsNyArMjEzLDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfb3B0MyhDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCiB7Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKQEAgLTMwNSw3ICszMDUsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF91bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCiB7Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7CkBAIC0zNTIsNyArMzUyLDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfb3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKIHsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKQEAgLTM5Nyw3ICszOTcsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQyKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKIHsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwpAQCAtNDY0LDcgKzQ2NCw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX29wdDMoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQogewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7CkBAIC01NTUsNyArNTU1LDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfdW5vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQogewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOwpAQCAtNjAwLDcgKzYwMCw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCiB7Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7CkBAIC02NDMsNyArNjQzLDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfb3B0MihDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCiB7Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKQEAgLTcxMCw3ICs3MTAsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl9vcHQzKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKIHsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwpAQCAtODAxLDcgKzgwMSw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKIHsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKQEAgLTg0NCw3ICs4NDQsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlM19vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQogewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7CkBAIC04ODMsNyArODgzLDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MihDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCiB7Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxOwpAQCAtOTQxLDcgKzk0MSw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX29wdDMoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQogewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKICAgICBGWF9EV09SRCBsaW5lMTsKQEAgLTEwMTcsNyArMTAxNyw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKIHsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwpAQCAtMTA1Niw3ICsxMDU2LDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9WMihDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCiB7Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7CkBAIC0xMTk1LDcgKzExOTUsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1YxKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKIHsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUID0gMDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIExUUCA9IDA7CkBAIC0xMzQwLDcgKzEzNDAsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTBfdW5vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0KQogewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHUlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzLCBsaW5lNCwgbGluZTU7CkBAIC0xNDI0LDcgKzE0MjQsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTBfb3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCkKIHsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR1JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUxX3IsIGxpbmUyX3IsIGxpbmUzX3I7CkBAIC0xNDU5LDkgKzE0NTksOSBAQAogICAgICAgICB9CiAgICAgICAgIGxpbmUxID0gKGggPiAwKSA/IHBMaW5lWy1uU3RyaWRlXSA8PCA0IDogMDsKICAgICAgICAgaW50MzJfdCByZWZlcmVuY2VfaCA9IGggLSBHUlJFRkVSRU5DRURZOwotICAgICAgICBGWF9CT09MIGxpbmUxX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAwICYmIHJlZmVyZW5jZV9oIDwgR1JIUiArIDEpOwotICAgICAgICBGWF9CT09MIGxpbmUyX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAtMSAmJiByZWZlcmVuY2VfaCA8IEdSSFIpOwotICAgICAgICBGWF9CT09MIGxpbmUzX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAtMiAmJiByZWZlcmVuY2VfaCA8IEdSSFIgLSAxKTsKKyAgICAgICAgYm9vbCBsaW5lMV9yX29rID0gKHJlZmVyZW5jZV9oID4gMCAmJiByZWZlcmVuY2VfaCA8IEdSSFIgKyAxKTsKKyAgICAgICAgYm9vbCBsaW5lMl9yX29rID0gKHJlZmVyZW5jZV9oID4gLTEgJiYgcmVmZXJlbmNlX2ggPCBHUkhSKTsKKyAgICAgICAgYm9vbCBsaW5lM19yX29rID0gKHJlZmVyZW5jZV9oID4gLTIgJiYgcmVmZXJlbmNlX2ggPCBHUkhSIC0gMSk7CiAgICAgICAgIGxpbmUxX3IgPSBsaW5lMV9yX29rID8gcExpbmVSW25PZmZzZXQgLSBuU3RyaWRlUl0gOiAwOwogICAgICAgICBsaW5lMl9yID0gbGluZTJfcl9vayA/IHBMaW5lUltuT2Zmc2V0XSA6IDA7CiAgICAgICAgIGxpbmUzX3IgPSBsaW5lM19yX29rID8gcExpbmVSW25PZmZzZXQgKyBuU3RyaWRlUl0gOiAwOwpAQCAtMTU1NSw3ICsxNTU1LDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSUkRQcm9jOjpkZWNvZGVfVGVtcGxhdGUxX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCkKIHsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR1JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMywgbGluZTQsIGxpbmU1OwpAQCAtMTYzMyw3ICsxNjMzLDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSUkRQcm9jOjpkZWNvZGVfVGVtcGxhdGUxX29wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQpCiB7Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdSUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMV9yLCBsaW5lMl9yLCBsaW5lM19yOwpAQCAtMTY2OCw5ICsxNjY4LDkgQEAKICAgICAgICAgfQogICAgICAgICBsaW5lMSA9IChoID4gMCkgPyBwTGluZVstblN0cmlkZV0gPDwgMSA6IDA7CiAgICAgICAgIGludDMyX3QgcmVmZXJlbmNlX2ggPSBoIC0gR1JSRUZFUkVOQ0VEWTsKLSAgICAgICAgRlhfQk9PTCBsaW5lMV9yX29rID0gKHJlZmVyZW5jZV9oID4gMCAmJiByZWZlcmVuY2VfaCA8IEdSSFIgKyAxKTsKLSAgICAgICAgRlhfQk9PTCBsaW5lMl9yX29rID0gKHJlZmVyZW5jZV9oID4gLTEgJiYgcmVmZXJlbmNlX2ggPCBHUkhSKTsKLSAgICAgICAgRlhfQk9PTCBsaW5lM19yX29rID0gKHJlZmVyZW5jZV9oID4gLTIgJiYgcmVmZXJlbmNlX2ggPCBHUkhSIC0gMSk7CisgICAgICAgIGJvb2wgbGluZTFfcl9vayA9IChyZWZlcmVuY2VfaCA+IDAgJiYgcmVmZXJlbmNlX2ggPCBHUkhSICsgMSk7CisgICAgICAgIGJvb2wgbGluZTJfcl9vayA9IChyZWZlcmVuY2VfaCA+IC0xICYmIHJlZmVyZW5jZV9oIDwgR1JIUik7CisgICAgICAgIGJvb2wgbGluZTNfcl9vayA9IChyZWZlcmVuY2VfaCA+IC0yICYmIHJlZmVyZW5jZV9oIDwgR1JIUiAtIDEpOwogICAgICAgICBsaW5lMV9yID0gbGluZTFfcl9vayA/IHBMaW5lUltuT2Zmc2V0IC0gblN0cmlkZVJdIDogMDsKICAgICAgICAgbGluZTJfciA9IGxpbmUyX3Jfb2sgPyBwTGluZVJbbk9mZnNldF0gOiAwOwogICAgICAgICBsaW5lM19yID0gbGluZTNfcl9vayA/IHBMaW5lUltuT2Zmc2V0ICsgblN0cmlkZVJdIDogMDsKQEAgLTE3NTgsOCArMTc1OCw4IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUlJEUHJvYzo6ZGVjb2RlX1YxKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCkKIHsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9CT09MIFRQR1JQSVgsIFRQR1JWQUw7CisgICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CisgICAgYm9vbCBUUEdSUElYLCBUUEdSVkFMOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHUlJFRzsKICAgICBMVFAgPSAwOwpAQCAtMTg4MSwxMiArMTg4MSwxMiBAQAogICAgIENKQmlnMl9JbWFnZSAqSUJJOwogICAgIEZYX0RXT1JEIFdJLCBISTsKICAgICBpbnQzMl90IElEUzsKLSAgICBGWF9CT09MIFJJOworICAgIGJvb2wgUkk7CiAgICAgaW50MzJfdCBSRFdJLCBSREhJLCBSRFhJLCBSRFlJOwogICAgIENKQmlnMl9JbWFnZSAqSUJPSTsKICAgICBGWF9EV09SRCBXT0ksIEhPSTsKICAgICBDSkJpZzJfSW1hZ2UgKlNCUkVHOwotICAgIEZYX0JPT0wgYkZpcnN0OworICAgIGJvb2wgYkZpcnN0OwogICAgIEZYX0RXT1JEIG5UbXA7CiAgICAgaW50MzJfdCBuVmFsLCBuQml0czsKICAgICBDSkJpZzJfSHVmZm1hbkRlY29kZXIgKnBIdWZmbWFuRGVjb2RlcjsKQEAgLTE5MTAsNyArMTkxMCw3IEBACiAgICAgICAgIH0KICAgICAgICAgRFQgKj0gU0JTVFJJUFM7CiAgICAgICAgIFNUUklQVCA9IFNUUklQVCArIERUOwotICAgICAgICBiRmlyc3QgPSBUUlVFOworICAgICAgICBiRmlyc3QgPSB0cnVlOwogICAgICAgICBmb3IoOzspIHsKICAgICAgICAgICAgIGlmKGJGaXJzdCkgewogICAgICAgICAgICAgICAgIGlmKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRkZTLCAmREZTKSAhPSAwKSB7CkBAIC0xOTE5LDcgKzE5MTksNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBGSVJTVFMgPSBGSVJTVFMgKyBERlM7CiAgICAgICAgICAgICAgICAgQ1VSUyA9IEZJUlNUUzsKLSAgICAgICAgICAgICAgICBiRmlyc3QgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBiRmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgblZhbCA9IHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRkRTLCAmSURTKTsKICAgICAgICAgICAgICAgICBpZihuVmFsID09IEpCSUcyX09PQikgewpAQCAtMjEwNiw3ICsyMTA2LDcgQEAKICAgICBDSkJpZzJfSW1hZ2UgKklCT0k7CiAgICAgRlhfRFdPUkQgV09JLCBIT0k7CiAgICAgQ0pCaWcyX0ltYWdlICpTQlJFRzsKLSAgICBGWF9CT09MIGJGaXJzdDsKKyAgICBib29sIGJGaXJzdDsKICAgICBpbnQzMl90IG5SZXQsIG5WYWw7CiAgICAgaW50MzJfdCBiUmV0YWluZWQ7CiAgICAgQ0pCaWcyX0FyaXRoSW50RGVjb2RlciAqSUFEVCwgKklBRlMsICpJQURTLCAqSUFJVCwgKklBUkksICpJQVJEVywgKklBUkRILCAqSUFSRFgsICpJQVJEWTsKQEAgLTIxMjMsNyArMjEyMyw3IEBACiAgICAgICAgIElBUkRYID0gcElEUy0+SUFSRFg7CiAgICAgICAgIElBUkRZID0gcElEUy0+SUFSRFk7CiAgICAgICAgIElBSUQgPSBwSURTLT5JQUlEOwotICAgICAgICBiUmV0YWluZWQgPSBUUlVFOworICAgICAgICBiUmV0YWluZWQgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEpCSUcyX0FMTE9DKElBRFQsIENKQmlnMl9Bcml0aEludERlY29kZXIoKSk7CiAgICAgICAgIEpCSUcyX0FMTE9DKElBRlMsIENKQmlnMl9Bcml0aEludERlY29kZXIoKSk7CkBAIC0yMTM1LDcgKzIxMzUsNyBAQAogICAgICAgICBKQklHMl9BTExPQyhJQVJEWCwgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKICAgICAgICAgSkJJRzJfQUxMT0MoSUFSRFksIENKQmlnMl9Bcml0aEludERlY29kZXIoKSk7CiAgICAgICAgIEpCSUcyX0FMTE9DKElBSUQgLCBDSkJpZzJfQXJpdGhJYWlkRGVjb2RlcihTQlNZTUNPREVMRU4pKTsKLSAgICAgICAgYlJldGFpbmVkID0gRkFMU0U7CisgICAgICAgIGJSZXRhaW5lZCA9IGZhbHNlOwogICAgIH0KICAgICBKQklHMl9BTExPQyhTQlJFRywgQ0pCaWcyX0ltYWdlKFNCVywgU0JIKSk7CiAgICAgU0JSRUctPmZpbGwoU0JERUZQSVhFTCk7CkBAIC0yMTU0LDcgKzIxNTQsNyBAQAogICAgICAgICB9CiAgICAgICAgIERUICo9IFNCU1RSSVBTOwogICAgICAgICBTVFJJUFQgPSBTVFJJUFQgKyBEVDsKLSAgICAgICAgYkZpcnN0ID0gVFJVRTsKKyAgICAgICAgYkZpcnN0ID0gdHJ1ZTsKICAgICAgICAgZm9yKDs7KSB7CiAgICAgICAgICAgICBpZihiRmlyc3QpIHsKICAgICAgICAgICAgICAgICBpZihJQUZTLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJkRGUykgPT0gLTEpIHsKQEAgLTIxNjMsNyArMjE2Myw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEZJUlNUUyA9IEZJUlNUUyArIERGUzsKICAgICAgICAgICAgICAgICBDVVJTID0gRklSU1RTOwotICAgICAgICAgICAgICAgIGJGaXJzdCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJGaXJzdCA9IGZhbHNlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBuUmV0ID0gSUFEUy0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZJRFMpOwogICAgICAgICAgICAgICAgIGlmKG5SZXQgPT0gSkJJRzJfT09CKSB7CkBAIC0yMjk5LDcgKzIyOTksNyBAQAogICAgICAgICAgICAgTklOU1RBTkNFUyA9IE5JTlNUQU5DRVMgKyAxOwogICAgICAgICB9CiAgICAgfQotICAgIGlmKGJSZXRhaW5lZCA9PSBGQUxTRSkgeworICAgIGlmKGJSZXRhaW5lZCA9PSBmYWxzZSkgewogICAgICAgICBkZWxldGUgSUFEVDsKICAgICAgICAgZGVsZXRlIElBRlM7CiAgICAgICAgIGRlbGV0ZSBJQURTOwpAQCAtMjMxMyw3ICsyMzEzLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIFNCUkVHOwogZmFpbGVkOgotICAgIGlmKGJSZXRhaW5lZCA9PSBGQUxTRSkgeworICAgIGlmKGJSZXRhaW5lZCA9PSBmYWxzZSkgewogICAgICAgICBkZWxldGUgSUFEVDsKICAgICAgICAgZGVsZXRlIElBRlM7CiAgICAgICAgIGRlbGV0ZSBJQURTOwpAQCAtMjMzOCw5ICsyMzM4LDkgQEAKICAgICBpbnQzMl90IERXOwogICAgIENKQmlnMl9JbWFnZSAqQlM7CiAgICAgRlhfRFdPUkQgSSwgSiwgUkVGQUdHTklOU1Q7Ci0gICAgRlhfQk9PTCAqRVhGTEFHUzsKKyAgICBib29sICpFWEZMQUdTOwogICAgIEZYX0RXT1JEIEVYSU5ERVg7Ci0gICAgRlhfQk9PTCBDVVJFWEZMQUc7CisgICAgYm9vbCBDVVJFWEZMQUc7CiAgICAgRlhfRFdPUkQgRVhSVU5MRU5HVEg7CiAgICAgaW50MzJfdCBuVmFsOwogICAgIEZYX0RXT1JEIG5UbXA7CkBAIC0yNTg1LDcgKzI1ODUsNyBAQAogICAgIH0KICAgICBFWElOREVYID0gMDsKICAgICBDVVJFWEZMQUcgPSAwOwotICAgIEVYRkxBR1MgPSAoRlhfQk9PTCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihGWF9CT09MKSwgKFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TKSk7CisgICAgRVhGTEFHUyA9IChib29sKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGJvb2wpLCAoU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpKTsKICAgICB3aGlsZShFWElOREVYIDwgU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpIHsKICAgICAgICAgaWYoSUFFWC0+ZGVjb2RlKHBBcml0aERlY29kZXIsIChpbnQqKSZFWFJVTkxFTkdUSCkgPT0gLTEpIHsKICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShFWEZMQUdTKTsKQEAgLTI2NzYsOSArMjY3Niw5IEBACiAgICAgaW50MzJfdCBEVzsKICAgICBDSkJpZzJfSW1hZ2UgKkJTLCAqQkhDOwogICAgIEZYX0RXT1JEIEksIEosIFJFRkFHR05JTlNUOwotICAgIEZYX0JPT0wgKkVYRkxBR1M7CisgICAgYm9vbCAqRVhGTEFHUzsKICAgICBGWF9EV09SRCBFWElOREVYOwotICAgIEZYX0JPT0wgQ1VSRVhGTEFHOworICAgIGJvb2wgQ1VSRVhGTEFHOwogICAgIEZYX0RXT1JEIEVYUlVOTEVOR1RIOwogICAgIGludDMyX3QgblZhbCwgbkJpdHM7CiAgICAgRlhfRFdPUkQgblRtcDsKQEAgLTI5NzYsNyArMjk3Niw3IEBACiAgICAgQ1VSRVhGTEFHID0gMDsKICAgICBKQklHMl9BTExPQyhwVGFibGUsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxKSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMSkpOwotICAgIEVYRkxBR1MgPSAoRlhfQk9PTCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihGWF9CT09MKSwgKFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TKSk7CisgICAgRVhGTEFHUyA9IChib29sKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGJvb2wpLCAoU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpKTsKICAgICB3aGlsZShFWElOREVYIDwgU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpIHsKICAgICAgICAgaWYocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUocFRhYmxlLCAoaW50KikmRVhSVU5MRU5HVEgpICE9IDApIHsKICAgICAgICAgICAgIGRlbGV0ZSBwVGFibGU7CkBAIC0zNDc3LDcgKzM0NzcsNyBAQAogfQogRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9WMihJRlhfUGF1c2UqIHBQYXVzZSkKIHsKLSAgICBGWF9CT09MIFNMVFAsIGJWYWw7CisgICAgYm9vbCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRyA9ICptX3BJbWFnZTsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOwpAQCAtMzY1MCw3ICszNjUwLDcgQEAKIH0KIEZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVjEoSUZYX1BhdXNlKiBwUGF1c2UpCiB7Ci0gICAgRlhfQk9PTCBTTFRQLCBiVmFsOworICAgIGJvb2wgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUID0gMDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHID0gKCptX3BJbWFnZSk7CiAgICAgZm9yKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKQEAgLTM3OTksNyArMzc5OSw3IEBACiB9CiBGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQzKENKQmlnMl9JbWFnZSAqcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQogewotICAgIEZYX0JPT0wgU0xUUCwgYlZhbDsKKyAgICBib29sIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7CiAgICAgdWludDhfdCAqcExpbmUxLCAqcExpbmUyLCBjVmFsOwpAQCAtMzg5MSw3ICszODkxLDcgQEAKIH0KIEZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX3Vub3B0KENKQmlnMl9JbWFnZSAqIHBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKIHsKLSAgICBGWF9CT09MIFNMVFAsIGJWYWw7CisgICAgYm9vbCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKICAgICBmb3IoOyBtX2xvb3BJbmRleCA8IEdCSDsgbV9sb29wSW5kZXgrKykgewpAQCAtMzk0MCw3ICszOTQwLDcgQEAKIH0KIEZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX29wdDMoQ0pCaWcyX0ltYWdlICpwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7Ci0gICAgRlhfQk9PTCBTTFRQLCBiVmFsOworICAgIGJvb2wgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKICAgICB1aW50OF90ICpwTGluZTEsICpwTGluZTIsIGNWYWw7CkBAIC00MDMxLDcgKzQwMzEsNyBAQAogfQogRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfdW5vcHQoQ0pCaWcyX0ltYWdlICogcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQogewotICAgIEZYX0JPT0wgU0xUUCwgYlZhbDsKKyAgICBib29sIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOwogICAgIGZvcihGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7CkBAIC00MDc4LDcgKzQwNzgsNyBAQAogfQogRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfb3B0MyhDSkJpZzJfSW1hZ2UgKnBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKIHsKLSAgICBGWF9CT09MIFNMVFAsIGJWYWw7CisgICAgYm9vbCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwogICAgIHVpbnQ4X3QgKnBMaW5lMSwgKnBMaW5lMiwgY1ZhbDsKQEAgLTQxNjksNyArNDE2OSw3IEBACiB9CiBGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl91bm9wdChDSkJpZzJfSW1hZ2UgKiBwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7Ci0gICAgRlhfQk9PTCBTTFRQLCBiVmFsOworICAgIGJvb2wgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7CiAgICAgZm9yKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKQEAgLTQyMTQsNyArNDIxNCw3IEBACiB9CiBGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlM19vcHQzKENKQmlnMl9JbWFnZSAqcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQogewotICAgIEZYX0JPT0wgU0xUUCwgYlZhbDsKKyAgICBib29sIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBGWF9EV09SRCBsaW5lMTsKICAgICB1aW50OF90ICpwTGluZTEsIGNWYWw7CkBAIC00MjkwLDcgKzQyOTAsNyBAQAogfQogRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfdW5vcHQoQ0pCaWcyX0ltYWdlICogcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQogewotICAgIEZYX0JPT0wgU0xUUCwgYlZhbDsKKyAgICBib29sIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7CiAgICAgZm9yKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR2VuZXJhbERlY29kZXIuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR2VuZXJhbERlY29kZXIuaAppbmRleCAyYmQyY2VhLi5mMzQ4ZTk2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dlbmVyYWxEZWNvZGVyLmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5oCkBAIC03Niw3ICs3Niw3IEBACiAgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciAqbV9wQXJpdGhEZWNvZGVyOwogICAgIEpCaWcyQXJpdGhDdHggKm1fZ2JDb250ZXh0OwogICAgIEZYX1dPUkQJCW1fRGVjb2RlVHlwZTsKLSAgICBGWF9CT09MIExUUDsKKyAgICBib29sIExUUDsKICAgICBGWF9SRUNUIG1fUmVwbGFjZVJlY3Q7CiBwcml2YXRlOgogCkBAIC0xMTIsMTIgKzExMiwxMiBAQAogCiAgICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCk7CiBwdWJsaWM6Ci0gICAgRlhfQk9PTCBNTVI7CisgICAgYm9vbCBNTVI7CiAgICAgRlhfRFdPUkQgR0JXOwogICAgIEZYX0RXT1JEIEdCSDsKICAgICB1aW50OF90IEdCVEVNUExBVEU7Ci0gICAgRlhfQk9PTCBUUEdET047Ci0gICAgRlhfQk9PTCBVU0VTS0lQOworICAgIGJvb2wgVFBHRE9OOworICAgIGJvb2wgVVNFU0tJUDsKICAgICBDSkJpZzJfSW1hZ2UgKiBTS0lQOwogICAgIHNpZ25lZCBjaGFyIEdCQVRbOF07CiB9OwpAQCAtMTM5LDExICsxMzksMTEgQEAKIHB1YmxpYzoKICAgICBGWF9EV09SRCBHUlc7CiAgICAgRlhfRFdPUkQgR1JIOwotICAgIEZYX0JPT0wgR1JURU1QTEFURTsKKyAgICBib29sIEdSVEVNUExBVEU7CiAgICAgQ0pCaWcyX0ltYWdlICpHUlJFRkVSRU5DRTsKICAgICBpbnQzMl90IEdSUkVGRVJFTkNFRFg7CiAgICAgaW50MzJfdCBHUlJFRkVSRU5DRURZOwotICAgIEZYX0JPT0wgVFBHUk9OOworICAgIGJvb2wgVFBHUk9OOwogICAgIHNpZ25lZCBjaGFyCUdSQVRbNF07CiB9OwogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtMTY3LDggKzE2Nyw4IEBACiAgICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcySW50RGVjb2RlclN0YXRlICpwSURTID0gTlVMTCk7CiBwdWJsaWM6Ci0gICAgRlhfQk9PTCBTQkhVRkY7Ci0gICAgRlhfQk9PTCBTQlJFRklORTsKKyAgICBib29sIFNCSFVGRjsKKyAgICBib29sIFNCUkVGSU5FOwogICAgIEZYX0RXT1JEIFNCVzsKICAgICBGWF9EV09SRCBTQkg7CiAgICAgRlhfRFdPUkQgU0JOVU1JTlNUQU5DRVM7CkBAIC0xNzksMTAgKzE3OSwxMCBAQAogICAgIHVpbnQ4X3QgU0JTWU1DT0RFTEVOOwogCiAgICAgQ0pCaWcyX0ltYWdlICoqU0JTWU1TOwotICAgIEZYX0JPT0wgU0JERUZQSVhFTDsKKyAgICBib29sIFNCREVGUElYRUw7CiAKICAgICBKQmlnMkNvbXBvc2VPcCBTQkNPTUJPUDsKLSAgICBGWF9CT09MIFRSQU5TUE9TRUQ7CisgICAgYm9vbCBUUkFOU1BPU0VEOwogCiAgICAgSkJpZzJDb3JuZXIgUkVGQ09STkVSOwogICAgIHNpZ25lZCBjaGFyIFNCRFNPRkZTRVQ7CkBAIC0xOTQsNyArMTk0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICpTQkhVRkZSRFgsCiAgICAgICAgICAgICAgICAgICAgICAgICAqU0JIVUZGUkRZLAogICAgICAgICAgICAgICAgICAgICAgICAgKlNCSFVGRlJTSVpFOwotICAgIEZYX0JPT0wgU0JSVEVNUExBVEU7CisgICAgYm9vbCBTQlJURU1QTEFURTsKICAgICBzaWduZWQgY2hhciBTQlJBVFs0XTsKIH07CiBjbGFzcyBDSkJpZzJfU0REUHJvYyA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0CkBAIC0yMDUsOCArMjA1LDggQEAKIAogICAgIENKQmlnMl9TeW1ib2xEaWN0ICpkZWNvZGVfSHVmZm1hbihDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpOwogcHVibGljOgotICAgIEZYX0JPT0wgU0RIVUZGOwotICAgIEZYX0JPT0wgU0RSRUZBR0c7CisgICAgYm9vbCBTREhVRkY7CisgICAgYm9vbCBTRFJFRkFHRzsKICAgICBGWF9EV09SRCBTRE5VTUlOU1lNUzsKICAgICBDSkJpZzJfSW1hZ2UgKiogU0RJTlNZTVM7CiAgICAgRlhfRFdPUkQgU0ROVU1ORVdTWU1TOwpAQCAtMjE3LDcgKzIxNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAqU0RIVUZGQUdHSU5TVDsKICAgICB1aW50OF90IFNEVEVNUExBVEU7CiAgICAgc2lnbmVkIGNoYXIgU0RBVFs4XTsKLSAgICBGWF9CT09MIFNEUlRFTVBMQVRFOworICAgIGJvb2wgU0RSVEVNUExBVEU7CiAgICAgc2lnbmVkIGNoYXIgU0RSQVRbNF07CiB9OwogY2xhc3MgQ0pCaWcyX0hUUkRQcm9jIDogcHVibGljIENKQmlnMl9PYmplY3QKQEAgLTIzMCwxMyArMjMwLDEzIEBACiBwdWJsaWM6CiAgICAgRlhfRFdPUkQgSEJXLAogICAgICAgICAgICAgIEhCSDsKLSAgICBGWF9CT09MIEhNTVI7CisgICAgYm9vbCBITU1SOwogICAgIHVpbnQ4X3QgSFRFTVBMQVRFOwogICAgIEZYX0RXT1JEIEhOVU1QQVRTOwogICAgIENKQmlnMl9JbWFnZSAqKkhQQVRTOwotICAgIEZYX0JPT0wgSERFRlBJWEVMOworICAgIGJvb2wgSERFRlBJWEVMOwogICAgIEpCaWcyQ29tcG9zZU9wIEhDT01CT1A7Ci0gICAgRlhfQk9PTCBIRU5BQkxFU0tJUDsKKyAgICBib29sIEhFTkFCTEVTS0lQOwogICAgIEZYX0RXT1JEIEhHVywKICAgICAgICAgICAgICBIR0g7CiAgICAgaW50MzJfdCBIR1gsCkBAIC0yNTQsNyArMjU0LDcgQEAKIAogICAgIENKQmlnMl9QYXR0ZXJuRGljdCAqZGVjb2RlX01NUihDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtLCBJRlhfUGF1c2UqIHBQYXVzZSk7CiBwdWJsaWM6Ci0gICAgRlhfQk9PTCBIRE1NUjsKKyAgICBib29sIEhETU1SOwogICAgIHVpbnQ4X3QgSERQVywKICAgICAgICAgICAgIEhEUEg7CiAgICAgRlhfRFdPUkQgR1JBWU1BWDsKQEAgLTI2OCw4ICsyNjgsOCBAQAogCiAgICAgRlhfRFdPUkQgKmRlY29kZV9NTVIoQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSwgSUZYX1BhdXNlKiBwUGF1c2UpOwogcHVibGljOgotICAgIEZYX0JPT0wgR1NNTVI7Ci0gICAgRlhfQk9PTCBHU1VTRVNLSVA7CisgICAgYm9vbCBHU01NUjsKKyAgICBib29sIEdTVVNFU0tJUDsKICAgICB1aW50OF90IEdTQlBQOwogICAgIEZYX0RXT1JEIEdTVywKICAgICAgICAgICAgICBHU0g7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZS5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZS5jcHAKaW5kZXggMDYxNjEyMy4uNDkzMmU1NyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmNwcApAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogQ0pCaWcyX0h1ZmZtYW5UYWJsZTo6Q0pCaWcyX0h1ZmZtYW5UYWJsZShjb25zdCBKQmlnMlRhYmxlTGluZSAqcFRhYmxlLCBpbnQgbkxpbmVzLAotICAgICAgICBGWF9CT09MIGJIVE9PQikKKyAgICAgICAgYm9vbCBiSFRPT0IpCiB7CiAgICAgaW5pdCgpOwogICAgIG1fYk9LID0gcGFyc2VGcm9tU3RhbmRhcmRUYWJsZShwVGFibGUsIG5MaW5lcywgYkhUT09CKTsKQEAgLTM4LDE0ICszOCwxNCBAQAogfQogdm9pZCBDSkJpZzJfSHVmZm1hblRhYmxlOjppbml0KCkKIHsKLSAgICBIVE9PQiA9IEZBTFNFOworICAgIEhUT09CID0gZmFsc2U7CiAgICAgTlRFTVAgPSAwOwogICAgIENPREVTID0gTlVMTDsKICAgICBQUkVGTEVOID0gTlVMTDsKICAgICBSQU5HRUxFTiA9IE5VTEw7CiAgICAgUkFOR0VMT1cgPSBOVUxMOwogfQotaW50IENKQmlnMl9IdWZmbWFuVGFibGU6OnBhcnNlRnJvbVN0YW5kYXJkVGFibGUoY29uc3QgSkJpZzJUYWJsZUxpbmUgKnBUYWJsZSwgaW50IG5MaW5lcywgRlhfQk9PTCBiSFRPT0IpCitpbnQgQ0pCaWcyX0h1ZmZtYW5UYWJsZTo6cGFyc2VGcm9tU3RhbmRhcmRUYWJsZShjb25zdCBKQmlnMlRhYmxlTGluZSAqcFRhYmxlLCBpbnQgbkxpbmVzLCBib29sIGJIVE9PQikKIHsKICAgICBpbnQgQ1VSTEVOLCBMRU5NQVgsIENVUkNPREUsIENVUlRFTVAsIGk7CiAgICAgaW50ICpMRU5DT1VOVDsKQEAgLTE4OCw3ICsxODgsNyBAQAogICAgIH0KICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoTEVOQ09VTlQpOwogICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShGSVJTVENPREUpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogZmFpbGVkOgotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZS5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuaAppbmRleCBkNjhjZWQyLi5kNmJjM2QxIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZS5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmgKQEAgLTEzLDcgKzEzLDcgQEAKIHsKIHB1YmxpYzoKIAotICAgIENKQmlnMl9IdWZmbWFuVGFibGUoY29uc3QgSkJpZzJUYWJsZUxpbmUgKnBUYWJsZSwgaW50IG5MaW5lcywgRlhfQk9PTCBiSFRPT0IpOworICAgIENKQmlnMl9IdWZmbWFuVGFibGUoY29uc3QgSkJpZzJUYWJsZUxpbmUgKnBUYWJsZSwgaW50IG5MaW5lcywgYm9vbCBiSFRPT0IpOwogCiAgICAgQ0pCaWcyX0h1ZmZtYW5UYWJsZShDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtKTsKIApAQCAtMjEsMjIgKzIxLDIyIEBACiAKICAgICB2b2lkIGluaXQoKTsKIAotICAgIGludCBwYXJzZUZyb21TdGFuZGFyZFRhYmxlKGNvbnN0IEpCaWcyVGFibGVMaW5lICpwVGFibGUsIGludCBuTGluZXMsIEZYX0JPT0wgYkhUT09CKTsKKyAgICBpbnQgcGFyc2VGcm9tU3RhbmRhcmRUYWJsZShjb25zdCBKQmlnMlRhYmxlTGluZSAqcFRhYmxlLCBpbnQgbkxpbmVzLCBib29sIGJIVE9PQik7CiAKICAgICBpbnQgcGFyc2VGcm9tQ29kZWRCdWZmZXIoQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSk7CiAKLSAgICBGWF9CT09MIGlzT0soKQorICAgIGJvb2wgaXNPSygpCiAgICAgewogICAgICAgICByZXR1cm4gbV9iT0s7CiAgICAgfQogcHJpdmF0ZToKLSAgICBGWF9CT09MIEhUT09COworICAgIGJvb2wgSFRPT0I7CiAgICAgaW50IE5URU1QOwogICAgIGludCAqQ09ERVM7CiAgICAgaW50ICpQUkVGTEVOOwogICAgIGludCAqUkFOR0VMRU47CiAgICAgaW50ICpSQU5HRUxPVzsKLSAgICBGWF9CT09MIG1fYk9LOworICAgIGJvb2wgbV9iT0s7CiAgICAgZnJpZW5kIGNsYXNzIENKQmlnMl9IdWZmbWFuRGVjb2RlcjsKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlX1N0YW5kYXJkLmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZV9TdGFuZGFyZC5oCmluZGV4IDQyOGIyYzMuLmMwOGQyNDUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlX1N0YW5kYXJkLmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGVfU3RhbmRhcmQuaApAQCAtMTEsNyArMTEsNyBAQAogICAgIGludCBSQU5ERUxFTjsKICAgICBpbnQgUkFOR0VMT1c7CiB9IEpCaWcyVGFibGVMaW5lOwotY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjEgPSBGQUxTRTsKK2NvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0IxID0gZmFsc2U7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjFbXSA9IHsKICAgICB7IDEsCTQsCQkwIH0sCiAgICAgeyAyLAk4LAkgICAxNiB9LApAQCAtMTksNyArMTksNyBAQAogICAgIHsgMCwgICAzMiwJICAgLTEgfSwKICAgICB7IDMsICAgMzIsCTY1ODA4IH0KIH07Ci1jb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMiA9IFRSVUU7Citjb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMiA9IHRydWU7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjJbXSA9IHsKICAgICB7IDEsCTAsCQkwIH0sCiAgICAgeyAyLAkwLAkJMSB9LApAQCAtMzAsNyArMzAsNyBAQAogICAgIHsgNiwgICAzMiwgICAgIDc1IH0sCiAgICAgeyA2LAkwLCAgICAgIDAgfQogfTsKLWNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0IzID0gVFJVRTsKK2NvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0IzID0gdHJ1ZTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CM1tdID0gewogICAgIHsgOCwJOCwgICAtMjU2IH0sCiAgICAgeyAxLAkwLAkJMCB9LApAQCAtNDIsNyArNDIsNyBAQAogICAgIHsgNywgICAzMiwgICAgIDc1IH0sCiAgICAgeyA2LAkwLAkJMCB9CiB9OwotY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjQgPSBGQUxTRTsKK2NvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0I0ID0gZmFsc2U7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjRbXSA9IHsKICAgICB7IDEsCTAsCQkxIH0sCiAgICAgeyAyLAkwLAkJMiB9LApAQCAtNTIsNyArNTIsNyBAQAogICAgIHsgMCwgICAzMiwgICAgIC0xIH0sCiAgICAgeyA1LCAgIDMyLAkgICA3NiB9LAogfTsKLWNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0I1ID0gRkFMU0U7Citjb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNSA9IGZhbHNlOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0I1W10gPSB7CiAgICAgeyA3LAk4LAkgLTI1NSB9LAogICAgIHsgMSwJMCwJICAgIDEgfSwKQEAgLTYzLDcgKzYzLDcgQEAKICAgICB7IDcsICAgMzIsICAgLTI1NiB9LAogICAgIHsgNiwgICAzMiwgICAgIDc2IH0KIH07Ci1jb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNiA9IEZBTFNFOworY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjYgPSBmYWxzZTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CNltdID0gewogICAgIHsgNSwgICAxMCwJLTIwNDggfSwKICAgICB7IDQsICAgIDksCS0xMDI0IH0sCkBAIC04MCw3ICs4MCw3IEBACiAgICAgeyA2LCAgIDMyLAktMjA0OSB9LAogICAgIHsgNiwgICAzMiwJIDIwNDggfQogfTsKLWNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0I3ID0gRkFMU0U7Citjb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNyA9IGZhbHNlOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0I3W10gPSB7CiAgICAgeyA0LAk5LAktMTAyNCB9LAogICAgIHsgMywJOCwJIC01MTIgfSwKQEAgLTk4LDcgKzk4LDcgQEAKICAgICB7IDUsICAgMzIsCS0xMDI1IH0sCiAgICAgeyA1LCAgIDMyLAkgMjA0OCB9LAogfTsKLWNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0I4ID0gVFJVRTsKK2NvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0I4ID0gdHJ1ZTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9COFtdID0gewogICAgIHsgOCwJMywJICAtMTUgfSwKICAgICB7IDksCTEsCSAgIC03IH0sCkBAIC0xMjIsNyArMTIyLDcgQEAKICAgICB7IDksICAgMzIsCSAxNjcwIH0sCiAgICAgeyAyLAkwLAkJMCB9CiB9OwotY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjkgPSBUUlVFOworY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjkgPSB0cnVlOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0I5W10gPSB7CiAgICAgeyA4LAk0LAkgIC0zMSB9LAogICAgIHsgOSwJMiwJICAtMTUgfSwKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgIHsgOSwgICAzMiwJIDMzMzkgfSwKICAgICB7IDIsCTAsCQkwIH0KIH07Ci1jb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTAgPSBUUlVFOworY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjEwID0gdHJ1ZTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CMTBbXSA9IHsKICAgICB7IDcsCTQsCSAgLTIxIH0sCiAgICAgeyA4LAkwLAkgICAtNSB9LApAQCAtMTcxLDcgKzE3MSw3IEBACiAgICAgeyA4LCAgIDMyLAkgNDE2NiB9LAogICAgIHsgMiwJMCwJCTAgfQogfTsKLWNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0IxMSA9IEZBTFNFOworY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjExID0gZmFsc2U7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjExW10gPSB7CiAgICAgeyAxLAkwLAkJMSB9LAogICAgIHsgMiwJMSwJCTIgfSwKQEAgLTE4OCw3ICsxODgsNyBAQAogICAgIHsgMCwgICAzMiwJCTAgfSwKICAgICB7IDcsICAgMzIsCSAgMTQxIH0KIH07Ci1jb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTIgPSBGQUxTRTsKK2NvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0IxMiA9IGZhbHNlOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0IxMltdID0gewogICAgIHsgMSwJMCwJCTEgfSwKICAgICB7IDIsCTAsCQkyIH0sCkBAIC0yMDUsNyArMjA1LDcgQEAKICAgICB7IDAsICAgMzIsCQkwIH0sCiAgICAgeyA4LCAgIDMyLAkgICA3MyB9CiB9OwotY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjEzID0gRkFMU0U7Citjb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTMgPSBmYWxzZTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CMTNbXSA9IHsKICAgICB7IDEsCTAsCQkxIH0sCiAgICAgeyAzLAkwLAkJMiB9LApAQCAtMjIyLDcgKzIyMiw3IEBACiAgICAgeyAwLCAgIDMyLAkJMCB9LAogICAgIHsgNywgICAzMiwJICAxNDEgfQogfTsKLWNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0IxNCA9IEZBTFNFOworY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjE0ID0gZmFsc2U7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjE0W10gPSB7CiAgICAgeyAzLAkwLAkgICAtMiB9LAogICAgIHsgMywJMCwJICAgLTEgfSwKQEAgLTIzMiw3ICsyMzIsNyBAQAogICAgIHsgMCwgICAzMiwJICAgLTMgfSwKICAgICB7IDAsICAgMzIsCQkzIH0KIH07Ci1jb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUgPSBGQUxTRTsKK2NvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0IxNSA9IGZhbHNlOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0IxNVtdID0gewogICAgIHsgNywJNCwJICAtMjQgfSwKICAgICB7IDYsCTIsCSAgIC04IH0sCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuY3BwCmluZGV4IDllZjQ0NjQuLjAzMGIwYzIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuY3BwCkBAIC0xNiw3ICsxNiw3IEBACiAgICAgbV9uSGVpZ2h0CT0gaDsKICAgICBpZiAobV9uV2lkdGggPD0gMCB8fCBtX25IZWlnaHQgPD0gMCB8fCBtX25XaWR0aCA+IElOVF9NQVggLSAzMSkgewogICAgICAgICBtX3BEYXRhID0gTlVMTDsKLSAgICAgICAgbV9iTmVlZEZyZWUgPSBGQUxTRTsKKyAgICAgICAgbV9iTmVlZEZyZWUgPSBmYWxzZTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtX25TdHJpZGUgID0gKCh3ICsgMzEpID4+IDUpIDw8IDI7CkBAIC0yNSw3ICsyNSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbV9wRGF0YSA9IE5VTEw7CiAgICAgfQotICAgIG1fYk5lZWRGcmVlID0gVFJVRTsKKyAgICBtX2JOZWVkRnJlZSA9IHRydWU7CiB9CiBDSkJpZzJfSW1hZ2U6OkNKQmlnMl9JbWFnZShpbnQzMl90IHcsIGludDMyX3QgaCwgaW50MzJfdCBzdHJpZGUsIHVpbnQ4X3QqcEJ1ZikKIHsKQEAgLTMzLDcgKzMzLDcgQEAKICAgICBtX25IZWlnaHQgPSBoOwogICAgIG1fblN0cmlkZSA9IHN0cmlkZTsKICAgICBtX3BEYXRhID0gcEJ1ZjsKLSAgICBtX2JOZWVkRnJlZSA9IEZBTFNFOworICAgIG1fYk5lZWRGcmVlID0gZmFsc2U7CiB9CiBDSkJpZzJfSW1hZ2U6OkNKQmlnMl9JbWFnZShDSkJpZzJfSW1hZ2UgJmltKQogewpAQCAtNDcsNyArNDcsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1fcERhdGEgPSBOVUxMOwogICAgIH0KLSAgICBtX2JOZWVkRnJlZSA9IFRSVUU7CisgICAgbV9iTmVlZEZyZWUgPSB0cnVlOwogfQogQ0pCaWcyX0ltYWdlOjp+Q0pCaWcyX0ltYWdlKCkKIHsKQEAgLTU1LDcgKzU1LDcgQEAKICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKG1fcERhdGEpOwogICAgIH0KIH0KLUZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpnZXRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSkKK2Jvb2wgQ0pCaWcyX0ltYWdlOjpnZXRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSkKIHsKICAgICBpZiAoIW1fcERhdGEpIHsKICAgICAgICAgcmV0dXJuIDA7CkBAIC03Miw3ICs3Miw3IEBACiAgICAgcmV0dXJuICgobV9wRGF0YVttXSA+PiAoNyAtIG4pKSAmIDEpOwogfQogCi1pbnQzMl90IENKQmlnMl9JbWFnZTo6c2V0UGl4ZWwoaW50MzJfdCB4LCBpbnQzMl90IHksIEZYX0JPT0wgdikKK2ludDMyX3QgQ0pCaWcyX0ltYWdlOjpzZXRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSwgYm9vbCB2KQogewogICAgIGlmICghbV9wRGF0YSkgewogICAgICAgICByZXR1cm4gMDsKQEAgLTEwNCwzMSArMTA0LDMxIEBACiAgICAgICAgIEpCSUcyX21lbWNweShtX3BEYXRhICsgaFRvICogbV9uU3RyaWRlLCBtX3BEYXRhICsgaEZyb20gKiBtX25TdHJpZGUsIG1fblN0cmlkZSk7CiAgICAgfQogfQotdm9pZCBDSkJpZzJfSW1hZ2U6OmZpbGwoRlhfQk9PTCB2KQordm9pZCBDSkJpZzJfSW1hZ2U6OmZpbGwoYm9vbCB2KQogewogICAgIGlmICghbV9wRGF0YSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIEpCSUcyX21lbXNldChtX3BEYXRhLCB2ID8gMHhmZiA6IDAsIG1fblN0cmlkZSAqIG1fbkhlaWdodCk7CiB9Ci1GWF9CT09MIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvKENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wKQorYm9vbCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VUbyhDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCkKIHsKICAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBjb21wb3NlVG9fb3B0MihwRHN0LCB4LCB5LCBvcCk7CiB9Ci1GWF9CT09MIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvKENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCkKK2Jvb2wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG8oQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3AsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KQogewogICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKE5VTEwgPT0gcFNyY1JlY3QgfHwgKnBTcmNSZWN0ID09IEZYX1JFQ1QoMCwgMCwgbV9uV2lkdGgsIG1fbkhlaWdodCkpIHsKICAgICAgICAgcmV0dXJuIGNvbXBvc2VUb19vcHQyKHBEc3QsIHgsIHksIG9wKTsKICAgICB9CiAgICAgcmV0dXJuIGNvbXBvc2VUb19vcHQyKHBEc3QsIHgsIHksIG9wLCBwU3JjUmVjdCk7CiB9Ci1GWF9CT09MIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvX3Vub3B0KENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wKQorYm9vbCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VUb191bm9wdChDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCkKIHsKICAgICBpbnQzMl90IHcsIGgsIGR4LCBkeTsKICAgICBpbnQzMl90IGksIGo7CkBAIC0xOTIsMTcgKzE5MiwxNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvX29wdChDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCkKK2Jvb2wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG9fb3B0KENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wKQogewogICAgIGludDMyX3QgeDAsIHgxLCB5MCwgeTEsIHh4LCB5eTsKICAgICB1aW50OF90ICpwTGluZVNyYywgKnBMaW5lRHN0LCAqc3JjUHRyLCAqZGVzdFB0cjsKICAgICBGWF9EV09SRCBzcmMwLCBzcmMxLCBzcmMsIGRlc3QsIHMxLCBzMiwgbTEsIG0yLCBtMzsKLSAgICBGWF9CT09MIG9uZUJ5dGU7CisgICAgYm9vbCBvbmVCeXRlOwogICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHkgPCAwKSB7CiAgICAgICAgIHkwID0gLXk7CkBAIC0yMTUsNyArMjE1LDcgQEAKICAgICAgICAgeTEgPSBtX25IZWlnaHQ7CiAgICAgfQogICAgIGlmICh5MCA+PSB5MSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHggPj0gMCkgewogICAgICAgICB4MCA9IHggJiB+NzsKQEAgLTIyNyw3ICsyMjcsNyBAQAogICAgICAgICB4MSA9IHBEc3QtPm1fbldpZHRoOwogICAgIH0KICAgICBpZiAoeDAgPj0geDEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHMxID0geCAmIDc7CiAgICAgczIgPSA4IC0gczE7CkBAIC02NzksMTkgKzY3OSwxOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VGcm9tKGludDMyX3QgeCwgaW50MzJfdCB5LCBDSkJpZzJfSW1hZ2UgKnBTcmMsIEpCaWcyQ29tcG9zZU9wIG9wKQorYm9vbCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VGcm9tKGludDMyX3QgeCwgaW50MzJfdCB5LCBDSkJpZzJfSW1hZ2UgKnBTcmMsIEpCaWcyQ29tcG9zZU9wIG9wKQogewogICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIHBTcmMtPmNvbXBvc2VUbyh0aGlzLCB4LCB5LCBvcCk7CiB9Ci1GWF9CT09MIENKQmlnMl9JbWFnZTo6Y29tcG9zZUZyb20oaW50MzJfdCB4LCBpbnQzMl90IHksIENKQmlnMl9JbWFnZSAqcFNyYywgSkJpZzJDb21wb3NlT3Agb3AsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KQorYm9vbCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VGcm9tKGludDMyX3QgeCwgaW50MzJfdCB5LCBDSkJpZzJfSW1hZ2UgKnBTcmMsIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCkKIHsKICAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBwU3JjLT5jb21wb3NlVG8odGhpcywgeCwgeSwgb3AsIHBTcmNSZWN0KTsKIH0KQEAgLTc2NSw3ICs3NjUsNyBAQAogICAgIH0KICAgICByZXR1cm4gcEltYWdlOwogfQotdm9pZCBDSkJpZzJfSW1hZ2U6OmV4cGFuZChpbnQzMl90IGgsIEZYX0JPT0wgdikKK3ZvaWQgQ0pCaWcyX0ltYWdlOjpleHBhbmQoaW50MzJfdCBoLCBib29sIHYpCiB7CiAgICAgaWYgKCFtX3BEYXRhIHx8IGggPD0gbV9uSGVpZ2h0KSB7CiAgICAgICAgIHJldHVybjsKQEAgLTc4OCw3ICs3ODgsNyBAQAogICAgIEpCSUcyX21lbXNldChtX3BEYXRhICsgZHdIZWlnaHQgKiBkd1N0cmlkZSwgdiA/IDB4ZmYgOiAwLCAoZHdIIC0gZHdIZWlnaHQpICogZHdTdHJpZGUpOwogICAgIG1fbkhlaWdodCA9IGg7CiB9Ci1GWF9CT09MIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvX29wdDIoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApCitib29sIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvX29wdDIoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApCiB7CiAgICAgaW50MzJfdCB4czAgPSAwLCB5czAgID0gMCwgeHMxICA9IDAsIHlzMSAgID0gMCwgeGQwICAgID0gMCwgeWQwICAgICAgICAgID0gMCwgeGQxICAgICAgPSAwLCAKICAgICAgICAgICAgICB5ZDEgPSAwLCB4eCAgID0gMCwgeXkgICA9IDAsIHcgICAgID0gMCwgaCAgICAgID0gMCwgbWlkZGxlRHdvcmRzID0gMCwgbGluZUxlZnQgPSAwOwpAQCAtNzk5LDEwICs3OTksMTAgQEAKICAgICB1aW50OF90ICpsaW5lU3JjID0gTlVMTCwgKmxpbmVEc3QgPSBOVUxMLCAqc3AgPSBOVUxMLCAqZHAgPSBOVUxMOwogCiAgICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoeCA8IC0xMDQ4NTc2IHx8IHggPiAxMDQ4NTc2IHx8IHkgPCAtMTA0ODU3NiB8fCB5ID4gMTA0ODU3NikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYoeSA8IDApIHsKICAgICAgICAgeXMwID0gLXk7CkBAIC0xMjA1LDE3ICsxMjA1LDE3IEBACiAgICAgfQogICAgIHJldHVybiAxOwogfQotRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VUb19vcHQyKENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCkKK2Jvb2wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG9fb3B0MihDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QpCiB7CiAgICAgaW50MzJfdCB4czAsIHlzMCwgeHMxLCB5czEsIHhkMCwgeWQwLCB4ZDEsIHlkMSwgeHgsIHl5LCB3LCBoLCBtaWRkbGVEd29yZHMsIGxpbmVMZWZ0OwogICAgIEZYX0RXT1JEIHMxLCBkMSwgZDIsIHNoaWZ0LCBzaGlmdDEsIHNoaWZ0MiwgdG1wLCB0bXAxLCB0bXAyLCBtYXNrTCwgbWFza1IsIG1hc2tNOwogICAgIHVpbnQ4X3QgKmxpbmVTcmMsICpsaW5lRHN0LCAqc3AsICpkcDsKICAgICBpbnQzMl90IHN3LCBzaDsKICAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICh4IDwgLTEwNDg1NzYgfHwgeCA+IDEwNDg1NzYgfHwgeSA8IC0xMDQ4NTc2IHx8IHkgPiAxMDQ4NTc2KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBzdyA9IHBTcmNSZWN0LT5XaWR0aCgpOwogICAgIHNoID0gcFNyY1JlY3QtPkhlaWdodCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5oCmluZGV4IDQyM2JlYmMuLmQ1MWQ5OTkgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmgKQEAgLTI4LDMxICsyOCwzMSBAQAogCiAgICAgfkNKQmlnMl9JbWFnZSgpOwogCi0gICAgRlhfQk9PTCBnZXRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSk7CisgICAgYm9vbCBnZXRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSk7CiAKLSAgICBpbnQzMl90IHNldFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5LCBGWF9CT09MIHYpOworICAgIGludDMyX3Qgc2V0UGl4ZWwoaW50MzJfdCB4LCBpbnQzMl90IHksIGJvb2wgdik7CiAKICAgICB2b2lkIGNvcHlMaW5lKGludDMyX3QgaFRvLCBpbnQzMl90IGhGcm9tKTsKIAotICAgIHZvaWQgZmlsbChGWF9CT09MIHYpOworICAgIHZvaWQgZmlsbChib29sIHYpOwogCi0gICAgRlhfQk9PTCBjb21wb3NlVG8oQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApOwotICAgIEZYX0JPT0wgY29tcG9zZVRvKENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCk7CisgICAgYm9vbCBjb21wb3NlVG8oQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApOworICAgIGJvb2wgY29tcG9zZVRvKENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCk7CiAKLSAgICBGWF9CT09MIGNvbXBvc2VUb191bm9wdChDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCk7CisgICAgYm9vbCBjb21wb3NlVG9fdW5vcHQoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApOwogCi0gICAgRlhfQk9PTCBjb21wb3NlVG9fb3B0KENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wKTsKKyAgICBib29sIGNvbXBvc2VUb19vcHQoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApOwogCi0gICAgRlhfQk9PTCBjb21wb3NlVG9fb3B0MihDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCk7Ci0gICAgRlhfQk9PTCBjb21wb3NlVG9fb3B0MihDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QpOworICAgIGJvb2wgY29tcG9zZVRvX29wdDIoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApOworICAgIGJvb2wgY29tcG9zZVRvX29wdDIoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3AsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KTsKIAotICAgIEZYX0JPT0wgY29tcG9zZUZyb20oaW50MzJfdCB4LCBpbnQzMl90IHksIENKQmlnMl9JbWFnZSAqcFNyYywgSkJpZzJDb21wb3NlT3Agb3ApOwotICAgIEZYX0JPT0wgY29tcG9zZUZyb20oaW50MzJfdCB4LCBpbnQzMl90IHksIENKQmlnMl9JbWFnZSAqcFNyYywgSkJpZzJDb21wb3NlT3Agb3AsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KTsKKyAgICBib29sIGNvbXBvc2VGcm9tKGludDMyX3QgeCwgaW50MzJfdCB5LCBDSkJpZzJfSW1hZ2UgKnBTcmMsIEpCaWcyQ29tcG9zZU9wIG9wKTsKKyAgICBib29sIGNvbXBvc2VGcm9tKGludDMyX3QgeCwgaW50MzJfdCB5LCBDSkJpZzJfSW1hZ2UgKnBTcmMsIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCk7CiAgICAgQ0pCaWcyX0ltYWdlICpzdWJJbWFnZV91bm9wdChpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCB3LCBpbnQzMl90IGgpOwogCiAgICAgQ0pCaWcyX0ltYWdlICpzdWJJbWFnZShpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCB3LCBpbnQzMl90IGgpOwogCi0gICAgdm9pZCBleHBhbmQoaW50MzJfdCBoLCBGWF9CT09MIHYpOworICAgIHZvaWQgZXhwYW5kKGludDMyX3QgaCwgYm9vbCB2KTsKIHB1YmxpYzoKIAogICAgIGludDMyX3QgbV9uV2lkdGg7CkBAIC02Myw2ICs2Myw2IEBACiAKICAgICB1aW50OF90ICptX3BEYXRhOwogCi0gICAgRlhfQk9PTCBtX2JOZWVkRnJlZTsKKyAgICBib29sIG1fYk5lZWRGcmVlOwogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYWdlLmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhZ2UuaAppbmRleCBiMDdlYmE4Li5iNGUxNTlmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhZ2UuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhZ2UuaApAQCAtMTMsNyArMTMsNyBAQAogICAgIEZYX0RXT1JEIG1fZHdSZXNvbHV0aW9uWCwKICAgICAgICAgICAgICBtX2R3UmVzb2x1dGlvblk7CiAgICAgdWludDhfdCBtX2NGbGFnczsKLSAgICBGWF9CT09MIG1fYklzU3RyaXBlZDsKKyAgICBib29sIG1fYklzU3RyaXBlZDsKICAgICBGWF9XT1JEIG1fd01heFN0cmlwZVNpemU7CiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TeW1ib2xEaWN0LmNwcAppbmRleCAwZTViOTJmLi5jMTBkNDYxIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU3ltYm9sRGljdC5jcHAKQEAgLTksNyArOSw3IEBACiB7CiAgICAgU0ROVU1FWFNZTVMgPSAwOwogICAgIFNERVhTWU1TID0gTlVMTDsKLSAgICBtX2JDb250ZXh0UmV0YWluZWQgPSBGQUxTRTsKKyAgICBtX2JDb250ZXh0UmV0YWluZWQgPSBmYWxzZTsKICAgICBtX2diQ29udGV4dCA9IG1fZ3JDb250ZXh0ID0gTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TeW1ib2xEaWN0LmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuaAppbmRleCA5MTU2ZTMwLi41Zjk0ZGM3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuaApAQCAtMTksNyArMTksNyBAQAogcHVibGljOgogICAgIEZYX0RXT1JEIFNETlVNRVhTWU1TOwogICAgIENKQmlnMl9JbWFnZSAqKlNERVhTWU1TOwotICAgIEZYX0JPT0wgbV9iQ29udGV4dFJldGFpbmVkOworICAgIGJvb2wgbV9iQ29udGV4dFJldGFpbmVkOwogICAgIEpCaWcyQXJpdGhDdHggKm1fZ2JDb250ZXh0LAogICAgICAgICAgICAgICAgICAgKm1fZ3JDb250ZXh0OwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2V4dGVuc2lvbi5oIGIvY29yZS9zcmMvZnhjcnQvZXh0ZW5zaW9uLmgKaW5kZXggYmE0MjkxNi4uMmQ3ZjNhZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZXh0ZW5zaW9uLmgKKysrIGIvY29yZS9zcmMvZnhjcnQvZXh0ZW5zaW9uLmgKQEAgLTE0LDggKzE0LDggQEAKIHsKIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5JRlhDUlRfRmlsZUFjY2VzcygpIHt9Ci0gICAgdmlydHVhbCBGWF9CT09MCQlPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJT3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCU9wZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKSA9IDA7CisgICAgdmlydHVhbCBib29sCQlPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkgPSAwOwogICAgIHZpcnR1YWwgdm9pZAkJQ2xvc2UoKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkgPSAwOwogICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJR2V0U2l6ZSgpIGNvbnN0ID0gMDsKQEAgLTI1LDE0ICsyNSwxNCBAQAogICAgIHZpcnR1YWwgc2l6ZV90CQlXcml0ZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpID0gMDsKICAgICB2aXJ0dWFsIHNpemVfdAkJUmVhZFBvcyh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcykgPSAwOwogICAgIHZpcnR1YWwgc2l6ZV90CQlXcml0ZVBvcyhjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcykgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJRmx1c2goKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCUZsdXNoKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJVHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKSA9IDA7CiB9OwogSUZYQ1JUX0ZpbGVBY2Nlc3MqCUZYQ1JUX0ZpbGVBY2Nlc3NfQ3JlYXRlKCk7CiBjbGFzcyBDRlhfQ1JURmlsZVN0cmVhbSBmaW5hbCA6IHB1YmxpYyBJRlhfRmlsZVN0cmVhbQogewogcHVibGljOgotICAgIENGWF9DUlRGaWxlU3RyZWFtKElGWENSVF9GaWxlQWNjZXNzKiBwRkEpIDogbV9wRmlsZShwRkEpLCBtX2R3Q291bnQoMSksIG1fYlVzZVJhbmdlKEZBTFNFKSwgbV9uT2Zmc2V0KDApLCBtX25TaXplKDApIHt9CisgICAgQ0ZYX0NSVEZpbGVTdHJlYW0oSUZYQ1JUX0ZpbGVBY2Nlc3MqIHBGQSkgOiBtX3BGaWxlKHBGQSksIG1fZHdDb3VudCgxKSwgbV9iVXNlUmFuZ2UoZmFsc2UpLCBtX25PZmZzZXQoMCksIG1fblNpemUoMCkge30KICAgICB+Q0ZYX0NSVEZpbGVTdHJlYW0oKQogICAgIHsKICAgICAgICAgaWYgKG1fcEZpbGUpIHsKQEAgLTU1LDcgKzU1LDcgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBtX2JVc2VSYW5nZSA/IG1fblNpemUgOiBtX3BGaWxlLT5HZXRTaXplKCk7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJc0VPRigpIG92ZXJyaWRlCisgICAgdmlydHVhbCBib29sCQkJCUlzRU9GKCkgb3ZlcnJpZGUKICAgICB7CiAgICAgICAgIHJldHVybiBHZXRQb3NpdGlvbigpID49IEdldFNpemUoKTsKICAgICB9CkBAIC02Nyw0MiArNjcsNDIgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcG9zOwogICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0UmFuZ2UoRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9GSUxFU0laRSBzaXplKSBvdmVycmlkZQorICAgIHZpcnR1YWwgYm9vbAkJCQlTZXRSYW5nZShGWF9GSUxFU0laRSBvZmZzZXQsIEZYX0ZJTEVTSVpFIHNpemUpIG92ZXJyaWRlCiAgICAgewogICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBzaXplIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgRlhfU0FGRV9GSUxFU0laRSBwb3MgPSBzaXplOwogICAgICAgICBwb3MgKz0gb2Zmc2V0OwogCiAgICAgICAgIGlmICghcG9zLklzVmFsaWQoKSB8fCBwb3MuVmFsdWVPckRpZSgpID4gbV9wRmlsZS0+R2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBtX25PZmZzZXQgPSBvZmZzZXQsIG1fblNpemUgPSBzaXplOwotICAgICAgICBtX2JVc2VSYW5nZSA9IFRSVUU7CisgICAgICAgIG1fYlVzZVJhbmdlID0gdHJ1ZTsKICAgICAgICAgbV9wRmlsZS0+U2V0UG9zaXRpb24obV9uT2Zmc2V0KTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICB2aXJ0dWFsIHZvaWQJCQkJQ2xlYXJSYW5nZSgpIG92ZXJyaWRlCiAgICAgewotICAgICAgICBtX2JVc2VSYW5nZSA9IEZBTFNFOworICAgICAgICBtX2JVc2VSYW5nZSA9IGZhbHNlOwogICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUKKyAgICB2aXJ0dWFsIGJvb2wJCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUKICAgICB7CiAgICAgICAgIGlmIChtX2JVc2VSYW5nZSAmJiBvZmZzZXQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgRlhfU0FGRV9GSUxFU0laRSBwb3MgPSBvZmZzZXQ7CiAKICAgICAgICAgaWYgKG1fYlVzZVJhbmdlKSB7CiAgICAgICAgICAgICBwb3MgKz0gbV9uT2Zmc2V0OwogICAgICAgICAgICAgaWYgKCFwb3MuSXNWYWxpZCgpIHx8IHBvcy5WYWx1ZU9yRGllKCkgPiAoc2l6ZV90KUdldFNpemUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChGWF9CT09MKW1fcEZpbGUtPlJlYWRQb3MoYnVmZmVyLCBzaXplLCBwb3MuVmFsdWVPckRpZSgpKTsKKyAgICAgICAgcmV0dXJuIChib29sKW1fcEZpbGUtPlJlYWRQb3MoYnVmZmVyLCBzaXplLCBwb3MuVmFsdWVPckRpZSgpKTsKICAgICB9CiAgICAgdmlydHVhbCBzaXplX3QJCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIG92ZXJyaWRlCiAgICAgewpAQCAtMTE0LDIwICsxMTQsMjAgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbV9wRmlsZS0+UmVhZChidWZmZXIsIHNpemUpOwogICAgIH0KLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlCisgICAgdmlydHVhbAlib29sCQkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZQogICAgIHsKICAgICAgICAgaWYgKG1fYlVzZVJhbmdlKSB7CiAgICAgICAgICAgICBvZmZzZXQgKz0gbV9uT2Zmc2V0OwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoRlhfQk9PTCltX3BGaWxlLT5Xcml0ZVBvcyhidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgICAgIHJldHVybiAoYm9vbCltX3BGaWxlLT5Xcml0ZVBvcyhidWZmZXIsIHNpemUsIG9mZnNldCk7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlGbHVzaCgpICBvdmVycmlkZQorICAgIHZpcnR1YWwgYm9vbAkJCQlGbHVzaCgpICBvdmVycmlkZQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcEZpbGUtPkZsdXNoKCk7CiAgICAgfQogICAgIElGWENSVF9GaWxlQWNjZXNzKgltX3BGaWxlOwogICAgIEZYX0RXT1JECQkJbV9kd0NvdW50OwotICAgIEZYX0JPT0wJCQkJbV9iVXNlUmFuZ2U7CisgICAgYm9vbAkJCQltX2JVc2VSYW5nZTsKICAgICBGWF9GSUxFU0laRQkJCW1fbk9mZnNldDsKICAgICBGWF9GSUxFU0laRQkJCW1fblNpemU7CiB9OwpAQCAtMTM3LDIzICsxMzcsMjMgQEAKIGNsYXNzIENGWF9NZW1vcnlTdHJlYW0gZmluYWwgOiBwdWJsaWMgSUZYX01lbW9yeVN0cmVhbQogewogcHVibGljOgotICAgIENGWF9NZW1vcnlTdHJlYW0oRlhfQk9PTCBiQ29uc2VjdXRpdmUpCisgICAgQ0ZYX01lbW9yeVN0cmVhbShib29sIGJDb25zZWN1dGl2ZSkKICAgICAgICAgOiBtX2R3Q291bnQoMSkKICAgICAgICAgLCBtX25Ub3RhbFNpemUoMCkKICAgICAgICAgLCBtX25DdXJTaXplKDApCiAgICAgICAgICwgbV9uQ3VyUG9zKDApCiAgICAgICAgICwgbV9uR3Jvd1NpemUoRlhfTUVNU1RSRUFNX0Jsb2NrU2l6ZSkKLSAgICAgICAgLCBtX2JVc2VSYW5nZShGQUxTRSkKKyAgICAgICAgLCBtX2JVc2VSYW5nZShmYWxzZSkKICAgICB7CiAgICAgICAgIG1fZHdGbGFncyA9IEZYX01FTVNUUkVBTV9UYWtlT3ZlciB8IChiQ29uc2VjdXRpdmUgPyBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmUgOiAwKTsKICAgICB9Ci0gICAgQ0ZYX01lbW9yeVN0cmVhbSh1aW50OF90KiBwQnVmZmVyLCBzaXplX3QgblNpemUsIEZYX0JPT0wgYlRha2VPdmVyKQorICAgIENGWF9NZW1vcnlTdHJlYW0odWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IG5TaXplLCBib29sIGJUYWtlT3ZlcikKICAgICAgICAgOiBtX2R3Q291bnQoMSkKICAgICAgICAgLCBtX25Ub3RhbFNpemUoblNpemUpCiAgICAgICAgICwgbV9uQ3VyU2l6ZShuU2l6ZSkKICAgICAgICAgLCBtX25DdXJQb3MoMCkKICAgICAgICAgLCBtX25Hcm93U2l6ZShGWF9NRU1TVFJFQU1fQmxvY2tTaXplKQotICAgICAgICAsIG1fYlVzZVJhbmdlKEZBTFNFKQorICAgICAgICAsIG1fYlVzZVJhbmdlKGZhbHNlKQogICAgIHsKICAgICAgICAgbV9CbG9ja3MuQWRkKHBCdWZmZXIpOwogICAgICAgICBtX2R3RmxhZ3MgPSBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmUgfCAoYlRha2VPdmVyID8gRlhfTUVNU1RSRUFNX1Rha2VPdmVyIDogMCk7CkBAIC0xODQsNyArMTg0LDcgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBtX2JVc2VSYW5nZSA/IChGWF9GSUxFU0laRSkgbV9uU2l6ZSA6IChGWF9GSUxFU0laRSltX25DdXJTaXplOwogICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJSXNFT0YoKSAgb3ZlcnJpZGUKKyAgICB2aXJ0dWFsIGJvb2wJCQkJSXNFT0YoKSAgb3ZlcnJpZGUKICAgICB7CiAgICAgICAgIHJldHVybiBtX25DdXJQb3MgPj0gKHNpemVfdClHZXRTaXplKCk7CiAgICAgfQpAQCAtMTk2LDMwICsxOTYsMzAgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcG9zOwogICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0UmFuZ2UoRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9GSUxFU0laRSBzaXplKSAgb3ZlcnJpZGUKKyAgICB2aXJ0dWFsIGJvb2wJCQkJU2V0UmFuZ2UoRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9GSUxFU0laRSBzaXplKSAgb3ZlcnJpZGUKICAgICB7CiAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IHNpemUgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgRlhfU0FGRV9GSUxFU0laRSByYW5nZSA9IHNpemU7CiAgICAgICAgIHJhbmdlICs9IG9mZnNldDsKICAgICAgICAgaWYgKCFyYW5nZS5Jc1ZhbGlkKCkgfHwgcmFuZ2UuVmFsdWVPckRpZSgpID4gbV9uQ3VyU2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgbV9uT2Zmc2V0ID0gKHNpemVfdClvZmZzZXQsIG1fblNpemUgPSAoc2l6ZV90KXNpemU7Ci0gICAgICAgIG1fYlVzZVJhbmdlID0gVFJVRTsKKyAgICAgICAgbV9iVXNlUmFuZ2UgPSB0cnVlOwogICAgICAgICBtX25DdXJQb3MgPSBtX25PZmZzZXQ7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgdmlydHVhbCB2b2lkCQkJCUNsZWFyUmFuZ2UoKSAgb3ZlcnJpZGUKICAgICB7Ci0gICAgICAgIG1fYlVzZVJhbmdlID0gRkFMU0U7CisgICAgICAgIG1fYlVzZVJhbmdlID0gZmFsc2U7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSAgb3ZlcnJpZGUKKyAgICB2aXJ0dWFsIGJvb2wJCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgIG92ZXJyaWRlCiAgICAgewogICAgICAgICBpZiAoIWJ1ZmZlciB8fCAhc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgRlhfU0FGRV9GSUxFU0laRSBzYWZlT2Zmc2V0ID0gb2Zmc2V0OwpAQCAtMjI4LDcgKzIyOCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIXNhZmVPZmZzZXQuSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBvZmZzZXQgPSBzYWZlT2Zmc2V0LlZhbHVlT3JEaWUoKTsKQEAgLTIzNiwxMyArMjM2LDEzIEBACiAgICAgICAgIEZYX1NBRkVfU0laRV9UIG5ld1BvcyA9IHNpemU7CiAgICAgICAgIG5ld1BvcyArPSBvZmZzZXQ7CiAgICAgICAgIGlmICghbmV3UG9zLklzVmFsaWQoKSB8fCBuZXdQb3MuVmFsdWVPckRlZmF1bHQoMCkgPT0gMCB8fCBuZXdQb3MuVmFsdWVPckRpZSgpID4gbV9uQ3VyU2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgbV9uQ3VyUG9zID0gbmV3UG9zLlZhbHVlT3JEaWUoKTsKICAgICAgICAgaWYgKG1fZHdGbGFncyAmIEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSkgewogICAgICAgICAgICAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgKHVpbnQ4X3QqKW1fQmxvY2tzWzBdICsgKHNpemVfdClvZmZzZXQsIHNpemUpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBzaXplX3QgblN0YXJ0QmxvY2sgPSAoc2l6ZV90KW9mZnNldCAvIG1fbkdyb3dTaXplOwogICAgICAgICBvZmZzZXQgLT0gKEZYX0ZJTEVTSVpFKShuU3RhcnRCbG9jayAqIG1fbkdyb3dTaXplKTsKQEAgLTI1Nyw3ICsyNTcsNyBAQAogICAgICAgICAgICAgblN0YXJ0QmxvY2sgKys7CiAgICAgICAgICAgICBvZmZzZXQgPSAwOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgdmlydHVhbCBzaXplX3QJCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpICBvdmVycmlkZQogICAgIHsKQEAgLTI3NiwxMCArMjc2LDEwIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5SZWFkOwogICAgIH0KLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpICBvdmVycmlkZQorICAgIHZpcnR1YWwJYm9vbAkJCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgIG92ZXJyaWRlCiAgICAgewogICAgICAgICBpZiAoIWJ1ZmZlciB8fCAhc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX2JVc2VSYW5nZSkgewogICAgICAgICAgICAgb2Zmc2V0ICs9IChGWF9GSUxFU0laRSltX25PZmZzZXQ7CkBAIC0yODgsNyArMjg4LDcgQEAKICAgICAgICAgICAgIEZYX1NBRkVfU0laRV9UIG5ld1BvcyA9IHNpemU7CiAgICAgICAgICAgICBuZXdQb3MgKz0gb2Zmc2V0OwogICAgICAgICAgICAgaWYgKCFuZXdQb3MuSXNWYWxpZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgICAgIG1fbkN1clBvcyA9IG5ld1Bvcy5WYWx1ZU9yRGllKCk7CiAgICAgICAgICAgICBpZiAobV9uQ3VyUG9zID4gbV9uVG90YWxTaXplKSB7CkBAIC0zMDEsMjQgKzMwMSwyNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoIW1fQmxvY2tzWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tzLlJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBGWFNZU19tZW1jcHkoKHVpbnQ4X3QqKW1fQmxvY2tzWzBdICsgKHNpemVfdClvZmZzZXQsIGJ1ZmZlciwgc2l6ZSk7CiAgICAgICAgICAgICBpZiAobV9uQ3VyU2l6ZSA8IG1fbkN1clBvcykgewogICAgICAgICAgICAgICAgIG1fbkN1clNpemUgPSBtX25DdXJQb3M7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgRlhfU0FGRV9TSVpFX1QgbmV3UG9zID0gc2l6ZTsKICAgICAgICAgbmV3UG9zICs9IG9mZnNldDsKICAgICAgICAgaWYgKCFuZXdQb3MuSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIUV4cGFuZEJsb2NrcyhuZXdQb3MuVmFsdWVPckRpZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIG1fbkN1clBvcyA9IG5ld1Bvcy5WYWx1ZU9yRGllKCk7CiAgICAgICAgIHNpemVfdCBuU3RhcnRCbG9jayA9IChzaXplX3Qpb2Zmc2V0IC8gbV9uR3Jvd1NpemU7CkBAIC0zMzQsMTMgKzMzNCwxMyBAQAogICAgICAgICAgICAgblN0YXJ0QmxvY2sgKys7CiAgICAgICAgICAgICBvZmZzZXQgPSAwOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCUZsdXNoKCkgIG92ZXJyaWRlCisgICAgdmlydHVhbCBib29sCQkJCUZsdXNoKCkgIG92ZXJyaWRlCiAgICAgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJc0NvbnNlY3V0aXZlKCkgY29uc3QgIG92ZXJyaWRlCisgICAgdmlydHVhbCBib29sCQkJCUlzQ29uc2VjdXRpdmUoKSBjb25zdCAgb3ZlcnJpZGUKICAgICB7CiAgICAgICAgIHJldHVybiBtX2R3RmxhZ3MgJiBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmU7CiAgICAgfQpAQCAtMzYwLDcgKzM2MCw3IEBACiAgICAgewogICAgICAgICByZXR1cm4gbV9CbG9ja3MuR2V0U2l6ZSgpID8gKHVpbnQ4X3QqKW1fQmxvY2tzWzBdIDogTlVMTDsKICAgICB9Ci0gICAgdmlydHVhbCB2b2lkCQkJCUF0dGFjaEJ1ZmZlcih1aW50OF90KiBwQnVmZmVyLCBzaXplX3QgblNpemUsIEZYX0JPT0wgYlRha2VPdmVyID0gRkFMU0UpICBvdmVycmlkZQorICAgIHZpcnR1YWwgdm9pZAkJCQlBdHRhY2hCdWZmZXIodWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IG5TaXplLCBib29sIGJUYWtlT3ZlciA9IGZhbHNlKSAgb3ZlcnJpZGUKICAgICB7CiAgICAgICAgIGlmICghKG1fZHdGbGFncyAmIEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSkpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTM5MCwxNiArMzkwLDE2IEBACiAgICAgc2l6ZV90CQkJbV9uQ3VyUG9zOwogICAgIHNpemVfdAkJCW1fbkdyb3dTaXplOwogICAgIEZYX0RXT1JECQltX2R3RmxhZ3M7Ci0gICAgRlhfQk9PTAkJCW1fYlVzZVJhbmdlOworICAgIGJvb2wJCQltX2JVc2VSYW5nZTsKICAgICBzaXplX3QJCQltX25PZmZzZXQ7CiAgICAgc2l6ZV90CQkJbV9uU2l6ZTsKLSAgICBGWF9CT09MCUV4cGFuZEJsb2NrcyhzaXplX3Qgc2l6ZSkKKyAgICBib29sCUV4cGFuZEJsb2NrcyhzaXplX3Qgc2l6ZSkKICAgICB7CiAgICAgICAgIGlmIChtX25DdXJTaXplIDwgc2l6ZSkgewogICAgICAgICAgICAgbV9uQ3VyU2l6ZSA9IHNpemU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNpemUgPD0gbV9uVG90YWxTaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGludDMyX3QgaUNvdW50ID0gbV9CbG9ja3MuR2V0U2l6ZSgpOwogICAgICAgICBzaXplID0gKHNpemUgLSBtX25Ub3RhbFNpemUgKyBtX25Hcm93U2l6ZSAtIDEpIC8gbV9uR3Jvd1NpemU7CkBAIC00MDksNyArNDA5LDcgQEAKICAgICAgICAgICAgIG1fQmxvY2tzLlNldEF0KGlDb3VudCArKywgcEJsb2NrKTsKICAgICAgICAgICAgIG1fblRvdGFsU2l6ZSArPSBtX25Hcm93U2l6ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogfTsKICNpZmRlZiBfX2NwbHVzcGx1cwpAQCAtNDI0LDE1ICs0MjQsMTUgQEAKICAgICBfRlhfTVRSQU5ET01DT05URVhUKCkKICAgICB7CiAgICAgICAgIG10aSA9IE1UX04gKyAxOwotICAgICAgICBiSGF2ZVNlZWQgPSBGQUxTRTsKKyAgICAgICAgYkhhdmVTZWVkID0gZmFsc2U7CiAgICAgfQogICAgIEZYX0RXT1JEIG10aTsKLSAgICBGWF9CT09MCSBiSGF2ZVNlZWQ7CisgICAgYm9vbAkgYkhhdmVTZWVkOwogICAgIEZYX0RXT1JEIG10W01UX05dOwogfSBGWF9NVFJBTkRPTUNPTlRFWFQsICogRlhfTFBNVFJBTkRPTUNPTlRFWFQ7CiB0eXBlZGVmIEZYX01UUkFORE9NQ09OVEVYVCBjb25zdCAqIEZYX0xQQ01UUkFORE9NQ09OVEVYVDsKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi1GWF9CT09MIEZYX0dlbmVyYXRlQ3J5cHRvUmFuZG9tKEZYX0RXT1JEKiBwQnVmZmVyLCBpbnQzMl90IGlDb3VudCk7Citib29sIEZYX0dlbmVyYXRlQ3J5cHRvUmFuZG9tKEZYX0RXT1JEKiBwQnVmZmVyLCBpbnQzMl90IGlDb3VudCk7CiAjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2FyYWJpYy5jcHAKaW5kZXggM2NiMmZkMC4uNDk3YzFiYSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9hcmFiaWMuY3BwCkBAIC0xMyw3ICsxMyw3IEBACiAgICAgcmV0dXJuIG5ldyBDRlhfQmlkaUNoYXI7CiB9CiBDRlhfQmlkaUNoYXI6OkNGWF9CaWRpQ2hhcigpCi0gICAgOiBtX2JTZXBhcmF0ZU5ldXRyYWwoVFJVRSkKKyAgICA6IG1fYlNlcGFyYXRlTmV1dHJhbCh0cnVlKQogICAgICwgbV9pQ3VyU3RhcnQoMCkKICAgICAsIG1faUN1ckNvdW50KDApCiAgICAgLCBtX2lDdXJCaWRpKDApCkBAIC0yMiwxMiArMjIsMTIgQEAKICAgICAsIG1faUxhc3RDb3VudCgwKQogewogfQotdm9pZCBDRlhfQmlkaUNoYXI6OlNldFBvbGljeShGWF9CT09MIGJTZXBhcmF0ZU5ldXRyYWwpCit2b2lkIENGWF9CaWRpQ2hhcjo6U2V0UG9saWN5KGJvb2wgYlNlcGFyYXRlTmV1dHJhbCkKIHsKICAgICBtX2JTZXBhcmF0ZU5ldXRyYWwgPSBiU2VwYXJhdGVOZXV0cmFsOwogfQogCi1GWF9CT09MIENGWF9CaWRpQ2hhcjo6QXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpCitib29sIENGWF9CaWRpQ2hhcjo6QXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpCiB7CiAgICAgRlhfRFdPUkQgZHdQcm9wcyA9IGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXTsKICAgICBpbnQzMl90IGlCaWRpQ2xzID0gKGR3UHJvcHMgJiBGWF9CSURJQ0xBU1NCSVRTTUFTSykgPj4gRlhfQklESUNMQVNTQklUUzsKQEAgLTQzLDEwICs0MywxMCBAQAogICAgICAgICAgICAgaUNvbnRleHQgPSAyOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOworICAgIGJvb2wgYlJldCA9IGZhbHNlOwogICAgIGlmIChpQ29udGV4dCAhPSBtX2lDdXJCaWRpKSB7CiAgICAgICAgIGlmIChtX2JTZXBhcmF0ZU5ldXRyYWwpIHsKLSAgICAgICAgICAgIGJSZXQgPSBUUlVFOworICAgICAgICAgICAgYlJldCA9IHRydWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobV9pQ3VyQmlkaSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgYlJldCA9IChtX2lDdXJDb3VudCA+IDApOwpAQCAtNjcsNyArNjcsNyBAQAogICAgIG1faUN1ckNvdW50ICsrOwogICAgIHJldHVybiBiUmV0OwogfQotRlhfQk9PTCBDRlhfQmlkaUNoYXI6OkVuZENoYXIoKQorYm9vbCBDRlhfQmlkaUNoYXI6OkVuZENoYXIoKQogewogICAgIG1faUxhc3RCaWRpID0gbV9pQ3VyQmlkaTsKICAgICBtX2lMYXN0U3RhcnQgPSBtX2lDdXJTdGFydDsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2FyYWJpYy5oIGIvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmgKaW5kZXggZTRjMWRkYS4uMTBhMTZhZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmgKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmgKQEAgLTE1LDE0ICsxNSwxNCBAQAogICAgIENGWF9CaWRpQ2hhcigpOwogICAgIH5DRlhfQmlkaUNoYXIoKSBvdmVycmlkZSB7fQogCi0gICAgdm9pZCBTZXRQb2xpY3koRlhfQk9PTCBiU2VwYXJhdGVOZXV0cmFsID0gVFJVRSkgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCBBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCBFbmRDaGFyKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBTZXRQb2xpY3koYm9vbCBiU2VwYXJhdGVOZXV0cmFsID0gdHJ1ZSkgb3ZlcnJpZGU7CisgICAgYm9vbCBBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkgb3ZlcnJpZGU7CisgICAgYm9vbCBFbmRDaGFyKCkgb3ZlcnJpZGU7CiAgICAgaW50MzJfdCBHZXRCaWRpSW5mbyhpbnQzMl90ICZpU3RhcnQsIGludDMyX3QgJmlDb3VudCkgb3ZlcnJpZGU7CiAgICAgdm9pZCBSZXNldCgpIG92ZXJyaWRlOwogCiBwcml2YXRlOgotICAgIEZYX0JPT0wJbV9iU2VwYXJhdGVOZXV0cmFsOworICAgIGJvb2wJbV9iU2VwYXJhdGVOZXV0cmFsOwogICAgIGludDMyX3QJbV9pQ3VyU3RhcnQ7CiAgICAgaW50MzJfdAltX2lDdXJDb3VudDsKICAgICBpbnQzMl90CW1faUN1ckJpZGk7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19hcnJheS5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19hcnJheS5jcHAKaW5kZXggNGFiMzRiYi4uZjEzOTM2NSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYXJyYXkuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2FycmF5LmNwcApAQCAtMjIsNyArMjIsNyBAQAogewogICAgIEZYX0ZyZWUobV9wRGF0YSk7CiB9Ci1GWF9CT09MIENGWF9CYXNpY0FycmF5OjpTZXRTaXplKGludCBuTmV3U2l6ZSkKK2Jvb2wgQ0ZYX0Jhc2ljQXJyYXk6OlNldFNpemUoaW50IG5OZXdTaXplKQogewogICAgIGlmIChuTmV3U2l6ZSA8PSAwKSB7CiAgICAgICAgIEZYX0ZyZWUobV9wRGF0YSk7CkBAIC0zNiw3ICszNiw3IEBACiAgICAgICAgIHRvdGFsU2l6ZSAqPSBtX25Vbml0U2l6ZTsKICAgICAgICAgaWYgKCF0b3RhbFNpemUuSXNWYWxpZCgpKSB7CiAgICAgICAgICAgICBtX25TaXplID0gbV9uTWF4U2l6ZSA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbV9wRGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIHRvdGFsU2l6ZS5WYWx1ZU9yRGllKCkpOwogICAgICAgICBtX25TaXplID0gbV9uTWF4U2l6ZSA9IG5OZXdTaXplOwpAQCAtNTAsMzggKzUwLDM4IEBACiAgICAgICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50PiB0b3RhbFNpemUgPSBuTmV3TWF4OwogICAgICAgICB0b3RhbFNpemUgKj0gbV9uVW5pdFNpemU7CiAgICAgICAgIGlmICghdG90YWxTaXplLklzVmFsaWQoKSB8fCBuTmV3TWF4IDwgbV9uU2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHVpbnQ4X3QqIHBOZXdEYXRhID0gRlhfUmVhbGxvYyh1aW50OF90LCBtX3BEYXRhLCB0b3RhbFNpemUuVmFsdWVPckRpZSgpKTsKICAgICAgICAgaWYgKHBOZXdEYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBGWFNZU19tZW1zZXQocE5ld0RhdGEgKyBtX25TaXplICogbV9uVW5pdFNpemUsIDAsIChuTmV3TWF4IC0gbV9uU2l6ZSkgKiBtX25Vbml0U2l6ZSk7CiAgICAgICAgIG1fcERhdGEgPSBwTmV3RGF0YTsKICAgICAgICAgbV9uU2l6ZSA9IG5OZXdTaXplOwogICAgICAgICBtX25NYXhTaXplID0gbk5ld01heDsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9CYXNpY0FycmF5OjpBcHBlbmQoY29uc3QgQ0ZYX0Jhc2ljQXJyYXkmIHNyYykKK2Jvb2wgQ0ZYX0Jhc2ljQXJyYXk6OkFwcGVuZChjb25zdCBDRlhfQmFzaWNBcnJheSYgc3JjKQogewogICAgIGludCBuT2xkU2l6ZSA9IG1fblNpemU7CiAgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IG5ld1NpemUgPSBtX25TaXplOwogICAgIG5ld1NpemUgKz0gc3JjLm1fblNpemU7CiAgICAgaWYgKG1fblVuaXRTaXplICE9IHNyYy5tX25Vbml0U2l6ZSB8fCAhbmV3U2l6ZS5Jc1ZhbGlkKCkgfHwgIVNldFNpemUobmV3U2l6ZS5WYWx1ZU9yRGllKCkpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIEZYU1lTX21lbWNweShtX3BEYXRhICsgbk9sZFNpemUgKiBtX25Vbml0U2l6ZSwgc3JjLm1fcERhdGEsIHNyYy5tX25TaXplICogbV9uVW5pdFNpemUpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfQmFzaWNBcnJheTo6Q29weShjb25zdCBDRlhfQmFzaWNBcnJheSYgc3JjKQorYm9vbCBDRlhfQmFzaWNBcnJheTo6Q29weShjb25zdCBDRlhfQmFzaWNBcnJheSYgc3JjKQogewogICAgIGlmICghU2V0U2l6ZShzcmMubV9uU2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYU1lTX21lbWNweShtX3BEYXRhLCBzcmMubV9wRGF0YSwgc3JjLm1fblNpemUgKiBtX25Vbml0U2l6ZSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB1aW50OF90KiBDRlhfQmFzaWNBcnJheTo6SW5zZXJ0U3BhY2VBdChpbnQgbkluZGV4LCBpbnQgbkNvdW50KQogewpAQCAtMTAzLDMxICsxMDMsMzEgQEAKICAgICB9CiAgICAgcmV0dXJuIG1fcERhdGEgKyBuSW5kZXggKiBtX25Vbml0U2l6ZTsKIH0KLUZYX0JPT0wgQ0ZYX0Jhc2ljQXJyYXk6OlJlbW92ZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpCitib29sIENGWF9CYXNpY0FycmF5OjpSZW1vdmVBdChpbnQgbkluZGV4LCBpbnQgbkNvdW50KQogewogICAgIGlmIChuSW5kZXggPCAwIHx8IG5Db3VudCA8PSAwIHx8IG1fblNpemUgPCBuSW5kZXggKyBuQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGludCBuTW92ZUNvdW50ID0gbV9uU2l6ZSAtIChuSW5kZXggKyBuQ291bnQpOwogICAgIGlmIChuTW92ZUNvdW50KSB7CiAgICAgICAgIEZYU1lTX21lbW1vdmUobV9wRGF0YSArIG5JbmRleCAqIG1fblVuaXRTaXplLCBtX3BEYXRhICsgKG5JbmRleCArIG5Db3VudCkgKiBtX25Vbml0U2l6ZSwgbk1vdmVDb3VudCAqIG1fblVuaXRTaXplKTsKICAgICB9CiAgICAgbV9uU2l6ZSAtPSBuQ291bnQ7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9CYXNpY0FycmF5OjpJbnNlcnRBdChpbnQgblN0YXJ0SW5kZXgsIGNvbnN0IENGWF9CYXNpY0FycmF5KiBwTmV3QXJyYXkpCitib29sIENGWF9CYXNpY0FycmF5OjpJbnNlcnRBdChpbnQgblN0YXJ0SW5kZXgsIGNvbnN0IENGWF9CYXNpY0FycmF5KiBwTmV3QXJyYXkpCiB7CiAgICAgaWYgKHBOZXdBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAocE5ld0FycmF5LT5tX25TaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoIUluc2VydFNwYWNlQXQoblN0YXJ0SW5kZXgsIHBOZXdBcnJheS0+bV9uU2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYU1lTX21lbWNweShtX3BEYXRhICsgblN0YXJ0SW5kZXggKiBtX25Vbml0U2l6ZSwgcE5ld0FycmF5LT5tX3BEYXRhLCBwTmV3QXJyYXktPm1fblNpemUgKiBtX25Vbml0U2l6ZSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBjb25zdCB2b2lkKiBDRlhfQmFzaWNBcnJheTo6R2V0RGF0YVB0cihpbnQgaW5kZXgpIGNvbnN0CiB7CkBAIC0yNjAsNyArMjYwLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIHBTcG90OwogfQotdm9pZCogQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheTo6SXRlcmF0ZVNlZ21lbnQoY29uc3QgdWludDhfdCogcFNlZ21lbnQsIGludCBjb3VudCwgRlhfQk9PTCAoKmNhbGxiYWNrKSh2b2lkKiBwYXJhbSwgdm9pZCogcERhdGEpLCB2b2lkKiBwYXJhbSkgY29uc3QKK3ZvaWQqIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6Okl0ZXJhdGVTZWdtZW50KGNvbnN0IHVpbnQ4X3QqIHBTZWdtZW50LCBpbnQgY291bnQsIGJvb2wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0CiB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewogICAgICAgICBpZiAoIWNhbGxiYWNrKHBhcmFtLCAodm9pZCopKHBTZWdtZW50ICsgaSAqIG1fVW5pdFNpemUpKSkgewpAQCAtMjY5LDcgKzI2OSw3IEBACiAgICAgfQogICAgIHJldHVybiBOVUxMOwogfQotdm9pZCogQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheTo6SXRlcmF0ZUluZGV4KGludCBsZXZlbCwgaW50JiBzdGFydCwgdm9pZCoqIHBJbmRleCwgRlhfQk9PTCAoKmNhbGxiYWNrKSh2b2lkKiBwYXJhbSwgdm9pZCogcERhdGEpLCB2b2lkKiBwYXJhbSkgY29uc3QKK3ZvaWQqIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6Okl0ZXJhdGVJbmRleChpbnQgbGV2ZWwsIGludCYgc3RhcnQsIHZvaWQqKiBwSW5kZXgsIGJvb2wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0CiB7CiAgICAgaWYgKGxldmVsID09IDApIHsKICAgICAgICAgaW50IGNvdW50ID0gbV9EYXRhU2l6ZSAtIHN0YXJ0OwpAQCAtMjkwLDcgKzI5MCw3IEBACiAgICAgfQogICAgIHJldHVybiBOVUxMOwogfQotdm9pZCogQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheTo6SXRlcmF0ZShGWF9CT09MICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksIHZvaWQqIHBhcmFtKSBjb25zdAordm9pZCogQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheTo6SXRlcmF0ZShib29sICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksIHZvaWQqIHBhcmFtKSBjb25zdAogewogICAgIGlmIChtX3BJbmRleCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYnN0cmluZy5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19ic3RyaW5nLmNwcAppbmRleCA1ZWViMzNiLi40N2MxYzViIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19ic3RyaW5nLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19ic3RyaW5nLmNwcApAQCAtMTA4Niw5ICsxMDg2LDkgQEAKICAgICBpZiAoZCA9PSAwLjBmKSB7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KLSAgICBGWF9CT09MIGJOZWdhdGl2ZSA9IEZBTFNFOworICAgIGJvb2wgYk5lZ2F0aXZlID0gZmFsc2U7CiAgICAgaWYgKGQgPCAwKSB7Ci0gICAgICAgIGJOZWdhdGl2ZSA9IFRSVUU7CisgICAgICAgIGJOZWdhdGl2ZSA9IHRydWU7CiAgICAgICAgIGQgPSAtZDsKICAgICB9CiAgICAgaW50IHNjYWxlID0gMTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2J1ZmZlci5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19idWZmZXIuY3BwCmluZGV4IDlmYzQwMGUuLmQ3YzFhMWEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2J1ZmZlci5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYnVmZmVyLmNwcApAQCAtMzIxLDcgKzMyMSw3IEBACiAgICAgbV9Mb2FkaW5nUG9zID0gMDsKICAgICBtX0xvYWRpbmdTaXplID0gZHdTaXplOwogfQotRlhfQk9PTCBDRlhfQXJjaGl2ZUxvYWRlcjo6SXNFT0YoKQorYm9vbCBDRlhfQXJjaGl2ZUxvYWRlcjo6SXNFT0YoKQogewogICAgIHJldHVybiBtX0xvYWRpbmdQb3MgPj0gbV9Mb2FkaW5nU2l6ZTsKIH0KQEAgLTM3MiwxNCArMzcyLDE0IEBACiAgICAgc3RyID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKChjb25zdCB1bnNpZ25lZCBzaG9ydCopZW5jb2RlZC5jX3N0cigpLCBlbmNvZGVkLkdldExlbmd0aCgpKTsKICAgICByZXR1cm4gKnRoaXM7CiB9Ci1GWF9CT09MIENGWF9BcmNoaXZlTG9hZGVyOjpSZWFkKHZvaWQqIHBCdWYsIEZYX0RXT1JEIGR3U2l6ZSkKK2Jvb2wgQ0ZYX0FyY2hpdmVMb2FkZXI6OlJlYWQodm9pZCogcEJ1ZiwgRlhfRFdPUkQgZHdTaXplKQogewogICAgIGlmIChtX0xvYWRpbmdQb3MgKyBkd1NpemUgPiBtX0xvYWRpbmdTaXplKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWFNZU19tZW1jcHkocEJ1ZiwgbV9wTG9hZGluZ0J1ZiArIG1fTG9hZGluZ1BvcywgZHdTaXplKTsKICAgICBtX0xvYWRpbmdQb3MgKz0gZHdTaXplOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDRlhfQml0U3RyZWFtOjpJbml0KGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpCiB7CkBAIC00NDEsOSArNDQxLDkgQEAKICAgICAgICAgbV9wQnVmZmVyID0gTlVMTDsKICAgICB9CiB9Ci1GWF9CT09MIElGWF9CdWZmZXJBcmNoaXZlOjpGbHVzaCgpCitib29sIElGWF9CdWZmZXJBcmNoaXZlOjpGbHVzaCgpCiB7Ci0gICAgRlhfQk9PTCBiUmV0ID0gRG9Xb3JrKG1fcEJ1ZmZlciwgbV9MZW5ndGgpOworICAgIGJvb2wgYlJldCA9IERvV29yayhtX3BCdWZmZXIsIG1fTGVuZ3RoKTsKICAgICBtX0xlbmd0aCA9IDA7CiAgICAgcmV0dXJuIGJSZXQ7CiB9CkBAIC00ODgsNyArNDg4LDcgQEAKIENGWF9GaWxlQnVmZmVyQXJjaGl2ZTo6Q0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKEZYX1NUUlNJWkUgc2l6ZSkKICAgICA6IElGWF9CdWZmZXJBcmNoaXZlKHNpemUpCiAgICAgLCBtX3BGaWxlKE5VTEwpCi0gICAgLCBtX2JUYWtlb3ZlcihGQUxTRSkKKyAgICAsIG1fYlRha2VvdmVyKGZhbHNlKQogewogfQogQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjp+Q0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKCkKQEAgLTUwMSw1OCArNTAxLDU4IEBACiAgICAgICAgIG1fcEZpbGUtPlJlbGVhc2UoKTsKICAgICB9CiAgICAgbV9wRmlsZSA9IE5VTEw7Ci0gICAgbV9iVGFrZW92ZXIgPSBGQUxTRTsKKyAgICBtX2JUYWtlb3ZlciA9IGZhbHNlOwogICAgIElGWF9CdWZmZXJBcmNoaXZlOjpDbGVhcigpOwogfQotRlhfQk9PTCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkF0dGFjaEZpbGUoSUZYX1N0cmVhbVdyaXRlICpwRmlsZSwgRlhfQk9PTCBiVGFrZW92ZXIgKQorYm9vbCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkF0dGFjaEZpbGUoSUZYX1N0cmVhbVdyaXRlICpwRmlsZSwgYm9vbCBiVGFrZW92ZXIgKQogewogICAgIGlmICghcEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX3BGaWxlICYmIG1fYlRha2VvdmVyKSB7CiAgICAgICAgIG1fcEZpbGUtPlJlbGVhc2UoKTsKICAgICB9CiAgICAgbV9wRmlsZSA9IHBGaWxlOwogICAgIG1fYlRha2VvdmVyID0gYlRha2VvdmVyOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkF0dGFjaEZpbGUoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lKQorYm9vbCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkF0dGFjaEZpbGUoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lKQogewogICAgIGlmICghZmlsZW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX3BGaWxlICYmIG1fYlRha2VvdmVyKSB7CiAgICAgICAgIG1fcEZpbGUtPlJlbGVhc2UoKTsKICAgICB9CiAgICAgbV9wRmlsZSA9IEZYX0NyZWF0ZUZpbGVXcml0ZShmaWxlbmFtZSk7CiAgICAgaWYgKCFtX3BGaWxlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBtX2JUYWtlb3ZlciA9IFRSVUU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgbV9iVGFrZW92ZXIgPSB0cnVlOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkF0dGFjaEZpbGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUpCitib29sIENGWF9GaWxlQnVmZmVyQXJjaGl2ZTo6QXR0YWNoRmlsZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSkKIHsKICAgICBpZiAoIWZpbGVuYW1lKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9wRmlsZSAmJiBtX2JUYWtlb3ZlcikgewogICAgICAgICBtX3BGaWxlLT5SZWxlYXNlKCk7CiAgICAgfQogICAgIG1fcEZpbGUgPSBGWF9DcmVhdGVGaWxlV3JpdGUoZmlsZW5hbWUpOwogICAgIGlmICghbV9wRmlsZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgbV9iVGFrZW92ZXIgPSBUUlVFOwotICAgIHJldHVybiBUUlVFOworICAgIG1fYlRha2VvdmVyID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpEb1dvcmsoY29uc3Qgdm9pZCogcEJ1Ziwgc2l6ZV90IHNpemUpCitib29sIENGWF9GaWxlQnVmZmVyQXJjaGl2ZTo6RG9Xb3JrKGNvbnN0IHZvaWQqIHBCdWYsIHNpemVfdCBzaXplKQogewogICAgIGlmICghbV9wRmlsZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCFwQnVmIHx8IHNpemUgPCAxKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIG1fcEZpbGUtPldyaXRlQmxvY2socEJ1Ziwgc2l6ZSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19jb29yZHMuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfY29vcmRzLmNwcAppbmRleCAyZTgzMDgwLi4yMmI5YmQ0IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19jb29yZHMuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2Nvb3Jkcy5jcHAKQEAgLTQ1LDE1ICs0NSwxNSBAQAogICAgIGJvdHRvbSA9IGJvdHRvbSA+IG90aGVyLmJvdHRvbSA/IGJvdHRvbSA6IG90aGVyLmJvdHRvbTsKICAgICB0b3AgPSB0b3AgPCBvdGhlci50b3AgPyB0b3AgOiBvdGhlci50b3A7CiB9Ci1GWF9CT09MIEdldEludGVyc2VjdGlvbihGWF9GTE9BVCBsb3cxLCBGWF9GTE9BVCBoaWdoMSwgRlhfRkxPQVQgbG93MiwgRlhfRkxPQVQgaGlnaDIsCitib29sIEdldEludGVyc2VjdGlvbihGWF9GTE9BVCBsb3cxLCBGWF9GTE9BVCBoaWdoMSwgRlhfRkxPQVQgbG93MiwgRlhfRkxPQVQgaGlnaDIsCiAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgaW50ZXJsb3csIEZYX0ZMT0FUJiBpbnRlcmhpZ2gpCiB7CiAgICAgaWYgKGxvdzEgPj0gaGlnaDIgfHwgbG93MiA+PSBoaWdoMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50ZXJsb3cgPSBsb3cxID4gbG93MiA/IGxvdzEgOiBsb3cyOwogICAgIGludGVyaGlnaCA9IGhpZ2gxID4gaGlnaDIgPyBoaWdoMiA6IGhpZ2gxOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogZXh0ZXJuICJDIiBpbnQgRlhTWVNfcm91bmQoRlhfRkxPQVQgZCkKIHsKQEAgLTE5OCwxOCArMTk4LDE4IEBACiAgICAgcmVjdC5Ob3JtYWxpemUoKTsKICAgICByZXR1cm4gcmVjdDsKIH0KLUZYX0JPT0wgQ0ZYX0Zsb2F0UmVjdDo6Q29udGFpbnMoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCkgY29uc3QKK2Jvb2wgQ0ZYX0Zsb2F0UmVjdDo6Q29udGFpbnMoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCkgY29uc3QKIHsKICAgICBDRlhfRmxvYXRSZWN0IG4xID0gKnRoaXM7CiAgICAgbjEuTm9ybWFsaXplKCk7CiAgICAgQ0ZYX0Zsb2F0UmVjdCBuMiA9IG90aGVyX3JlY3Q7CiAgICAgbjIuTm9ybWFsaXplKCk7CiAgICAgaWYgKG4yLmxlZnQgPj0gbjEubGVmdCAmJiBuMi5yaWdodCA8PSBuMS5yaWdodCAmJiBuMi5ib3R0b20gPj0gbjEuYm90dG9tICYmIG4yLnRvcCA8PSBuMS50b3ApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDRlhfRmxvYXRSZWN0OjpDb250YWlucyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSBjb25zdAorYm9vbCBDRlhfRmxvYXRSZWN0OjpDb250YWlucyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSBjb25zdAogewogICAgIENGWF9GbG9hdFJlY3QgbjEgPSAqdGhpczsKICAgICBuMS5Ob3JtYWxpemUoKTsKQEAgLTI5OSwxMyArMjk5LDEzIEBACiAgICAgRlhfRkxPQVQgZmYgPSBtMS5lICogbTIuYiArIG0xLmYgKiBtMi5kICsgbTIuZjsKICAgICBtLmEgPSBhYSwgbS5iID0gYmIsIG0uYyA9IGNjLCBtLmQgPSBkZCwgbS5lID0gZWUsIG0uZiA9IGZmOwogfQotdm9pZCBDRlhfTWF0cml4OjpDb25jYXQoRlhfRkxPQVQgYSwgRlhfRkxPQVQgYiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgZCwgRlhfRkxPQVQgZSwgRlhfRkxPQVQgZiwgRlhfQk9PTCBiUHJlcGVuZGVkKQordm9pZCBDRlhfTWF0cml4OjpDb25jYXQoRlhfRkxPQVQgYSwgRlhfRkxPQVQgYiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgZCwgRlhfRkxPQVQgZSwgRlhfRkxPQVQgZiwgYm9vbCBiUHJlcGVuZGVkKQogewogICAgIENGWF9NYXRyaXggbTsKICAgICBtLlNldChhLCBiLCBjLCBkLCBlLCBmKTsKICAgICBDb25jYXQobSwgYlByZXBlbmRlZCk7CiB9Ci12b2lkIENGWF9NYXRyaXg6OkNvbmNhdChjb25zdCBDRlhfTWF0cml4ICZtLCBGWF9CT09MIGJQcmVwZW5kZWQpCit2b2lkIENGWF9NYXRyaXg6OkNvbmNhdChjb25zdCBDRlhfTWF0cml4ICZtLCBib29sIGJQcmVwZW5kZWQpCiB7CiAgICAgaWYgKGJQcmVwZW5kZWQpIHsKICAgICAgICAgRlhDUlRfTWF0cml4X0NvbmNhdCgqdGhpcywgbSwgKnRoaXMpOwpAQCAtMzEzLDI1ICszMTMsMjUgQEAKICAgICAgICAgRlhDUlRfTWF0cml4X0NvbmNhdCgqdGhpcywgKnRoaXMsIG0pOwogICAgIH0KIH0KLXZvaWQgQ0ZYX01hdHJpeDo6Q29uY2F0SW52ZXJzZShjb25zdCBDRlhfTWF0cml4JiBzcmMsIEZYX0JPT0wgYlByZXBlbmRlZCkKK3ZvaWQgQ0ZYX01hdHJpeDo6Q29uY2F0SW52ZXJzZShjb25zdCBDRlhfTWF0cml4JiBzcmMsIGJvb2wgYlByZXBlbmRlZCkKIHsKICAgICBDRlhfTWF0cml4IG07CiAgICAgbS5TZXRSZXZlcnNlKHNyYyk7CiAgICAgQ29uY2F0KG0sIGJQcmVwZW5kZWQpOwogfQotRlhfQk9PTCBDRlhfTWF0cml4OjpJc0ludmVydGlibGUoKSBjb25zdAorYm9vbCBDRlhfTWF0cml4OjpJc0ludmVydGlibGUoKSBjb25zdAogewogICAgIHJldHVybiBGWFNZU19mYWJzKGEgKiBkIC0gYiAqIGMpID49IDAuMDAwMWY7CiB9Ci1GWF9CT09MIENGWF9NYXRyaXg6OklzOTBSb3RhdGVkKCkgY29uc3QKK2Jvb2wgQ0ZYX01hdHJpeDo6SXM5MFJvdGF0ZWQoKSBjb25zdAogewogICAgIHJldHVybiBGWFNZU19mYWJzKGEgKiAxMDAwKSA8IEZYU1lTX2ZhYnMoYikgJiYgRlhTWVNfZmFicyhkICogMTAwMCkgPCBGWFNZU19mYWJzKGMpOwogfQotRlhfQk9PTCBDRlhfTWF0cml4OjpJc1NjYWxlZCgpIGNvbnN0Citib29sIENGWF9NYXRyaXg6OklzU2NhbGVkKCkgY29uc3QKIHsKICAgICByZXR1cm4gRlhTWVNfZmFicyhiICogMTAwMCkgPCBGWFNZU19mYWJzKGEpICYmIEZYU1lTX2ZhYnMoYyAqIDEwMDApIDwgRlhTWVNfZmFicyhkKTsKIH0KLXZvaWQgQ0ZYX01hdHJpeDo6VHJhbnNsYXRlKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIEZYX0JPT0wgYlByZXBlbmRlZCkKK3ZvaWQgQ0ZYX01hdHJpeDo6VHJhbnNsYXRlKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIGJvb2wgYlByZXBlbmRlZCkKIHsKICAgICBpZiAoYlByZXBlbmRlZCkgewogICAgICAgICBlICs9IHggKiBhICsgeSAqIGM7CkBAIC0zNDAsNyArMzQwLDcgQEAKICAgICAgICAgZSArPSB4LCBmICs9IHk7CiAgICAgfQogfQotdm9pZCBDRlhfTWF0cml4OjpTY2FsZShGWF9GTE9BVCBzeCwgRlhfRkxPQVQgc3ksIEZYX0JPT0wgYlByZXBlbmRlZCkKK3ZvaWQgQ0ZYX01hdHJpeDo6U2NhbGUoRlhfRkxPQVQgc3gsIEZYX0ZMT0FUIHN5LCBib29sIGJQcmVwZW5kZWQpCiB7CiAgICAgYSAqPSBzeCwgZCAqPSBzeTsKICAgICBpZiAoYlByZXBlbmRlZCkgewpAQCAtMzUzLDcgKzM1Myw3IEBACiAgICAgICAgIGYgKj0gc3k7CiAgICAgfQogfQotdm9pZCBDRlhfTWF0cml4OjpSb3RhdGUoRlhfRkxPQVQgZlJhZGlhbiwgRlhfQk9PTCBiUHJlcGVuZGVkKQordm9pZCBDRlhfTWF0cml4OjpSb3RhdGUoRlhfRkxPQVQgZlJhZGlhbiwgYm9vbCBiUHJlcGVuZGVkKQogewogICAgIEZYX0ZMT0FUIGNvc1ZhbHVlID0gRlhTWVNfY29zKGZSYWRpYW4pOwogICAgIEZYX0ZMT0FUIHNpblZhbHVlID0gRlhTWVNfc2luKGZSYWRpYW4pOwpAQCAtMzY1LDEzICszNjUsMTMgQEAKICAgICAgICAgRlhDUlRfTWF0cml4X0NvbmNhdCgqdGhpcywgKnRoaXMsIG0pOwogICAgIH0KIH0KLXZvaWQgQ0ZYX01hdHJpeDo6Um90YXRlQXQoRlhfRkxPQVQgZlJhZGlhbiwgRlhfRkxPQVQgZHgsIEZYX0ZMT0FUIGR5LCBGWF9CT09MIGJQcmVwZW5kZWQpCit2b2lkIENGWF9NYXRyaXg6OlJvdGF0ZUF0KEZYX0ZMT0FUIGZSYWRpYW4sIEZYX0ZMT0FUIGR4LCBGWF9GTE9BVCBkeSwgYm9vbCBiUHJlcGVuZGVkKQogewogICAgIFRyYW5zbGF0ZShkeCwgZHksIGJQcmVwZW5kZWQpOwogICAgIFJvdGF0ZShmUmFkaWFuLCBiUHJlcGVuZGVkKTsKICAgICBUcmFuc2xhdGUoLWR4LCAtZHksIGJQcmVwZW5kZWQpOwogfQotdm9pZCBDRlhfTWF0cml4OjpTaGVhcihGWF9GTE9BVCBmQWxwaGFSYWRpYW4sIEZYX0ZMT0FUIGZCZXRhUmFkaWFuLCBGWF9CT09MIGJQcmVwZW5kZWQpCit2b2lkIENGWF9NYXRyaXg6OlNoZWFyKEZYX0ZMT0FUIGZBbHBoYVJhZGlhbiwgRlhfRkxPQVQgZkJldGFSYWRpYW4sIGJvb2wgYlByZXBlbmRlZCkKIHsKICAgICBDRlhfTWF0cml4IG07CiAgICAgbS5TZXQoMSwgRlhTWVNfdGFuKGZBbHBoYVJhZGlhbiksIEZYU1lTX3RhbihmQmV0YVJhZGlhbiksIDEsIDAsIDApOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfZ2NjLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2djYy5jcHAKaW5kZXggMjQ5N2M3NC4uNTYyZjc0MSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfZ2NjLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19nY2MuY3BwCkBAIC0xMiwxMiArMTIsMTIgQEAKIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBTVFJfVD4KIFQgRlhTWVNfU3RyVG9JbnQoU1RSX1Qgc3RyKQogewotICAgIEZYX0JPT0wgbmVnID0gRkFMU0U7CisgICAgYm9vbCBuZWcgPSBmYWxzZTsKICAgICBpZiAoc3RyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGlmICgqc3RyID09ICctJykgewotICAgICAgICBuZWcgPSBUUlVFOworICAgICAgICBuZWcgPSB0cnVlOwogICAgICAgICBzdHIgKys7CiAgICAgfQogICAgIFQgbnVtID0gMDsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX21hcHMuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfbWFwcy5jcHAKaW5kZXggZTM0YWNiMC4uN2RlN2I2MSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfbWFwcy5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfbWFwcy5jcHAKQEAgLTY5LDE1ICs2OSwxNSBAQAogICAgIHJLZXkgPSBwQXNzb2NSZXQtPmtleTsKICAgICByVmFsdWUgPSBwQXNzb2NSZXQtPnZhbHVlOwogfQotRlhfQk9PTCBDRlhfTWFwUHRyVG9QdHI6Okxvb2t1cCh2b2lkKiBrZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0Citib29sIENGWF9NYXBQdHJUb1B0cjo6TG9va3VwKHZvaWQqIGtleSwgdm9pZComIHJWYWx1ZSkgY29uc3QKIHsKICAgICBGWF9EV09SRCBuSGFzaDsKICAgICBDQXNzb2MqIHBBc3NvYyA9IEdldEFzc29jQXQoa2V5LCBuSGFzaCk7CiAgICAgaWYgKHBBc3NvYyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByVmFsdWUgPSBwQXNzb2MtPnZhbHVlOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCogQ0ZYX01hcFB0clRvUHRyOjpHZXRWYWx1ZUF0KHZvaWQqIGtleSkgY29uc3QKIHsKQEAgLTE0MCw3ICsxNDAsNyBAQAogICAgIHJldHVybiBwQXNzb2M7CiB9CiB2b2lkIENGWF9NYXBQdHJUb1B0cjo6SW5pdEhhc2hUYWJsZSgKLSAgICBGWF9EV09SRCBuSGFzaFNpemUsIEZYX0JPT0wgYkFsbG9jTm93KQorICAgIEZYX0RXT1JEIG5IYXNoU2l6ZSwgYm9vbCBiQWxsb2NOb3cpCiB7CiAgICAgQVNTRVJUKG1fbkNvdW50ID09IDApOwogICAgIEFTU0VSVChuSGFzaFNpemUgPiAwKTsKQEAgLTE1MywxMCArMTUzLDEwIEBACiAgICAgfQogICAgIG1fbkhhc2hUYWJsZVNpemUgPSBuSGFzaFNpemU7CiB9Ci1GWF9CT09MIENGWF9NYXBQdHJUb1B0cjo6UmVtb3ZlS2V5KHZvaWQqIGtleSkKK2Jvb2wgQ0ZYX01hcFB0clRvUHRyOjpSZW1vdmVLZXkodm9pZCoga2V5KQogewogICAgIGlmIChtX3BIYXNoVGFibGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0Fzc29jKiogcHBBc3NvY1ByZXY7CiAgICAgcHBBc3NvY1ByZXYgPSAmbV9wSGFzaFRhYmxlW0hhc2hLZXkoa2V5KSAlIG1fbkhhc2hUYWJsZVNpemVdOwpAQCAtMTY1LDExICsxNjUsMTEgQEAKICAgICAgICAgaWYgKHBBc3NvYy0+a2V5ID09IGtleSkgewogICAgICAgICAgICAgKnBwQXNzb2NQcmV2ID0gcEFzc29jLT5wTmV4dDsKICAgICAgICAgICAgIEZyZWVBc3NvYyhwQXNzb2MpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBwcEFzc29jUHJldiA9ICZwQXNzb2MtPnBOZXh0OwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogdm9pZCBDRlhfTWFwUHRyVG9QdHI6OkZyZWVBc3NvYyhDRlhfTWFwUHRyVG9QdHI6OkNBc3NvYyogcEFzc29jKQogewpAQCAtMzI1LDE4ICszMjUsMTggQEAKICAgICB9CiAgICAgcmV0dXJuIE5VTEw7CiB9Ci1GWF9CT09MIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6Okxvb2t1cChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgdm9pZComIHJWYWx1ZSkgY29uc3QKK2Jvb2wgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6TG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdAogewogICAgIEZYX0RXT1JEIG5IYXNoOwogICAgIENBc3NvYyogcEFzc29jID0gR2V0QXNzb2NBdChrZXksIG5IYXNoKTsKICAgICBpZiAocEFzc29jID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJWYWx1ZSA9IHBBc3NvYy0+dmFsdWU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OkluaXRIYXNoVGFibGUoCi0gICAgRlhfRFdPUkQgbkhhc2hTaXplLCBGWF9CT09MIGJBbGxvY05vdykKKyAgICBGWF9EV09SRCBuSGFzaFNpemUsIGJvb2wgYkFsbG9jTm93KQogewogICAgIEFTU0VSVChtX25Db3VudCA9PSAwKTsKICAgICBBU1NFUlQobkhhc2hTaXplID4gMCk7CkBAIC0zNTksMTAgKzM1OSwxMCBAQAogICAgIH0KICAgICByZXR1cm4gbkhhc2g7CiB9Ci1GWF9CT09MIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OlJlbW92ZUtleShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkKK2Jvb2wgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6UmVtb3ZlS2V5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KQogewogICAgIGlmIChtX3BIYXNoVGFibGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0Fzc29jKiogcHBBc3NvY1ByZXY7CiAgICAgcHBBc3NvY1ByZXYgPSAmbV9wSGFzaFRhYmxlW0hhc2hLZXkoa2V5KSAlIG1fbkhhc2hUYWJsZVNpemVdOwpAQCAtMzcxLDExICszNzEsMTEgQEAKICAgICAgICAgaWYgKHBBc3NvYy0+a2V5ID09IGtleSkgewogICAgICAgICAgICAgKnBwQXNzb2NQcmV2ID0gcEFzc29jLT5wTmV4dDsKICAgICAgICAgICAgIEZyZWVBc3NvYyhwQXNzb2MpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBwcEFzc29jUHJldiA9ICZwQXNzb2MtPnBOZXh0OwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogc3RydWN0IF9Db21wYWN0U3RyaW5nIHsKICAgICB1aW50OF90CQltX0NvbXBhY3RMZW47CkBAIC0zOTAsMTYgKzM5MCwxNiBAQAogICAgICAgICBGWF9GcmVlKHBDb21wYWN0LT5tX3BCdWZmZXIpOwogICAgIH0KIH0KLXN0YXRpYyBGWF9CT09MIF9Db21wYWN0U3RyaW5nU2FtZShfQ29tcGFjdFN0cmluZyogcENvbXBhY3QsIGNvbnN0IHVpbnQ4X3QqIHBTdHIsIGludCBsZW4pCitzdGF0aWMgYm9vbCBfQ29tcGFjdFN0cmluZ1NhbWUoX0NvbXBhY3RTdHJpbmcqIHBDb21wYWN0LCBjb25zdCB1aW50OF90KiBwU3RyLCBpbnQgbGVuKQogewogICAgIGlmIChsZW4gPCBzaXplb2YoX0NvbXBhY3RTdHJpbmcpKSB7CiAgICAgICAgIGlmIChwQ29tcGFjdC0+bV9Db21wYWN0TGVuICE9IGxlbikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBGWFNZU19tZW1jbXAoJnBDb21wYWN0LT5tX0xlbkhpZ2gsIHBTdHIsIGxlbikgPT0gMDsKICAgICB9CiAgICAgaWYgKHBDb21wYWN0LT5tX0NvbXBhY3RMZW4gIT0gMHhmZiB8fCBwQ29tcGFjdC0+bV9MZW5IaWdoICogMjU2ICsgcENvbXBhY3QtPm1fTGVuTG93ICE9IGxlbikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIEZYU1lTX21lbWNtcChwQ29tcGFjdC0+bV9wQnVmZmVyLCBwU3RyLCBsZW4pID09IDA7CiB9CkBAIC00OTcsMTggKzQ5NywxOCBAQAogICAgIHJOZXh0UG9zaXRpb24gPSBOVUxMOwogICAgIHJldHVybiByVmFsdWU7CiB9Ci1GWF9CT09MIF9DTWFwTG9va3VwQ2FsbGJhY2sodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKQorYm9vbCBfQ01hcExvb2t1cENhbGxiYWNrKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSkKIHsKICAgICByZXR1cm4gIV9Db21wYWN0U3RyaW5nU2FtZSgoX0NvbXBhY3RTdHJpbmcqKXBEYXRhLCAoKENGWF9CeXRlU3RyaW5nQyopcGFyYW0pLT5HZXRQdHIoKSwgKChDRlhfQnl0ZVN0cmluZ0MqKXBhcmFtKS0+R2V0TGVuZ3RoKCkpOwogfQotRlhfQk9PTCBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjo6TG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdAorYm9vbCBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjo6TG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdAogewogICAgIHZvaWQqIHAgPSBtX0J1ZmZlci5JdGVyYXRlKF9DTWFwTG9va3VwQ2FsbGJhY2ssICh2b2lkKikma2V5KTsKICAgICBpZiAoIXApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJWYWx1ZSA9ICoodm9pZCoqKSgoX0NvbXBhY3RTdHJpbmcqKXAgKyAxKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHI6OlNldEF0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiB2YWx1ZSkKIHsKQEAgLTU3OSwxNSArNTc5LDE1IEBACiAgICAgRlhfRFdPUkQga2V5OwogICAgIEZYX0RXT1JEIHZhbHVlOwogfTsKLUZYX0JPT0wgQ0ZYX0NNYXBEV29yZFRvRFdvcmQ6Okxvb2t1cChGWF9EV09SRCBrZXksIEZYX0RXT1JEJiB2YWx1ZSkgY29uc3QKK2Jvb2wgQ0ZYX0NNYXBEV29yZFRvRFdvcmQ6Okxvb2t1cChGWF9EV09SRCBrZXksIEZYX0RXT1JEJiB2YWx1ZSkgY29uc3QKIHsKICAgICB2b2lkKiBwUmVzdWx0ID0gRlhTWVNfYnNlYXJjaCgma2V5LCBtX0J1ZmZlci5HZXRCdWZmZXIoKSwgbV9CdWZmZXIuR2V0U2l6ZSgpIC8gc2l6ZW9mKF9EV29yZFBhaXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoX0RXb3JkUGFpciksIF9Db21wYXJlRFdvcmQpOwogICAgIGlmIChwUmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHZhbHVlID0gKChGWF9EV09SRCopcFJlc3VsdClbMV07Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBGWF9QT1NJVElPTiBDRlhfQ01hcERXb3JkVG9EV29yZDo6R2V0U3RhcnRQb3NpdGlvbigpIGNvbnN0CiB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY191dGlsLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3V0aWwuY3BwCmluZGV4IDI2ZWVhY2MuLjEzNDMzNzQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3V0aWwuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3V0aWwuY3BwCkBAIC0yNiw3ICsyNiw3IEBACiAgICAgICAgIG1fcENhbGxiYWNrKG1fcERhdGEpOwogICAgIH0KIH0KLXZvaWQgQ0ZYX1ByaXZhdGVEYXRhOjpBZGREYXRhKHZvaWQqIHBNb2R1bGVJZCwgdm9pZCogcERhdGEsIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrLCBGWF9CT09MIGJTZWxmRGVzdHJ1Y3QpCit2b2lkIENGWF9Qcml2YXRlRGF0YTo6QWRkRGF0YSh2b2lkKiBwTW9kdWxlSWQsIHZvaWQqIHBEYXRhLCBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjaywgYm9vbCBiU2VsZkRlc3RydWN0KQogewogICAgIGlmIChwTW9kdWxlSWQgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CkBAIC00NiwyNiArNDYsMjYgQEAKIH0KIHZvaWQgQ0ZYX1ByaXZhdGVEYXRhOjpTZXRQcml2YXRlRGF0YSh2b2lkKiBwTW9kdWxlSWQsIHZvaWQqIHBEYXRhLCBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjaykKIHsKLSAgICBBZGREYXRhKHBNb2R1bGVJZCwgcERhdGEsIGNhbGxiYWNrLCBGQUxTRSk7CisgICAgQWRkRGF0YShwTW9kdWxlSWQsIHBEYXRhLCBjYWxsYmFjaywgZmFsc2UpOwogfQogdm9pZCBDRlhfUHJpdmF0ZURhdGE6OlNldFByaXZhdGVPYmoodm9pZCogcE1vZHVsZUlkLCBDRlhfRGVzdHJ1Y3RPYmplY3QqIHBPYmopCiB7Ci0gICAgQWRkRGF0YShwTW9kdWxlSWQsIHBPYmosIE5VTEwsIFRSVUUpOworICAgIEFkZERhdGEocE1vZHVsZUlkLCBwT2JqLCBOVUxMLCB0cnVlKTsKIH0KLUZYX0JPT0wgQ0ZYX1ByaXZhdGVEYXRhOjpSZW1vdmVQcml2YXRlRGF0YSh2b2lkKiBwTW9kdWxlSWQpCitib29sIENGWF9Qcml2YXRlRGF0YTo6UmVtb3ZlUHJpdmF0ZURhdGEodm9pZCogcE1vZHVsZUlkKQogewogICAgIGlmIChwTW9kdWxlSWQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfUFJJVkFURURBVEEqIHBMaXN0ID0gbV9EYXRhTGlzdC5HZXREYXRhKCk7CiAgICAgaW50IGNvdW50ID0gbV9EYXRhTGlzdC5HZXRTaXplKCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewogICAgICAgICBpZiAocExpc3RbaV0ubV9wTW9kdWxlSWQgPT0gcE1vZHVsZUlkKSB7CiAgICAgICAgICAgICBtX0RhdGFMaXN0LlJlbW92ZUF0KGkpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogdm9pZCogQ0ZYX1ByaXZhdGVEYXRhOjpHZXRQcml2YXRlRGF0YSh2b2lkKiBwTW9kdWxlSWQpCiB7CkBAIC05MCwxOCArOTAsMTggQEAKICAgICB9CiAgICAgbV9EYXRhTGlzdC5SZW1vdmVBbGwoKTsKIH0KLXZvaWQgRlhfYXRvbnVtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyYywgRlhfQk9PTCYgYkludGVnZXIsIHZvaWQqIHBEYXRhKQordm9pZCBGWF9hdG9udW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHJjLCBib29sJiBiSW50ZWdlciwgdm9pZCogcERhdGEpCiB7CiAgICAgaWYgKEZYU1lTX21lbWNocihzdHJjLkdldFB0cigpLCAnLicsIHN0cmMuR2V0TGVuZ3RoKCkpID09IE5VTEwpIHsKLSAgICAgICAgYkludGVnZXIgPSBUUlVFOworICAgICAgICBiSW50ZWdlciA9IHRydWU7CiAgICAgICAgIGludCBjYyA9IDAsIGludGVnZXIgPSAwOwogICAgICAgICBjb25zdCBGWF9DSEFSKiBzdHIgPSBzdHJjLkdldENTdHIoKTsKICAgICAgICAgaW50IGxlbiA9IHN0cmMuR2V0TGVuZ3RoKCk7Ci0gICAgICAgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0U7CisgICAgICAgIGJvb2wgYk5lZ2F0aXZlID0gZmFsc2U7CiAgICAgICAgIGlmIChzdHJbMF0gPT0gJysnKSB7CiAgICAgICAgICAgICBjYysrOwogICAgICAgICB9IGVsc2UgaWYgKHN0clswXSA9PSAnLScpIHsKLSAgICAgICAgICAgIGJOZWdhdGl2ZSA9IFRSVUU7CisgICAgICAgICAgICBiTmVnYXRpdmUgPSB0cnVlOwogICAgICAgICAgICAgY2MrKzsKICAgICAgICAgfQogICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsKQEAgLTExOSw3ICsxMTksNyBAQAogICAgICAgICB9CiAgICAgICAgICooaW50KilwRGF0YSA9IGludGVnZXI7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYkludGVnZXIgPSBGQUxTRTsKKyAgICAgICAgYkludGVnZXIgPSBmYWxzZTsKICAgICAgICAgKihGWF9GTE9BVCopcERhdGEgPSBGWF9hdG9mKHN0cmMpOwogICAgIH0KIH0KQEAgLTEyOSwxMyArMTI5LDEzIEBACiAgICAgICAgIHJldHVybiAwLjA7CiAgICAgfQogICAgIGludCBjYyA9IDA7Ci0gICAgRlhfQk9PTCBiTmVnYXRpdmUgPSBGQUxTRTsKKyAgICBib29sIGJOZWdhdGl2ZSA9IGZhbHNlOwogICAgIGNvbnN0IEZYX0NIQVIqIHN0ciA9IHN0cmMuR2V0Q1N0cigpOwogICAgIGludCBsZW4gPSBzdHJjLkdldExlbmd0aCgpOwogICAgIGlmIChzdHJbMF0gPT0gJysnKSB7CiAgICAgICAgIGNjKys7CiAgICAgfSBlbHNlIGlmIChzdHJbMF0gPT0gJy0nKSB7Ci0gICAgICAgIGJOZWdhdGl2ZSA9IFRSVUU7CisgICAgICAgIGJOZWdhdGl2ZSA9IHRydWU7CiAgICAgICAgIGNjKys7CiAgICAgfQogICAgIHdoaWxlIChjYyA8IGxlbikgewpAQCAtMTg3LDEzICsxODcsMTMgQEAKIH0KICNlbmRpZiAgLy8gX0ZYTV9QTEFURk9STV9XSU5ET1dTXyAmJiBfTVNDX1ZFUiA8IDE5MDAKIAotc3RhdGljIEZYX0JPT0wgRlhfSXNEaWdpdCh1aW50OF90IGNoKQorc3RhdGljIGJvb2wgRlhfSXNEaWdpdCh1aW50OF90IGNoKQogewotICAgIHJldHVybiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgPyBUUlVFIDogRkFMU0U7CisgICAgcmV0dXJuIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSA/IHRydWUgOiBmYWxzZTsKIH0KLXN0YXRpYyBGWF9CT09MIEZYX0lzWERpZ2l0KHVpbnQ4X3QgY2gpCitzdGF0aWMgYm9vbCBGWF9Jc1hEaWdpdCh1aW50OF90IGNoKQogewotICAgIHJldHVybiAoRlhfSXNEaWdpdChjaCkgfHwgKGNoID49ICdBJyAmJiBjaCA8PSAnRicpIHx8IChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSkgPyBUUlVFIDogRkFMU0U7CisgICAgcmV0dXJuIChGWF9Jc0RpZ2l0KGNoKSB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgfHwgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpKSA/IHRydWUgOiBmYWxzZTsKIH0KIHN0YXRpYyB1aW50OF90IEZYX01ha2VVcHBlcih1aW50OF90IGNoKQogewpAQCAtMjk5LDcgKzI5OSw3IEBACiBwdWJsaWM6CiAgICAgdmlydHVhbCB+Q0ZpbmRGaWxlRGF0YSgpIHt9CiAgICAgSEFORExFCQkJCW1fSGFuZGxlOwotICAgIEZYX0JPT0wJCQkJbV9iRW5kOworICAgIGJvb2wJCQkJbV9iRW5kOwogfTsKIGNsYXNzIENGaW5kRmlsZURhdGFBIDogcHVibGljIENGaW5kRmlsZURhdGEKIHsKQEAgLTMzMiw3ICszMzIsNyBAQAogICAgICAgICBkZWxldGUgcERhdGE7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBwRGF0YS0+bV9iRW5kID0gRkFMU0U7CisgICAgcERhdGEtPm1fYkVuZCA9IGZhbHNlOwogICAgIHJldHVybiBwRGF0YTsKICNlbHNlCiAgICAgRElSKiBkaXIgPSBvcGVuZGlyKHBhdGgpOwpAQCAtMzUyLDgyICszNTIsODIgQEAKICAgICAgICAgZGVsZXRlIHBEYXRhOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgcERhdGEtPm1fYkVuZCA9IEZBTFNFOworICAgIHBEYXRhLT5tX2JFbmQgPSBmYWxzZTsKICAgICByZXR1cm4gcERhdGE7CiAjZWxzZQogICAgIERJUiogZGlyID0gb3BlbmRpcihDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocGF0aCkpOwogICAgIHJldHVybiBkaXI7CiAjZW5kaWYKIH0KLUZYX0JPT0wgRlhfR2V0TmV4dEZpbGUodm9pZCogaGFuZGxlLCBDRlhfQnl0ZVN0cmluZyYgZmlsZW5hbWUsIEZYX0JPT0wmIGJGb2xkZXIpCitib29sIEZYX0dldE5leHRGaWxlKHZvaWQqIGhhbmRsZSwgQ0ZYX0J5dGVTdHJpbmcmIGZpbGVuYW1lLCBib29sJiBiRm9sZGVyKQogewogICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwogI2lmbmRlZiBfV0lOMzJfV0NFCiAgICAgQ0ZpbmRGaWxlRGF0YUEqIHBEYXRhID0gKENGaW5kRmlsZURhdGFBKiloYW5kbGU7CiAgICAgaWYgKHBEYXRhLT5tX2JFbmQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGZpbGVuYW1lID0gcERhdGEtPm1fRmluZERhdGEuY0ZpbGVOYW1lOwogICAgIGJGb2xkZXIgPSBwRGF0YS0+bV9GaW5kRGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZOwogICAgIGlmICghRmluZE5leHRGaWxlQShwRGF0YS0+bV9IYW5kbGUsICZwRGF0YS0+bV9GaW5kRGF0YSkpIHsKLSAgICAgICAgcERhdGEtPm1fYkVuZCA9IFRSVUU7CisgICAgICAgIHBEYXRhLT5tX2JFbmQgPSB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKICNlbHNlCiAgICAgQ0ZpbmRGaWxlRGF0YVcqIHBEYXRhID0gKENGaW5kRmlsZURhdGFXKiloYW5kbGU7CiAgICAgaWYgKHBEYXRhLT5tX2JFbmQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGZpbGVuYW1lID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBEYXRhLT5tX0ZpbmREYXRhLmNGaWxlTmFtZSk7CiAgICAgYkZvbGRlciA9IHBEYXRhLT5tX0ZpbmREYXRhLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlk7CiAgICAgaWYgKCFGaW5kTmV4dEZpbGVXKHBEYXRhLT5tX0hhbmRsZSwgJnBEYXRhLT5tX0ZpbmREYXRhKSkgewotICAgICAgICBwRGF0YS0+bV9iRW5kID0gVFJVRTsKKyAgICAgICAgcERhdGEtPm1fYkVuZCA9IHRydWU7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogI2VuZGlmCiAjZWxpZiBkZWZpbmVkKF9fbmF0aXZlX2NsaWVudF9fKQogICAgIGFib3J0KCk7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKICNlbHNlCiAgICAgc3RydWN0IGRpcmVudCAqZGUgPSByZWFkZGlyKChESVIqKWhhbmRsZSk7CiAgICAgaWYgKGRlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGZpbGVuYW1lID0gZGUtPmRfbmFtZTsKICAgICBiRm9sZGVyID0gZGUtPmRfdHlwZSA9PSBEVF9ESVI7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiAjZW5kaWYKIH0KLUZYX0JPT0wgRlhfR2V0TmV4dEZpbGUodm9pZCogaGFuZGxlLCBDRlhfV2lkZVN0cmluZyYgZmlsZW5hbWUsIEZYX0JPT0wmIGJGb2xkZXIpCitib29sIEZYX0dldE5leHRGaWxlKHZvaWQqIGhhbmRsZSwgQ0ZYX1dpZGVTdHJpbmcmIGZpbGVuYW1lLCBib29sJiBiRm9sZGVyKQogewogICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwogICAgIENGaW5kRmlsZURhdGFXKiBwRGF0YSA9IChDRmluZEZpbGVEYXRhVyopaGFuZGxlOwogICAgIGlmIChwRGF0YS0+bV9iRW5kKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBmaWxlbmFtZSA9IHBEYXRhLT5tX0ZpbmREYXRhLmNGaWxlTmFtZTsKICAgICBiRm9sZGVyID0gcERhdGEtPm1fRmluZERhdGEuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWTsKICAgICBpZiAoIUZpbmROZXh0RmlsZVcocERhdGEtPm1fSGFuZGxlLCAmcERhdGEtPm1fRmluZERhdGEpKSB7Ci0gICAgICAgIHBEYXRhLT5tX2JFbmQgPSBUUlVFOworICAgICAgICBwRGF0YS0+bV9iRW5kID0gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiAjZWxpZiBkZWZpbmVkKF9fbmF0aXZlX2NsaWVudF9fKQogICAgIGFib3J0KCk7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKICNlbHNlCiAgICAgc3RydWN0IGRpcmVudCAqZGUgPSByZWFkZGlyKChESVIqKWhhbmRsZSk7CiAgICAgaWYgKGRlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGZpbGVuYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChkZS0+ZF9uYW1lKTsKICAgICBiRm9sZGVyID0gZGUtPmRfdHlwZSA9PSBEVF9ESVI7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiAjZW5kaWYKIH0KIHZvaWQgRlhfQ2xvc2VGb2xkZXIodm9pZCogaGFuZGxlKQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfd3N0cmluZy5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY193c3RyaW5nLmNwcAppbmRleCBiNmI1OTU1Li5iYjIzNmFjIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY193c3RyaW5nLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY193c3RyaW5nLmNwcApAQCAtOTgwLDExICs5ODAsMTEgQEAKICAgICAgICAgcmV0dXJuIDAuMDsKICAgICB9CiAgICAgaW50IGNjID0gMDsKLSAgICBGWF9CT09MIGJOZWdhdGl2ZSA9IEZBTFNFOworICAgIGJvb2wgYk5lZ2F0aXZlID0gZmFsc2U7CiAgICAgaWYgKHN0clswXSA9PSAnKycpIHsKICAgICAgICAgY2MrKzsKICAgICB9IGVsc2UgaWYgKHN0clswXSA9PSAnLScpIHsKLSAgICAgICAgYk5lZ2F0aXZlID0gVFJVRTsKKyAgICAgICAgYk5lZ2F0aXZlID0gdHJ1ZTsKICAgICAgICAgY2MrKzsKICAgICB9CiAgICAgaW50IGludGVnZXIgPSAwOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfZXh0ZW5zaW9uLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5jcHAKaW5kZXggNDY2MmU4Zi4uZmU2ZjI5ZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfZXh0ZW5zaW9uLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9leHRlbnNpb24uY3BwCkBAIC03MiwxMiArNzIsMTIgQEAKICAgICBGWFNZU19hc3NlcnQoaEZpbGUgIT0gTlVMTCk7CiAgICAgcmV0dXJuICgoSUZYQ1JUX0ZpbGVBY2Nlc3MqKWhGaWxlKS0+V3JpdGVQb3MocEJ1ZmZlciwgc3pCdWZmZXIsIHBvcyk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfRmx1c2goRlhfSEZJTEUgaEZpbGUpCitib29sIEZYX0ZpbGVfRmx1c2goRlhfSEZJTEUgaEZpbGUpCiB7CiAgICAgRlhTWVNfYXNzZXJ0KGhGaWxlICE9IE5VTEwpOwogICAgIHJldHVybiAoKElGWENSVF9GaWxlQWNjZXNzKiloRmlsZSktPkZsdXNoKCk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfVHJ1bmNhdGUoRlhfSEZJTEUgaEZpbGUsIEZYX0ZJTEVTSVpFIHN6RmlsZSkKK2Jvb2wgRlhfRmlsZV9UcnVuY2F0ZShGWF9IRklMRSBoRmlsZSwgRlhfRklMRVNJWkUgc3pGaWxlKQogewogICAgIEZYU1lTX2Fzc2VydChoRmlsZSAhPSBOVUxMKTsKICAgICByZXR1cm4gKChJRlhDUlRfRmlsZUFjY2VzcyopaEZpbGUpLT5UcnVuY2F0ZShzekZpbGUpOwpAQCAtMTIyLDExICsxMjIsMTEgQEAKIHsKICAgICByZXR1cm4gRlhfQ3JlYXRlRmlsZVN0cmVhbShmaWxlbmFtZSwgRlhfRklMRU1PREVfUmVhZE9ubHkpOwogfQotSUZYX01lbW9yeVN0cmVhbSogRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBkd1NpemUsIEZYX0JPT0wgYlRha2VPdmVyKQorSUZYX01lbW9yeVN0cmVhbSogRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBkd1NpemUsIGJvb2wgYlRha2VPdmVyKQogewogICAgIHJldHVybiBuZXcgQ0ZYX01lbW9yeVN0cmVhbShwQnVmZmVyLCBkd1NpemUsIGJUYWtlT3Zlcik7CiB9Ci1JRlhfTWVtb3J5U3RyZWFtKiBGWF9DcmVhdGVNZW1vcnlTdHJlYW0oRlhfQk9PTCBiQ29uc2VjdXRpdmUpCitJRlhfTWVtb3J5U3RyZWFtKiBGWF9DcmVhdGVNZW1vcnlTdHJlYW0oYm9vbCBiQ29uc2VjdXRpdmUpCiB7CiAgICAgcmV0dXJuIG5ldyBDRlhfTWVtb3J5U3RyZWFtKGJDb25zZWN1dGl2ZSk7CiB9CkBAIC0xNjAsMTAgKzE2MCwxMCBAQAogICAgICAgICByZXR1cm4gMC4wZjsKICAgICB9CiAgICAgaW50MzJfdCBpVXNlZExlbiA9IDA7Ci0gICAgRlhfQk9PTCBiTmVndGl2ZSA9IEZBTFNFOworICAgIGJvb2wgYk5lZ3RpdmUgPSBmYWxzZTsKICAgICBzd2l0Y2ggKHB3c1N0cltpVXNlZExlbl0pIHsKICAgICAgICAgY2FzZSAnLSc6Ci0gICAgICAgICAgICBiTmVndGl2ZSA9IFRSVUU7CisgICAgICAgICAgICBiTmVndGl2ZSA9IHRydWU7CiAgICAgICAgIGNhc2UgJysnOgogICAgICAgICAgICAgaVVzZWRMZW4rKzsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjMwLDcgKzIzMCw3IEBACiAgICAgfQogICAgIHJldHVybiBjaDEgLSBjaDI7CiB9Ci1GWF9EV09SRCBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QShjb25zdCBGWF9DSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgsIEZYX0JPT0wgYklnbm9yZUNhc2UpCitGWF9EV09SRCBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QShjb25zdCBGWF9DSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgsIGJvb2wgYklnbm9yZUNhc2UpCiB7CiAgICAgRlhTWVNfYXNzZXJ0KHBTdHIgIT0gTlVMTCk7CiAgICAgaWYgKGlMZW5ndGggPCAwKSB7CkBAIC0yNDksNyArMjQ5LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIGR3SGFzaENvZGU7CiB9Ci1GWF9EV09SRCBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoLCBGWF9CT09MIGJJZ25vcmVDYXNlKQorRlhfRFdPUkQgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCwgYm9vbCBiSWdub3JlQ2FzZSkKIHsKICAgICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMKTsKICAgICBpZiAoaUxlbmd0aCA8IDApIHsKQEAgLTI4Myw3ICsyODMsNyBAQAogICAgIGZvciAoaSA9IDE7IGkgPCBNVF9OOyBpICsrKSB7CiAgICAgICAgIHBCdWZbaV0gPSAoMTgxMjQzMzI1M1VMICogKHBCdWZbaSAtIDFdIF4gKHBCdWZbaSAtIDFdID4+IDMwKSkgKyBpKTsKICAgICB9Ci0gICAgcENvbnRleHQtPmJIYXZlU2VlZCA9IFRSVUU7CisgICAgcENvbnRleHQtPmJIYXZlU2VlZCA9IHRydWU7CiAgICAgcmV0dXJuIHBDb250ZXh0OwogfQogRlhfRFdPUkQgRlhfUmFuZG9tX01UX0dlbmVyYXRlKHZvaWQqIHBDb250ZXh0KQpAQCAtMzQ3LDggKzM0Nyw4IEBACiAgICAgZG8gewogICAgICAgICA6OkdldFN5c3RlbVRpbWUoJnN0Mik7CiAgICAgfSB3aGlsZSAoRlhTWVNfbWVtY21wKCZzdDEsICZzdDIsIHNpemVvZihTWVNURU1USU1FKSkgPT0gMCk7Ci0gICAgRlhfRFdPUkQgZHdIYXNoMSA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKChjb25zdCBGWF9DSEFSKikmc3QxLCBzaXplb2Yoc3QxKSwgVFJVRSk7Ci0gICAgRlhfRFdPUkQgZHdIYXNoMiA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKChjb25zdCBGWF9DSEFSKikmc3QyLCBzaXplb2Yoc3QyKSwgVFJVRSk7CisgICAgRlhfRFdPUkQgZHdIYXNoMSA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKChjb25zdCBGWF9DSEFSKikmc3QxLCBzaXplb2Yoc3QxKSwgdHJ1ZSk7CisgICAgRlhfRFdPUkQgZHdIYXNoMiA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKChjb25zdCBGWF9DSEFSKikmc3QyLCBzaXplb2Yoc3QyKSwgdHJ1ZSk7CiAgICAgOjpzcmFuZCgoZHdIYXNoMSA8PCAxNikgfCAoRlhfRFdPUkQpZHdIYXNoMik7CiAjZWxzZQogICAgIHRpbWVfdCB0bUxhc3QgPSB0aW1lKE5VTEwpLCB0bUN1cjsKQEAgLTM2MCwxNSArMzYwLDE1IEBACiAgICAgfQogfQogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLUZYX0JPT0wgRlhfR2VuZXJhdGVDcnlwdG9SYW5kb20oRlhfRFdPUkQqIHBCdWZmZXIsIGludDMyX3QgaUNvdW50KQorYm9vbCBGWF9HZW5lcmF0ZUNyeXB0b1JhbmRvbShGWF9EV09SRCogcEJ1ZmZlciwgaW50MzJfdCBpQ291bnQpCiB7CiAgICAgSENSWVBUUFJPViBoQ1AgPSBOVUxMOwogICAgIGlmICghOjpDcnlwdEFjcXVpcmVDb250ZXh0KCZoQ1AsIE5VTEwsIE5VTEwsIFBST1ZfUlNBX0ZVTEwsIDApIHx8IGhDUCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICA6OkNyeXB0R2VuUmFuZG9tKGhDUCwgaUNvdW50ICogc2l6ZW9mKEZYX0RXT1JEKSwgKHVpbnQ4X3QqKXBCdWZmZXIpOwogICAgIDo6Q3J5cHRSZWxlYXNlQ29udGV4dChoQ1AsIDApOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogI2VuZGlmCiB2b2lkIEZYX1JhbmRvbV9HZW5lcmF0ZUNyeXB0byhGWF9EV09SRCogcEJ1ZmZlciwgaW50MzJfdCBpQ291bnQpCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF91bmljb2RlLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X3VuaWNvZGUuY3BwCmluZGV4IGQ2NmE1OGEuLjFkNjNkYTkgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X3VuaWNvZGUuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X3VuaWNvZGUuY3BwCkBAIC0xMywyNyArMTMsMjcgQEAKIHsKICAgICByZXR1cm4gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdOwogfQotRlhfQk9PTCBGWF9Jc0N0cmxDb2RlKEZYX1dDSEFSIGNoKQorYm9vbCBGWF9Jc0N0cmxDb2RlKEZYX1dDSEFSIGNoKQogewogICAgIEZYX0RXT1JEIGR3UmV0ID0gKGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpY2hdICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7CiAgICAgcmV0dXJuIGR3UmV0ID09IEZYX0NIQVJUWVBFX1RhYiB8fCBkd1JldCA9PSBGWF9DSEFSVFlQRV9Db250cm9sOwogfQotRlhfQk9PTCBGWF9Jc1JvdGF0aW9uQ29kZShGWF9XQ0hBUiBjaCkKK2Jvb2wgRlhfSXNSb3RhdGlvbkNvZGUoRlhfV0NIQVIgY2gpCiB7CiAgICAgcmV0dXJuIChnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKWNoXSAmIDB4ODAwMCkgIT0gMDsKIH0KLUZYX0JPT0wgRlhfSXNDb21iaW5hdGlvbkNoYXIoRlhfV0NIQVIgd2NoKQorYm9vbCBGWF9Jc0NvbWJpbmF0aW9uQ2hhcihGWF9XQ0hBUiB3Y2gpCiB7CiAgICAgRlhfRFdPUkQgZHdQcm9wcyA9IChnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF0gJiBGWF9DSEFSVFlQRUJJVFNNQVNLKTsKICAgICByZXR1cm4gZHdQcm9wcyA9PSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbjsKIH0KLUZYX0JPT0wJRlhfSXNCaWRpQ2hhcihGWF9XQ0hBUiB3Y2gpCitib29sCUZYX0lzQmlkaUNoYXIoRlhfV0NIQVIgd2NoKQogewogICAgIEZYX0RXT1JEIGR3UHJvcHMgPSBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF07CiAgICAgaW50MzJfdCBpQmlkaUNscyA9IChkd1Byb3BzICYgRlhfQklESUNMQVNTQklUU01BU0spID4+IEZYX0JJRElDTEFTU0JJVFM7CiAgICAgcmV0dXJuIChGWF9CSURJQ0xBU1NfUiA9PSBpQmlkaUNscyB8fCBGWF9CSURJQ0xBU1NfQUwgPT0gaUJpZGlDbHMpOwogfQotRlhfV0NIQVIgRlhfR2V0TWlycm9yQ2hhcihGWF9XQ0hBUiB3Y2gsIEZYX0JPT0wgYlJUTCwgRlhfQk9PTCBiVmVydGljYWwpCitGWF9XQ0hBUiBGWF9HZXRNaXJyb3JDaGFyKEZYX1dDSEFSIHdjaCwgYm9vbCBiUlRMLCBib29sIGJWZXJ0aWNhbCkKIHsKICAgICBGWF9EV09SRCBkd1Byb3BzID0gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdOwogICAgIEZYX0RXT1JEIGR3VGVtcCA9IChkd1Byb3BzICYgMHhGRjgwMDAwMCk7CkBAIC00OSw3ICs0OSw3IEBACiAgICAgfQogICAgIHJldHVybiB3Y2g7CiB9Ci1GWF9XQ0hBUiBGWF9HZXRNaXJyb3JDaGFyKEZYX1dDSEFSIHdjaCwgRlhfRFdPUkQgZHdQcm9wcywgRlhfQk9PTCBiUlRMLCBGWF9CT09MIGJWZXJ0aWNhbCkKK0ZYX1dDSEFSIEZYX0dldE1pcnJvckNoYXIoRlhfV0NIQVIgd2NoLCBGWF9EV09SRCBkd1Byb3BzLCBib29sIGJSVEwsIGJvb2wgYlZlcnRpY2FsKQogewogICAgIEZYX0RXT1JEIGR3VGVtcCA9IChkd1Byb3BzICYgMHhGRjgwMDAwMCk7CiAgICAgaWYgKGJSVEwgJiYgZHdUZW1wIDwgMHhGRjgwMDAwMCkgewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfeG1sX3BhcnNlci5jcHAgYi9jb3JlL3NyYy9meGNydC9meF94bWxfcGFyc2VyLmNwcAppbmRleCBkY2Y5MWQxLi43MzY5NWE2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF94bWxfcGFyc2VyLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF94bWxfcGFyc2VyLmNwcApAQCAtMTIsMzQgKzEyLDM0IEBACiAgICAgICAgIG1fcERhdGFBY2MtPlJlbGVhc2UoKTsKICAgICB9CiB9Ci1GWF9CT09MIENYTUxfUGFyc2VyOjpJbml0KHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBzaXplKQorYm9vbCBDWE1MX1BhcnNlcjo6SW5pdCh1aW50OF90KiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKICAgICBtX3BEYXRhQWNjID0gbmV3IENYTUxfRGF0YUJ1ZkFjYyhwQnVmZmVyLCBzaXplKTsKLSAgICByZXR1cm4gSW5pdChUUlVFKTsKKyAgICByZXR1cm4gSW5pdCh0cnVlKTsKIH0KLUZYX0JPT0wgQ1hNTF9QYXJzZXI6OkluaXQoSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQpCitib29sIENYTUxfUGFyc2VyOjpJbml0KElGWF9GaWxlUmVhZCAqcEZpbGVSZWFkKQogewogICAgIG1fcERhdGFBY2MgPSBuZXcgQ1hNTF9EYXRhU3RtQWNjKHBGaWxlUmVhZCk7Ci0gICAgcmV0dXJuIEluaXQoVFJVRSk7CisgICAgcmV0dXJuIEluaXQodHJ1ZSk7CiB9Ci1GWF9CT09MIENYTUxfUGFyc2VyOjpJbml0KElGWF9CdWZmZXJSZWFkICpwQnVmZmVyKQorYm9vbCBDWE1MX1BhcnNlcjo6SW5pdChJRlhfQnVmZmVyUmVhZCAqcEJ1ZmZlcikKIHsKICAgICBpZiAoIXBCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcERhdGFBY2MgPSBwQnVmZmVyOwotICAgIHJldHVybiBJbml0KEZBTFNFKTsKKyAgICByZXR1cm4gSW5pdChmYWxzZSk7CiB9Ci1GWF9CT09MIENYTUxfUGFyc2VyOjpJbml0KEZYX0JPT0wgYk93bmRlZFN0cmVhbSkKK2Jvb2wgQ1hNTF9QYXJzZXI6OkluaXQoYm9vbCBiT3duZGVkU3RyZWFtKQogewogICAgIG1fYk93bmVkU3RyZWFtID0gYk93bmRlZFN0cmVhbTsKICAgICBtX25PZmZzZXQgPSAwOwogICAgIHJldHVybiBSZWFkTmV4dEJsb2NrKCk7CiB9Ci1GWF9CT09MIENYTUxfUGFyc2VyOjpSZWFkTmV4dEJsb2NrKCkKK2Jvb2wgQ1hNTF9QYXJzZXI6OlJlYWROZXh0QmxvY2soKQogewogICAgIGlmICghbV9wRGF0YUFjYy0+UmVhZE5leHRCbG9jaygpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BCdWZmZXIgPSBtX3BEYXRhQWNjLT5HZXRCbG9ja0J1ZmZlcigpOwogICAgIG1fZHdCdWZmZXJTaXplID0gbV9wRGF0YUFjYy0+R2V0QmxvY2tTaXplKCk7CkBAIC00NywxMCArNDcsMTAgQEAKICAgICBtX2R3SW5kZXggPSAwOwogICAgIHJldHVybiBtX2R3QnVmZmVyU2l6ZSA+IDA7CiB9Ci1GWF9CT09MIENYTUxfUGFyc2VyOjpJc0VPRigpCitib29sIENYTUxfUGFyc2VyOjpJc0VPRigpCiB7CiAgICAgaWYgKCFtX3BEYXRhQWNjLT5Jc0VPRigpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gbV9kd0luZGV4ID49IG1fZHdCdWZmZXJTaXplOwogfQpAQCAtODIsMjcgKzgyLDI3IEBACiAgICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKICAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDAxLCAweDAxLAogfTsKLUZYX0JPT0wgZ19GWENSVF9YTUxfSXNXaGl0ZVNwYWNlKHVpbnQ4X3QgY2gpCitib29sIGdfRlhDUlRfWE1MX0lzV2hpdGVTcGFjZSh1aW50OF90IGNoKQogewogICAgIHJldHVybiAoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfU3BhY2VDaGFyKSAhPSAwOwogfQotRlhfQk9PTCBnX0ZYQ1JUX1hNTF9Jc0xldHRlcih1aW50OF90IGNoKQorYm9vbCBnX0ZYQ1JUX1hNTF9Jc0xldHRlcih1aW50OF90IGNoKQogewogICAgIHJldHVybiAoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfTGV0dGVyKSAhPSAwOwogfQotRlhfQk9PTCBnX0ZYQ1JUX1hNTF9Jc0RpZ2l0YWwodWludDhfdCBjaCkKK2Jvb2wgZ19GWENSVF9YTUxfSXNEaWdpdGFsKHVpbnQ4X3QgY2gpCiB7CiAgICAgcmV0dXJuIChnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbY2hdICYgRlhDUlRNX1hNTF9DSEFSVFlQRV9EaWdpdGFsKSAhPSAwOwogfQotRlhfQk9PTCBnX0ZYQ1JUX1hNTF9Jc05hbWVJbnRybyh1aW50OF90IGNoKQorYm9vbCBnX0ZYQ1JUX1hNTF9Jc05hbWVJbnRybyh1aW50OF90IGNoKQogewogICAgIHJldHVybiAoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfTmFtZUludHJvKSAhPSAwOwogfQotRlhfQk9PTCBnX0ZYQ1JUX1hNTF9Jc05hbWVDaGFyKHVpbnQ4X3QgY2gpCitib29sIGdfRlhDUlRfWE1MX0lzTmFtZUNoYXIodWludDhfdCBjaCkKIHsKICAgICByZXR1cm4gKGdfRlhDUlRfWE1MX0J5dGVUeXBlc1tjaF0gJiBGWENSVE1fWE1MX0NIQVJUWVBFX05hbWVDaGFyKSAhPSAwOwogfQotRlhfQk9PTCBnX0ZYQ1JUX1hNTF9Jc0hleENoYXIodWludDhfdCBjaCkKK2Jvb2wgZ19GWENSVF9YTUxfSXNIZXhDaGFyKHVpbnQ4X3QgY2gpCiB7CiAgICAgcmV0dXJuIChnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbY2hdICYgRlhDUlRNX1hNTF9DSEFSVFlQRV9IZXhDaGFyKSAhPSAwOwogfQpAQCAtMzEwLDEzICszMTAsMTMgQEAKICAgICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOwogICAgIHZhbHVlID0gZGVjb2Rlci5HZXRSZXN1bHQoKTsKIH0KLXZvaWQgQ1hNTF9QYXJzZXI6OkdldFRhZ05hbWUoQ0ZYX0J5dGVTdHJpbmcgJnNwYWNlLCBDRlhfQnl0ZVN0cmluZyAmbmFtZSwgRlhfQk9PTCAmYkVuZFRhZywgRlhfQk9PTCBiU3RhcnRUYWcpCit2b2lkIENYTUxfUGFyc2VyOjpHZXRUYWdOYW1lKENGWF9CeXRlU3RyaW5nICZzcGFjZSwgQ0ZYX0J5dGVTdHJpbmcgJm5hbWUsIGJvb2wgJmJFbmRUYWcsIGJvb2wgYlN0YXJ0VGFnKQogewogICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7CiAgICAgaWYgKElzRU9GKCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBiRW5kVGFnID0gRkFMU0U7CisgICAgYkVuZFRhZyA9IGZhbHNlOwogICAgIHVpbnQ4X3QgY2g7CiAgICAgaW50MzJfdCBpU3RhdGUgPSBiU3RhcnRUYWcgPyAxIDogMDsKICAgICBkbyB7CkBAIC0zNDUsMTAgKzM0NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJy8nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3SW5kZXggKys7CiAgICAgICAgICAgICAgICAgICAgICAgICBHZXROYW1lKHNwYWNlLCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJFbmRUYWcgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYkVuZFRhZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBHZXROYW1lKHNwYWNlLCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJFbmRUYWcgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJFbmRUYWcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC0zNTksMTQgKzM1OSwxNCBAQAogICAgICAgICB9CiAgICAgfSB3aGlsZSAoUmVhZE5leHRCbG9jaygpKTsKIH0KLUNYTUxfRWxlbWVudCogQ1hNTF9QYXJzZXI6OlBhcnNlRWxlbWVudChDWE1MX0VsZW1lbnQqIHBQYXJlbnQsIEZYX0JPT0wgYlN0YXJ0VGFnKQorQ1hNTF9FbGVtZW50KiBDWE1MX1BhcnNlcjo6UGFyc2VFbGVtZW50KENYTUxfRWxlbWVudCogcFBhcmVudCwgYm9vbCBiU3RhcnRUYWcpCiB7CiAgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKICAgICBpZiAoSXNFT0YoKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmcgdGFnX25hbWUsIHRhZ19zcGFjZTsKLSAgICBGWF9CT09MIGJFbmRUYWc7CisgICAgYm9vbCBiRW5kVGFnOwogICAgIEdldFRhZ05hbWUodGFnX3NwYWNlLCB0YWdfbmFtZSwgYkVuZFRhZywgYlN0YXJ0VGFnKTsKICAgICBpZiAodGFnX25hbWUuSXNFbXB0eSgpIHx8IGJFbmRUYWcpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC00MjcsNyArNDI3LDcgQEAKICAgICB9CiAgICAgQ0ZYX1VURjhEZWNvZGVyIGRlY29kZXI7CiAgICAgQ0ZYX1dpZGVUZXh0QnVmIGNvbnRlbnQ7Ci0gICAgRlhfQk9PTCBiQ0RBVEEgPSBGQUxTRTsKKyAgICBib29sIGJDREFUQSA9IGZhbHNlOwogICAgIGludDMyX3QgaVN0YXRlID0gMDsKICAgICBkbyB7CiAgICAgICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSkgewpAQCAtNDY1LDEwICs0NjUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydENvbnRlbnRTZWdtZW50KGJDREFUQSwgZGF0YVN0ciwgcEVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5DbGVhcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5DbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgYkNEQVRBID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBiQ0RBVEEgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGF0ZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3SW5kZXggLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICBDWE1MX0VsZW1lbnQqIHBTdWJFbGVtZW50ID0gUGFyc2VFbGVtZW50KHBFbGVtZW50LCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENYTUxfRWxlbWVudCogcFN1YkVsZW1lbnQgPSBQYXJzZUVsZW1lbnQocEVsZW1lbnQsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBTdWJFbGVtZW50ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTUwOSwxMCArNTA5LDEwIEBACiAgICAgSW5zZXJ0Q29udGVudFNlZ21lbnQoYkNEQVRBLCBkYXRhU3RyLCBwRWxlbWVudCk7CiAgICAgY29udGVudC5DbGVhcigpOwogICAgIGRlY29kZXIuQ2xlYXIoKTsKLSAgICBiQ0RBVEEgPSBGQUxTRTsKKyAgICBiQ0RBVEEgPSBmYWxzZTsKICAgICByZXR1cm4gcEVsZW1lbnQ7CiB9Ci12b2lkIENYTUxfUGFyc2VyOjpJbnNlcnRDb250ZW50U2VnbWVudChGWF9CT09MIGJDREFUQSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50LCBDWE1MX0VsZW1lbnQqIHBFbGVtZW50KQordm9pZCBDWE1MX1BhcnNlcjo6SW5zZXJ0Q29udGVudFNlZ21lbnQoYm9vbCBiQ0RBVEEsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudCwgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCkKIHsKICAgICBpZiAoY29udGVudC5Jc0VtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtNTIyLDE2ICs1MjIsMTYgQEAKICAgICBwRWxlbWVudC0+bV9DaGlsZHJlbi5BZGQoKHZvaWQqKUNYTUxfRWxlbWVudDo6Q29udGVudCk7CiAgICAgcEVsZW1lbnQtPm1fQ2hpbGRyZW4uQWRkKHBDb250ZW50KTsKIH0KLXN0YXRpYyBDWE1MX0VsZW1lbnQqIFhNTF9Db250aW51ZVBhcnNlKENYTUxfUGFyc2VyICZwYXJzZXIsIEZYX0JPT0wgYlNhdmVTcGFjZUNoYXJzLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUpCitzdGF0aWMgQ1hNTF9FbGVtZW50KiBYTUxfQ29udGludWVQYXJzZShDWE1MX1BhcnNlciAmcGFyc2VyLCBib29sIGJTYXZlU3BhY2VDaGFycywgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplKQogewogICAgIHBhcnNlci5tX2JTYXZlU3BhY2VDaGFycyA9IGJTYXZlU3BhY2VDaGFyczsKLSAgICBDWE1MX0VsZW1lbnQqIHBFbGVtZW50ID0gcGFyc2VyLlBhcnNlRWxlbWVudChOVUxMLCBGQUxTRSk7CisgICAgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCA9IHBhcnNlci5QYXJzZUVsZW1lbnQoTlVMTCwgZmFsc2UpOwogICAgIGlmIChwUGFyc2VkU2l6ZSkgewogICAgICAgICAqcFBhcnNlZFNpemUgPSBwYXJzZXIubV9uT2Zmc2V0OwogICAgIH0KICAgICByZXR1cm4gcEVsZW1lbnQ7CiB9Ci1DWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6UGFyc2UoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHNpemUsIEZYX0JPT0wgYlNhdmVTcGFjZUNoYXJzLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUpCitDWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6UGFyc2UoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYlNhdmVTcGFjZUNoYXJzLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUpCiB7CiAgICAgQ1hNTF9QYXJzZXIgcGFyc2VyOwogICAgIGlmICghcGFyc2VyLkluaXQoKHVpbnQ4X3QqKXBCdWZmZXIsIHNpemUpKSB7CkBAIC01MzksNyArNTM5LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIFhNTF9Db250aW51ZVBhcnNlKHBhcnNlciwgYlNhdmVTcGFjZUNoYXJzLCBwUGFyc2VkU2l6ZSk7CiB9Ci1DWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6UGFyc2UoSUZYX0ZpbGVSZWFkICpwRmlsZSwgRlhfQk9PTCBiU2F2ZVNwYWNlQ2hhcnMsIEZYX0ZJTEVTSVpFKiBwUGFyc2VkU2l6ZSkKK0NYTUxfRWxlbWVudCogQ1hNTF9FbGVtZW50OjpQYXJzZShJRlhfRmlsZVJlYWQgKnBGaWxlLCBib29sIGJTYXZlU3BhY2VDaGFycywgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplKQogewogICAgIENYTUxfUGFyc2VyIHBhcnNlcjsKICAgICBpZiAoIXBhcnNlci5Jbml0KHBGaWxlKSkgewpAQCAtNTQ3LDcgKzU0Nyw3IEBACiAgICAgfQogICAgIHJldHVybiBYTUxfQ29udGludWVQYXJzZShwYXJzZXIsIGJTYXZlU3BhY2VDaGFycywgcFBhcnNlZFNpemUpOwogfQotQ1hNTF9FbGVtZW50KiBDWE1MX0VsZW1lbnQ6OlBhcnNlKElGWF9CdWZmZXJSZWFkICpwQnVmZmVyLCBGWF9CT09MIGJTYXZlU3BhY2VDaGFycywgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplKQorQ1hNTF9FbGVtZW50KiBDWE1MX0VsZW1lbnQ6OlBhcnNlKElGWF9CdWZmZXJSZWFkICpwQnVmZmVyLCBib29sIGJTYXZlU3BhY2VDaGFycywgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplKQogewogICAgIENYTUxfUGFyc2VyIHBhcnNlcjsKICAgICBpZiAoIXBhcnNlci5Jbml0KHBCdWZmZXIpKSB7CkBAIC02MDAsNyArNjAwLDcgQEAKICAgICB9CiAgICAgbV9DaGlsZHJlbi5SZW1vdmVBbGwoKTsKIH0KLUNGWF9CeXRlU3RyaW5nIENYTUxfRWxlbWVudDo6R2V0VGFnTmFtZShGWF9CT09MIGJRdWFsaWZpZWQpIGNvbnN0CitDRlhfQnl0ZVN0cmluZyBDWE1MX0VsZW1lbnQ6OkdldFRhZ05hbWUoYm9vbCBiUXVhbGlmaWVkKSBjb25zdAogewogICAgIGlmICghYlF1YWxpZmllZCB8fCBtX1FTcGFjZU5hbWUuSXNFbXB0eSgpKSB7CiAgICAgICAgIHJldHVybiBtX1RhZ05hbWU7CkBAIC02MTAsNyArNjEwLDcgQEAKICAgICBic1RhZyArPSBtX1RhZ05hbWU7CiAgICAgcmV0dXJuIGJzVGFnOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1hNTF9FbGVtZW50OjpHZXROYW1lc3BhY2UoRlhfQk9PTCBiUXVhbGlmaWVkKSBjb25zdAorQ0ZYX0J5dGVTdHJpbmcgQ1hNTF9FbGVtZW50OjpHZXROYW1lc3BhY2UoYm9vbCBiUXVhbGlmaWVkKSBjb25zdAogewogICAgIGlmIChiUXVhbGlmaWVkKSB7CiAgICAgICAgIHJldHVybiBtX1FTcGFjZU5hbWU7CkBAIC02NDQsNjEgKzY0NCw2MSBAQAogICAgIG5hbWUgPSBpdGVtLm1fQXR0ck5hbWU7CiAgICAgdmFsdWUgPSBpdGVtLm1fVmFsdWU7CiB9Ci1GWF9CT09MIENYTUxfRWxlbWVudDo6SGFzQXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0Citib29sIENYTUxfRWxlbWVudDo6SGFzQXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0CiB7CiAgICAgQ0ZYX0J5dGVTdHJpbmdDIGJzU3BhY2UsIGJzTmFtZTsKICAgICBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKG5hbWUsIGJzU3BhY2UsIGJzTmFtZSk7CiAgICAgcmV0dXJuIG1fQXR0ck1hcC5Mb29rdXAoYnNTcGFjZSwgYnNOYW1lKSAhPSBOVUxMOwogfQotRlhfQk9PTCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIENGWF9XaWRlU3RyaW5nJiBhdHRyaWJ1dGUpIGNvbnN0Citib29sIENYTUxfRWxlbWVudDo6R2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIGF0dHJpYnV0ZSkgY29uc3QKIHsKICAgICBDRlhfQnl0ZVN0cmluZ0MgYnNTcGFjZSwgYnNOYW1lOwogICAgIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUobmFtZSwgYnNTcGFjZSwgYnNOYW1lKTsKICAgICByZXR1cm4gR2V0QXR0clZhbHVlKGJzU3BhY2UsIGJzTmFtZSwgYXR0cmlidXRlKTsKIH0KLUZYX0JPT0wgQ1hNTF9FbGVtZW50OjpHZXRBdHRyVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBDRlhfV2lkZVN0cmluZyYgYXR0cmlidXRlKSBjb25zdAorYm9vbCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIENGWF9XaWRlU3RyaW5nJiBhdHRyaWJ1dGUpIGNvbnN0CiB7CiAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcqIHBWYWx1ZSA9IG1fQXR0ck1hcC5Mb29rdXAoc3BhY2UsIG5hbWUpOwogICAgIGlmIChwVmFsdWUpIHsKICAgICAgICAgYXR0cmlidXRlID0gKnBWYWx1ZTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50JiBhdHRyaWJ1dGUpIGNvbnN0Citib29sIENYTUxfRWxlbWVudDo6R2V0QXR0ckludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBpbnQmIGF0dHJpYnV0ZSkgY29uc3QKIHsKICAgICBDRlhfQnl0ZVN0cmluZ0MgYnNTcGFjZSwgYnNOYW1lOwogICAgIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUobmFtZSwgYnNTcGFjZSwgYnNOYW1lKTsKICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyogcHdzVmFsdWUgPSBtX0F0dHJNYXAuTG9va3VwKGJzU3BhY2UsIGJzTmFtZSk7CiAgICAgaWYgKHB3c1ZhbHVlKSB7CiAgICAgICAgIGF0dHJpYnV0ZSA9IHB3c1ZhbHVlLT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wJQ1hNTF9FbGVtZW50OjpHZXRBdHRySW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCYgYXR0cmlidXRlKSBjb25zdAorYm9vbAlDWE1MX0VsZW1lbnQ6OkdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50JiBhdHRyaWJ1dGUpIGNvbnN0CiB7CiAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcqIHB3c1ZhbHVlID0gbV9BdHRyTWFwLkxvb2t1cChzcGFjZSwgbmFtZSk7CiAgICAgaWYgKHB3c1ZhbHVlKSB7CiAgICAgICAgIGF0dHJpYnV0ZSA9IHB3c1ZhbHVlLT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1hNTF9FbGVtZW50OjpHZXRBdHRyRmxvYXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9GTE9BVCYgYXR0cmlidXRlKSBjb25zdAorYm9vbCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJGbG9hdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0ZMT0FUJiBhdHRyaWJ1dGUpIGNvbnN0CiB7CiAgICAgQ0ZYX0J5dGVTdHJpbmdDIGJzU3BhY2UsIGJzTmFtZTsKICAgICBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKG5hbWUsIGJzU3BhY2UsIGJzTmFtZSk7CiAgICAgcmV0dXJuIEdldEF0dHJGbG9hdChic1NwYWNlLCBic05hbWUsIGF0dHJpYnV0ZSk7CiB9Ci1GWF9CT09MIENYTUxfRWxlbWVudDo6R2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3QKK2Jvb2wgQ1hNTF9FbGVtZW50OjpHZXRBdHRyRmxvYXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9GTE9BVCYgYXR0cmlidXRlKSBjb25zdAogewogICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nKiBwVmFsdWUgPSBtX0F0dHJNYXAuTG9va3VwKHNwYWNlLCBuYW1lKTsKICAgICBpZiAocFZhbHVlKSB7CiAgICAgICAgIGF0dHJpYnV0ZSA9IHBWYWx1ZS0+R2V0RmxvYXQoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogRlhfRFdPUkQgQ1hNTF9FbGVtZW50OjpDb3VudENoaWxkcmVuKCkgY29uc3QKIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3BsYXRmb3Jtcy5jcHAgYi9jb3JlL3NyYy9meGNydC9meGNydF9wbGF0Zm9ybXMuY3BwCmluZGV4IGU3MTgyOTQzLi44MTNhZjAyIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meGNydF9wbGF0Zm9ybXMuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3BsYXRmb3Jtcy5jcHAKQEAgLTQwLDIwICs0MCwyMCBAQAogewogICAgIENsb3NlKCk7CiB9Ci1GWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6T3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCitib29sIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6T3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCiB7CiAgICAgaWYgKG1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIHN0ck1vZGU7CiAgICAgRlhDUlRfR2V0RmlsZU1vZGVTdHJpbmcoZHdNb2RlLCBzdHJNb2RlKTsKICAgICBtX2hGaWxlID0gRlhTWVNfZm9wZW4oZmlsZU5hbWUuR2V0Q1N0cigpLCBzdHJNb2RlLmNfc3RyKCkpOwogICAgIHJldHVybiBtX2hGaWxlICE9IE5VTEw7CiB9Ci1GWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6T3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCitib29sIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6T3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCiB7CiAgICAgaWYgKG1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9XaWRlU3RyaW5nIHN0ck1vZGU7CiAgICAgRlhDUlRfR2V0RmlsZU1vZGVTdHJpbmcoZHdNb2RlLCBzdHJNb2RlKTsKQEAgLTEyOCw0NSArMTI4LDQ1IEBACiAgICAgRlhTWVNfZnNlZWsobV9oRmlsZSwgcG9zLCBGWFNZU19TRUVLX1NFVCk7CiAgICAgcmV0dXJuIEZYU1lTX2Z3cml0ZShwQnVmZmVyLCAxLCBzekJ1ZmZlciwgbV9oRmlsZSk7CiB9Ci1GWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6Rmx1c2goKQorYm9vbCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OkZsdXNoKCkKIHsKICAgICBpZiAoIW1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiAhRlhTWVNfZmZsdXNoKG1faEZpbGUpOwogfQotRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OlRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSkKK2Jvb2wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKQorYm9vbCBGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUpCiB7CiAgICAgcmV0dXJuIGFjY2VzcyhmaWxlTmFtZS5HZXRDU3RyKCksIEZfT0spID4gLTE7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSkKK2Jvb2wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKQogewogICAgIHJldHVybiBGWF9GaWxlX0V4aXN0KEZYX1VURjhFbmNvZGUoZmlsZU5hbWUpKTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkKK2Jvb2wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkKIHsKICAgICByZXR1cm4gcmVtb3ZlKGZpbGVOYW1lLkdldENTdHIoKSkgPiAtMTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSkKK2Jvb2wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSkKIHsKICAgICByZXR1cm4gRlhfRmlsZV9EZWxldGUoRlhfVVRGOEVuY29kZShmaWxlTmFtZSkpOwogfQotRlhfQk9PTCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKK2Jvb2wgRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCiB7CiAgICAgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUIHNyYywgZHN0OwogICAgIGlmICghc3JjLk9wZW4oZmlsZU5hbWVTcmMsIEZYX0ZJTEVNT0RFX1JlYWRPbmx5KSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfRklMRVNJWkUgc2l6ZSA9IHNyYy5HZXRTaXplKCk7CiAgICAgaWYgKCFzaXplKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoIWRzdC5PcGVuKGZpbGVOYW1lRHN0LCBGWF9GSUxFTU9ERV9UcnVuY2F0ZSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX0ZJTEVTSVpFIG51bSA9IDA7CiAgICAgdWludDhfdCogcEJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIDMyNzY4KTsKQEAgLTE3NiwxNyArMTc2LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgRlhfRnJlZShwQnVmZmVyKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCitib29sIEZYX0ZpbGVfQ29weShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQogewogICAgIHJldHVybiBGWF9GaWxlX0NvcHkoRlhfVVRGOEVuY29kZShmaWxlTmFtZVNyYyksIEZYX1VURjhFbmNvZGUoZmlsZU5hbWVEc3QpKTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCitib29sIEZYX0ZpbGVfTW92ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQogewogICAgIHJldHVybiByZW5hbWUoZmlsZU5hbWVTcmMuR2V0Q1N0cigpLCBmaWxlTmFtZURzdC5HZXRDU3RyKCkpOwogfQotRlhfQk9PTCBGWF9GaWxlX01vdmUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKK2Jvb2wgRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCiB7CiAgICAgcmV0dXJuIEZYX0ZpbGVfTW92ZShGWF9VVEY4RW5jb2RlKGZpbGVOYW1lU3JjKSwgRlhfVVRGOEVuY29kZShmaWxlTmFtZURzdCkpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhjcnRfcGxhdGZvcm1zLmggYi9jb3JlL3NyYy9meGNydC9meGNydF9wbGF0Zm9ybXMuaAppbmRleCA0ZmQwNTg4Li5kOTVhZTRmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meGNydF9wbGF0Zm9ybXMuaAorKysgYi9jb3JlL3NyYy9meGNydC9meGNydF9wbGF0Zm9ybXMuaApAQCAtMTcsOCArMTcsOCBAQAogcHVibGljOgogICAgIENGWENSVF9GaWxlQWNjZXNzX0NSVCgpOwogICAgIHZpcnR1YWwgfkNGWENSVF9GaWxlQWNjZXNzX0NSVCgpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJT3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJT3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOworICAgIHZpcnR1YWwgYm9vbAkJT3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOworICAgIHZpcnR1YWwgYm9vbAkJT3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOwogICAgIHZpcnR1YWwgdm9pZAkJQ2xvc2UoKTsKICAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKTsKICAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCUdldFNpemUoKSBjb25zdDsKQEAgLTI4LDggKzI4LDggQEAKICAgICB2aXJ0dWFsIHNpemVfdAkJV3JpdGUoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKTsKICAgICB2aXJ0dWFsIHNpemVfdAkJUmVhZFBvcyh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcyk7CiAgICAgdmlydHVhbCBzaXplX3QJCVdyaXRlUG9zKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUZsdXNoKCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpOworICAgIHZpcnR1YWwgYm9vbAkJRmx1c2goKTsKKyAgICB2aXJ0dWFsIGJvb2wJCVRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSk7CiBwcm90ZWN0ZWQ6CiAgICAgRlhTWVNfRklMRSoJbV9oRmlsZTsKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meGNydF9wb3NpeC5jcHAgYi9jb3JlL3NyYy9meGNydC9meGNydF9wb3NpeC5jcHAKaW5kZXggODQ2NDZlZi4uZWI3MjEzZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhjcnRfcG9zaXguY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmNwcApAQCAtMzQsMTcgKzM0LDE3IEBACiB7CiAgICAgQ2xvc2UoKTsKIH0KLUZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6Ok9wZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKQorYm9vbCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6T3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCiB7CiAgICAgaWYgKG1fbkZEID4gLTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGludDMyX3QgbkZsYWdzLCBuTWFza3M7CiAgICAgRlhDUlRfUG9zaXhfR2V0RmlsZU1vZGUoZHdNb2RlLCBuRmxhZ3MsIG5NYXNrcyk7CiAgICAgbV9uRkQgPSBvcGVuKGZpbGVOYW1lLkdldENTdHIoKSwgbkZsYWdzLCBuTWFza3MpOwogICAgIHJldHVybiBtX25GRCA+IC0xOwogfQotRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6T3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCitib29sIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkKIHsKICAgICByZXR1cm4gT3BlbihGWF9VVEY4RW5jb2RlKGZpbGVOYW1lKSwgZHdNb2RlKTsKIH0KQEAgLTEyMSw0OCArMTIxLDQ4IEBACiAgICAgfQogICAgIHJldHVybiBXcml0ZShwQnVmZmVyLCBzekJ1ZmZlcik7CiB9Ci1GWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpGbHVzaCgpCitib29sIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpGbHVzaCgpCiB7CiAgICAgaWYgKG1fbkZEIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIGZzeW5jKG1fbkZEKSA+IC0xOwogfQotRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6VHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKQorYm9vbCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6VHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKQogewogICAgIGlmIChtX25GRCA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiAhZnRydW5jYXRlKG1fbkZELCBzekZpbGUpOwogfQotRlhfQk9PTCBGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUpCitib29sIEZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkKIHsKICAgICByZXR1cm4gYWNjZXNzKGZpbGVOYW1lLkdldENTdHIoKSwgRl9PSykgPiAtMTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKQorYm9vbCBGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpCiB7CiAgICAgcmV0dXJuIEZYX0ZpbGVfRXhpc3QoRlhfVVRGOEVuY29kZShmaWxlTmFtZSkpOwogfQotRlhfQk9PTCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKQorYm9vbCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKQogewogICAgIHJldHVybiByZW1vdmUoZmlsZU5hbWUuR2V0Q1N0cigpKSA+IC0xOwogfQotRlhfQk9PTCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKQorYm9vbCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKQogewogICAgIHJldHVybiBGWF9GaWxlX0RlbGV0ZShGWF9VVEY4RW5jb2RlKGZpbGVOYW1lKSk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfQ29weShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQorYm9vbCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKIHsKICAgICBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeCBzcmMsIGRzdDsKICAgICBpZiAoIXNyYy5PcGVuKGZpbGVOYW1lU3JjLCBGWF9GSUxFTU9ERV9SZWFkT25seSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX0ZJTEVTSVpFIHNpemUgPSBzcmMuR2V0U2l6ZSgpOwogICAgIGlmICghc2l6ZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCFkc3QuT3BlbihmaWxlTmFtZURzdCwgRlhfRklMRU1PREVfVHJ1bmNhdGUpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBzaXplX3QgbnVtID0gMDsKICAgICB1aW50OF90KiBwQnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgMzI3NjgpOwpAQCAtMTc0LDE3ICsxNzQsMTcgQEAKICAgICAgICAgbnVtID0gc3JjLlJlYWQocEJ1ZmZlciwgMzI3NjgpOwogICAgIH0KICAgICBGWF9GcmVlKHBCdWZmZXIpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKK2Jvb2wgRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCiB7CiAgICAgcmV0dXJuIEZYX0ZpbGVfQ29weShGWF9VVEY4RW5jb2RlKGZpbGVOYW1lU3JjKSwgRlhfVVRGOEVuY29kZShmaWxlTmFtZURzdCkpOwogfQotRlhfQk9PTCBGWF9GaWxlX01vdmUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKK2Jvb2wgRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCiB7CiAgICAgcmV0dXJuIHJlbmFtZShmaWxlTmFtZVNyYy5HZXRDU3RyKCksIGZpbGVOYW1lRHN0LkdldENTdHIoKSk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfTW92ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQorYm9vbCBGWF9GaWxlX01vdmUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKIHsKICAgICByZXR1cm4gRlhfRmlsZV9Nb3ZlKEZYX1VURjhFbmNvZGUoZmlsZU5hbWVTcmMpLCBGWF9VVEY4RW5jb2RlKGZpbGVOYW1lRHN0KSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meGNydF9wb3NpeC5oIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfcG9zaXguaAppbmRleCAzOWRmMWM4Li42NTNhMTUwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meGNydF9wb3NpeC5oCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmgKQEAgLTE1LDggKzE1LDggQEAKIHB1YmxpYzoKICAgICBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeCgpOwogICAgIHZpcnR1YWwgfkNGWENSVF9GaWxlQWNjZXNzX1Bvc2l4KCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7CisgICAgdmlydHVhbCBib29sCQlPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7CisgICAgdmlydHVhbCBib29sCQlPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7CiAgICAgdmlydHVhbCB2b2lkCQlDbG9zZSgpOwogICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpOwogICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJR2V0U2l6ZSgpIGNvbnN0OwpAQCAtMjYsOCArMjYsOCBAQAogICAgIHZpcnR1YWwgc2l6ZV90CQlXcml0ZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpOwogICAgIHZpcnR1YWwgc2l6ZV90CQlSZWFkUG9zKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKTsKICAgICB2aXJ0dWFsIHNpemVfdAkJV3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJRmx1c2goKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSk7CisgICAgdmlydHVhbCBib29sCQlGbHVzaCgpOworICAgIHZpcnR1YWwgYm9vbAkJVHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKTsKIHByb3RlY3RlZDoKICAgICBpbnQzMl90CW1fbkZEOwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3dpbmRvd3MuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5jcHAKaW5kZXggZDRlMzgzMC4uN2VmZmFiNiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5jcHAKQEAgLTgsMTkgKzgsMTkgQEAKICNpbmNsdWRlICJmeGNydF93aW5kb3dzLmgiCiAKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi1GWF9CT09MIEZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkKK2Jvb2wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKQogewogICAgIEZYX0RXT1JEIGR3QXR0cmkgPSA6OkdldEZpbGVBdHRyaWJ1dGVzQShmaWxlTmFtZS5HZXRDU3RyKCkpOwogICAgIGlmIChkd0F0dHJpID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gKGR3QXR0cmkgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpID09IDA7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSkKK2Jvb2wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKQogewogICAgIEZYX0RXT1JEIGR3QXR0cmkgPSA6OkdldEZpbGVBdHRyaWJ1dGVzVygoTFBDV1NUUilmaWxlTmFtZS5HZXRQdHIoKSk7CiAgICAgaWYgKGR3QXR0cmkgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiAoZHdBdHRyaSAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgPT0gMDsKIH0KQEAgLTU1LDEwICs1NSwxMCBAQAogewogICAgIENsb3NlKCk7CiB9Ci1GWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkKK2Jvb2wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6Ok9wZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKQogewogICAgIGlmIChtX2hGaWxlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWF9EV09SRCBkd0FjY2VzcywgZHdTaGFyZSwgZHdDcmVhdGlvbjsKICAgICBGWENSVF9XaW5kb3dzX0dldEZpbGVNb2RlKGR3TW9kZSwgZHdBY2Nlc3MsIGR3U2hhcmUsIGR3Q3JlYXRpb24pOwpAQCAtNjgsMTAgKzY4LDEwIEBACiAgICAgfQogICAgIHJldHVybiBtX2hGaWxlICE9IE5VTEw7CiB9Ci1GWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkKK2Jvb2wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6Ok9wZW4oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKQogewogICAgIGlmIChtX2hGaWxlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWF9EV09SRCBkd0FjY2VzcywgZHdTaGFyZSwgZHdDcmVhdGlvbjsKICAgICBGWENSVF9XaW5kb3dzX0dldEZpbGVNb2RlKGR3TW9kZSwgZHdBY2Nlc3MsIGR3U2hhcmUsIGR3Q3JlYXRpb24pOwpAQCAtMTc0LDQxICsxNzQsNDEgQEAKICAgICB9CiAgICAgcmV0dXJuIFdyaXRlKHBCdWZmZXIsIHN6QnVmZmVyKTsKIH0KLUZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OkZsdXNoKCkKK2Jvb2wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OkZsdXNoKCkKIHsKICAgICBpZiAoIW1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiA6OkZsdXNoRmlsZUJ1ZmZlcnMobV9oRmlsZSk7CiB9Ci1GWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpCitib29sIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpCiB7CiAgICAgaWYgKFNldFBvc2l0aW9uKHN6RmlsZSkgPT0gKEZYX0ZJTEVTSVpFKSAtIDEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiA6OlNldEVuZE9mRmlsZShtX2hGaWxlKTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkKK2Jvb2wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkKIHsKICAgICByZXR1cm4gOjpEZWxldGVGaWxlQShmaWxlTmFtZS5HZXRDU3RyKCkpOwogfQotRlhfQk9PTCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKQorYm9vbCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKQogewogICAgIHJldHVybiA6OkRlbGV0ZUZpbGVXKChMUENXU1RSKWZpbGVOYW1lLkdldFB0cigpKTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCitib29sIEZYX0ZpbGVfQ29weShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQogewotICAgIHJldHVybiA6OkNvcHlGaWxlQShmaWxlTmFtZVNyYy5HZXRDU3RyKCksIGZpbGVOYW1lRHN0LkdldENTdHIoKSwgRkFMU0UpOworICAgIHJldHVybiA6OkNvcHlGaWxlQShmaWxlTmFtZVNyYy5HZXRDU3RyKCksIGZpbGVOYW1lRHN0LkdldENTdHIoKSwgZmFsc2UpOwogfQotRlhfQk9PTCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKK2Jvb2wgRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCiB7Ci0gICAgcmV0dXJuIDo6Q29weUZpbGVXKChMUENXU1RSKWZpbGVOYW1lU3JjLkdldFB0cigpLCAoTFBDV1NUUilmaWxlTmFtZURzdC5HZXRQdHIoKSwgRkFMU0UpOworICAgIHJldHVybiA6OkNvcHlGaWxlVygoTFBDV1NUUilmaWxlTmFtZVNyYy5HZXRQdHIoKSwgKExQQ1dTVFIpZmlsZU5hbWVEc3QuR2V0UHRyKCksIGZhbHNlKTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCitib29sIEZYX0ZpbGVfTW92ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQogewogICAgIHJldHVybiA6Ok1vdmVGaWxlQShmaWxlTmFtZVNyYy5HZXRDU3RyKCksIGZpbGVOYW1lRHN0LkdldENTdHIoKSk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfTW92ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQorYm9vbCBGWF9GaWxlX01vdmUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKIHsKICAgICByZXR1cm4gOjpNb3ZlRmlsZVcoKExQQ1dTVFIpZmlsZU5hbWVTcmMuR2V0UHRyKCksIChMUENXU1RSKWZpbGVOYW1lRHN0LkdldFB0cigpKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3dpbmRvd3MuaCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3dpbmRvd3MuaAppbmRleCA4ZGQyY2RkLi40MTRiODYzIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meGNydF93aW5kb3dzLmgKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5oCkBAIC0xNSw4ICsxNSw4IEBACiBwdWJsaWM6CiAgICAgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQoKTsKICAgICB2aXJ0dWFsIH5DRlhDUlRfRmlsZUFjY2Vzc19XaW42NCgpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJT3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJT3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOworICAgIHZpcnR1YWwgYm9vbAkJT3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOworICAgIHZpcnR1YWwgYm9vbAkJT3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOwogICAgIHZpcnR1YWwgdm9pZAkJQ2xvc2UoKTsKICAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKTsKICAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCUdldFNpemUoKSBjb25zdDsKQEAgLTI2LDggKzI2LDggQEAKICAgICB2aXJ0dWFsIHNpemVfdAkJV3JpdGUoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKTsKICAgICB2aXJ0dWFsIHNpemVfdAkJUmVhZFBvcyh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcyk7CiAgICAgdmlydHVhbCBzaXplX3QJCVdyaXRlUG9zKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUZsdXNoKCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpOworICAgIHZpcnR1YWwgYm9vbAkJRmx1c2goKTsKKyAgICB2aXJ0dWFsIGJvb2wJCVRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSk7CiBwcm90ZWN0ZWQ6CiAgICAgdm9pZCoJbV9oRmlsZTsKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC94bWxfaW50LmggYi9jb3JlL3NyYy9meGNydC94bWxfaW50LmgKaW5kZXggMTA5YzdhNC4uZWM4YmRjMiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQveG1sX2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L3htbF9pbnQuaApAQCAtMjMsNyArMjMsNyBAQAogICAgIHsKICAgICAgICAgZGVsZXRlIHRoaXM7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzRU9GKCkKKyAgICB2aXJ0dWFsIGJvb2wJCQlJc0VPRigpCiAgICAgewogICAgICAgICByZXR1cm4gbV9kd0N1clBvcyA+PSBtX2R3U2l6ZTsKICAgICB9CkBAIC0zNSwxNiArMzUsMTYgQEAKICAgICB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlSZWFkTmV4dEJsb2NrKEZYX0JPT0wgYlJlc3RhcnQgPSBGQUxTRSkKKyAgICB2aXJ0dWFsIGJvb2wJCQlSZWFkTmV4dEJsb2NrKGJvb2wgYlJlc3RhcnQgPSBmYWxzZSkKICAgICB7CiAgICAgICAgIGlmIChiUmVzdGFydCkgewogICAgICAgICAgICAgbV9kd0N1clBvcyA9IDA7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fZHdDdXJQb3MgPCBtX2R3U2l6ZSkgewogICAgICAgICAgICAgbV9kd0N1clBvcyA9IG1fZHdTaXplOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgdmlydHVhbCBjb25zdCB1aW50OF90KgkJR2V0QmxvY2tCdWZmZXIoKQogICAgIHsKQEAgLTg1LDcgKzg1LDcgQEAKICAgICB7CiAgICAgICAgIGRlbGV0ZSB0aGlzOwogICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0VPRigpCisgICAgdmlydHVhbCBib29sCQkJSXNFT0YoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fblN0YXJ0ICsgKEZYX0ZJTEVTSVpFKW1fZHdTaXplID49IG1fcEZpbGVSZWFkLT5HZXRTaXplKCk7CiAgICAgfQpAQCAtOTcsNyArOTcsNyBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVJlYWROZXh0QmxvY2soRlhfQk9PTCBiUmVzdGFydCA9IEZBTFNFKQorICAgIHZpcnR1YWwgYm9vbAkJCVJlYWROZXh0QmxvY2soYm9vbCBiUmVzdGFydCA9IGZhbHNlKQogICAgIHsKICAgICAgICAgaWYgKGJSZXN0YXJ0KSB7CiAgICAgICAgICAgICBtX25TdGFydCA9IDA7CkBAIC0xMDUsNyArMTA1LDcgQEAKICAgICAgICAgRlhfRklMRVNJWkUgbkxlbmd0aCA9IG1fcEZpbGVSZWFkLT5HZXRTaXplKCk7CiAgICAgICAgIG1fblN0YXJ0ICs9IChGWF9GSUxFU0laRSltX2R3U2l6ZTsKICAgICAgICAgaWYgKG1fblN0YXJ0ID49IG5MZW5ndGgpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBtX2R3U2l6ZSA9IChzaXplX3QpRlhfTUlOKEZYX1hNTERBVEFTVFJFQU1fQnVmZmVyU2l6ZSwgbkxlbmd0aCAtIG1fblN0YXJ0KTsKICAgICAgICAgaWYgKCFtX3BCdWZmZXIpIHsKQEAgLTEzNiwyOCArMTM2LDI4IEBACiBwdWJsaWM6CiAgICAgfkNYTUxfUGFyc2VyKCk7CiAgICAgSUZYX0J1ZmZlclJlYWQqCW1fcERhdGFBY2M7Ci0gICAgRlhfQk9PTAkJCW1fYk93bmVkU3RyZWFtOworICAgIGJvb2wJCQltX2JPd25lZFN0cmVhbTsKICAgICBGWF9GSUxFU0laRQkJbV9uT2Zmc2V0OwotICAgIEZYX0JPT0wJCQltX2JTYXZlU3BhY2VDaGFyczsKKyAgICBib29sCQkJbV9iU2F2ZVNwYWNlQ2hhcnM7CiAgICAgY29uc3QgdWludDhfdCoJCW1fcEJ1ZmZlcjsKICAgICBzaXplX3QJCQltX2R3QnVmZmVyU2l6ZTsKICAgICBGWF9GSUxFU0laRQkJbV9uQnVmZmVyT2Zmc2V0OwogICAgIHNpemVfdAkJCW1fZHdJbmRleDsKLSAgICBGWF9CT09MCQkJSW5pdCh1aW50OF90KiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci0gICAgRlhfQk9PTAkJCUluaXQoSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQpOwotICAgIEZYX0JPT0wJCQlJbml0KElGWF9CdWZmZXJSZWFkICpwQnVmZmVyKTsKLSAgICBGWF9CT09MCQkJSW5pdChGWF9CT09MIGJPd25kZWRTdHJlYW0pOwotICAgIEZYX0JPT0wJCQlSZWFkTmV4dEJsb2NrKCk7Ci0gICAgRlhfQk9PTAkJCUlzRU9GKCk7Ci0gICAgRlhfQk9PTAkJCUhhdmVBdmFpbERhdGEoKTsKKyAgICBib29sCQkJSW5pdCh1aW50OF90KiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisgICAgYm9vbAkJCUluaXQoSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQpOworICAgIGJvb2wJCQlJbml0KElGWF9CdWZmZXJSZWFkICpwQnVmZmVyKTsKKyAgICBib29sCQkJSW5pdChib29sIGJPd25kZWRTdHJlYW0pOworICAgIGJvb2wJCQlSZWFkTmV4dEJsb2NrKCk7CisgICAgYm9vbAkJCUlzRU9GKCk7CisgICAgYm9vbAkJCUhhdmVBdmFpbERhdGEoKTsKICAgICB2b2lkCQkJU2tpcFdoaXRlU3BhY2VzKCk7CiAgICAgdm9pZAkJCUdldE5hbWUoQ0ZYX0J5dGVTdHJpbmcmIHNwYWNlLCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7CiAgICAgdm9pZAkJCUdldEF0dHJWYWx1ZShDRlhfV2lkZVN0cmluZyAmdmFsdWUpOwogICAgIEZYX0RXT1JECQlHZXRDaGFyUmVmKCk7Ci0gICAgdm9pZAkJCUdldFRhZ05hbWUoQ0ZYX0J5dGVTdHJpbmcgJnNwYWNlLCBDRlhfQnl0ZVN0cmluZyAmbmFtZSwgRlhfQk9PTCAmYkVuZFRhZywgRlhfQk9PTCBiU3RhcnRUYWcgPSBGQUxTRSk7CisgICAgdm9pZAkJCUdldFRhZ05hbWUoQ0ZYX0J5dGVTdHJpbmcgJnNwYWNlLCBDRlhfQnl0ZVN0cmluZyAmbmFtZSwgYm9vbCAmYkVuZFRhZywgYm9vbCBiU3RhcnRUYWcgPSBmYWxzZSk7CiAgICAgdm9pZAkJCVNraXBMaXRlcmFscyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7Ci0gICAgQ1hNTF9FbGVtZW50KglQYXJzZUVsZW1lbnQoQ1hNTF9FbGVtZW50KiBwUGFyZW50LCBGWF9CT09MIGJTdGFydFRhZyA9IEZBTFNFKTsKLSAgICB2b2lkCQkJSW5zZXJ0Q29udGVudFNlZ21lbnQoRlhfQk9PTCBiQ0RBVEEsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudCwgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCk7CisgICAgQ1hNTF9FbGVtZW50KglQYXJzZUVsZW1lbnQoQ1hNTF9FbGVtZW50KiBwUGFyZW50LCBib29sIGJTdGFydFRhZyA9IGZhbHNlKTsKKyAgICB2b2lkCQkJSW5zZXJ0Q29udGVudFNlZ21lbnQoYm9vbCBiQ0RBVEEsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudCwgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCk7CiAgICAgdm9pZAkJCUluc2VydENEQVRBU2VnbWVudChDRlhfVVRGOERlY29kZXImIGRlY29kZXIsIENYTUxfRWxlbWVudCogcEVsZW1lbnQpOwogfTsKIHZvaWQgRlhfWE1MX1NwbGl0UXVhbGlmaWVkTmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRnVsbE5hbWUsIENGWF9CeXRlU3RyaW5nQyAmYnNTcGFjZSwgQ0ZYX0J5dGVTdHJpbmdDICZic05hbWUpOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meF9hZ2dfZHJpdmVyLmggYi9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4X2FnZ19kcml2ZXIuaAppbmRleCAyOWI1NmM3Li5jOGQ2MjAxIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4X2FnZ19kcml2ZXIuaAorKysgYi9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4X2FnZ19kcml2ZXIuaApAQCAtMjIsNyArMjIsNyBAQAogY2xhc3MgQ0ZYX0FnZ0RldmljZURyaXZlciA6IHB1YmxpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyCiB7CiBwdWJsaWM6Ci0gICAgQ0ZYX0FnZ0RldmljZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkaXRoZXJfYml0cywgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQpOworICAgIENGWF9BZ2dEZXZpY2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMsIGJvb2wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBib29sIGJHcm91cEtub2Nrb3V0KTsKICAgICB2aXJ0dWFsIH5DRlhfQWdnRGV2aWNlRHJpdmVyKCk7CiAgICAgdm9pZAkJCQlJbml0UGxhdGZvcm0oKTsKICAgICB2b2lkCQkJCURlc3Ryb3lQbGF0Zm9ybSgpOwpAQCAtMzIsMjIgKzMyLDIyIEBACiAKIAogICAgIHZpcnR1YWwgdm9pZAkJU2F2ZVN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkCQlSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKTsKKyAgICB2aXJ0dWFsIHZvaWQJCVJlc3RvcmVTdGF0ZShib29sIGJLZWVwU2F2ZWQpOwogCiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCBib29sCQlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIHZpcnR1YWwgYm9vbAkJU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCBib29sCQlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCkBAIC01OCw0NCArNTgsNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsCisgICAgdmlydHVhbCBib29sCQlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwKKyAgICB2aXJ0dWFsIGJvb2wJCUZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKIAogCi0gICAgdmlydHVhbCBGWF9CT09MCQlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKKyAgICB2aXJ0dWFsIGJvb2wJCURyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCiAgICAgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpOworICAgIHZpcnR1YWwgYm9vbAkJR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCk7CiAKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBGWF9CT09MIGJERWRnZSA9IEZBTFNFKTsKKyAgICB2aXJ0dWFsIGJvb2wJCUdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgYm9vbCBiREVkZ2UgPSBmYWxzZSk7CiAgICAgdmlydHVhbCBDRlhfRElCaXRtYXAqICAgR2V0QmFja0Ryb3AoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcE9yaURldmljZTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKKyAgICB2aXJ0dWFsIGJvb2wJCVNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisgICAgdmlydHVhbCBib29sCQlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSk7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAorICAgIHZpcnR1YWwgYm9vbAkJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywgdm9pZComIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlDb250aW51ZURJQml0cyh2b2lkKiBoYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICB2aXJ0dWFsIGJvb2wJCUNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpOwogICAgIHZpcnR1YWwgdm9pZAkJQ2FuY2VsRElCaXRzKHZvaWQqIGhhbmRsZSk7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgIERyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAorICAgIHZpcnR1YWwgYm9vbCAgICAgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLCBGWF9GTE9BVCBmb250X3NpemUsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVuZGVyUmFzdGVyaXplcihGWF9OQU1FU1BBQ0VfREVDTEFSRShhZ2csIHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEpJiByYXN0ZXJpemVyLCBGWF9EV09SRCBjb2xvciwgRlhfQk9PTCBiRnVsbENvdmVyLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0LAorICAgIHZpcnR1YWwgYm9vbAkJUmVuZGVyUmFzdGVyaXplcihGWF9OQU1FU1BBQ0VfREVDTEFSRShhZ2csIHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEpJiByYXN0ZXJpemVyLCBGWF9EV09SRCBjb2xvciwgYm9vbCBiRnVsbENvdmVyLCBib29sIGJHcm91cEtub2Nrb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7CiAKICAgICB2b2lkCQkJCVNldENsaXBNYXNrKEZYX05BTUVTUEFDRV9ERUNMQVJFKGFnZywgcmFzdGVyaXplcl9zY2FubGluZV9hYSkmIHJhc3Rlcml6ZXIpOwpAQCAtMTE3LDkgKzExNyw5IEBACiAgICAgdm9pZCoJCQkJbV9wRHdSZW5kZXJUYXJ0Z2V0OwogICAgIGludAkJCQkJbV9GaWxsRmxhZ3M7CiAgICAgaW50CQkJCQltX0RpdGhlckJpdHM7Ci0gICAgRlhfQk9PTAkJCQltX2JSZ2JCeXRlT3JkZXI7CisgICAgYm9vbAkJCQltX2JSZ2JCeXRlT3JkZXI7CiAgICAgQ0ZYX0RJQml0bWFwKiAgICAgICBtX3BPcmlEZXZpY2U7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICBtX2JHcm91cEtub2Nrb3V0OworICAgIGJvb2wgICAgICAgICAgICAgbV9iR3JvdXBLbm9ja291dDsKIH07CiAKICNlbmRpZiAgLy8gRlhfQUdHX0RSSVZFUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4X2FnZ19kcml2ZXIuY3BwIGIvY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4X2FnZ19kcml2ZXIuY3BwCmluZGV4IDExOGRiN2IuLjJmOTZlZjcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYWdnL3NyYy9meF9hZ2dfZHJpdmVyLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2FnZy9zcmMvZnhfYWdnX2RyaXZlci5jcHAKQEAgLTExOSw3ICsxMTksNyBAQAogc3RhdGljIHZvaWQgUmFzdGVyaXplU3Ryb2tlKGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSYgcmFzdGVyaXplciwgYWdnOjpwYXRoX3N0b3JhZ2UmIHBhdGhfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLCBGWF9GTE9BVCBzY2FsZSA9IDEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3Ryb2tlQWRqdXN0ID0gRkFMU0UsIEZYX0JPT0wgYlRleHRNb2RlID0gRkFMU0UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3Ryb2tlQWRqdXN0ID0gZmFsc2UsIGJvb2wgYlRleHRNb2RlID0gZmFsc2UpCiB7CiAgICAgYWdnOjpsaW5lX2NhcF9lIGNhcDsKICAgICBzd2l0Y2ggKHBHcmFwaFN0YXRlLT5tX0xpbmVDYXApIHsKQEAgLTE4NSwxMSArMTg1LDExIEBACiAgICAgICAgIHJhc3Rlcml6ZXIuYWRkX3BhdGhfdHJhbnNmb3JtZWQoc3Ryb2tlLCBwT2JqZWN0MkRldmljZSk7CiAgICAgfQogfQotSUZYX1JlbmRlckRldmljZURyaXZlciogSUZYX1JlbmRlckRldmljZURyaXZlcjo6Q3JlYXRlRnhnZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0KQorSUZYX1JlbmRlckRldmljZURyaXZlciogSUZYX1JlbmRlckRldmljZURyaXZlcjo6Q3JlYXRlRnhnZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGJvb2wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBib29sIGJHcm91cEtub2Nrb3V0KQogewogICAgIHJldHVybiBuZXcgQ0ZYX0FnZ0RldmljZURyaXZlcihwQml0bWFwLCAwLCBiUmdiQnl0ZU9yZGVyLCBwT3JpRGV2aWNlLCBiR3JvdXBLbm9ja291dCk7CiB9Ci1DRlhfQWdnRGV2aWNlRHJpdmVyOjpDRlhfQWdnRGV2aWNlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCkKK0NGWF9BZ2dEZXZpY2VEcml2ZXI6OkNGWF9BZ2dEZXZpY2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMsIGJvb2wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBib29sIGJHcm91cEtub2Nrb3V0KQogewogICAgIG1fcEJpdG1hcCA9IHBCaXRtYXA7CiAgICAgbV9EaXRoZXJCaXRzID0gZGl0aGVyX2JpdHM7CkBAIC0yMTcsMTEgKzIxNywxMSBAQAogdm9pZCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpEZXN0cm95UGxhdGZvcm0oKQogewogfQotRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKK2Jvb2wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6RHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCiAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAjZW5kaWYKIGludCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpHZXREZXZpY2VDYXBzKGludCBjYXBzX2lkKQpAQCAtMjY3LDcgKzI2Nyw3IEBACiAgICAgfQogICAgIG1fU3RhdGVTdGFjay5BZGQocENsaXApOwogfQotdm9pZCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKQordm9pZCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpSZXN0b3JlU3RhdGUoYm9vbCBiS2VlcFNhdmVkKQogewogICAgIGlmIChtX1N0YXRlU3RhY2suR2V0U2l6ZSgpID09IDApIHsKICAgICAgICAgZGVsZXRlIG1fcENsaXBSZ247CkBAIC0zMDcsNyArMzA3LDcgQEAKICAgICBhZ2c6OnJlbmRlcl9zY2FubGluZXMocmFzdGVyaXplciwgc2NhbmxpbmUsIGZpbmFsX3JlbmRlciwgKG1fRmlsbEZsYWdzICYgRlhGSUxMX05PUEFUSFNNT09USCkgIT0gMCk7CiAgICAgbV9wQ2xpcFJnbi0+SW50ZXJzZWN0TWFza0YocGF0aF9yZWN0LmxlZnQsIHBhdGhfcmVjdC50b3AsIG1hc2spOwogfQotRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgaW50IGZpbGxfbW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQpAQCAtMzIyLDcgKzMyMiw3IEBACiAgICAgICAgICAgICByZWN0Zi5JbnRlcnNlY3QoQ0ZYX0Zsb2F0UmVjdCgwLCAwLCAoRlhfRkxPQVQpR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSwgKEZYX0ZMT0FUKUdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7CiAgICAgICAgICAgICBGWF9SRUNUIHJlY3QgPSByZWN0Zi5HZXRPdXR0ZXJSZWN0KCk7CiAgICAgICAgICAgICBtX3BDbGlwUmduLT5JbnRlcnNlY3RSZWN0KHJlY3QpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICBDQWdnX1BhdGhEYXRhIHBhdGhfZGF0YTsKQEAgLTMzMyw5ICszMzMsOSBAQAogICAgIHJhc3Rlcml6ZXIuYWRkX3BhdGgocGF0aF9kYXRhLm1fUGF0aERhdGEpOwogICAgIHJhc3Rlcml6ZXIuZmlsbGluZ19ydWxlKChmaWxsX21vZGUgJiAzKSA9PSBGWEZJTExfV0lORElORyA/IGFnZzo6ZmlsbF9ub25femVybyA6IGFnZzo6ZmlsbF9ldmVuX29kZCk7CiAgICAgU2V0Q2xpcE1hc2socmFzdGVyaXplcik7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKK2Jvb2wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCkBAIC0zNTAsNyArMzUwLDcgQEAKICAgICBSYXN0ZXJpemVTdHJva2UocmFzdGVyaXplciwgcGF0aF9kYXRhLm1fUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBwR3JhcGhTdGF0ZSk7CiAgICAgcmFzdGVyaXplci5maWxsaW5nX3J1bGUoYWdnOjpmaWxsX25vbl96ZXJvKTsKICAgICBTZXRDbGlwTWFzayhyYXN0ZXJpemVyKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGNsYXNzIENGWF9SZW5kZXJlciAKIHsKQEAgLTM2MSw4ICszNjEsOCBAQAogICAgICAgICAgICAgICAgIG1fQmx1ZSwKICAgICAgICAgICAgICAgICBtX0dyYXk7CiAgICAgRlhfRFdPUkQJbV9Db2xvcjsKLSAgICBGWF9CT09MCQltX2JGdWxsQ292ZXI7Ci0gICAgRlhfQk9PTCAgICAgbV9iUmdiQnl0ZU9yZGVyOworICAgIGJvb2wJCW1fYkZ1bGxDb3ZlcjsKKyAgICBib29sICAgICBtX2JSZ2JCeXRlT3JkZXI7CiAgICAgQ0ZYX0RJQml0bWFwKiBtX3BPcmlEZXZpY2U7CiAgICAgRlhfUkVDVAkJbV9DbGlwQm94OwogICAgIGNvbnN0IENGWF9ESUJpdG1hcCoJbV9wQ2xpcE1hc2s7CkBAIC0zNzEsNyArMzcxLDcgQEAKICAgICB2b2lkIChDRlhfUmVuZGVyZXI6Oipjb21wb3NpdGVfc3BhbikodWludDhfdCosIGludCwgaW50LCBpbnQsIHVpbnQ4X3QqLCBpbnQsIGludCwgdWludDhfdCosIHVpbnQ4X3QqKTsKIHB1YmxpYzoKICAgICB2b2lkIHByZXBhcmUodW5zaWduZWQpIHt9Ci0gICAgdm9pZCBDb21wb3NpdGVTcGFuKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4sIGludCBCcHAsIEZYX0JPT0wgYkRlc3RBbHBoYSwKKyAgICB2b2lkIENvbXBvc2l0ZVNwYW4odWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbiwgaW50IEJwcCwgYm9vbCBiRGVzdEFscGhhLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIHVpbnQ4X3QqIGNvdmVyX3NjYW4sCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4pCiAgICAgewpAQCAtOTU1LDcgKzk1NSw3IEBACiAgICAgICAgICAgICBvcmlfc2NhbiA9IG1fcE9yaURldmljZS0+R2V0QnVmZmVyKCkgKyBtX3BPcmlEZXZpY2UtPkdldFBpdGNoKCkgKiB5OwogICAgICAgICB9CiAgICAgICAgIGludCBCcHAgPSBtX3BEZXZpY2UtPkdldEJQUCgpIC8gODsKLSAgICAgICAgRlhfQk9PTCBiRGVzdEFscGhhID0gbV9wRGV2aWNlLT5IYXNBbHBoYSgpIHx8IG1fcERldmljZS0+SXNBbHBoYU1hc2soKTsKKyAgICAgICAgYm9vbCBiRGVzdEFscGhhID0gbV9wRGV2aWNlLT5IYXNBbHBoYSgpIHx8IG1fcERldmljZS0+SXNBbHBoYU1hc2soKTsKICAgICAgICAgdW5zaWduZWQgbnVtX3NwYW5zID0gc2wubnVtX3NwYW5zKCk7CiAgICAgICAgIHR5cGVuYW1lIFNjYW5saW5lOjpjb25zdF9pdGVyYXRvciBzcGFuID0gc2wuYmVnaW4oKTsKICAgICAgICAgd2hpbGUgKDEpIHsKQEAgLTk4OCw3ICs5ODgsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgRlhfQk9PTCBJbml0KENGWF9ESUJpdG1hcCogcERldmljZSwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX0RXT1JEIGNvbG9yLCBGWF9CT09MIGJGdWxsQ292ZXIsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwKKyAgICBib29sIEluaXQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwgRlhfRFdPUkQgY29sb3IsIGJvb2wgYkZ1bGxDb3ZlciwgYm9vbCBiUmdiQnl0ZU9yZGVyLAogICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKQogICAgIHsKICAgICAgICAgbV9wRGV2aWNlID0gcERldmljZTsKQEAgLTEwMDgsOCArMTAwOCw4IEBACiAgICAgICAgICAgICBtX3BDbGlwTWFzayA9IG1fcENsaXBSZ24tPkdldE1hc2soKTsKICAgICAgICAgfQogICAgICAgICBtX2JGdWxsQ292ZXIgPSBiRnVsbENvdmVyOwotICAgICAgICBGWF9CT09MIGJPYmplY3RDTVlLID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKTsKLSAgICAgICAgRlhfQk9PTCBiRGV2aWNlQ01ZSyA9IHBEZXZpY2UtPklzQ215a0ltYWdlKCk7CisgICAgICAgIGJvb2wgYk9iamVjdENNWUsgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpOworICAgICAgICBib29sIGJEZXZpY2VDTVlLID0gcERldmljZS0+SXNDbXlrSW1hZ2UoKTsKICAgICAgICAgbV9BbHBoYSA9IGJPYmplY3RDTVlLID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShjb2xvcik7CiAgICAgICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBOVUxMOwogICAgICAgICBpZiAoIUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCkgfHwgIUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpKSB7CkBAIC0xMDM5LDcgKzEwMzksNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoYkRldmljZUNNWUspIHsKICAgICAgICAgICAgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKQEAgLTEwNTEsNyArMTA1MSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoIXBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJm1fQ29sb3IsIChjb25zdCB1aW50OF90KikmY29sb3IsIDEpOwpAQCAtMTEwMCwyMiArMTEwMCwyMiBAQAogICAgICAgICBpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSAxKSB7CiAgICAgICAgICAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW4xYnBwOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiB9OwotRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpSZW5kZXJSYXN0ZXJpemVyKGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSYgcmFzdGVyaXplciwgRlhfRFdPUkQgY29sb3IsIEZYX0JPT0wgYkZ1bGxDb3ZlciwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCwKK2Jvb2wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6UmVuZGVyUmFzdGVyaXplcihhZ2c6OnJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIsIEZYX0RXT1JEIGNvbG9yLCBib29sIGJGdWxsQ292ZXIsIGJvb2wgYkdyb3VwS25vY2tvdXQsCiAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIENGWF9ESUJpdG1hcCogcHQgPSBiR3JvdXBLbm9ja291dCA/IG1fcE9yaURldmljZSA6IE5VTEw7CiAgICAgQ0ZYX1JlbmRlcmVyIHJlbmRlcjsKICAgICBpZiAoIXJlbmRlci5Jbml0KG1fcEJpdG1hcCwgcHQsIG1fcENsaXBSZ24sIGNvbG9yLCBiRnVsbENvdmVyLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBhZ2c6OnNjYW5saW5lX3U4IHNjYW5saW5lOwogICAgIGFnZzo6cmVuZGVyX3NjYW5saW5lcyhyYXN0ZXJpemVyLCBzY2FubGluZSwgcmVuZGVyLCAobV9GaWxsRmxhZ3MgJiBGWEZJTExfTk9QQVRIU01PT1RIKSAhPSAwKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wJQ0ZYX0FnZ0RldmljZURyaXZlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCitib29sCUNGWF9BZ2dEZXZpY2VEcml2ZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKQEAgLTExMjcsMTAgKzExMjcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7CiAgICAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoR2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIG1fRmlsbEZsYWdzID0gZmlsbF9tb2RlOwogICAgIGlmICgoZmlsbF9tb2RlICYgMykgJiYgZmlsbF9jb2xvcikgewpAQCAtMTE0MCw4ICsxMTQwLDggQEAKICAgICAgICAgcmFzdGVyaXplci5jbGlwX2JveCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7CiAgICAgICAgIHJhc3Rlcml6ZXIuYWRkX3BhdGgocGF0aF9kYXRhLm1fUGF0aERhdGEpOwogICAgICAgICByYXN0ZXJpemVyLmZpbGxpbmdfcnVsZSgoZmlsbF9tb2RlICYgMykgPT0gRlhGSUxMX1dJTkRJTkcgPyBhZ2c6OmZpbGxfbm9uX3plcm8gOiBhZ2c6OmZpbGxfZXZlbl9vZGQpOwotICAgICAgICBpZiAoIVJlbmRlclJhc3Rlcml6ZXIocmFzdGVyaXplciwgZmlsbF9jb2xvciwgZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUiwgRkFMU0UsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghUmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyLCBmaWxsX2NvbG9yLCBmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSLCBmYWxzZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBpbnQgc3Ryb2tlX2FscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShzdHJva2VfY29sb3IpOwpAQCAtMTE1MSwxMiArMTE1MSwxMiBAQAogICAgICAgICAgICAgcGF0aF9kYXRhLkJ1aWxkUGF0aChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlKTsKICAgICAgICAgICAgIGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSByYXN0ZXJpemVyOwogICAgICAgICAgICAgcmFzdGVyaXplci5jbGlwX2JveCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7Ci0gICAgICAgICAgICBSYXN0ZXJpemVTdHJva2UocmFzdGVyaXplciwgcGF0aF9kYXRhLm1fUGF0aERhdGEsIE5VTEwsIHBHcmFwaFN0YXRlLCAxLCBGQUxTRSwgZmlsbF9tb2RlICYgRlhfU1RST0tFX1RFWFRfTU9ERSk7CisgICAgICAgICAgICBSYXN0ZXJpemVTdHJva2UocmFzdGVyaXplciwgcGF0aF9kYXRhLm1fUGF0aERhdGEsIE5VTEwsIHBHcmFwaFN0YXRlLCAxLCBmYWxzZSwgZmlsbF9tb2RlICYgRlhfU1RST0tFX1RFWFRfTU9ERSk7CiAgICAgICAgICAgICBpbnQgZmlsbF9mbGFnID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA8PCA4IHwgRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKTsKICAgICAgICAgICAgIGlmICghUmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyLCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIsIG1fYkdyb3VwS25vY2tvdXQsIGZpbGxfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDEsIG1hdHJpeDI7CiAgICAgICAgIGlmIChwT2JqZWN0MkRldmljZSkgewpAQCAtMTE3NCwxMyArMTE3NCwxMyBAQAogICAgICAgICBwYXRoX2RhdGEuQnVpbGRQYXRoKHBQYXRoRGF0YSwgJm1hdHJpeDEpOwogICAgICAgICBhZ2c6OnJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEgcmFzdGVyaXplcjsKICAgICAgICAgcmFzdGVyaXplci5jbGlwX2JveCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7Ci0gICAgICAgIFJhc3Rlcml6ZVN0cm9rZShyYXN0ZXJpemVyLCBwYXRoX2RhdGEubV9QYXRoRGF0YSwgJm1hdHJpeDIsIHBHcmFwaFN0YXRlLCBtYXRyaXgxLmEsIEZBTFNFLCBmaWxsX21vZGUgJiBGWF9TVFJPS0VfVEVYVF9NT0RFKTsKKyAgICAgICAgUmFzdGVyaXplU3Ryb2tlKHJhc3Rlcml6ZXIsIHBhdGhfZGF0YS5tX1BhdGhEYXRhLCAmbWF0cml4MiwgcEdyYXBoU3RhdGUsIG1hdHJpeDEuYSwgZmFsc2UsIGZpbGxfbW9kZSAmIEZYX1NUUk9LRV9URVhUX01PREUpOwogICAgICAgICBpbnQgZmlsbF9mbGFnID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA8PCA4IHwgRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKTsKICAgICAgICAgaWYgKCFSZW5kZXJSYXN0ZXJpemVyKHJhc3Rlcml6ZXIsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUiwgbV9iR3JvdXBLbm9ja291dCwgZmlsbF9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBSZ2JCeXRlT3JkZXJTZXRQaXhlbChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCB4LCBpbnQgeSwgRlhfRFdPUkQgYXJnYikKIHsKQEAgLTEyMDgsNyArMTIwOCw3IEBACiAgICAgd2lkdGggPSByZWN0LldpZHRoKCk7CiAgICAgaW50IHNyY19yID0gRlhBUkdCX1IoYXJnYiksIHNyY19nID0gRlhBUkdCX0coYXJnYiksIHNyY19iID0gRlhBUkdCX0IoYXJnYik7CiAgICAgaW50IEJwcCA9IHBCaXRtYXAtPkdldEJQUCgpIC8gODsKLSAgICBGWF9CT09MIGJBbHBoYSA9IHBCaXRtYXAtPkhhc0FscGhhKCk7CisgICAgYm9vbCBiQWxwaGEgPSBwQml0bWFwLT5IYXNBbHBoYSgpOwogICAgIGludCBkaWJfYXJnYiA9IEZYQVJHQl9UT0JHUk9SREVSRElCKGFyZ2IpOwogICAgIHVpbnQ4X3QqIHBCdWZmZXIgPSBwQml0bWFwLT5HZXRCdWZmZXIoKTsKICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewpAQCAtMTMxNyw3ICsxMzE3LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBU1NFUlQoRkFMU0UpOworICAgICAgICAgICAgQVNTRVJUKGZhbHNlKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYiB8fCBkZXN0X2Zvcm1hdCA9PSBGWERJQl9SZ2IzMikgewogICAgICAgICBpZiAoc3JjX2Zvcm1hdCA9PSBGWERJQl9SZ2IpIHsKQEAgLTEzNTEsNyArMTM1MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBBU1NFUlQoRkFMU0UpOworICAgICAgICBBU1NFUlQoZmFsc2UpOwogICAgIH0KIH0KIEZYX0FSR0IgX0RlZmF1bHRDTVlLMkFSR0IoRlhfQ01ZSyBjbXlrLCB1aW50OF90IGFscGhhKQpAQCAtMTM2MSw5ICsxMzYxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgciwgZywgYik7CiAgICAgcmV0dXJuIEFyZ2JFbmNvZGUoYWxwaGEsIHIsIGcsIGIpOwogfQotRlhfQk9PTCBfRGliU2V0UGl4ZWwoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKK2Jvb2wgX0RpYlNldFBpeGVsKENGWF9ESUJpdG1hcCogcERldmljZSwgaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7Ci0gICAgRlhfQk9PTCBiT2JqQ01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7CisgICAgYm9vbCBiT2JqQ01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7CiAgICAgaW50IGFscGhhID0gYk9iakNNWUsgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKGNvbG9yKTsKICAgICBpZiAocEljY1RyYW5zZm9ybSkgewogICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CkBAIC0xMzc2LDcgKzEzNzYsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChwRGV2aWNlLT5Jc0NteWtJbWFnZSgpKSB7CiAgICAgICAgICAgICBpZiAoIWJPYmpDTVlLKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChiT2JqQ01ZSykgewpAQCAtMTM4OCwxMiArMTM4OCwxMiBAQAogICAgIGlmIChwRGV2aWNlLT5tX3BBbHBoYU1hc2spIHsKICAgICAgICAgcERldmljZS0+bV9wQWxwaGFNYXNrLT5TZXRQaXhlbCh4LCB5LCBhbHBoYSA8PCAyNCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKK2Jvb2wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6U2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgaWYgKG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmICghQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSB8fCAhQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCkpIHsKICAgICAgICAgcEljY1RyYW5zZm9ybSA9IE5VTEw7CkBAIC0xNDEzLDEyICsxNDEzLDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobV9wQ2xpcFJnbi0+R2V0VHlwZSgpID09IENGWF9DbGlwUmduOjpNYXNrRikgewogICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IG1fcENsaXBSZ24tPkdldE1hc2soKTsKLSAgICAgICAgICAgIEZYX0JPT0wgYkNNWUsgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpOworICAgICAgICAgICAgYm9vbCBiQ01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7CiAgICAgICAgICAgICBpbnQgbmV3X2FscGhhID0gYkNNWUsgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKGNvbG9yKTsKICAgICAgICAgICAgIG5ld19hbHBoYSA9IG5ld19hbHBoYSAqIHBNYXNrLT5HZXRTY2FubGluZSh5KVt4XSAvIDI1NTsKICAgICAgICAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKICAgICAgICAgICAgICAgICBSZ2JCeXRlT3JkZXJTZXRQaXhlbChtX3BCaXRtYXAsIHgsIHksIChjb2xvciAmIDB4ZmZmZmZmKSB8IChuZXdfYWxwaGEgPDwgMjQpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChiQ01ZSykgewogICAgICAgICAgICAgICAgIEZYU0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcsIG5ld19hbHBoYSk7CkBAIC0xNDI4LDE1ICsxNDI4LDE1IEBACiAgICAgICAgICAgICByZXR1cm4gX0RpYlNldFBpeGVsKG1fcEJpdG1hcCwgeCwgeSwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQorYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogewogICAgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIEZYX1JFQ1QgY2xpcF9yZWN0OwogICAgIEdldENsaXBCb3goJmNsaXBfcmVjdCk7CkBAIC0xNDQ1LDcgKzE0NDUsNyBAQAogICAgICAgICBkcmF3X3JlY3QuSW50ZXJzZWN0KCpwUmVjdCk7CiAgICAgfQogICAgIGlmIChkcmF3X3JlY3QuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKG1fcENsaXBSZ24gPT0gTlVMTCB8fCBtX3BDbGlwUmduLT5HZXRUeXBlKCkgPT0gQ0ZYX0NsaXBSZ246OlJlY3RJKSB7CiAgICAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKQEAgLTE0NTMsMjcgKzE0NTMsMjcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1fcEJpdG1hcC0+Q29tcG9zaXRlUmVjdChkcmF3X3JlY3QubGVmdCwgZHJhd19yZWN0LnRvcCwgZHJhd19yZWN0LldpZHRoKCksIGRyYXdfcmVjdC5IZWlnaHQoKSwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBtX3BCaXRtYXAtPkNvbXBvc2l0ZU1hc2soZHJhd19yZWN0LmxlZnQsIGRyYXdfcmVjdC50b3AsIGRyYXdfcmVjdC5XaWR0aCgpLCBkcmF3X3JlY3QuSGVpZ2h0KCksIChjb25zdCBDRlhfRElCaXRtYXAqKW1fcENsaXBSZ24tPkdldE1hc2soKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9jb2xvciwgZHJhd19yZWN0LmxlZnQgLSBjbGlwX3JlY3QubGVmdCwgZHJhd19yZWN0LnRvcCAtIGNsaXBfcmVjdC50b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgbV9iUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkKK2Jvb2wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkKIHsKICAgICBpZiAobV9wQ2xpcFJnbiA9PSBOVUxMKSB7CiAgICAgICAgIHBSZWN0LT5sZWZ0ID0gcFJlY3QtPnRvcCA9IDA7CiAgICAgICAgIHBSZWN0LT5yaWdodCA9IEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCk7CiAgICAgICAgIHBSZWN0LT5ib3R0b20gPSBHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICAqcFJlY3QgPSBtX3BDbGlwUmduLT5HZXRCb3goKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wJQ0ZYX0FnZ0RldmljZURyaXZlcjo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIEZYX0JPT0wgYkRFZGdlKQorYm9vbAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSwgYm9vbCBiREVkZ2UpCiB7CiAgICAgaWYgKG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChiREVkZ2UpIHsKICAgICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgewpAQCAtMTQ4MSwyMyArMTQ4MSwyMyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIHBCaXRtYXAtPlRyYW5zZmVyQml0bWFwKDAsIDAsIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpLCBtX3BCaXRtYXAsIGxlZnQsIHRvcCwgcEljY1RyYW5zZm9ybSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBGWF9SRUNUIHJlY3QobGVmdCwgdG9wLCBsZWZ0ICsgcEJpdG1hcC0+R2V0V2lkdGgoKSwgdG9wICsgcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOwogICAgIENGWF9ESUJpdG1hcCAqcEJhY2sgPSBOVUxMOwogICAgIGlmIChtX3BPcmlEZXZpY2UpIHsKICAgICAgICAgcEJhY2sgPSBtX3BPcmlEZXZpY2UtPkNsb25lKCZyZWN0KTsKICAgICAgICAgaWYgKCFwQmFjaykgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBwQmFjay0+Q29tcG9zaXRlQml0bWFwKDAsIDAsIHBCYWNrLT5HZXRXaWR0aCgpLCBwQmFjay0+R2V0SGVpZ2h0KCksIG1fcEJpdG1hcCwgMCwgMCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcEJhY2sgPSBtX3BCaXRtYXAtPkNsb25lKCZyZWN0KTsKICAgICB9CiAgICAgaWYgKCFwQmFjaykgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIEZYX0JPT0wgYlJldCA9IFRSVUU7CisgICAgYm9vbCBiUmV0ID0gdHJ1ZTsKICAgICBsZWZ0ID0gbGVmdCA+PSAwID8gMCA6IGxlZnQ7CiAgICAgdG9wID0gdG9wID49IDAgPyAwIDogdG9wOwogICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKQEAgLTE1MDgsMTEgKzE1MDgsMTEgQEAKICAgICBkZWxldGUgcEJhY2s7CiAgICAgcmV0dXJuIGJSZXQ7CiB9Ci1GWF9CT09MCUNGWF9BZ2dEZXZpY2VEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBhcmdiLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAorYm9vbAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgYXJnYiwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChtX3BCaXRtYXAtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAocEJpdG1hcC0+SXNBbHBoYU1hc2soKSkKICAgICAgICAgcmV0dXJuIG1fcEJpdG1hcC0+Q29tcG9zaXRlTWFzayhsZWZ0LCB0b3AsIHBTcmNSZWN0LT5XaWR0aCgpLCBwU3JjUmVjdC0+SGVpZ2h0KCksIHBCaXRtYXAsIGFyZ2IsCkBAIC0xNTIwLDEyICsxNTIwLDEyIEBACiAgICAgcmV0dXJuIG1fcEJpdG1hcC0+Q29tcG9zaXRlQml0bWFwKGxlZnQsIHRvcCwgcFNyY1JlY3QtPldpZHRoKCksIHBTcmNSZWN0LT5IZWlnaHQoKSwgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY1JlY3QtPmxlZnQsIHBTcmNSZWN0LT50b3AsIGJsZW5kX3R5cGUsIG1fcENsaXBSZ24sIG1fYlJnYkJ5dGVPcmRlciwgcEljY1RyYW5zZm9ybSk7CiB9Ci1GWF9CT09MCUNGWF9BZ2dEZXZpY2VEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgYXJnYiwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorYm9vbAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGFyZ2IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogewogICAgIGlmIChtX3BCaXRtYXAtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoZGVzdF93aWR0aCA9PSBwU291cmNlLT5HZXRXaWR0aCgpICYmIGRlc3RfaGVpZ2h0ID09IHBTb3VyY2UtPkdldEhlaWdodCgpKSB7CiAgICAgICAgIEZYX1JFQ1QgcmVjdCgwLCAwLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCk7CkBAIC0xNTM2LDMwICsxNTM2LDMwIEBACiAgICAgRlhfUkVDVCBkZXN0X2NsaXAgPSBkZXN0X3JlY3Q7CiAgICAgZGVzdF9jbGlwLkludGVyc2VjdCgqcENsaXBSZWN0KTsKICAgICBDRlhfQml0bWFwQ29tcG9zZXIgY29tcG9zZXI7Ci0gICAgY29tcG9zZXIuQ29tcG9zZShtX3BCaXRtYXAsIG1fcENsaXBSZ24sIDI1NSwgYXJnYiwgZGVzdF9jbGlwLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpOworICAgIGNvbXBvc2VyLkNvbXBvc2UobV9wQml0bWFwLCBtX3BDbGlwUmduLCAyNTUsIGFyZ2IsIGRlc3RfY2xpcCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgbV9iUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKICAgICBkZXN0X2NsaXAuT2Zmc2V0KC1kZXN0X3JlY3QubGVmdCwgLWRlc3RfcmVjdC50b3ApOwogICAgIENGWF9JbWFnZVN0cmV0Y2hlciBzdHJldGNoZXI7CiAgICAgaWYgKHN0cmV0Y2hlci5TdGFydCgmY29tcG9zZXIsIHBTb3VyY2UsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBkZXN0X2NsaXAsIGZsYWdzKSkgewogICAgICAgICBzdHJldGNoZXIuQ29udGludWUoTlVMTCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBhcmdiLAorYm9vbAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBhcmdiLAogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCByZW5kZXJfZmxhZ3MsIHZvaWQqJiBoYW5kbGUsCiAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKIHsKICAgICBpZiAobV9wQml0bWFwLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQ0ZYX0ltYWdlUmVuZGVyZXIqIHBSZW5kZXJlciA9IG5ldyBDRlhfSW1hZ2VSZW5kZXJlcjsKICAgICBwUmVuZGVyZXItPlN0YXJ0KG1fcEJpdG1hcCwgbV9wQ2xpcFJnbiwgcFNvdXJjZSwgYml0bWFwX2FscGhhLCBhcmdiLCBwTWF0cml4LCByZW5kZXJfZmxhZ3MsIG1fYlJnYkJ5dGVPcmRlciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiAgICAgaGFuZGxlID0gcFJlbmRlcmVyOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpDb250aW51ZURJQml0cyh2b2lkKiBwSGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkKK2Jvb2wJQ0ZYX0FnZ0RldmljZURyaXZlcjo6Q29udGludWVESUJpdHModm9pZCogcEhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaWYgKG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiAoKENGWF9JbWFnZVJlbmRlcmVyKilwSGFuZGxlKS0+Q29udGludWUocFBhdXNlKTsKIH0KQEAgLTE1NzIsMzAgKzE1NzIsMzAgQEAKIH0KIENGWF9GeGdlRGV2aWNlOjpDRlhfRnhnZURldmljZSgpCiB7Ci0gICAgbV9iT3duZWRCaXRtYXAgPSBGQUxTRTsKKyAgICBtX2JPd25lZEJpdG1hcCA9IGZhbHNlOwogfQotRlhfQk9PTCBDRlhfRnhnZURldmljZTo6QXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCkKK2Jvb2wgQ0ZYX0Z4Z2VEZXZpY2U6OkF0dGFjaChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkaXRoZXJfYml0cywgYm9vbCBiUmdiQnl0ZU9yZGVyLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIGJvb2wgYkdyb3VwS25vY2tvdXQpCiB7CiAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgU2V0Qml0bWFwKHBCaXRtYXApOwogICAgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBuZXcgQ0ZYX0FnZ0RldmljZURyaXZlcihwQml0bWFwLCBkaXRoZXJfYml0cywgYlJnYkJ5dGVPcmRlciwgcE9yaURldmljZSwgYkdyb3VwS25vY2tvdXQpOwogICAgIFNldERldmljZURyaXZlcihwRHJpdmVyKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX0Z4Z2VEZXZpY2U6OkNyZWF0ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQsIGludCBkaXRoZXJfYml0cywgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlKQorYm9vbCBDRlhfRnhnZURldmljZTo6Q3JlYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IGZvcm1hdCwgaW50IGRpdGhlcl9iaXRzLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UpCiB7Ci0gICAgbV9iT3duZWRCaXRtYXAgPSBUUlVFOworICAgIG1fYk93bmVkQml0bWFwID0gdHJ1ZTsKICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOwogICAgIGlmICghcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCkpIHsKICAgICAgICAgZGVsZXRlIHBCaXRtYXA7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBTZXRCaXRtYXAocEJpdG1hcCk7Ci0gICAgSUZYX1JlbmRlckRldmljZURyaXZlciogcERyaXZlciA9IG5ldyBDRlhfQWdnRGV2aWNlRHJpdmVyKHBCaXRtYXAsIGRpdGhlcl9iaXRzLCBGQUxTRSwgcE9yaURldmljZSwgRkFMU0UpOworICAgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBuZXcgQ0ZYX0FnZ0RldmljZURyaXZlcihwQml0bWFwLCBkaXRoZXJfYml0cywgZmFsc2UsIHBPcmlEZXZpY2UsIGZhbHNlKTsKICAgICBTZXREZXZpY2VEcml2ZXIocERyaXZlcik7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBDRlhfRnhnZURldmljZTo6fkNGWF9GeGdlRGV2aWNlKCkKIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnQuY3BwIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5jcHAKaW5kZXggMmRhZDAxMC4uZjVhYzZjMCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5jcHAKQEAgLTg3LDIzICs4NywyMyBAQAogICAgIH0KICAgICByZXR1cm4gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIobV9GYWNlKSk7CiB9Ci1GWF9CT09MIENGUEZfU2tpYUZvbnQ6OkdldEdseXBoQkJveChpbnQzMl90IGlHbHlwaEluZGV4LCBGWF9SRUNUICZydEJCb3gpCitib29sIENGUEZfU2tpYUZvbnQ6OkdldEdseXBoQkJveChpbnQzMl90IGlHbHlwaEluZGV4LCBGWF9SRUNUICZydEJCb3gpCiB7CiAgICAgaWYgKCFtX0ZhY2UpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChGWEZUX0lzX0ZhY2VfVHJpY2t5KG1fRmFjZSkpIHsKICAgICAgICAgaWYgKEZYRlRfU2V0X0NoYXJfU2l6ZShtX0ZhY2UsIDAsIDEwMDAgKiA2NCwgNzIsIDcyKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChGWEZUX0xvYWRfR2x5cGgobV9GYWNlLCBpR2x5cGhJbmRleCwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCkpIHsKICAgICAgICAgICAgIEZYRlRfU2V0X1BpeGVsX1NpemVzKG1fRmFjZSwgMCwgNjQpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIEZYRlRfR2x5cGggZ2x5cGg7CiAgICAgICAgIGlmIChGWEZUX0dldF9HbHlwaChtX0ZhY2UtPmdseXBoLCAmZ2x5cGgpKSB7CiAgICAgICAgICAgICBGWEZUX1NldF9QaXhlbF9TaXplcyhtX0ZhY2UsIDAsIDY0KTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBGWEZUX0JCb3ggY2JveDsKICAgICAgICAgRlhGVF9HbHlwaF9HZXRfQ0JveChnbHlwaCwgRlhGVF9HTFlQSF9CQk9YX1BJWEVMUywgJmNib3gpOwpAQCAtMTE5LDI0ICsxMTksMjQgQEAKICAgICAgICAgcmV0dXJuIEZYRlRfU2V0X1BpeGVsX1NpemVzKG1fRmFjZSwgMCwgNjQpID09IDA7CiAgICAgfQogICAgIGlmIChGWEZUX0xvYWRfR2x5cGgobV9GYWNlLCBpR2x5cGhJbmRleCwgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJ0QkJveC5sZWZ0ID0gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKG1fRmFjZSkpOwogICAgIHJ0QkJveC5ib3R0b20gPSBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1kobV9GYWNlKSk7CiAgICAgcnRCQm94LnJpZ2h0ID0gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKG1fRmFjZSkgKyBGWEZUX0dldF9HbHlwaF9XaWR0aChtX0ZhY2UpKTsKICAgICBydEJCb3gudG9wID0gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKG1fRmFjZSkgLSBGWEZUX0dldF9HbHlwaF9IZWlnaHQobV9GYWNlKSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGUEZfU2tpYUZvbnQ6OkdldEJCb3goRlhfUkVDVCAmcnRCQm94KQorYm9vbCBDRlBGX1NraWFGb250OjpHZXRCQm94KEZYX1JFQ1QgJnJ0QkJveCkKIHsKICAgICBpZiAoIW1fRmFjZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcnRCQm94LmxlZnQgPSBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9GYWNlX3hNaW4obV9GYWNlKSk7CiAgICAgcnRCQm94LnRvcCA9IEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0ZhY2VfeU1pbihtX0ZhY2UpKTsKICAgICBydEJCb3gucmlnaHQgPSBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9GYWNlX3hNYXgobV9GYWNlKSk7CiAgICAgcnRCQm94LmJvdHRvbSA9IEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0ZhY2VfeU1heChtX0ZhY2UpKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGludDMyX3QgQ0ZQRl9Ta2lhRm9udDo6R2V0SGVpZ2h0KCkgY29uc3QKIHsKQEAgLTE2NywxMCArMTY3LDEwIEBACiAgICAgfQogICAgIHJldHVybiBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9EV09SRD4odWxTaXplKTsKIH0KLUZYX0JPT0wgQ0ZQRl9Ta2lhRm9udDo6SW5pdEZvbnQoQ0ZQRl9Ta2lhRm9udE1nciAqcEZvbnRNZ3IsIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yICpwRm9udERlcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhbWlseSwgRlhfRFdPUkQgZHdTdHlsZSwgdWludDhfdCB1Q2hhcnNldCkKK2Jvb2wgQ0ZQRl9Ta2lhRm9udDo6SW5pdEZvbnQoQ0ZQRl9Ta2lhRm9udE1nciAqcEZvbnRNZ3IsIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yICpwRm9udERlcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhbWlseSwgRlhfRFdPUkQgZHdTdHlsZSwgdWludDhfdCB1Q2hhcnNldCkKIHsKICAgICBpZiAoIXBGb250TWdyIHx8ICFwRm9udERlcykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgc3dpdGNoIChwRm9udERlcy0+R2V0VHlwZSgpKSB7CiAgICAgICAgIGNhc2UgRlBGX1NLSUFGT05UVFlQRV9QYXRoOiB7CkBAIC0xODksMTYgKzE4OSwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghbV9GYWNlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX2R3U3R5bGUgPSBkd1N0eWxlOwogICAgIG1fdUNoYXJzZXQgPSB1Q2hhcnNldDsKICAgICBtX3BGb250TWdyID0gcEZvbnRNZ3I7CiAgICAgbV9wRm9udERlcyA9IHBGb250RGVzOwogICAgIG1fZHdSZWZDb3VudCA9IDE7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnQuaCBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnQuaAppbmRleCA0OTgxOWQ0Li45MGNmNWNiIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250LmgKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5oCkBAIC0zOSwxMyArMzksMTMgQEAKICAgICB2aXJ0dWFsIGludDMyX3QJCUdldEFzY2VudCgpIGNvbnN0OwogICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0RGVzY2VudCgpIGNvbnN0OwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJR2V0R2x5cGhCQm94KGludDMyX3QgaUdseXBoSW5kZXgsIEZYX1JFQ1QgJnJ0QkJveCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJR2V0QkJveChGWF9SRUNUICZydEJCb3gpOworICAgIHZpcnR1YWwgYm9vbAkJCUdldEdseXBoQkJveChpbnQzMl90IGlHbHlwaEluZGV4LCBGWF9SRUNUICZydEJCb3gpOworICAgIHZpcnR1YWwgYm9vbAkJCUdldEJCb3goRlhfUkVDVCAmcnRCQm94KTsKIAogICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0SGVpZ2h0KCkgY29uc3Q7CiAgICAgdmlydHVhbCBpbnQzMl90CQlHZXRJdGFsaWNBbmdsZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldEZvbnREYXRhKEZYX0RXT1JEIGR3VGFibGUsIHVpbnQ4X3QqIHBCdWZmZXIsIEZYX0RXT1JEIGR3U2l6ZSk7Ci0gICAgRlhfQk9PTAkJCQkJSW5pdEZvbnQoQ0ZQRl9Ta2lhRm9udE1nciAqcEZvbnRNZ3IsIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yICpwRm9udERlcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhbWlseSwgRlhfRFdPUkQgZHdTdHlsZSwgdWludDhfdCB1Q2hhcnNldCk7CisgICAgYm9vbAkJCQkJSW5pdEZvbnQoQ0ZQRl9Ta2lhRm9udE1nciAqcEZvbnRNZ3IsIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yICpwRm9udERlcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhbWlseSwgRlhfRFdPUkQgZHdTdHlsZSwgdWludDhfdCB1Q2hhcnNldCk7CiBwcm90ZWN0ZWQ6CiAgICAgQ0ZQRl9Ta2lhRm9udE1ncgkJKm1fcEZvbnRNZ3I7CiAgICAgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IJKm1fcEZvbnREZXM7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250bWdyLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuY3BwCmluZGV4IDg2YmIwNTIuLjhjODM1MzkgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuY3BwCkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9Ci1zdGF0aWMgdWludDMyX3QgRlBGX0dldEhhc2hDb2RlX1N0cmluZ0EoY29uc3QgRlhfQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoLCBGWF9CT09MIGJJZ25vcmVDYXNlID0gRkFMU0UpCitzdGF0aWMgdWludDMyX3QgRlBGX0dldEhhc2hDb2RlX1N0cmluZ0EoY29uc3QgRlhfQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoLCBib29sIGJJZ25vcmVDYXNlID0gZmFsc2UpCiB7CiAgICAgaWYgKCFwU3RyKSB7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMjA4LDI3ICsyMDgsMjcgQEAKICAgICAgICAgYnNGb250ICs9ICJTZXJpZiI7CiAgICAgfQogICAgIGJzRm9udCArPSB1Q2hhcnNldDsKLSAgICByZXR1cm4gRlBGX0dldEhhc2hDb2RlX1N0cmluZ0EoYnNGb250LmNfc3RyKCksIGJzRm9udC5HZXRMZW5ndGgoKSwgVFJVRSk7CisgICAgcmV0dXJuIEZQRl9HZXRIYXNoQ29kZV9TdHJpbmdBKGJzRm9udC5jX3N0cigpLCBic0ZvbnQuR2V0TGVuZ3RoKCksIHRydWUpOwogfQotc3RhdGljIEZYX0JPT0wgRlBGX1NraWFJc0NKSyh1aW50OF90IHVDaGFyc2V0KQorc3RhdGljIGJvb2wgRlBGX1NraWFJc0NKSyh1aW50OF90IHVDaGFyc2V0KQogewogICAgIHJldHVybiAodUNoYXJzZXQgPT0gRlhGT05UX0dCMjMxMl9DSEFSU0VUKSB8fCAodUNoYXJzZXQgPT0gRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQpCiAgICAgICAgICAgIHx8ICh1Q2hhcnNldCA9PSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUKSB8fCAodUNoYXJzZXQgPT0gRlhGT05UX1NISUZUSklTX0NIQVJTRVQpOwogfQotc3RhdGljIEZYX0JPT0wgRlBGX1NraWFNYXliZVN5bWJvbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmFjZW5hbWUpCitzdGF0aWMgYm9vbCBGUEZfU2tpYU1heWJlU3ltYm9sKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGYWNlbmFtZSkKIHsKICAgICBDRlhfQnl0ZVN0cmluZyBic05hbWUgPSBic0ZhY2VuYW1lOwogICAgIGJzTmFtZS5NYWtlTG93ZXIoKTsKICAgICByZXR1cm4gYnNOYW1lLkZpbmQoInN5bWJvbCIpID4gLTE7CiB9Ci1zdGF0aWMgRlhfQk9PTCBGUEZfU2tpYU1heWJlQXJhYmljKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGYWNlbmFtZSkKK3N0YXRpYyBib29sIEZQRl9Ta2lhTWF5YmVBcmFiaWMoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhY2VuYW1lKQogewogICAgIENGWF9CeXRlU3RyaW5nIGJzTmFtZSA9IGJzRmFjZW5hbWU7CiAgICAgYnNOYW1lLk1ha2VMb3dlcigpOwogICAgIHJldHVybiBic05hbWUuRmluZCgiYXJhYmljIikgPiAtMTsKIH0KIENGUEZfU2tpYUZvbnRNZ3I6OkNGUEZfU2tpYUZvbnRNZ3IoKQotICAgIDogbV9iTG9hZGVkKEZBTFNFKSwgbV9GVExpYnJhcnkoTlVMTCkKKyAgICA6IG1fYkxvYWRlZChmYWxzZSksIG1fRlRMaWJyYXJ5KE5VTEwpCiB7CiB9CiBDRlBGX1NraWFGb250TWdyOjp+Q0ZQRl9Ta2lhRm9udE1ncigpCkBAIC0yNTIsNyArMjUyLDcgQEAKICAgICAgICAgRlhGVF9Eb25lX0ZyZWVUeXBlKG1fRlRMaWJyYXJ5KTsKICAgICB9CiB9Ci1GWF9CT09MIENGUEZfU2tpYUZvbnRNZ3I6OkluaXRGVExpYnJhcnkoKQorYm9vbCBDRlBGX1NraWFGb250TWdyOjpJbml0RlRMaWJyYXJ5KCkKIHsKICAgICBpZiAobV9GVExpYnJhcnkgPT0gTlVMTCkgewogICAgICAgICBGWEZUX0luaXRfRnJlZVR5cGUoJm1fRlRMaWJyYXJ5KTsKQEAgLTI2Niw3ICsyNjYsNyBAQAogICAgIH0KICAgICBTY2FuUGF0aChGWF9CU1RSQygiL3N5c3RlbS9mb250cyIpKTsKICAgICBPdXRwdXRTeXN0ZW1Gb250cygpOwotICAgIG1fYkxvYWRlZCA9IFRSVUU7CisgICAgbV9iTG9hZGVkID0gdHJ1ZTsKIH0KIHZvaWQgQ0ZQRl9Ta2lhRm9udE1ncjo6TG9hZFByaXZhdGVGb250KElGWF9GaWxlUmVhZCogcEZvbnRGaWxlKQogewpAQCAtMjg5LDcgKzI4OSw3IEBACiAgICAgRlhfRFdPUkQgZHdGYWNlTmFtZSA9IEZQRl9TS0lBTm9ybWFsaXplRm9udE5hbWUoYnNGYW1pbHluYW1lKTsKICAgICBGWF9EV09SRCBkd1N1YnN0ID0gRlBGX1NraWFHZXRTdWJzdEZvbnQoZHdGYWNlTmFtZSk7CiAgICAgRlhfRFdPUkQgZHdTdWJzdFNhbnMgPSBGUEZfU2tpYUdldFNhbnNGb250KGR3RmFjZU5hbWUpOwotICAgIEZYX0JPT0wgYk1heWJlU3ltYm9sID0gRlBGX1NraWFNYXliZVN5bWJvbChic0ZhbWlseW5hbWUpOworICAgIGJvb2wgYk1heWJlU3ltYm9sID0gRlBGX1NraWFNYXliZVN5bWJvbChic0ZhbWlseW5hbWUpOwogICAgIGlmICh1Q2hhcnNldCAhPSBGWEZPTlRfQVJBQklDX0NIQVJTRVQgJiYgRlBGX1NraWFNYXliZUFyYWJpYyhic0ZhbWlseW5hbWUpKSB7CiAgICAgICAgIHVDaGFyc2V0ID0gRlhGT05UX0FSQUJJQ19DSEFSU0VUOwogICAgIH0gZWxzZSBpZiAodUNoYXJzZXQgPT0gRlhGT05UX0FOU0lfQ0hBUlNFVCAmJiAoZHdNYXRjaCAmIEZQRl9NQVRDSEZPTlRfUkVQTEFDRUFOU0kpKSB7CkBAIC0zMDksNyArMzA5LDcgQEAKICAgICAgICAgaWYgKGR3RmFjZU5hbWUgPT0gZHdTeXNGb250TmFtZSkgewogICAgICAgICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF9OQU1FMTsKICAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJNYXRjaGVkTmFtZSA9IChuRmluZCA9PSBGUEZfU0tJQU1BVENIV0VJR0hUX05BTUUxKTsKKyAgICAgICAgYm9vbCBiTWF0Y2hlZE5hbWUgPSAobkZpbmQgPT0gRlBGX1NLSUFNQVRDSFdFSUdIVF9OQU1FMSk7CiAgICAgICAgIGlmICgoZHdTdHlsZSAmIEZYRk9OVF9CT0xEKSA9PSAocEZvbnREZXMtPm1fZHdTdHlsZSAmIEZYRk9OVF9CT0xEKSkgewogICAgICAgICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF8xOwogICAgICAgICB9CkBAIC0zMjcsNyArMzI3LDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAoZHdTdWJzdCA9PSBkd1N5c0ZvbnROYW1lIHx8IGR3U3Vic3RTYW5zID09IGR3U3lzRm9udE5hbWUpIHsKICAgICAgICAgICAgIG5GaW5kICs9IEZQRl9TS0lBTUFUQ0hXRUlHSFRfTkFNRTI7Ci0gICAgICAgICAgICBiTWF0Y2hlZE5hbWUgPSBUUlVFOworICAgICAgICAgICAgYk1hdGNoZWROYW1lID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAodUNoYXJzZXQgPT0gRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCB8fCBiTWF5YmVTeW1ib2wpIHsKICAgICAgICAgICAgIGlmIChuRmluZCA+IG5NYXggJiYgYk1hdGNoZWROYW1lKSB7CkBAIC0zOTksNyArMzk5LDcgQEAKICAgICBhcmdzLnBhdGhuYW1lID0gKEZUX1N0cmluZyopYnNGaWxlLkdldENTdHIoKTsKICAgICBGWEZUX0ZhY2UgZmFjZTsKICAgICBpZiAoRlhGVF9PcGVuX0ZhY2UobV9GVExpYnJhcnksICZhcmdzLCBpRmFjZUluZGV4LCAmZmFjZSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYRlRfU2V0X1BpeGVsX1NpemVzKGZhY2UsIDAsIDY0KTsKICAgICByZXR1cm4gZmFjZTsKQEAgLTQxOCw3ICs0MTgsNyBAQAogICAgIGFyZ3MubWVtb3J5X3NpemUgPSBzekJ1ZmZlcjsKICAgICBGWEZUX0ZhY2UgZmFjZTsKICAgICBpZiAoRlhGVF9PcGVuX0ZhY2UobV9GVExpYnJhcnksICZhcmdzLCBpRmFjZUluZGV4LCAmZmFjZSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYRlRfU2V0X1BpeGVsX1NpemVzKGZhY2UsIDAsIDY0KTsKICAgICByZXR1cm4gZmFjZTsKQEAgLTQzMCw3ICs0MzAsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIGZpbGVuYW1lOwotICAgIEZYX0JPT0wJYkZvbGRlciA9IEZBTFNFOworICAgIGJvb2wJYkZvbGRlciA9IGZhbHNlOwogICAgIHdoaWxlIChGWF9HZXROZXh0RmlsZShoYW5kbGUsIGZpbGVuYW1lLCBiRm9sZGVyKSkgewogICAgICAgICBpZiAoYkZvbGRlcikgewogICAgICAgICAgICAgaWYgKGZpbGVuYW1lID09IEZYX0JTVFJDKCIuIikgfHwgZmlsZW5hbWUgPT0gRlhfQlNUUkMoIi4uIikpIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuaCBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuaAppbmRleCA4YzcyMWZmLi5iNGViZTk0IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250bWdyLmgKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udG1nci5oCkBAIC05NCw3ICs5NCw3IEBACiBwdWJsaWM6CiAgICAgQ0ZQRl9Ta2lhRm9udE1ncigpOwogICAgIHZpcnR1YWwgfkNGUEZfU2tpYUZvbnRNZ3IoKTsKLSAgICBGWF9CT09MCQkJCQlJbml0RlRMaWJyYXJ5KCk7CisgICAgYm9vbAkJCQkJSW5pdEZUTGlicmFyeSgpOwogICAgIHZpcnR1YWwgdm9pZAkJCUxvYWRTeXN0ZW1Gb250cygpOwogICAgIHZpcnR1YWwgdm9pZAkJCUxvYWRQcml2YXRlRm9udChJRlhfRmlsZVJlYWQqIHBGb250RmlsZSk7CiAgICAgdmlydHVhbCB2b2lkCQkJTG9hZFByaXZhdGVGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGaWxlTmFtZSk7CkBAIC0xMDksNyArMTA5LDcgQEAKICAgICB2b2lkCQkJCVNjYW5GaWxlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZSk7CiAgICAgdm9pZAkJCQlSZXBvcnRGYWNlKEZYRlRfRmFjZSBmYWNlLCBDRlBGX1NraWFGb250RGVzY3JpcHRvciAqcEZvbnREZXNjKTsKICAgICB2b2lkCQkJCU91dHB1dFN5c3RlbUZvbnRzKCk7Ci0gICAgRlhfQk9PTAkJCQltX2JMb2FkZWQ7CisgICAgYm9vbAkJCQltX2JMb2FkZWQ7CiAgICAgQ0ZYX1B0ckFycmF5CQltX0ZvbnRGYWNlczsKICAgICBGWEZUX0xpYnJhcnkJCW1fRlRMaWJyYXJ5OwogICAgIENGWF9NYXBQdHJUb1B0cgkJbV9GYW1pbHlGb250czsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9meF9hbmRyb2lkX2ZvbnQuY3BwIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfZm9udC5jcHAKaW5kZXggM2UyZmM0NS4uNGYyYmMxNSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfZm9udC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfZm9udC5jcHAKQEAgLTEwLDIwICsxMCwyMCBAQAogICAgIDogbV9wRm9udE1ncihOVUxMKQogewogfQotRlhfQk9PTCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpJbml0KElGUEZfRm9udE1nciAqcEZvbnRNZ3IpCitib29sIENGWF9BbmRyb2lkRm9udEluZm86OkluaXQoSUZQRl9Gb250TWdyICpwRm9udE1ncikKIHsKICAgICBpZiAoIXBGb250TWdyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBwRm9udE1nci0+TG9hZFN5c3RlbUZvbnRzKCk7CiAgICAgbV9wRm9udE1nciA9IHBGb250TWdyOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpCitib29sIENGWF9BbmRyb2lkRm9udEluZm86OkVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcikKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotdm9pZCogQ0ZYX0FuZHJvaWRGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYWNlLCBGWF9CT09MJiBiRXhhY3QpCit2b2lkKiBDRlhfQW5kcm9pZEZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsIGJvb2wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhY2UsIGJvb2wmIGJFeGFjdCkKIHsKICAgICBpZiAoIW1fcEZvbnRNZ3IpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC01NywyMSArNTcsMjEgQEAKICAgICB9CiAgICAgcmV0dXJuICgoSUZQRl9Gb250KiloRm9udCktPkdldEZvbnREYXRhKHRhYmxlLCBidWZmZXIsIHNpemUpOwogfQotRlhfQk9PTCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpCitib29sIENGWF9BbmRyb2lkRm9udEluZm86OkdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkKIHsKICAgICBpZiAoIWhGb250KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBuYW1lID0gKChJRlBGX0ZvbnQqKWhGb250KS0+R2V0RmFtaWx5TmFtZSgpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KQorYm9vbCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KQogewogICAgIGlmICghaEZvbnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGNoYXJzZXQgPSAoKElGUEZfRm9udCopaEZvbnQpLT5HZXRDaGFyc2V0KCk7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIHZvaWQgQ0ZYX0FuZHJvaWRGb250SW5mbzo6RGVsZXRlRm9udCh2b2lkKiBoRm9udCkKIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9meF9hbmRyb2lkX2ZvbnQuaCBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9meF9hbmRyb2lkX2ZvbnQuaAppbmRleCA4M2MwNGEwLi4wNzViNzllIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnhfYW5kcm9pZF9mb250LmgKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfZm9udC5oCkBAIC0xOCwxOCArMTgsMTggQEAKICAgICAgICAgZGVsZXRlIHRoaXM7CiAgICAgfQogCi0gICAgdmlydHVhbAlGWF9CT09MCQlFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpOworICAgIHZpcnR1YWwJYm9vbAkJRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKTsKIAotICAgIHZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFjZSwgRlhfQk9PTCYgYkV4YWN0KTsKKyAgICB2aXJ0dWFsIHZvaWQqCQlNYXBGb250KGludCB3ZWlnaHQsIGJvb2wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhY2UsIGJvb2wmIGJFeGFjdCk7CiAKICAgICB2aXJ0dWFsIHZvaWQqCQlHZXRGb250KGNvbnN0IEZYX0NIQVIqIGZhY2UpOwogICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0Rm9udERhdGEodm9pZCogaEZvbnQsIEZYX0RXT1JEIHRhYmxlLCB1aW50OF90KiBidWZmZXIsIEZYX0RXT1JEIHNpemUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpOworICAgIHZpcnR1YWwgYm9vbAkJR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKKyAgICB2aXJ0dWFsIGJvb2wJCUdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpOwogCiAgICAgdmlydHVhbCB2b2lkCQlEZWxldGVGb250KHZvaWQqIGhGb250KTsKICAgICB2aXJ0dWFsIHZvaWQqICAgICAgIFJldGFpbkZvbnQodm9pZCogaEZvbnQpOwotICAgIEZYX0JPT0wJCQkJSW5pdChJRlBGX0ZvbnRNZ3IgKnBGb250TWdyKTsKKyAgICBib29sCQkJCUluaXQoSUZQRl9Gb250TWdyICpwRm9udE1ncik7CiBwcm90ZWN0ZWQ6CiAgICAgSUZQRl9Gb250TWdyCQkqbV9wRm9udE1ncjsKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FwcGxlL2FwcGxlX2ludC5oIGIvY29yZS9zcmMvZnhnZS9hcHBsZS9hcHBsZV9pbnQuaAppbmRleCA3MTVlNDhkLi4wZTZjOWQ2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FwcGxlL2FwcGxlX2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvYXBwbGVfaW50LmgKQEAgLTUxLDcgKzUxLDcgQEAKICAgICB2b2lkKglDcmVhdGVGb250KGNvbnN0IHVpbnQ4X3QqIHBGb250RGF0YSwgRlhfRFdPUkQgZHdGb250U2l6ZSk7CiAgICAgdm9pZAlEZXN0cm95Rm9udCh2b2lkKiBwRm9udCk7CiAgICAgdm9pZAlzZXRHcmFwaGljc1RleHRNYXRyaXgodm9pZCogZ3JhcGhpY3MsIENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCk7Ci0gICAgRlhfQk9PTAlkcmF3R3JhcGhpY3NTdHJpbmcodm9pZCogICAgICAgICAgICAgICAgZ3JhcGhpY3MsCisgICAgYm9vbAlkcmF3R3JhcGhpY3NTdHJpbmcodm9pZCogICAgICAgICAgICAgICAgZ3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgZm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCAgICAgICAgICAgICBmb250U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEKiAgICAgICAgICAgICBnbHlwaEluZGljZXMsCkBAIC05MiwyNiArOTIsMjYgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgSXNQU1ByaW50RHJpdmVyKCkKKyAgICB2aXJ0dWFsIGJvb2wgSXNQU1ByaW50RHJpdmVyKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJU3RhcnRSZW5kZXJpbmcoKQorICAgIHZpcnR1YWwgYm9vbAlTdGFydFJlbmRlcmluZygpCiAgICAgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHZpcnR1YWwgdm9pZAlFbmRSZW5kZXJpbmcoKSB7fQogICAgIHZpcnR1YWwgdm9pZAlTYXZlU3RhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQJUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCB2b2lkCVJlc3RvcmVTdGF0ZShib29sIGJLZWVwU2F2ZWQpOworICAgIHZpcnR1YWwgYm9vbAlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICB2aXJ0dWFsIGJvb2wJU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgdmlydHVhbCBGWF9CT09MCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIHZpcnR1YWwgYm9vbAlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCkBAIC0xMjEsMzYgKzEyMSwzNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLAorICAgIHZpcnR1YWwgYm9vbAlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTCBGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwKKyAgICB2aXJ0dWFsIGJvb2wgRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJRHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCisgICAgdmlydHVhbCBib29sCURyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCUdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgRlhfQk9PTCBiREVkZ2UgPSBGQUxTRSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCisgICAgdmlydHVhbCBib29sIEdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpOworICAgIHZpcnR1YWwgYm9vbAlHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGJvb2wgYkRFZGdlID0gZmFsc2UpOworICAgIHZpcnR1YWwgYm9vbAlTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgYmxlbmRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwotICAgIHZpcnR1YWwgRlhfQk9PTAlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisgICAgdmlydHVhbCBib29sCVN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCisgICAgdmlydHVhbCBib29sCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywgdm9pZComIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpCiAgICAgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCUNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCisgICAgdmlydHVhbCBib29sCUNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCiAgICAgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgdmlydHVhbCB2b2lkCUNhbmNlbERJQml0cyh2b2lkKiBoYW5kbGUpIHt9Ci0gICAgdmlydHVhbCBGWF9CT09MIERyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAorICAgIHZpcnR1YWwgYm9vbCBEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwgRlhfRkxPQVQgZm9udF9zaXplLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAgICAgdmlydHVhbCB2b2lkICAgIENsZWFyRHJpdmVyKCk7CkBAIC0xNTksNyArMTU5LDcgQEAKICAgICB2b2lkIHNldEZpbGxJbmZvKEZYX0FSR0IgYXJnYik7CiAgICAgdm9pZCBzZXRQYXRoVG9Db250ZXh0KGNvbnN0IENGWF9QYXRoRGF0YSAqIHBhdGhEYXRhKTsKICAgICBGWF9GTE9BVCBnZXRMaW5lV2lkdGgoY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhICogZ3JhcGhTdGF0ZSwgQ0dBZmZpbmVUcmFuc2Zvcm0gY3RtKTsKLSAgICBGWF9CT09MIENHX0RyYXdHbHlwUnVuKGludCAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFycywKKyAgICBib29sIENHX0RyYXdHbHlwUnVuKGludCAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiAgICAgIHBDaGFyUG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqICAgICAgICAgICAgICAgICAgcEZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiAgICAgICAgICAgICBwQ2FjaGUsCkBAIC0xOTUsOSArMTk1LDkgQEAKICAgICB7CiAgICAgICAgIHJldHVybiAoRlhfRklMRVNJWkUpX3RvdGFsU2l6ZTsKICAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0VPRigpIG92ZXJyaWRlCisgICAgdmlydHVhbCBib29sCQkJSXNFT0YoKSBvdmVycmlkZQogICAgIHsKICAgICAgICAgcmV0dXJuIF9vZmZTZXQgPT0gX3RvdGFsU2l6ZTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X2FwcGxlX3BsYXRmb3JtLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfYXBwbGVfcGxhdGZvcm0uY3BwCmluZGV4IDlkYjgwN2MuLjlmNDcxMmIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfYXBwbGVfcGxhdGZvcm0uY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfYXBwbGVfcGxhdGZvcm0uY3BwCkBAIC0zOSw3ICszOSw3IEBACiB7CiAgICAgcmV0dXJuIE5VTEw7CiB9Ci1zdGF0aWMgRlhfQk9PTCBfQ0dEcmF3R2x5cGhSdW4oQ0dDb250ZXh0UmVmICAgICAgICAgICAgICAgcENvbnRleHQsCitzdGF0aWMgYm9vbCBfQ0dEcmF3R2x5cGhSdW4oQ0dDb250ZXh0UmVmICAgICAgICAgICAgICAgcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgbkNoYXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiAgICAgIHBDaGFyUG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiAgICAgICAgICAgICAgICAgIHBGb250LApAQCAtNTEsMTAgKzUxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAobkNoYXJzID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBDRlhfQWZmaW5lTWF0cml4IG5ld19tYXRyaXg7Ci0gICAgRlhfQk9PTCBiTmVnU2l6ZSA9IGZvbnRfc2l6ZSA8IDA7CisgICAgYm9vbCBiTmVnU2l6ZSA9IGZvbnRfc2l6ZSA8IDA7CiAgICAgaWYgKGJOZWdTaXplKSB7CiAgICAgICAgIGZvbnRfc2l6ZSA9IC1mb250X3NpemU7CiAgICAgfQpAQCAtNjYsMTEgKzY2LDExIEBACiAgICAgQ1F1YXJ0ejJEJiBxdWFydHoyZCA9ICgoQ0FwcGxlUGxhdGZvcm0gKikgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5fcXVhcnR6MmQ7CiAgICAgaWYgKCFwRm9udC0+bV9wUGxhdGZvcm1Gb250KSB7CiAgICAgICAgIGlmIChwRm9udC0+R2V0UHNOYW1lKCkgPT0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbCgiREZIZWlTdGQtVzUiKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHBGb250LT5tX3BQbGF0Zm9ybUZvbnQgPSBxdWFydHoyZC5DcmVhdGVGb250KHBGb250LT5tX3BGb250RGF0YSwgcEZvbnQtPm1fZHdTaXplKTsKICAgICAgICAgaWYgKE5VTEwgPT0gcEZvbnQtPm1fcFBsYXRmb3JtRm9udCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfV09SRCwgMzI+IGdseXBoX2luZGljZXMobkNoYXJzKTsKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiB9CiBzdGF0aWMgdm9pZCBfRG9Ob3RoaW5nKHZvaWQgKmluZm8sIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7fQotRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpEcmF3RGV2aWNlVGV4dChpbnQJCQkJCQkgbkNoYXJzLAorYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpEcmF3RGV2aWNlVGV4dChpbnQJCQkJCQkgbkNoYXJzLAogICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyAqCSBwQ2hhclBvcywKICAgICAgICAgQ0ZYX0ZvbnQgKgkJCQkgcEZvbnQsCiAgICAgICAgIENGWF9Gb250Q2FjaGUgKgkJCSBwQ2FjaGUsCkBAIC0xMTEsMjIgKzExMSwyMiBAQAogICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAoIXBGb250KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBGWF9CT09MIGJCb2xkID0gcEZvbnQtPklzQm9sZCgpOworICAgIGJvb2wgYkJvbGQgPSBwRm9udC0+SXNCb2xkKCk7CiAgICAgaWYgKCFiQm9sZCAmJiBwRm9udC0+R2V0U3Vic3RGb250KCkgJiYKICAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQgPj0gNTAwICYmCiAgICAgICAgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0IDw9IDYwMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hhcnM7IGkgKyspIHsKICAgICAgICAgaWYgKHBDaGFyUG9zW2ldLm1fYkdseXBoQWRqdXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgQ0dDb250ZXh0UmVmIGN0eCA9IENHQ29udGV4dFJlZihtX3BQbGF0Zm9ybUdyYXBoaWNzKTsKICAgICBpZiAoTlVMTCA9PSBjdHgpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY3R4KTsKICAgICBDR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUoY3R4LCBrQ0dUZXh0RmlsbENsaXApOwpAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAgICAgICAgICBDR0Zsb2F0IGRlY29kZV9mWzJdID0gezI1NS5mLCAwLmZ9OwogICAgICAgICAgICAgcEltYWdlQ0cgPSBDR0ltYWdlTWFza0NyZWF0ZShwQ2xpcE1hc2stPkdldFdpZHRoKCksIHBDbGlwTWFzay0+R2V0SGVpZ2h0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsIDgsIHBDbGlwTWFzay0+R2V0UGl0Y2goKSwgcENsaXBNYXNrRGF0YVByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfZiwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfZiwgZmFsc2UpOwogICAgICAgICAgICAgQ0dEYXRhUHJvdmlkZXJSZWxlYXNlKHBDbGlwTWFza0RhdGFQcm92aWRlcik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMTU1LDcgKzE1NSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgQ0dDb250ZXh0Q2xpcFRvUmVjdChjdHgsIHJlY3RfY2cpOwogICAgIH0KLSAgICBGWF9CT09MIHJldCA9IF9DR0RyYXdHbHlwaFJ1bihjdHgsIG5DaGFycywgcENoYXJQb3MsIHBGb250LCBwQ2FjaGUsIHBPYmplY3QyRGV2aWNlLCBmb250X3NpemUsIGFyZ2IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworICAgIGJvb2wgcmV0ID0gX0NHRHJhd0dseXBoUnVuKGN0eCwgbkNoYXJzLCBwQ2hhclBvcywgcEZvbnQsIHBDYWNoZSwgcE9iamVjdDJEZXZpY2UsIGZvbnRfc2l6ZSwgYXJnYiwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiAgICAgaWYgKHBJbWFnZUNHKSB7CiAgICAgICAgIENHSW1hZ2VSZWxlYXNlKHBJbWFnZUNHKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X21hY19pbXAuY3BwIGIvY29yZS9zcmMvZnhnZS9hcHBsZS9meF9tYWNfaW1wLmNwcAppbmRleCAwNGIwNGI4Li41ZTU5MDhiIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X21hY19pbXAuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfbWFjX2ltcC5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKIGNsYXNzIENGWF9NYWNGb250SW5mbyA6IHB1YmxpYyBDRlhfRm9sZGVyRm9udEluZm8KIHsKIHB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQqCQlNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwgRlhfQk9PTCYgYkV4YWN0KTsKKyAgICB2aXJ0dWFsIHZvaWQqCQlNYXBGb250KGludCB3ZWlnaHQsIGJvb2wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwgYm9vbCYgYkV4YWN0KTsKIH07CiAjZGVmaW5lIEpBUEFOX0dPVEhJQyAiSGlyYWdpbm8gS2FrdSBHb3RoaWMgUHJvIFc2IgogI2RlZmluZSBKQVBBTl9NSU5DSE8gIkhpcmFnaW5vIE1pbmNobyBQcm8gVzYiCkBAIC00NCwxNCArNDQsMTQgQEAKICAgICAgICAgZmFjZSA9IEpBUEFOX01JTkNITzsKICAgICB9CiB9Ci12b2lkKiBDRlhfTWFjRm9udEluZm86Ok1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogY3N0cl9mYWNlLCBGWF9CT09MJiBiRXhhY3QpCit2b2lkKiBDRlhfTWFjRm9udEluZm86Ok1hcEZvbnQoaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogY3N0cl9mYWNlLCBib29sJiBiRXhhY3QpCiB7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgZmFjZSA9IGNzdHJfZmFjZTsKICAgICBpbnQgaUJhc2VGb250OwogICAgIGZvciAoaUJhc2VGb250ID0gMDsgaUJhc2VGb250IDwgMTI7IGlCYXNlRm9udCArKykKICAgICAgICAgaWYgKGZhY2UgPT0gQ0ZYX0J5dGVTdHJpbmdDKEJhc2UxNFN1YnN0c1tpQmFzZUZvbnRdLm1fcE5hbWUpKSB7CiAgICAgICAgICAgICBmYWNlID0gQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9wU3Vic3ROYW1lOwotICAgICAgICAgICAgYkV4YWN0ID0gVFJVRTsKKyAgICAgICAgICAgIGJFeGFjdCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIGlmIChpQmFzZUZvbnQgPCAxMikgewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hcHBsZS9meF9xdWFydHpfZGV2aWNlLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfcXVhcnR6X2RldmljZS5jcHAKaW5kZXggZDFlNGY1NC4uOGFhNjg5ZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9hcHBsZS9meF9xdWFydHpfZGV2aWNlLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X3F1YXJ0el9kZXZpY2UuY3BwCkBAIC03Niw3ICs3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgtPmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSkpOwogfQotRlhfQk9PTCBDUXVhcnR6MkQ6OmRyYXdHcmFwaGljc1N0cmluZyh2b2lkKiAgICAgICAgICAgICAgICAgZ3JhcGhpY3MsCitib29sIENRdWFydHoyRDo6ZHJhd0dyYXBoaWNzU3RyaW5nKHZvaWQqICAgICAgICAgICAgICAgICBncmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgIGZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUICAgICAgICAgICAgICBmb250U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCogICAgICAgICAgICAgIGdseXBoSW5kaWNlcywKQEAgLTg2LDcgKzg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogICAgIG1hdHJpeCApCiB7CiAgICAgaWYgKCFncmFwaGljcykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSAoQ0dDb250ZXh0UmVmKSBncmFwaGljczsKICAgICBDR0NvbnRleHRTZXRGb250KGNvbnRleHQsIChDR0ZvbnRSZWYpZm9udCk7CkBAIC0xMTMsNyArMTEzLDcgQEAKICNpZiBDR0ZMT0FUX0lTX0RPVUJMRQogICAgIENHUG9pbnQqIGdseXBoUG9zaXRpb25zQ0cgPSBuZXcgQ0dQb2ludFtjaGFyc0NvdW50XTsKICAgICBpZiAoIWdseXBoUG9zaXRpb25zQ0cpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGFyc0NvdW50OyArK2luZGV4KSB7CiAgICAgICAgIGdseXBoUG9zaXRpb25zQ0dbaW5kZXhdLnggPSBnbHlwaFBvc2l0aW9uc1tpbmRleF0ueDsKQEAgLTEzMCw3ICsxMzAsNyBAQAogICAgIGRlbGV0ZVtdIGdseXBoUG9zaXRpb25zQ0c7CiAjZW5kaWYKICAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDUXVhcnR6MkQ6OnNhdmVHcmFwaGljc1N0YXRlKHZvaWQgKiBncmFwaGljcykKIHsKQEAgLTI1MSw3ICsyNTEsNyBAQAogICAgIENHQ29udGV4dFNhdmVHU3RhdGUoX2NvbnRleHQpOwogICAgIG1fc2F2ZUNvdW50Kys7CiB9Ci12b2lkIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlJlc3RvcmVTdGF0ZShGWF9CT09MIGlzS2VlcFNhdmVkICkKK3ZvaWQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6UmVzdG9yZVN0YXRlKGJvb2wgaXNLZWVwU2F2ZWQgKQogewogICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoX2NvbnRleHQpOwogICAgIGlmIChpc0tlZXBTYXZlZCkgewpAQCAtMjYwLDcgKzI2MCw3IEBACiAgICAgICAgIG1fc2F2ZUNvdW50LS07CiAgICAgfQogfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogICAgcGF0aERhdGEsCitib29sIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiAgICBwYXRoRGF0YSwKICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogICBtYXRyaXgsCiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgZmlsbE1vZGUgKQogewpAQCAtMjcyLDEzICsyNzIsMTMgQEAKICAgICBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQobSwgX2ZveGl0RGV2aWNlMlVzZXIpOwogICAgIENHQ29udGV4dENvbmNhdENUTShfY29udGV4dCwgbSk7CiAgICAgc2V0UGF0aFRvQ29udGV4dChwYXRoRGF0YSk7Ci0gICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgICBSZXN0b3JlU3RhdGUoZmFsc2UpOwogICAgIGlmICgoZmlsbE1vZGUgJiAzKSA9PSBGWEZJTExfV0lORElORykgewogICAgICAgICBDR0NvbnRleHRDbGlwKF9jb250ZXh0KTsKICAgICB9IGVsc2UgewogICAgICAgICBDR0NvbnRleHRFT0NsaXAoX2NvbnRleHQpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIEZYX0ZMT0FUIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OmdldExpbmVXaWR0aChjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEgKiBncmFwaFN0YXRlLCBDR0FmZmluZVRyYW5zZm9ybSBjdG0pCiB7CkBAIC0yOTQsNyArMjk0LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIGxpbmVXaWR0aDsKIH0KLUZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogICAgICBwYXRoRGF0YSwKK2Jvb2wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogICAgICBwYXRoRGF0YSwKICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogICAgIG1hdHJpeCwKICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiAgIGdyYXBoU3RhdGUgKQogewpAQCAtMzA5LDkgKzMwOSw5IEBACiAgICAgc2V0U3Ryb2tlSW5mbyhncmFwaFN0YXRlLCAweEZGMDAwMDAwLCBsaW5lV2lkdGgpOwogICAgIHNldFBhdGhUb0NvbnRleHQocGF0aERhdGEpOwogICAgIENHQ29udGV4dFJlcGxhY2VQYXRoV2l0aFN0cm9rZWRQYXRoKF9jb250ZXh0KTsKLSAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOworICAgIFJlc3RvcmVTdGF0ZShmYWxzZSk7CiAgICAgQ0dDb250ZXh0Q2xpcChfY29udGV4dCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBzdGF0aWMgQ0dCbGVuZE1vZGUgR2V0Q0dCbGVuZE1vZGUoaW50IGJsZW5kX3R5cGUpCiB7CkBAIC0zNzEsNyArMzcxLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIG1vZGU7CiB9Ci1GWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogICAgICAgIHBhdGhEYXRhLAorYm9vbCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqICAgICAgICBwYXRoRGF0YSwKICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogICAgICAgbWF0cml4LAogICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqICAgICBncmFwaFN0YXRlLAogICAgICAgICBGWF9EV09SRCAgICAgICAgICAgICAgICAgICAgICBmaWxsQXJnYiwKQEAgLTQyMywxMCArNDIzLDEwIEBACiAgICAgfSBlbHNlIGlmIChwYXRoTW9kZSA9PSA2KSB7CiAgICAgICAgIENHQ29udGV4dERyYXdQYXRoKF9jb250ZXh0LCBrQ0dQYXRoRU9GaWxsU3Ryb2tlKTsKICAgICB9Ci0gICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBSZXN0b3JlU3RhdGUoZmFsc2UpOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiAgICAgICAgIHJlY3QsCitib29sIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqICAgICAgICAgcmVjdCwKICAgICAgICAgRlhfQVJHQiAgICAgICAgICAgICAgICAgICBmaWxsQXJnYiwKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUZsYWcJICAgLAogICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgIGljY1RyYW5zZm9ybSAsCkBAIC00NDksOSArNDQ5LDkgQEAKICAgICBpZiAobW9kZSAhPSBrQ0dCbGVuZE1vZGVOb3JtYWwpIHsKICAgICAgICAgQ0dDb250ZXh0U2V0QmxlbmRNb2RlKF9jb250ZXh0LCBrQ0dCbGVuZE1vZGVOb3JtYWwpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCAgICAgICAgICAgeDEsCitib29sIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkRyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgICAgICAgICAgIHgxLAogICAgICAgICBGWF9GTE9BVCAgICAgICAgICAgICAgeTEsCiAgICAgICAgIEZYX0ZMT0FUICAgICAgICAgICAgICB4MiwKICAgICAgICAgRlhfRkxPQVQgICAgICAgICAgICAgIHkyLApAQCAtNDgzLDkgKzQ4Myw5IEBACiAgICAgaWYgKG1vZGUgIT0ga0NHQmxlbmRNb2RlTm9ybWFsKSB7CiAgICAgICAgIENHQ29udGV4dFNldEJsZW5kTW9kZShfY29udGV4dCwga0NHQmxlbmRNb2RlTm9ybWFsKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkdldENsaXBCb3goRlhfUkVDVCogcmVjdCkKK2Jvb2wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiByZWN0KQogewogICAgIENHUmVjdCByID0gQ0dDb250ZXh0R2V0Q2xpcEJvdW5kaW5nQm94KF9jb250ZXh0KTsKICAgICByID0gQ0dSZWN0QXBwbHlBZmZpbmVUcmFuc2Zvcm0ociwgX3VzZXIyRm94aXREZXZpY2UpOwpAQCAtNDkzLDIyICs0OTMsMjIgQEAKICAgICByZWN0LT50b3AJCT0gRlhTWVNfZmxvb3Ioci5vcmlnaW4ueSk7CiAgICAgcmVjdC0+cmlnaHQJCT0gRlhTWVNfY2VpbChyLm9yaWdpbi54ICsgci5zaXplLndpZHRoKTsKICAgICByZWN0LT5ib3R0b20JPSBGWFNZU19jZWlsKHIub3JpZ2luLnkgKyByLnNpemUuaGVpZ2h0KTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogICAgIGJpdG1hcCwKK2Jvb2wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogICAgIGJpdG1hcCwKICAgICAgICAgaW50MzJfdCAgICAgICAgICAgIGxlZnQsCiAgICAgICAgIGludDMyX3QgICAgICAgICAgICB0b3AsCiAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCi0gICAgICAgIEZYX0JPT0wgYkRFZGdlKQorICAgICAgICBib29sIGJERWRnZSkKIHsKICAgICBpZiAoRlhEQ19QUklOVEVSID09IF9kZXZpY2VDbGFzcykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKGJpdG1hcC0+R2V0QlBQKCkgPCAzMikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCEoX3JlbmRlckNhcHMgfCBGWFJDX0dFVF9CSVRTKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0dQb2ludCBwdCA9IENHUG9pbnRNYWtlKGxlZnQsIHRvcCk7CiAgICAgcHQgPSBDR1BvaW50QXBwbHlBZmZpbmVUcmFuc2Zvcm0ocHQsIF9mb3hpdERldmljZTJVc2VyKTsKQEAgLTUxNyw3ICs1MTcsNyBAQAogICAgIHB0LnkgKj0gRlhTWVNfZmFicyhjdG0uZCk7CiAgICAgQ0dJbWFnZVJlZiBpbWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdlKF9jb250ZXh0KTsKICAgICBpZiAoTlVMTCA9PSBpbWFnZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0dGbG9hdCB3aWR0aAk9IChDR0Zsb2F0KSBiaXRtYXAtPkdldFdpZHRoKCk7CiAgICAgQ0dGbG9hdCBoZWlnaHQJPSAoQ0dGbG9hdCkgYml0bWFwLT5HZXRIZWlnaHQoKTsKQEAgLTU1Miw5ICs1NTIsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogICAgICBwQml0bWFwLAorYm9vbCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogICAgICBwQml0bWFwLAogICAgICAgICBGWF9BUkdCICAgICAgICAgICAgICAgICAgICAgYXJnYiwKICAgICAgICAgY29uc3QgRlhfUkVDVCogICAgICAgICAgICAgIHNyY1JlY3QsCiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2xlZnQsCkBAIC01OTgsOCArNTk4LDggQEAKICAgICAgICAgICAgIHBCaXRtYXAxID0gcEJpdG1hcC0+Q2xvbmUoKTsKICAgICAgICAgfQogICAgICAgICBpZiAoTlVMTCA9PSBwQml0bWFwMSkgewotICAgICAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgQ0dEYXRhUHJvdmlkZXJSZWYgcEJpdG1hcFByb3ZpZGVyID0gQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YShOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwMS0+R2V0QnVmZmVyKCksCkBAIC02MjksOCArNjI5LDggQEAKICAgICAgICAgaWYgKHBCaXRtYXAxICE9IHBCaXRtYXApIHsKICAgICAgICAgICAgIGRlbGV0ZSBwQml0bWFwMTsKICAgICAgICAgfQotICAgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA8IDMyKSB7CiAgICAgICAgIHBCaXRtYXAxID0gcEJpdG1hcC0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYjMyKTsKQEAgLTY0MiwxNSArNjQyLDE1IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKE5VTEwgPT0gcEJpdG1hcDEpIHsKLSAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBSZXN0b3JlU3RhdGUoZmFsc2UpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChwQml0bWFwMS0+SGFzQWxwaGEoKSkgewogICAgICAgICBpZiAocEJpdG1hcDEgPT0gcEJpdG1hcCkgewogICAgICAgICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZSgpOwogICAgICAgICAgICAgaWYgKCFwQml0bWFwMSkgewotICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShmYWxzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IHBCaXRtYXAxLT5HZXRIZWlnaHQoKTsgcm93ICsrKSB7CkBAIC02ODIsMTAgKzY4MiwxMCBAQAogICAgIGlmIChwQml0bWFwMSAhPSBwQml0bWFwKSB7CiAgICAgICAgIGRlbGV0ZSBwQml0bWFwMTsKICAgICB9Ci0gICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBSZXN0b3JlU3RhdGUoZmFsc2UpOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqICAgICAgcEJpdG1hcCwKK2Jvb2wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiAgICAgIHBCaXRtYXAsCiAgICAgICAgIEZYX0FSR0IgICAgICAgICAgICAgICAgICAgICBhcmdiLAogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9sZWZ0LAogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF90b3AsCkBAIC03MjMsOCArNzIzLDggQEAKICAgICAgICAgICAgIHBCaXRtYXAxID0gcEJpdG1hcC0+Q2xvbmUoKTsKICAgICAgICAgfQogICAgICAgICBpZiAoTlVMTCA9PSBwQml0bWFwMSkgewotICAgICAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgQ0dEYXRhUHJvdmlkZXJSZWYgcEJpdG1hcFByb3ZpZGVyID0gQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YShOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwMS0+R2V0QnVmZmVyKCksCkBAIC03NTQsOCArNzU0LDggQEAKICAgICAgICAgaWYgKHBCaXRtYXAxICE9IHBCaXRtYXApIHsKICAgICAgICAgICAgIGRlbGV0ZSBwQml0bWFwMTsKICAgICAgICAgfQotICAgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA8IDMyKSB7CiAgICAgICAgIHBCaXRtYXAxID0gcEJpdG1hcC0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYjMyKTsKQEAgLTc2NywxNSArNzY3LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKE5VTEwgPT0gcEJpdG1hcDEpIHsKLSAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBSZXN0b3JlU3RhdGUoZmFsc2UpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChwQml0bWFwMS0+SGFzQWxwaGEoKSkgewogICAgICAgICBpZiAocEJpdG1hcDEgPT0gcEJpdG1hcCkgewogICAgICAgICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZSgpOwogICAgICAgICAgICAgaWYgKCFwQml0bWFwMSkgewotICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShmYWxzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IHBCaXRtYXAxLT5HZXRIZWlnaHQoKTsgcm93ICsrKSB7CkBAIC03OTYsMTAgKzc5NiwxMCBAQAogICAgIGlmIChwQml0bWFwMSAhPSBwQml0bWFwKSB7CiAgICAgICAgIGRlbGV0ZSBwQml0bWFwMTsKICAgICB9Ci0gICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBSZXN0b3JlU3RhdGUoZmFsc2UpOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpDR19EcmF3R2x5cFJ1bihpbnQgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhcnMsCitib29sIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkNHX0RyYXdHbHlwUnVuKGludCAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFycywKICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqICAgICAgcENoYXJQb3MsCiAgICAgICAgIENGWF9Gb250KiAgICAgICAgICAgICAgICAgIHBGb250LAogICAgICAgICBDRlhfRm9udENhY2hlKiAgICAgICAgICAgICBwQ2FjaGUsCkBAIC04MTEsMTYgKzgxMSwxNiBAQAogICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChuQ2hhcnMgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIENRdWFydHoyRCYgcXVhcnR6MmQgPSAoKENBcHBsZVBsYXRmb3JtICopIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+X3F1YXJ0ejJkOwogICAgIGlmICghcEZvbnQtPm1fcFBsYXRmb3JtRm9udCkgewogICAgICAgICBpZiAocEZvbnQtPkdldFBzTmFtZSgpID09IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoIkRGSGVpU3RkLVc1IikpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBwRm9udC0+bV9wUGxhdGZvcm1Gb250ID0gcXVhcnR6MmQuQ3JlYXRlRm9udChwRm9udC0+bV9wRm9udERhdGEsIHBGb250LT5tX2R3U2l6ZSk7CiAgICAgICAgIGlmIChOVUxMID09IHBGb250LT5tX3BQbGF0Zm9ybUZvbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBDRlhfRml4ZWRCdWZHcm93PEZYX1dPUkQsIDMyPiBnbHlwaF9pbmRpY2VzKG5DaGFycyk7CkBAIC04NzIsMTAgKzg3MiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0dHbHlwaCopZ2x5cGhfaW5kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfcG9zaXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhcnMpOwotICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6RHJhd0RldmljZVRleHQoaW50ICAgICAgICAgICAgICAgICAgICAgIG5DaGFycywKK2Jvb2wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6RHJhd0RldmljZVRleHQoaW50ICAgICAgICAgICAgICAgICAgICAgIG5DaGFycywKICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqICAgIHBDaGFyUG9zLAogICAgICAgICBDRlhfRm9udCogICAgICAgICAgICAgICAgcEZvbnQsCiAgICAgICAgIENGWF9Gb250Q2FjaGUqICAgICAgICAgICBwQ2FjaGUsCkBAIC04ODYsMjQgKzg4NiwyNCBAQAogICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAoTlVMTCA9PSBwRm9udCB8fCBOVUxMID09IF9jb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBGWF9CT09MIGJCb2xkID0gcEZvbnQtPklzQm9sZCgpOworICAgIGJvb2wgYkJvbGQgPSBwRm9udC0+SXNCb2xkKCk7CiAgICAgaWYgKCFiQm9sZCAmJiBwRm9udC0+R2V0U3Vic3RGb250KCkgJiYKICAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQgPj0gNTAwICYmCiAgICAgICAgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0IDw9IDYwMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgU2F2ZVN0YXRlKCk7CiAgICAgQ0dDb250ZXh0U2V0VGV4dERyYXdpbmdNb2RlKF9jb250ZXh0LCBrQ0dUZXh0RmlsbENsaXApOwotICAgIEZYX0JPT0wgcmV0ID0gRkFMU0U7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKICAgICBpbnQzMl90IGkgPSAwOwogICAgIHdoaWxlIChpIDwgbkNoYXJzKSB7CiAgICAgICAgIGlmIChwQ2hhclBvc1tpXS5tX2JHbHlwaEFkanVzdCB8fCBmb250X3NpemUgPCAwKSB7CiAgICAgICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgICAgICAgICByZXQgPSBDR19EcmF3R2x5cFJ1bihpLCBwQ2hhclBvcywgcEZvbnQsIHBDYWNoZSwgTlVMTCwgcE9iamVjdDJEZXZpY2UsIGZvbnRfc2l6ZSwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogICAgICAgICAgICAgICAgIGlmICghcmV0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtOTIwLDcgKzkyMCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXQgPSBDR19EcmF3R2x5cFJ1bigxLCBjaGFyX3BvcywgcEZvbnQsIHBDYWNoZSwgJmdscGh5X21hdHJpeCwgcE9iamVjdDJEZXZpY2UsIGZvbnRfc2l6ZSwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogICAgICAgICAgICAgaWYgKCFyZXQpIHsKLSAgICAgICAgICAgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOworICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGkgKys7CkBAIC05MzQsNyArOTM0LDcgQEAKICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgcmV0ID0gQ0dfRHJhd0dseXBSdW4oaSwgcENoYXJQb3MsIHBGb250LCBwQ2FjaGUsIE5VTEwsIHBPYmplY3QyRGV2aWNlLCBmb250X3NpemUsIGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKICAgICB9Ci0gICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgICBSZXN0b3JlU3RhdGUoZmFsc2UpOwogICAgIHJldHVybiByZXQ7CiB9CiB2b2lkIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OnNldFN0cm9rZUluZm8oY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBncmFwaFN0YXRlLCBGWF9BUkdCIGFyZ2IsIEZYX0ZMT0FUIGxpbmVXaWR0aCkKQEAgLTEwNzQsNyArMTA3NCw3IEBACiB9CiBDRlhfUXVhcnR6RGV2aWNlOjpDRlhfUXVhcnR6RGV2aWNlKCkKIHsKLSAgICBtX2JPd25lZEJpdG1hcCA9IEZBTFNFOworICAgIG1fYk93bmVkQml0bWFwID0gZmFsc2U7CiAgICAgbV9wQ29udGV4dCA9IE5VTEw7CiB9CiBDRlhfUXVhcnR6RGV2aWNlOjp+Q0ZYX1F1YXJ0ekRldmljZSgpCkBAIC0xMDkwLDcgKzEwOTAsNyBAQAogewogICAgIHJldHVybiBtX3BDb250ZXh0OwogfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlOjpBdHRhY2goQ0dDb250ZXh0UmVmIGNvbnRleHQsIGludDMyX3QgbkRldmljZUNsYXNzKQorYm9vbCBDRlhfUXVhcnR6RGV2aWNlOjpBdHRhY2goQ0dDb250ZXh0UmVmIGNvbnRleHQsIGludDMyX3QgbkRldmljZUNsYXNzKQogewogICAgIGlmIChtX3BDb250ZXh0KSB7CiAgICAgICAgIENHQ29udGV4dFJlbGVhc2UobV9wQ29udGV4dCk7CkBAIC0xMDk5LDMwICsxMDk5LDMwIEBACiAgICAgQ0dDb250ZXh0UmV0YWluKG1fcENvbnRleHQpOwogICAgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBuZXcgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcihtX3BDb250ZXh0LCBuRGV2aWNlQ2xhc3MpOwogICAgIFNldERldmljZURyaXZlcihwRHJpdmVyKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZTo6QXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCkKK2Jvb2wgQ0ZYX1F1YXJ0ekRldmljZTo6QXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCkKIHsKICAgICBTZXRCaXRtYXAocEJpdG1hcCk7CiAgICAgbV9wQ29udGV4dCA9IGNyZWF0ZUNvbnRleHRXaXRoQml0bWFwKHBCaXRtYXApOwogICAgIGlmIChOVUxMID09IG1fcENvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBuZXcgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcihtX3BDb250ZXh0LCBGWERDX0RJU1BMQVkpOwogICAgIFNldERldmljZURyaXZlcihwRHJpdmVyKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZTo6Q3JlYXRlKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0KQorYm9vbCBDRlhfUXVhcnR6RGV2aWNlOjpDcmVhdGUoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQpCiB7CiAgICAgaWYgKCh1aW50OF90KWZvcm1hdCA8IDMyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOwogICAgIGlmICghcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCkpIHsKICAgICAgICAgZGVsZXRlIHBCaXRtYXA7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBtX2JPd25lZEJpdG1hcCA9IFRSVUU7CisgICAgbV9iT3duZWRCaXRtYXAgPSB0cnVlOwogICAgIHJldHVybiBBdHRhY2gocEJpdG1hcCk7CiB9CiAjZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9kaWIvZGliX2ludC5oIGIvY29yZS9zcmMvZnhnZS9kaWIvZGliX2ludC5oCmluZGV4IDgyNWNhYmUuLmE2ODM0ZmQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZGliL2RpYl9pbnQuaAorKysgYi9jb3JlL3NyYy9meGdlL2RpYi9kaWJfaW50LmgKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUJiBjbGlwX3JlY3QsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IGZsYWdzKTsKICAgICB+Q1N0cmV0Y2hFbmdpbmUoKTsKLSAgICBGWF9CT09MCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgYm9vbAkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwogcHVibGljOgogICAgIEZYRElCX0Zvcm1hdCBtX0Rlc3RGb3JtYXQ7CiAgICAgaW50CQltX0Rlc3RCcHAsIG1fU3JjQnBwLCBtX2JIYXNBbHBoYTsKQEAgLTg0LDggKzg0LDggQEAKICAgICBpbnQgCW1fRmxhZ3M7CiAgICAgQ1dlaWdodFRhYmxlCW1fV2VpZ2h0VGFibGU7CiAgICAgaW50CQltX0N1clJvdzsKLSAgICBGWF9CT09MCVN0YXJ0U3RyZXRjaEhvcnooKTsKLSAgICBGWF9CT09MCUNvbnRpbnVlU3RyZXRjaEhvcnooSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIGJvb2wJU3RhcnRTdHJldGNoSG9yeigpOworICAgIGJvb2wJQ29udGludWVTdHJldGNoSG9yeihJRlhfUGF1c2UqIHBQYXVzZSk7CiAgICAgdm9pZAlTdHJldGNoVmVydCgpOwogICAgIGludAkJbV9TdGF0ZTsKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfY29tcG9zaXRlLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9jb21wb3NpdGUuY3BwCmluZGV4IGNiOTlhMzcuLjlmNDU0Y2MgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9jb21wb3NpdGUuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9jb21wb3NpdGUuY3BwCkBAIC0yNzIsNyArMjcyLDcgQEAKICAgICAgICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwogICAgIH0KICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKICAgICAgICAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CiAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7CkBAIC00NjcsNyArNDY3LDcgQEAKICAgICAgICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwogICAgIH0KICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKICAgICAgICAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CiAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7CkBAIC01NTgsNyArNTU4LDcgQEAKICAgICAgICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwogICAgIH0KICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewogICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKQEAgLTYwNSw3ICs2MDUsNyBAQAogICAgIH0KICAgICBpZiAoYmxlbmRfdHlwZSkgewogICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKLSAgICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICAgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewogICAgICAgICAgICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwogICAgICAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewpAQCAtNjg5LDcgKzY4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4pCiB7CiAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICBpZiAoZGVzdF9hbHBoYV9zY2FuID09IE5VTEwpIHsKICAgICAgICAgaWYgKHNyY19hbHBoYV9zY2FuID09IE5VTEwpIHsKICAgICAgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IDA7CkBAIC04OTYsNyArODk2LDcgQEAKICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKQogewogICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKICAgICBpZiAoZGVzdF9hbHBoYV9zY2FuID09IE5VTEwpIHsKICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewpAQCAtOTU3LDcgKzk1Nyw3IEBACiAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikKIHsKICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CiAgICAgaWYgKGRlc3RfYWxwaGFfc2NhbiA9PSBOVUxMKSB7CiAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKQEAgLTExMjEsNyArMTEyMSw3IEBACiAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKQogewogICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOwogICAgIGlmIChzcmNfYWxwaGFfc2NhbiA9PSBOVUxMKSB7CiAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKQEAgLTEyNDMsNyArMTI0Myw3IEBACiBpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfTm9DbGlwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGJsZW5kX3R5cGUsIGludCBkZXN0X0JwcCwgaW50IHNyY19CcHApCiB7CiAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICBpbnQgZGVzdF9nYXAgPSBkZXN0X0JwcCAtIDM7CiAgICAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7CkBAIC0xMjY2LDcgKzEyNjYsNyBAQAogaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX0NsaXAodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IGRlc3RfQnBwLCBpbnQgc3JjX0JwcCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKQogewogICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOwogICAgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CiAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewpAQCAtMTM1Nyw3ICsxMzU3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICAgICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgICAgICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewogICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2NhbiwgMSk7CiAgICAgICAgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKQEAgLTE0ODcsNyArMTQ4Nyw3IEBACiAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICAgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICAgICAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOwogICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7CiAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sIDEpOwpAQCAtMTYzMCw3ICsxNjMwLDcgQEAKIHsKICAgICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKICAgICAgICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgICAgICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgICAgICAgICAgaW50IGJsZW5kZWRfY29sb3I7CiAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7CiAgICAgICAgICAgICAgICAgdWludDhfdCBncmF5ID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKQEAgLTE2NjgsNyArMTY2OCw3IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICAgICAgICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKICAgICAgICAgICAgICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOwpAQCAtMTcwNCw3ICsxNzA0LDcgQEAKIHsKICAgICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKICAgICAgICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgICAgICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgICAgICAgICAgaW50IGJsZW5kZWRfY29sb3I7CiAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7CiAgICAgICAgICAgICAgICAgdWludDhfdCBncmF5ID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKQEAgLTE3NzgsNyArMTc3OCw3IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICAgICAgICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKICAgICAgICAgICAgICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOwpAQCAtMTgzNiw3ICsxODM2LDcgQEAKICAgICBpbnQgcmVzZXRfZ3JheSA9IHBQYWxldHRlWzBdOwogICAgIGludCBzZXRfZ3JheSA9IHBQYWxldHRlWzFdOwogICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgICAgIGludCBibGVuZGVkX2NvbG9yOwogICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7CiAgICAgICAgICAgICB1aW50OF90IGdyYXkgPSAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKSA/IHNldF9ncmF5IDogcmVzZXRfZ3JheTsKQEAgLTE4NzAsNyArMTg3MCw3IEBACiAgICAgaW50IHJlc2V0X2dyYXkgPSBwUGFsZXR0ZVswXTsKICAgICBpbnQgc2V0X2dyYXkgPSBwUGFsZXR0ZVsxXTsKICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewogICAgICAgICAgICAgdWludDhfdCBncmF5ID0gKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkgPyBzZXRfZ3JheSA6IHJlc2V0X2dyYXk7CkBAIC0yNzg3LDcgKzI3ODcsNyBAQAogdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyQXJnYl9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHBpeGVsX2NvdW50LCBpbnQgYmxlbmRfdHlwZSwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKQogewogICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewogICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CiAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKQEAgLTI4NDQsNyArMjg0NCw3IEBACiB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfTm9DbGlwX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBibGVuZF90eXBlLCBpbnQgc3JjX0JwcCkKIHsKICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CiAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewogICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CkBAIC0yODgxLDcgKzI4ODEsNyBAQAogaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9CbGVuZF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IGRlc3RfQnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCiB7CiAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7CiAgICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOwogICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CkBAIC0yOTI4LDcgKzI5MjgsNyBAQAogaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX05vQ2xpcF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IGRlc3RfQnBwLCBpbnQgc3JjX0JwcCkKIHsKICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CiAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewogICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CkBAIC0yOTk1LDcgKzI5OTUsNyBAQAogaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBibGVuZF90eXBlLCBpbnQgc3JjX0JwcCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKQogewogICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7CiAgICAgICAgIGludCBzcmNfYWxwaGEgPSAqY2xpcF9zY2FuICsrOwpAQCAtMzAzOSw3ICszMDM5LDcgQEAKIGlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBibGVuZF90eXBlLCBpbnQgZGVzdF9CcHAsIGludCBzcmNfQnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCiB7CiAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOwogICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKICAgICAgICAgdWludDhfdCBzcmNfYWxwaGEgPSAqY2xpcF9zY2FuICsrOwpAQCAtMzQ5NSw3ICszNDk1LDcgQEAKICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKICAgICB9CiB9Ci1pbmxpbmUgRlhfQk9PTCBfU2NhbmxpbmVDb21wb3NpdG9yX0luaXRTb3VyY2VNYXNrKEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwgaW50IGFscGhhX2ZsYWcsIEZYX0RXT1JEIG1hc2tfY29sb3IsIGludCYgbWFza19hbHBoYSwKK2lubGluZSBib29sIF9TY2FubGluZUNvbXBvc2l0b3JfSW5pdFNvdXJjZU1hc2soRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCBpbnQgYWxwaGFfZmxhZywgRlhfRFdPUkQgbWFza19jb2xvciwgaW50JiBtYXNrX2FscGhhLAogICAgICAgICBpbnQmIG1hc2tfcmVkLCBpbnQmIG1hc2tfZ3JlZW4sIGludCYgbWFza19ibHVlLCBpbnQmIG1hc2tfYmxhY2ssCiAgICAgICAgIHZvaWQqIGljY19tb2R1bGUsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CkBAIC0zNTEzLDcgKzM1MTMsNyBAQAogICAgICAgICBtYXNrX2JsdWUgPSBGWEFSR0JfQihtYXNrX2NvbG9yKTsKICAgICB9CiAgICAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKChkZXN0X2Zvcm1hdCAmIDB4ZmYpID09IDgpIHsKICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKQEAgLTM1NTAsMTUgKzM1NTAsMTUgQEAKICAgICAgICAgICAgIG1hc2tfYmx1ZSA9IG1hc2tfY29sb3JfcFswXTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGlubGluZSB2b2lkIF9TY2FubGluZUNvbXBvc2l0b3JfSW5pdFNvdXJjZVBhbGV0dGUoRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsIEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwKICAgICAgICAgRlhfRFdPUkQqJiBwRGVzdFBhbGV0dGUsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSwKICAgICAgICAgdm9pZCogaWNjX21vZHVsZSwgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gKElDb2RlY19JY2NNb2R1bGUqKWljY19tb2R1bGU7Ci0gICAgRlhfQk9PTCBpc1NyY0NteWsgPSBzcmNfZm9ybWF0ICYgMHgwNDAwID8gVFJVRSA6IEZBTFNFOwotICAgIEZYX0JPT0wgaXNEc3RDbXlrID0gZGVzdF9mb3JtYXQgJiAweDA0MDAgPyBUUlVFIDogRkFMU0U7CisgICAgYm9vbCBpc1NyY0NteWsgPSBzcmNfZm9ybWF0ICYgMHgwNDAwID8gdHJ1ZSA6IGZhbHNlOworICAgIGJvb2wgaXNEc3RDbXlrID0gZGVzdF9mb3JtYXQgJiAweDA0MDAgPyB0cnVlIDogZmFsc2U7CiAgICAgcERlc3RQYWxldHRlID0gTlVMTDsKICAgICBpZiAocEljY1RyYW5zZm9ybSkgewogICAgICAgICBpZiAocFNyY1BhbGV0dGUpIHsKQEAgLTM2NzksNyArMzY3OSw3IEBACiAgICAgbV9wU3JjUGFsZXR0ZSA9IE5VTEw7CiAgICAgbV9wQ2FjaGVTY2FubGluZSA9IE5VTEw7CiAgICAgbV9DYWNoZVNpemUgPSAwOwotICAgIG1fYlJnYkJ5dGVPcmRlciA9IEZBTFNFOworICAgIG1fYlJnYkJ5dGVPcmRlciA9IGZhbHNlOwogICAgIG1fQmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMOwogfQogQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6fkNGWF9TY2FubGluZUNvbXBvc2l0b3IoKQpAQCAtMzY5MSw4ICszNjkxLDggQEAKICAgICAgICAgRlhfRnJlZShtX3BDYWNoZVNjYW5saW5lKTsKICAgICB9CiB9Ci1GWF9CT09MIENGWF9TY2FubGluZUNvbXBvc2l0b3I6OkluaXQoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgaW50MzJfdCB3aWR0aCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1hc2tfY29sb3IsIGludCBibGVuZF90eXBlLCBGWF9CT09MIGJDbGlwLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQorYm9vbCBDRlhfU2NhbmxpbmVDb21wb3NpdG9yOjpJbml0KEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsIGludDMyX3Qgd2lkdGgsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBpbnQgYmxlbmRfdHlwZSwgYm9vbCBiQ2xpcCwgYm9vbCBiUmdiQnl0ZU9yZGVyLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBtX1NyY0Zvcm1hdCA9IHNyY19mb3JtYXQ7CiAgICAgbV9EZXN0Rm9ybWF0ID0gZGVzdF9mb3JtYXQ7CkBAIC0zNzA3LDcgKzM3MDcsNyBAQAogICAgIH0KICAgICBtX3BJY2NUcmFuc2Zvcm0gPSBwSWNjVHJhbnNmb3JtOwogICAgIGlmICgoZGVzdF9mb3JtYXQgJiAweGZmKSA9PSAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9TcmNGb3JtYXQgPT0gRlhESUJfMWJwcE1hc2sgfHwgbV9TcmNGb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKICAgICAgICAgcmV0dXJuIF9TY2FubGluZUNvbXBvc2l0b3JfSW5pdFNvdXJjZU1hc2soZGVzdF9mb3JtYXQsIGFscGhhX2ZsYWcsIG1hc2tfY29sb3IsCkBAIC0zNzE1LDExICszNzE1LDExIEBACiAgICAgICAgICAgICAgICAgcEljY01vZHVsZSwgcEljY1RyYW5zZm9ybSk7CiAgICAgfQogICAgIGlmIChwSWNjVHJhbnNmb3JtID09IE5VTEwgJiYgKH5zcmNfZm9ybWF0ICYgMHgwNDAwKSAmJiAoZGVzdF9mb3JtYXQgJiAweDA0MDApKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoKG1fU3JjRm9ybWF0ICYgMHhmZikgPD0gOCkgewogICAgICAgICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgX1NjYW5saW5lQ29tcG9zaXRvcl9Jbml0U291cmNlUGFsZXR0ZShzcmNfZm9ybWF0LCBkZXN0X2Zvcm1hdCwgbV9wU3JjUGFsZXR0ZSwgcFNyY1BhbGV0dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZSwgcEljY1RyYW5zZm9ybSk7CkBAIC0zNzI3LDcgKzM3MjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICsgKGRlc3RfZm9ybWF0ICYgMHgwMjAwID8gMiA6IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoZGVzdF9mb3JtYXQgJiAweDA0MDAgPyA0IDogMCkKICAgICAgICAgICAgICAgICAgICAgICAgICArICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDEgPyA4IDogMCk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgbV9UcmFuc3BhcmVuY3kgPSAoc3JjX2Zvcm1hdCAmIDB4MDIwMCA/IDAgOiAxKQogICAgICAgICAgICAgICAgICAgICAgKyAoZGVzdF9mb3JtYXQgJiAweDAyMDAgPyAwIDogMikKQEAgLTM3MzYsNyArMzczNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICArIChzcmNfZm9ybWF0ICYgMHgwNDAwID8gMTYgOiAwKQogICAgICAgICAgICAgICAgICAgICAgKyAoZGVzdF9mb3JtYXQgJiAweDA0MDAgPyAzMiA6IDApCiAgICAgICAgICAgICAgICAgICAgICArIChwSWNjVHJhbnNmb3JtID8gNjQgOiAwKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6Q29tcG9zaXRlUmdiQml0bWFwTGluZSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2V4dHJhX2FscGhhLCB1aW50OF90KiBkc3RfZXh0cmFfYWxwaGEpCkBAIC00MDU5LDIyICs0MDU5LDIyIEBACiAgICAgICAgIF9Db21wb3NpdGVSb3dfQml0TWFzazJSZ2IoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2xlZnQsIHdpZHRoLCBtX0JsZW5kVHlwZSwgKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDMsIGNsaXBfc2Nhbik7CiB9Ci1GWF9CT09MIENGWF9ESUJpdG1hcDo6Q29tcG9zaXRlQml0bWFwKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorYm9vbCBDRlhfRElCaXRtYXA6OkNvbXBvc2l0ZUJpdG1hcChpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBib29sIGJSZ2JCeXRlT3JkZXIsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBBU1NFUlQoIXBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpOwogICAgIEFTU0VSVChtX2JwcCA+PSA4KTsKICAgICBpZiAocFNyY0JpdG1hcC0+SXNBbHBoYU1hc2soKSB8fCBtX2JwcCA8IDgpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEdldE92ZXJsYXBSZWN0KGRlc3RfbGVmdCwgZGVzdF90b3AsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAtPkdldFdpZHRoKCksIHBTcmNCaXRtYXAtPkdldEhlaWdodCgpLAogICAgICAgICAgICAgICAgICAgIHNyY19sZWZ0LCBzcmNfdG9wLCBwQ2xpcFJnbik7CiAgICAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBDbGlwTWFzayA9IE5VTEw7CiAgICAgRlhfUkVDVCBjbGlwX2JveDsKQEAgLTQwODYsMTEgKzQwODYsMTEgQEAKICAgICBDRlhfU2NhbmxpbmVDb21wb3NpdG9yIGNvbXBvc2l0b3I7CiAgICAgaWYgKCFjb21wb3NpdG9yLkluaXQoR2V0Rm9ybWF0KCksIHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpLCB3aWR0aCwgcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpLCAwLCBibGVuZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTWFzayAhPSBOVUxMLCBiUmdiQnl0ZU9yZGVyLCAwLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IGRlc3RfQnBwID0gbV9icHAgLyA4OwogICAgIGludCBzcmNfQnBwID0gcFNyY0JpdG1hcC0+R2V0QlBQKCkgLyA4OwotICAgIEZYX0JPT0wgYlJnYiA9IHNyY19CcHAgPiAxICYmICFwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpOworICAgIGJvb2wgYlJnYiA9IHNyY19CcHAgPiAxICYmICFwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpOwogICAgIENGWF9ESUJpdG1hcCogcFNyY0FscGhhTWFzayA9IHBTcmNCaXRtYXAtPm1fcEFscGhhTWFzazsKICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewogICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyAoZGVzdF90b3AgKyByb3cpICogbV9QaXRjaCArIGRlc3RfbGVmdCAqIGRlc3RfQnBwOwpAQCAtNDEwNywyNyArNDEwNywyNyBAQAogICAgICAgICAgICAgY29tcG9zaXRvci5Db21wb3NpdGVQYWxCaXRtYXBMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19sZWZ0LCB3aWR0aCwgY2xpcF9zY2FuLCBzcmNfc2Nhbl9leHRyYV9hbHBoYSwgZHN0X3NjYW5fZXh0cmFfYWxwaGEpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfRElCaXRtYXA6OkNvbXBvc2l0ZU1hc2soaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitib29sIENGWF9ESUJpdG1hcDo6Q29tcG9zaXRlTWFzayhpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBNYXNrLCBGWF9EV09SRCBjb2xvciwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBib29sIGJSZ2JCeXRlT3JkZXIsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQVNTRVJUKHBNYXNrLT5Jc0FscGhhTWFzaygpKTsKICAgICBBU1NFUlQobV9icHAgPj0gOCk7CiAgICAgaWYgKCFwTWFzay0+SXNBbHBoYU1hc2soKSB8fCBtX2JwcCA8IDgpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEdldE92ZXJsYXBSZWN0KGRlc3RfbGVmdCwgZGVzdF90b3AsIHdpZHRoLCBoZWlnaHQsIHBNYXNrLT5HZXRXaWR0aCgpLCBwTWFzay0+R2V0SGVpZ2h0KCksIHNyY19sZWZ0LCBzcmNfdG9wLCBwQ2xpcFJnbik7CiAgICAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpbnQgc3JjX2FscGhhID0gKHVpbnQ4X3QpKGFscGhhX2ZsYWcgPj4gOCkgPyAoYWxwaGFfZmxhZyAmIDB4ZmYpIDogRlhBUkdCX0EoY29sb3IpOwogICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcENsaXBNYXNrID0gTlVMTDsKICAgICBGWF9SRUNUIGNsaXBfYm94OwpAQCAtNDE0MCw3ICs0MTQwLDcgQEAKICAgICBpbnQgQnBwID0gR2V0QlBQKCkgLyA4OwogICAgIENGWF9TY2FubGluZUNvbXBvc2l0b3IgY29tcG9zaXRvcjsKICAgICBpZiAoIWNvbXBvc2l0b3IuSW5pdChHZXRGb3JtYXQoKSwgcE1hc2stPkdldEZvcm1hdCgpLCB3aWR0aCwgTlVMTCwgY29sb3IsIGJsZW5kX3R5cGUsIHBDbGlwTWFzayAhPSBOVUxMLCBiUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wQnVmZmVyICsgKGRlc3RfdG9wICsgcm93KSAqIG1fUGl0Y2ggKyBkZXN0X2xlZnQgKiBCcHA7CkBAIC00MTU2LDIxICs0MTU2LDIxIEBACiAgICAgICAgICAgICBjb21wb3NpdG9yLkNvbXBvc2l0ZUJ5dGVNYXNrTGluZShkZXN0X3NjYW4sIHNyY19zY2FuICsgc3JjX2xlZnQsIHdpZHRoLCBjbGlwX3NjYW4sIGRzdF9zY2FuX2V4dHJhX2FscGhhKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDb21wb3NpdGVSZWN0KGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKK2Jvb2wgQ0ZYX0RJQml0bWFwOjpDb21wb3NpdGVSZWN0KGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGludCBzcmNfYWxwaGEgPSAoYWxwaGFfZmxhZyA+PiA4KSA/IChhbHBoYV9mbGFnICYgMHhmZikgOiBGWEFSR0JfQShjb2xvcik7CiAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgRlhfUkVDVCByZWN0KGxlZnQsIHRvcCwgbGVmdCArIHdpZHRoLCB0b3AgKyBoZWlnaHQpOwogICAgIHJlY3QuSW50ZXJzZWN0KDAsIDAsIG1fV2lkdGgsIG1fSGVpZ2h0KTsKICAgICBpZiAocmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICB3aWR0aCA9IHJlY3QuV2lkdGgoKTsKICAgICBGWF9EV09SRCBkc3RfY29sb3I7CkBAIC00MjEwLDcgKzQyMTAsNyBAQAogICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKG1fYnBwID09IDEpIHsKICAgICAgICAgQVNTRVJUKCFJc0NteWtJbWFnZSgpICYmICh1aW50OF90KShhbHBoYV9mbGFnID4+IDgpID09IDApOwpAQCAtNDI0OCwxMSArNDI0OCwxMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIEFTU0VSVChtX2JwcCA+PSAyNCk7CiAgICAgaWYgKG1fYnBwIDwgMjQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChwSWNjVHJhbnNmb3JtICYmIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCkpIHsKICAgICAgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwpAQCAtNDI2MiwxNSArNDI2MiwxNSBAQAogICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjb2xvciksIEZYU1lTX0dldE1WYWx1ZShjb2xvciksIEZYU1lTX0dldFlWYWx1ZShjb2xvciksIEZYU1lTX0dldEtWYWx1ZShjb2xvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfcFsyXSwgY29sb3JfcFsxXSwgY29sb3JfcFswXSk7CiAgICAgICAgIGVsc2UgaWYgKCEoYWxwaGFfZmxhZyA+PiA4KSAmJiBJc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYoIUlzQ215a0ltYWdlKCkpIHsKICAgICAgICAgY29sb3JfcFszXSA9ICh1aW50OF90KXNyY19hbHBoYTsKICAgICB9CiAgICAgaW50IEJwcCA9IG1fYnBwIC8gODsKLSAgICBGWF9CT09MIGJBbHBoYSA9IEhhc0FscGhhKCk7Ci0gICAgRlhfQk9PTCBiQXJnYiA9IEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IgPyBUUlVFIDogRkFMU0U7CisgICAgYm9vbCBiQWxwaGEgPSBIYXNBbHBoYSgpOworICAgIGJvb2wgYkFyZ2IgPSBHZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiID8gdHJ1ZSA6IGZhbHNlOwogICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CiAgICAgICAgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93ICsrKSB7CiAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoICsgcmVjdC5sZWZ0ICogQnBwOwpAQCAtNDI5MSw3ICs0MjkxLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdyArKykgewogICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoICsgcmVjdC5sZWZ0ICogQnBwOwpAQCAtNDM0Niw3ICs0MzQ2LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIENGWF9CaXRtYXBDb21wb3Nlcjo6Q0ZYX0JpdG1hcENvbXBvc2VyKCkKIHsKQEAgLTQzNTQsNyArNDM1NCw3IEBACiAgICAgbV9wU2NhbmxpbmVBbHBoYVYgPSBOVUxMOwogICAgIG1fcENsaXBTY2FuViA9IE5VTEw7CiAgICAgbV9wQWRkQ2xpcFNjYW4gPSBOVUxMOwotICAgIG1fYlJnYkJ5dGVPcmRlciA9IEZBTFNFOworICAgIG1fYlJnYkJ5dGVPcmRlciA9IGZhbHNlOwogICAgIG1fQmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMOwogfQogQ0ZYX0JpdG1hcENvbXBvc2VyOjp+Q0ZYX0JpdG1hcENvbXBvc2VyKCkKQEAgLTQzNzMsOCArNDM3Myw4IEBACiAgICAgfQogfQogdm9pZCBDRlhfQml0bWFwQ29tcG9zZXI6OkNvbXBvc2UoQ0ZYX0RJQml0bWFwKiBwRGVzdCwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBpbnQgYml0bWFwX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwgRlhfUkVDVCYgZGVzdF9yZWN0LCBGWF9CT09MIGJWZXJ0aWNhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsaXBYLCBGWF9CT09MIGJGbGlwWSwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwgRlhfUkVDVCYgZGVzdF9yZWN0LCBib29sIGJWZXJ0aWNhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZsaXBYLCBib29sIGJGbGlwWSwgYm9vbCBiUmdiQnl0ZU9yZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogewogICAgIG1fcEJpdG1hcCA9IHBEZXN0OwpAQCAtNDM5NywxMiArNDM5NywxMiBAQAogICAgIG1fYlJnYkJ5dGVPcmRlciA9IGJSZ2JCeXRlT3JkZXI7CiAgICAgbV9CbGVuZFR5cGUgPSBibGVuZF90eXBlOwogfQotRlhfQk9PTCBDRlhfQml0bWFwQ29tcG9zZXI6OlNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKQorYm9vbCBDRlhfQml0bWFwQ29tcG9zZXI6OlNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKQogewogICAgIG1fU3JjRm9ybWF0ID0gc3JjX2Zvcm1hdDsKICAgICBpZiAoIW1fQ29tcG9zaXRvci5Jbml0KG1fcEJpdG1hcC0+R2V0Rm9ybWF0KCksIHNyY19mb3JtYXQsIHdpZHRoLCBwU3JjUGFsZXR0ZSwgbV9NYXNrQ29sb3IsIEZYRElCX0JMRU5EX05PUk1BTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENsaXBNYXNrICE9IE5VTEwgfHwgKG1fQml0bWFwQWxwaGEgPCAyNTUpLCBtX2JSZ2JCeXRlT3JkZXIsIG1fQWxwaGFGbGFnLCBtX3BJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9iVmVydGljYWwpIHsKICAgICAgICAgbV9wU2NhbmxpbmVWID0gRlhfQWxsb2ModWludDhfdCwgbV9wQml0bWFwLT5HZXRCUFAoKSAvIDggKiB3aWR0aCArIDQpOwpAQCAtNDQxNCw3ICs0NDE0LDcgQEAKICAgICBpZiAobV9CaXRtYXBBbHBoYSA8IDI1NSkgewogICAgICAgICBtX3BBZGRDbGlwU2NhbiA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fYlZlcnRpY2FsID8gbV9wQml0bWFwLT5HZXRIZWlnaHQoKSA6IG1fcEJpdG1hcC0+R2V0V2lkdGgoKSk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDRlhfQml0bWFwQ29tcG9zZXI6OkRvQ29tcG9zZSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgZGVzdF93aWR0aCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfZXh0cmFfYWxwaGEsIHVpbnQ4X3QqIGRzdF9leHRyYV9hbHBoYSkKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9jb252ZXJ0LmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9jb252ZXJ0LmNwcAppbmRleCBkNzg2MGFlLi43ZTVhMDM0IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfY29udmVydC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX2NvbnZlcnQuY3BwCkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICBDRlhfUGFsZXR0ZSgpOwogICAgIH5DRlhfUGFsZXR0ZSgpOwogcHVibGljOgotICAgIEZYX0JPT0wgICAgICBCdWlsZFBhbGV0dGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGR3UGFsZXR0ZVR5cGUpOworICAgIGJvb2wgICAgICBCdWlsZFBhbGV0dGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGR3UGFsZXR0ZVR5cGUpOwogICAgIEZYX0RXT1JEKiAgICBHZXRQYWxldHRlKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BQYWxldHRlOwpAQCAtMjI3LDEwICsyMjcsMTAgQEAKICAgICB9CiAgICAgbV9sdXQgPSAwOwogfQotRlhfQk9PTCBDRlhfUGFsZXR0ZTo6QnVpbGRQYWxldHRlKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBwYWxfdHlwZSkKK2Jvb2wgQ0ZYX1BhbGV0dGU6OkJ1aWxkUGFsZXR0ZShjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgcGFsX3R5cGUpCiB7CiAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fcFBhbGV0dGUgIT0gTlVMTCkgewogICAgICAgICBGWF9GcmVlKG1fcFBhbGV0dGUpOwpAQCAtMjc3LDkgKzI3Nyw5IEBACiAgICAgICAgIHdpbl9tYWNfcGFsID0gKEZYX0RXT1JEKilnX2R3TWFjUGFsZXR0ZTsKICAgICB9CiAgICAgX09idGFpbl9QYWwobV9hTHV0LCBtX2NMdXQsIG1fcFBhbGV0dGUsIHBhbF90eXBlLCB3aW5fbWFjX3BhbCwgbV9sdXQpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl8xYnBwTWFzazJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorYm9vbCBfQ29udmVydEJ1ZmZlcl8xYnBwTWFzazJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3ApCiB7CiAgICAgdWludDhfdCBzZXRfZ3JheSwgcmVzZXRfZ3JheTsKQEAgLTI5Niw5ICsyOTYsOSBAQAogICAgICAgICAgICAgZGVzdF9zY2FuICsrOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl84YnBwTWFzazJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorYm9vbCBfQ29udmVydEJ1ZmZlcl84YnBwTWFzazJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3ApCiB7CiAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKQEAgLTMwNiw5ICszMDYsOSBAQAogICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQ7CiAgICAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl8xYnBwUGx0MkdyYXkodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitib29sIF9Db252ZXJ0QnVmZmVyXzFicHBQbHQyR3JheSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgRlhfRFdPUkQqIHNyY19wbHQgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCk7CkBAIC0zNTksOSArMzU5LDkgQEAKICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfOGJwcFBsdDJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorYm9vbCBfQ29udmVydEJ1ZmZlcl84YnBwUGx0MkdyYXkodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIEZYX0RXT1JEKiBzcmNfcGx0ID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpOwpAQCAtNDAyLDkgKzQwMiw5IEBACiAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBncmF5WypzcmNfc2NhbisrXTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfUmdiT3JDbXlrMkdyYXkodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitib29sIF9Db252ZXJ0QnVmZmVyX1JnYk9yQ215azJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGludCBCcHAgPSBwU3JjQml0bWFwLT5HZXRCUFAoKSAvIDg7CkBAIC00NTEsNyArNDUxLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGlubGluZSB2b2lkIF9Db252ZXJ0QnVmZmVyX0luZGV4Q29weSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wKQpAQCAtNDc2LDcgKzQ3Niw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyX1BsdDJQbHRSZ2I4KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorYm9vbCBfQ29udmVydEJ1ZmZlcl9QbHQyUGx0UmdiOCh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgRlhfRFdPUkQqIGRzdF9wbHQsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgX0NvbnZlcnRCdWZmZXJfSW5kZXhDb3B5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7CkBAIC01MTUsOSArNTE1LDkgQEAKICAgICAgICAgICAgIEZYU1lTX21lbWNweShkc3RfcGx0LCBzcmNfcGx0LCBwbHRfc2l6ZSAqIDQpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotaW5saW5lIEZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfUmdiMlBsdFJnYjhfTm9UcmFuc2Zvcm0odWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitpbmxpbmUgYm9vbCBfQ29udmVydEJ1ZmZlcl9SZ2IyUGx0UmdiOF9Ob1RyYW5zZm9ybSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgRlhfRFdPUkQqIGRzdF9wbHQpCiB7CiAgICAgaW50IGJwcCA9IHBTcmNCaXRtYXAtPkdldEJQUCgpIC8gODsKQEAgLTUyNyw3ICs1MjcsNyBAQAogICAgIEZYX0RXT1JEKiBjTHV0ID0gcGFsZXR0ZS5HZXRDb2xvckx1dCgpOwogICAgIEZYX0RXT1JEKiBhTHV0ID0gcGFsZXR0ZS5HZXRBbW91bnRMdXQoKTsKICAgICBpZiAoY0x1dCA9PSBOVUxMIHx8IGFMdXQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IGx1dCA9IHBhbGV0dGUuR2V0bHV0KCk7CiAgICAgRlhfRFdPUkQqIHBQYWxldHRlID0gcGFsZXR0ZS5HZXRQYWxldHRlKCk7CkBAIC01NzEsMTIgKzU3MSwxMiBAQAogICAgICAgICB9CiAgICAgfQogICAgIEZYU1lTX21lbWNweShkc3RfcGx0LCBwUGFsZXR0ZSwgc2l6ZW9mKEZYX0RXT1JEKSAqIDI1Nik7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyX1JnYjJQbHRSZ2I4KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorYm9vbCBfQ29udmVydEJ1ZmZlcl9SZ2IyUGx0UmdiOCh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgRlhfRFdPUkQqIGRzdF9wbHQsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7Ci0gICAgRlhfQk9PTCByZXQgPSBfQ29udmVydEJ1ZmZlcl9SZ2IyUGx0UmdiOF9Ob1RyYW5zZm9ybShkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIGRzdF9wbHQpOworICAgIGJvb2wgcmV0ID0gX0NvbnZlcnRCdWZmZXJfUmdiMlBsdFJnYjhfTm9UcmFuc2Zvcm0oZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBkc3RfcGx0KTsKICAgICBpZiAocmV0ICYmIHBJY2NUcmFuc2Zvcm0pIHsKICAgICAgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CkBAIC01ODgsNyArNTg4LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KLUZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfMWJwcE1hc2syUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK2Jvb2wgX0NvbnZlcnRCdWZmZXJfMWJwcE1hc2syUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3ApCiB7CiAgICAgaW50IGNvbXBzID0gKGRzdF9mb3JtYXQgJiAweGZmKSAvIDg7CkBAIC02MTEsOSArNjExLDkgQEAKICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBjb21wczsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfOGJwcE1hc2syUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK2Jvb2wgX0NvbnZlcnRCdWZmZXJfOGJwcE1hc2syUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3ApCiB7CiAgICAgaW50IGNvbXBzID0gKGRzdF9mb3JtYXQgJiAweGZmKSAvIDg7CkBAIC02MjksOSArNjI5LDkgQEAKICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBjb21wcyAtIDI7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyXzFicHBQbHQyUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK2Jvb2wgX0NvbnZlcnRCdWZmZXJfMWJwcFBsdDJSZ2IoRlhESUJfRm9ybWF0IGRzdF9mb3JtYXQsIHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGludCBjb21wcyA9IChkc3RfZm9ybWF0ICYgMHhmZikgLyA4OwpAQCAtNjc2LDkgKzY3Niw5IEBACiAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gY29tcHMgLSAyOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl84YnBwUGx0MlJnYihGWERJQl9Gb3JtYXQgZHN0X2Zvcm1hdCwgdWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitib29sIF9Db252ZXJ0QnVmZmVyXzhicHBQbHQyUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpbnQgY29tcHMgPSAoZHN0X2Zvcm1hdCAmIDB4ZmYpIC8gODsKQEAgLTcyMiw5ICs3MjIsOSBAQAogICAgICAgICAgICAgZGVzdF9zY2FuICs9IGNvbXBzIC0gMjsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfMjRicHBSZ2IyUmdiMjQodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitib29sIF9Db252ZXJ0QnVmZmVyXzI0YnBwUmdiMlJnYjI0KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7CkBAIC03NDEsOSArNzQxLDkgQEAKICAgICAgICAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCAqIDMpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl8zMmJwcFJnYjJSZ2IyNCh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK2Jvb2wgX0NvbnZlcnRCdWZmZXJfMzJicHBSZ2IyUmdiMjQodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKQEAgLTc2Myw5ICs3NjMsOSBAQAogICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBkZXN0X3NjYW4sIHdpZHRoKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfUmdiMlJnYjMyKHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorYm9vbCBfQ29udmVydEJ1ZmZlcl9SZ2IyUmdiMzIodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGludCBjb21wcyA9IHBTcmNCaXRtYXAtPkdldEJQUCgpIC8gODsKQEAgLTc5Myw5ICs3OTMsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl8zMmJwcENteWsyUmdiMzIodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitib29sIF9Db252ZXJ0QnVmZmVyXzMyYnBwQ215azJSZ2IzMih1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKQEAgLTgyMSw5ICs4MjEsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDb252ZXJ0QnVmZmVyKEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwgdWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitib29sIENvbnZlcnRCdWZmZXIoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCBGWF9EV09SRComIGRfcGFsLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0ID0gcFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCk7CkBAIC04MzUsOCArODM1LDggQEAKICAgICAgICAgY2FzZSBGWERJQl8xYnBwQ215azoKICAgICAgICAgY2FzZSBGWERJQl8xYnBwTWFzazoKICAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOgotICAgICAgICAgICAgQVNTRVJUKEZBTFNFKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIEFTU0VSVChmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6IHsKICAgICAgICAgICAgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkpIHsKQEAgLTg1Myw3ICs4NTMsNyBAQAogICAgICAgICAgICAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID49IDI0KSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl9SZ2JPckNteWsyR3JheShkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIHBJY2NUcmFuc2Zvcm0pOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6CiAgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYmE6IHsKQEAgLTg2Nyw3ICs4NjcsNyBAQAogICAgICAgICAgICAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID49IDI0KSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl9SZ2IyUGx0UmdiOChkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIGRfcGFsLCBwSWNjVHJhbnNmb3JtKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgY2FzZSBGWERJQl9SZ2I6CiAgICAgICAgIGNhc2UgRlhESUJfUmdiYTogewpAQCAtODg5LDcgKzg4OSw3IEBACiAgICAgICAgICAgICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gMzIpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzMyYnBwUmdiMlJnYjI0KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgcEljY1RyYW5zZm9ybSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIGNhc2UgRlhESUJfQXJnYjoKICAgICAgICAgY2FzZSBGWERJQl9SZ2IzMjogewpAQCAtOTExLDEyICs5MTEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfUmdiMlJnYjMyKGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgcEljY1RyYW5zZm9ybSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBDRlhfRElCaXRtYXAqIENGWF9ESUJTb3VyY2U6OkNsb25lQ29udmVydChGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwLCB2b2lkKiBwSWNjVHJhbnNmb3JtKSBjb25zdAogewpAQCAtOTM5LDcgKzkzOSw3IEBACiAgICAgICAgIGRlbGV0ZSBwQ2xvbmU7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBGWF9CT09MIHJldCA9IFRSVUU7CisgICAgYm9vbCByZXQgPSB0cnVlOwogICAgIENGWF9ESUJpdG1hcCogcFNyY0FscGhhID0gTlVMTDsKICAgICBpZiAobV9BbHBoYUZsYWcgJiAyKSB7CiAgICAgICAgIHBTcmNBbHBoYSA9IChHZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKSA/IEdldEFscGhhTWFzaygpIDogbV9wQWxwaGFNYXNrOwpAQCAtOTgxLDE1ICs5ODEsMTUgQEAKICAgICB9CiAgICAgcmV0dXJuIHBDbG9uZTsKIH0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDb252ZXJ0Rm9ybWF0KEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwgdm9pZCogcEljY1RyYW5zZm9ybSkKK2Jvb2wgQ0ZYX0RJQml0bWFwOjpDb252ZXJ0Rm9ybWF0KEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCA9IEdldEZvcm1hdCgpOwogICAgIGlmIChkZXN0X2Zvcm1hdCA9PSBzcmNfZm9ybWF0ICYmIHBJY2NUcmFuc2Zvcm0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChkZXN0X2Zvcm1hdCA9PSBGWERJQl84YnBwTWFzayAmJiBzcmNfZm9ybWF0ID09IEZYRElCXzhicHBSZ2IgJiYgbV9wUGFsZXR0ZSA9PSBOVUxMKSB7CiAgICAgICAgIG1fQWxwaGFGbGFnID0gMTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYiAmJiBzcmNfZm9ybWF0ID09IEZYRElCX1JnYjMyICYmIHBJY2NUcmFuc2Zvcm0gPT0gTlVMTCkgewogICAgICAgICBtX0FscGhhRmxhZyA9IDI7CkBAIC0xMDAwLDEzICsxMDAwLDEzIEBACiAgICAgICAgICAgICAgICAgc2NhbmxpbmUgKz0gNDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGludCBkZXN0X2JwcCA9IGRlc3RfZm9ybWF0ICYgMHhmZjsKICAgICBpbnQgZGVzdF9waXRjaCA9IChkZXN0X2JwcCAqIG1fV2lkdGggKyAzMSkgLyAzMiAqIDQ7CiAgICAgdWludDhfdCogZGVzdF9idWYgPSBGWF9UcnlBbGxvYyh1aW50OF90LCBkZXN0X3BpdGNoICogbV9IZWlnaHQgKyA0KTsKICAgICBpZiAoZGVzdF9idWYgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX0RJQml0bWFwKiBwQWxwaGFNYXNrID0gTlVMTDsKICAgICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYikgewpAQCAtMTAyNiwxMyArMTAyNiwxMyBAQAogICAgICAgICAgICAgcEFscGhhTWFzayA9IEdldEFscGhhTWFzaygpOwogICAgICAgICAgICAgaWYgKHBBbHBoYU1hc2sgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEZYX0ZyZWUoZGVzdF9idWYpOwotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobV9wQWxwaGFNYXNrID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpZiAoIUJ1aWxkQWxwaGFNYXNrKCkpIHsKICAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShkZXN0X2J1Zik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwQWxwaGFNYXNrID0gbV9wQWxwaGFNYXNrOwogICAgICAgICAgICAgICAgIG1fcEFscGhhTWFzayA9IE5VTEw7CkBAIC0xMDQxLDcgKzEwNDEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIEZYX0JPT0wgcmV0ID0gRkFMU0U7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKICAgICBGWF9EV09SRCogcGFsXzhicHAgPSBOVUxMOwogICAgIHJldCA9IENvbnZlcnRCdWZmZXIoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLCBtX1dpZHRoLCBtX0hlaWdodCwgdGhpcywgMCwgMCwgcGFsXzhicHAsIHBJY2NUcmFuc2Zvcm0pOwogICAgIGlmICghcmV0KSB7CkBAIC0xMDU0LDcgKzEwNTQsNyBAQAogICAgICAgICBpZiAoZGVzdF9idWYpIHsKICAgICAgICAgICAgIEZYX0ZyZWUoZGVzdF9idWYpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9wQWxwaGFNYXNrICYmIHBBbHBoYU1hc2sgIT0gbV9wQWxwaGFNYXNrKSB7CiAgICAgICAgIGRlbGV0ZSBtX3BBbHBoYU1hc2s7CkBAIC0xMDY3LDEwICsxMDY3LDEwIEBACiAgICAgaWYgKCFtX2JFeHRCdWYpIHsKICAgICAgICAgRlhfRnJlZShtX3BCdWZmZXIpOwogICAgIH0KLSAgICBtX2JFeHRCdWYgPSBGQUxTRTsKKyAgICBtX2JFeHRCdWYgPSBmYWxzZTsKICAgICBtX3BCdWZmZXIgPSBkZXN0X2J1ZjsKICAgICBtX2JwcCA9ICh1aW50OF90KWRlc3RfZm9ybWF0OwogICAgIG1fQWxwaGFGbGFnID0gKHVpbnQ4X3QpKGRlc3RfZm9ybWF0ID4+IDgpOwogICAgIG1fUGl0Y2ggPSBkZXN0X3BpdGNoOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX2VuZ2luZS5jcHAgYi9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfZW5naW5lLmNwcAppbmRleCA3MzkwYzQzLi5mMTQzYWMzIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfZW5naW5lLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfZW5naW5lLmNwcApAQCAtMjE3LDcgKzIxNyw3IEBACiAgICAgbV9TcmNIZWlnaHQgPSBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKTsKICAgICBtX1NyY1BpdGNoID0gKG1fU3JjV2lkdGggKiBtX1NyY0JwcCArIDMxKSAvIDMyICogNDsKICAgICBpZiAoKGZsYWdzICYgRlhESUJfTk9TTU9PVEgpID09IDApIHsKLSAgICAgICAgRlhfQk9PTCBiSW50ZXJwb2wgPSBmbGFncyAmIEZYRElCX0lOVEVSUE9MIHx8IGZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTDsKKyAgICAgICAgYm9vbCBiSW50ZXJwb2wgPSBmbGFncyAmIEZYRElCX0lOVEVSUE9MIHx8IGZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTDsKICAgICAgICAgaWYgKCFiSW50ZXJwb2wgJiYgRlhTWVNfYWJzKGRlc3Rfd2lkdGgpICE9IDAgJiYgRlhTWVNfYWJzKGRlc3RfaGVpZ2h0KSA8IG1fU3JjV2lkdGggKiBtX1NyY0hlaWdodCAqIDggLyBGWFNZU19hYnMoZGVzdF93aWR0aCkpIHsKICAgICAgICAgICAgIGZsYWdzID0gRlhESUJfSU5URVJQT0w7CiAgICAgICAgIH0KQEAgLTI4MCwxNiArMjgwLDE2IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1GWF9CT09MIENTdHJldGNoRW5naW5lOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKK2Jvb2wgQ1N0cmV0Y2hFbmdpbmU6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQogewogICAgIHdoaWxlIChtX1N0YXRlID09IDEpIHsKICAgICAgICAgaWYgKENvbnRpbnVlU3RyZXRjaEhvcnoocFBhdXNlKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBtX1N0YXRlID0gMjsKICAgICAgICAgU3RyZXRjaFZlcnQoKTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIENTdHJldGNoRW5naW5lOjp+Q1N0cmV0Y2hFbmdpbmUoKQogewpAQCAtMzA2LDQ2ICszMDYsNDYgQEAKICAgICAgICAgRlhfRnJlZShtX3BEZXN0TWFza1NjYW5saW5lKTsKICAgICB9CiB9Ci1GWF9CT09MIENTdHJldGNoRW5naW5lOjpTdGFydFN0cmV0Y2hIb3J6KCkKK2Jvb2wgQ1N0cmV0Y2hFbmdpbmU6OlN0YXJ0U3RyZXRjaEhvcnooKQogewogICAgIGlmIChtX0Rlc3RXaWR0aCA9PSAwIHx8IG1fcERlc3RTY2FubGluZSA9PSBOVUxMIHx8IG1fU3JjQ2xpcC5IZWlnaHQoKSA+IChpbnQpKCgxVSA8PCAyOSkgLyBtX0ludGVyUGl0Y2gpIHx8IG1fU3JjQ2xpcC5IZWlnaHQoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BJbnRlckJ1ZiA9IEZYX1RyeUFsbG9jKHVuc2lnbmVkIGNoYXIsIG1fU3JjQ2xpcC5IZWlnaHQoKSAqIG1fSW50ZXJQaXRjaCk7CiAgICAgaWYgKG1fcEludGVyQnVmID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX3BTb3VyY2UgJiYgbV9iSGFzQWxwaGEgJiYgbV9wU291cmNlLT5tX3BBbHBoYU1hc2spIHsKICAgICAgICAgbV9wRXh0cmFBbHBoYUJ1ZiA9IEZYX0FsbG9jMkQodW5zaWduZWQgY2hhciwgbV9TcmNDbGlwLkhlaWdodCgpLCBtX0V4dHJhTWFza1BpdGNoKTsKICAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IChtX0Rlc3RDbGlwLldpZHRoKCkgKiA4ICsgMzEpIC8gMzIgKiA0OwogICAgICAgICBtX3BEZXN0TWFza1NjYW5saW5lID0gRlhfVHJ5QWxsb2ModW5zaWduZWQgY2hhciwgc2l6ZSk7CiAgICAgICAgIGlmICghbV9wRGVzdE1hc2tTY2FubGluZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIG1fV2VpZ2h0VGFibGUuQ2FsYyhtX0Rlc3RXaWR0aCwgbV9EZXN0Q2xpcC5sZWZ0LCBtX0Rlc3RDbGlwLnJpZ2h0LCBtX1NyY1dpZHRoLCBtX1NyY0NsaXAubGVmdCwgbV9TcmNDbGlwLnJpZ2h0LCBtX0ZsYWdzKTsKICAgICBpZiAobV9XZWlnaHRUYWJsZS5tX3BXZWlnaHRUYWJsZXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9DdXJSb3cgPSBtX1NyY0NsaXAudG9wOwogICAgIG1fU3RhdGUgPSAxOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogI2RlZmluZSBGWF9TVFJFQ0hfUEFVU0VfUk9XUwkxMAotRlhfQk9PTCBDU3RyZXRjaEVuZ2luZTo6Q29udGludWVTdHJldGNoSG9yeihJRlhfUGF1c2UqIHBQYXVzZSkKK2Jvb2wgQ1N0cmV0Y2hFbmdpbmU6OkNvbnRpbnVlU3RyZXRjaEhvcnooSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaWYgKCFtX0Rlc3RXaWR0aCkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgaWYgKG1fcFNvdXJjZS0+U2tpcFRvU2NhbmxpbmUobV9DdXJSb3csIHBQYXVzZSkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpbnQgQnBwID0gbV9EZXN0QnBwIC8gODsKICAgICBpbnQgcm93c190b19nbyA9IEZYX1NUUkVDSF9QQVVTRV9ST1dTOwogICAgIGZvciAoOyBtX0N1clJvdyA8IG1fU3JjQ2xpcC5ib3R0b207IG1fQ3VyUm93ICsrKSB7CiAgICAgICAgIGlmIChyb3dzX3RvX2dvID09IDApIHsKICAgICAgICAgICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByb3dzX3RvX2dvID0gRlhfU1RSRUNIX1BBVVNFX1JPV1M7CiAgICAgICAgIH0KQEAgLTUzMiw3ICs1MzIsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJvd3NfdG9fZ28gLS07CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiB2b2lkIENTdHJldGNoRW5naW5lOjpTdHJldGNoVmVydCgpCiB7CkBAIC02OTcsNyArNjk3LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIGZvcm1hdDsKIH0KLUZYX0JPT0wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpTdGFydChJRlhfU2NhbmxpbmVDb21wb3NlciogcERlc3QsCitib29sIENGWF9JbWFnZVN0cmV0Y2hlcjo6U3RhcnQoSUZYX1NjYW5saW5lQ29tcG9zZXIqIHBEZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCYgcmVjdCwgRlhfRFdPUkQgZmxhZ3MpCiB7CkBAIC03MjIsNyArNzIyLDcgQEAKICAgICAgICAgICAgIHBhbFtpXSA9IEFyZ2JFbmNvZGUoYSwgciwgZywgYik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFwRGVzdC0+U2V0SW5mbyhyZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksIG1fRGVzdEZvcm1hdCwgcGFsKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChwU291cmNlLT5HZXRGb3JtYXQoKSA9PSBGWERJQl8xYnBwQ215ayAmJiBwU291cmNlLT5HZXRQYWxldHRlKCkpIHsKICAgICAgICAgRlhfQ01ZSyBwYWxbMjU2XTsKQEAgLTczNywxNyArNzM3LDE3IEBACiAgICAgICAgICAgICBwYWxbaV0gPSBDbXlrRW5jb2RlKGMsIG0sIHksIGspOwogICAgICAgICB9CiAgICAgICAgIGlmICghcERlc3QtPlNldEluZm8ocmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLCBtX0Rlc3RGb3JtYXQsIHBhbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXBEZXN0LT5TZXRJbmZvKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgbV9EZXN0Rm9ybWF0LCBOVUxMKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKGZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgewogICAgICAgICByZXR1cm4gU3RhcnRRdWlja1N0cmV0Y2goKTsKICAgICB9CiAgICAgcmV0dXJuIFN0YXJ0U3RyZXRjaCgpOwogfQotRlhfQk9PTCBDRlhfSW1hZ2VTdHJldGNoZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQorYm9vbCBDRlhfSW1hZ2VTdHJldGNoZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQogewogICAgIGlmIChtX0ZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgewogICAgICAgICByZXR1cm4gQ29udGludWVRdWlja1N0cmV0Y2gocFBhdXNlKTsKQEAgLTc1NSwzOSArNzU1LDM5IEBACiAgICAgcmV0dXJuIENvbnRpbnVlU3RyZXRjaChwUGF1c2UpOwogfQogI2RlZmluZSBNQVhfUFJPR1JFU1NJVkVfU1RSRVRDSF9QSVhFTFMJMTAwMDAwMAotRlhfQk9PTCBDRlhfSW1hZ2VTdHJldGNoZXI6OlN0YXJ0U3RyZXRjaCgpCitib29sIENGWF9JbWFnZVN0cmV0Y2hlcjo6U3RhcnRTdHJldGNoKCkKIHsKICAgICBtX3BTdHJldGNoRW5naW5lID0gbmV3IENTdHJldGNoRW5naW5lKG1fcERlc3QsIG1fRGVzdEZvcm1hdCwgbV9EZXN0V2lkdGgsIG1fRGVzdEhlaWdodCwgbV9DbGlwUmVjdCwgbV9wU291cmNlLCBtX0ZsYWdzKTsKICAgICBtX3BTdHJldGNoRW5naW5lLT5TdGFydFN0cmV0Y2hIb3J6KCk7CiAgICAgaWYgKG1fcFNvdXJjZS0+R2V0V2lkdGgoKSAqIG1fcFNvdXJjZS0+R2V0SGVpZ2h0KCkgPCBNQVhfUFJPR1JFU1NJVkVfU1RSRVRDSF9QSVhFTFMpIHsKICAgICAgICAgbV9wU3RyZXRjaEVuZ2luZS0+Q29udGludWUoTlVMTCk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpDb250aW51ZVN0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpCitib29sIENGWF9JbWFnZVN0cmV0Y2hlcjo6Q29udGludWVTdHJldGNoKElGWF9QYXVzZSogcFBhdXNlKQogewogICAgIGlmIChtX3BTdHJldGNoRW5naW5lID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBtX3BTdHJldGNoRW5naW5lLT5Db250aW51ZShwUGF1c2UpOwogfQotRlhfQk9PTCBDRlhfSW1hZ2VTdHJldGNoZXI6OlN0YXJ0UXVpY2tTdHJldGNoKCkKK2Jvb2wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpTdGFydFF1aWNrU3RyZXRjaCgpCiB7Ci0gICAgbV9iRmxpcFggPSBGQUxTRTsKLSAgICBtX2JGbGlwWSA9IEZBTFNFOworICAgIG1fYkZsaXBYID0gZmFsc2U7CisgICAgbV9iRmxpcFkgPSBmYWxzZTsKICAgICBpZiAobV9EZXN0V2lkdGggPCAwKSB7Ci0gICAgICAgIG1fYkZsaXBYID0gVFJVRTsKKyAgICAgICAgbV9iRmxpcFggPSB0cnVlOwogICAgICAgICBtX0Rlc3RXaWR0aCA9IC1tX0Rlc3RXaWR0aDsKICAgICB9CiAgICAgaWYgKG1fRGVzdEhlaWdodCA8IDApIHsKLSAgICAgICAgbV9iRmxpcFkgPSBUUlVFOworICAgICAgICBtX2JGbGlwWSA9IHRydWU7CiAgICAgICAgIG1fRGVzdEhlaWdodCA9IC1tX0Rlc3RIZWlnaHQ7CiAgICAgfQogICAgIG1fTGluZUluZGV4ID0gMDsKICAgICBGWF9EV09SRCBzaXplID0gbV9DbGlwUmVjdC5XaWR0aCgpOwogICAgIGlmIChzaXplICYmIG1fRGVzdEJQUCA+IChpbnQpKElOVF9NQVggLyBzaXplKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgc2l6ZSAqPSBtX0Rlc3RCUFA7CiAgICAgbV9wU2NhbmxpbmUgPSBGWF9BbGxvYyh1aW50OF90LCAoc2l6ZSAvIDggKyAzKSAvIDQgKiA0KTsKQEAgLTc5NiwxNCArNzk2LDE0IEBACiAgICAgfQogICAgIGlmIChtX3BTb3VyY2UtPkdldFdpZHRoKCkgKiBtX3BTb3VyY2UtPkdldEhlaWdodCgpIDwgTUFYX1BST0dSRVNTSVZFX1NUUkVUQ0hfUElYRUxTKSB7CiAgICAgICAgIENvbnRpbnVlUXVpY2tTdHJldGNoKE5VTEwpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9JbWFnZVN0cmV0Y2hlcjo6Q29udGludWVRdWlja1N0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpCitib29sIENGWF9JbWFnZVN0cmV0Y2hlcjo6Q29udGludWVRdWlja1N0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaWYgKG1fcFNjYW5saW5lID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGludCByZXN1bHRfd2lkdGggPSBtX0NsaXBSZWN0LldpZHRoKCksIHJlc3VsdF9oZWlnaHQgPSBtX0NsaXBSZWN0LkhlaWdodCgpOwogICAgIGludCBzcmNfaGVpZ2h0ID0gbV9wU291cmNlLT5HZXRIZWlnaHQoKTsKQEAgLTgyMyw3ICs4MjMsNyBAQAogICAgICAgICAgICAgc3JjX3kgPSAwOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX3BTb3VyY2UtPlNraXBUb1NjYW5saW5lKHNyY195LCBwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIG1fcFNvdXJjZS0+RG93blNhbXBsZVNjYW5saW5lKHNyY195LCBtX3BTY2FubGluZSwgbV9EZXN0QlBQLCBtX0Rlc3RXaWR0aCwgbV9iRmxpcFgsIG1fQ2xpcFJlY3QubGVmdCwgcmVzdWx0X3dpZHRoKTsKICAgICAgICAgaWYgKG1fcE1hc2tTY2FubGluZSkgewpAQCAtODMxLDUgKzgzMSw1IEBACiAgICAgICAgIH0KICAgICAgICAgbV9wRGVzdC0+Q29tcG9zZVNjYW5saW5lKGRlc3RfeSwgbV9wU2NhbmxpbmUsIG1fcE1hc2tTY2FubGluZSk7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfbWFpbi5jcHAgYi9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfbWFpbi5jcHAKaW5kZXggOGE4NjRmMS4uZWZkODg2ZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX21haW4uY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9tYWluLmNwcApAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKICNpbmNsdWRlICJkaWJfaW50LmgiCiAjaW5jbHVkZSA8bGltaXRzLmg+Ci1GWF9CT09MIENvbnZlcnRCdWZmZXIoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK2Jvb2wgQ29udmVydEJ1ZmZlcihGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsIHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIEZYX0RXT1JEKiYgcGFsLCB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKIHZvaWQgQ215a0RlY29kZShGWF9EV09SRCBjbXlrLCBpbnQmIGMsIGludCYgbSwgaW50JiB5LCBpbnQmIGspCiB7CkBAIC01MiwzOSArNTIsMzkgQEAKIH0KIENGWF9ESUJpdG1hcDo6Q0ZYX0RJQml0bWFwKCkKIHsKLSAgICBtX2JFeHRCdWYgPSBGQUxTRTsKKyAgICBtX2JFeHRCdWYgPSBmYWxzZTsKICAgICBtX3BCdWZmZXIgPSBOVUxMOwogICAgIG1fcFBhbGV0dGUgPSBOVUxMOwogfQogI2RlZmluZSBfTUFYX09PTV9MSU1JVF8JMTIwMDAwMDAKLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCB1aW50OF90KiBwQnVmZmVyLCBpbnQgcGl0Y2gpCitib29sIENGWF9ESUJpdG1hcDo6Q3JlYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IGZvcm1hdCwgdWludDhfdCogcEJ1ZmZlciwgaW50IHBpdGNoKQogewogICAgIG1fcEJ1ZmZlciA9IE5VTEw7CiAgICAgbV9icHAgPSAodWludDhfdClmb3JtYXQ7CiAgICAgbV9BbHBoYUZsYWcgPSAodWludDhfdCkoZm9ybWF0ID4+IDgpOwogICAgIG1fV2lkdGggPSBtX0hlaWdodCA9IG1fUGl0Y2ggPSAwOwogICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwIHx8IHBpdGNoIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKChJTlRfTUFYIC0gMzEpIC8gd2lkdGggPCAoZm9ybWF0ICYgMHhmZikpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghcGl0Y2gpIHsKICAgICAgICAgcGl0Y2ggPSAod2lkdGggKiAoZm9ybWF0ICYgMHhmZikgKyAzMSkgLyAzMiAqIDQ7CiAgICAgfQogICAgIGlmICgoMSA8PCAzMCkgLyBwaXRjaCA8IGhlaWdodCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBCdWZmZXIpIHsKICAgICAgICAgbV9wQnVmZmVyID0gcEJ1ZmZlcjsKLSAgICAgICAgbV9iRXh0QnVmID0gVFJVRTsKKyAgICAgICAgbV9iRXh0QnVmID0gdHJ1ZTsKICAgICB9IGVsc2UgewogICAgICAgICBpbnQgc2l6ZSA9IHBpdGNoICogaGVpZ2h0ICsgNDsKICAgICAgICAgaW50IG9vbWxpbWl0ID0gX01BWF9PT01fTElNSVRfOwogICAgICAgICBpZiAob29tbGltaXQgPj0gMCAmJiBzaXplID49IG9vbWxpbWl0KSB7CiAgICAgICAgICAgICBtX3BCdWZmZXIgPSBGWF9UcnlBbGxvYyh1aW50OF90LCBzaXplKTsKICAgICAgICAgICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtX3BCdWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKQEAgLTk0LDMzICs5NCwzMyBAQAogICAgIG1fSGVpZ2h0ID0gaGVpZ2h0OwogICAgIG1fUGl0Y2ggPSBwaXRjaDsKICAgICBpZiAoSGFzQWxwaGEoKSAmJiBmb3JtYXQgIT0gRlhESUJfQXJnYikgewotICAgICAgICBGWF9CT09MIHJldCA9IFRSVUU7CisgICAgICAgIGJvb2wgcmV0ID0gdHJ1ZTsKICAgICAgICAgcmV0ID0gQnVpbGRBbHBoYU1hc2soKTsKICAgICAgICAgaWYgKCFyZXQpIHsKICAgICAgICAgICAgIGlmICghbV9iRXh0QnVmICYmIG1fcEJ1ZmZlcikgewogICAgICAgICAgICAgICAgIEZYX0ZyZWUobV9wQnVmZmVyKTsKICAgICAgICAgICAgICAgICBtX3BCdWZmZXIgPSBOVUxMOwogICAgICAgICAgICAgICAgIG1fV2lkdGggPSBtX0hlaWdodCA9IG1fUGl0Y2ggPSAwOwotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9ESUJpdG1hcDo6Q29weShjb25zdCBDRlhfRElCU291cmNlKiBwU3JjKQorYm9vbCBDRlhfRElCaXRtYXA6OkNvcHkoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYykKIHsKICAgICBpZiAobV9wQnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoIUNyZWF0ZShwU3JjLT5HZXRXaWR0aCgpLCBwU3JjLT5HZXRIZWlnaHQoKSwgcFNyYy0+R2V0Rm9ybWF0KCkpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDb3B5UGFsZXR0ZShwU3JjLT5HZXRQYWxldHRlKCkpOwogICAgIENvcHlBbHBoYU1hc2socFNyYy0+bV9wQWxwaGFNYXNrKTsKICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBwU3JjLT5HZXRIZWlnaHQoKTsgcm93ICsrKSB7CiAgICAgICAgIEZYU1lTX21lbWNweShtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoLCBwU3JjLT5HZXRTY2FubGluZShyb3cpLCBtX1BpdGNoKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBDRlhfRElCaXRtYXA6On5DRlhfRElCaXRtYXAoKQogewpAQCAtMjE4LDE5ICsyMTgsMTkgQEAKICAgICAgICAgfQogICAgIH0KIH0KLUZYX0JPT0wgQ0ZYX0RJQlNvdXJjZTo6QnVpbGRBbHBoYU1hc2soKQorYm9vbCBDRlhfRElCU291cmNlOjpCdWlsZEFscGhhTWFzaygpCiB7CiAgICAgaWYgKG1fcEFscGhhTWFzaykgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIG1fcEFscGhhTWFzayA9IG5ldyBDRlhfRElCaXRtYXA7CiAgICAgaWYgKCFtX3BBbHBoYU1hc2stPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7CiAgICAgICAgIGRlbGV0ZSBtX3BBbHBoYU1hc2s7CiAgICAgICAgIG1fcEFscGhhTWFzayA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWFNZU19tZW1zZXQobV9wQWxwaGFNYXNrLT5HZXRCdWZmZXIoKSwgMHhmZiwgbV9wQWxwaGFNYXNrLT5HZXRIZWlnaHQoKSptX3BBbHBoYU1hc2stPkdldFBpdGNoKCkpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogRlhfRFdPUkQgQ0ZYX0RJQlNvdXJjZTo6R2V0UGFsZXR0ZUVudHJ5KGludCBpbmRleCkgY29uc3QKIHsKQEAgLTM2NywxNSArMzY3LDE1IEBACiAgICAgd2lkdGggPSBkZXN0X3JlY3QucmlnaHQgLSBkZXN0X3JlY3QubGVmdDsKICAgICBoZWlnaHQgPSBkZXN0X3JlY3QuYm90dG9tIC0gZGVzdF9yZWN0LnRvcDsKIH0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpUcmFuc2ZlckJpdG1hcChpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK2Jvb2wgQ0ZYX0RJQml0bWFwOjpUcmFuc2ZlckJpdG1hcChpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgR2V0T3ZlcmxhcFJlY3QoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcC0+R2V0V2lkdGgoKSwgcFNyY0JpdG1hcC0+R2V0SGVpZ2h0KCksIHNyY19sZWZ0LCBzcmNfdG9wLCBOVUxMKTsKICAgICBpZiAod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCA9IEdldEZvcm1hdCgpOwogICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0ID0gcFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCk7CkBAIC00MDIsNyArNDAyLDcgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChtX3BQYWxldHRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fYnBwID09IDgpIHsKICAgICAgICAgICAgIGRlc3RfZm9ybWF0ID0gRlhESUJfOGJwcE1hc2s7CkBAIC00MTAsMjUgKzQxMCwyNSBAQAogICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiA9IG1fcEJ1ZmZlciArIGRlc3RfdG9wICogbV9QaXRjaCArIGRlc3RfbGVmdCAqIEdldEJQUCgpIC8gODsKICAgICAgICAgRlhfRFdPUkQqIGRfcGx0ID0gTlVMTDsKICAgICAgICAgaWYoIUNvbnZlcnRCdWZmZXIoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBtX1BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgZF9wbHQsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9ESUJpdG1hcDo6VHJhbnNmZXJNYXNrKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorYm9vbCBDRlhfRElCaXRtYXA6OlRyYW5zZmVyTWFzayhpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE1hc2ssIEZYX0RXT1JEIGNvbG9yLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEFTU0VSVChIYXNBbHBoYSgpICYmIChtX2JwcCA+PSAyNCkpOwogICAgIEFTU0VSVChwTWFzay0+SXNBbHBoYU1hc2soKSk7CiAgICAgaWYgKCFIYXNBbHBoYSgpIHx8ICFwTWFzay0+SXNBbHBoYU1hc2soKSB8fCBtX2JwcCA8IDI0KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBHZXRPdmVybGFwUmVjdChkZXN0X2xlZnQsIGRlc3RfdG9wLCB3aWR0aCwgaGVpZ2h0LCBwTWFzay0+R2V0V2lkdGgoKSwgcE1hc2stPkdldEhlaWdodCgpLCBzcmNfbGVmdCwgc3JjX3RvcCwgTlVMTCk7CiAgICAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpbnQgc3JjX2JwcCA9IHBNYXNrLT5HZXRCUFAoKTsKICAgICBpbnQgYWxwaGE7CkBAIC00NDksNyArNDQ5LDcgQEAKICAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoY29sb3IpLCBGWFNZU19HZXRNVmFsdWUoY29sb3IpLCBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX3BbMl0sIGNvbG9yX3BbMV0sIGNvbG9yX3BbMF0pOwogICAgICAgICBlbHNlIGlmICghKGFscGhhX2ZsYWcgPj4gOCkgJiYgSXNDbXlrSW1hZ2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmKCFJc0NteWtJbWFnZSgpKSB7CkBAIC01MDcsNyArNTA3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ0ZYX0RJQlNvdXJjZTo6Q29weVBhbGV0dGUoY29uc3QgRlhfRFdPUkQqIHBTcmMsIEZYX0RXT1JEIHNpemUpCiB7CkBAIC01NzAsMjEgKzU3MCwyMSBAQAogICAgIH0KICAgICByZXR1cm4gcE1hc2s7CiB9Ci1GWF9CT09MIENGWF9ESUJTb3VyY2U6OkNvcHlBbHBoYU1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEFscGhhTWFzaywgY29uc3QgRlhfUkVDVCogcENsaXApCitib29sIENGWF9ESUJTb3VyY2U6OkNvcHlBbHBoYU1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEFscGhhTWFzaywgY29uc3QgRlhfUkVDVCogcENsaXApCiB7CiAgICAgaWYgKCFIYXNBbHBoYSgpIHx8IEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChwQWxwaGFNYXNrKSB7CiAgICAgICAgIEZYX1JFQ1QgcmVjdCgwLCAwLCBwQWxwaGFNYXNrLT5tX1dpZHRoLCBwQWxwaGFNYXNrLT5tX0hlaWdodCk7CiAgICAgICAgIGlmIChwQ2xpcCkgewogICAgICAgICAgICAgcmVjdC5JbnRlcnNlY3QoKnBDbGlwKTsKICAgICAgICAgICAgIGlmIChyZWN0LklzRW1wdHkoKSB8fCByZWN0LldpZHRoKCkgIT0gbV9XaWR0aCB8fCByZWN0LkhlaWdodCgpICE9IG1fSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChwQWxwaGFNYXNrLT5tX1dpZHRoICE9IG1fV2lkdGggfHwgcEFscGhhTWFzay0+bV9IZWlnaHQgIT0gbV9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspCkBAIC01OTMsMjUgKzU5MywyNSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1fcEFscGhhTWFzay0+Q2xlYXIoMHhmZjAwMDAwMCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogY29uc3QgaW50IGdfQ2hhbm5lbE9mZnNldFtdID0gezAsIDIsIDEsIDAsIDAsIDEsIDIsIDMsIDN9OwotRlhfQk9PTCBDRlhfRElCaXRtYXA6OkxvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIEZYRElCX0NoYW5uZWwgc3JjQ2hhbm5lbCkKK2Jvb2wgQ0ZYX0RJQml0bWFwOjpMb2FkQ2hhbm5lbChGWERJQl9DaGFubmVsIGRlc3RDaGFubmVsLCBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBGWERJQl9DaGFubmVsIHNyY0NoYW5uZWwpCiB7CiAgICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRlhfRElCU291cmNlKiBwU3JjQ2xvbmUgPSAoQ0ZYX0RJQlNvdXJjZSopcFNyY0JpdG1hcDsKICAgICBDRlhfRElCaXRtYXAqIHBEc3QgPSB0aGlzOwogICAgIGludCBkZXN0T2Zmc2V0LCBzcmNPZmZzZXQ7CiAgICAgaWYgKHNyY0NoYW5uZWwgPT0gRlhESUJfQWxwaGEpIHsKICAgICAgICAgaWYgKCFwU3JjQml0bWFwLT5IYXNBbHBoYSgpICYmICFwU3JjQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBTcmNCaXRtYXAtPkdldEJQUCgpID09IDEpIHsKICAgICAgICAgICAgIHBTcmNDbG9uZSA9IHBTcmNCaXRtYXAtPkNsb25lQ29udmVydChGWERJQl84YnBwTWFzayk7CiAgICAgICAgICAgICBpZiAocFNyY0Nsb25lID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmKHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpIHsKQEAgLTYyMSw3ICs2MjEsNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKHBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAocFNyY0JpdG1hcC0+R2V0QlBQKCkgPCAyNCkgewogICAgICAgICAgICAgaWYgKHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKQEAgLTYzMCw3ICs2MzAsNyBAQAogICAgICAgICAgICAgICAgIHBTcmNDbG9uZSA9IHBTcmNCaXRtYXAtPkNsb25lQ29udmVydCgoRlhESUJfRm9ybWF0KSgocFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCkgJiAweGZmMDApIHwgMHgxOCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHBTcmNDbG9uZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBzcmNPZmZzZXQgPSBnX0NoYW5uZWxPZmZzZXRbc3JjQ2hhbm5lbF07CkBAIC02NDEsNyArNjQxLDcgQEAKICAgICAgICAgICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlc3RPZmZzZXQgPSAwOwogICAgICAgICB9IGVsc2UgewpAQCAtNjUwLDcgKzY1MCw3IEBACiAgICAgICAgICAgICAgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwU3JjQ2xvbmU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgewogICAgICAgICAgICAgICAgIGRlc3RPZmZzZXQgPSAzOwpAQCAtNjYxLDcgKzY2MSw3IEBACiAgICAgICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKICAgICAgICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChHZXRCUFAoKSA8IDI0KSB7CiAgICAgICAgICAgICBpZiAoSGFzQWxwaGEoKSkgewpAQCAtNjY5LDcgKzY2OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UKICNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KQEAgLTY4MCw3ICs2ODAsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwU3JjQ2xvbmU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGRlc3RPZmZzZXQgPSBnX0NoYW5uZWxPZmZzZXRbZGVzdENoYW5uZWxdOwpAQCAtNjk0LDcgKzY5NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTcxMCw3ICs3MTAsNyBAQAogICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKICAgICAgICAgfQogICAgICAgICBpZiAocFNyY01hdGNoZWQgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHBTcmNDbG9uZSA9IHBTcmNNYXRjaGVkOwogICAgIH0KQEAgLTczMiwyNCArNzMyLDI0IEBACiAgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwICYmIHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwLT5tX3BBbHBoYU1hc2spIHsKICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9ESUJpdG1hcDo6TG9hZENoYW5uZWwoRlhESUJfQ2hhbm5lbCBkZXN0Q2hhbm5lbCwgaW50IHZhbHVlKQorYm9vbCBDRlhfRElCaXRtYXA6OkxvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsIGludCB2YWx1ZSkKIHsKICAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGludCBkZXN0T2Zmc2V0OwogICAgIGlmIChkZXN0Q2hhbm5lbCA9PSBGWERJQl9BbHBoYSkgewogICAgICAgICBpZiAoSXNBbHBoYU1hc2soKSkgewogICAgICAgICAgICAgaWYoIUNvbnZlcnRGb3JtYXQoRlhESUJfOGJwcE1hc2spKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlc3RPZmZzZXQgPSAwOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZGVzdE9mZnNldCA9IDA7CiAgICAgICAgICAgICBpZighQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215a2EgOiBGWERJQl9BcmdiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgewogICAgICAgICAgICAgICAgIGRlc3RPZmZzZXQgPSAzOwpAQCAtNzU3LDIxICs3NTcsMjEgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChJc0FscGhhTWFzaygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKEdldEJQUCgpIDwgMjQpIHsKICAgICAgICAgICAgIGlmIChIYXNBbHBoYSgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrYSA6IEZYRElCX0FyZ2IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZQogI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwogICAgICAgICAgICAgICAgIGlmICghQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215ayA6IEZYRElCX1JnYikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogI2Vsc2UKICAgICAgICAgICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWsgOiBGWERJQl9SZ2IzMikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogI2VuZGlmCiAgICAgICAgIH0KQEAgLTc4MCwxMSArNzgwLDExIEBACiAgICAgaW50IEJwcCA9IEdldEJQUCgpIC8gODsKICAgICBpZiAoQnBwID09IDEpIHsKICAgICAgICAgRlhTWVNfbWVtc2V0KG1fcEJ1ZmZlciwgdmFsdWUsIG1fSGVpZ2h0ICogbV9QaXRjaCk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKGRlc3RDaGFubmVsID09IEZYRElCX0FscGhhICYmIG1fcEFscGhhTWFzaykgewogICAgICAgICBGWFNZU19tZW1zZXQobV9wQWxwaGFNYXNrLT5HZXRCdWZmZXIoKSwgdmFsdWUsIG1fcEFscGhhTWFzay0+R2V0SGVpZ2h0KCkqbV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7CiAgICAgICAgIHVpbnQ4X3QqIHNjYW5fbGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2ggKyBkZXN0T2Zmc2V0OwpAQCAtNzkzLDE2ICs3OTMsMTYgQEAKICAgICAgICAgICAgIHNjYW5fbGluZSArPSBCcHA7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9ESUJpdG1hcDo6TXVsdGlwbHlBbHBoYShjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwKQorYm9vbCBDRlhfRElCaXRtYXA6Ok11bHRpcGx5QWxwaGEoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCkKIHsKICAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEFTU0VSVChwU3JjQml0bWFwLT5Jc0FscGhhTWFzaygpKTsKICAgICBpZiAoIXBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghSXNBbHBoYU1hc2soKSAmJiAhSGFzQWxwaGEoKSkgewogICAgICAgICByZXR1cm4gTG9hZENoYW5uZWwoRlhESUJfQWxwaGEsIHBTcmNCaXRtYXAsIEZYRElCX0FscGhhKTsKQEAgLTgxMiw3ICs4MTIsNyBAQAogICAgICAgICBwU3JjQ2xvbmUgPSBwU3JjQml0bWFwLT5TdHJldGNoVG8obV9XaWR0aCwgbV9IZWlnaHQpOwogICAgICAgICBBU1NFUlQocFNyY0Nsb25lICE9IE5VTEwpOwogICAgICAgICBpZiAocFNyY0Nsb25lID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoSXNBbHBoYU1hc2soKSkgewpAQCAtODIwLDcgKzgyMCw3IEBACiAgICAgICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKICAgICAgICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG1fcEJ1ZmZlciArIG1fUGl0Y2ggKiByb3c7CkBAIC04NDQsNyArODQ0LDcgQEAKICAgICAgICAgICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyBtX1BpdGNoICogcm93ICsgMzsKQEAgLTg2MSwxNyArODYxLDE3IEBACiAgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7CiAgICAgICAgIGRlbGV0ZSBwU3JjQ2xvbmU7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfRElCaXRtYXA6OkdldEdyYXlEYXRhKHZvaWQqIHBJY2NUcmFuc2Zvcm0pCitib29sIENGWF9ESUJpdG1hcDo6R2V0R3JheURhdGEodm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHN3aXRjaCAoR2V0Rm9ybWF0KCkpIHsKICAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOiB7CiAgICAgICAgICAgICAgICAgaWYgKG1fcFBhbGV0dGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdWludDhfdCBncmF5WzJdOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSArKykgewpAQCAtODgzLDcgKzg4Myw3IEBACiAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IG5ldyBDRlhfRElCaXRtYXA7CiAgICAgICAgICAgICAgICAgaWYgKCFwTWFzay0+Q3JlYXRlKG1fV2lkdGgsIG1fSGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBNYXNrOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KHBNYXNrLT5HZXRCdWZmZXIoKSwgZ3JheVswXSwgcE1hc2stPkdldFBpdGNoKCkgKiBtX0hlaWdodCk7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewpAQCAtOTAyLDcgKzkwMiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjogewogICAgICAgICAgICAgICAgIGlmIChtX3BQYWxldHRlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHVpbnQ4X3QgZ3JheVsyNTZdOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7CkBAIC05MTQsNyArOTE0LDcgQEAKICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKICAgICAgICAgICAgICAgICBpZiAoIXBNYXNrLT5DcmVhdGUobV9XaWR0aCwgbV9IZWlnaHQsIEZYRElCXzhicHBNYXNrKSkgewogICAgICAgICAgICAgICAgICAgICBkZWxldGUgcE1hc2s7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gcE1hc2stPkdldEJ1ZmZlcigpICsgcm93ICogcE1hc2stPkdldFBpdGNoKCk7CkBAIC05MzEsNyArOTMxLDcgQEAKICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKICAgICAgICAgICAgICAgICBpZiAoIXBNYXNrLT5DcmVhdGUobV9XaWR0aCwgbV9IZWlnaHQsIEZYRElCXzhicHBNYXNrKSkgewogICAgICAgICAgICAgICAgICAgICBkZWxldGUgcE1hc2s7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19wb3MgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoOwpAQCAtOTQ5LDcgKzk0OSw3IEBACiAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IG5ldyBDRlhfRElCaXRtYXA7CiAgICAgICAgICAgICAgICAgaWYgKCFwTWFzay0+Q3JlYXRlKG1fV2lkdGgsIG1fSGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBNYXNrOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewogICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfcG9zID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaDsKQEAgLTk2NCwxOSArOTY0LDE5IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfRElCaXRtYXA6Ok11bHRpcGx5QWxwaGEoaW50IGFscGhhKQorYm9vbCBDRlhfRElCaXRtYXA6Ok11bHRpcGx5QWxwaGEoaW50IGFscGhhKQogewogICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgc3dpdGNoIChHZXRGb3JtYXQoKSkgewogICAgICAgICBjYXNlIEZYRElCXzFicHBNYXNrOgogICAgICAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KEZYRElCXzhicHBNYXNrKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBNdWx0aXBseUFscGhhKGFscGhhKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTAwNCwxOCArMTAwNCwxOCBAQAogICAgICAgICAgICAgICAgIG1fcEFscGhhTWFzay0+TXVsdGlwbHlBbHBoYShhbHBoYSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKElzQ215a0ltYWdlKCkpIHsKICAgICAgICAgICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoKEZYRElCX0Zvcm1hdCkoR2V0Rm9ybWF0KCkgfCAweDAyMDApKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbV9wQWxwaGFNYXNrLT5NdWx0aXBseUFscGhhKGFscGhhKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KEZYRElCX0FyZ2IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBNdWx0aXBseUFscGhhKGFscGhhKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIEZYX0RXT1JEIENGWF9ESUJpdG1hcDo6R2V0UGl4ZWwoaW50IHgsIGludCB5KSBjb25zdAogewpAQCAtMTEyMiw3ICsxMTIyLDcgQEAKICAgICB9CiB9CiB2b2lkIENGWF9ESUJpdG1hcDo6RG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLCB1aW50OF90KiBkZXN0X3NjYW4sIGludCBkZXN0X2JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIEZYX0JPT0wgYkZsaXBYLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF93aWR0aCkgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGJvb2wgYkZsaXBYLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF93aWR0aCkgY29uc3QKIHsKICAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMTE3OSwxNSArMTE3OSwxNSBAQAogICAgICAgICB9CiAgICAgfQogfQotRlhfQk9PTCBDRlhfRElCaXRtYXA6OkNvbnZlcnRDb2xvclNjYWxlKEZYX0RXT1JEIGZvcmVjb2xvciwgRlhfRFdPUkQgYmFja2NvbG9yKQorYm9vbCBDRlhfRElCaXRtYXA6OkNvbnZlcnRDb2xvclNjYWxlKEZYX0RXT1JEIGZvcmVjb2xvciwgRlhfRFdPUkQgYmFja2NvbG9yKQogewogICAgIEFTU0VSVCghSXNBbHBoYU1hc2soKSk7CiAgICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMIHx8IElzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGludCBmYywgZm0sIGZ5LCBmaywgYmMsIGJtLCBieSwgYms7CiAgICAgaW50IGZyLCBmZywgZmIsIGJyLCBiZywgYmI7Ci0gICAgRlhfQk9PTCBpc0NteWtJbWFnZSA9IElzQ215a0ltYWdlKCk7CisgICAgYm9vbCBpc0NteWtJbWFnZSA9IElzQ215a0ltYWdlKCk7CiAgICAgaWYgKGlzQ215a0ltYWdlKSB7CiAgICAgICAgIGZjID0gRlhTWVNfR2V0Q1ZhbHVlKGZvcmVjb2xvcik7CiAgICAgICAgIGZtID0gRlhTWVNfR2V0TVZhbHVlKGZvcmVjb2xvcik7CkBAIC0xMjA4LDEwICsxMjA4LDEwIEBACiAgICAgaWYgKG1fYnBwIDw9IDgpIHsKICAgICAgICAgaWYgKGlzQ215a0ltYWdlKSB7CiAgICAgICAgICAgICBpZiAoZm9yZWNvbG9yID09IDB4ZmYgJiYgYmFja2NvbG9yID09IDAgJiYgbV9wUGFsZXR0ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoZm9yZWNvbG9yID09IDAgJiYgYmFja2NvbG9yID09IDB4ZmZmZmZmICYmIG1fcFBhbGV0dGUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9wUGFsZXR0ZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBCdWlsZFBhbGV0dGUoKTsKQEAgLTEyMzIsNyArMTIzMiw3IEBACiAgICAgICAgICAgICAgICAgbV9wUGFsZXR0ZVtpXSA9IEZYQVJHQl9NQUtFKDB4ZmYsIGJyICsgKGZyIC0gYnIpICogZ3JheSAvIDI1NSwgYmcgKyAoZmcgLSBiZykgKiBncmF5IC8gMjU1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYiArIChmYiAtIGJiKSAqIGdyYXkgLyAyNTUpOwogICAgICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChpc0NteWtJbWFnZSkgewogICAgICAgICBpZiAoZm9yZWNvbG9yID09IDB4ZmYgJiYgYmFja2NvbG9yID09IDB4MDApIHsKQEAgLTEyNDgsNyArMTI0OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICpzY2FubGluZSArKyA9IDI1NSAtIEZYUkdCMkdSQVkociwgZywgYik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoZm9yZWNvbG9yID09IDAgJiYgYmFja2NvbG9yID09IDB4ZmZmZmZmKSB7CiAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKQEAgLTEyNjIsNyArMTI2Miw3IEBACiAgICAgICAgICAgICAgICAgc2NhbmxpbmUgKz0gZ2FwOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKGlzQ215a0ltYWdlKSB7CiAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKQEAgLTEyOTEsMTggKzEyOTEsMTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpEaXRoZXJGUyhjb25zdCBGWF9EV09SRCogcFBhbGV0dGUsIGludCBwYWxfc2l6ZSwgY29uc3QgRlhfUkVDVCogcFJlY3QpCitib29sIENGWF9ESUJpdG1hcDo6RGl0aGVyRlMoY29uc3QgRlhfRFdPUkQqIHBQYWxldHRlLCBpbnQgcGFsX3NpemUsIGNvbnN0IEZYX1JFQ1QqIHBSZWN0KQogewogICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fYnBwICE9IDggJiYgbV9wUGFsZXR0ZSAhPSBOVUxMICYmIG1fQWxwaGFGbGFnICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX1dpZHRoIDwgNCAmJiBtX0hlaWdodCA8IDQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX1JFQ1QgcmVjdCgwLCAwLCBtX1dpZHRoLCBtX0hlaWdodCk7CiAgICAgaWYgKHBSZWN0KSB7CkBAIC0xMzc0LDkgKzEzNzQsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotQ0ZYX0RJQml0bWFwKiBDRlhfRElCU291cmNlOjpGbGlwSW1hZ2UoRlhfQk9PTCBiWEZsaXAsIEZYX0JPT0wgYllGbGlwKSBjb25zdAorQ0ZYX0RJQml0bWFwKiBDRlhfRElCU291cmNlOjpGbGlwSW1hZ2UoYm9vbCBiWEZsaXAsIGJvb2wgYllGbGlwKSBjb25zdAogewogICAgIENGWF9ESUJpdG1hcCogcEZsaXBwZWQgPSBuZXcgQ0ZYX0RJQml0bWFwOwogICAgIGlmICghcEZsaXBwZWQtPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgR2V0Rm9ybWF0KCkpKSB7CkBAIC0xNDgwLDcgKzE0ODAsNyBAQAogICAgICAgICBGWF9GcmVlKG1fcFNjYW5saW5lKTsKICAgICB9CiB9Ci12b2lkIENGWF9GaWx0ZXJlZERJQjo6TG9hZFNyYyhjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBGWF9CT09MIGJBdXRvRHJvcFNyYykKK3ZvaWQgQ0ZYX0ZpbHRlcmVkRElCOjpMb2FkU3JjKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIGJvb2wgYkF1dG9Ecm9wU3JjKQogewogICAgIG1fcFNyYyA9IHBTcmM7CiAgICAgbV9iQXV0b0Ryb3BTcmMgPSBiQXV0b0Ryb3BTcmM7CkBAIC0xNDk5LDcgKzE0OTksNyBAQAogICAgIHJldHVybiBtX3BTY2FubGluZTsKIH0KIHZvaWQgQ0ZYX0ZpbHRlcmVkRElCOjpEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsIHVpbnQ4X3QqIGRlc3Rfc2NhbiwgaW50IGRlc3RfYnBwLAotICAgICAgICBpbnQgZGVzdF93aWR0aCwgRlhfQk9PTCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdAorICAgICAgICBpbnQgZGVzdF93aWR0aCwgYm9vbCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdAogewogICAgIG1fcFNyYy0+RG93blNhbXBsZVNjYW5saW5lKGxpbmUsIGRlc3Rfc2NhbiwgZGVzdF9icHAsIGRlc3Rfd2lkdGgsIGJGbGlwWCwgY2xpcF9sZWZ0LCBjbGlwX3dpZHRoKTsKICAgICBUcmFuc2xhdGVEb3duU2FtcGxlcyhkZXN0X3NjYW4sIGRlc3Rfc2NhbiwgY2xpcF93aWR0aCwgZGVzdF9icHApOwpAQCAtMTUwOCwxOCArMTUwOCwxOCBAQAogewogICAgIG1fU3RhdHVzID0gMDsKICAgICBtX3BUcmFuc2Zvcm1lciA9IE5VTEw7Ci0gICAgbV9iUmdiQnl0ZU9yZGVyID0gRkFMU0U7CisgICAgbV9iUmdiQnl0ZU9yZGVyID0gZmFsc2U7CiAgICAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7CiB9CiBDRlhfSW1hZ2VSZW5kZXJlcjo6fkNGWF9JbWFnZVJlbmRlcmVyKCkKIHsKICAgICBkZWxldGUgbV9wVHJhbnNmb3JtZXI7CiB9Ci1leHRlcm4gRlhfUkVDVCBfRlhESUJfU3dhcENsaXBCb3goRlhfUkVDVCYgY2xpcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWF9CT09MIGJGbGlwWCwgRlhfQk9PTCBiRmxpcFkpOwotRlhfQk9PTCBDRlhfSW1hZ2VSZW5kZXJlcjo6U3RhcnQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCitleHRlcm4gRlhfUkVDVCBfRlhESUJfU3dhcENsaXBCb3goRlhfUkVDVCYgY2xpcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIGJGbGlwWCwgYm9vbCBiRmxpcFkpOworYm9vbCBDRlhfSW1hZ2VSZW5kZXJlcjo6U3RhcnQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBpbnQgYml0bWFwX2FscGhhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRpYl9mbGFncywgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGliX2ZsYWdzLCBib29sIGJSZ2JCeXRlT3JkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCiB7CiAgICAgbV9NYXRyaXggPSAqcE1hdHJpeDsKQEAgLTE1MjgsNyArMTUyOCw3IEBACiAgICAgbV9DbGlwQm94ID0gcENsaXBSZ24gPyBwQ2xpcFJnbi0+R2V0Qm94KCkgOiBGWF9SRUNUKDAsIDAsIHBEZXZpY2UtPkdldFdpZHRoKCksIHBEZXZpY2UtPkdldEhlaWdodCgpKTsKICAgICBtX0NsaXBCb3guSW50ZXJzZWN0KGltYWdlX3JlY3QpOwogICAgIGlmIChtX0NsaXBCb3guSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BEZXZpY2UgPSBwRGV2aWNlOwogICAgIG1fcENsaXBSZ24gPSBwQ2xpcFJnbjsKQEAgLTE1NDAsNyArMTU0MCw3IEBACiAgICAgbV9wSWNjVHJhbnNmb3JtID0gcEljY1RyYW5zZm9ybTsKICAgICBtX2JSZ2JCeXRlT3JkZXIgPSBiUmdiQnl0ZU9yZGVyOwogICAgIG1fQmxlbmRUeXBlID0gYmxlbmRfdHlwZTsKLSAgICBGWF9CT09MIHJldCA9IFRSVUU7CisgICAgYm9vbCByZXQgPSB0cnVlOwogICAgIGlmICgoRlhTWVNfZmFicyhtX01hdHJpeC5iKSA+PSAwLjVmIHx8IG1fTWF0cml4LmEgPT0gMCkgfHwKICAgICAgICAgICAgIChGWFNZU19mYWJzKG1fTWF0cml4LmMpID49IDAuNWYgfHwgbV9NYXRyaXguZCA9PSAwKSApIHsKICAgICAgICAgaWYgKEZYU1lTX2ZhYnMobV9NYXRyaXguYSkgPCBGWFNZU19mYWJzKG1fTWF0cml4LmIpIC8gMjAgJiYgRlhTWVNfZmFicyhtX01hdHJpeC5kKSA8IEZYU1lTX2ZhYnMobV9NYXRyaXguYykgLyAyMCAmJgpAQCAtMTU1MCwxOCArMTU1MCwxOCBAQAogICAgICAgICAgICAgRlhfUkVDVCBiaXRtYXBfY2xpcCA9IG1fQ2xpcEJveDsKICAgICAgICAgICAgIGJpdG1hcF9jbGlwLk9mZnNldCgtaW1hZ2VfcmVjdC5sZWZ0LCAtaW1hZ2VfcmVjdC50b3ApOwogICAgICAgICAgICAgYml0bWFwX2NsaXAgPSBfRlhESUJfU3dhcENsaXBCb3goYml0bWFwX2NsaXAsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBtX01hdHJpeC5jID4gMCwgbV9NYXRyaXguYiA8IDApOwotICAgICAgICAgICAgbV9Db21wb3Nlci5Db21wb3NlKHBEZXZpY2UsIHBDbGlwUmduLCBiaXRtYXBfYWxwaGEsIG1hc2tfY29sb3IsIG1fQ2xpcEJveCwgVFJVRSwKKyAgICAgICAgICAgIG1fQ29tcG9zZXIuQ29tcG9zZShwRGV2aWNlLCBwQ2xpcFJnbiwgYml0bWFwX2FscGhhLCBtYXNrX2NvbG9yLCBtX0NsaXBCb3gsIHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9NYXRyaXguYyA+IDAsIG1fTWF0cml4LmIgPCAwLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIG1fQmxlbmRUeXBlKTsKICAgICAgICAgICAgIGlmICghbV9TdHJldGNoZXIuU3RhcnQoJm1fQ29tcG9zZXIsIHBTb3VyY2UsIGRlc3RfaGVpZ2h0LCBkZXN0X3dpZHRoLCBiaXRtYXBfY2xpcCwgZGliX2ZsYWdzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtX1N0YXR1cyA9IDE7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIG1fU3RhdHVzID0gMjsKICAgICAgICAgbV9wVHJhbnNmb3JtZXIgPSBuZXcgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI7CiAgICAgICAgIG1fcFRyYW5zZm9ybWVyLT5TdGFydChwU291cmNlLCAmbV9NYXRyaXgsIGRpYl9mbGFncywgJm1fQ2xpcEJveCk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaW50IGRlc3Rfd2lkdGggPSBpbWFnZV9yZWN0LldpZHRoKCk7CiAgICAgaWYgKG1fTWF0cml4LmEgPCAwKSB7CkBAIC0xNTcyLDMyICsxNTcyLDMyIEBACiAgICAgICAgIGRlc3RfaGVpZ2h0ID0gLWRlc3RfaGVpZ2h0OwogICAgIH0KICAgICBpZiAoZGVzdF93aWR0aCA9PSAwIHx8IGRlc3RfaGVpZ2h0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX1JFQ1QgYml0bWFwX2NsaXAgPSBtX0NsaXBCb3g7CiAgICAgYml0bWFwX2NsaXAuT2Zmc2V0KC1pbWFnZV9yZWN0LmxlZnQsIC1pbWFnZV9yZWN0LnRvcCk7CiAgICAgbV9Db21wb3Nlci5Db21wb3NlKHBEZXZpY2UsIHBDbGlwUmduLCBiaXRtYXBfYWxwaGEsIG1hc2tfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIG1fQ2xpcEJveCwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgbV9iUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBtX0JsZW5kVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgIG1fQ2xpcEJveCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgbV9iUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBtX0JsZW5kVHlwZSk7CiAgICAgbV9TdGF0dXMgPSAxOwogICAgIHJldCA9IG1fU3RyZXRjaGVyLlN0YXJ0KCZtX0NvbXBvc2VyLCBwU291cmNlLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgYml0bWFwX2NsaXAsIGRpYl9mbGFncyk7CiAgICAgcmV0dXJuIHJldDsKIH0KLUZYX0JPT0wgQ0ZYX0ltYWdlUmVuZGVyZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQorYm9vbCBDRlhfSW1hZ2VSZW5kZXJlcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaWYgKG1fU3RhdHVzID09IDEpIHsKICAgICAgICAgcmV0dXJuIG1fU3RyZXRjaGVyLkNvbnRpbnVlKHBQYXVzZSk7CiAgICAgfQogICAgIGlmIChtX1N0YXR1cyA9PSAyKSB7CiAgICAgICAgIGlmIChtX3BUcmFuc2Zvcm1lci0+Q29udGludWUocFBhdXNlKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBtX3BUcmFuc2Zvcm1lci0+bV9TdG9yZXIuRGV0YWNoKCk7CiAgICAgICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAocEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewogICAgICAgICAgICAgZGVsZXRlIHBCaXRtYXA7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKICAgICAgICAgICAgIGlmIChtX0JpdG1hcEFscGhhICE9IDI1NSkgewpAQCAtMTYxOCw5ICsxNjE4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpLCBwQml0bWFwLCAwLCAwLCBtX0JsZW5kVHlwZSwgbV9wQ2xpcFJnbiwgbV9iUmdiQnl0ZU9yZGVyLCBtX3BJY2NUcmFuc2Zvcm0pOwogICAgICAgICB9CiAgICAgICAgIGRlbGV0ZSBwQml0bWFwOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIENGWF9CaXRtYXBTdG9yZXI6OkNGWF9CaXRtYXBTdG9yZXIoKQogewpAQCAtMTY1MywxNiArMTY1MywxNiBAQAogICAgICAgICBGWFNZU19tZW1jcHkoZGVzdF9hbHBoYV9idWYsIHNjYW5fZXh0cmFfYWxwaGEsIG1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpKTsKICAgICB9CiB9Ci1GWF9CT09MIENGWF9CaXRtYXBTdG9yZXI6OlNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKQorYm9vbCBDRlhfQml0bWFwU3RvcmVyOjpTZXRJbmZvKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSkKIHsKICAgICBtX3BCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOwogICAgIGlmICghbV9wQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgc3JjX2Zvcm1hdCkpIHsKICAgICAgICAgZGVsZXRlIG1fcEJpdG1hcDsKICAgICAgICAgbV9wQml0bWFwID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChwU3JjUGFsZXR0ZSkgewogICAgICAgICBtX3BCaXRtYXAtPkNvcHlQYWxldHRlKHBTcmNQYWxldHRlKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfdHJhbnNmb3JtLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl90cmFuc2Zvcm0uY3BwCmluZGV4IGUzNGU3MTUuLjAxYmMxNjcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl90cmFuc2Zvcm0uY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl90cmFuc2Zvcm0uY3BwCkBAIC01NCw3ICs1NCw3IEBACiAgICAgICAgIHkxIC89IGJhc2U7CiAgICAgfQogfTsKLUNGWF9ESUJpdG1hcCogQ0ZYX0RJQlNvdXJjZTo6U3dhcFhZKEZYX0JPT0wgYlhGbGlwLCBGWF9CT09MIGJZRmxpcCwgY29uc3QgRlhfUkVDVCogcERlc3RDbGlwKSBjb25zdAorQ0ZYX0RJQml0bWFwKiBDRlhfRElCU291cmNlOjpTd2FwWFkoYm9vbCBiWEZsaXAsIGJvb2wgYllGbGlwLCBjb25zdCBGWF9SRUNUKiBwRGVzdENsaXApIGNvbnN0CiB7CiAgICAgRlhfUkVDVCBkZXN0X2NsaXAoMCwgMCwgbV9IZWlnaHQsIG1fV2lkdGgpOwogICAgIGlmIChwRGVzdENsaXApIHsKQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgIHJldHVybiBwVHJhbnNCaXRtYXA7CiB9CiAjZGVmaW5lIEZJWDE2XzAwNSAwLjA1ZgotRlhfUkVDVCBfRlhESUJfU3dhcENsaXBCb3goRlhfUkVDVCYgY2xpcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWF9CT09MIGJGbGlwWCwgRlhfQk9PTCBiRmxpcFkpCitGWF9SRUNUIF9GWERJQl9Td2FwQ2xpcEJveChGWF9SRUNUJiBjbGlwLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2wgYkZsaXBYLCBib29sIGJGbGlwWSkKIHsKICAgICBGWF9SRUNUIHJlY3Q7CiAgICAgaWYgKGJGbGlwWSkgewpAQCAtMjA2LDcgKzIwNiw3IEBACiBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6fkNGWF9JbWFnZVRyYW5zZm9ybWVyKCkKIHsKIH0KLUZYX0JPT0wgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI6OlN0YXJ0KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBEZXN0TWF0cml4LCBpbnQgZmxhZ3MsIGNvbnN0IEZYX1JFQ1QqIHBEZXN0Q2xpcCkKK2Jvb2wgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI6OlN0YXJ0KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBEZXN0TWF0cml4LCBpbnQgZmxhZ3MsIGNvbnN0IEZYX1JFQ1QqIHBEZXN0Q2xpcCkKIHsKICAgICBtX3BNYXRyaXggPSAoQ0ZYX0FmZmluZU1hdHJpeCopcERlc3RNYXRyaXg7CiAgICAgQ0ZYX0Zsb2F0UmVjdCB1bml0X3JlY3QgPSBwRGVzdE1hdHJpeC0+R2V0VW5pdFJlY3QoKTsKQEAgLTIxNiw3ICsyMTYsNyBAQAogICAgICAgICByZXN1bHRfY2xpcC5JbnRlcnNlY3QoKnBEZXN0Q2xpcCk7CiAgICAgfQogICAgIGlmIChyZXN1bHRfY2xpcC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fUmVzdWx0TGVmdCA9IHJlc3VsdF9jbGlwLmxlZnQ7CiAgICAgbV9SZXN1bHRUb3AgPSByZXN1bHRfY2xpcC50b3A7CkBAIC0yMzIsNyArMjMyLDcgQEAKICAgICAgICAgcmVzdWx0X2NsaXAgPSBfRlhESUJfU3dhcENsaXBCb3gocmVzdWx0X2NsaXAsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBwRGVzdE1hdHJpeC0+YyA+IDAsIHBEZXN0TWF0cml4LT5iIDwgMCk7CiAgICAgICAgIG1fU3RyZXRjaGVyLlN0YXJ0KCZtX1N0b3JlciwgcFNyYywgZGVzdF9oZWlnaHQsIGRlc3Rfd2lkdGgsIHJlc3VsdF9jbGlwLCBmbGFncyk7CiAgICAgICAgIG1fU3RhdHVzID0gMTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoRlhTWVNfZmFicyhwRGVzdE1hdHJpeC0+YikgPCBGSVgxNl8wMDUgJiYgRlhTWVNfZmFicyhwRGVzdE1hdHJpeC0+YykgPCBGSVgxNl8wMDUpIHsKICAgICAgICAgaW50IGRlc3Rfd2lkdGggPSBwRGVzdE1hdHJpeC0+YSA+IDAgPyAoaW50KUZYU1lTX2NlaWwocERlc3RNYXRyaXgtPmEpIDogKGludClGWFNZU19mbG9vcihwRGVzdE1hdHJpeC0+YSk7CkBAIC0yNDAsNyArMjQwLDcgQEAKICAgICAgICAgcmVzdWx0X2NsaXAuT2Zmc2V0KC1yZXN1bHRfcmVjdC5sZWZ0LCAtcmVzdWx0X3JlY3QudG9wKTsKICAgICAgICAgbV9TdHJldGNoZXIuU3RhcnQoJm1fU3RvcmVyLCBwU3JjLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcmVzdWx0X2NsaXAsIGZsYWdzKTsKICAgICAgICAgbV9TdGF0dXMgPSAyOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGludCBzdHJldGNoX3dpZHRoID0gKGludClGWFNZU19jZWlsKEZYU1lTX3NxcnQyKHBEZXN0TWF0cml4LT5hLCBwRGVzdE1hdHJpeC0+YikpOwogICAgIGludCBzdHJldGNoX2hlaWdodCA9IChpbnQpRlhTWVNfY2VpbChGWFNZU19zcXJ0MihwRGVzdE1hdHJpeC0+YywgcERlc3RNYXRyaXgtPmQpKTsKQEAgLTI1NCw3ICsyNTQsNyBAQAogICAgIG1fU3RyZXRjaENsaXAuSW50ZXJzZWN0KDAsIDAsIHN0cmV0Y2hfd2lkdGgsIHN0cmV0Y2hfaGVpZ2h0KTsKICAgICBtX1N0cmV0Y2hlci5TdGFydCgmbV9TdG9yZXIsIHBTcmMsIHN0cmV0Y2hfd2lkdGgsIHN0cmV0Y2hfaGVpZ2h0LCBtX1N0cmV0Y2hDbGlwLCBmbGFncyk7CiAgICAgbV9TdGF0dXMgPSAzOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdWludDhfdCBfYmlsaW5lYXJfaW50ZXJwb2woY29uc3QgdWludDhfdCogYnVmLCBpbnQgcm93X29mZnNldF9sLCBpbnQgcm93X29mZnNldF9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19jb2xfbCwgaW50IHNyY19jb2xfciwgaW50IHJlc194LCBpbnQgcmVzX3ksCkBAIC0zMzUsMzAgKzMzNSwzMCBAQAogICAgIH0KICAgICByZXR1cm4gZm9ybWF0OwogfQotRlhfQk9PTCBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCitib29sIENGWF9JbWFnZVRyYW5zZm9ybWVyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICBpZiAobV9TdGF0dXMgPT0gMSkgewogICAgICAgICBpZiAobV9TdHJldGNoZXIuQ29udGludWUocFBhdXNlKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9TdG9yZXIuR2V0Qml0bWFwKCkpIHsKICAgICAgICAgICAgIG1fU3RvcmVyLlJlcGxhY2UobV9TdG9yZXIuR2V0Qml0bWFwKCktPlN3YXBYWShtX3BNYXRyaXgtPmMgPiAwLCBtX3BNYXRyaXgtPmIgPCAwKSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX1N0YXR1cyA9PSAyKSB7CiAgICAgICAgIHJldHVybiBtX1N0cmV0Y2hlci5Db250aW51ZShwUGF1c2UpOwogICAgIH0KICAgICBpZiAobV9TdGF0dXMgIT0gMykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fU3RyZXRjaGVyLkNvbnRpbnVlKHBQYXVzZSkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpbnQgc3RyZXRjaF93aWR0aCA9IG1fU3RyZXRjaENsaXAuV2lkdGgoKTsKICAgICBpbnQgc3RyZXRjaF9oZWlnaHQgPSBtX1N0cmV0Y2hDbGlwLkhlaWdodCgpOwogICAgIGlmIChtX1N0b3Jlci5HZXRCaXRtYXAoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBjb25zdCB1aW50OF90KiBzdHJldGNoX2J1ZiA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5HZXRCdWZmZXIoKTsKICAgICBjb25zdCB1aW50OF90KiBzdHJldGNoX2J1Zl9tYXNrID0gTlVMTDsKQEAgLTM3MCw3ICszNzAsNyBAQAogICAgIEZYRElCX0Zvcm1hdCB0cmFuc2Zvcm1GID0gX0dldFRyYW5zZm9ybWVkRm9ybWF0KG1fU3RyZXRjaGVyLm1fcFNvdXJjZSk7CiAgICAgaWYgKCFwVHJhbnNmb3JtZWQtPkNyZWF0ZShtX1Jlc3VsdFdpZHRoLCBtX1Jlc3VsdEhlaWdodCwgdHJhbnNmb3JtRikpIHsKICAgICAgICAgZGVsZXRlIHBUcmFuc2Zvcm1lZDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHBUcmFuc2Zvcm1lZC0+Q2xlYXIoMCk7CiAgICAgaWYgKHBUcmFuc2Zvcm1lZC0+bV9wQWxwaGFNYXNrKSB7CkBAIC02NDEsNyArNjQxLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGWF9CT09MIGJIYXNBbHBoYSA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5IYXNBbHBoYSgpOworICAgICAgICAgICAgYm9vbCBiSGFzQWxwaGEgPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+SGFzQWxwaGEoKTsKICAgICAgICAgICAgIGludCBkZXN0QnBwID0gcFRyYW5zZm9ybWVkLT5HZXRCUFAoKSAvIDg7CiAgICAgICAgICAgICBpZiAoIShtX0ZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgJiYgIShtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkpIHsKICAgICAgICAgICAgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKQEAgLTc4Niw1ICs3ODYsNSBAQAogICAgICAgICB9CiAgICAgfQogICAgIG1fU3RvcmVyLlJlcGxhY2UocFRyYW5zZm9ybWVkKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9kZXZpY2UuY3BwIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9kZXZpY2UuY3BwCmluZGV4IDBiYWE5OWMuLmVjZGQxYjAgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZGV2aWNlLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2RldmljZS5jcHAKQEAgLTM1LDcgKzM1LDcgQEAKICAgICAgICAgbV9DbGlwQm94LmJvdHRvbSA9IG1fSGVpZ2h0OwogICAgIH0KIH0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U3RhcnRSZW5kZXJpbmcoKQorYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTdGFydFJlbmRlcmluZygpCiB7CiAgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U3RhcnRSZW5kZXJpbmcoKTsKIH0KQEAgLTQ3LDcgKzQ3LDcgQEAKIHsKICAgICBtX3BEZXZpY2VEcml2ZXItPlNhdmVTdGF0ZSgpOwogfQotdm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKQordm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpSZXN0b3JlU3RhdGUoYm9vbCBiS2VlcFNhdmVkKQogewogICAgIG1fcERldmljZURyaXZlci0+UmVzdG9yZVN0YXRlKGJLZWVwU2F2ZWQpOwogICAgIFVwZGF0ZUNsaXBCb3goKTsKQEAgLTYwLDcgKzYwLDcgQEAKIHsKICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5HZXRDVE0oKTsKIH0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6Q3JlYXRlQ29tcGF0aWJsZUJpdG1hcChDRlhfRElCaXRtYXAqIHBESUIsIGludCB3aWR0aCwgaW50IGhlaWdodCkgY29uc3QKK2Jvb2wgQ0ZYX1JlbmRlckRldmljZTo6Q3JlYXRlQ29tcGF0aWJsZUJpdG1hcChDRlhfRElCaXRtYXAqIHBESUIsIGludCB3aWR0aCwgaW50IGhlaWdodCkgY29uc3QKIHsKICAgICBpZiAobV9SZW5kZXJDYXBzICYgRlhSQ19DTVlLX09VVFBVVCkgewogICAgICAgICByZXR1cm4gcERJQi0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIG1fUmVuZGVyQ2FwcyAmIEZYUkNfQUxQSEFfT1VUUFVUID8gRlhESUJfQ215a2EgOiBGWERJQl9DbXlrKTsKQEAgLTc0LDM3ICs3NCwzNyBAQAogICAgIHJldHVybiBwRElCLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgbV9SZW5kZXJDYXBzICYgRlhSQ19BTFBIQV9PVVRQVVQgPyBGWERJQl9BcmdiIDogRlhESUJfUmdiKTsKICNlbmRpZgogfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgaW50IGZpbGxfbW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewogICAgIGlmICghbV9wRGV2aWNlRHJpdmVyLT5TZXRDbGlwX1BhdGhGaWxsKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIGZpbGxfbW9kZSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIFVwZGF0ZUNsaXBCb3goKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKICAgICBpZiAoIW1fcERldmljZURyaXZlci0+U2V0Q2xpcF9QYXRoU3Ryb2tlKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIHBHcmFwaFN0YXRlKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgVXBkYXRlQ2xpcEJveCgpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRDbGlwX1JlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QpCitib29sIENGWF9SZW5kZXJEZXZpY2U6OlNldENsaXBfUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCkKIHsKICAgICBDRlhfUGF0aERhdGEgcGF0aDsKICAgICBwYXRoLkFwcGVuZFJlY3QoKEZYX0ZMT0FUKShwUmVjdC0+bGVmdCksIChGWF9GTE9BVCkocFJlY3QtPmJvdHRvbSksIChGWF9GTE9BVCkocFJlY3QtPnJpZ2h0KSwgKEZYX0ZMT0FUKShwUmVjdC0+dG9wKSk7CiAgICAgaWYgKCFTZXRDbGlwX1BhdGhGaWxsKCZwYXRoLCBOVUxMLCBGWEZJTExfV0lORElORykpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIFVwZGF0ZUNsaXBCb3goKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ0ZYX1JlbmRlckRldmljZTo6VXBkYXRlQ2xpcEJveCgpCiB7CkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICBtX0NsaXBCb3gucmlnaHQgPSBtX1dpZHRoOwogICAgIG1fQ2xpcEJveC5ib3R0b20gPSBtX0hlaWdodDsKIH0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCitib29sIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwgRlhfRFdPUkQgc3Ryb2tlX2NvbG9yLCBpbnQgZmlsbF9tb2RlLApAQCAtMTQ5LDcgKzE0OSw3IEBACiAgICAgICAgICAgICB5MiA9IHBQb2ludHNbMV0ubV9Qb2ludFk7CiAgICAgICAgIH0KICAgICAgICAgRHJhd0Nvc21ldGljTGluZSh4MSwgeTEsIHgyLCB5MiwgZmlsbF9jb2xvciwgZmlsbF9tb2RlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoKHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDUgfHwgcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNCkgJiYgc3Ryb2tlX2FscGhhID09IDApIHsKICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0X2Y7CkBAIC0xODQsMTMgKzE4NCwxMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChGaWxsUmVjdCgmcmVjdF9pLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIGlmKChmaWxsX21vZGUgJiAzKSAmJiBzdHJva2VfYWxwaGEgPT0gMCAmJiAhKGZpbGxfbW9kZSAmIEZYX0ZJTExfU1RST0tFKSAmJiAhKGZpbGxfbW9kZSAmIEZYX0ZJTExfVEVYVF9NT0RFKSkgewogICAgICAgICBDRlhfUGF0aERhdGEgbmV3UGF0aDsKLSAgICAgICAgRlhfQk9PTCBiVGhpbiA9IEZBTFNFOworICAgICAgICBib29sIGJUaGluID0gZmFsc2U7CiAgICAgICAgIGlmIChwUGF0aERhdGEtPkdldFplcm9BcmVhUGF0aChuZXdQYXRoLCAoQ0ZYX01hdHJpeCopcE9iamVjdDJEZXZpY2UsIGJUaGluLCBtX3BEZXZpY2VEcml2ZXItPkdldERyaXZlclR5cGUoKSkpIHsKICAgICAgICAgICAgIENGWF9HcmFwaFN0YXRlRGF0YSBncmFwaFN0YXRlOwogICAgICAgICAgICAgZ3JhcGhTdGF0ZS5tX0xpbmVXaWR0aCA9IDAuMGY7CkBAIC0yMTUsNyArMjE1LDcgQEAKICAgICB9CiAgICAgaWYgKChmaWxsX21vZGUgJiAzKSAmJiBmaWxsX2FscGhhICYmIHN0cm9rZV9hbHBoYSA8IDB4ZmYgJiYgKGZpbGxfbW9kZSAmIEZYX0ZJTExfU1RST0tFKSkgewogICAgICAgICBpZiAoIShtX1JlbmRlckNhcHMgJiBGWFJDX0dFVF9CSVRTKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIENGWF9GbG9hdFJlY3QgYmJveDsKICAgICAgICAgaWYgKHBHcmFwaFN0YXRlKSB7CkBAIC0yMzIsMTkgKzIzMiwxOSBAQAogICAgICAgICBGWF9SRUNUIHJlY3QgPSBiYm94LkdldE91dHRlclJlY3QoKTsKICAgICAgICAgQ0ZYX0RJQml0bWFwIGJpdG1hcCwgQmFja2Ryb3A7CiAgICAgICAgIGlmICghQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCgmYml0bWFwLCBGWFNZU19yb3VuZChyZWN0LldpZHRoKCkgKiBmU2NhbGVYKSwgRlhTWVNfcm91bmQocmVjdC5IZWlnaHQoKSAqIGZTY2FsZVkpKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChiaXRtYXAuSGFzQWxwaGEoKSkgewogICAgICAgICAgICAgYml0bWFwLkNsZWFyKDApOwogICAgICAgICAgICAgQmFja2Ryb3AuQ29weSgmYml0bWFwKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmICghbV9wRGV2aWNlRHJpdmVyLT5HZXRESUJpdHMoJmJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgTlVMTCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQmFja2Ryb3AuQ29weSgmYml0bWFwKTsKICAgICAgICAgfQogICAgICAgICBDRlhfRnhnZURldmljZSBiaXRtYXBfZGV2aWNlOwotICAgICAgICBiaXRtYXBfZGV2aWNlLkF0dGFjaCgmYml0bWFwLCAwLCBGQUxTRSwgJkJhY2tkcm9wLCBUUlVFKTsKKyAgICAgICAgYml0bWFwX2RldmljZS5BdHRhY2goJmJpdG1hcCwgMCwgZmFsc2UsICZCYWNrZHJvcCwgdHJ1ZSk7CiAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwogICAgICAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKICAgICAgICAgICAgIG1hdHJpeCA9ICpwT2JqZWN0MkRldmljZTsKQEAgLTI1Miw1MSArMjUyLDUxIEBACiAgICAgICAgIG1hdHJpeC5UcmFuc2xhdGVJKC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7CiAgICAgICAgIG1hdHJpeC5Db25jYXQoZlNjYWxlWCwgMCwgMCwgZlNjYWxlWSwgMCwgMCk7CiAgICAgICAgIGlmICghYml0bWFwX2RldmljZS5HZXREZXZpY2VEcml2ZXIoKS0+RHJhd1BhdGgocFBhdGhEYXRhLCAmbWF0cml4LCBwR3JhcGhTdGF0ZSwgZmlsbF9jb2xvciwgc3Ryb2tlX2NvbG9yLCBmaWxsX21vZGUsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCBGWFNZU19yb3VuZChyZWN0LldpZHRoKCkgKiBmU2NhbGVYKSwgRlhTWVNfcm91bmQocmVjdC5IZWlnaHQoKSAqIGZTY2FsZVkpKTsKICAgICAgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U2V0RElCaXRzKCZiaXRtYXAsIDAsICZzcmNfcmVjdCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgRlhESUJfQkxFTkRfTk9STUFMKTsKICAgICB9CiAgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+RHJhd1BhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwgcEdyYXBoU3RhdGUsIGZpbGxfY29sb3IsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKIH0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCitib29sIENGWF9SZW5kZXJEZXZpY2U6OlNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChtX3BEZXZpY2VEcml2ZXItPlNldFBpeGVsKHgsIHksIGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIEZYX1JFQ1QgcmVjdCh4LCB5LCB4ICsgMSwgeSArIDEpOwogICAgIHJldHVybiBGaWxsUmVjdCgmcmVjdCwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQorYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogewogICAgIGlmIChtX3BEZXZpY2VEcml2ZXItPkZpbGxSZWN0KHBSZWN0LCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmICghKG1fUmVuZGVyQ2FwcyAmIEZYUkNfR0VUX0JJVFMpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRlhfRElCaXRtYXAgYml0bWFwOwogICAgIGlmICghQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCgmYml0bWFwLCBwUmVjdC0+V2lkdGgoKSwgcFJlY3QtPkhlaWdodCgpKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPkdldERJQml0cygmYml0bWFwLCBwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghYml0bWFwLkNvbXBvc2l0ZVJlY3QoMCwgMCwgcFJlY3QtPldpZHRoKCksIHBSZWN0LT5IZWlnaHQoKSwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgcFJlY3QtPldpZHRoKCksIHBSZWN0LT5IZWlnaHQoKSk7CiAgICAgbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMoJmJpdG1hcCwgMCwgJnNyY19yZWN0LCBwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCitib29sIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICBpbnQgZmlsbF9tb2RlLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCiB7CiAgICAgaWYgKCgobV9SZW5kZXJDYXBzICYgRlhSQ19BTFBIQV9QQVRIKSAmJgogICAgICAgICAgICAgKEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgJiYgRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgPT0gMHhmZikpIHx8CiAgICAgICAgICAgICBjb2xvciA+PSAweGZmMDAwMDAwKQogICAgICAgICBpZiAobV9wRGV2aWNlRHJpdmVyLT5EcmF3Q29zbWV0aWNMaW5lKHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3JhcGhfc3RhdGU7CiAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CkBAIC0zMDUsMTAgKzMwNSwxMCBAQAogICAgIHBhdGguU2V0UG9pbnQoMSwgeDIsIHkyLCBGWFBUX0xJTkVUTyk7CiAgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+RHJhd1BhdGgoJnBhdGgsIE5VTEwsICZncmFwaF9zdGF0ZSwgMCwgY29sb3IsIGZpbGxfbW9kZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7CiB9Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OkdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQorYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAoIShtX1JlbmRlckNhcHMgJiBGWFJDX0dFVF9CSVRTKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+R2V0RElCaXRzKHBCaXRtYXAsIGxlZnQsIHRvcCwgcEljY1RyYW5zZm9ybSk7CiB9CkBAIC0zMTYsNyArMzE2LDcgQEAKIHsKICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5HZXRCYWNrRHJvcCgpOwogfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF9tb2RlLAorYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBBU1NFUlQoIXBCaXRtYXAtPklzQWxwaGFNYXNrKCkpOwpAQCAtMzI2LDcgKzMyNiw3IEBACiAgICAgRlhfUkVDVCBkZXN0X3JlY3QobGVmdCwgdG9wLCBGWFNZU19yb3VuZChsZWZ0ICsgcEJpdG1hcC0+R2V0V2lkdGgoKSAvIGZTY2FsZVgpLCBGWFNZU19yb3VuZCh0b3AgKyBwQml0bWFwLT5HZXRIZWlnaHQoKSAvIGZTY2FsZVkpKTsKICAgICBkZXN0X3JlY3QuSW50ZXJzZWN0KG1fQ2xpcEJveCk7CiAgICAgaWYgKGRlc3RfcmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBGWF9SRUNUIHNyY19yZWN0KGRlc3RfcmVjdC5sZWZ0IC0gbGVmdCwgZGVzdF9yZWN0LnRvcCAtIHRvcCwKICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcmVjdC5sZWZ0IC0gbGVmdCArIGRlc3RfcmVjdC5XaWR0aCgpLCBkZXN0X3JlY3QudG9wIC0gdG9wICsgZGVzdF9yZWN0LkhlaWdodCgpKTsKQEAgLTMzNywyOSArMzM3LDI5IEBACiAgICAgaWYgKChibGVuZF9tb2RlICE9IEZYRElCX0JMRU5EX05PUk1BTCAmJiAhKG1fUmVuZGVyQ2FwcyAmIEZYUkNfQkxFTkRfTU9ERSkpIHx8CiAgICAgICAgICAgICAocEJpdG1hcC0+SGFzQWxwaGEoKSAmJiAhKG1fUmVuZGVyQ2FwcyAmIEZYUkNfQUxQSEFfSU1BR0UpKSkgewogICAgICAgICBpZiAoIShtX1JlbmRlckNhcHMgJiBGWFJDX0dFVF9CSVRTKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGludCBiZ19waXhlbF93aWR0aCA9IEZYU1lTX3JvdW5kKGRlc3RfcmVjdC5XaWR0aCgpICogZlNjYWxlWCk7CiAgICAgICAgIGludCBiZ19waXhlbF9oZWlnaHQgPSBGWFNZU19yb3VuZChkZXN0X3JlY3QuSGVpZ2h0KCkgKiBmU2NhbGVZKTsKICAgICAgICAgQ0ZYX0RJQml0bWFwIGJhY2tncm91bmQ7CiAgICAgICAgIGlmICghYmFja2dyb3VuZC5DcmVhdGUoYmdfcGl4ZWxfd2lkdGgsIGJnX3BpeGVsX2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9SZW5kZXJDYXBzICYgRlhSQ19DTVlLX09VVFBVVCkgPyBGWERJQl9DbXlrIDogRlhESUJfUmdiMzIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPkdldERJQml0cygmYmFja2dyb3VuZCwgZGVzdF9yZWN0LmxlZnQsIGRlc3RfcmVjdC50b3ApKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFiYWNrZ3JvdW5kLkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBiZ19waXhlbF93aWR0aCwgYmdfcGl4ZWxfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAsIHNyY19yZWN0LmxlZnQsIHNyY19yZWN0LnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZF9tb2RlLCBOVUxMLCBGQUxTRSwgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZF9tb2RlLCBOVUxMLCBmYWxzZSwgcEljY1RyYW5zZm9ybSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIGJnX3BpeGVsX3dpZHRoLCBiZ19waXhlbF9oZWlnaHQpOwogICAgICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMoJmJhY2tncm91bmQsIDAsICZzcmNfcmVjdCwgZGVzdF9yZWN0LmxlZnQsIGRlc3RfcmVjdC50b3AsIEZYRElCX0JMRU5EX05PUk1BTCk7CiAgICAgfQogICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPlNldERJQml0cyhwQml0bWFwLCAwLCAmc3JjX3JlY3QsIGRlc3RfcmVjdC5sZWZ0LCBkZXN0X3JlY3QudG9wLCBibGVuZF9tb2RlLCAwLCBwSWNjVHJhbnNmb3JtKTsKIH0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwKK2Jvb2wgQ0ZYX1JlbmRlckRldmljZTo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfbW9kZSkKIHsKQEAgLTM2NywxNyArMzY3LDE3IEBACiAgICAgRlhfUkVDVCBjbGlwX2JveCA9IG1fQ2xpcEJveDsKICAgICBjbGlwX2JveC5JbnRlcnNlY3QoZGVzdF9yZWN0KTsKICAgICBpZiAoY2xpcF9ib3guSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U3RyZXRjaERJQml0cyhwQml0bWFwLCAwLCBsZWZ0LCB0b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCAmY2xpcF9ib3gsIGZsYWdzLCAwLCBwSWNjVHJhbnNmb3JtLCBibGVuZF9tb2RlKTsKIH0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U2V0Qml0TWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgRlhfRFdPUkQgYXJnYiwKK2Jvb2wgQ0ZYX1JlbmRlckRldmljZTo6U2V0Qml0TWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgRlhfRFdPUkQgYXJnYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpKTsKICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMocEJpdG1hcCwgYXJnYiwgJnNyY19yZWN0LCBsZWZ0LCB0b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiB9Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlN0cmV0Y2hCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLAorYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTdHJldGNoQml0TWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwKICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgRlhfRFdPUkQgYXJnYiwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewpAQCAtMzg2LDEzICszODYsMTMgQEAKICAgICBjbGlwX2JveC5JbnRlcnNlY3QoZGVzdF9yZWN0KTsKICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TdHJldGNoRElCaXRzKHBCaXRtYXAsIGFyZ2IsIGxlZnQsIHRvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsICZjbGlwX2JveCwgZmxhZ3MsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBhcmdiLAorYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBhcmdiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywgdm9pZComIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF9tb2RlKQogewogICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPlN0YXJ0RElCaXRzKHBCaXRtYXAsIGJpdG1hcF9hbHBoYSwgYXJnYiwgcE1hdHJpeCwgZmxhZ3MsIGhhbmRsZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfbW9kZSk7CiB9Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OkNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCitib29sIENGWF9SZW5kZXJEZXZpY2U6OkNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+Q29udGludWVESUJpdHMoaGFuZGxlLCBwUGF1c2UpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250LmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZm9udC5jcHAKaW5kZXggNmE5NTBiZi4uN2E1ZTBjYyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250LmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2ZvbnQuY3BwCkBAIC0xMyw4ICsxMyw4IEBACiB7CiAgICAgbV9wU3Vic3RGb250ID0gTlVMTDsKICAgICBtX0ZhY2UgPSBOVUxMOwotICAgIG1fYkVtYmVkZGVkID0gRkFMU0U7Ci0gICAgbV9iVmVydGljYWwgPSBGQUxTRTsKKyAgICBtX2JFbWJlZGRlZCA9IGZhbHNlOworICAgIG1fYlZlcnRpY2FsID0gZmFsc2U7CiAgICAgbV9wRm9udERhdGEgPSBOVUxMOwogICAgIG1fcEZvbnREYXRhQWxsb2NhdGlvbiA9IE5VTEw7CiAgICAgbV9kd1NpemUgPSAwOwpAQCAtMjQsNyArMjQsNyBAQAogICAgIG1fcFBsYXRmb3JtRm9udENvbGxlY3Rpb24gPSBOVUxMOwogICAgIG1fcER3Rm9udCA9IE5VTEw7CiAgICAgbV9oSGFuZGxlID0gTlVMTDsKLSAgICBtX2JEd0xvYWRlZCA9IEZBTFNFOworICAgIG1fYkR3TG9hZGVkID0gZmFsc2U7CiB9CiBDRlhfRm9udDo6fkNGWF9Gb250KCkKIHsKQEAgLTYxLDEwICs2MSwxMCBAQAogICAgIEZYRlRfRG9uZV9GYWNlKG1fRmFjZSk7CiAgICAgbV9GYWNlID0gTlVMTDsKIH0KLUZYX0JPT0wgQ0ZYX0ZvbnQ6OkxvYWRTdWJzdChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBGWF9CT09MIGJUcnVlVHlwZSwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgaW50IGl0YWxpY19hbmdsZSwgaW50IENoYXJzZXRDUCwgRlhfQk9PTCBiVmVydGljYWwpCitib29sIENGWF9Gb250OjpMb2FkU3Vic3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwgYm9vbCBiVHJ1ZVR5cGUsIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGludCBpdGFsaWNfYW5nbGUsIGludCBDaGFyc2V0Q1AsIGJvb2wgYlZlcnRpY2FsKQogewotICAgIG1fYkVtYmVkZGVkID0gRkFMU0U7CisgICAgbV9iRW1iZWRkZWQgPSBmYWxzZTsKICAgICBtX2JWZXJ0aWNhbCA9IGJWZXJ0aWNhbDsKICAgICBtX3BTdWJzdEZvbnQgPSBuZXcgQ0ZYX1N1YnN0Rm9udDsKICAgICBtX0ZhY2UgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPkZpbmRTdWJzdEZvbnQoZmFjZV9uYW1lLCBiVHJ1ZVR5cGUsIGZsYWdzLCB3ZWlnaHQsIGl0YWxpY19hbmdsZSwKQEAgLTc5LDcgKzc5LDcgQEAKICAgICAgICAgbV9wRm9udERhdGEgPSBGWEZUX0dldF9GYWNlX1N0cmVhbV9CYXNlKG1fRmFjZSk7CiAgICAgICAgIG1fZHdTaXplID0gRlhGVF9HZXRfRmFjZV9TdHJlYW1fU2l6ZShtX0ZhY2UpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGV4dGVybiAiQyIgewogICAgIHVuc2lnbmVkIGxvbmcgX0ZUU3RyZWFtUmVhZChGWEZUX1N0cmVhbSBzdHJlYW0sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LApAQCAtOTksNyArOTksNyBAQAogICAgIHsKICAgICB9CiB9OwotRlhfQk9PTCBfTG9hZEZpbGUoRlhGVF9MaWJyYXJ5IGxpYnJhcnksIEZYRlRfRmFjZSogRmFjZSwgSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhGVF9TdHJlYW0qIHN0cmVhbSkKK2Jvb2wgX0xvYWRGaWxlKEZYRlRfTGlicmFyeSBsaWJyYXJ5LCBGWEZUX0ZhY2UqIEZhY2UsIElGWF9GaWxlUmVhZCogcEZpbGUsIEZYRlRfU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgRlhGVF9TdHJlYW0gc3RyZWFtMSA9IChGWEZUX1N0cmVhbSlGWF9BbGxvYyh1aW50OF90LCBzaXplb2YgKEZYRlRfU3RyZWFtUmVjKSk7CiAgICAgc3RyZWFtMS0+YmFzZSA9IE5VTEw7CkBAIC0xMTMsMTYgKzExMywxNiBAQAogICAgIGFyZ3Muc3RyZWFtID0gc3RyZWFtMTsKICAgICBpZiAoRlhGVF9PcGVuX0ZhY2UobGlicmFyeSwgJmFyZ3MsIDAsIEZhY2UpKSB7CiAgICAgICAgIEZYX0ZyZWUoc3RyZWFtMSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoc3RyZWFtKSB7CiAgICAgICAgICpzdHJlYW0gPSBzdHJlYW0xOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX0ZvbnQ6OkxvYWRGaWxlKElGWF9GaWxlUmVhZCogcEZpbGUpCitib29sIENGWF9Gb250OjpMb2FkRmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlKQogewotICAgIG1fYkVtYmVkZGVkID0gRkFMU0U7CisgICAgbV9iRW1iZWRkZWQgPSBmYWxzZTsKICAgICBGWEZUX0xpYnJhcnkgbGlicmFyeTsKICAgICBpZiAoQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5tX0ZUTGlicmFyeSA9PSBOVUxMKSB7CiAgICAgICAgIEZYRlRfSW5pdF9GcmVlVHlwZSgmQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5tX0ZUTGlicmFyeSk7CkBAIC0xMzAsMTEgKzEzMCwxMSBAQAogICAgIGxpYnJhcnkgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPm1fRlRMaWJyYXJ5OwogICAgIEZYRlRfU3RyZWFtIHN0cmVhbSA9IE5VTEw7CiAgICAgaWYgKCFfTG9hZEZpbGUobGlicmFyeSwgJm1fRmFjZSwgcEZpbGUsICZzdHJlYW0pKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BPd25lZFN0cmVhbSA9IHN0cmVhbTsKICAgICBGWEZUX1NldF9QaXhlbF9TaXplcyhtX0ZhY2UsIDAsIDY0KTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGludCBDRlhfRm9udDo6R2V0R2x5cGhXaWR0aChGWF9EV09SRCBnbHlwaF9pbmRleCkKIHsKQEAgLTE2OSwyMCArMTY5LDIwIEBACiAgICAgfQogICAgIHJldHVybiBmYWNlOwogfQotRlhfQk9PTCBDRlhfRm9udDo6TG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIEZYX0RXT1JEIHNpemUpCitib29sIENGWF9Gb250OjpMb2FkRW1iZWRkZWQoY29uc3QgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSkKIHsKICAgICBtX3BGb250RGF0YUFsbG9jYXRpb24gPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKICAgICBGWFNZU19tZW1jcHkobV9wRm9udERhdGFBbGxvY2F0aW9uLCBkYXRhLCBzaXplKTsKICAgICBtX0ZhY2UgPSBGVF9Mb2FkRm9udCgodWludDhfdCopbV9wRm9udERhdGFBbGxvY2F0aW9uLCBzaXplKTsKICAgICBtX3BGb250RGF0YSA9ICh1aW50OF90KiltX3BGb250RGF0YUFsbG9jYXRpb247Ci0gICAgbV9iRW1iZWRkZWQgPSBUUlVFOworICAgIG1fYkVtYmVkZGVkID0gdHJ1ZTsKICAgICBtX2R3U2l6ZSA9IHNpemU7CiAgICAgcmV0dXJuIG1fRmFjZSAhPSBOVUxMOwogfQotRlhfQk9PTCBDRlhfRm9udDo6SXNUVEZvbnQoKQorYm9vbCBDRlhfRm9udDo6SXNUVEZvbnQoKQogewogICAgIGlmIChtX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIEZYRlRfSXNfRmFjZV9UVF9PVChtX0ZhY2UpID09IEZYRlRfRkFDRV9GTEFHX1NGTlQ7CiB9CkBAIC0yMDIsMjUgKzIwMiwyNSBAQAogICAgIGludCBkZXNjZW50ID0gRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9GYWNlX0Rlc2NlbmRlcihtX0ZhY2UpKTsKICAgICByZXR1cm4gZGVzY2VudDsKIH0KLUZYX0JPT0wgQ0ZYX0ZvbnQ6OkdldEdseXBoQkJveChGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfUkVDVCAmYmJveCkKK2Jvb2wgQ0ZYX0ZvbnQ6OkdldEdseXBoQkJveChGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfUkVDVCAmYmJveCkKIHsKICAgICBpZiAobV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChGWEZUX0lzX0ZhY2VfVHJpY2t5KG1fRmFjZSkpIHsKICAgICAgICAgaW50IGVycm9yID0gRlhGVF9TZXRfQ2hhcl9TaXplKG1fRmFjZSwgMCwgMTAwMCAqIDY0LCA3MiwgNzIpOwogICAgICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBlcnJvciA9IEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGdseXBoX2luZGV4LCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKTsKICAgICAgICAgaWYgKGVycm9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgRlhGVF9CQm94IGNib3g7CiAgICAgICAgIEZUX0dseXBoIGdseXBoOwogICAgICAgICBlcnJvciA9IEZYRlRfR2V0X0dseXBoKCgoRlhGVF9GYWNlKW1fRmFjZSktPmdseXBoLCAmZ2x5cGgpOwogICAgICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBGWEZUX0dseXBoX0dldF9DQm94KGdseXBoLCBGWEZUX0dMWVBIX0JCT1hfUElYRUxTLCAmY2JveCk7CiAgICAgICAgIGludCBwaXhlbF9zaXplX3ggPSAoKEZYRlRfRmFjZSltX0ZhY2UpLT5zaXplLT5tZXRyaWNzLnhfcHBlbSwKQEAgLTI0Niw3ICsyNDYsNyBAQAogICAgICAgICByZXR1cm4gRlhGVF9TZXRfUGl4ZWxfU2l6ZXMobV9GYWNlLCAwLCA2NCkgPT0gMDsKICAgICB9CiAgICAgaWYgKEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGdseXBoX2luZGV4LCBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IGVtID0gRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSk7CiAgICAgaWYgKGVtID09IDApIHsKQEAgLTI2MCwzNCArMjYwLDM0IEBACiAgICAgICAgIGJib3gucmlnaHQgPSAoRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKG1fRmFjZSkgKyBGWEZUX0dldF9HbHlwaF9XaWR0aChtX0ZhY2UpKSAqIDEwMDAgLyBlbTsKICAgICAgICAgYmJveC5ib3R0b20gPSAoRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKG1fRmFjZSkpICogMTAwMCAvIGVtOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX0ZvbnQ6OklzSXRhbGljKCkKK2Jvb2wgQ0ZYX0ZvbnQ6OklzSXRhbGljKCkKIHsKICAgICBpZiAobV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIEZYX0JPT0wgcmV0ID0gRlhGVF9Jc19GYWNlX0l0YWxpYyhtX0ZhY2UpID09IEZYRlRfU1RZTEVfRkxBR19JVEFMSUM7CisgICAgYm9vbCByZXQgPSBGWEZUX0lzX0ZhY2VfSXRhbGljKG1fRmFjZSkgPT0gRlhGVF9TVFlMRV9GTEFHX0lUQUxJQzsKICAgICBpZiAoIXJldCkgewogICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIoRlhGVF9HZXRfRmFjZV9TdHlsZV9OYW1lKG1fRmFjZSkpOwogICAgICAgICBzdHIuTWFrZUxvd2VyKCk7CiAgICAgICAgIGlmIChzdHIuRmluZCgiaXRhbGljIikgIT0gLTEpIHsKLSAgICAgICAgICAgIHJldCA9IFRSVUU7CisgICAgICAgICAgICByZXQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiByZXQ7CiB9Ci1GWF9CT09MIENGWF9Gb250OjpJc0JvbGQoKQorYm9vbCBDRlhfRm9udDo6SXNCb2xkKCkKIHsKICAgICBpZiAobV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBGWEZUX0lzX0ZhY2VfQm9sZChtX0ZhY2UpID09IEZYRlRfU1RZTEVfRkxBR19CT0xEOwogfQotRlhfQk9PTCBDRlhfRm9udDo6SXNGaXhlZFdpZHRoKCkKK2Jvb2wgQ0ZYX0ZvbnQ6OklzRml4ZWRXaWR0aCgpCiB7CiAgICAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gRlhGVF9Jc19GYWNlX2ZpeGVkd2lkdGgobV9GYWNlKTsKIH0KQEAgLTMzMSwxMCArMzMxLDEwIEBACiAgICAgfQogICAgIHJldHVybiBtX3BTdWJzdEZvbnQtPm1fRmFtaWx5OwogfQotRlhfQk9PTCBDRlhfRm9udDo6R2V0QkJveChGWF9SRUNUICZiYm94KQorYm9vbCBDRlhfRm9udDo6R2V0QkJveChGWF9SRUNUICZiYm94KQogewogICAgIGlmIChtX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IGVtID0gRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSk7CiAgICAgaWYgKGVtID09IDApIHsKQEAgLTM0OCw3ICszNDgsNyBAQAogICAgICAgICBiYm94LnJpZ2h0ID0gRlhGVF9HZXRfRmFjZV94TWF4KG1fRmFjZSkgKiAxMDAwIC8gZW07CiAgICAgICAgIGJib3guYm90dG9tID0gRlhGVF9HZXRfRmFjZV95TWF4KG1fRmFjZSkgKiAxMDAwIC8gZW07CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogaW50IENGWF9Gb250OjpHZXRIZWlnaHQoKQogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250bWFwLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZm9udG1hcC5jcHAKaW5kZXggMTQ0MjdhNS4uMTVmMDIyZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250bWFwLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2ZvbnRtYXAuY3BwCkBAIC0xOCw5ICsxOCw5IEBACiAgICAgbV9TdWJzdEZsYWdzID0gMDsKICAgICBtX1dlaWdodCA9IDA7CiAgICAgbV9JdGFsaWNBbmdsZSA9IDA7Ci0gICAgbV9iU3Vic3RPZkNKSyA9IEZBTFNFOworICAgIG1fYlN1YnN0T2ZDSksgPSBmYWxzZTsKICAgICBtX1dlaWdodENKSyA9IDA7Ci0gICAgbV9iSXRsaWNDSksgPSBGQUxTRTsKKyAgICBtX2JJdGxpY0NKSyA9IGZhbHNlOwogfQogQ1RURm9udERlc2M6On5DVFRGb250RGVzYygpCiB7CkBAIC0zOCwxMSArMzgsMTEgQEAKICAgICAgICAgRlhfRnJlZShtX3BGb250RGF0YSk7CiAgICAgfQogfQotRlhfQk9PTCBDVFRGb250RGVzYzo6UmVsZWFzZUZhY2UoRlhGVF9GYWNlIGZhY2UpCitib29sIENUVEZvbnREZXNjOjpSZWxlYXNlRmFjZShGWEZUX0ZhY2UgZmFjZSkKIHsKICAgICBpZiAobV9UeXBlID09IDEpIHsKICAgICAgICAgaWYgKG1fU2luZ2xlRmFjZS5tX3BGYWNlICE9IGZhY2UpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobV9UeXBlID09IDIpIHsKICAgICAgICAgaW50IGk7CkBAIC01MSwxNSArNTEsMTUgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgaWYgKGkgPT0gMTYpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBtX1JlZkNvdW50IC0tOwogICAgIGlmIChtX1JlZkNvdW50KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBkZWxldGUgdGhpczsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIENGWF9Gb250TWdyOjpDRlhfRm9udE1ncigpCiB7CkBAIC05OCw3ICs5OCw3IEBACiB7CiAgICAgbV9wQnVpbHRpbk1hcHBlci0+U2V0U3lzdGVtRm9udEluZm8ocEZvbnRJbmZvKTsKIH0KLUZYRlRfRmFjZSBDRlhfRm9udE1ncjo6RmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBGWF9CT09MIGJUcnVlVHlwZSwKK0ZYRlRfRmFjZSBDRlhfRm9udE1ncjo6RmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBib29sIGJUcnVlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywgaW50IHdlaWdodCwgaW50IGl0YWxpY19hbmdsZSwgaW50IENoYXJzZXRDUCwgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCkKIHsKICAgICBpZiAobV9GVExpYnJhcnkgPT0gTlVMTCkgewpAQCAtMTE1LDcgKzExNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNldENQLCBwU3Vic3RGb250KTsKIH0KIEZYRlRfRmFjZSBDRlhfRm9udE1ncjo6R2V0Q2FjaGVkRmFjZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgdWludDhfdComIHBGb250RGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIHVpbnQ4X3QqJiBwRm9udERhdGEpCiB7CiAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5KGZhY2VfbmFtZSk7CiAgICAga2V5ICs9ICcsJzsKQEAgLTEzMSw3ICsxMzEsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogRlhGVF9GYWNlIENGWF9Gb250TWdyOjpBZGRDYWNoZWRGYWNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgaW50IGZhY2VfaW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgaW50IGZhY2VfaW5kZXgpCiB7CiAgICAgQ1RURm9udERlc2MqIHBGb250RGVzYyA9IG5ldyBDVFRGb250RGVzYzsKICAgICBwRm9udERlc2MtPm1fVHlwZSA9IDE7CkBAIC00MzMsMTAgKzQzMywxMCBAQAogewogICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+R2V0U3RhbmRhcmRGb250KGRhdGEsIHNpemUsIGlkKTsKIH0KLUZYX0JPT0wgQ0ZYX0ZvbnRNZ3I6OkdldFN0YW5kYXJkRm9udChjb25zdCB1aW50OF90KiYgcEZvbnREYXRhLCBGWF9EV09SRCYgc2l6ZSwgaW50IGluZGV4KQorYm9vbCBDRlhfRm9udE1ncjo6R2V0U3RhbmRhcmRGb250KGNvbnN0IHVpbnQ4X3QqJiBwRm9udERhdGEsIEZYX0RXT1JEJiBzaXplLCBpbnQgaW5kZXgpCiB7CiAgICAgaWYgKGluZGV4ID4gMTUgfHwgaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICB7CiAgICAgICAgIGlmIChpbmRleCA+PSAxNCkgewpAQCAtNDUyLDE0ICs0NTIsMTQgQEAKICAgICAgICAgICAgIHNpemUgPSBnX0ZveGl0Rm9udHNbaW5kZXhdLm1fZHdTaXplOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQ0ZYX0ZvbnRNYXBwZXI6OkNGWF9Gb250TWFwcGVyKCkKIHsKICAgICBGWFNZU19tZW1zZXQobV9Gb3hpdEZhY2VzLCAwLCBzaXplb2YgbV9Gb3hpdEZhY2VzKTsKICAgICBtX01NRmFjZXNbMF0gPSBtX01NRmFjZXNbMV0gPSBOVUxMOwogICAgIG1fcEZvbnRJbmZvID0gTlVMTDsKLSAgICBtX2JMaXN0TG9hZGVkID0gRkFMU0U7CisgICAgbV9iTGlzdExvYWRlZCA9IGZhbHNlOwogICAgIG1fcEZvbnRFbnVtZXJhdG9yID0gTlVMTDsKIH0KIENGWF9Gb250TWFwcGVyOjp+Q0ZYX0ZvbnRNYXBwZXIoKQpAQCAtNTgzLDEwICs1ODMsMTAgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBjb25zdCB1aW50OF90KiBwdHIgPSBuYW1lOwotICAgIEZYX0JPT0wgYkxvY2FsaXplZCA9IEZBTFNFOworICAgIGJvb2wgYkxvY2FsaXplZCA9IGZhbHNlOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5HZXRMZW5ndGgoKTsgaSArKykKICAgICAgICAgaWYgKHB0cltpXSA+IDB4ODApIHsKLSAgICAgICAgICAgIGJMb2NhbGl6ZWQgPSBUUlVFOworICAgICAgICAgICAgYkxvY2FsaXplZCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIGlmIChiTG9jYWxpemVkKSB7CkBAIC02MjAsNyArNjIwLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtX3BGb250SW5mby0+RW51bUZvbnRMaXN0KHRoaXMpOwotICAgIG1fYkxpc3RMb2FkZWQgPSBUUlVFOworICAgIG1fYkxpc3RMb2FkZWQgPSB0cnVlOwogfQogQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0ZvbnRNYXBwZXI6Ok1hdGNoSW5zdGFsbGVkRm9udHMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5vcm1fbmFtZSkKIHsKQEAgLTg0Nyw3ICs4NDcsNyBAQAogICAgIH0KICAgICByZXR1cm4gYnVmLkdldEJ5dGVTdHJpbmcoKTsKIH0KLWludDMyX3QgR2V0U3R5bGVUeXBlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZic1N0eWxlLCBGWF9CT09MIGJSZXZlcnQpCitpbnQzMl90IEdldFN0eWxlVHlwZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmYnNTdHlsZSwgYm9vbCBiUmV2ZXJ0KQogewogICAgIGludDMyX3QgaUxlbiA9IGJzU3R5bGUuR2V0TGVuZ3RoKCk7CiAgICAgaWYgKCFpTGVuKSB7CkBAIC04NzIsMTUgKzg3MiwxNSBAQAogICAgIH0KICAgICByZXR1cm4gLTE7CiB9Ci1GWF9CT09MIENoZWNrU3VwcG9ydFRoaXJkUGFydEZvbnQoQ0ZYX0J5dGVTdHJpbmcgbmFtZSwgaW50ICZQaXRjaEZhbWlseSkKK2Jvb2wgQ2hlY2tTdXBwb3J0VGhpcmRQYXJ0Rm9udChDRlhfQnl0ZVN0cmluZyBuYW1lLCBpbnQgJlBpdGNoRmFtaWx5KQogewogICAgIGlmIChuYW1lID09IEZYX0JTVFJDKCJNeXJpYWRQcm8iKSkgewogICAgICAgICBQaXRjaEZhbWlseSAmPSB+RlhGT05UX0ZGX1JPTUFOOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWEZUX0ZhY2UgQ0ZYX0ZvbnRNYXBwZXI6OkZpbmRTdWJzdEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIEZYX0JPT0wgYlRydWVUeXBlLCBGWF9EV09SRCBmbGFncywKK0ZYRlRfRmFjZSBDRlhfRm9udE1hcHBlcjo6RmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgYm9vbCBiVHJ1ZVR5cGUsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGludCBpdGFsaWNfYW5nbGUsIGludCBXaW5kb3dDUCwgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCkKIHsKICAgICBpZiAoIShmbGFncyAmIEZYRk9OVF9VU0VFWFRFUk5BVFRSKSkgewpAQCAtOTIzLDE0ICs5MjMsMTQgQEAKICAgICB9CiAgICAgaW50IGlCYXNlRm9udCA9IDA7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgZmFtaWx5LCBzdHlsZTsKLSAgICBGWF9CT09MCWJIYXNDb21tYSA9IEZBTFNFOwotICAgIEZYX0JPT0wgYkhhc0h5cGVuID0gRkFMU0U7CisgICAgYm9vbAliSGFzQ29tbWEgPSBmYWxzZTsKKyAgICBib29sIGJIYXNIeXBlbiA9IGZhbHNlOwogICAgIGludCBmaW5kID0gU3Vic3ROYW1lLkZpbmQoRlhfQlNUUkMoIiwiKSwgMCk7CiAgICAgaWYgKGZpbmQgPj0gMCkgewogICAgICAgICBmYW1pbHkgPSBTdWJzdE5hbWUuTGVmdChmaW5kKTsKICAgICAgICAgX1BERl9HZXRTdGFuZGFyZEZvbnROYW1lKGZhbWlseSk7CiAgICAgICAgIHN0eWxlID0gU3Vic3ROYW1lLk1pZChmaW5kICsgMSk7Ci0gICAgICAgIGJIYXNDb21tYSA9IFRSVUU7CisgICAgICAgIGJIYXNDb21tYSA9IHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZmFtaWx5ID0gU3Vic3ROYW1lOwogICAgIH0KQEAgLTkzOSw5ICs5MzksOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICBpbnQgUGl0Y2hGYW1pbHkgPSAwOwotICAgIEZYX0JPT0wgYkl0YWxpYyA9IEZBTFNFOworICAgIGJvb2wgYkl0YWxpYyA9IGZhbHNlOwogICAgIEZYX0RXT1JEIG5TdHlsZSA9IDA7Ci0gICAgRlhfQk9PTCBiU3R5bGVBdmFpbCA9IEZBTFNFOworICAgIGJvb2wgYlN0eWxlQXZhaWwgPSBmYWxzZTsKICAgICBpZiAoaUJhc2VGb250IDwgMTIpIHsKICAgICAgICAgZmFtaWx5ID0gZ19CYXNlMTRGb250TmFtZXNbaUJhc2VGb250XTsKICAgICAgICAgaWYgKChpQmFzZUZvbnQgJSA0KSA9PSAxIHx8IChpQmFzZUZvbnQgJSA0KSA9PSAyKSB7CkBAIC05NjIsMTIgKzk2MiwxMiBAQAogICAgICAgICAgICAgaWYgKGZpbmQgPj0gMCkgewogICAgICAgICAgICAgICAgIHN0eWxlID0gZmFtaWx5Lk1pZChmaW5kICsgMSk7CiAgICAgICAgICAgICAgICAgZmFtaWx5ID0gZmFtaWx5LkxlZnQoZmluZCk7Ci0gICAgICAgICAgICAgICAgYkhhc0h5cGVuID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiSGFzSHlwZW4gPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmICghYkhhc0h5cGVuKSB7CiAgICAgICAgICAgICBpbnQgbkxlbiA9IGZhbWlseS5HZXRMZW5ndGgoKTsKLSAgICAgICAgICAgIGludDMyX3QgblJldCA9IEdldFN0eWxlVHlwZShmYW1pbHksIFRSVUUpOworICAgICAgICAgICAgaW50MzJfdCBuUmV0ID0gR2V0U3R5bGVUeXBlKGZhbWlseSwgdHJ1ZSk7CiAgICAgICAgICAgICBpZiAoblJldCA+IC0xKSB7CiAgICAgICAgICAgICAgICAgZmFtaWx5ID0gZmFtaWx5LkxlZnQobkxlbiAtIGdfRm9udFN0eWxlc1tuUmV0XS5sZW4pOwogICAgICAgICAgICAgICAgIGlmIChuUmV0ID09IDApIHsKQEAgLTk5NSwxNyArOTk1LDE3IEBACiAgICAgICAgIGludCBuTGVuID0gc3R5bGUuR2V0TGVuZ3RoKCk7CiAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHBTdHlsZSA9IHN0eWxlOwogICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIEZYX0JPT0wgYkZpcnN0SXRlbSA9IFRSVUU7CisgICAgICAgIGJvb2wgYkZpcnN0SXRlbSA9IHRydWU7CiAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJ1ZjsKICAgICAgICAgd2hpbGUgKGkgPCBuTGVuKSB7CiAgICAgICAgICAgICBidWYgPSBQYXJzZVN0eWxlKHBTdHlsZSwgbkxlbiwgaSk7Ci0gICAgICAgICAgICBpbnQzMl90IG5SZXQgPSBHZXRTdHlsZVR5cGUoYnVmLCBGQUxTRSk7CisgICAgICAgICAgICBpbnQzMl90IG5SZXQgPSBHZXRTdHlsZVR5cGUoYnVmLCBmYWxzZSk7CiAgICAgICAgICAgICBpZiAoKGkgJiYgIWJTdHlsZUF2YWlsKSB8fCAoIWkgJiYgblJldCA8IDApKSB7CiAgICAgICAgICAgICAgICAgZmFtaWx5ID0gU3Vic3ROYW1lOwogICAgICAgICAgICAgICAgIGlCYXNlRm9udCA9IDEyOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfSBlbHNlIGlmIChuUmV0ID49IDApIHsKLSAgICAgICAgICAgICAgICBiU3R5bGVBdmFpbCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYlN0eWxlQXZhaWwgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG5SZXQgPT0gMCkgewogICAgICAgICAgICAgICAgIGlmIChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0JvbGQpIHsKQEAgLTEwMTMsNyArMTAxMyw3IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfQm9sZDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYkZpcnN0SXRlbSA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJGaXJzdEl0ZW0gPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChuUmV0ID09IDEpIHsKICAgICAgICAgICAgICAgICBpZiAoYkZpcnN0SXRlbSkgewpAQCAtMTAzMSw3ICsxMDMxLDcgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBuU3R5bGUgfD0gRlhfRk9OVF9TVFlMRV9Cb2xkOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBiRmlyc3RJdGVtID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYkZpcnN0SXRlbSA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaSArPSBidWYuR2V0TGVuZ3RoKCkgKyAxOwogICAgICAgICB9CkBAIC0xMDQyLDkgKzEwNDIsOSBAQAogICAgICAgICB3ZWlnaHQgPSBuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0JvbGRCb2xkID8gOTAwIDogKG5TdHlsZSAmIEZYX0ZPTlRfU1RZTEVfQm9sZCA/IEZYRk9OVF9GV19CT0xEIDogRlhGT05UX0ZXX05PUk1BTCk7CiAgICAgfQogICAgIGlmIChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0l0YWxpYykgewotICAgICAgICBiSXRhbGljID0gVFJVRTsKKyAgICAgICAgYkl0YWxpYyA9IHRydWU7CiAgICAgfQotICAgIEZYX0JPT0wgYkNKSyA9IEZBTFNFOworICAgIGJvb2wgYkNKSyA9IGZhbHNlOwogICAgIGludCBpRXhhY3QgPSAwOwogICAgIGludCBDaGFyc2V0ID0gRlhGT05UX0FOU0lfQ0hBUlNFVDsKICAgICBpZiAoV2luZG93Q1ApIHsKQEAgLTEwNTQsNyArMTA1NCw3IEBACiAgICAgfQogICAgIGlmIChDaGFyc2V0ID09IEZYRk9OVF9TSElGVEpJU19DSEFSU0VUIHx8IENoYXJzZXQgPT0gRlhGT05UX0dCMjMxMl9DSEFSU0VUIHx8CiAgICAgICAgICAgICBDaGFyc2V0ID09IEZYRk9OVF9IQU5HRVVMX0NIQVJTRVQgfHwgQ2hhcnNldCA9PSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVCkgewotICAgICAgICBiQ0pLID0gVFJVRTsKKyAgICAgICAgYkNKSyA9IHRydWU7CiAgICAgfQogICAgIGlmIChtX3BGb250SW5mbyA9PSBOVUxMKSB7CiAgICAgICAgIHBTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyB8PSBGWEZPTlRfU1VCU1RfU1RBTkRBUkQ7CkBAIC0xMDY5LDIxICsxMDY5LDIxIEBACiAgICAgICAgIGlmICghYkNKSykgewogICAgICAgICAgICAgaWYgKCFDaGVja1N1cHBvcnRUaGlyZFBhcnRGb250KGZhbWlseSwgUGl0Y2hGYW1pbHkpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGl0YWxpY19hbmdsZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJJdGFsaWMgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBiSXRhbGljID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiSXRhbGljID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJJdGFsaWMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgd2VpZ2h0ID0gb2xkX3dlaWdodDsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBTdWJzdEZvbnQtPm1fYlN1YnN0T2ZDSksgPSBUUlVFOworICAgICAgICAgICAgcFN1YnN0Rm9udC0+bV9iU3Vic3RPZkNKSyA9IHRydWU7CiAgICAgICAgICAgICBpZiAoblN0eWxlKSB7CiAgICAgICAgICAgICAgICAgcFN1YnN0Rm9udC0+bV9XZWlnaHRDSksgPSB3ZWlnaHQ7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHBTdWJzdEZvbnQtPm1fV2VpZ2h0Q0pLID0gRlhGT05UX0ZXX05PUk1BTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0l0YWxpYykgewotICAgICAgICAgICAgICAgIHBTdWJzdEZvbnQtPm1fYkl0bGljQ0pLID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwU3Vic3RGb250LT5tX2JJdGxpY0NKSyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMTEyMyw3ICsxMTIzLDcgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChmbGFncyAmIEZYRk9OVF9JVEFMSUMpIHsKLSAgICAgICAgICAgIGJJdGFsaWMgPSBUUlVFOworICAgICAgICAgICAgYkl0YWxpYyA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgaUV4YWN0ID0gIW1hdGNoLklzRW1wdHkoKTsKQEAgLTExMzQsOSArMTEzNCw5IEBACiAgICAgaWYgKGhGb250ID09IE5VTEwpIHsKICAgICAgICAgaWYgKGJDSkspIHsKICAgICAgICAgICAgIGlmIChpdGFsaWNfYW5nbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIGJJdGFsaWMgPSBUUlVFOworICAgICAgICAgICAgICAgIGJJdGFsaWMgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiSXRhbGljID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYkl0YWxpYyA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgd2VpZ2h0ID0gb2xkX3dlaWdodDsKICAgICAgICAgfQpAQCAtMTIyMSwxOCArMTIyMSwxOCBAQAogICAgIH0KICAgICBwU3Vic3RGb250LT5tX0ZhbWlseSA9IFN1YnN0TmFtZTsKICAgICBwU3Vic3RGb250LT5tX0NoYXJzZXQgPSBDaGFyc2V0OwotICAgIEZYX0JPT0wgYk5lZWRVcGRhdGVXZWlnaHQgPSBGQUxTRTsKKyAgICBib29sIGJOZWVkVXBkYXRlV2VpZ2h0ID0gZmFsc2U7CiAgICAgaWYgKEZYRlRfSXNfRmFjZV9Cb2xkKGZhY2UpKSB7CiAgICAgICAgIGlmICh3ZWlnaHQgPT0gRlhGT05UX0ZXX0JPTEQpIHsKLSAgICAgICAgICAgIGJOZWVkVXBkYXRlV2VpZ2h0ID0gRkFMU0U7CisgICAgICAgICAgICBiTmVlZFVwZGF0ZVdlaWdodCA9IGZhbHNlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYk5lZWRVcGRhdGVXZWlnaHQgPSBUUlVFOworICAgICAgICAgICAgYk5lZWRVcGRhdGVXZWlnaHQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKHdlaWdodCA9PSBGWEZPTlRfRldfTk9STUFMKSB7Ci0gICAgICAgICAgICBiTmVlZFVwZGF0ZVdlaWdodCA9IEZBTFNFOworICAgICAgICAgICAgYk5lZWRVcGRhdGVXZWlnaHQgPSBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJOZWVkVXBkYXRlV2VpZ2h0ID0gVFJVRTsKKyAgICAgICAgICAgIGJOZWVkVXBkYXRlV2VpZ2h0ID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoYk5lZWRVcGRhdGVXZWlnaHQpIHsKQEAgLTEyNjIsNyArMTI2Miw3IEBACiAgICAgbV9GaWxlU2l6ZSA9IDA7CiAgICAgbV9Gb250T2Zmc2V0ID0gMDsKICAgICBtX1dlaWdodCA9IDA7Ci0gICAgbV9iSXRhbGljID0gRkFMU0U7CisgICAgbV9iSXRhbGljID0gZmFsc2U7CiAgICAgbV9QaXRjaEZhbWlseSA9IDA7CiB9CiBDRm9udEZpbGVGYWNlSW5mbzo6fkNGb250RmlsZUZhY2VJbmZvKCkKQEAgLTEyNzIsNyArMTI3Miw3IEBACiAgICAgfQogICAgIG1fRmFjZSA9IE5VTEw7CiB9Ci1leHRlcm4gRlhfQk9PTCBfTG9hZEZpbGUoRlhGVF9MaWJyYXJ5IGxpYnJhcnksIEZYRlRfRmFjZSogRmFjZSwgSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhGVF9TdHJlYW0qIHN0cmVhbSk7CitleHRlcm4gYm9vbCBfTG9hZEZpbGUoRlhGVF9MaWJyYXJ5IGxpYnJhcnksIEZYRlRfRmFjZSogRmFjZSwgSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhGVF9TdHJlYW0qIHN0cmVhbSk7CiAjaWYgX0ZYX09TXyA9PSBfRlhfQU5EUk9JRF8KIElGWF9TeXN0ZW1Gb250SW5mbyogSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KCkKIHsKQEAgLTEzMDAsMTMgKzEzMDAsMTMgQEAKIHsKICAgICBkZWxldGUgdGhpczsKIH0KLUZYX0JPT0wgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpCitib29sIENGWF9Gb2xkZXJGb250SW5mbzo6RW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKQogewogICAgIG1fcE1hcHBlciA9IHBNYXBwZXI7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1BhdGhMaXN0LkdldFNpemUoKTsgaSArKykgewogICAgICAgICBTY2FuUGF0aChtX1BhdGhMaXN0W2ldKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENGWF9Gb2xkZXJGb250SW5mbzo6U2NhblBhdGgoQ0ZYX0J5dGVTdHJpbmcmIHBhdGgpCiB7CkBAIC0xMzE1LDcgKzEzMTUsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIGZpbGVuYW1lOwotICAgIEZYX0JPT0wgYkZvbGRlcjsKKyAgICBib29sIGJGb2xkZXI7CiAgICAgd2hpbGUgKEZYX0dldE5leHRGaWxlKGhhbmRsZSwgZmlsZW5hbWUsIGJGb2xkZXIpKSB7CiAgICAgICAgIGlmIChiRm9sZGVyKSB7CiAgICAgICAgICAgICBpZiAoZmlsZW5hbWUgPT0gIi4iIHx8IGZpbGVuYW1lID09ICIuLiIpIHsKQEAgLTE0NTEsNyArMTQ1MSw3IEBACiAgICAgfQogICAgIG1fRm9udExpc3QuU2V0QXQoZmFjZW5hbWUsIHBJbmZvKTsKIH0KLXZvaWQqIENGWF9Gb2xkZXJGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYW1pbHksIGludCYgaUV4YWN0KQordm9pZCogQ0ZYX0ZvbGRlckZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsIGJvb2wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwgaW50JiBpRXhhY3QpCiB7CiAgICAgcmV0dXJuIE5VTEw7CiB9CkBAIC0xNTA2LDE2ICsxNTA2LDE2IEBACiB2b2lkIENGWF9Gb2xkZXJGb250SW5mbzo6RGVsZXRlRm9udCh2b2lkKiBoRm9udCkKIHsKIH0KLUZYX0JPT0wgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpCitib29sIENGWF9Gb2xkZXJGb250SW5mbzo6R2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKQogewogICAgIGlmIChoRm9udCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRm9udEZhY2VJbmZvKiBwRm9udCA9IChDRm9udEZhY2VJbmZvKiloRm9udDsKICAgICBuYW1lID0gcEZvbnQtPm1fRmFjZU5hbWU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9Gb2xkZXJGb250SW5mbzo6R2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCkKK2Jvb2wgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2xpbnV4LmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfbGludXguY3BwCmluZGV4IDg2MWFmZDIuLjlmNDkzYTYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfbGludXguY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfbGludXguY3BwCkBAIC0zMCw5ICszMCw5IEBACiBjbGFzcyBDRlhfTGludXhGb250SW5mbyA6IHB1YmxpYyBDRlhfRm9sZGVyRm9udEluZm8KIHsKIHB1YmxpYzoKLSAgICB2b2lkKiBNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwgaW50JiBpRXhhY3QpIG92ZXJyaWRlOwotICAgIEZYX0JPT0wJCQkJUGFyc2VGb250Q2ZnKCk7Ci0gICAgdm9pZCoJCQkJRmluZEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFtaWx5LCBGWF9CT09MIGJNYXRjaE5hbWUpOworICAgIHZvaWQqIE1hcEZvbnQoaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFtaWx5LCBpbnQmIGlFeGFjdCkgb3ZlcnJpZGU7CisgICAgYm9vbAkJCQlQYXJzZUZvbnRDZmcoKTsKKyAgICB2b2lkKgkJCQlGaW5kRm9udChpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYW1pbHksIGJvb2wgYk1hdGNoTmFtZSk7CiB9OwogI2RlZmluZSBMSU5VWF9HUE5BTUVTSVpFCTYKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewpAQCAtNzcsNyArNzcsNyBAQAogICAgIH0KICAgICByZXR1cm4gMjsKIH0KLXZvaWQqIENGWF9MaW51eEZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGNzdHJfZmFjZSwgaW50JiBpRXhhY3QpCit2b2lkKiBDRlhfTGludXhGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBjc3RyX2ZhY2UsIGludCYgaUV4YWN0KQogewogICAgIENGWF9CeXRlU3RyaW5nIGZhY2UgPSBjc3RyX2ZhY2U7CiAgICAgaW50IGlCYXNlRm9udDsKQEAgLTkxLDcgKzkxLDcgQEAKICAgICAgICAgcmV0dXJuIEdldEZvbnQoZmFjZSk7CiAgICAgfQogICAgIHZvaWQqIHAgPSBOVUxMOwotICAgIEZYX0JPT0wgYkNKSyA9IFRSVUU7CisgICAgYm9vbCBiQ0pLID0gdHJ1ZTsKICAgICBzd2l0Y2ggKGNoYXJzZXQpIHsKICAgICAgICAgY2FzZSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDogewogICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXggPSBHZXRKYXBhbmVzZVByZWZlcmVuY2UoY3N0cl9mYWNlLCB3ZWlnaHQsIHBpdGNoX2ZhbWlseSk7CkBAIC0xMjksNyArMTI5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYkNKSyA9IEZBTFNFOworICAgICAgICAgICAgYkNKSyA9IGZhbHNlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIGlmIChjaGFyc2V0ID09IEZYRk9OVF9BTlNJX0NIQVJTRVQgJiYgKHBpdGNoX2ZhbWlseSAmIEZYRk9OVF9GRl9GSVhFRFBJVENIKSkgewpAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgfQogICAgIHJldHVybiAwOwogfQotc3RhdGljIGludDMyX3QgX0xpbnV4R2V0U2ltaWxhclZhbHVlKGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IHBpdGNoX2ZhbWlseSwgRlhfRFdPUkQgc3R5bGUpCitzdGF0aWMgaW50MzJfdCBfTGludXhHZXRTaW1pbGFyVmFsdWUoaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCBpbnQgcGl0Y2hfZmFtaWx5LCBGWF9EV09SRCBzdHlsZSkKIHsKICAgICBpbnQzMl90IGlTaW1pbGFyVmFsdWUgPSAwOwogICAgIGlmICgoc3R5bGUgJiBGWEZPTlRfQk9MRCkgPT0gKHdlaWdodCA+IDQwMCkpIHsKQEAgLTE3Nyw3ICsxNzcsNyBAQAogICAgIH0KICAgICByZXR1cm4gaVNpbWlsYXJWYWx1ZTsKIH0KLXZvaWQqIENGWF9MaW51eEZvbnRJbmZvOjpGaW5kRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYW1pbHksIEZYX0JPT0wgYk1hdGNoTmFtZSkKK3ZvaWQqIENGWF9MaW51eEZvbnRJbmZvOjpGaW5kRm9udChpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYW1pbHksIGJvb2wgYk1hdGNoTmFtZSkKIHsKICAgICBDRm9udEZhY2VJbmZvKiBwRmluZCA9IE5VTEw7CiAgICAgRlhfRFdPUkQgY2hhcnNldF9mbGFnID0gX0xpbnV4R2V0Q2hhcnNldChjaGFyc2V0KTsKQEAgLTIxNyw5ICsyMTcsOSBAQAogICAgIH0KICAgICByZXR1cm4gcEluZm87CiB9Ci1GWF9CT09MIENGWF9MaW51eEZvbnRJbmZvOjpQYXJzZUZvbnRDZmcoKQorYm9vbCBDRlhfTGludXhGb250SW5mbzo6UGFyc2VGb250Q2ZnKCkKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogdm9pZCBDRlhfR0VNb2R1bGU6OkluaXRQbGF0Zm9ybSgpCiB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX3BhdGguY3BwIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9wYXRoLmNwcAppbmRleCBiMTQxMGIzLi40YmM5YTg4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX3BhdGguY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfcGF0aC5jcHAKQEAgLTExMCw3ICsxMTAsNyBAQAogICAgICAgICBtX01hc2sgPSBuZXdfbWFzazsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBU1NFUlQoRkFMU0UpOworICAgIEFTU0VSVChmYWxzZSk7CiB9CiBDRlhfUGF0aERhdGE6OkNGWF9QYXRoRGF0YSgpCiB7CkBAIC0yNTcsOCArMjU3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoYWxmX3dpZHRoLCBGWF9GTE9BVCBtaXRlcl9saW1pdCkKIHsKICAgICBGWF9GTE9BVCBzdGFydF9rID0gMCwgc3RhcnRfYyA9IDAsIGVuZF9rID0gMCwgZW5kX2MgPSAwLCBzdGFydF9sZW4gPSAwLCBzdGFydF9kYyA9IDAsIGVuZF9sZW4gPSAwLCBlbmRfZGMgPSAwOwotICAgIEZYX0JPT0wgYlN0YXJ0VmVydCA9IEZYU1lTX2ZhYnMoc3RhcnRfeCAtIG1pZGRsZV94KSA8IDEuMGYgLyAyMDsKLSAgICBGWF9CT09MIGJFbmRWZXJ0ID0gRlhTWVNfZmFicyhtaWRkbGVfeCAtIGVuZF94KSA8IDEuMGYgLyAyMDsKKyAgICBib29sIGJTdGFydFZlcnQgPSBGWFNZU19mYWJzKHN0YXJ0X3ggLSBtaWRkbGVfeCkgPCAxLjBmIC8gMjA7CisgICAgYm9vbCBiRW5kVmVydCA9IEZYU1lTX2ZhYnMobWlkZGxlX3ggLSBlbmRfeCkgPCAxLjBmIC8gMjA7CiAgICAgaWYgKGJTdGFydFZlcnQgJiYgYkVuZFZlcnQpIHsKICAgICAgICAgaW50IHN0YXJ0X2RpciA9IG1pZGRsZV95ID4gc3RhcnRfeSA/IDEgOiAtMTsKICAgICAgICAgRlhfRkxPQVQgcG9pbnRfeSA9IG1pZGRsZV95ICsgaGFsZl93aWR0aCAqIHN0YXJ0X2RpcjsKQEAgLTM0MiwxMiArMzQyLDEyIEBACiAgICAgaW50IGlQb2ludCA9IDA7CiAgICAgRlhfRkxPQVQgaGFsZl93aWR0aCA9IGxpbmVfd2lkdGg7CiAgICAgaW50IGlTdGFydFBvaW50LCBpRW5kUG9pbnQsIGlNaWRkbGVQb2ludDsKLSAgICBGWF9CT09MIGJKb2luOworICAgIGJvb2wgYkpvaW47CiAgICAgd2hpbGUgKGlQb2ludCA8IG1fUG9pbnRDb3VudCkgewogICAgICAgICBpZiAobV9wUG9pbnRzW2lQb2ludF0ubV9GbGFnID09IEZYUFRfTU9WRVRPKSB7CiAgICAgICAgICAgICBpU3RhcnRQb2ludCA9IGlQb2ludCArIDE7CiAgICAgICAgICAgICBpRW5kUG9pbnQgPSBpUG9pbnQ7Ci0gICAgICAgICAgICBiSm9pbiA9IEZBTFNFOworICAgICAgICAgICAgYkpvaW4gPSBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtX3BQb2ludHNbaVBvaW50XS5tX0ZsYWcgPT0gRlhQVF9CRVpJRVJUTykgewogICAgICAgICAgICAgICAgIHJlY3QuVXBkYXRlUmVjdChtX3BQb2ludHNbaVBvaW50XS5tX1BvaW50WCwgbV9wUG9pbnRzW2lQb2ludF0ubV9Qb2ludFkpOwpAQCAtMzU3LDEyICszNTcsMTIgQEAKICAgICAgICAgICAgIGlmIChpUG9pbnQgPT0gbV9Qb2ludENvdW50IC0gMSB8fCBtX3BQb2ludHNbaVBvaW50ICsgMV0ubV9GbGFnID09IEZYUFRfTU9WRVRPKSB7CiAgICAgICAgICAgICAgICAgaVN0YXJ0UG9pbnQgPSBpUG9pbnQgLSAxOwogICAgICAgICAgICAgICAgIGlFbmRQb2ludCA9IGlQb2ludDsKLSAgICAgICAgICAgICAgICBiSm9pbiA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJKb2luID0gZmFsc2U7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlTdGFydFBvaW50ID0gaVBvaW50IC0gMTsKICAgICAgICAgICAgICAgICBpTWlkZGxlUG9pbnQgPSBpUG9pbnQ7CiAgICAgICAgICAgICAgICAgaUVuZFBvaW50ID0gaVBvaW50ICsgMTsKLSAgICAgICAgICAgICAgICBiSm9pbiA9IFRSVUU7CisgICAgICAgICAgICAgICAgYkpvaW4gPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X3ggPSBtX3BQb2ludHNbaVN0YXJ0UG9pbnRdLm1fUG9pbnRYOwpAQCAtMzg5LDEwICszODksMTAgQEAKICAgICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtKG1fcFBvaW50c1tpXS5tX1BvaW50WCwgbV9wUG9pbnRzW2ldLm1fUG9pbnRZKTsKICAgICB9CiB9Ci1GWF9CT09MIENGWF9QYXRoRGF0YTo6R2V0WmVyb0FyZWFQYXRoKENGWF9QYXRoRGF0YSYgTmV3UGF0aCwgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfQk9PTCZiVGhpbiwgRlhfQk9PTCBiQWRqdXN0KSBjb25zdAorYm9vbCBDRlhfUGF0aERhdGE6OkdldFplcm9BcmVhUGF0aChDRlhfUGF0aERhdGEmIE5ld1BhdGgsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIGJvb2wmYlRoaW4sIGJvb2wgYkFkanVzdCkgY29uc3QKIHsKICAgICBpZiAobV9Qb2ludENvdW50IDwgMykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fUG9pbnRDb3VudCA9PSAzICYmIChtX3BQb2ludHNbMF0ubV9GbGFnICYgRlhQVF9UWVBFKSA9PSBGWFBUX01PVkVUTyAmJgogICAgICAgICAgICAgKG1fcFBvaW50c1sxXS5tX0ZsYWcgJiBGWFBUX1RZUEUpID09IEZYUFRfTElORVRPICYmIChtX3BQb2ludHNbMl0ubV9GbGFnICYgRlhQVF9UWVBFKSA9PSBGWFBUX0xJTkVUTwpAQCAtNDIyLDE5ICs0MjIsMTkgQEAKICAgICAgICAgICAgIE5ld1BhdGguU2V0UG9pbnQoMSwgbV9wUG9pbnRzWzFdLm1fUG9pbnRYLCBtX3BQb2ludHNbMV0ubV9Qb2ludFksIEZYUFRfTElORVRPKTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9wUG9pbnRzWzBdLm1fUG9pbnRYICE9IG1fcFBvaW50c1sxXS5tX1BvaW50WCAmJiBtX3BQb2ludHNbMF0ubV9Qb2ludFkgIT0gbV9wUG9pbnRzWzFdLm1fUG9pbnRZKSB7Ci0gICAgICAgICAgICBiVGhpbiA9IFRSVUU7CisgICAgICAgICAgICBiVGhpbiA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoKChtX1BvaW50Q291bnQgPiAzKSAmJiAobV9Qb2ludENvdW50ICUgMikpKSB7CiAgICAgICAgIGludCBtaWQgPSBtX1BvaW50Q291bnQgLyAyOwotICAgICAgICBGWF9CT09MIGJaZXJvQXJlYSA9IEZBTFNFOworICAgICAgICBib29sIGJaZXJvQXJlYSA9IGZhbHNlOwogICAgICAgICBDRlhfUGF0aERhdGEgdF9wYXRoOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pZDsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoIShtX3BQb2ludHNbbWlkIC0gaSAtIDFdLm1fUG9pbnRYID09IG1fcFBvaW50c1ttaWQgKyBpICsgMV0ubV9Qb2ludFgKICAgICAgICAgICAgICAgICAgICAgJiYgbV9wUG9pbnRzW21pZCAtIGkgLSAxXS5tX1BvaW50WSA9PSBtX3BQb2ludHNbbWlkICsgaSArIDFdLm1fUG9pbnRZICYmCiAgICAgICAgICAgICAgICAgICAgICgobV9wUG9pbnRzW21pZCAtIGkgLSAxXS5tX0ZsYWcgJiBGWFBUX1RZUEUpICE9IEZYUFRfQkVaSUVSVE8gJiYgKG1fcFBvaW50c1ttaWQgKyBpICsgMV0ubV9GbGFnICYgRlhQVF9UWVBFKSAhPSBGWFBUX0JFWklFUlRPKSkpIHsKLSAgICAgICAgICAgICAgICBiWmVyb0FyZWEgPSBUUlVFOworICAgICAgICAgICAgICAgIGJaZXJvQXJlYSA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQgbmV3X2NvdW50ID0gdF9wYXRoLkdldFBvaW50Q291bnQoKTsKQEAgLTQ0NCw4ICs0NDQsOCBAQAogICAgICAgICB9CiAgICAgICAgIGlmICghYlplcm9BcmVhKSB7CiAgICAgICAgICAgICBOZXdQYXRoLkFwcGVuZCgmdF9wYXRoLCBOVUxMKTsKLSAgICAgICAgICAgIGJUaGluID0gVFJVRTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgYlRoaW4gPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgaW50IHN0cmF0UG9pbnQgPSAwOwpAQCAtNDg4LDcgKzQ4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIE5ld1BhdGguQWRkUG9pbnRDb3VudCgyKTsKICAgICAgICAgICAgICAgICAgICAgTmV3UGF0aC5TZXRQb2ludChuZXdfY291bnQsIG1fcFBvaW50c1tpIC0gMV0ubV9Qb2ludFgsIG1fcFBvaW50c1tpIC0gMV0ubV9Qb2ludFksIEZYUFRfTU9WRVRPKTsKICAgICAgICAgICAgICAgICAgICAgTmV3UGF0aC5TZXRQb2ludChuZXdfY291bnQgKyAxLCBtX3BQb2ludHNbaV0ubV9Qb2ludFgsIG1fcFBvaW50c1tpXS5tX1BvaW50WSwgRlhQVF9MSU5FVE8pOwotICAgICAgICAgICAgICAgICAgICBiVGhpbiA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJUaGluID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAocG9pbnRfdHlwZSA9PSBGWFBUX0JFWklFUlRPKSB7CkBAIC00OTcsNDIgKzQ5Nyw0MiBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtX1BvaW50Q291bnQgPiAzICYmIE5ld1BhdGguR2V0UG9pbnRDb3VudCgpKSB7Ci0gICAgICAgIGJUaGluID0gVFJVRTsKKyAgICAgICAgYlRoaW4gPSB0cnVlOwogICAgIH0KICAgICBpZiAoTmV3UGF0aC5HZXRQb2ludENvdW50KCkgPT0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9QYXRoRGF0YTo6SXNSZWN0KCkgY29uc3QKK2Jvb2wgQ0ZYX1BhdGhEYXRhOjpJc1JlY3QoKSBjb25zdAogewogICAgIGlmIChtX1BvaW50Q291bnQgIT0gNSAmJiBtX1BvaW50Q291bnQgIT0gNCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKChtX1BvaW50Q291bnQgPT0gNSAmJiAobV9wUG9pbnRzWzBdLm1fUG9pbnRYICE9IG1fcFBvaW50c1s0XS5tX1BvaW50WCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbNF0ubV9Qb2ludFkpKSB8fAogICAgICAgICAgICAgKG1fcFBvaW50c1swXS5tX1BvaW50WCA9PSBtX3BQb2ludHNbMl0ubV9Qb2ludFggJiYgbV9wUG9pbnRzWzBdLm1fUG9pbnRZID09IG1fcFBvaW50c1syXS5tX1BvaW50WSkgfHwKICAgICAgICAgICAgIChtX3BQb2ludHNbMV0ubV9Qb2ludFggPT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRYICYmIG1fcFBvaW50c1sxXS5tX1BvaW50WSA9PSBtX3BQb2ludHNbM10ubV9Qb2ludFkpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9wUG9pbnRzWzBdLm1fUG9pbnRYICE9IG1fcFBvaW50c1szXS5tX1BvaW50WCAmJiBtX3BQb2ludHNbMF0ubV9Qb2ludFkgIT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRZKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBmb3IgKGludCBpID0gMTsgaSA8IDQ7IGkgKyspIHsKICAgICAgICAgaWYgKChtX3BQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9UWVBFKSAhPSBGWFBUX0xJTkVUTykgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX3BQb2ludHNbaV0ubV9Qb2ludFggIT0gbV9wUG9pbnRzW2kgLSAxXS5tX1BvaW50WCAmJiBtX3BQb2ludHNbaV0ubV9Qb2ludFkgIT0gbV9wUG9pbnRzW2kgLSAxXS5tX1BvaW50WSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBtX1BvaW50Q291bnQgPT0gNSB8fCAobV9wUG9pbnRzWzNdLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpOwogfQotRlhfQk9PTCBDRlhfUGF0aERhdGE6OklzUmVjdChjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBDRlhfRmxvYXRSZWN0KiBwUmVjdCkgY29uc3QKK2Jvb2wgQ0ZYX1BhdGhEYXRhOjpJc1JlY3QoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgQ0ZYX0Zsb2F0UmVjdCogcFJlY3QpIGNvbnN0CiB7CiAgICAgaWYgKHBNYXRyaXggPT0gTlVMTCkgewogICAgICAgICBpZiAoIUlzUmVjdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBSZWN0KSB7CiAgICAgICAgICAgICBwUmVjdC0+bGVmdCA9IG1fcFBvaW50c1swXS5tX1BvaW50WDsKQEAgLTU0MSwyNyArNTQxLDI3IEBACiAgICAgICAgICAgICBwUmVjdC0+dG9wID0gbV9wUG9pbnRzWzJdLm1fUG9pbnRZOwogICAgICAgICAgICAgcFJlY3QtPk5vcm1hbGl6ZSgpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKG1fUG9pbnRDb3VudCAhPSA1ICYmIG1fUG9pbnRDb3VudCAhPSA0KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoKG1fUG9pbnRDb3VudCA9PSA1ICYmIChtX3BQb2ludHNbMF0ubV9Qb2ludFggIT0gbV9wUG9pbnRzWzRdLm1fUG9pbnRYIHx8IG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbNF0ubV9Qb2ludFkpKSB8fAogICAgICAgICAgICAgKG1fcFBvaW50c1sxXS5tX1BvaW50WCA9PSBtX3BQb2ludHNbM10ubV9Qb2ludFggJiYgbV9wUG9pbnRzWzFdLm1fUG9pbnRZID09IG1fcFBvaW50c1szXS5tX1BvaW50WSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX1BvaW50Q291bnQgPT0gNCAmJiBtX3BQb2ludHNbMF0ubV9Qb2ludFggIT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRYICYmIG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbM10ubV9Qb2ludFkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX0ZMT0FUIHhbNV0sIHlbNV07CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1BvaW50Q291bnQ7IGkgKyspIHsKICAgICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtKG1fcFBvaW50c1tpXS5tX1BvaW50WCwgbV9wUG9pbnRzW2ldLm1fUG9pbnRZLCB4W2ldLCB5W2ldKTsKICAgICAgICAgaWYgKGkpIHsKICAgICAgICAgICAgIGlmICgobV9wUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfVFlQRSkgIT0gRlhQVF9MSU5FVE8pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHhbaV0gIT0geFtpIC0gMV0gJiYgeVtpXSAhPSB5W2kgLSAxXSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC01NzIsNyArNTcyLDcgQEAKICAgICAgICAgcFJlY3QtPnRvcCA9IHlbMl07CiAgICAgICAgIHBSZWN0LT5Ob3JtYWxpemUoKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENGWF9QYXRoRGF0YTo6Q29weShjb25zdCBDRlhfUGF0aERhdGEgJnNyYykKIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfcHMuY3BwIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9wcy5jcHAKaW5kZXggYmE1YzVmYi4uZTM3NTI4OCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9wcy5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9wcy5jcHAKQEAgLTEwLDcgKzEwLDcgQEAKIHN0cnVjdCBQU0dseXBoIHsKICAgICBDRlhfRm9udCoJCW1fcEZvbnQ7CiAgICAgRlhfRFdPUkQJCW1fR2x5cGhJbmRleDsKLSAgICBGWF9CT09MCQkJbV9iR2x5cGhBZGp1c3Q7CisgICAgYm9vbAkJCW1fYkdseXBoQWRqdXN0OwogICAgIEZYX0ZMT0FUCQltX0FkanVzdE1hdHJpeFs0XTsKIH07CiBjbGFzcyBDUFNGb250CkBAIC0yMiw4ICsyMiw4IEBACiBDRlhfUFNSZW5kZXJlcjo6Q0ZYX1BTUmVuZGVyZXIoKQogewogICAgIG1fcE91dHB1dCA9IE5VTEw7Ci0gICAgbV9iQ29sb3JTZXQgPSBtX2JHcmFwaFN0YXRlU2V0ID0gRkFMU0U7Ci0gICAgbV9iSW5pdGVkID0gRkFMU0U7CisgICAgbV9iQ29sb3JTZXQgPSBtX2JHcmFwaFN0YXRlU2V0ID0gZmFsc2U7CisgICAgbV9iSW5pdGVkID0gZmFsc2U7CiB9CiBDRlhfUFNSZW5kZXJlcjo6fkNGWF9QU1JlbmRlcmVyKCkKIHsKQEAgLTMzLDcgKzMzLDcgQEAKICAgICB9CiB9CiAjZGVmaW5lIE9VVFBVVF9QUyhzdHIpIG1fcE91dHB1dC0+T3V0cHV0UFMoc3RyLCBzaXplb2Ygc3RyLTEpCi12b2lkIENGWF9QU1JlbmRlcmVyOjpJbml0KElGWF9QU091dHB1dCogcE91dHB1dCwgaW50IHBzbGV2ZWwsIGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhfQk9PTCBiQ215a091dHB1dCkKK3ZvaWQgQ0ZYX1BTUmVuZGVyZXI6OkluaXQoSUZYX1BTT3V0cHV0KiBwT3V0cHV0LCBpbnQgcHNsZXZlbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIGJDbXlrT3V0cHV0KQogewogICAgIG1fUFNMZXZlbCA9IHBzbGV2ZWw7CiAgICAgbV9wT3V0cHV0ID0gcE91dHB1dDsKQEAgLTQyLDEwICs0MiwxMCBAQAogICAgIG1fQ2xpcEJveC5ib3R0b20gPSBoZWlnaHQ7CiAgICAgbV9iQ215a091dHB1dCA9IGJDbXlrT3V0cHV0OwogfQotRlhfQk9PTCBDRlhfUFNSZW5kZXJlcjo6U3RhcnRSZW5kZXJpbmcoKQorYm9vbCBDRlhfUFNSZW5kZXJlcjo6U3RhcnRSZW5kZXJpbmcoKQogewogICAgIGlmIChtX2JJbml0ZWQpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBzdGF0aWMgY29uc3QgY2hhciBpbml0X3N0cltdID0gIlxuc2F2ZVxuL2ltL2luaXRtYXRyaXggbG9hZCBkZWZcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9uL25ld3BhdGggbG9hZCBkZWYvbS9tb3ZldG8gbG9hZCBkZWYvbC9saW5ldG8gbG9hZCBkZWYvYy9jdXJ2ZXRvIGxvYWQgZGVmL2gvY2xvc2VwYXRoIGxvYWQgZGVmXG4iCkBAIC01NywxNSArNTcsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9jbS9jb25jYXQgbG9hZCBkZWYvQ20vY3VycmVudG1hdHJpeCBsb2FkIGRlZi9teC9tYXRyaXggbG9hZCBkZWYvc20vc2V0bWF0cml4IGxvYWQgZGVmXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICBPVVRQVVRfUFMoaW5pdF9zdHIpOwotICAgIG1fYkluaXRlZCA9IFRSVUU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgbV9iSW5pdGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ0ZYX1BTUmVuZGVyZXI6OkVuZFJlbmRlcmluZygpCiB7CiAgICAgaWYgKG1fYkluaXRlZCkgewogICAgICAgICBPVVRQVVRfUFMoIlxucmVzdG9yZVxuIik7CiAgICAgfQotICAgIG1fYkluaXRlZCA9IEZBTFNFOworICAgIG1fYkluaXRlZCA9IGZhbHNlOwogfQogdm9pZCBDRlhfUFNSZW5kZXJlcjo6U2F2ZVN0YXRlKCkKIHsKQEAgLTczLDcgKzczLDcgQEAKICAgICBPVVRQVVRfUFMoInFcbiIpOwogICAgIG1fQ2xpcEJveFN0YWNrLkFkZChtX0NsaXBCb3gpOwogfQotdm9pZCBDRlhfUFNSZW5kZXJlcjo6UmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCkKK3ZvaWQgQ0ZYX1BTUmVuZGVyZXI6OlJlc3RvcmVTdGF0ZShib29sIGJLZWVwU2F2ZWQpCiB7CiAgICAgU3RhcnRSZW5kZXJpbmcoKTsKICAgICBpZiAoYktlZXBTYXZlZCkgewpAQCAtODEsNyArODEsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIE9VVFBVVF9QUygiUVxuIik7CiAgICAgfQotICAgIG1fYkNvbG9yU2V0ID0gbV9iR3JhcGhTdGF0ZVNldCA9IEZBTFNFOworICAgIG1fYkNvbG9yU2V0ID0gbV9iR3JhcGhTdGF0ZVNldCA9IGZhbHNlOwogICAgIG1fQ2xpcEJveCA9IG1fQ2xpcEJveFN0YWNrLkdldEF0KG1fQ2xpcEJveFN0YWNrLkdldFNpemUoKSAtIDEpOwogICAgIGlmICghYktlZXBTYXZlZCkgewogICAgICAgICBtX0NsaXBCb3hTdGFjay5SZW1vdmVBdChtX0NsaXBCb3hTdGFjay5HZXRTaXplKCkgLSAxKTsKQEAgLTE3NSw3ICsxNzUsNyBAQAogICAgICAgICBPVVRQVVRfUFMoInN0cm9rZXBhdGggVyBuXG4iKTsKICAgICB9CiB9Ci1GWF9CT09MIENGWF9QU1JlbmRlcmVyOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKK2Jvb2wgQ0ZYX1BTUmVuZGVyZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKQEAgLTE4OSwxMyArMTg5LDEzIEBACiAgICAgaW50IGZpbGxfYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShmaWxsX2NvbG9yKTsKICAgICBpbnQgc3Ryb2tlX2FscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShzdHJva2VfY29sb3IpOwogICAgIGlmIChmaWxsX2FscGhhICYmIGZpbGxfYWxwaGEgPCAyNTUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChzdHJva2VfYWxwaGEgJiYgc3Ryb2tlX2FscGhhIDwgMjU1KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoZmlsbF9hbHBoYSA9PSAwICYmIHN0cm9rZV9hbHBoYSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoc3Ryb2tlX2FscGhhKSB7CiAgICAgICAgIFNldEdyYXBoU3RhdGUocEdyYXBoU3RhdGUpOwpAQCAtMjMzLDcgKzIzMyw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgT1VUUFVUX1BTKCJcbiIpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDRlhfUFNSZW5kZXJlcjo6U2V0R3JhcGhTdGF0ZShjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlKQogewpAQCAtMjU5LDcgKzI1OSw3IEBACiAgICAgICAgIGJ1ZiA8PCBwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0IDw8IEZYX0JTVFJDKCIgTVxuIik7CiAgICAgfQogICAgIG1fQ3VyR3JhcGhTdGF0ZS5Db3B5KCpwR3JhcGhTdGF0ZSk7Ci0gICAgbV9iR3JhcGhTdGF0ZVNldCA9IFRSVUU7CisgICAgbV9iR3JhcGhTdGF0ZVNldCA9IHRydWU7CiAgICAgaWYgKGJ1Zi5HZXRTaXplKCkpIHsKICAgICAgICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0U2l6ZSgpKTsKICAgICB9CkBAIC0zMDUsNyArMzA1LDcgQEAKICAgICAgICAgfQogICAgIH0KIH0KLUZYX0JPT0wgQ0ZYX1BTUmVuZGVyZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGxlZnQsIGludCB0b3AsCitib29sIENGWF9QU1JlbmRlcmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsIGludCBsZWZ0LCBpbnQgdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIFN0YXJ0UmVuZGVyaW5nKCk7CkBAIC0zMTMsNyArMzEzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKGxlZnQpLCAoRlhfRkxPQVQpKHRvcCArIHBTb3VyY2UtPkdldEhlaWdodCgpKSk7CiAgICAgcmV0dXJuIERyYXdESUJpdHMocFNvdXJjZSwgY29sb3IsICZtYXRyaXgsIDAsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQotRlhfQk9PTCBDRlhfUFNSZW5kZXJlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorYm9vbCBDRlhfUFNSZW5kZXJlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CkBAIC0zMjIsMjAgKzMyMiwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkoZGVzdF9sZWZ0KSwgKEZYX0ZMT0FUKShkZXN0X3RvcCArIGRlc3RfaGVpZ2h0KSk7CiAgICAgcmV0dXJuIERyYXdESUJpdHMocFNvdXJjZSwgY29sb3IsICZtYXRyaXgsIGZsYWdzLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KLUZYX0JPT0wgQ0ZYX1BTUmVuZGVyZXI6OkRyYXdESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsCitib29sIENGWF9QU1JlbmRlcmVyOjpEcmF3RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgU3RhcnRSZW5kZXJpbmcoKTsKICAgICBpZiAoKHBNYXRyaXgtPmEgPT0gMCAmJiBwTWF0cml4LT5iID09IDApIHx8IChwTWF0cml4LT5jID09IDAgJiYgcE1hdHJpeC0+ZCA9PSAwKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChwU291cmNlLT5IYXNBbHBoYSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbnQgYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoY29sb3IpIDogRlhBUkdCX0EoY29sb3IpOwogICAgIGlmIChwU291cmNlLT5Jc0FscGhhTWFzaygpICYmIChhbHBoYSA8IDI1NSB8fCBwU291cmNlLT5HZXRCUFAoKSAhPSAxKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgT1VUUFVUX1BTKCJxXG4iKTsKICAgICBDRlhfQnl0ZVRleHRCdWYgYnVmOwpAQCAtMzU4LDcgKzM1OCw3IEBACiAgICAgICAgIEZheENvbXByZXNzRGF0YShzcmNfYnVmLCB3aWR0aCwgaGVpZ2h0LCBvdXRwdXRfYnVmLCBvdXRwdXRfc2l6ZSk7CiAgICAgICAgIGlmIChwU291cmNlLT5Jc0FscGhhTWFzaygpKSB7CiAgICAgICAgICAgICBTZXRDb2xvcihjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICBtX2JDb2xvclNldCA9IEZBTFNFOworICAgICAgICAgICAgbV9iQ29sb3JTZXQgPSBmYWxzZTsKICAgICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiIHRydWVbIik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoIiAxWyIpOwpAQCAtNDA2LDcgKzQwNiw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKHBDb252ZXJ0ZWQgPT0gTlVMTCkgewogICAgICAgICAgICAgT1VUUFVUX1BTKCJcblFcbiIpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGludCBCcHAgPSBwQ29udmVydGVkLT5HZXRCUFAoKSAvIDg7CiAgICAgICAgIHVpbnQ4X3QqIG91dHB1dF9idWYgPSBOVUxMOwpAQCAtNDYyLDE0ICs0NjIsMTQgQEAKICAgICAgICAgRlhfRnJlZShvdXRwdXRfYnVmKTsKICAgICB9CiAgICAgT1VUUFVUX1BTKCJcblFcbiIpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDRlhfUFNSZW5kZXJlcjo6U2V0Q29sb3IoRlhfRFdPUkQgY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmICghQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSB8fCAhQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCkpIHsKICAgICAgICAgcEljY1RyYW5zZm9ybSA9IE5VTEw7CiAgICAgfQotICAgIEZYX0JPT0wgYkNNWUsgPSBGQUxTRTsKKyAgICBib29sIGJDTVlLID0gZmFsc2U7CiAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKICAgICAgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwogICAgICAgICBjb2xvciA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPyBGWENNWUtfVE9ESUIoY29sb3IpIDogRlhBUkdCX1RPRElCKGNvbG9yKTsKQEAgLTQ5MCw3ICs0OTAsNyBAQAogICAgICAgICAgICAgICAgIDw8IEZYQVJHQl9CKGNvbG9yKSAvIDI1NS4wIDw8IEZYX0JTVFJDKCIgcmdcbiIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChiQ01ZSyA9PSBtX2JDbXlrT3V0cHV0KSB7Ci0gICAgICAgICAgICBtX2JDb2xvclNldCA9IFRSVUU7CisgICAgICAgICAgICBtX2JDb2xvclNldCA9IHRydWU7CiAgICAgICAgICAgICBtX0xhc3RDb2xvciA9IGNvbG9yOwogICAgICAgICB9CiAgICAgICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7CkBAIC01ODgsNyArNTg4LDcgQEAKICAgICAgICAgPDwgRlhfQlNUUkMoIi8iKSA8PCBwc19nbHlwaGluZGV4IDw8IEZYX0JTVFJDKCIgcHV0XG4iKTsKICAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOwogfQotRlhfQk9PTCBDRlhfUFNSZW5kZXJlcjo6RHJhd1RleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCitib29sIENGWF9QU1JlbmRlcmVyOjpEcmF3VGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCkBAIC01OTYsMTAgKzU5NiwxMCBAQAogICAgIFN0YXJ0UmVuZGVyaW5nKCk7CiAgICAgaW50IGFscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoY29sb3IpOwogICAgIGlmIChhbHBoYSA8IDI1NSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKChwT2JqZWN0MkRldmljZS0+YSA9PSAwICYmIHBPYmplY3QyRGV2aWNlLT5iID09IDApIHx8IChwT2JqZWN0MkRldmljZS0+YyA9PSAwICYmIHBPYmplY3QyRGV2aWNlLT5kID09IDApKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgU2V0Q29sb3IoY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CkBAIC02MjgsNyArNjI4LDcgQEAKICAgICB9CiAgICAgYnVmIDw8IEZYX0JTVFJDKCJRXG4iKTsKICAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDRlhfUFNSZW5kZXJlcjo6V3JpdGVQU0JpbmFyeShjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgbGVuKQogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV90ZXh0LmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfdGV4dC5jcHAKaW5kZXggNTlhNGNmYi4uYzVkYTY2YSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV90ZXh0LmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX3RleHQuY3BwCkBAIC00Niw3ICs0Niw3IEBACiBGWF9SRUNUIEZYR0VfR2V0R2x5cGhzQkJveChGWFRFWFRfR0xZUEhQT1MqIHBHbHlwaEFuZFBvcywgaW50IG5DaGFycywgaW50IGFudGlfYWxpYXMsIEZYX0ZMT0FUIHJldGluYVNjYWxlWCwgRlhfRkxPQVQgcmV0aW5hU2NhbGVZKQogewogICAgIEZYX1JFQ1QgcmVjdCgwLCAwLCAwLCAwKTsKLSAgICBGWF9CT09MIGJTdGFydGVkID0gRkFMU0U7CisgICAgYm9vbCBiU3RhcnRlZCA9IGZhbHNlOwogICAgIGZvciAoaW50IGlDaGFyID0gMDsgaUNoYXIgPCBuQ2hhcnM7IGlDaGFyICsrKSB7CiAgICAgICAgIEZYVEVYVF9HTFlQSFBPUyYgZ2x5cGggPSBwR2x5cGhBbmRQb3NbaUNoYXJdOwogICAgICAgICBjb25zdCBDRlhfR2x5cGhCaXRtYXAqIHBHbHlwaCA9IGdseXBoLm1fcEdseXBoOwpAQCAtNjYsNyArNjYsNyBAQAogICAgICAgICAgICAgcmVjdC5yaWdodCA9IGNoYXJfcmlnaHQ7CiAgICAgICAgICAgICByZWN0LnRvcCA9IGNoYXJfdG9wOwogICAgICAgICAgICAgcmVjdC5ib3R0b20gPSBjaGFyX2JvdHRvbTsKLSAgICAgICAgICAgIGJTdGFydGVkID0gVFJVRTsKKyAgICAgICAgICAgIGJTdGFydGVkID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChyZWN0LmxlZnQgPiBjaGFyX2xlZnQpIHsKICAgICAgICAgICAgICAgICByZWN0LmxlZnQgPSBjaGFyX2xlZnQ7CkBAIC04Nyw5ICs4Nyw5IEBACiBzdGF0aWMgdm9pZCBfQWRqdXN0R2x5cGhTcGFjZShGWFRFWFRfR0xZUEhQT1MqIHBHbHlwaEFuZFBvcywgaW50IG5DaGFycykKIHsKICAgICBBU1NFUlQobkNoYXJzID4gMSk7Ci0gICAgRlhfQk9PTCBiVmVydGljYWwgPSBGQUxTRTsKKyAgICBib29sIGJWZXJ0aWNhbCA9IGZhbHNlOwogICAgIGlmIChwR2x5cGhBbmRQb3NbbkNoYXJzIC0gMV0ubV9PcmlnaW5YID09IHBHbHlwaEFuZFBvc1swXS5tX09yaWdpblgpIHsKLSAgICAgICAgYlZlcnRpY2FsID0gVFJVRTsKKyAgICAgICAgYlZlcnRpY2FsID0gdHJ1ZTsKICAgICB9IGVsc2UgaWYgKHBHbHlwaEFuZFBvc1tuQ2hhcnMgLSAxXS5tX09yaWdpblkgIT0gcEdseXBoQW5kUG9zWzBdLm1fT3JpZ2luWSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTU1LDcgKzE1NSw3IEBACiAgICAgYmdyYVszXSA9IChhbHBoYV9mbGFnID4+IDI0KSA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKTsKICAgICBhcmdiID0gRlhBUkdCX01BS0UoYmdyYVszXSwgYmdyYVsyXSwgYmdyYVsxXSwgYmdyYVswXSk7CiB9Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdOb3JtYWxUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKK2Jvb2wgQ0ZYX1JlbmRlckRldmljZTo6RHJhd05vcm1hbFRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAogICAgICAgICBDRlhfRm9udCogcEZvbnQsIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJEZXZpY2UsCiAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsIEZYX0RXT1JEIHRleHRfZmxhZ3MsCkBAIC0xNzEsMTIgKzE3MSwxMiBAQAogI2VuZGlmCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgaWYgKG1fcERldmljZURyaXZlci0+RHJhd0RldmljZVRleHQobkNoYXJzLCBwQ2hhclBvcywgcEZvbnQsIHBDYWNoZSwgcFRleHQyRGV2aWNlLCBmb250X3NpemUsIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaW50IGFscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoZmlsbF9jb2xvcik7CiAgICAgICAgIGlmIChhbHBoYSA8IDI1NSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghKHRleHRfZmxhZ3MgJiBGWFRFWFRfTk9fTkFUSVZFVEVYVCkpIHsKICNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KQEAgLTE4Niw3ICsxODYsNyBAQAogI2VuZGlmCiAjZW5kaWYKICAgICAgICAgICAgICAgICBpZiAobV9wRGV2aWNlRHJpdmVyLT5EcmF3RGV2aWNlVGV4dChuQ2hhcnMsIHBDaGFyUG9zLCBwRm9udCwgcENhY2hlLCBwVGV4dDJEZXZpY2UsIGZvbnRfc2l6ZSwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICB9CiAgICAgQ0ZYX0FmZmluZU1hdHJpeCBjaGFyMmRldmljZSwgZGV2aWNlQ3RtLCB0ZXh0MkRldmljZTsKQEAgLTIwNCwyNCArMjA0LDI0IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaW50IGFudGlfYWxpYXMgPSBGWEZUX1JFTkRFUl9NT0RFX01PTk87Ci0gICAgRlhfQk9PTCBiTm9ybWFsID0gRkFMU0U7CisgICAgYm9vbCBiTm9ybWFsID0gZmFsc2U7CiAgICAgaWYgKCh0ZXh0X2ZsYWdzICYgRlhURVhUX05PU01PT1RIKSA9PSAwKSB7CiAgICAgICAgIGlmIChtX0RldmljZUNsYXNzID09IEZYRENfRElTUExBWSAmJiBtX2JwcCA+IDEpIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYkNsZWFyVHlwZTsKKyAgICAgICAgICAgIGJvb2wgYkNsZWFyVHlwZTsKICAgICAgICAgICAgIGlmIChwRm9udC0+R2V0RmFjZSgpID09IE5VTEwgJiYgIShwRm9udC0+R2V0U3Vic3RGb250KCktPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9DTEVBUlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgYkNsZWFyVHlwZSA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJDbGVhclR5cGUgPSBmYWxzZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgYkNsZWFyVHlwZSA9IHRleHRfZmxhZ3MgJiBGWFRFWFRfQ0xFQVJUWVBFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKChtX1JlbmRlckNhcHMgJiAoRlhSQ19BTFBIQV9PVVRQVVQgfCBGWFJDX0NNWUtfT1VUUFVUKSkpIHsKICAgICAgICAgICAgICAgICBhbnRpX2FsaWFzID0gRlhGVF9SRU5ERVJfTU9ERV9MQ0Q7Ci0gICAgICAgICAgICAgICAgYk5vcm1hbCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYk5vcm1hbCA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fYnBwIDwgMTYpIHsKICAgICAgICAgICAgICAgICBhbnRpX2FsaWFzID0gRlhGVF9SRU5ERVJfTU9ERV9OT1JNQUw7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChiQ2xlYXJUeXBlID09IEZBTFNFKSB7CisgICAgICAgICAgICAgICAgaWYgKGJDbGVhclR5cGUgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgYW50aV9hbGlhcyA9IEZYRlRfUkVOREVSX01PREVfTENEOwotICAgICAgICAgICAgICAgICAgICBiTm9ybWFsID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYk5vcm1hbCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYW50aV9hbGlhcyA9IEZYRlRfUkVOREVSX01PREVfTENEOwogICAgICAgICAgICAgICAgIH0KQEAgLTI3OCw3ICsyNzgsNyBAQAogICAgIGJtcF9yZWN0LkludGVyc2VjdChtX0NsaXBCb3gpOwogICAgIGlmIChibXBfcmVjdC5Jc0VtcHR5KCkpIHsKICAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGludCBwaXhlbF93aWR0aCA9IEZYU1lTX3JvdW5kKGJtcF9yZWN0LldpZHRoKCkgKiBzY2FsZV94KTsKICAgICBpbnQgcGl4ZWxfaGVpZ2h0ID0gRlhTWVNfcm91bmQoYm1wX3JlY3QuSGVpZ2h0KCkgKiBzY2FsZV95KTsKQEAgLTI4OCw3ICsyODgsNyBAQAogICAgICAgICBDRlhfRElCaXRtYXAgYml0bWFwOwogICAgICAgICBpZiAoIWJpdG1hcC5DcmVhdGUocGl4ZWxfd2lkdGgsIHBpeGVsX2hlaWdodCwgRlhESUJfMWJwcE1hc2spKSB7CiAgICAgICAgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgYml0bWFwLkNsZWFyKDApOwogICAgICAgICBmb3IgKGlDaGFyID0gMDsgaUNoYXIgPCBuQ2hhcnM7IGlDaGFyICsrKSB7CkBAIC0zMDgsMTkgKzMwOCwxOSBAQAogICAgIGlmIChtX2JwcCA9PSA4KSB7CiAgICAgICAgIGlmICghYml0bWFwLkNyZWF0ZShwaXhlbF93aWR0aCwgcGl4ZWxfaGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKICAgICAgICAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmICghQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCgmYml0bWFwLCBwaXhlbF93aWR0aCwgcGl4ZWxfaGVpZ2h0KSkgewogICAgICAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmICghYml0bWFwLkhhc0FscGhhKCkgJiYgIWJpdG1hcC5Jc0FscGhhTWFzaygpKSB7CiAgICAgICAgIGJpdG1hcC5DbGVhcigweEZGRkZGRkZGKTsKICAgICAgICAgaWYgKCFHZXRESUJpdHMoJmJpdG1hcCwgYm1wX3JlY3QubGVmdCwgYm1wX3JlY3QudG9wKSkgewogICAgICAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgYml0bWFwLkNsZWFyKDApOwpAQCAtMzUyLDEzICszNTIsMTMgQEAKICAgICAgICAgaW50IG5yb3dzID0gcEdseXBoLT5HZXRIZWlnaHQoKTsKICAgICAgICAgaWYgKGFudGlfYWxpYXMgPT0gRlhGVF9SRU5ERVJfTU9ERV9OT1JNQUwpIHsKICAgICAgICAgICAgIGlmICghYml0bWFwLkNvbXBvc2l0ZU1hc2sobGVmdCwgdG9wLCBuY29scywgbnJvd3MsIHBHbHlwaCwgZmlsbF9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBGQUxTRSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBmYWxzZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKICAgICAgICAgICAgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIEZYX0JPT0wgYkJHUlN0cmlwZSA9IHRleHRfZmxhZ3MgJiBGWFRFWFRfQkdSX1NUUklQRTsKKyAgICAgICAgYm9vbCBiQkdSU3RyaXBlID0gdGV4dF9mbGFncyAmIEZYVEVYVF9CR1JfU1RSSVBFOwogICAgICAgICBuY29scyAvPSAzOwogICAgICAgICBpbnQgeF9zdWJwaXhlbCA9IChpbnQpKGdseXBoLm1fZk9yaWdpblggKiAzKSAlIDM7CiAgICAgICAgIHVpbnQ4X3QqIHNyY19idWYgPSBwR2x5cGgtPkdldEJ1ZmZlcigpOwpAQCAtOTQ1LDkgKzk0NSw5IEBACiAgICAgICAgIFNldERJQml0cygmYml0bWFwLCBibXBfcmVjdC5sZWZ0LCBibXBfcmVjdC50b3ApOwogICAgIH0KICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdUZXh0UGF0aChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCitib29sIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdUZXh0UGF0aChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHQyVXNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKQEAgLTk3Myw3ICs5NzMsNyBAQAogICAgICAgICBtYXRyaXguQ29uY2F0KCpwVGV4dDJVc2VyKTsKICAgICAgICAgQ0ZYX1BhdGhEYXRhIFRyYW5zZm9ybWVkUGF0aCgqcFBhdGgpOwogICAgICAgICBUcmFuc2Zvcm1lZFBhdGguVHJhbnNmb3JtKCZtYXRyaXgpOwotICAgICAgICBGWF9CT09MIGJIYXNBbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPworICAgICAgICBib29sIGJIYXNBbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSB8fCBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGxfY29sb3IgfHwgc3Ryb2tlX2NvbG9yKTsKICAgICAgICAgaWYgKGJIYXNBbHBoYSkgewpAQCAtOTg5LDI0ICs5ODksMjQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbGxfbW9kZSB8PSBGWF9GSUxMX1RFWFRfTU9ERTsKICAgICAgICAgICAgIGlmICghRHJhd1BhdGgoJlRyYW5zZm9ybWVkUGF0aCwgcFVzZXIyRGV2aWNlLCBwR3JhcGhTdGF0ZSwgZmlsbF9jb2xvciwgc3Ryb2tlX2NvbG9yLCBmaWxsX21vZGUsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAocENsaXBwaW5nUGF0aCkgewogICAgICAgICAgICAgcENsaXBwaW5nUGF0aC0+QXBwZW5kKCZUcmFuc2Zvcm1lZFBhdGgsIHBVc2VyMkRldmljZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBDRlhfRm9udENhY2hlOjp+Q0ZYX0ZvbnRDYWNoZSgpCiB7Ci0gICAgRnJlZUNhY2hlKFRSVUUpOworICAgIEZyZWVDYWNoZSh0cnVlKTsKIH0KIAogQ0ZYX0ZhY2VDYWNoZSogQ0ZYX0ZvbnRDYWNoZTo6R2V0Q2FjaGVkRmFjZShDRlhfRm9udCogcEZvbnQpCiB7CiAgICAgRlhGVF9GYWNlIGludGVybmFsX2ZhY2UgPSBwRm9udC0+R2V0RmFjZSgpOwotICAgIGNvbnN0IEZYX0JPT0wgYkV4dGVybmFsID0gaW50ZXJuYWxfZmFjZSA9PSBudWxscHRyOworICAgIGNvbnN0IGJvb2wgYkV4dGVybmFsID0gaW50ZXJuYWxfZmFjZSA9PSBudWxscHRyOwogICAgIEZYRlRfRmFjZSBmYWNlID0gYkV4dGVybmFsID8KICAgICAgICAgKEZYRlRfRmFjZSlwRm9udC0+R2V0U3Vic3RGb250KCktPm1fRXh0SGFuZGxlIDogaW50ZXJuYWxfZmFjZTsKICAgICBDRlhfRlRDYWNoZU1hcCYgbWFwID0gYkV4dGVybmFsID8gbV9FeHRGYWNlTWFwIDogbV9GVEZhY2VNYXA7CkBAIC0xMDI4LDcgKzEwMjgsNyBAQAogdm9pZCBDRlhfRm9udENhY2hlOjpSZWxlYXNlQ2FjaGVkRmFjZShDRlhfRm9udCogcEZvbnQpCiB7CiAgICAgRlhGVF9GYWNlIGludGVybmFsX2ZhY2UgPSBwRm9udC0+R2V0RmFjZSgpOwotICAgIGNvbnN0IEZYX0JPT0wgYkV4dGVybmFsID0gaW50ZXJuYWxfZmFjZSA9PSBudWxscHRyOworICAgIGNvbnN0IGJvb2wgYkV4dGVybmFsID0gaW50ZXJuYWxfZmFjZSA9PSBudWxscHRyOwogICAgIEZYRlRfRmFjZSBmYWNlID0gYkV4dGVybmFsID8KICAgICAgICAgKEZYRlRfRmFjZSlwRm9udC0+R2V0U3Vic3RGb250KCktPm1fRXh0SGFuZGxlIDogaW50ZXJuYWxfZmFjZTsKICAgICBDRlhfRlRDYWNoZU1hcCYgbWFwID0gIGJFeHRlcm5hbCA/IG1fRXh0RmFjZU1hcCA6IG1fRlRGYWNlTWFwOwpAQCAtMTA0Myw3ICsxMDQzLDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQ0ZYX0ZvbnRDYWNoZTo6RnJlZUNhY2hlKEZYX0JPT0wgYlJlbGVhc2UpCit2b2lkIENGWF9Gb250Q2FjaGU6OkZyZWVDYWNoZShib29sIGJSZWxlYXNlKQogewogICAgIGZvciAoYXV0byBpdCA9IG1fRlRGYWNlTWFwLmJlZ2luKCk7IGl0ICE9IG1fRlRGYWNlTWFwLmVuZCgpOykgewogICAgICAgICBhdXRvIGN1cnJfaXQgPSBpdCsrOwpAQCAtMTA5NSw3ICsxMDk1LDcgQEAKIH0KICNlbmRpZgogQ0ZYX0dseXBoQml0bWFwKiBDRlhfRmFjZUNhY2hlOjpMb29rVXBHbHlwaEJpdG1hcChDRlhfRm9udCogcEZvbnQsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgIENGWF9CeXRlU3RyaW5nQyYgRmFjZUdseXBoc0tleSwgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIEZYX0JPT0wgYkZvbnRTdHlsZSwKKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDJiBGYWNlR2x5cGhzS2V5LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgYm9vbCBiRm9udFN0eWxlLAogICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGFudGlfYWxpYXMpCiB7CiAgICAgQ0ZYX1NpemVHbHlwaENhY2hlKiBwU2l6ZUNhY2hlID0gTlVMTDsKQEAgLTExMTQsNyArMTExNCw3IEBACiAgICAgcFNpemVDYWNoZS0+bV9HbHlwaE1hcC5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClnbHlwaF9pbmRleCwgcEdseXBoQml0bWFwKTsKICAgICByZXR1cm4gcEdseXBoQml0bWFwOwogfQotY29uc3QgQ0ZYX0dseXBoQml0bWFwKiBDRlhfRmFjZUNhY2hlOjpMb2FkR2x5cGhCaXRtYXAoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfQk9PTCBiRm9udFN0eWxlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorY29uc3QgQ0ZYX0dseXBoQml0bWFwKiBDRlhfRmFjZUNhY2hlOjpMb2FkR2x5cGhCaXRtYXAoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgYm9vbCBiRm9udFN0eWxlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAogICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGFudGlfYWxpYXMsIGludCYgdGV4dF9mbGFncykKIHsKICAgICBpZiAoZ2x5cGhfaW5kZXggPT0gKEZYX0RXT1JEKSAtIDEpIHsKQEAgLTEzMTEsNyArMTMxMSw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1DRlhfR2x5cGhCaXRtYXAqIENGWF9GYWNlQ2FjaGU6OlJlbmRlckdseXBoKENGWF9Gb250KiBwRm9udCwgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIEZYX0JPT0wgYkZvbnRTdHlsZSwKK0NGWF9HbHlwaEJpdG1hcCogQ0ZYX0ZhY2VDYWNoZTo6UmVuZGVyR2x5cGgoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgYm9vbCBiRm9udFN0eWxlLAogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBpbnQgZGVzdF93aWR0aCwgaW50IGFudGlfYWxpYXMpCiB7CiAgICAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7CkBAIC0xMzIyLDcgKzEzMjIsNyBAQAogICAgIGZ0X21hdHJpeC54eSA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+R2V0QygpIC8gNjQgKiA2NTUzNik7CiAgICAgZnRfbWF0cml4Lnl4ID0gKHNpZ25lZCBsb25nKShwTWF0cml4LT5HZXRCKCkgLyA2NCAqIDY1NTM2KTsKICAgICBmdF9tYXRyaXgueXkgPSAoc2lnbmVkIGxvbmcpKHBNYXRyaXgtPkdldEQoKSAvIDY0ICogNjU1MzYpOwotICAgIEZYX0JPT0wgYlVzZUNKS1N1YkZvbnQgPSBGQUxTRTsKKyAgICBib29sIGJVc2VDSktTdWJGb250ID0gZmFsc2U7CiAgICAgY29uc3QgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCA9IHBGb250LT5HZXRTdWJzdEZvbnQoKTsKICAgICBpZiAocFN1YnN0Rm9udCkgewogICAgICAgICBiVXNlQ0pLU3ViRm9udCA9IHBTdWJzdEZvbnQtPm1fYlN1YnN0T2ZDSksgJiYgYkZvbnRTdHlsZTsKQEAgLTE0MjIsMTggKzE0MjIsMTggQEAKICAgICB9CiAgICAgcmV0dXJuIHBHbHlwaEJpdG1hcDsKIH0KLUZYX0JPT0wgX091dHB1dEdseXBoKHZvaWQqIGRpYiwgaW50IHgsIGludCB5LCBDRlhfRm9udCogcEZvbnQsCitib29sIF9PdXRwdXRHbHlwaCh2b2lkKiBkaWIsIGludCB4LCBpbnQgeSwgQ0ZYX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgaW50IGdseXBoX2luZGV4LCBGWF9BUkdCIGFyZ2IpCiB7CiAgICAgQ0ZYX0RJQml0bWFwKiBwRGliID0gKENGWF9ESUJpdG1hcCopZGliOwogICAgIEZYRlRfRmFjZSBmYWNlID0gcEZvbnQtPkdldEZhY2UoKTsKICAgICBpbnQgZXJyb3IgPSBGWEZUX0xvYWRfR2x5cGgoZmFjZSwgZ2x5cGhfaW5kZXgsIEZYRlRfTE9BRF9OT19CSVRNQVApOwogICAgIGlmIChlcnJvcikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgZXJyb3IgPSBGWEZUX1JlbmRlcl9HbHlwaChmYWNlLCBGWEZUX1JFTkRFUl9NT0RFX05PUk1BTCk7CiAgICAgaWYgKGVycm9yKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbnQgYm13aWR0aCA9IEZYRlRfR2V0X0JpdG1hcF9XaWR0aChGWEZUX0dldF9HbHlwaF9CaXRtYXAoZmFjZSkpOwogICAgIGludCBibWhlaWdodCA9IEZYRlRfR2V0X0JpdG1hcF9Sb3dzKEZYRlRfR2V0X0dseXBoX0JpdG1hcChmYWNlKSk7CkBAIC0xNDUxLDEzICsxNDUxLDEzIEBACiAgICAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCBkZXN0X3BpdGNoKTsKICAgICB9CiAgICAgcERpYi0+Q29tcG9zaXRlTWFzayh4ICsgbGVmdCwgeSAtIHRvcCwgYm13aWR0aCwgYm1oZWlnaHQsICZtYXNrLCBhcmdiLCAwLCAwKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgT3V0cHV0VGV4dCh2b2lkKiBkaWIsIGludCB4LCBpbnQgeSwgQ0ZYX0ZvbnQqIHBGb250LCBkb3VibGUgZm9udF9zaXplLAorYm9vbCBPdXRwdXRUZXh0KHZvaWQqIGRpYiwgaW50IHgsIGludCB5LCBDRlhfRm9udCogcEZvbnQsIGRvdWJsZSBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHRfbWF0cml4LCB1bnNpZ25lZCBzaG9ydCBjb25zdCogdGV4dCwgdW5zaWduZWQgbG9uZyBhcmdiKQogewogICAgIGlmICghcEZvbnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYRlRfRmFjZSBmYWNlID0gcEZvbnQtPkdldEZhY2UoKTsKICAgICBGWEZUX1NlbGVjdF9DaGFybWFwKHBGb250LT5tX0ZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSk7CkBAIC0xNDkwLDkgKzE0OTAsOSBAQAogICAgIH0KICAgICBpZiAocFRleHRfbWF0cml4KQogICAgICAgICBSZXNldFRyYW5zZm9ybShmYWNlKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgT3V0cHV0R2x5cGgodm9pZCogZGliLCBpbnQgeCwgaW50IHksIENGWF9Gb250KiBwRm9udCwgZG91YmxlIGZvbnRfc2l6ZSwKK2Jvb2wgT3V0cHV0R2x5cGgodm9pZCogZGliLCBpbnQgeCwgaW50IHksIENGWF9Gb250KiBwRm9udCwgZG91YmxlIGZvbnRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgdW5zaWduZWQgbG9uZyBnbHlwaF9pbmRleCwgdW5zaWduZWQgbG9uZyBhcmdiKQogewogICAgIEZYRlRfTWF0cml4ICBmdF9tYXRyaXg7CkBAIC0xNTA3LDcgKzE1MDcsNyBAQAogICAgICAgICBmdF9tYXRyaXgueXkgPSAoc2lnbmVkIGxvbmcpKGZvbnRfc2l6ZSAvIDY0ICogNjU1MzYpOwogICAgIH0KICAgICBTY29wZWRGb250VHJhbnNmb3JtIHNjb3BlZF90cmFuc2Zvcm0ocEZvbnQtPm1fRmFjZSwgJmZ0X21hdHJpeCk7Ci0gICAgRlhfQk9PTCByZXQgPSBfT3V0cHV0R2x5cGgoZGliLCB4LCB5LCBwRm9udCwKKyAgICBib29sIHJldCA9IF9PdXRwdXRHbHlwaChkaWIsIHgsIHksIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LCBhcmdiKTsKICAgICByZXR1cm4gcmV0OwogfQpAQCAtMTUzMyw3ICsxNTMzLDcgQEAKICAgICByZXR1cm4gcEdseXBoUGF0aDsKIH0KIHR5cGVkZWYgc3RydWN0IHsKLSAgICBGWF9CT09MCQkJbV9iQ291bnQ7CisgICAgYm9vbAkJCW1fYkNvdW50OwogICAgIGludAkJCQltX1BvaW50Q291bnQ7CiAgICAgRlhfUEFUSFBPSU5UKgltX3BQb2ludHM7CiAgICAgaW50CQkJCW1fQ3VyWDsKQEAgLTE2ODQsNyArMTY4NCw3IEBACiAgICAgZnVuY3Muc2hpZnQgPSAwOwogICAgIGZ1bmNzLmRlbHRhID0gMDsKICAgICBPVVRMSU5FX1BBUkFNUyBwYXJhbXM7Ci0gICAgcGFyYW1zLm1fYkNvdW50ID0gVFJVRTsKKyAgICBwYXJhbXMubV9iQ291bnQgPSB0cnVlOwogICAgIHBhcmFtcy5tX1BvaW50Q291bnQgPSAwOwogICAgIEZYRlRfT3V0bGluZV9EZWNvbXBvc2UoRlhGVF9HZXRfR2x5cGhfT3V0bGluZShtX0ZhY2UpLCAmZnVuY3MsICZwYXJhbXMpOwogICAgIGlmIChwYXJhbXMubV9Qb2ludENvdW50ID09IDApIHsKQEAgLTE2OTIsNyArMTY5Miw3IEBACiAgICAgfQogICAgIENGWF9QYXRoRGF0YSogcFBhdGggPSBuZXcgQ0ZYX1BhdGhEYXRhOwogICAgIHBQYXRoLT5TZXRQb2ludENvdW50KHBhcmFtcy5tX1BvaW50Q291bnQpOwotICAgIHBhcmFtcy5tX2JDb3VudCA9IEZBTFNFOworICAgIHBhcmFtcy5tX2JDb3VudCA9IGZhbHNlOwogICAgIHBhcmFtcy5tX1BvaW50Q291bnQgPSAwOwogICAgIHBhcmFtcy5tX3BQb2ludHMgPSBwUGF0aC0+R2V0UG9pbnRzKCk7CiAgICAgcGFyYW1zLm1fQ3VyWCA9IHBhcmFtcy5tX0N1clkgPSAwOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9nZS90ZXh0X2ludC5oIGIvY29yZS9zcmMvZnhnZS9nZS90ZXh0X2ludC5oCmluZGV4IDEyZmFjNmEuLjJlODYxYmEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZ2UvdGV4dF9pbnQuaAorKysgYi9jb3JlL3NyYy9meGdlL2dlL3RleHRfaW50LmgKQEAgLTMyLDEyICszMiwxMiBAQAogICAgICAgICBtX1JlZkNvdW50ID0gMDsKICAgICB9CiAgICAgfkNUVEZvbnREZXNjKCk7Ci0gICAgRlhfQk9PTAkJCVJlbGVhc2VGYWNlKEZYRlRfRmFjZSBmYWNlKTsKKyAgICBib29sCQkJUmVsZWFzZUZhY2UoRlhGVF9GYWNlIGZhY2UpOwogICAgIGludAkJCQltX1R5cGU7CiAgICAgdW5pb24gewogICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgRlhfQk9PTAkJbV9iSXRhbGljOwotICAgICAgICAgICAgRlhfQk9PTAkJbV9iQm9sZDsKKyAgICAgICAgICAgIGJvb2wJCW1fYkl0YWxpYzsKKyAgICAgICAgICAgIGJvb2wJCW1fYkJvbGQ7CiAgICAgICAgICAgICBGWEZUX0ZhY2UJbV9wRmFjZTsKICAgICAgICAgfSBtX1NpbmdsZUZhY2U7CiAgICAgICAgIHN0cnVjdCB7CkBAIC02Myw5ICs2Myw5IEBACiAgICAgewogICAgICAgICByZXR1cm4gVW5pY29kZTsKICAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNVbmljb2RlQ29tcGF0aWJsZSgpIGNvbnN0CisgICAgdmlydHVhbCBib29sCQkJSXNVbmljb2RlQ29tcGF0aWJsZSgpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogfTsKICNkZWZpbmUgQ0hBUlNFVF9GTEFHX0FOU0kJCTEKQEAgLTk3LDcgKzk3LDcgQEAKICAgICBGWF9EV09SRAkJCW1fRmlsZVNpemU7CiAgICAgRlhfRFdPUkQJCQltX0ZvbnRPZmZzZXQ7CiAgICAgaW50CQkJCQltX1dlaWdodDsKLSAgICBGWF9CT09MCQkJCW1fYkl0YWxpYzsKKyAgICBib29sCQkJCW1fYkl0YWxpYzsKICAgICBpbnQJCQkJCW1fUGl0Y2hGYW1pbHk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcJCW1fRm9udFRhYmxlczsKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9ibGl0dGVyX25ldy5jcHAgYi9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9ibGl0dGVyX25ldy5jcHAKaW5kZXggMzQzN2ViNC4uMTNiYjc1MyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfYmxpdHRlcl9uZXcuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2JsaXR0ZXJfbmV3LmNwcApAQCAtMTI5OCw3ICsxMjk4LDcgQEAKIAogCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEZYX0JPT0wgQ0ZYX1NraWFSZW5kZXJlcjo6SW5pdChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBGWF9EV09SRCBjb2xvciwgRlhfQk9PTCBiRnVsbENvdmVyLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCisgICAgYm9vbCBDRlhfU2tpYVJlbmRlcmVyOjpJbml0KENGWF9ESUJpdG1hcCogcERldmljZSwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX0RXT1JEIGNvbG9yLCBib29sIGJGdWxsQ292ZXIsIGJvb2wgYlJnYkJ5dGVPcmRlciwKICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIC8vVGhlIGFscGhhIGZsYWcgbXVzdCBiZSBmaWxsX2ZsYWcgaWYgZXhpc3QuCiAgICAgewogICAgICAgICBtX3BEZXZpY2UgPSBwRGV2aWNlOwpAQCAtMTMzMSw4ICsxMzMxLDggQEAKIAogICAgICAgICBtX2JGdWxsQ292ZXIgPSBiRnVsbENvdmVyOwogCi0gICAgICAgIEZYX0JPT0wgYk9iamVjdENNWUsgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpOwotICAgICAgICBGWF9CT09MIGJEZXZpY2VDTVlLID0gcERldmljZS0+SXNDbXlrSW1hZ2UoKTsKKyAgICAgICAgYm9vbCBiT2JqZWN0Q01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7CisgICAgICAgIGJvb2wgYkRldmljZUNNWUsgPSBwRGV2aWNlLT5Jc0NteWtJbWFnZSgpOwogCiAgICAgICAgIG1fQWxwaGEgPSBiT2JqZWN0Q01ZSyA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoY29sb3IpOwogCkBAIC0xMzc3LDcgKzEzNzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZtX0NvbG9yLCAoY29uc3QgdWludDhfdCopJm1fQ29sb3IsIDEpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIE9iamVjdCBSR0IKICAgICAgICAgICAgICAgICAgICAgaWYgKCFwSWNjVHJhbnNmb3JtKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBjb2xvciA9IEZYQVJHQl9UT0RJQihjb2xvcik7CiAgICAgICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICh1aW50OF90KikmbV9Db2xvciwgKGNvbnN0IHVpbnQ4X3QqKSZjb2xvciwgMSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTM4NSw3ICsxMzg1LDcgQEAKICAgICAgICAgICAgICAgICBtX0dyZWVuID0gKCh1aW50OF90KikmbV9Db2xvcilbMV07CiAgICAgICAgICAgICAgICAgbV9CbHVlICA9ICgodWludDhfdCopJm1fQ29sb3IpWzJdOwogICAgICAgICAgICAgICAgIG1fR3JheSAgPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVszXTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7CiAgICAgICAgICAgICAgICAgY29sb3IgPSBiT2JqZWN0Q01ZSyA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwpAQCAtMTQ5Niw4ICsxNDk2LDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpZiAoY29tcG9zaXRlX3NwYW4gPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xNTk1LDcgKzE1OTUsNyBAQAogICAgICAgICBibGl0Vih4LCB5LCBoZWlnaHQsIHJpZ2h0QWxwaGEpOwogICAgIH0KIAotICAgIEZYX0JPT0wgQ0ZYX1NraWFBOFJlbmRlcmVyOjpJbml0KENGWF9ESUJpdG1hcCogcERldmljZSwgaW50IExlZnQsIGludCBUb3ApCisgICAgYm9vbCBDRlhfU2tpYUE4UmVuZGVyZXI6OkluaXQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBpbnQgTGVmdCwgaW50IFRvcCkKICAgICB7CiAgICAgICAgIG1fcERldmljZSA9IHBEZXZpY2U7CiAgICAgICAgIG1fTGVmdCA9IExlZnQ7CkBAIC0xNjA0LDYgKzE2MDQsNiBAQAogICAgICAgICAgICAgbV9kc3RXaWR0aCA9IG1fTGVmdCArIHBEZXZpY2UtPkdldFdpZHRoKCk7CiAgICAgICAgICAgICBtX2RzdEhlaWdodCA9IG1fVG9wICsgcERldmljZS0+R2V0SGVpZ2h0KCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfYmxpdHRlcl9uZXcuaCBiL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2JsaXR0ZXJfbmV3LmgKaW5kZXggZTYwYzYzOS4uY2Q0MTFkYSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfYmxpdHRlcl9uZXcuaAorKysgYi9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9ibGl0dGVyX25ldy5oCkBAIC0xNSw5ICsxNSw5IEBACiAJCQkJbV9CbHVlLAkJLy8gWWVsbG93CiAJCQkJbV9HcmF5OwkJLy8gQmxhY2sKIAlGWF9EV09SRAltX0NvbG9yOwkvLyBGWF9BUkdCIG9yIEZYX0NNWUsKLQlGWF9CT09MCQltX2JGdWxsQ292ZXI7CisJYm9vbAkJbV9iRnVsbENvdmVyOwogCWludAkJCW1fUHJvY2Vzc0ZpbHRlcjsKLQlGWF9CT09MICAgICBtX2JSZ2JCeXRlT3JkZXI7CisJYm9vbCAgICAgbV9iUmdiQnl0ZU9yZGVyOwogCiAJRlhfUkVDVAkJCQltX0NsaXBCb3g7CiAJQ0ZYX0RJQml0bWFwKgkJbV9wRGV2aWNlOwpAQCAtMjA1LDcgKzIwNSw3IEBACiAKIAogCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlGWF9CT09MIEluaXQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwgRlhfRFdPUkQgY29sb3IsIEZYX0JPT0wgYkZ1bGxDb3ZlciwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAorCWJvb2wgSW5pdChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBGWF9EV09SRCBjb2xvciwgYm9vbCBiRnVsbENvdmVyLCBib29sIGJSZ2JCeXRlT3JkZXIsCiAJCWludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOyAvL1RoZSBhbHBoYSBmbGFnIG11c3QgYmUgZmlsbF9mbGFnIGlmIGV4aXN0LgogfTsKIGNsYXNzIENGWF9Ta2lhQThSZW5kZXJlciA6IHB1YmxpYyBTa0JsaXR0ZXIKQEAgLTIxOCw3ICsyMTgsNyBAQAogCXZpcnR1YWwgdm9pZCBibGl0UmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAJdmlydHVhbAl2b2lkIGJsaXRBbnRpUmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgU2tBbHBoYSBsZWZ0QWxwaGEsIFNrQWxwaGEgcmlnaHRBbHBoYSk7CiAJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUZYX0JPT0wgSW5pdChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIGludCBMZWZ0LCBpbnQgVG9wKTsKKwlib29sIEluaXQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBpbnQgTGVmdCwgaW50IFRvcCk7CiAJQ0ZYX0RJQml0bWFwKiBtX3BEZXZpY2U7CiAJaW50IG1fTGVmdDsKIAlpbnQgbV9Ub3A7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9kZXZpY2UuY3BwIGIvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlLmNwcAppbmRleCA0MWNlMDc3Li43MjQ3OGIxIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9kZXZpY2UuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5jcHAKQEAgLTQ2LDI0ICs0NiwyNCBAQAogcHVibGljOgogCXN0YXRpYyB2b2lkIERyYXdQYXRoKGNvbnN0IFNrUGF0aCYgc3JjUGF0aCwgU2tCbGl0dGVyKiBibGl0dGVyLCAgY29uc3QgU2tSYXN0ZXJDbGlwJiByZWN0LCBjb25zdCBTa1BhaW50JiBvcmlnUGFpbnQpOwogfTsKLUZYX0JPT0wgRnhTa0RyYXdUcmVhdEFzSGFpcmxpbmUoY29uc3QgU2tQYWludCYgcGFpbnQsIFNrU2NhbGFyKiBjb3ZlcmFnZSkgeworYm9vbCBGeFNrRHJhd1RyZWF0QXNIYWlybGluZShjb25zdCBTa1BhaW50JiBwYWludCwgU2tTY2FsYXIqIGNvdmVyYWdlKSB7CiAJaWYgKFNrUGFpbnQ6OmtTdHJva2VfU3R5bGUgIT0gcGFpbnQuZ2V0U3R5bGUoKSkKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJRlhTWVNfYXNzZXJ0KGNvdmVyYWdlKTsKIAlTa1NjYWxhciBzdHJva2VXaWR0aCA9IHBhaW50LmdldFN0cm9rZVdpZHRoKCk7CiAJaWYgKDAgPT0gc3Ryb2tlV2lkdGgpIHsKIAkJKmNvdmVyYWdlID0gU0tfU2NhbGFyMTsKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCX0KIAkvLyBpZiB3ZSBnZXQgaGVyZSwgd2UgbmVlZCB0byB0cnkgdG8gZmFrZSBhIHRoaWNrLXN0cm9rZSB3aXRoIGEgbW9kdWxhdGVkCiAJLy8gaGFpcmxpbmUKIAlpZiAoIXBhaW50LmlzQW50aUFsaWFzKCkpCi0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogCWlmIChzdHJva2VXaWR0aCA8PSBTS19TY2FsYXIxKSB7CiAJCSpjb3ZlcmFnZSA9IHN0cm9rZVdpZHRoOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgU3VwZXJCbGl0dGVyX3NraWE6OkRyYXdQYXRoKGNvbnN0IFNrUGF0aCYgc3JjUGF0aCwgU2tCbGl0dGVyKiBibGl0dGVyLCBjb25zdCBTa1Jhc3RlckNsaXAmIHJlY3QsIGNvbnN0IFNrUGFpbnQmIG9yaWdQYWludCkKQEAgLTE2Nyw3ICsxNjcsNyBAQAogc3RhdGljIHZvaWQgU2tSYXN0ZXJpemVTdHJva2UoU2tQYWludCYgc3BhaW50LCBTa1BhdGgqIGRzdFBhdGhEYXRhLCBTa1BhdGgmIHBhdGhfZGF0YSwKIAkJCQkJIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogCQkJCQkgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwgRlhfRklYRkxPQVQgc2NhbGUgPSBGSVg4X09ORSwKLQkJCQkJIEZYX0JPT0wgYlN0cm9rZUFkanVzdCA9IEZBTFNFLCBGWF9CT09MIGJUZXh0TW9kZSA9IEZBTFNFKQorCQkJCQkgYm9vbCBiU3Ryb2tlQWRqdXN0ID0gZmFsc2UsIGJvb2wgYlRleHRNb2RlID0gZmFsc2UpCiB7CiAJU2tQYWludDo6Q2FwIGNhcDsKIAlzd2l0Y2ggKHBHcmFwaFN0YXRlLT5tX0xpbmVDYXApIHsKQEAgLTIwMyw3ICsyMDMsNyBAQAogCQlzdHJva2VyLnNldEpvaW4oam9pbik7CiAJCXN0cm9rZXIuc2V0TWl0ZXJMaW1pdChwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0KTsKIAkJc3Ryb2tlci5zZXRXaWR0aCh3aWR0aCk7Ci0JCXN0cm9rZXIuc2V0RG9GaWxsKEZBTFNFKTsKKwkJc3Ryb2tlci5zZXREb0ZpbGwoZmFsc2UpOwogCQlzdHJva2VyLnN0cm9rZVBhdGgocGF0aF9kYXRhLCBkc3RQYXRoRGF0YSk7CiAJCVNrTWF0cml4IHNtYXRyaXg7CiAJCXNtYXRyaXguc2V0QWxsKHBPYmplY3QyRGV2aWNlLT5hLCBwT2JqZWN0MkRldmljZS0+YywgcE9iamVjdDJEZXZpY2UtPmUsIHBPYmplY3QyRGV2aWNlLT5iLCBwT2JqZWN0MkRldmljZS0+ZCwgcE9iamVjdDJEZXZpY2UtPmYsIDAsIDAsIDEpOwpAQCAtMjM1LDcgKzIzNSw3IEBACiAJfQogfQogCi1DRlhfU2tpYURldmljZURyaXZlcjo6Q0ZYX1NraWFEZXZpY2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0KQorQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkNGWF9Ta2lhRGV2aWNlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzLCBib29sIGJSZ2JCeXRlT3JkZXIsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgYm9vbCBiR3JvdXBLbm9ja291dCkKIHsKIAltX3BBZ2dEcml2ZXIgPSBuZXcgQ0ZYX0FnZ0RldmljZURyaXZlcihwQml0bWFwLCBkaXRoZXJfYml0cywgYlJnYkJ5dGVPcmRlciwgcE9yaURldmljZSwgYkdyb3VwS25vY2tvdXQpOwogfQpAQCAtMjQzLDcgKzI0Myw3IEBACiB7CiAgICAgZGVsZXRlIG1fcEFnZ0RyaXZlcjsKIH0KLUZYX0JPT0wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkRyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAorYm9vbCBDRlhfU2tpYURldmljZURyaXZlcjo6RHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCiAJCUNGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIEZYX0ZJWEZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCiAJCWludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewpAQCAtMjU5LDcgKzI1OSw3IEBACiAJbV9wQWdnRHJpdmVyLT5TYXZlU3RhdGUoKTsKIH0KIAotdm9pZCBDRlhfU2tpYURldmljZURyaXZlcjo6UmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCkKK3ZvaWQgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlJlc3RvcmVTdGF0ZShib29sIGJLZWVwU2F2ZWQpCiB7CiAJbV9wQWdnRHJpdmVyLT5SZXN0b3JlU3RhdGUoYktlZXBTYXZlZCk7CiB9CkBAIC0yOTQsNyArMjk0LDcgQEAKIAltX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24tPkludGVyc2VjdE1hc2tGKGNsaXBfYm94LmZMZWZ0LCBjbGlwX2JveC5mVG9wLCBtYXNrKTsKIAogfQotRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwJLy8gcGF0aCBpbmZvCitib29sIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAkvLyBwYXRoIGluZm8KIAkJCQkJCWNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAkvLyBvcHRpb25hbCB0cmFuc2Zvcm1hdGlvbgogCQkJCQkJaW50IGZpbGxfbW9kZQkvLyBmaWxsIG1vZGUsIFdJTkRJTkcgb3IgQUxURVJOQVRFCiAJCQkJCQkpCkBAIC0zMDgsNyArMzA4LDcgQEAKIAkJCXJlY3RmLkludGVyc2VjdChDRlhfRmxvYXRSZWN0KDAsIDAsIChGWF9GSVhGTE9BVClHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpLCAoRlhfRklYRkxPQVQpR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKIAkJCUZYX1JFQ1QgcmVjdCA9IHJlY3RmLkdldE91dHRlclJlY3QoKTsKIAkJCW1fcEFnZ0RyaXZlci0+bV9wQ2xpcFJnbi0+SW50ZXJzZWN0UmVjdChyZWN0KTsKLQkJCXJldHVybiBUUlVFOworCQkJcmV0dXJuIHRydWU7CiAJCX0KIAl9CiAJQ1NraWFfUGF0aERhdGEgcGF0aF9kYXRhOwpAQCAtMzE4LDE1ICszMTgsMTUgQEAKIAogCVNrUGFpbnQgc3BhaW50OwogCXNwYWludC5zZXRDb2xvcigweGZmZmZmZmZmKTsKLQlzcGFpbnQuc2V0QW50aUFsaWFzKFRSVUUpOworCXNwYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CiAJc3BhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtGaWxsX1N0eWxlKTsKIAogCVNldENsaXBNYXNrKHBhdGhfZGF0YS5tX1BhdGhEYXRhLCAmc3BhaW50KTsKIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCS8vIHBhdGggaW5mbworYm9vbCBDRlhfU2tpYURldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAkvLyBwYXRoIGluZm8KIAkJCQkJCWNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAkvLyBvcHRpb25hbCB0cmFuc2Zvcm1hdGlvbgogCQkJCQkJY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQkvLyBncmFwaGljIHN0YXRlLCBmb3IgcGVuIGF0dHJpYnV0ZXMKIAkJCQkJKQpAQCAtMzQyLDM2ICszNDIsMzYgQEAKIAlTa1BhaW50IHNwYWludDsKIAlzcGFpbnQuc2V0Q29sb3IoMHhmZmZmZmZmZik7CiAJc3BhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtTdHJva2VfU3R5bGUpOwotCXNwYWludC5zZXRBbnRpQWxpYXMoVFJVRSk7CisJc3BhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKIAogCVNrUGF0aCBkc3RfcGF0aDsKLQlTa1Jhc3Rlcml6ZVN0cm9rZShzcGFpbnQsICZkc3RfcGF0aCwgcGF0aF9kYXRhLm1fUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBwR3JhcGhTdGF0ZSwgMSwgRkFMU0UsIDApOworCVNrUmFzdGVyaXplU3Ryb2tlKHNwYWludCwgJmRzdF9wYXRoLCBwYXRoX2RhdGEubV9QYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIHBHcmFwaFN0YXRlLCAxLCBmYWxzZSwgMCk7CiAJc3BhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtGaWxsX1N0eWxlKTsKIAlTZXRDbGlwTWFzayhkc3RfcGF0aCwgJnNwYWludCk7CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlJlbmRlclJhc3Rlcml6ZXIocmFzdGVyaXplcl9zY2FubGluZV9hYSYgcmFzdGVyaXplciwgRlhfRFdPUkQgY29sb3IsIEZYX0JPT0wgYkZ1bGxDb3ZlciwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCwKK2Jvb2wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlJlbmRlclJhc3Rlcml6ZXIocmFzdGVyaXplcl9zY2FubGluZV9hYSYgcmFzdGVyaXplciwgRlhfRFdPUkQgY29sb3IsIGJvb2wgYkZ1bGxDb3ZlciwgYm9vbCBiR3JvdXBLbm9ja291dCwKIAkJCQkJCQkJCQkJICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKIAlyZXR1cm4gbV9wQWdnRHJpdmVyLT5SZW5kZXJSYXN0ZXJpemVyKHJhc3Rlcml6ZXIsIGNvbG9yLCBiRnVsbENvdmVyLCBiR3JvdXBLbm9ja291dCxhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KLUZYX0JPT0wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlJlbmRlclJhc3Rlcml6ZXJTa2lhKFNrUGF0aCYgc2tQYXRoLCBjb25zdCBTa1BhaW50JiBvcmlnUGFpbnQsIFNrSVJlY3QmIHJlY3QsIEZYX0RXT1JEIGNvbG9yLCBGWF9CT09MIGJGdWxsQ292ZXIsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQsCi0JCQkJCQkJaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIEZYX0JPT0wgYkZpbGwpCitib29sCUNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpSZW5kZXJSYXN0ZXJpemVyU2tpYShTa1BhdGgmIHNrUGF0aCwgY29uc3QgU2tQYWludCYgb3JpZ1BhaW50LCBTa0lSZWN0JiByZWN0LCBGWF9EV09SRCBjb2xvciwgYm9vbCBiRnVsbENvdmVyLCBib29sIGJHcm91cEtub2Nrb3V0LAorCQkJCQkJCWludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBib29sIGJGaWxsKQogewogCUNGWF9ESUJpdG1hcCogcHQgPSBiR3JvdXBLbm9ja291dD9tX3BBZ2dEcml2ZXItPkdldEJhY2tEcm9wKCk6TlVMTDsKIAlDRlhfU2tpYVJlbmRlcmVyIHJlbmRlcjsKIAlpZiAoIXJlbmRlci5Jbml0KG1fcEFnZ0RyaXZlci0+bV9wQml0bWFwLCBwdCwgbV9wQWdnRHJpdmVyLT5tX3BDbGlwUmduLCBjb2xvciwgYkZ1bGxDb3ZlciwgbV9wQWdnRHJpdmVyLT5tX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAogCVNrUmFzdGVyQ2xpcCByYXN0ZXJDbGlwKHJlY3QpOwogCVN1cGVyQmxpdHRlcl9za2lhOjpEcmF3UGF0aChza1BhdGgsIChTa0JsaXR0ZXIqKSZyZW5kZXIsICByYXN0ZXJDbGlwLCBvcmlnUGFpbnQpOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiAKIH0KIAotRlhfQk9PTAlDRlhfU2tpYURldmljZURyaXZlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCS8vIHBhdGggaW5mbworYm9vbAlDRlhfU2tpYURldmljZURyaXZlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCS8vIHBhdGggaW5mbwogCQkJCQkJY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCS8vIG9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uCiAJCQkJCQljb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAkvLyBncmFwaGljIHN0YXRlLCBmb3IgcGVuIGF0dHJpYnV0ZXMKIAkJCQkJCUZYX0RXT1JEIGZpbGxfY29sb3IsCQkJLy8gZmlsbCBjb2xvcgpAQCAtMzgxLDcgKzM4MSw3IEBACiAJCQkJCQl2b2lkKiBwSWNjVHJhbnNmb3JtCiAJCQkJCQkpCiB7Ci0JaWYgKEdldEJ1ZmZlcigpID09IE5VTEwpIHJldHVybiBUUlVFOworCWlmIChHZXRCdWZmZXIoKSA9PSBOVUxMKSByZXR1cm4gdHJ1ZTsKIAlGT1hJVF9ERUJVRzEoIkNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpEcmF3UGF0aDogZW50ZXJpbmciKTsKIAlTa0lSZWN0IHJlY3Q7CiAJcmVjdC5zZXQoMCwgMCwgR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSwgR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpOwpAQCAtMzk2LDExICszOTYsMTEgQEAKIAkJcGF0aF9kYXRhLm1fUGF0aERhdGEuc2V0RmlsbFR5cGUoKGZpbGxfbW9kZSYzKSA9PSBGWEZJTExfV0lORElORz8gU2tQYXRoOjprV2luZGluZ19GaWxsVHlwZTpTa1BhdGg6OmtFdmVuT2RkX0ZpbGxUeXBlKTsKIAogCQlTa1BhaW50IHNwYWludDsKLQkJc3BhaW50LnNldEFudGlBbGlhcyhUUlVFKTsKKwkJc3BhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKIAkJc3BhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtGaWxsX1N0eWxlKTsKIAkJc3BhaW50LnNldENvbG9yKGZpbGxfY29sb3IpOwotCQlpZiAoIVJlbmRlclJhc3Rlcml6ZXJTa2lhKHBhdGhfZGF0YS5tX1BhdGhEYXRhLCBzcGFpbnQsIHJlY3QsIGZpbGxfY29sb3IsIGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIsIEZBTFNFLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkKLQkJCXJldHVybiBGQUxTRTsKKwkJaWYgKCFSZW5kZXJSYXN0ZXJpemVyU2tpYShwYXRoX2RhdGEubV9QYXRoRGF0YSwgc3BhaW50LCByZWN0LCBmaWxsX2NvbG9yLCBmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSLCBmYWxzZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpCisJCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJaW50IHN0cm9rZV9hbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPyBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpIDogRlhBUkdCX0Eoc3Ryb2tlX2NvbG9yKTsKQEAgLTQyNyw0OCArNDI3LDQ4IEBACiAJCVNrUGFpbnQgc3BhaW50OwogCQlzcGFpbnQuc2V0Q29sb3Ioc3Ryb2tlX2NvbG9yKTsKIAkJc3BhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtTdHJva2VfU3R5bGUpOwotCQlzcGFpbnQuc2V0QW50aUFsaWFzKFRSVUUpOworCQlzcGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOwogCQlTa1BhdGggZHN0X3BhdGg7Ci0JCVNrUmFzdGVyaXplU3Ryb2tlKHNwYWludCwgJmRzdF9wYXRoLCBwYXRoX2RhdGEubV9QYXRoRGF0YSwgJm1hdHJpeDIsIHBHcmFwaFN0YXRlLCBtYXRyaXgxLmEsIEZBTFNFLCAwKTsKKwkJU2tSYXN0ZXJpemVTdHJva2Uoc3BhaW50LCAmZHN0X3BhdGgsIHBhdGhfZGF0YS5tX1BhdGhEYXRhLCAmbWF0cml4MiwgcEdyYXBoU3RhdGUsIG1hdHJpeDEuYSwgZmFsc2UsIDApOwogCQlzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a0ZpbGxfU3R5bGUpOwogCQlpbnQgZmlsbF9mbGFnID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKTw8OCB8IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZyk7CiAKLQkJaWYgKCFSZW5kZXJSYXN0ZXJpemVyU2tpYShkc3RfcGF0aCwgc3BhaW50LCByZWN0LCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIsIEZBTFNFLCBmaWxsX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIEZBTFNFKSkKLQkJCXJldHVybiBGQUxTRTsKKwkJaWYgKCFSZW5kZXJSYXN0ZXJpemVyU2tpYShkc3RfcGF0aCwgc3BhaW50LCByZWN0LCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIsIGZhbHNlLCBmaWxsX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGZhbHNlKSkKKwkJCXJldHVybiBmYWxzZTsKIAogCX0KIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLAorYm9vbCBDRlhfU2tpYURldmljZURyaXZlcjo6U2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwKIAkJCQkJCWludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogCXJldHVybiBtX3BBZ2dEcml2ZXItPlNldFBpeGVsKHgsIHksIGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KIAotRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6RmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQorYm9vbCBDRlhfU2tpYURldmljZURyaXZlcjo6RmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogCXJldHVybiBtX3BBZ2dEcml2ZXItPkZpbGxSZWN0KHBSZWN0LCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KIAotRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkKK2Jvb2wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpCiB7CiAJcmV0dXJuIG1fcEFnZ0RyaXZlci0+R2V0Q2xpcEJveChwUmVjdCk7CiB9CiAKLUZYX0JPT0wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBGWF9CT09MIGJERWRnZSkKK2Jvb2wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBib29sIGJERWRnZSkKIHsKIAlyZXR1cm4gbV9wQWdnRHJpdmVyLT5HZXRESUJpdHMocEJpdG1hcCwgbGVmdCwgdG9wLCBwSWNjVHJhbnNmb3JtLCBiREVkZ2UpOwogfQogCi1GWF9CT09MCUNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgYXJnYiwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKK2Jvb2wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBhcmdiLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAogCQkJCQkJCQkJICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAJcmV0dXJuIG1fcEFnZ0RyaXZlci0+U2V0RElCaXRzKHBCaXRtYXAsIGFyZ2IsIHBTcmNSZWN0LCBsZWZ0LCB0b3AsIGJsZW5kX3R5cGUsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQogCi1GWF9CT09MCUNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGFyZ2IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKK2Jvb2wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgYXJnYiwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogCQkJCQkJCWludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCiAJCQkJCQkJaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CkBAIC00NzcsNyArNDc3LDcgQEAKIAkJCQkJCQlhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KIAotRlhfQk9PTAlDRlhfU2tpYURldmljZURyaXZlcjo6U3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgYXJnYiwKK2Jvb2wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGFyZ2IsCiAJCQkJCQljb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCByZW5kZXJfZmxhZ3MsIHZvaWQqJiBoYW5kbGUsCiAJCQkJCQlpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKQEAgLTQ4NSw3ICs0ODUsNyBAQAogCQkJCQkJcE1hdHJpeCwgcmVuZGVyX2ZsYWdzLCBoYW5kbGUsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQogCi1GWF9CT09MCUNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpDb250aW51ZURJQml0cyh2b2lkKiBwSGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkKK2Jvb2wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkNvbnRpbnVlRElCaXRzKHZvaWQqIHBIYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKQogewogCXJldHVybiBtX3BBZ2dEcml2ZXItPkNvbnRpbnVlRElCaXRzKHBIYW5kbGUsIHBQYXVzZSk7CiB9CkBAIC00OTcsMzEgKzQ5NywzMSBAQAogCiBDRlhfU2tpYURldmljZTo6Q0ZYX1NraWFEZXZpY2UoKQogewotCW1fYk93bmVkQml0bWFwID0gRkFMU0U7CisJbV9iT3duZWRCaXRtYXAgPSBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRlhfU2tpYURldmljZTo6QXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCkKK2Jvb2wgQ0ZYX1NraWFEZXZpY2U6OkF0dGFjaChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkaXRoZXJfYml0cywgYm9vbCBiUmdiQnl0ZU9yZGVyLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIGJvb2wgYkdyb3VwS25vY2tvdXQpCiB7CiAJaWYgKHBCaXRtYXAgPT0gTlVMTCkKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJU2V0Qml0bWFwKHBCaXRtYXApOwogCUNGWF9Ta2lhRGV2aWNlRHJpdmVyKiBwRHJpdmVyID0gbmV3IENGWF9Ta2lhRGV2aWNlRHJpdmVyKHBCaXRtYXAsIGRpdGhlcl9iaXRzLCBiUmdiQnl0ZU9yZGVyLCBwT3JpRGV2aWNlLCBiR3JvdXBLbm9ja291dCk7CiAJU2V0RGV2aWNlRHJpdmVyKHBEcml2ZXIpOwotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENGWF9Ta2lhRGV2aWNlOjpDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCBpbnQgZGl0aGVyX2JpdHMsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSkKK2Jvb2wgQ0ZYX1NraWFEZXZpY2U6OkNyZWF0ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQsIGludCBkaXRoZXJfYml0cywgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlKQogewotCW1fYk93bmVkQml0bWFwID0gVFJVRTsKKwltX2JPd25lZEJpdG1hcCA9IHRydWU7CiAJQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKIAlpZiAoIXBCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpKSB7CiAJCWRlbGV0ZSBwQml0bWFwOwotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAl9CiAJU2V0Qml0bWFwKHBCaXRtYXApOwotCUNGWF9Ta2lhRGV2aWNlRHJpdmVyKiBwRHJpdmVyID0gIG5ldyBDRlhfU2tpYURldmljZURyaXZlcihwQml0bWFwLCBkaXRoZXJfYml0cywgRkFMU0UsIHBPcmlEZXZpY2UsIEZBTFNFKTsKKwlDRlhfU2tpYURldmljZURyaXZlciogcERyaXZlciA9ICBuZXcgQ0ZYX1NraWFEZXZpY2VEcml2ZXIocEJpdG1hcCwgZGl0aGVyX2JpdHMsIGZhbHNlLCBwT3JpRGV2aWNlLCBmYWxzZSk7CiAJU2V0RGV2aWNlRHJpdmVyKHBEcml2ZXIpOwotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogQ0ZYX1NraWFEZXZpY2U6On5DRlhfU2tpYURldmljZSgpCiB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9kZXZpY2UuaCBiL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5oCmluZGV4IGFiNTFlNTEuLjcyNzg2NzEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5oCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5oCkBAIC05LDcgKzksNyBAQAogY2xhc3MgQ0ZYX1NraWFEZXZpY2VEcml2ZXIgOiBwdWJsaWMgSUZYX1JlbmRlckRldmljZURyaXZlcgogewogcHVibGljOgotCUNGWF9Ta2lhRGV2aWNlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCk7CisJQ0ZYX1NraWFEZXZpY2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMsIGJvb2wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBib29sIGJHcm91cEtub2Nrb3V0KTsKIAl2aXJ0dWFsIH5DRlhfU2tpYURldmljZURyaXZlcigpOwogCiAJLyoqIE9wdGlvbnMgKi8KQEAgLTE3LDIyICsxNywyMiBAQAogCiAJLyoqIFNhdmUgYW5kIHJlc3RvcmUgYWxsIGdyYXBoaWMgc3RhdGVzICovCiAJdmlydHVhbCB2b2lkCQlTYXZlU3RhdGUoKTsKLQl2aXJ0dWFsIHZvaWQJCVJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQpOworCXZpcnR1YWwgdm9pZAkJUmVzdG9yZVN0YXRlKGJvb2wgYktlZXBTYXZlZCk7CiAKIAkvKiogU2V0IGNsaXBwaW5nIHBhdGggdXNpbmcgZmlsbGVkIHJlZ2lvbiAqLwotCXZpcnR1YWwgRlhfQk9PTAkJU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwJLy8gcGF0aCBpbmZvCisJdmlydHVhbCBib29sCQlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAkvLyBwYXRoIGluZm8KIAkJCQkJCQljb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwJLy8gb3B0aW9uYWwgdHJhbnNmb3JtYXRpb24KIAkJCQkJCQlpbnQgZmlsbF9tb2RlCS8vIGZpbGwgbW9kZSwgV0lORElORyBvciBBTFRFUk5BVEUKIAkJCQkJCQkpOwogCiAJLyoqIFNldCBjbGlwcGluZyBwYXRoIHVzaW5nIHN0cm9rZWQgcmVnaW9uICovCi0JdmlydHVhbCBGWF9CT09MCQlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCS8vIHBhdGggaW5mbworCXZpcnR1YWwgYm9vbAkJU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAkvLyBwYXRoIGluZm8KIAkJCQkJCQljb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwJLy8gb3B0aW9uYWwgdHJhbnNmb3JtYXRpb24KIAkJCQkJCQljb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCS8vIGdyYXBoaWMgc3RhdGUsIGZvciBwZW4gYXR0cmlidXRlcwogCQkJCQkJCSk7CiAKIAkvKiogRHJhdyBhIHBhdGggKi8KLQl2aXJ0dWFsIEZYX0JPT0wJCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorCXZpcnR1YWwgYm9vbAkJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAJCQkJCQljb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKIAkJCQkJCWNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCiAJCQkJCQlGWF9EV09SRCBmaWxsX2NvbG9yLApAQCAtNDIsNDQgKzQyLDQ0IEBACiAJCQkJCQl2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTAogCQkJCQkJCSk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCVNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsCisJdmlydHVhbCBib29sCQlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLAogCQkJCQkJaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCUZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LCBGWF9EV09SRCBmaWxsX2NvbG9yLAorCXZpcnR1YWwgYm9vbAkJRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsCiAJCQkJCQlpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAogCS8qKiBEcmF3IGEgc2luZ2xlIHBpeGVsIChkZXZpY2UgZGVwZW5kYW50KSBsaW5lICovCi0JdmlydHVhbCBGWF9CT09MCQlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZJWEZMT0FUIHgxLCBGWF9GSVhGTE9BVCB5MSwgRlhfRklYRkxPQVQgeDIsIEZYX0ZJWEZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKLQkJCQkJCQlpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpIHsgcmV0dXJuIEZBTFNFOyB9CisJdmlydHVhbCBib29sCQlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZJWEZMT0FUIHgxLCBGWF9GSVhGTE9BVCB5MSwgRlhfRklYRkxPQVQgeDIsIEZYX0ZJWEZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKKwkJCQkJCQlpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpIHsgcmV0dXJuIGZhbHNlOyB9CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCUdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpOworCXZpcnR1YWwgYm9vbAkJR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCk7CiAKIAkvKiogTG9hZCBkZXZpY2UgYnVmZmVyIGludG8gYSBESUIgKi8KLQl2aXJ0dWFsIEZYX0JPT0wJCUdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgRlhfQk9PTCBiREVkZ2UgPSBGQUxTRSk7CisJdmlydHVhbCBib29sCQlHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGJvb2wgYkRFZGdlID0gZmFsc2UpOwogCiAJdmlydHVhbCBDRlhfRElCaXRtYXAqICAgR2V0QmFja0Ryb3AoKSB7IHJldHVybiBtX3BBZ2dEcml2ZXItPkdldEJhY2tEcm9wKCk7IH0KIAotCXZpcnR1YWwgRlhfQk9PTAkJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKKwl2aXJ0dWFsIGJvb2wJCVNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCiAJCQkJCQlpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCBibGVuZF90eXBlLAogCQkJCQkJaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7Ci0JdmlydHVhbCBGWF9CT09MCQlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisJdmlydHVhbCBib29sCQlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAJCQkJaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKIAkJCQlpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCisJdmlydHVhbCBib29sCQlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKIAkJCQljb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywgdm9pZComIGhhbmRsZSwKIAkJCQlpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCUNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpOworCXZpcnR1YWwgYm9vbAkJQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSk7CiAJdmlydHVhbCB2b2lkCQlDYW5jZWxESUJpdHModm9pZCogaGFuZGxlKTsKIAotCXZpcnR1YWwgRlhfQk9PTCAgICAgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCisJdmlydHVhbCBib29sICAgICBEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKIAkJCQkJCUNGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIEZYX0ZJWEZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCiAJCQkJCQlpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJUmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyLCBGWF9EV09SRCBjb2xvciwgRlhfQk9PTCBiRnVsbENvdmVyLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0LAorCXZpcnR1YWwgYm9vbAkJUmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyLCBGWF9EV09SRCBjb2xvciwgYm9vbCBiRnVsbENvdmVyLCBib29sIGJHcm91cEtub2Nrb3V0LAogCQkJCQkJCWludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCVJlbmRlclJhc3Rlcml6ZXJTa2lhKFNrUGF0aCYgc2tQYXRoLCBjb25zdCBTa1BhaW50JiBvcmlnUGFpbnQsIFNrSVJlY3QmIHJlY3QsIEZYX0RXT1JEIGNvbG9yLCBGWF9CT09MIGJGdWxsQ292ZXIsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQsCi0JCQkJCQkJaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIEZYX0JPT0wgYkZpbGwgPSBUUlVFKTsKKwl2aXJ0dWFsIGJvb2wJCVJlbmRlclJhc3Rlcml6ZXJTa2lhKFNrUGF0aCYgc2tQYXRoLCBjb25zdCBTa1BhaW50JiBvcmlnUGFpbnQsIFNrSVJlY3QmIHJlY3QsIEZYX0RXT1JEIGNvbG9yLCBib29sIGJGdWxsQ292ZXIsIGJvb2wgYkdyb3VwS25vY2tvdXQsCisJCQkJCQkJaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGJvb2wgYkZpbGwgPSB0cnVlKTsKIAl2b2lkCQkJCVNldENsaXBNYXNrKHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIpOwogCXZvaWQJCQkJU2V0Q2xpcE1hc2soU2tQYXRoJiBza1BhdGgsIFNrUGFpbnQqIHNwYWludCk7CiAJdmlydHVhbAl1aW50OF90KglHZXRCdWZmZXIoKSBjb25zdCB7cmV0dXJuIG1fcEFnZ0RyaXZlci0+R2V0QnVmZmVyKCk7fQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS93aW4zMi9kd3JpdGVfaW50LmggYi9jb3JlL3NyYy9meGdlL3dpbjMyL2R3cml0ZV9pbnQuaAppbmRleCBkYzJhMzM4Li40ODk2MTYxIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3dpbjMyL2R3cml0ZV9pbnQuaAorKysgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2R3cml0ZV9pbnQuaApAQCAtMzUsMTUgKzM1LDE1IEBACiAgICAgdm9pZAkJCUxvYWQoKTsKICAgICB2b2lkICAgICAgICAgICAgVW5sb2FkKCk7CiAKLSAgICBGWF9CT09MCQkJSXNBdmFpbGFibGUoKQorICAgIGJvb2wJCQlJc0F2YWlsYWJsZSgpCiAgICAgewogICAgICAgICByZXR1cm4gbV9wRFdyaXRlRmFjdG9yeSAhPSBOVUxMOwogICAgIH0KIAogICAgIHZvaWQqCQkJRHdDcmVhdGVGb250RmFjZUZyb21TdHJlYW0odWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIGludCBzaW11bGF0aW9uX3N0eWxlKTsKLSAgICBGWF9CT09MICAgICAgICAgRHdDcmVhdGVSZW5kZXJpbmdUYXJnZXQoQ0ZYX0RJQml0bWFwKiBwU3JjLCB2b2lkKiogcmVuZGVyVGFyZ2V0KTsKKyAgICBib29sICAgICAgICAgRHdDcmVhdGVSZW5kZXJpbmdUYXJnZXQoQ0ZYX0RJQml0bWFwKiBwU3JjLCB2b2lkKiogcmVuZGVyVGFyZ2V0KTsKICAgICB2b2lkICAgICAgICAgICAgRHdEZWxldGVSZW5kZXJpbmdUYXJnZXQodm9pZCogcmVuZGVyVGFyZ2V0KTsKLSAgICBGWF9CT09MCQkJRHdSZW5kaW5nU3RyaW5nKHZvaWQqIHJlbmRlclRhcmdldCwgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBGWF9SRUNUJiBzdHJpbmdSZWN0LCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorICAgIGJvb2wJCQlEd1JlbmRpbmdTdHJpbmcodm9pZCogcmVuZGVyVGFyZ2V0LCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX1JFQ1QmIHN0cmluZ1JlY3QsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpmb250LCBGWF9GTE9BVCBmb250X3NpemUsIEZYX0FSR0IgdGV4dF9jb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnbHlwaF9jb3VudCwgdW5zaWduZWQgc2hvcnQqIGdseXBoX2luZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBiYXNlbGluZU9yaWdpblgsIEZYX0ZMT0FUIGJhc2VsaW5lT3JpZ2luWSwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZGV2aWNlLmNwcCBiL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZGV2aWNlLmNwcAppbmRleCAxOGJjYzU5Li5lNjY2N2IxIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2RldmljZS5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kZXZpY2UuY3BwCkBAIC0yNCwxOCArMjQsMTggQEAKICAgICBDV2luMzJGb250SW5mbygpOwogICAgIH5DV2luMzJGb250SW5mbygpOwogICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpOwotICAgIHZpcnR1YWwJRlhfQk9PTAkJRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKTsKLSAgICB2aXJ0dWFsIHZvaWQqCQlNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhY2UsIEZYX0JPT0wmIGJFeGFjdCk7CisgICAgdmlydHVhbAlib29sCQlFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpOworICAgIHZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFjZSwgYm9vbCYgYkV4YWN0KTsKICAgICB2aXJ0dWFsIHZvaWQqCQlHZXRGb250KGNvbnN0IEZYX0NIQVIqIGZhY2UpCiAgICAgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgdmlydHVhbCBGWF9EV09SRAlHZXRGb250RGF0YSh2b2lkKiBoRm9udCwgRlhfRFdPUkQgdGFibGUsIHVpbnQ4X3QqIGJ1ZmZlciwgRlhfRFdPUkQgc2l6ZSk7CiAgICAgdmlydHVhbCB2b2lkCQlEZWxldGVGb250KHZvaWQqIGhGb250KTsKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCUdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KTsKLSAgICBGWF9CT09MCQkJCUlzT3BlblR5cGVGcm9tRGl2KGNvbnN0IExPR0ZPTlRBICpwbGYpOwotICAgIEZYX0JPT0wJCQkJSXNTdXBwb3J0Rm9udEZvcm1EaXYoY29uc3QgTE9HRk9OVEEqIHBsZik7CisgICAgdmlydHVhbAlib29sCQlHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOworICAgIHZpcnR1YWwgYm9vbAkJR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCk7CisgICAgYm9vbAkJCQlJc09wZW5UeXBlRnJvbURpdihjb25zdCBMT0dGT05UQSAqcGxmKTsKKyAgICBib29sCQkJCUlzU3VwcG9ydEZvbnRGb3JtRGl2KGNvbnN0IExPR0ZPTlRBKiBwbGYpOwogICAgIHZvaWQJCQkJQWRkSW5zdGFsbGVkRm9udChjb25zdCBMT0dGT05UQSAqcGxmLCBGWF9EV09SRCBGb250VHlwZSk7CiAgICAgdm9pZAkJCQlHZXRHQlByZWZlcmVuY2UoQ0ZYX0J5dGVTdHJpbmcmIGZhY2UsIGludCB3ZWlnaHQsIGludCBwaWN0aF9mYW1pbHkpOwogICAgIHZvaWQJCQkJR2V0SmFwYW5lc2VQcmVmZXJlbmNlKENGWF9CeXRlU3RyaW5nJiBmYWNlLCBpbnQgd2VpZ2h0LCBpbnQgcGljdGhfZmFtaWx5KTsKQEAgLTU5LDEwICs1OSwxMCBAQAogICAgIGRlbGV0ZSB0aGlzOwogfQogI2RlZmluZSBUVF9NQUtFX1RBRyh4MSwgeDIsIHgzLCB4NCkgKCgoRlhfRFdPUkQpeDE8PDI0KXwoKEZYX0RXT1JEKXgyPDwxNil8KChGWF9EV09SRCl4Mzw8OCl8KEZYX0RXT1JEKXg0KQotRlhfQk9PTCBDV2luMzJGb250SW5mbzo6SXNPcGVuVHlwZUZyb21EaXYoY29uc3QgTE9HRk9OVEEgKnBsZikKK2Jvb2wgQ1dpbjMyRm9udEluZm86OklzT3BlblR5cGVGcm9tRGl2KGNvbnN0IExPR0ZPTlRBICpwbGYpCiB7CiAgICAgSEZPTlQgaEZvbnQgPSBDcmVhdGVGb250SW5kaXJlY3RBKHBsZik7Ci0gICAgRlhfQk9PTCByZXQgPSBGQUxTRTsKKyAgICBib29sIHJldCA9IGZhbHNlOwogICAgIEZYX0RXT1JEIGZvbnRfc2l6ZSAgPSBHZXRGb250RGF0YShoRm9udCwgMCwgTlVMTCwgMCk7CiAgICAgaWYgKGZvbnRfc2l6ZSAhPSBHRElfRVJST1IgJiYgZm9udF9zaXplID49IHNpemVvZihGWF9EV09SRCkpIHsKICAgICAgICAgRlhfRFdPUkQgbFZlcnNpb24gPSAwOwpAQCAtNzQsMTYgKzc0LDE2IEBACiAgICAgICAgICAgICAgICAgbFZlcnNpb24gPT0gVFRfTUFLRV9UQUcoJ3QnLCAndCcsICdjJywgJ2YnKSB8fAogICAgICAgICAgICAgICAgIGxWZXJzaW9uID09IFRUX01BS0VfVEFHKCd0JywgJ3InLCAndScsICdlJykgfHwKICAgICAgICAgICAgICAgICBsVmVyc2lvbiA9PSAweDAwMDIwMDAwKSB7Ci0gICAgICAgICAgICByZXQgPSBUUlVFOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICBEZWxldGVGb250KGhGb250KTsKICAgICByZXR1cm4gcmV0OwogfQotRlhfQk9PTCBDV2luMzJGb250SW5mbzo6SXNTdXBwb3J0Rm9udEZvcm1EaXYoY29uc3QgTE9HRk9OVEEqIHBsZikKK2Jvb2wgQ1dpbjMyRm9udEluZm86OklzU3VwcG9ydEZvbnRGb3JtRGl2KGNvbnN0IExPR0ZPTlRBKiBwbGYpCiB7CiAgICAgSEZPTlQgaEZvbnQgPSBDcmVhdGVGb250SW5kaXJlY3RBKHBsZik7Ci0gICAgRlhfQk9PTCByZXQgPSBGQUxTRTsKKyAgICBib29sIHJldCA9IGZhbHNlOwogICAgIEZYX0RXT1JEIGZvbnRfc2l6ZSAgPSBHZXRGb250RGF0YShoRm9udCwgMCwgTlVMTCwgMCk7CiAgICAgaWYgKGZvbnRfc2l6ZSAhPSBHRElfRVJST1IgJiYgZm9udF9zaXplID49IHNpemVvZihGWF9EV09SRCkpIHsKICAgICAgICAgRlhfRFdPUkQgbFZlcnNpb24gPSAwOwpAQCAtOTUsMTAgKzk1LDEwIEBACiAgICAgICAgICAgICAgICAgbFZlcnNpb24gPT0gVFRfTUFLRV9UQUcoJ3QnLCAndCcsICdjJywgJ2YnKSB8fAogICAgICAgICAgICAgICAgIGxWZXJzaW9uID09IFRUX01BS0VfVEFHKCd0JywgJ3InLCAndScsICdlJykgfHwKICAgICAgICAgICAgICAgICBsVmVyc2lvbiA9PSAweDAwMDIwMDAwKSB7Ci0gICAgICAgICAgICByZXQgPSBUUlVFOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIGlmICgobFZlcnNpb24gJiAweEZGRkYwMDAwKSA9PSBUVF9NQUtFX1RBRygweDgwLCAweDAxLCAweDAwLCAweDAwKSB8fAogICAgICAgICAgICAgICAgICAgIChsVmVyc2lvbiAmIDB4RkZGRjAwMDApID09IFRUX01BS0VfVEFHKCclJywgJyEnLCAwLCAwKSkgewotICAgICAgICAgICAgcmV0ID0gVFJVRTsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgRGVsZXRlRm9udChoRm9udCk7CkBAIC0xMzksNyArMTM5LDcgQEAKICAgICBwRm9udEluZm8tPkFkZEluc3RhbGxlZEZvbnQocGxmLCBGb250VHlwZSk7CiAgICAgcmV0dXJuIDE7CiB9Ci1GWF9CT09MIENXaW4zMkZvbnRJbmZvOjpFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpCitib29sIENXaW4zMkZvbnRJbmZvOjpFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpCiB7CiAgICAgbV9wTWFwcGVyID0gcE1hcHBlcjsKICAgICBMT0dGT05UQSBsZjsKQEAgLTE1MSw3ICsxNTEsNyBAQAogICAgIGlmIChwTWFwcGVyLT5HZXRGb250RW51bWVyYXRvcigpKSB7CiAgICAgICAgIHBNYXBwZXItPkdldEZvbnRFbnVtZXJhdG9yKCktPkZpbmlzaCgpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogICAgIGNvbnN0IEZYX0NIQVIqCW1fcEZhY2VOYW1lOwpAQCAtMTYzLDIyICsxNjMsMjIgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogICAgIGNvbnN0IEZYX0NIQVIqCW1fcE5hbWU7CiAgICAgY29uc3QgRlhfQ0hBUioJbV9wV2luTmFtZTsKLSAgICBGWF9CT09MCQltX2JCb2xkOwotICAgIEZYX0JPT0wJCW1fYkl0YWxpYzsKKyAgICBib29sCQltX2JCb2xkOworICAgIGJvb2wJCW1fYkl0YWxpYzsKIH0KIEJhc2UxNFN1YnN0c1tdID0gewotICAgIHsiQ291cmllciIsICJDb3VyaWVyIE5ldyIsIEZBTFNFLCBGQUxTRX0sCi0gICAgeyJDb3VyaWVyLUJvbGQiLCAiQ291cmllciBOZXciLCBUUlVFLCBGQUxTRX0sCi0gICAgeyJDb3VyaWVyLUJvbGRPYmxpcXVlIiwgIkNvdXJpZXIgTmV3IiwgVFJVRSwgVFJVRX0sCi0gICAgeyJDb3VyaWVyLU9ibGlxdWUiLCAiQ291cmllciBOZXciLCBGQUxTRSwgVFJVRX0sCi0gICAgeyJIZWx2ZXRpY2EiLCAiQXJpYWwiLCBGQUxTRSwgRkFMU0V9LAotICAgIHsiSGVsdmV0aWNhLUJvbGQiLCAiQXJpYWwiLCBUUlVFLCBGQUxTRX0sCi0gICAgeyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiLCAiQXJpYWwiLCBUUlVFLCBUUlVFfSwKLSAgICB7IkhlbHZldGljYS1PYmxpcXVlIiwgIkFyaWFsIiwgRkFMU0UsIFRSVUV9LAotICAgIHsiVGltZXMtUm9tYW4iLCAiVGltZXMgTmV3IFJvbWFuIiwgRkFMU0UsIEZBTFNFfSwKLSAgICB7IlRpbWVzLUJvbGQiLCAiVGltZXMgTmV3IFJvbWFuIiwgVFJVRSwgRkFMU0V9LAotICAgIHsiVGltZXMtQm9sZEl0YWxpYyIsICJUaW1lcyBOZXcgUm9tYW4iLCBUUlVFLCBUUlVFfSwKLSAgICB7IlRpbWVzLUl0YWxpYyIsICJUaW1lcyBOZXcgUm9tYW4iLCBGQUxTRSwgVFJVRX0sCisgICAgeyJDb3VyaWVyIiwgIkNvdXJpZXIgTmV3IiwgZmFsc2UsIGZhbHNlfSwKKyAgICB7IkNvdXJpZXItQm9sZCIsICJDb3VyaWVyIE5ldyIsIHRydWUsIGZhbHNlfSwKKyAgICB7IkNvdXJpZXItQm9sZE9ibGlxdWUiLCAiQ291cmllciBOZXciLCB0cnVlLCB0cnVlfSwKKyAgICB7IkNvdXJpZXItT2JsaXF1ZSIsICJDb3VyaWVyIE5ldyIsIGZhbHNlLCB0cnVlfSwKKyAgICB7IkhlbHZldGljYSIsICJBcmlhbCIsIGZhbHNlLCBmYWxzZX0sCisgICAgeyJIZWx2ZXRpY2EtQm9sZCIsICJBcmlhbCIsIHRydWUsIGZhbHNlfSwKKyAgICB7IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsICJBcmlhbCIsIHRydWUsIHRydWV9LAorICAgIHsiSGVsdmV0aWNhLU9ibGlxdWUiLCAiQXJpYWwiLCBmYWxzZSwgdHJ1ZX0sCisgICAgeyJUaW1lcy1Sb21hbiIsICJUaW1lcyBOZXcgUm9tYW4iLCBmYWxzZSwgZmFsc2V9LAorICAgIHsiVGltZXMtQm9sZCIsICJUaW1lcyBOZXcgUm9tYW4iLCB0cnVlLCBmYWxzZX0sCisgICAgeyJUaW1lcy1Cb2xkSXRhbGljIiwgIlRpbWVzIE5ldyBSb21hbiIsIHRydWUsIHRydWV9LAorICAgIHsiVGltZXMtSXRhbGljIiwgIlRpbWVzIE5ldyBSb21hbiIsIGZhbHNlLCB0cnVlfSwKIH07CiBDRlhfQnl0ZVN0cmluZyBDV2luMzJGb250SW5mbzo6RmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpCiB7CkBAIC0yMTIsMTcgKzIxMiwxNyBAQAogICAgICAgICByZXR1cm4gRlhTWVNfc3RyaWNtcCgoY29uc3QgRlhfQ0hBUiopa2V5LCAoKF9Gb250TmFtZU1hcCopZWxlbWVudCktPm1fcFNyY0ZvbnROYW1lKTsKICAgICB9CiB9Ci1GWF9CT09MIF9HZXRTdWJGb250TmFtZShDRlhfQnl0ZVN0cmluZyYgbmFtZSkKK2Jvb2wgX0dldFN1YkZvbnROYW1lKENGWF9CeXRlU3RyaW5nJiBuYW1lKQogewogICAgIGludCBzaXplID0gc2l6ZW9mIGdfSnBGb250TmFtZU1hcDsKICAgICB2b2lkKiBwRm9udG5hbWVNYXAgPSAodm9pZCopZ19KcEZvbnROYW1lTWFwOwogICAgIF9Gb250TmFtZU1hcCogZm91bmQgPSAoX0ZvbnROYW1lTWFwKilGWFNZU19ic2VhcmNoKG5hbWUuY19zdHIoKSwgcEZvbnRuYW1lTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIC8gc2l6ZW9mIChfRm9udE5hbWVNYXApLCBzaXplb2YgKF9Gb250TmFtZU1hcCksIGNvbXBhcmVTdHJpbmcpOwogICAgIGlmIChmb3VuZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBuYW1lID0gZm91bmQtPm1fcFN1YkZvbnROYW1lOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDV2luMzJGb250SW5mbzo6R2V0R0JQcmVmZXJlbmNlKENGWF9CeXRlU3RyaW5nJiBmYWNlLCBpbnQgd2VpZ2h0LCBpbnQgcGljdGhfZmFtaWx5KQogewpAQCAtMjg1LDcgKzI4NSw3IEBACiAgICAgICAgIGZhY2UgPSAiTVMgUE1pbmNobyI7CiAgICAgfQogfQotdm9pZCogQ1dpbjMyRm9udEluZm86Ok1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogY3N0cl9mYWNlLCBGWF9CT09MJiBiRXhhY3QpCit2b2lkKiBDV2luMzJGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBjc3RyX2ZhY2UsIGJvb2wmIGJFeGFjdCkKIHsKICAgICBDRlhfQnl0ZVN0cmluZyBmYWNlID0gY3N0cl9mYWNlOwogICAgIGludCBpQmFzZUZvbnQ7CkBAIC0yOTQsNyArMjk0LDcgQEAKICAgICAgICAgICAgIGZhY2UgPSBCYXNlMTRTdWJzdHNbaUJhc2VGb250XS5tX3BXaW5OYW1lOwogICAgICAgICAgICAgd2VpZ2h0ID0gQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9iQm9sZCA/IEZXX0JPTEQgOiBGV19OT1JNQUw7CiAgICAgICAgICAgICBiSXRhbGljID0gQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9iSXRhbGljOwotICAgICAgICAgICAgYkV4YWN0ID0gVFJVRTsKKyAgICAgICAgICAgIGJFeGFjdCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIGlmIChjaGFyc2V0ID09IEFOU0lfQ0hBUlNFVCB8fCBjaGFyc2V0ID09IFNZTUJPTF9DSEFSU0VUKSB7CkBAIC0zNzMsMjYgKzM3MywyNiBAQAogICAgIH0KICAgICByZXR1cm4gc2l6ZTsKIH0KLUZYX0JPT0wgQ1dpbjMyRm9udEluZm86OkdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkKK2Jvb2wgQ1dpbjMyRm9udEluZm86OkdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkKIHsKICAgICBjaGFyIGZhY2VidWZbMTAwXTsKICAgICBIRk9OVCBoT2xkRm9udCA9IChIRk9OVCk6OlNlbGVjdE9iamVjdChtX2hEQywgKEhGT05UKWhGb250KTsKICAgICBpbnQgcmV0ID0gOjpHZXRUZXh0RmFjZUEobV9oREMsIDEwMCwgZmFjZWJ1Zik7CiAgICAgOjpTZWxlY3RPYmplY3QobV9oREMsIGhPbGRGb250KTsKICAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG5hbWUgPSBmYWNlYnVmOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDV2luMzJGb250SW5mbzo6R2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCkKK2Jvb2wgQ1dpbjMyRm9udEluZm86OkdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpCiB7CiAgICAgVEVYVE1FVFJJQyB0bTsKICAgICBIRk9OVCBoT2xkRm9udCA9IChIRk9OVCk6OlNlbGVjdE9iamVjdChtX2hEQywgKEhGT05UKWhGb250KTsKICAgICA6OkdldFRleHRNZXRyaWNzKG1faERDLCAmdG0pOwogICAgIDo6U2VsZWN0T2JqZWN0KG1faERDLCBoT2xkRm9udCk7CiAgICAgY2hhcnNldCA9IHRtLnRtQ2hhclNldDsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIElGWF9TeXN0ZW1Gb250SW5mbyogSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KCkKIHsKQEAgLTQ2NiwxNiArNDY2LDE2IEBACiAgICAgfQogICAgIHJldHVybiAodm9pZCopaENsaXBSZ247CiB9Ci1GWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OkdESV9TZXRESUJpdHMoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwMSwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQorYm9vbCBDR2RpRGV2aWNlRHJpdmVyOjpHRElfU2V0RElCaXRzKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcDEsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAobV9EZXZpY2VDbGFzcyA9PSBGWERDX1BSSU5URVIpIHsKLSAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gcEJpdG1hcDEtPkZsaXBJbWFnZShGQUxTRSwgVFJVRSk7CisgICAgICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHBCaXRtYXAxLT5GbGlwSW1hZ2UoZmFsc2UsIHRydWUpOwogICAgICAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChwQml0bWFwLT5Jc0NteWtJbWFnZSgpIHx8IHBJY2NUcmFuc2Zvcm0pICYmCiAgICAgICAgICAgICAgICAgIXBCaXRtYXAtPkNvbnZlcnRGb3JtYXQoRlhESUJfUmdiLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGludCB3aWR0aCA9IHBTcmNSZWN0LT5XaWR0aCgpLCBoZWlnaHQgPSBwU3JjUmVjdC0+SGVpZ2h0KCk7CiAgICAgICAgIGludCBwaXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7CkBAIC00OTMsNyArNDkzLDcgQEAKICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gKENGWF9ESUJpdG1hcCopcEJpdG1hcDE7CiAgICAgICAgIGlmICgocEJpdG1hcC0+SXNDbXlrSW1hZ2UoKSB8fCBwSWNjVHJhbnNmb3JtKSAmJgogICAgICAgICAgICAgICAgIChwQml0bWFwID0gcEJpdG1hcC0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYiwgTlVMTCwgcEljY1RyYW5zZm9ybSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpbnQgd2lkdGggPSBwU3JjUmVjdC0+V2lkdGgoKSwgaGVpZ2h0ID0gcFNyY1JlY3QtPkhlaWdodCgpOwogICAgICAgICBpbnQgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwpAQCAtNTA1LDE4ICs1MDUsMTggQEAKICAgICAgICAgICAgIGRlbGV0ZSBwQml0bWFwOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpHRElfU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAxLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCitib29sIENHZGlEZXZpY2VEcml2ZXI6OkdESV9TdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcDEsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgRlhfRFdPUkQgZmxhZ3MsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gKENGWF9ESUJpdG1hcCopcEJpdG1hcDE7CiAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCB8fCBkZXN0X3dpZHRoID09IDAgIHx8IGRlc3RfaGVpZ2h0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICgocEJpdG1hcC0+SXNDbXlrSW1hZ2UoKSB8fCBwSWNjVHJhbnNmb3JtKSAmJgogICAgICAgICAgICAgIXBCaXRtYXAtPkNvbnZlcnRGb3JtYXQoRlhESUJfUmdiLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmcgaW5mbyA9IENGWF9XaW5kb3dzRElCOjpHZXRCaXRtYXBJbmZvKHBCaXRtYXApOwogICAgIGlmICgoaW50NjRfdClhYnMoZGVzdF93aWR0aCkgKiBhYnMoZGVzdF9oZWlnaHQpIDwgKGludDY0X3QpcEJpdG1hcDEtPkdldFdpZHRoKCkgKiBwQml0bWFwMS0+R2V0SGVpZ2h0KCkgKiA0IHx8CkBAIC01MzgsMTUgKzUzOCwxNSBAQAogICAgIGlmIChkZWwpIHsKICAgICAgICAgZGVsZXRlIHBUb1N0cmVjaEJpdG1hcDsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OkdESV9TdHJldGNoQml0TWFzayhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAxLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCitib29sIENHZGlEZXZpY2VEcml2ZXI6OkdESV9TdHJldGNoQml0TWFzayhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAxLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIEZYX0RXT1JEIGJpdG1hcF9jb2xvciwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IChDRlhfRElCaXRtYXAqKXBCaXRtYXAxOwogICAgIGlmIChwQml0bWFwID09IE5VTEwgfHwgZGVzdF93aWR0aCA9PSAwICB8fCBkZXN0X2hlaWdodCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBfQ29sb3IyQXJnYihiaXRtYXBfY29sb3IsIGJpdG1hcF9jb2xvciwgYWxwaGFfZmxhZyB8ICgxIDw8IDI0KSwgcEljY1RyYW5zZm9ybSk7CiAgICAgaW50IHdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKSwgaGVpZ2h0ID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCk7CkBAIC01OTIsMTYgKzU5MiwxNiBAQAogICAgIFNlbGVjdE9iamVjdChtX2hEQywgaE9sZCk7CiAgICAgRGVsZXRlT2JqZWN0KGhQYXR0ZXJuKTsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KQogewogICAgIHJldHVybiA6OkdldENsaXBCb3gobV9oREMsIChSRUNUKilwUmVjdCk7CiB9Ci1GWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OlNldENsaXBSZ24odm9pZCogaFJnbikKK2Jvb2wgQ0dkaURldmljZURyaXZlcjo6U2V0Q2xpcFJnbih2b2lkKiBoUmduKQogewogICAgIDo6U2VsZWN0Q2xpcFJnbihtX2hEQywgKEhSR04paFJnbik7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBzdGF0aWMgSFBFTiBfQ3JlYXRlUGVuKGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGFyZ2IpCiB7CkBAIC03NDksMTEgKzc0OSwxMSBAQAogICAgIE1vdmVUb0V4KG1faERDLCBGWFNZU19yb3VuZCh4MSksIEZYU1lTX3JvdW5kKHkxKSwgTlVMTCk7CiAgICAgTGluZVRvKG1faERDLCBGWFNZU19yb3VuZCh4MiksIEZYU1lTX3JvdW5kKHkyKSk7CiB9Ci1zdGF0aWMgRlhfQk9PTCBfTWF0cml4Tm9TY2FsZWQoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCkKK3N0YXRpYyBib29sIF9NYXRyaXhOb1NjYWxlZChjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KQogewogICAgIHJldHVybiBwTWF0cml4LT5HZXRBKCkgPT0gMS4wZiAmJiBwTWF0cml4LT5HZXRCKCkgPT0gMCAmJiBwTWF0cml4LT5HZXRDKCkgPT0gMCAmJiBwTWF0cml4LT5HZXREKCkgPT0gMS4wZjsKIH0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCitib29sIENHZGlEZXZpY2VEcml2ZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLApAQCAtNzY1LDcgKzc2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewogICAgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgX0NvbG9yMkFyZ2IoZmlsbF9jb2xvciwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZyB8ICgxIDw8IDI0KSwgcEljY1RyYW5zZm9ybSk7CiAgICAgX0NvbG9yMkFyZ2Ioc3Ryb2tlX2NvbG9yLCBzdHJva2VfY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwpAQCAtNzg2LDkgKzc4Niw5IEBACiAgICAgfQogICAgIGludCBmaWxsX2FscGhhID0gRlhBUkdCX0EoZmlsbF9jb2xvcik7CiAgICAgaW50IHN0cm9rZV9hbHBoYSA9IEZYQVJHQl9BKHN0cm9rZV9jb2xvcik7Ci0gICAgRlhfQk9PTCBiRHJhd0FscGhhID0gKGZpbGxfYWxwaGEgPiAwICYmIGZpbGxfYWxwaGEgPCAyNTUpIHx8IChzdHJva2VfYWxwaGEgPiAwICYmIHN0cm9rZV9hbHBoYSA8IDI1NSAmJiBwR3JhcGhTdGF0ZSk7CisgICAgYm9vbCBiRHJhd0FscGhhID0gKGZpbGxfYWxwaGEgPiAwICYmIGZpbGxfYWxwaGEgPCAyNTUpIHx8IChzdHJva2VfYWxwaGEgPiAwICYmIHN0cm9rZV9hbHBoYSA8IDI1NSAmJiBwR3JhcGhTdGF0ZSk7CiAgICAgaWYgKCFwUGxhdGZvcm0tPm1fR2RpcGx1c0V4dC5Jc0F2YWlsYWJsZSgpICYmIGJEcmF3QWxwaGEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChwUGxhdGZvcm0tPm1fR2RpcGx1c0V4dC5Jc0F2YWlsYWJsZSgpKSB7CiAgICAgICAgIGlmIChiRHJhd0FscGhhIHx8ICgobV9EZXZpY2VDbGFzcyAhPSBGWERDX1BSSU5URVIgJiYgIShmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSKSkgfHwgKHBHcmFwaFN0YXRlICYmIHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCkpKSB7CkBAIC03OTcsNyArNzk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgKHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDUgfHwgcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNCkgJiYKICAgICAgICAgICAgICAgICAgICAgcFBhdGhEYXRhLT5Jc1JlY3QoKSkgKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LkRyYXdQYXRoKG1faERDLCBwUGF0aERhdGEsIHBNYXRyaXgsIHBHcmFwaFN0YXRlLCBmaWxsX2NvbG9yLCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtODUyLDI5ICs4NTIsMjkgQEAKICAgICAgICAgaEJydXNoID0gKEhCUlVTSClTZWxlY3RPYmplY3QobV9oREMsIGhCcnVzaCk7CiAgICAgICAgIERlbGV0ZU9iamVjdChoQnJ1c2gpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6RmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKK2Jvb2wgQ0dkaURldmljZURyaXZlcjo6RmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKIHsKICAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIF9Db2xvcjJBcmdiKGZpbGxfY29sb3IsIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcgfCAoMSA8PCAyNCksIHBJY2NUcmFuc2Zvcm0pOwogICAgIGludCBhbHBoYTsKICAgICBGWF9DT0xPUlJFRiByZ2I7CiAgICAgQXJnYkRlY29kZShmaWxsX2NvbG9yLCBhbHBoYSwgcmdiKTsKICAgICBpZiAoYWxwaGEgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChhbHBoYSA8IDI1NSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgSEJSVVNIIGhCcnVzaCA9IENyZWF0ZVNvbGlkQnJ1c2gocmdiKTsKICAgICA6OkZpbGxSZWN0KG1faERDLCAoUkVDVCopcFJlY3QsIGhCcnVzaCk7CiAgICAgRGVsZXRlT2JqZWN0KGhCcnVzaCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCitib29sIENHZGlEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgIGludCBmaWxsX21vZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKQEAgLTg4NCwxNSArODg0LDE1IEBACiAgICAgICAgIGlmIChwUGF0aERhdGEtPklzUmVjdChwTWF0cml4LCAmcmVjdGYpKSB7CiAgICAgICAgICAgICBGWF9SRUNUIHJlY3QgPSByZWN0Zi5HZXRPdXR0ZXJSZWN0KCk7CiAgICAgICAgICAgICBJbnRlcnNlY3RDbGlwUmVjdChtX2hEQywgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICBfU2V0UGF0aFRvREMobV9oREMsIHBQYXRoRGF0YSwgcE1hdHJpeCk7CiAgICAgU2V0UG9seUZpbGxNb2RlKG1faERDLCBmaWxsX21vZGUgJiAzKTsKICAgICBTZWxlY3RDbGlwUGF0aChtX2hEQywgUkdOX0FORCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKK2Jvb2wgQ0dkaURldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAogICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKQEAgLTkwMiwyMyArOTAyLDIzIEBACiAgICAgX1NldFBhdGhUb0RDKG1faERDLCBwUGF0aERhdGEsIHBNYXRyaXgpOwogICAgIFdpZGVuUGF0aChtX2hEQyk7CiAgICAgU2V0UG9seUZpbGxNb2RlKG1faERDLCBXSU5ESU5HKTsKLSAgICBGWF9CT09MIHJldCA9IFNlbGVjdENsaXBQYXRoKG1faERDLCBSR05fQU5EKTsKKyAgICBib29sIHJldCA9IFNlbGVjdENsaXBQYXRoKG1faERDLCBSR05fQU5EKTsKICAgICBoUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KG1faERDLCBoUGVuKTsKICAgICBEZWxldGVPYmplY3QoaFBlbik7CiAgICAgcmV0dXJuIHJldDsKIH0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCitib29sIENHZGlEZXZpY2VEcml2ZXI6OkRyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50CWJsZW5kX3R5cGUpCiB7CiAgICAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBfQ29sb3IyQXJnYihjb2xvciwgY29sb3IsIGFscGhhX2ZsYWcgfCAoMSA8PCAyNCksIHBJY2NUcmFuc2Zvcm0pOwogICAgIGludCBhOwogICAgIEZYX0NPTE9SUkVGIHJnYjsKICAgICBBcmdiRGVjb2RlKGNvbG9yLCBhLCByZ2IpOwogICAgIGlmIChhID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBIUEVOIGhQZW4gPSBDcmVhdGVQZW4oUFNfU09MSUQsIDEsIHJnYik7CiAgICAgaFBlbiA9IChIUEVOKVNlbGVjdE9iamVjdChtX2hEQywgaFBlbik7CkBAIC05MjYsMTIgKzkyNiwxMiBAQAogICAgIExpbmVUbyhtX2hEQywgRlhTWVNfcm91bmQoeDIpLCBGWFNZU19yb3VuZCh5MikpOwogICAgIGhQZW4gPSAoSFBFTilTZWxlY3RPYmplY3QobV9oREMsIGhQZW4pOwogICAgIERlbGV0ZU9iamVjdChoUGVuKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6RGVsZXRlRGV2aWNlUmduKHZvaWQqIHBSZ24pCitib29sIENHZGlEZXZpY2VEcml2ZXI6OkRlbGV0ZURldmljZVJnbih2b2lkKiBwUmduKQogewogICAgIERlbGV0ZU9iamVjdCgoSEdESU9CSilwUmduKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIENHZGlEaXNwbGF5RHJpdmVyOjpDR2RpRGlzcGxheURyaXZlcihIREMgaERDKSA6IENHZGlEZXZpY2VEcml2ZXIoaERDLCBGWERDX0RJU1BMQVkpCiB7CkBAIC05NDAsOSArOTQwLDkgQEAKICAgICAgICAgbV9SZW5kZXJDYXBzIHw9IEZYUkNfQUxQSEFfUEFUSCB8IEZYUkNfQUxQSEFfSU1BR0U7CiAgICAgfQogfQotRlhfQk9PTCBDR2RpRGlzcGxheURyaXZlcjo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIEZYX0JPT0wgYkRFZGdlKQorYm9vbCBDR2RpRGlzcGxheURyaXZlcjo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGJvb2wgYkRFZGdlKQogewotICAgIEZYX0JPT0wgcmV0ID0gRkFMU0U7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKICAgICBpbnQgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOwogICAgIGludCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKICAgICBIQklUTUFQIGhibXAgPSBDcmVhdGVDb21wYXRpYmxlQml0bWFwKG1faERDLCB3aWR0aCwgaGVpZ2h0KTsKQEAgLTk2OSw3ICs5NjksNyBAQAogICAgICAgICAgICAgOjpHZXRESUJpdHMoaERDTWVtb3J5LCBoYm1wLCAwLCBoZWlnaHQsIGJpdG1hcC5HZXRCdWZmZXIoKSwgJmJtaSwgRElCX1JHQl9DT0xPUlMpOwogICAgICAgICAgICAgcmV0ID0gcEJpdG1hcC0+VHJhbnNmZXJCaXRtYXAoMCwgMCwgd2lkdGgsIGhlaWdodCwgJmJpdG1hcCwgMCwgMCwgcEljY1RyYW5zZm9ybSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChwQml0bWFwLT5IYXNBbHBoYSgpICYmIHJldCkgewpAQCAtOTc5LDIyICs5NzksMjIgQEAKICAgICBEZWxldGVPYmplY3QoaERDTWVtb3J5KTsKICAgICByZXR1cm4gcmV0OwogfQotRlhfQk9PTCBDR2RpRGlzcGxheURyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAorYm9vbCBDR2RpRGlzcGxheURyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIEFTU0VSVChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCk7CiAgICAgaWYgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKICAgICAgICAgaW50IHdpZHRoID0gcFNvdXJjZS0+R2V0V2lkdGgoKSwgaGVpZ2h0ID0gcFNvdXJjZS0+R2V0SGVpZ2h0KCk7CiAgICAgICAgIGludCBhbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKGNvbG9yKTsKLSAgICAgICAgRlhfQk9PTCBiR0RJID0gcFNvdXJjZS0+R2V0QlBQKCkgPT0gMSAmJiBhbHBoYSA9PSAyNTU7CisgICAgICAgIGJvb2wgYkdESSA9IHBTb3VyY2UtPkdldEJQUCgpID09IDEgJiYgYWxwaGEgPT0gMjU1OwogICAgICAgICBpZiAoIWJHREkpIHsKICAgICAgICAgICAgIENGWF9ESUJpdG1hcCBiYWNrZ3JvdW5kOwogICAgICAgICAgICAgaWYgKCFiYWNrZ3JvdW5kLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9SZ2IzMikgfHwKICAgICAgICAgICAgICAgICAhR2V0RElCaXRzKCZiYWNrZ3JvdW5kLCBsZWZ0LCB0b3AsIE5VTEwpIHx8CiAgICAgICAgICAgICAgICAgIWJhY2tncm91bmQuQ29tcG9zaXRlTWFzaygwLCAwLCB3aWR0aCwgaGVpZ2h0LCBwU291cmNlLCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBGWERJQl9CTEVORF9OT1JNQUwsIE5VTEwsIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgIHJldHVybiBTZXRESUJpdHMoJmJhY2tncm91bmQsIDAsICZzcmNfcmVjdCwgbGVmdCwgdG9wLCBGWERJQl9CTEVORF9OT1JNQUwsIDAsIE5VTEwpOwpAQCAtMTAwOCw4ICsxMDA4LDggQEAKICAgICAgICAgQ0ZYX0RJQml0bWFwIGJpdG1hcDsKICAgICAgICAgaWYgKCFiaXRtYXAuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX1JnYikgfHwKICAgICAgICAgICAgICFHZXRESUJpdHMoJmJpdG1hcCwgbGVmdCwgdG9wLCBOVUxMKSB8fAotICAgICAgICAgICAgIWJpdG1hcC5Db21wb3NpdGVCaXRtYXAoMCwgMCwgd2lkdGgsIGhlaWdodCwgcFNvdXJjZSwgcFNyY1JlY3QtPmxlZnQsIHBTcmNSZWN0LT50b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgRkFMU0UsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAhYml0bWFwLkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCB3aWR0aCwgaGVpZ2h0LCBwU291cmNlLCBwU3JjUmVjdC0+bGVmdCwgcFNyY1JlY3QtPnRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBmYWxzZSwgcEljY1RyYW5zZm9ybSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICByZXR1cm4gU2V0RElCaXRzKCZiaXRtYXAsIDAsICZzcmNfcmVjdCwgbGVmdCwgdG9wLCBGWERJQl9CTEVORF9OT1JNQUwsIDAsIE5VTEwpOwpAQCAtMTAxOSw5ICsxMDE5LDkgQEAKICAgICBpZiAocEJpdG1hcCkgewogICAgICAgICByZXR1cm4gR0RJX1NldERJQml0cyhwQml0bWFwLCBwU3JjUmVjdCwgbGVmdCwgdG9wLCBwSWNjVHJhbnNmb3JtKTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ0dkaURpc3BsYXlEcml2ZXI6OlVzZUZveGl0U3RyZXRjaEVuZ2luZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorYm9vbCBDR2RpRGlzcGxheURyaXZlcjo6VXNlRm94aXRTdHJldGNoRW5naW5lKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgaW50IHJlbmRlcl9mbGFncywKICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogewpAQCAtMTAzNSwxNCArMTAzNSwxNCBAQAogICAgIGJpdG1hcF9jbGlwLk9mZnNldCgtZGVzdF9sZWZ0LCAtZGVzdF90b3ApOwogICAgIENGWF9ESUJpdG1hcCogcFN0cmV0Y2hlZCA9IHBTb3VyY2UtPlN0cmV0Y2hUbyhkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcmVuZGVyX2ZsYWdzLCAmYml0bWFwX2NsaXApOwogICAgIGlmIChwU3RyZXRjaGVkID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHBTdHJldGNoZWQtPkdldFdpZHRoKCksIHBTdHJldGNoZWQtPkdldEhlaWdodCgpKTsKLSAgICBGWF9CT09MIHJldCA9IFNldERJQml0cyhwU3RyZXRjaGVkLCBjb2xvciwgJnNyY19yZWN0LCBwQ2xpcFJlY3QtPmxlZnQsIHBDbGlwUmVjdC0+dG9wLCBGWERJQl9CTEVORF9OT1JNQUwsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworICAgIGJvb2wgcmV0ID0gU2V0RElCaXRzKHBTdHJldGNoZWQsIGNvbG9yLCAmc3JjX3JlY3QsIHBDbGlwUmVjdC0+bGVmdCwgcENsaXBSZWN0LT50b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiAgICAgZGVsZXRlIHBTdHJldGNoZWQ7CiAgICAgcmV0dXJuIHJldDsKIH0KLUZYX0JPT0wgQ0dkaURpc3BsYXlEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKK2Jvb2wgQ0dkaURpc3BsYXlEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogewpAQCAtMTA2MywxNyArMTA2MywxNyBAQAogICAgICAgICBpbnQgY2xpcF93aWR0aCA9IGNsaXBfcmVjdC5XaWR0aCgpLCBjbGlwX2hlaWdodCA9IGNsaXBfcmVjdC5IZWlnaHQoKTsKICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaGVkID0gcFNvdXJjZS0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBmbGFncywgJmNsaXBfcmVjdCk7CiAgICAgICAgIGlmIChwU3RyZXRjaGVkID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgQ0ZYX0RJQml0bWFwIGJhY2tncm91bmQ7CiAgICAgICAgIGlmICghYmFja2dyb3VuZC5DcmVhdGUoY2xpcF93aWR0aCwgY2xpcF9oZWlnaHQsIEZYRElCX1JnYjMyKSB8fAogICAgICAgICAgICAgIUdldERJQml0cygmYmFja2dyb3VuZCwgaW1hZ2VfcmVjdC5sZWZ0ICsgY2xpcF9yZWN0LmxlZnQsIGltYWdlX3JlY3QudG9wICsgY2xpcF9yZWN0LnRvcCwgTlVMTCkgfHwKLSAgICAgICAgICAgICFiYWNrZ3JvdW5kLkNvbXBvc2l0ZU1hc2soMCwgMCwgY2xpcF93aWR0aCwgY2xpcF9oZWlnaHQsIHBTdHJldGNoZWQsIGNvbG9yLCAwLCAwLCBGWERJQl9CTEVORF9OT1JNQUwsIE5VTEwsIEZBTFNFLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgeworICAgICAgICAgICAgIWJhY2tncm91bmQuQ29tcG9zaXRlTWFzaygwLCAwLCBjbGlwX3dpZHRoLCBjbGlwX2hlaWdodCwgcFN0cmV0Y2hlZCwgY29sb3IsIDAsIDAsIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgZmFsc2UsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7CiAgICAgICAgICAgICBkZWxldGUgcFN0cmV0Y2hlZDsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIGNsaXBfd2lkdGgsIGNsaXBfaGVpZ2h0KTsKLSAgICAgICAgRlhfQk9PTCByZXQgPSBTZXRESUJpdHMoJmJhY2tncm91bmQsIDAsICZzcmNfcmVjdCwgaW1hZ2VfcmVjdC5sZWZ0ICsgY2xpcF9yZWN0LmxlZnQsIGltYWdlX3JlY3QudG9wICsgY2xpcF9yZWN0LnRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCAwLCBOVUxMKTsKKyAgICAgICAgYm9vbCByZXQgPSBTZXRESUJpdHMoJmJhY2tncm91bmQsIDAsICZzcmNfcmVjdCwgaW1hZ2VfcmVjdC5sZWZ0ICsgY2xpcF9yZWN0LmxlZnQsIGltYWdlX3JlY3QudG9wICsgY2xpcF9yZWN0LnRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCAwLCBOVUxMKTsKICAgICAgICAgZGVsZXRlIHBTdHJldGNoZWQ7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpAQCAtMTA4Myw3ICsxMDgzLDcgQEAKICAgICAgICAgICAgIENGWF9ESUJFeHRyYWN0b3IgdGVtcChwU291cmNlKTsKICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHRlbXA7CiAgICAgICAgICAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBwUGxhdGZvcm0tPm1fR2RpcGx1c0V4dC5TdHJldGNoRElCaXRzKG1faERDLCBwQml0bWFwLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcENsaXBSZWN0LCBmbGFncyk7CiAgICAgICAgIH0KQEAgLTEwOTUsNyArMTA5NSw3IEBACiAgICAgaWYgKHBCaXRtYXApIHsKICAgICAgICAgcmV0dXJuIEdESV9TdHJldGNoRElCaXRzKHBCaXRtYXAsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBmbGFncywgcEljY1RyYW5zZm9ybSk7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAjZGVmaW5lIEdFVF9QU19GRUFUVVJFU0VUVElORyAgICAgICAgNDEyMQogI2RlZmluZSBGRUFUVVJFU0VUVElOR19QU0xFVkVMICAgICAgIDIKQEAgLTExMzQsNyArMTEzNCw3IEBACiAgICAgcmV0dXJuIDI7CiB9CiBpbnQgQ0ZYX1dpbmRvd3NEZXZpY2U6Om1fcHNMZXZlbCA9IDI7Ci1DRlhfV2luZG93c0RldmljZTo6Q0ZYX1dpbmRvd3NEZXZpY2UoSERDIGhEQywgRlhfQk9PTCBiQ215a091dHB1dCwgRlhfQk9PTCBiRm9yY2VQU091dHB1dCwgaW50IHBzTGV2ZWwpCitDRlhfV2luZG93c0RldmljZTo6Q0ZYX1dpbmRvd3NEZXZpY2UoSERDIGhEQywgYm9vbCBiQ215a091dHB1dCwgYm9vbCBiRm9yY2VQU091dHB1dCwgaW50IHBzTGV2ZWwpCiB7CiAgICAgbV9iRm9yY2VQU091dHB1dCA9IGJGb3JjZVBTT3V0cHV0OwogICAgIG1fcHNMZXZlbCA9IHBzTGV2ZWw7CkBAIC0xMTU0LDcgKzExNTQsNyBAQAogICAgIH0KICAgICByZXR1cm4gKEhEQylwUkRELT5HZXRQbGF0Zm9ybVN1cmZhY2UoKTsKIH0KLUlGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIENGWF9XaW5kb3dzRGV2aWNlOjpDcmVhdGVEcml2ZXIoSERDIGhEQywgRlhfQk9PTCBiQ215a091dHB1dCkKK0lGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIENGWF9XaW5kb3dzRGV2aWNlOjpDcmVhdGVEcml2ZXIoSERDIGhEQywgYm9vbCBiQ215a091dHB1dCkKIHsKICAgICBpbnQgZGV2aWNlX3R5cGUgPSA6OkdldERldmljZUNhcHMoaERDLCBURUNITk9MT0dZKTsKICAgICBpbnQgb2JqX3R5cGUgPSA6OkdldE9iamVjdFR5cGUoaERDKTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZGliLmNwcCBiL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZGliLmNwcAppbmRleCAzZGNmY2U0Li42MTBjNjllIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2RpYi5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kaWIuY3BwCkBAIC00OSwxOSArNDksMTkgQEAKICAgICByZXN1bHQuUmVsZWFzZUJ1ZmZlcihsZW4pOwogICAgIHJldHVybiByZXN1bHQ7CiB9Ci1DRlhfRElCaXRtYXAqIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKEJJVE1BUElORk8qIHBibWksIExQVk9JRCBwRGF0YSwgRlhfQk9PTCBiQWxwaGEpCitDRlhfRElCaXRtYXAqIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKEJJVE1BUElORk8qIHBibWksIExQVk9JRCBwRGF0YSwgYm9vbCBiQWxwaGEpCiB7CiAgICAgaW50IHdpZHRoID0gcGJtaS0+Ym1pSGVhZGVyLmJpV2lkdGg7CiAgICAgaW50IGhlaWdodCA9IHBibWktPmJtaUhlYWRlci5iaUhlaWdodDsKLSAgICBCT09MIGJCb3R0b21VcCA9IFRSVUU7CisgICAgQk9PTCBiQm90dG9tVXAgPSB0cnVlOwogICAgIGlmIChoZWlnaHQgPCAwKSB7CiAgICAgICAgIGhlaWdodCA9IC1oZWlnaHQ7Ci0gICAgICAgIGJCb3R0b21VcCA9IEZBTFNFOworICAgICAgICBiQm90dG9tVXAgPSBmYWxzZTsKICAgICB9CiAgICAgaW50IHBpdGNoID0gKHdpZHRoICogcGJtaS0+Ym1pSGVhZGVyLmJpQml0Q291bnQgKyAzMSkgLyAzMiAqIDQ7CiAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0ID0gYkFscGhhID8gKEZYRElCX0Zvcm1hdCkocGJtaS0+Ym1pSGVhZGVyLmJpQml0Q291bnQgKyAweDIwMCkgOiAoRlhESUJfRm9ybWF0KXBibWktPmJtaUhlYWRlci5iaUJpdENvdW50OwotICAgIEZYX0JPT0wgcmV0ID0gcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CisgICAgYm9vbCByZXQgPSBwQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKICAgICBpZiAoIXJldCkgewogICAgICAgICBkZWxldGUgcEJpdG1hcDsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC05Myw3ICs5Myw3IEBACiB9CiBDRlhfRElCaXRtYXAqIENGWF9XaW5kb3dzRElCOjpMb2FkRnJvbUJ1ZihCSVRNQVBJTkZPKiBwYm1pLCBMUFZPSUQgcERhdGEpCiB7Ci0gICAgcmV0dXJuIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKHBibWksIHBEYXRhLCBGQUxTRSk7CisgICAgcmV0dXJuIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKHBibWksIHBEYXRhLCBmYWxzZSk7CiB9CiBIQklUTUFQCUNGWF9XaW5kb3dzRElCOjpHZXREREJpdG1hcChjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIEhEQyBoREMpCiB7CkBAIC0xNzQsNyArMTc0LDcgQEAKIH0KIENGWF9ESUJpdG1hcCogQ0ZYX1dpbmRvd3NESUI6OkxvYWRGcm9tRERCKEhEQyBoREMsIEhCSVRNQVAgaEJpdG1hcCwgRlhfRFdPUkQqIHBQYWxldHRlLCBGWF9EV09SRCBwYWxzaXplKQogewotICAgIEZYX0JPT0wgYkNyZWF0ZWREQyA9IGhEQyA9PSBOVUxMOworICAgIGJvb2wgYkNyZWF0ZWREQyA9IGhEQyA9PSBOVUxMOwogICAgIGlmIChoREMgPT0gTlVMTCkgewogICAgICAgICBoREMgPSBDcmVhdGVDb21wYXRpYmxlREMoTlVMTCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kd3JpdGUuY3BwIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kd3JpdGUuY3BwCmluZGV4IDY1YTM1ZDguLjg1MzMzNDMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZHdyaXRlLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2R3cml0ZS5jcHAKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgIElEV3JpdGVGYWN0b3J5KiBwRHdGYWN0b3J5ID0gKElEV3JpdGVGYWN0b3J5KiltX3BEV3JpdGVGYWN0b3J5OwogICAgIElEV3JpdGVGb250RmlsZSogcER3Rm9udEZpbGUgPSBOVUxMOwogICAgIElEV3JpdGVGb250RmFjZSogcER3Rm9udEZhY2UgPSBOVUxMOwotICAgIEJPT0wgaXNTdXBwb3J0ZWRGb250VHlwZSA9IEZBTFNFOworICAgIEJPT0wgaXNTdXBwb3J0ZWRGb250VHlwZSA9IGZhbHNlOwogICAgIERXUklURV9GT05UX0ZJTEVfVFlQRSBmb250RmlsZVR5cGU7CiAgICAgRFdSSVRFX0ZPTlRfRkFDRV9UWVBFIGZvbnRGYWNlVHlwZTsKICAgICBVSU5UMzIgbnVtYmVyT2ZGYWNlczsKQEAgLTE3NCwxMCArMTc0LDEwIEBACiAgICAgU2FmZVJlbGVhc2UoJnBEd0ZvbnRGaWxlKTsKICAgICByZXR1cm4gTlVMTDsKIH0KLUZYX0JPT0wgQ0RXcml0ZUV4dDo6RHdDcmVhdGVSZW5kZXJpbmdUYXJnZXQoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCB2b2lkKiogcmVuZGVyVGFyZ2V0KQorYm9vbCBDRFdyaXRlRXh0OjpEd0NyZWF0ZVJlbmRlcmluZ1RhcmdldChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIHZvaWQqKiByZW5kZXJUYXJnZXQpCiB7CiAgICAgaWYgKHBCaXRtYXAtPkdldEZvcm1hdCgpID4gRlhESUJfQXJnYikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgSURXcml0ZUZhY3RvcnkqIHBEd0ZhY3RvcnkgPSAoSURXcml0ZUZhY3RvcnkqKW1fcERXcml0ZUZhY3Rvcnk7CiAgICAgSURXcml0ZUdkaUludGVyb3AqIHBHZGlJbnRlcm9wID0gTlVMTDsKQEAgLTIxMiwxNCArMjEyLDE0IEBACiAgICAgU2FmZVJlbGVhc2UoJnBHZGlJbnRlcm9wKTsKICAgICBTYWZlUmVsZWFzZSgmcEJpdG1hcFJlbmRlclRhcmdldCk7CiAgICAgU2FmZVJlbGVhc2UoJnBSZW5kZXJpbmdQYXJhbXMpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogZmFpbGVkOgogICAgIFNhZmVSZWxlYXNlKCZwR2RpSW50ZXJvcCk7CiAgICAgU2FmZVJlbGVhc2UoJnBCaXRtYXBSZW5kZXJUYXJnZXQpOwogICAgIFNhZmVSZWxlYXNlKCZwUmVuZGVyaW5nUGFyYW1zKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTAlDRFdyaXRlRXh0OjpEd1JlbmRpbmdTdHJpbmcodm9pZCogcmVuZGVyVGFyZ2V0LCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX1JFQ1QmIHN0cmluZ1JlY3QsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCitib29sCUNEV3JpdGVFeHQ6OkR3UmVuZGluZ1N0cmluZyh2b2lkKiByZW5kZXJUYXJnZXQsIENGWF9DbGlwUmduKiBwQ2xpcFJnbiwgRlhfUkVDVCYgc3RyaW5nUmVjdCwgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgRlhfQVJHQiB0ZXh0X2NvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdseXBoX2NvdW50LCB1bnNpZ25lZCBzaG9ydCogZ2x5cGhfaW5kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJhc2VsaW5lT3JpZ2luWCwgRlhfRkxPQVQgYmFzZWxpbmVPcmlnaW5ZLApAQCAtMjI3LDcgKzIyNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogZ2x5cGhfYWR2YW5jZXMpCiB7CiAgICAgaWYgKHJlbmRlclRhcmdldCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQ0R3R2RpVGV4dFJlbmRlcmVyKiBwVGV4dFJlbmRlcmVyID0gKENEd0dkaVRleHRSZW5kZXJlciopcmVuZGVyVGFyZ2V0OwogICAgIERXUklURV9NQVRSSVggdHJhbnNmb3JtOwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAgICAgZ2x5cGhSdW4uZ2x5cGhJbmRpY2VzID0gZ2x5cGhfaW5kaWNlczsKICAgICBnbHlwaFJ1bi5nbHlwaEFkdmFuY2VzID0gZ2x5cGhfYWR2YW5jZXM7CiAgICAgZ2x5cGhSdW4uZ2x5cGhPZmZzZXRzID0gKERXUklURV9HTFlQSF9PRkZTRVQqKWdseXBoX29mZnNldHM7Ci0gICAgZ2x5cGhSdW4uaXNTaWRld2F5cyA9IEZBTFNFOworICAgIGdseXBoUnVuLmlzU2lkZXdheXMgPSBmYWxzZTsKICAgICBnbHlwaFJ1bi5iaWRpTGV2ZWwgPSAwOwogICAgIGhyID0gcFRleHRSZW5kZXJlci0+RHJhd0dseXBoUnVuKAogICAgICAgICAgICAgIHN0cmluZ1JlY3QsCkBAIC0yNTgsNyArMjU4LDcgQEAKICAgICAgICAgICAgICAmZ2x5cGhSdW4sCiAgICAgICAgICAgICAgUkdCKEZYQVJHQl9SKHRleHRfY29sb3IpLCBGWEFSR0JfRyh0ZXh0X2NvbG9yKSwgRlhBUkdCX0IodGV4dF9jb2xvcikpCiAgICAgICAgICApOwotICAgIHJldHVybiBTVUNDRUVERUQoaHIpID8gVFJVRSA6IEZBTFNFOworICAgIHJldHVybiBTVUNDRUVERUQoaHIpID8gdHJ1ZSA6IGZhbHNlOwogfQogdm9pZCBDRFdyaXRlRXh0OjpEd0RlbGV0ZVJlbmRlcmluZ1RhcmdldCh2b2lkKiByZW5kZXJUYXJnZXQpCiB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2dkaXBleHQuY3BwIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9nZGlwZXh0LmNwcAppbmRleCBkNzZkNTJlLi45NGZhYzY5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2dkaXBleHQuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZ2RpcGV4dC5jcHAKQEAgLTI3NCwxMiArMjc0LDEyIEBACiAgICAgfQogICAgIHJldHVybiBOVUxMOwogfQotRlhfQk9PTCBDR2RpcGx1c0V4dDo6R2RpUmVtb3ZlRm9udE1lbVJlc291cmNlRXgodm9pZCogaGFuZGxlKQorYm9vbCBDR2RpcGx1c0V4dDo6R2RpUmVtb3ZlRm9udE1lbVJlc291cmNlRXgodm9pZCogaGFuZGxlKQogewogICAgIGlmIChtX3BHZGlSZW1vdmVGb250TWVtUmVzb3Vyc2VFeCkgewogICAgICAgICByZXR1cm4gKChGdW5jVHlwZV9HZGlSZW1vdmVGb250TWVtUmVzb3VyY2VFeCltX3BHZGlSZW1vdmVGb250TWVtUmVzb3Vyc2VFeCkoKEhBTkRMRSloYW5kbGUpOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogc3RhdGljIEdwQnJ1c2gqIF9HZGlwQ3JlYXRlQnJ1c2goRFdPUkQgYXJnYikKIHsKQEAgLTI5MSwxMSArMjkxLDExIEBACiBzdGF0aWMgQ0ZYX0RJQml0bWFwKiBfU3RyZXRjaE1vbm9Ub0dyYXkoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBTb3VyY2UsIEZYX1JFQ1QqIHBDbGlwUmVjdCkKIHsKLSAgICBGWF9CT09MIGJGbGlwWCA9IGRlc3Rfd2lkdGggPCAwOworICAgIGJvb2wgYkZsaXBYID0gZGVzdF93aWR0aCA8IDA7CiAgICAgaWYgKGJGbGlwWCkgewogICAgICAgICBkZXN0X3dpZHRoID0gLWRlc3Rfd2lkdGg7CiAgICAgfQotICAgIEZYX0JPT0wgYkZsaXBZID0gZGVzdF9oZWlnaHQgPCAwOworICAgIGJvb2wgYkZsaXBZID0gZGVzdF9oZWlnaHQgPCAwOwogICAgIGlmIChiRmxpcFkpIHsKICAgICAgICAgZGVzdF9oZWlnaHQgPSAtZGVzdF9oZWlnaHQ7CiAgICAgfQpAQCAtMzgyLDcgKzM4Miw3IEBACiAgICAgICAgIGlmIChzcmNfd2lkdGggKiBzcmNfaGVpZ2h0ID4gMTAwMDApIHsKICAgICAgICAgICAgIHBTdHJldGNoZWQgPSBfU3RyZXRjaE1vbm9Ub0dyYXkoZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIHBCaXRtYXAsICZpbWFnZV9jbGlwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBTdHJldGNoZWQgPSBwQml0bWFwLT5TdHJldGNoVG8oZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIEZBTFNFLCAmaW1hZ2VfY2xpcCk7CisgICAgICAgICAgICBwU3RyZXRjaGVkID0gcEJpdG1hcC0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBmYWxzZSwgJmltYWdlX2NsaXApOwogICAgICAgICB9CiAgICAgICAgIEdwQml0bWFwKiBiaXRtYXA7CiAgICAgICAgIENhbGxGdW5jKEdkaXBDcmVhdGVCaXRtYXBGcm9tU2NhbjApKGltYWdlX2NsaXAuV2lkdGgoKSwgaW1hZ2VfY2xpcC5IZWlnaHQoKSwKQEAgLTUzNiw3ICs1MzYsNyBAQAogICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CiAgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZVByaXZhdGVGb250Q29sbGVjdGlvbikoKEdwRm9udENvbGxlY3Rpb24qKikmcENvbGxlY3Rpb24pOwogfQotRlhfQk9PTCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUJpdG1hcChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIHZvaWQqKmJpdG1hcCkKK2Jvb2wgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCB2b2lkKipiaXRtYXApCiB7CiAgICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKICAgICBQaXhlbEZvcm1hdCBmb3JtYXQ7CkBAIC01NTEsNDEgKzU1MSw0MSBAQAogICAgICAgICAgICAgZm9ybWF0ID0gUGl4ZWxGb3JtYXQzMmJwcEFSR0I7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgR3BTdGF0dXMgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21TY2FuMCkocEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCksCiAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcC0+R2V0UGl0Y2goKSwgZm9ybWF0LCBwQml0bWFwLT5HZXRCdWZmZXIoKSwgKEdwQml0bWFwKiopYml0bWFwKTsKICAgICBpZiAoc3RhdHVzID09IE9rKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVGcm9tSW1hZ2Uodm9pZCogYml0bWFwLCB2b2lkKiogZ3JhcGhpY3MpCitib29sIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlRnJvbUltYWdlKHZvaWQqIGJpdG1hcCwgdm9pZCoqIGdyYXBoaWNzKQogewogICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CiAgICAgR3BTdGF0dXMgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcEdldEltYWdlR3JhcGhpY3NDb250ZXh0KSgoR3BCaXRtYXAqKWJpdG1hcCwgKEdwR3JhcGhpY3MqKilncmFwaGljcyk7CiAgICAgaWYgKHN0YXR1cyA9PSBPaykgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKGNvbnN0IEZYX1dDSEFSKiBuYW1lLCB2b2lkKiBwRm9udENvbGxlY3Rpb24sIHZvaWQqKnBGYW1pbHkpCitib29sIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKGNvbnN0IEZYX1dDSEFSKiBuYW1lLCB2b2lkKiBwRm9udENvbGxlY3Rpb24sIHZvaWQqKnBGYW1pbHkpCiB7CiAgICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKICAgICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKSgoR0RJUENPTlNUIFdDSEFSICopbmFtZSwgKEdwRm9udENvbGxlY3Rpb24qKXBGb250Q29sbGVjdGlvbiwgKEdwRm9udEZhbWlseSoqKXBGYW1pbHkpOwogICAgIGlmIChzdGF0dXMgPT0gT2spIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUZvbnRGcm9tRmFtaWx5KHZvaWQqIHBGYW1pbHksIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgaW50IGZvbnRzdHlsZSwgaW50IGZsYWcsIHZvaWQqKiBwRm9udCkKK2Jvb2wgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVGb250RnJvbUZhbWlseSh2b2lkKiBwRmFtaWx5LCBGWF9GTE9BVCBmb250X3NpemUsIGludCBmb250c3R5bGUsIGludCBmbGFnLCB2b2lkKiogcEZvbnQpCiB7CiAgICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKICAgICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwQ3JlYXRlRm9udCkoKEdwRm9udEZhbWlseSopcEZhbWlseSwgZm9udF9zaXplLCBmb250c3R5bGUsIFVuaXQoZmxhZyksIChHcEZvbnQqKilwRm9udCk7CiAgICAgaWYgKHN0YXR1cyA9PSBPaykgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiB2b2lkIENHZGlwbHVzRXh0OjpHZGlwR2V0Rm9udFNpemUodm9pZCAqcEZvbnQsIEZYX0ZMT0FUICpzaXplKQogewpAQCAtNjA4LDE2ICs2MDgsMTYgQEAKICAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwogICAgIENhbGxGdW5jKEdkaXBTZXRQYWdlVW5pdCkoKEdwR3JhcGhpY3MqKWdyYXBoaWNzLCAoR3BVbml0KXVuaXQpOwogfQotRlhfQk9PTCBDR2RpcGx1c0V4dDo6R2RpcERyYXdEcml2ZXJTdHJpbmcodm9pZCAqZ3JhcGhpY3MsICB1bnNpZ25lZCBzaG9ydCAqdGV4dCwgaW50IGxlbmd0aCwKK2Jvb2wgQ0dkaXBsdXNFeHQ6OkdkaXBEcmF3RHJpdmVyU3RyaW5nKHZvaWQgKmdyYXBoaWNzLCAgdW5zaWduZWQgc2hvcnQgKnRleHQsIGludCBsZW5ndGgsCiAgICAgICAgIHZvaWQgKmZvbnQsIHZvaWQqIGJydXNoLCB2b2lkICpwb3NpdGlvbnMsIGludCBmbGFncywgY29uc3Qgdm9pZCAqbWF0cml4KQogewogICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CiAgICAgR3BTdGF0dXMgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcERyYXdEcml2ZXJTdHJpbmcpKChHcEdyYXBoaWNzKilncmFwaGljcywgKEdESVBDT05TVCBVSU5UMTYgKil0ZXh0LCAoSU5UKWxlbmd0aCwgKEdESVBDT05TVCBHcEZvbnQgKilmb250LCAoR0RJUENPTlNUIEdwQnJ1c2gqKWJydXNoLAogICAgICAgICAgICAgICAgICAgICAgIChHRElQQ09OU1QgUG9pbnRGICopcG9zaXRpb25zLCAoSU5UKWZsYWdzLCAoR0RJUENPTlNUIEdwTWF0cml4ICopbWF0cml4KTsKICAgICBpZiAoc3RhdHVzID09IE9rKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIHZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVCcnVzaChGWF9EV09SRCBmaWxsX2FyZ2IsIHZvaWQqKiBwQnJ1c2gpCiB7CkBAIC02ODQsNyArNjg0LDcgQEAKICAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwogICAgIENhbGxGdW5jKEdkaXBEZWxldGVHcmFwaGljcykoKEdwR3JhcGhpY3MqKWdyYXBoaWNzKTsKIH0KLUZYX0JPT0wgQ0dkaXBsdXNFeHQ6OlN0cmV0Y2hCaXRNYXNrKEhEQyBoREMsIEJPT0wgYk1vbm9EZXZpY2UsIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorYm9vbCBDR2RpcGx1c0V4dDo6U3RyZXRjaEJpdE1hc2soSERDIGhEQywgQk9PTCBiTW9ub0RldmljZSwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBhcmdiLCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIGludCBmbGFncykKIHsKICAgICBBU1NFUlQocEJpdG1hcC0+R2V0QlBQKCkgPT0gMSk7CkBAIC02OTksOSArNjk5LDkgQEAKICAgICB9CiAgICAgT3V0cHV0SW1hZ2VNYXNrKHBHcmFwaGljcywgYk1vbm9EZXZpY2UsIHBCaXRtYXAsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBhcmdiLCBwQ2xpcFJlY3QpOwogICAgIENhbGxGdW5jKEdkaXBEZWxldGVHcmFwaGljcykocEdyYXBoaWNzKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0dkaXBsdXNFeHQ6OlN0cmV0Y2hESUJpdHMoSERDIGhEQywgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCitib29sIENHZGlwbHVzRXh0OjpTdHJldGNoRElCaXRzKEhEQyBoREMsIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIGludCBmbGFncykKIHsKICAgICBHcEdyYXBoaWNzKiBwR3JhcGhpY3M7CkBAIC03MTksOSArNzE5LDkgQEAKICAgICBPdXRwdXRJbWFnZShwR3JhcGhpY3MsIHBCaXRtYXAsICZzcmNfcmVjdCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpOwogICAgIENhbGxGdW5jKEdkaXBEZWxldGVHcmFwaGljcykocEdyYXBoaWNzKTsKICAgICBDYWxsRnVuYyhHZGlwRGVsZXRlR3JhcGhpY3MpKHBHcmFwaGljcyk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1zdGF0aWMgR3BQZW4qIF9HZGlwQ3JlYXRlUGVuKGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIERXT1JEIGFyZ2IsIEZYX0JPT0wgYlRleHRNb2RlID0gRkFMU0UpCitzdGF0aWMgR3BQZW4qIF9HZGlwQ3JlYXRlUGVuKGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIERXT1JEIGFyZ2IsIGJvb2wgYlRleHRNb2RlID0gZmFsc2UpCiB7CiAgICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKICAgICBGWF9GTE9BVCB3aWR0aCA9IHBHcmFwaFN0YXRlID8gcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoIDogMS4wZjsKQEAgLTczNSw3ICs3MzUsNyBAQAogICAgIENhbGxGdW5jKEdkaXBDcmVhdGVQZW4xKSgoQVJHQilhcmdiLCB3aWR0aCwgVW5pdFdvcmxkLCAmcFBlbik7CiAgICAgTGluZUNhcCBsaW5lQ2FwOwogICAgIERhc2hDYXAgZGFzaENhcCA9IERhc2hDYXBGbGF0OwotICAgIEZYX0JPT0wgYkRhc2hFeHRlbmQgPSBGQUxTRTsKKyAgICBib29sIGJEYXNoRXh0ZW5kID0gZmFsc2U7CiAgICAgc3dpdGNoKHBHcmFwaFN0YXRlLT5tX0xpbmVDYXApIHsKICAgICAgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBCdXR0OgogICAgICAgICAgICAgbGluZUNhcCA9IExpbmVDYXBGbGF0OwpAQCAtNzQzLDExICs3NDMsMTEgQEAKICAgICAgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBSb3VuZDoKICAgICAgICAgICAgIGxpbmVDYXAgPSBMaW5lQ2FwUm91bmQ7CiAgICAgICAgICAgICBkYXNoQ2FwID0gRGFzaENhcFJvdW5kOwotICAgICAgICAgICAgYkRhc2hFeHRlbmQgPSBUUlVFOworICAgICAgICAgICAgYkRhc2hFeHRlbmQgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwU3F1YXJlOgogICAgICAgICAgICAgbGluZUNhcCA9IExpbmVDYXBTcXVhcmU7Ci0gICAgICAgICAgICBiRGFzaEV4dGVuZCA9IFRSVUU7CisgICAgICAgICAgICBiRGFzaEV4dGVuZCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAgICAgQ2FsbEZ1bmMoR2RpcFNldFBlbkxpbmVDYXAxOTc4MTkpKHBQZW4sIGxpbmVDYXAsIGxpbmVDYXAsIGRhc2hDYXApOwpAQCAtODM5LDEwICs4MzksMTAgQEAKICAgICAgICAgaWYgKGRpc3RhbmNlX3NxdWFyZSA8ICgxLjBmICogMiArIDEuMGYgLyA0KSkgewogICAgICAgICAgICAgdjEgPSBpOwogICAgICAgICAgICAgdjIgPSBwYWlyMTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIEJPT0wgQ0dkaXBsdXNFeHQ6OkRyYXdQYXRoKEhEQyBoREMsIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCkBAIC04NTQsNyArODU0LDcgQEAKIHsKICAgICBpbnQgblBvaW50cyA9IHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpOwogICAgIGlmIChuUG9pbnRzID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBGWF9QQVRIUE9JTlQqIHBQb2ludHMgPSBwUGF0aERhdGEtPkdldFBvaW50cygpOwogICAgIEdwR3JhcGhpY3MqIHBHcmFwaGljcyA9IE5VTEw7CkBAIC04NzAsOSArODcwLDkgQEAKICAgICBQb2ludEYgKnBvaW50cyA9IEZYX0FsbG9jKFBvaW50RiwgblBvaW50cyk7CiAgICAgQllURSAqIHR5cGVzICA9IEZYX0FsbG9jKEJZVEUsIG5Qb2ludHMpOwogICAgIGludCBuU3ViUGF0aGVzID0gMDsKLSAgICBGWF9CT09MIGJTdWJDbG9zZSA9IEZBTFNFOworICAgIGJvb2wgYlN1YkNsb3NlID0gZmFsc2U7CiAgICAgaW50IHBvc19zdWJjbG9zZSA9IDA7Ci0gICAgRlhfQk9PTCBiU21vb3RoID0gRkFMU0U7CisgICAgYm9vbCBiU21vb3RoID0gZmFsc2U7CiAgICAgaW50IHN0YXJ0cG9pbnQgPSAwOwogICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuUG9pbnRzOyBpKyspIHsKICAgICAgICAgcG9pbnRzW2ldLlggPSBwUG9pbnRzW2ldLm1fUG9pbnRYOwpAQCAtOTAwLDcgKzkwMCw3IEBACiAgICAgICAgIGlmKHBvaW50X3R5cGUgPT0gRlhQVF9NT1ZFVE8pIHsKICAgICAgICAgICAgIHR5cGVzW2ldID0gUGF0aFBvaW50VHlwZVN0YXJ0OwogICAgICAgICAgICAgblN1YlBhdGhlcyArKzsKLSAgICAgICAgICAgIGJTdWJDbG9zZSA9IEZBTFNFOworICAgICAgICAgICAgYlN1YkNsb3NlID0gZmFsc2U7CiAgICAgICAgICAgICBzdGFydHBvaW50ID0gaTsKICAgICAgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfTElORVRPKSB7CiAgICAgICAgICAgICB0eXBlc1tpXSA9IFBhdGhQb2ludFR5cGVMaW5lOwpAQCAtOTEwLDMxICs5MTAsMzEgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghYlNtb290aCAmJiBwb2ludHNbaV0uWCAhPSBwb2ludHNbaSAtIDFdLlggJiYgcG9pbnRzW2ldLlkgIT0gcG9pbnRzW2kgLSAxXS5ZKSB7Ci0gICAgICAgICAgICAgICAgYlNtb290aCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYlNtb290aCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAocG9pbnRfdHlwZSA9PSBGWFBUX0JFWklFUlRPKQl7CiAgICAgICAgICAgICB0eXBlc1tpXSA9IFBhdGhQb2ludFR5cGVCZXppZXI7Ci0gICAgICAgICAgICBiU21vb3RoID0gVFJVRTsKKyAgICAgICAgICAgIGJTbW9vdGggPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChwUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpIHsKICAgICAgICAgICAgIGlmIChiU3ViQ2xvc2UpIHsKICAgICAgICAgICAgICAgICB0eXBlc1twb3Nfc3ViY2xvc2VdICY9IH5QYXRoUG9pbnRUeXBlQ2xvc2VTdWJwYXRoOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiU3ViQ2xvc2UgPSBUUlVFOworICAgICAgICAgICAgICAgIGJTdWJDbG9zZSA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwb3Nfc3ViY2xvc2UgPSBpOwogICAgICAgICAgICAgdHlwZXNbaV0gfD0gUGF0aFBvaW50VHlwZUNsb3NlU3VicGF0aDsKICAgICAgICAgICAgIGlmICghYlNtb290aCAmJiBwb2ludHNbaV0uWCAhPSBwb2ludHNbc3RhcnRwb2ludF0uWCAmJiBwb2ludHNbaV0uWSAhPSBwb2ludHNbc3RhcnRwb2ludF0uWSkgewotICAgICAgICAgICAgICAgIGJTbW9vdGggPSBUUlVFOworICAgICAgICAgICAgICAgIGJTbW9vdGggPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIGlmIChmaWxsX21vZGUgJiBGWEZJTExfTk9QQVRIU01PT1RIKSB7Ci0gICAgICAgIGJTbW9vdGggPSBGQUxTRTsKKyAgICAgICAgYlNtb290aCA9IGZhbHNlOwogICAgICAgICBDYWxsRnVuYyhHZGlwU2V0U21vb3RoaW5nTW9kZSkocEdyYXBoaWNzLCBTbW9vdGhpbmdNb2RlTm9uZSk7CiAgICAgfSBlbHNlIGlmICghKGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIpKSB7CiAgICAgICAgIGlmICghYlNtb290aCAmJiAoZmlsbF9tb2RlICYgMykpIHsKLSAgICAgICAgICAgIGJTbW9vdGggPSBUUlVFOworICAgICAgICAgICAgYlNtb290aCA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJTbW9vdGggfHwgKHBHcmFwaFN0YXRlICYmIHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCA+IDIpKSB7CiAgICAgICAgICAgICBDYWxsRnVuYyhHZGlwU2V0U21vb3RoaW5nTW9kZSkocEdyYXBoaWNzLCBTbW9vdGhpbmdNb2RlQW50aUFsaWFzKTsKQEAgLTk0OSw3ICs5NDksNyBAQAogICAgICAgICAgICAgQ2FsbEZ1bmMoR2RpcERyYXdMaW5lSSkocEdyYXBoaWNzLCBwUGVuLCBGWFNZU19yb3VuZChwb2ludHNbdjFdLlgpLCBGWFNZU19yb3VuZChwb2ludHNbdjFdLlkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQocG9pbnRzW3YyXS5YKSwgRlhTWVNfcm91bmQocG9pbnRzW3YyXS5ZKSk7CiAgICAgICAgICAgICBDYWxsRnVuYyhHZGlwRGVsZXRlUGVuKShwUGVuKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgR3BQYXRoKiBwR3BQYXRoID0gTlVMTDsKQEAgLTk2MSw3ICs5NjEsNyBAQAogICAgICAgICBGWF9GcmVlKHBvaW50cyk7CiAgICAgICAgIEZYX0ZyZWUodHlwZXMpOwogICAgICAgICBDYWxsRnVuYyhHZGlwRGVsZXRlR3JhcGhpY3MpKHBHcmFwaGljcyk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobmV3X2ZpbGxfbW9kZSkgewogICAgICAgICBHcEJydXNoKiBwQnJ1c2ggPSBfR2RpcENyZWF0ZUJydXNoKGZpbGxfYXJnYik7CkBAIC05OTQsNyArOTk0LDcgQEAKICAgICBGWF9GcmVlKHR5cGVzKTsKICAgICBDYWxsRnVuYyhHZGlwRGVsZXRlUGF0aCkocEdwUGF0aCk7CiAgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUdyYXBoaWNzKShwR3JhcGhpY3MpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogY2xhc3MgR3BTdHJlYW0gZmluYWwgOiBwdWJsaWMgSVN0cmVhbQogewpAQCAtMTIyOSw3ICsxMjI5LDcgQEAKICAgICB9CiAgICAgRlhfRnJlZShwSW5mbyk7CiB9Ci1DRlhfRElCaXRtYXAqIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKEJJVE1BUElORk8qIHBibWksIExQVk9JRCBwRGF0YSwgRlhfQk9PTCBiQWxwaGEpOworQ0ZYX0RJQml0bWFwKiBfRlhfV2luZG93c0RJQl9Mb2FkRnJvbUJ1ZihCSVRNQVBJTkZPKiBwYm1pLCBMUFZPSUQgcERhdGEsIGJvb2wgYkFscGhhKTsKIENGWF9ESUJpdG1hcCogQ0dkaXBsdXNFeHQ6OkxvYWRESUJpdG1hcChXSU5ESUJfT3Blbl9BcmdzXyBhcmdzKQogewogICAgIFBSRVZJRVczX0RJQklUTUFQKiBwSW5mbyA9IDo6TG9hZERJQml0bWFwKGFyZ3MpOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9wcmludC5jcHAgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX3ByaW50LmNwcAppbmRleCA4NmRiZjliLi42M2MzODQ5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX3ByaW50LmNwcAorKysgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX3ByaW50LmNwcApAQCAtMTgsNyArMTgsNyBAQAogewogICAgIG1fSG9yelNpemUgPSA6OkdldERldmljZUNhcHMobV9oREMsIEhPUlpTSVpFKTsKICAgICBtX1ZlcnRTaXplID0gOjpHZXREZXZpY2VDYXBzKG1faERDLCBWRVJUU0laRSk7Ci0gICAgbV9iU3VwcG9ydFJPUCA9IFRSVUU7CisgICAgbV9iU3VwcG9ydFJPUCA9IHRydWU7CiB9CiBpbnQgQ0dkaVByaW50ZXJEcml2ZXI6OkdldERldmljZUNhcHMoaW50IGNhcHNfaWQpCiB7CkBAIC0zMCw3ICszMCw3IEBACiAgICAgfQogICAgIHJldHVybiBDR2RpRGV2aWNlRHJpdmVyOjpHZXREZXZpY2VDYXBzKGNhcHNfaWQpOwogfQotRlhfQk9PTCBDR2RpUHJpbnRlckRyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAorYm9vbCBDR2RpUHJpbnRlckRyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChwU291cmNlLT5Jc0FscGhhTWFzaygpKSB7CkBAIC00MSwyOCArNDEsMjggQEAKICAgICBBU1NFUlQocFNvdXJjZSAhPSBOVUxMICYmICFwU291cmNlLT5Jc0FscGhhTWFzaygpICYmIHBTcmNSZWN0ICE9IE5VTEwpOwogICAgIEFTU0VSVChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCk7CiAgICAgaWYgKHBTb3VyY2UtPkhhc0FscGhhKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9ESUJFeHRyYWN0b3IgdGVtcChwU291cmNlKTsKICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSB0ZW1wOwogICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBHRElfU2V0RElCaXRzKHBCaXRtYXAsIHBTcmNSZWN0LCBsZWZ0LCB0b3AsIHBJY2NUcmFuc2Zvcm0pOwogfQotRlhfQk9PTCBDR2RpUHJpbnRlckRyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorYm9vbCBDR2RpUHJpbnRlckRyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCiB7CiAgICAgaWYgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKICAgICAgICAgaW50IGFscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoY29sb3IpOwogICAgICAgICBpZiAocFNvdXJjZS0+R2V0QlBQKCkgIT0gMSB8fCBhbHBoYSAhPSAyNTUgfHwgIW1fYlN1cHBvcnRST1ApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoZGVzdF93aWR0aCA8IDAgfHwgZGVzdF9oZWlnaHQgPCAwKSB7CiAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBGbGlwcGVkID0gcFNvdXJjZS0+RmxpcEltYWdlKGRlc3Rfd2lkdGggPCAwLCBkZXN0X2hlaWdodCA8IDApOwogICAgICAgICAgICAgaWYgKHBGbGlwcGVkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGRlc3Rfd2lkdGggPCAwKSB7CiAgICAgICAgICAgICAgICAgZGVzdF9sZWZ0ICs9IGRlc3Rfd2lkdGg7CkBAIC03MCwyNCArNzAsMjQgQEAKICAgICAgICAgICAgIGlmIChkZXN0X2hlaWdodCA8IDApIHsKICAgICAgICAgICAgICAgICBkZXN0X3RvcCArPSBkZXN0X2hlaWdodDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0JPT0wgcmV0ID0gR0RJX1N0cmV0Y2hCaXRNYXNrKHBGbGlwcGVkLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBhYnMoZGVzdF93aWR0aCksIGFicyhkZXN0X2hlaWdodCksIGNvbG9yLCBmbGFncywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgICAgICAgICAgICBib29sIHJldCA9IEdESV9TdHJldGNoQml0TWFzayhwRmxpcHBlZCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgYWJzKGRlc3Rfd2lkdGgpLCBhYnMoZGVzdF9oZWlnaHQpLCBjb2xvciwgZmxhZ3MsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogICAgICAgICAgICAgZGVsZXRlIHBGbGlwcGVkOwogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgICAgICBDRlhfRElCRXh0cmFjdG9yIHRlbXAocFNvdXJjZSk7CiAgICAgICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHRlbXA7CiAgICAgICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gR0RJX1N0cmV0Y2hCaXRNYXNrKHBCaXRtYXAsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBjb2xvciwgZmxhZ3MsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogICAgIH0KICAgICBpZiAocFNvdXJjZS0+SGFzQWxwaGEoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKGRlc3Rfd2lkdGggPCAwIHx8IGRlc3RfaGVpZ2h0IDwgMCkgewogICAgICAgICBDRlhfRElCaXRtYXAqIHBGbGlwcGVkID0gcFNvdXJjZS0+RmxpcEltYWdlKGRlc3Rfd2lkdGggPCAwLCBkZXN0X2hlaWdodCA8IDApOwogICAgICAgICBpZiAocEZsaXBwZWQgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChkZXN0X3dpZHRoIDwgMCkgewogICAgICAgICAgICAgZGVzdF9sZWZ0ICs9IGRlc3Rfd2lkdGg7CkBAIC05NSwxNCArOTUsMTQgQEAKICAgICAgICAgaWYgKGRlc3RfaGVpZ2h0IDwgMCkgewogICAgICAgICAgICAgZGVzdF90b3AgKz0gZGVzdF9oZWlnaHQ7CiAgICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCByZXQgPSBHRElfU3RyZXRjaERJQml0cyhwRmxpcHBlZCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgYWJzKGRlc3Rfd2lkdGgpLCBhYnMoZGVzdF9oZWlnaHQpLCBmbGFncywgcEljY1RyYW5zZm9ybSk7CisgICAgICAgIGJvb2wgcmV0ID0gR0RJX1N0cmV0Y2hESUJpdHMocEZsaXBwZWQsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGFicyhkZXN0X3dpZHRoKSwgYWJzKGRlc3RfaGVpZ2h0KSwgZmxhZ3MsIHBJY2NUcmFuc2Zvcm0pOwogICAgICAgICBkZWxldGUgcEZsaXBwZWQ7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIENGWF9ESUJFeHRyYWN0b3IgdGVtcChwU291cmNlKTsKICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSB0ZW1wOwogICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBHRElfU3RyZXRjaERJQml0cyhwQml0bWFwLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgZmxhZ3MsIHBJY2NUcmFuc2Zvcm0pOwogfQpAQCAtMTg5LDE4ICsxODksMTggQEAKICAgICB9CiAgICAgcmV0dXJuIHBUZW1wQml0bWFwOwogfQotRlhfQk9PTAlDR2RpUHJpbnRlckRyaXZlcjo6U3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCitib29sCUNHZGlQcmludGVyRHJpdmVyOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIHJlbmRlcl9mbGFncywgdm9pZComIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKIHsKICAgICBpZiAoYml0bWFwX2FscGhhIDwgMjU1IHx8IHBTb3VyY2UtPkhhc0FscGhhKCkgfHwgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkgJiYgKHBTb3VyY2UtPkdldEJQUCgpICE9IDEgfHwgIW1fYlN1cHBvcnRST1ApKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX0Zsb2F0UmVjdCB1bml0X3JlY3QgPSBwTWF0cml4LT5HZXRVbml0UmVjdCgpOwogICAgIEZYX1JFQ1QgZnVsbF9yZWN0ID0gdW5pdF9yZWN0LkdldE91dHRlclJlY3QoKTsKICAgICBpZiAoRlhTWVNfZmFicyhwTWF0cml4LT5iKSA8IDAuNWYgJiYgcE1hdHJpeC0+YSAhPSAwICYmIEZYU1lTX2ZhYnMocE1hdHJpeC0+YykgPCAwLjVmICYmIHBNYXRyaXgtPmQgIT0gMCkgewotICAgICAgICBGWF9CT09MIGJGbGlwWCA9IHBNYXRyaXgtPmEgPCAwOwotICAgICAgICBGWF9CT09MIGJGbGlwWSA9IHBNYXRyaXgtPmQgPiAwOworICAgICAgICBib29sIGJGbGlwWCA9IHBNYXRyaXgtPmEgPCAwOworICAgICAgICBib29sIGJGbGlwWSA9IHBNYXRyaXgtPmQgPiAwOwogICAgICAgICByZXR1cm4gU3RyZXRjaERJQml0cyhwU291cmNlLCBjb2xvciwgYkZsaXBYID8gZnVsbF9yZWN0LnJpZ2h0IDogZnVsbF9yZWN0LmxlZnQsIGJGbGlwWSA/IGZ1bGxfcmVjdC5ib3R0b20gOiBmdWxsX3JlY3QudG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRmxpcFggPyAtZnVsbF9yZWN0LldpZHRoKCkgOiBmdWxsX3JlY3QuV2lkdGgoKSwgYkZsaXBZID8gLWZ1bGxfcmVjdC5IZWlnaHQoKSA6IGZ1bGxfcmVjdC5IZWlnaHQoKSwgTlVMTCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7CkBAIC0yMDgsOSArMjA4LDkgQEAKICAgICBpZiAoRlhTWVNfZmFicyhwTWF0cml4LT5hKSA8IDAuNWYgJiYgRlhTWVNfZmFicyhwTWF0cml4LT5kKSA8IDAuNWYpIHsKICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwVHJhbnNmb3JtZWQgPSBwU291cmNlLT5Td2FwWFkocE1hdHJpeC0+YyA+IDAsIHBNYXRyaXgtPmIgPCAwKTsKICAgICAgICAgaWYgKHBUcmFuc2Zvcm1lZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCByZXQgPSBTdHJldGNoRElCaXRzKHBUcmFuc2Zvcm1lZCwgY29sb3IsIGZ1bGxfcmVjdC5sZWZ0LCBmdWxsX3JlY3QudG9wLCBmdWxsX3JlY3QuV2lkdGgoKSwgZnVsbF9yZWN0LkhlaWdodCgpLCBOVUxMLCAwLAorICAgICAgICBib29sIHJldCA9IFN0cmV0Y2hESUJpdHMocFRyYW5zZm9ybWVkLCBjb2xvciwgZnVsbF9yZWN0LmxlZnQsIGZ1bGxfcmVjdC50b3AsIGZ1bGxfcmVjdC5XaWR0aCgpLCBmdWxsX3JlY3QuSGVpZ2h0KCksIE5VTEwsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKICAgICAgICAgZGVsZXRlIHBUcmFuc2Zvcm1lZDsKICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTIxOCwyMCArMjE4LDIwIEBACiAgICAgaWYgKHBTb3VyY2UtPkdldEJQUCgpID09IDEpIHsKICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwVHJhbnNmb3JtZWQgPSBUcmFuc2Zvcm0xYnBwQml0bWFwKHBTb3VyY2UsIHBNYXRyaXgpOwogICAgICAgICBpZiAocEljY1RyYW5zZm9ybSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgU2F2ZVN0YXRlKCk7CiAgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoOwogICAgICAgICBwYXRoLkFwcGVuZFJlY3QoMCwgMCwgMS4wZiwgMS4wZik7CiAgICAgICAgIFNldENsaXBfUGF0aEZpbGwoJnBhdGgsIHBNYXRyaXgsIFdJTkRJTkcpOwotICAgICAgICBGWF9CT09MIHJldCA9IFN0cmV0Y2hESUJpdHMocFRyYW5zZm9ybWVkLCBjb2xvciwgZnVsbF9yZWN0LmxlZnQsIGZ1bGxfcmVjdC50b3AsIGZ1bGxfcmVjdC5XaWR0aCgpLCBmdWxsX3JlY3QuSGVpZ2h0KCksIE5VTEwsIDAsCisgICAgICAgIGJvb2wgcmV0ID0gU3RyZXRjaERJQml0cyhwVHJhbnNmb3JtZWQsIGNvbG9yLCBmdWxsX3JlY3QubGVmdCwgZnVsbF9yZWN0LnRvcCwgZnVsbF9yZWN0LldpZHRoKCksIGZ1bGxfcmVjdC5IZWlnaHQoKSwgTlVMTCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpOwogICAgICAgICBSZXN0b3JlU3RhdGUoKTsKICAgICAgICAgZGVsZXRlIHBUcmFuc2Zvcm1lZDsKICAgICAgICAgaGFuZGxlID0gTlVMTDsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIENQU091dHB1dDo6Q1BTT3V0cHV0KEhEQyBoREMpCiB7CkBAIC0yNjYsMTQgKzI2NiwxNCBAQAogQ1BTUHJpbnRlckRyaXZlcjo6Q1BTUHJpbnRlckRyaXZlcigpCiB7CiAgICAgbV9wUFNPdXRwdXQgPSBOVUxMOwotICAgIG1fYkNteWtPdXRwdXQgPSBGQUxTRTsKKyAgICBtX2JDbXlrT3V0cHV0ID0gZmFsc2U7CiB9CiBDUFNQcmludGVyRHJpdmVyOjp+Q1BTUHJpbnRlckRyaXZlcigpCiB7CiAgICAgRW5kUmVuZGVyaW5nKCk7CiAgICAgZGVsZXRlIG1fcFBTT3V0cHV0OwogfQotRlhfQk9PTCBDUFNQcmludGVyRHJpdmVyOjpJbml0KEhEQyBoREMsIGludCBwc2xldmVsLCBGWF9CT09MIGJDbXlrT3V0cHV0KQorYm9vbCBDUFNQcmludGVyRHJpdmVyOjpJbml0KEhEQyBoREMsIGludCBwc2xldmVsLCBib29sIGJDbXlrT3V0cHV0KQogewogICAgIG1faERDID0gaERDOwogICAgIG1fSG9yelNpemUgPSA6OkdldERldmljZUNhcHMobV9oREMsIEhPUlpTSVpFKTsKQEAgLTMwNSw3ICszMDUsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIDo6RGVsZXRlT2JqZWN0KGhSZ24pOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogaW50IENQU1ByaW50ZXJEcml2ZXI6OkdldERldmljZUNhcHMoaW50IGNhcHNfaWQpCiB7CkBAIC0zMjcsNyArMzI3LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9Ci1GWF9CT09MIENQU1ByaW50ZXJEcml2ZXI6OlN0YXJ0UmVuZGVyaW5nKCkKK2Jvb2wgQ1BTUHJpbnRlckRyaXZlcjo6U3RhcnRSZW5kZXJpbmcoKQogewogICAgIHJldHVybiBtX1BTUmVuZGVyZXIuU3RhcnRSZW5kZXJpbmcoKTsKIH0KQEAgLTMzOSw2OSArMzM5LDY5IEBACiB7CiAgICAgbV9QU1JlbmRlcmVyLlNhdmVTdGF0ZSgpOwogfQotdm9pZCBDUFNQcmludGVyRHJpdmVyOjpSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKQordm9pZCBDUFNQcmludGVyRHJpdmVyOjpSZXN0b3JlU3RhdGUoYm9vbCBiS2VlcFNhdmVkKQogewogICAgIG1fUFNSZW5kZXJlci5SZXN0b3JlU3RhdGUoYktlZXBTYXZlZCk7CiB9Ci1GWF9CT09MCUNQU1ByaW50ZXJEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorYm9vbAlDUFNQcmludGVyRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgaW50IGZpbGxfbW9kZSkKIHsKICAgICBtX1BTUmVuZGVyZXIuU2V0Q2xpcF9QYXRoRmlsbChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBmaWxsX21vZGUpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTAlDUFNQcmludGVyRHJpdmVyOjpTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCitib29sCUNQU1ByaW50ZXJEcml2ZXI6OlNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUpCiB7CiAgICAgbV9QU1JlbmRlcmVyLlNldENsaXBfUGF0aFN0cm9rZShwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBwR3JhcGhTdGF0ZSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MCUNQU1ByaW50ZXJEcml2ZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorYm9vbAlDUFNQcmludGVyRHJpdmVyOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsIEZYX0FSR0IgZmlsbF9jb2xvciwgRlhfQVJHQiBzdHJva2VfY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKIHsKICAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBtX1BTUmVuZGVyZXIuRHJhd1BhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwgcEdyYXBoU3RhdGUsIGZpbGxfY29sb3IsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlICYgMywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiB9Ci1GWF9CT09MIENQU1ByaW50ZXJEcml2ZXI6OkdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpCitib29sIENQU1ByaW50ZXJEcml2ZXI6OkdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpCiB7CiAgICAgKnBSZWN0ID0gbV9QU1JlbmRlcmVyLkdldENsaXBCb3goKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BTUHJpbnRlckRyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAorYm9vbCBDUFNQcmludGVyRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBtX1BTUmVuZGVyZXIuU2V0RElCaXRzKHBCaXRtYXAsIGNvbG9yLCBsZWZ0LCB0b3AsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQotRlhfQk9PTCBDUFNQcmludGVyRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCitib29sIENQU1ByaW50ZXJEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKIHsKICAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBtX1BTUmVuZGVyZXIuU3RyZXRjaERJQml0cyhwQml0bWFwLCBjb2xvciwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGZsYWdzLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KLUZYX0JPT0wJQ1BTUHJpbnRlckRyaXZlcjo6U3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCitib29sCUNQU1ByaW50ZXJEcml2ZXI6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCByZW5kZXJfZmxhZ3MsIHZvaWQqJiBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKIHsKICAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChiaXRtYXBfYWxwaGEgPCAyNTUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGhhbmRsZSA9IE5VTEw7CiAgICAgcmV0dXJuIG1fUFNSZW5kZXJlci5EcmF3RElCaXRzKHBCaXRtYXAsIGNvbG9yLCBwTWF0cml4LCByZW5kZXJfZmxhZ3MsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQotRlhfQk9PTAlDUFNQcmludGVyRHJpdmVyOjpEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKK2Jvb2wJQ1BTUHJpbnRlckRyaXZlcjo6RHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCiAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS93aW4zMi93aW4zMl9pbnQuaCBiL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvd2luMzJfaW50LmgKaW5kZXggNTY5YzRmNi4uZjliNmE2MyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS93aW4zMi93aW4zMl9pbnQuaAorKysgYi9jb3JlL3NyYy9meGdlL3dpbjMyL3dpbjMyX2ludC5oCkBAIC0xMywxNSArMTMsMTUgQEAKICAgICBDR2RpcGx1c0V4dCgpOwogICAgIH5DR2RpcGx1c0V4dCgpOwogICAgIHZvaWQJCQlMb2FkKCk7Ci0gICAgRlhfQk9PTAkJCUlzQXZhaWxhYmxlKCkKKyAgICBib29sCQkJSXNBdmFpbGFibGUoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1faE1vZHVsZSAhPSBOVUxMOwogICAgIH0KLSAgICBGWF9CT09MCQkJU3RyZXRjaEJpdE1hc2soSERDIGhEQywgQk9PTCBiTW9ub0RldmljZSwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisgICAgYm9vbAkJCVN0cmV0Y2hCaXRNYXNrKEhEQyBoREMsIEJPT0wgYk1vbm9EZXZpY2UsIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBhcmdiLCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIGludCBmbGFncyk7Ci0gICAgRlhfQk9PTAkJCVN0cmV0Y2hESUJpdHMoSERDIGhEQywgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisgICAgYm9vbAkJCVN0cmV0Y2hESUJpdHMoSERDIGhEQywgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBpbnQgZmxhZ3MpOwotICAgIEZYX0JPT0wJCQlEcmF3UGF0aChIREMgaERDLCBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICBib29sCQkJRHJhd1BhdGgoSERDIGhEQywgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2FyZ2IsCkBAIC0zMSwyNiArMzEsMjYgQEAKIAogICAgIHZvaWQqCQkJTG9hZE1lbUZvbnQodWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUpOwogICAgIHZvaWQJCQlEZWxldGVNZW1Gb250KHZvaWQqIHBGb250Q29sbGVjdGlvbik7Ci0gICAgRlhfQk9PTCAgICAgICAgIEdkaXBDcmVhdGVGcm9tSW1hZ2Uodm9pZCogYml0bWFwLCB2b2lkKiogZ3JhcGhpY3MpOworICAgIGJvb2wgICAgICAgICBHZGlwQ3JlYXRlRnJvbUltYWdlKHZvaWQqIGJpdG1hcCwgdm9pZCoqIGdyYXBoaWNzKTsKICAgICB2b2lkICAgICAgICAgICAgR2RpcERlbGV0ZUdyYXBoaWNzKHZvaWQqIGdyYXBoaWNzKTsKICAgICB2b2lkICAgICAgICAgICAgR2RpcFNldFRleHRSZW5kZXJpbmdIaW50KHZvaWQqIGdyYXBoaWNzLCBpbnQgbW9kZSk7CiAgICAgdm9pZCAgICAgICAgICAgIEdkaXBTZXRQYWdlVW5pdCh2b2lkKiBncmFwaGljcywgRlhfRFdPUkQgdW5pdCk7CiAgICAgdm9pZCAgICAgICAgICAgIEdkaXBTZXRXb3JsZFRyYW5zZm9ybSh2b2lkKiBncmFwaGljcywgdm9pZCogcE1hdHJpeCk7Ci0gICAgRlhfQk9PTCAgICAgICAgIEdkaXBEcmF3RHJpdmVyU3RyaW5nKHZvaWQgKmdyYXBoaWNzLCAgdW5zaWduZWQgc2hvcnQgKnRleHQsIGludCBsZW5ndGgsIHZvaWQgKmZvbnQsIHZvaWQqIGJydXNoLCB2b2lkICpwb3NpdGlvbnMsIGludCBmbGFncywgY29uc3Qgdm9pZCAqbWF0cml4KTsKKyAgICBib29sICAgICAgICAgR2RpcERyYXdEcml2ZXJTdHJpbmcodm9pZCAqZ3JhcGhpY3MsICB1bnNpZ25lZCBzaG9ydCAqdGV4dCwgaW50IGxlbmd0aCwgdm9pZCAqZm9udCwgdm9pZCogYnJ1c2gsIHZvaWQgKnBvc2l0aW9ucywgaW50IGZsYWdzLCBjb25zdCB2b2lkICptYXRyaXgpOwogICAgIHZvaWQgICAgICAgICAgICBHZGlwQ3JlYXRlQnJ1c2goRlhfRFdPUkQgZmlsbF9hcmdiLCB2b2lkKiogcEJydXNoKTsKICAgICB2b2lkICAgICAgICAgICAgR2RpcERlbGV0ZUJydXNoKHZvaWQqIHBCcnVzaCk7CiAgICAgdm9pZCAgICAgICAgICAgIEdkaXBDcmVhdGVNYXRyaXgoRlhfRkxPQVQgYSwgRlhfRkxPQVQgYiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgZCwgRlhfRkxPQVQgZSwgRlhfRkxPQVQgZiwgdm9pZCoqIG1hdHJpeCk7CiAgICAgdm9pZCAgICAgICAgICAgIEdkaXBEZWxldGVNYXRyaXgodm9pZCogbWF0cml4KTsKLSAgICBGWF9CT09MICAgICAgICAgR2RpcENyZWF0ZUZvbnRGYW1pbHlGcm9tTmFtZShjb25zdCBGWF9XQ0hBUiogbmFtZSwgdm9pZCogcEZvbnRDb2xsZWN0aW9uLCB2b2lkKipwRmFtaWx5KTsKKyAgICBib29sICAgICAgICAgR2RpcENyZWF0ZUZvbnRGYW1pbHlGcm9tTmFtZShjb25zdCBGWF9XQ0hBUiogbmFtZSwgdm9pZCogcEZvbnRDb2xsZWN0aW9uLCB2b2lkKipwRmFtaWx5KTsKICAgICB2b2lkICAgICAgICAgICAgR2RpcERlbGV0ZUZvbnRGYW1pbHkodm9pZCogcEZhbWlseSk7Ci0gICAgRlhfQk9PTCAgICAgICAgIEdkaXBDcmVhdGVGb250RnJvbUZhbWlseSh2b2lkKiBwRmFtaWx5LCBGWF9GTE9BVCBmb250X3NpemUsIGludCBmb250c3R5bGUsIGludCBmbGFnLCB2b2lkKiogcEZvbnQpOworICAgIGJvb2wgICAgICAgICBHZGlwQ3JlYXRlRm9udEZyb21GYW1pbHkodm9pZCogcEZhbWlseSwgRlhfRkxPQVQgZm9udF9zaXplLCBpbnQgZm9udHN0eWxlLCBpbnQgZmxhZywgdm9pZCoqIHBGb250KTsKICAgICB2b2lkKiAgICAgICAgICAgR2RpcENyZWF0ZUZvbnRGcm9tQ29sbGVjdGlvbih2b2lkKiBwRm9udENvbGxlY3Rpb24sIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgaW50IGZvbnRzdHlsZSk7CiAgICAgdm9pZCAgICAgICAgICAgIEdkaXBEZWxldGVGb250KHZvaWQqIHBGb250KTsKLSAgICBGWF9CT09MICAgICAgICAgR2RpcENyZWF0ZUJpdG1hcChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIHZvaWQqKmJpdG1hcCk7CisgICAgYm9vbCAgICAgICAgIEdkaXBDcmVhdGVCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCB2b2lkKipiaXRtYXApOwogICAgIHZvaWQgICAgICAgICAgICBHZGlwRGlzcG9zZUltYWdlKHZvaWQqIGJpdG1hcCk7CiAgICAgdm9pZCAgICAgICAgICAgIEdkaXBHZXRGb250U2l6ZSh2b2lkICpwRm9udCwgRlhfRkxPQVQgKnNpemUpOwogICAgIHZvaWQqICAgICAgICAgICBHZGlBZGRGb250TWVtUmVzb3VyY2VFeCh2b2lkICpwRm9udGRhdGEsIEZYX0RXT1JEIHNpemUsIHZvaWQqIHBkdiwgRlhfRFdPUkQqIG51bV9mYWNlKTsKLSAgICBGWF9CT09MICAgICAgICAgR2RpUmVtb3ZlRm9udE1lbVJlc291cmNlRXgodm9pZCogaGFuZGxlKTsKKyAgICBib29sICAgICAgICAgR2RpUmVtb3ZlRm9udE1lbVJlc291cmNlRXgodm9pZCogaGFuZGxlKTsKICAgICB2b2lkKgkJCW1fRnVuY3Rpb25zWzEwMF07CiAgICAgdm9pZCogICAgICAgICAgIG1fcEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4OwogICAgIHZvaWQqICAgICAgICAgICBtX3BHZGlSZW1vdmVGb250TWVtUmVzb3Vyc2VFeDsKQEAgLTYzLDcgKzYzLDcgQEAKIGNsYXNzIENXaW4zMlBsYXRmb3JtCiB7CiBwdWJsaWM6Ci0gICAgRlhfQk9PTAkJCW1fYkhhbGZUb25lOworICAgIGJvb2wJCQltX2JIYWxmVG9uZTsKICAgICBDR2RpcGx1c0V4dAkJbV9HZGlwbHVzRXh0OwogICAgIENEV3JpdGVFeHQgICAgICBtX0RXcml0ZUV4dDsKIH07CkBAIC03NSwyMiArNzUsMjIgQEAKICAgICB7CiAgICAgICAgIFNhdmVEQyhtX2hEQyk7CiAgICAgfQotICAgIHZpcnR1YWwgdm9pZAlSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkID0gRkFMU0UpCisgICAgdmlydHVhbCB2b2lkCVJlc3RvcmVTdGF0ZShib29sIGJLZWVwU2F2ZWQgPSBmYWxzZSkKICAgICB7CiAgICAgICAgIFJlc3RvcmVEQyhtX2hEQywgLTEpOwogICAgICAgICBpZiAoYktlZXBTYXZlZCkgewogICAgICAgICAgICAgU2F2ZURDKG1faERDKTsKICAgICAgICAgfQogICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICB2aXJ0dWFsIGJvb2wJU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCBib29sCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgRlhfQk9PTAlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICB2aXJ0dWFsIGJvb2wJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLApAQCAtMTAwLDI2ICsxMDAsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50CWJsZW5kX3R5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgRlhfQk9PTCBGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwKKyAgICB2aXJ0dWFsIGJvb2wgRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCURyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsIEZYX0RXT1JEIGNvbG9yLAorICAgIHZpcnR1YWwgYm9vbAlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpOwogICAgIHZpcnR1YWwgdm9pZCogR2V0Q2xpcFJnbigpIDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q2xpcFJnbih2b2lkKiBwUmduKSA7Ci0gICAgdmlydHVhbCBGWF9CT09MIEdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpOwotICAgIHZpcnR1YWwgRlhfQk9PTCBEZWxldGVEZXZpY2VSZ24odm9pZCogcFJnbik7CisgICAgdmlydHVhbCBib29sIFNldENsaXBSZ24odm9pZCogcFJnbikgOworICAgIHZpcnR1YWwgYm9vbCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KTsKKyAgICB2aXJ0dWFsIGJvb2wgRGVsZXRlRGV2aWNlUmduKHZvaWQqIHBSZ24pOwogICAgIHZpcnR1YWwgdm9pZAlEcmF3TGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5Mik7CiAgICAgdmlydHVhbCB2b2lkKglHZXRQbGF0Zm9ybVN1cmZhY2UoKQogICAgIHsKICAgICAgICAgcmV0dXJuICh2b2lkKiltX2hEQzsKICAgICB9Ci0gICAgRlhfQk9PTAkJCUdESV9TZXRESUJpdHMoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsCisgICAgYm9vbAkJCUdESV9TZXRESUJpdHMoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgRlhfQk9PTAkJCUdESV9TdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorICAgIGJvb2wJCQlHRElfU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOwotICAgIEZYX0JPT0wJCQlHRElfU3RyZXRjaEJpdE1hc2soY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisgICAgYm9vbAkJCUdESV9TdHJldGNoQml0TWFzayhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIEZYX0RXT1JEIGJpdG1hcF9jb2xvciwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7CiAgICAgSERDCQkJCW1faERDOwpAQCAtMTMzLDE5ICsxMzMsMTkgQEAKIHB1YmxpYzoKICAgICBDR2RpRGlzcGxheURyaXZlcihIREMgaERDKTsKIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIEZYX0JPT0wgR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBGWF9CT09MIGJERWRnZSA9IEZBTFNFKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAorICAgIHZpcnR1YWwgYm9vbCBHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGJvb2wgYkRFZGdlID0gZmFsc2UpOworICAgIHZpcnR1YWwgYm9vbCBTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgdmlydHVhbCBGWF9CT09MIFN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKKyAgICB2aXJ0dWFsIGJvb2wgU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCisgICAgdmlydHVhbCBib29sCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCByZW5kZXJfZmxhZ3MsIHZvaWQqJiBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBGWF9CT09MCQkJVXNlRm94aXRTdHJldGNoRW5naW5lKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisgICAgYm9vbAkJCVVzZUZveGl0U3RyZXRjaEVuZ2luZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBpbnQgcmVuZGVyX2ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwogfTsKQEAgLTE1NSwxNiArMTU1LDE2IEBACiAgICAgQ0dkaVByaW50ZXJEcml2ZXIoSERDIGhEQyk7CiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCBpbnQJCUdldERldmljZUNhcHMoaW50IGNhcHNfaWQpOwotICAgIHZpcnR1YWwgRlhfQk9PTCBTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCisgICAgdmlydHVhbCBib29sIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorICAgIHZpcnR1YWwgYm9vbCBTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKKyAgICB2aXJ0dWFsIGJvb2wJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIHJlbmRlcl9mbGFncywgdm9pZComIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKICAgICBpbnQJCQkJbV9Ib3J6U2l6ZSwgbV9WZXJ0U2l6ZTsKLSAgICBGWF9CT09MCQkJbV9iU3VwcG9ydFJPUDsKKyAgICBib29sCQkJbV9iU3VwcG9ydFJPUDsKIH07CiBjbGFzcyBDUFNPdXRwdXQgOiBwdWJsaWMgSUZYX1BTT3V0cHV0CiB7CkBAIC0xODQsMjcgKzE4NCwyNyBAQAogewogcHVibGljOgogICAgIENQU1ByaW50ZXJEcml2ZXIoKTsKLSAgICBGWF9CT09MCQkJSW5pdChIREMgaERDLCBpbnQgcHNfbGV2ZWwsIEZYX0JPT0wgYkNteWtPdXRwdXQpOworICAgIGJvb2wJCQlJbml0KEhEQyBoREMsIGludCBwc19sZXZlbCwgYm9vbCBiQ215a091dHB1dCk7CiAgICAgfkNQU1ByaW50ZXJEcml2ZXIoKTsKIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIEZYX0JPT0wgSXNQU1ByaW50RHJpdmVyKCkKKyAgICB2aXJ0dWFsIGJvb2wgSXNQU1ByaW50RHJpdmVyKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgdmlydHVhbCBpbnQJCUdldERldmljZUNhcHMoaW50IGNhcHNfaWQpOwotICAgIHZpcnR1YWwgRlhfQk9PTAlTdGFydFJlbmRlcmluZygpOworICAgIHZpcnR1YWwgYm9vbAlTdGFydFJlbmRlcmluZygpOwogICAgIHZpcnR1YWwgdm9pZAlFbmRSZW5kZXJpbmcoKTsKICAgICB2aXJ0dWFsIHZvaWQJU2F2ZVN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkCVJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQgPSBGQUxTRSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCB2b2lkCVJlc3RvcmVTdGF0ZShib29sIGJLZWVwU2F2ZWQgPSBmYWxzZSk7CisgICAgdmlydHVhbCBib29sCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIHZpcnR1YWwgYm9vbAlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCBib29sCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKQEAgLTIxNCwxNiArMjE0LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCk7Ci0gICAgdmlydHVhbCBGWF9CT09MIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKKyAgICB2aXJ0dWFsIGJvb2wgR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCk7CisgICAgdmlydHVhbCBib29sIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorICAgIHZpcnR1YWwgYm9vbCBTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKKyAgICB2aXJ0dWFsIGJvb2wJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIHJlbmRlcl9mbGFncywgdm9pZComIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCisgICAgdmlydHVhbCBib29sIERyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLCBGWF9GTE9BVCBmb250X3NpemUsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7CiAgICAgdmlydHVhbCB2b2lkKglHZXRQbGF0Zm9ybVN1cmZhY2UoKQpAQCAtMjMxLDcgKzIzMSw3IEBACiAgICAgICAgIHJldHVybiAodm9pZCopbV9oREM7CiAgICAgfQogICAgIEhEQwkJCQltX2hEQzsKLSAgICBGWF9CT09MCQkJbV9iQ215a091dHB1dDsKKyAgICBib29sCQkJbV9iQ215a091dHB1dDsKICAgICBpbnQJCQkJbV9XaWR0aCwgbV9IZWlnaHQsIG1fbkJpdHNQZXJQaXhlbDsKICAgICBpbnQJCQkJbV9Ib3J6U2l6ZSwgbV9WZXJ0U2l6ZTsKICAgICBDUFNPdXRwdXQqCQltX3BQU091dHB1dDsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9DaGVja0JveC5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmgKaW5kZXggM2RlZWFlOC4uNjg4MDk3NyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmgKQEAgLTE3LDExICsxNywxMSBAQAogCiAJdmlydHVhbCBDUFdMX1duZCoJCQlOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCU9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOworCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisJdmlydHVhbCBib29sCQkJCUlzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAl2aXJ0dWFsIHZvaWQJCQkJU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIH07CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmgKaW5kZXggZTVjNjVjMi4uOTU3ZmRhNCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmgKQEAgLTMxLDE5ICszMSwxOSBAQAogCXZpcnR1YWwgQ1BXTF9XbmQqCQkJTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7CisJdmlydHVhbCBib29sCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisJdmlydHVhbCBib29sCQkJCUlzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAl2aXJ0dWFsIHZvaWQJCQkJU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAogIAl2aXJ0dWFsIHZvaWQJCQkJR2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSk7CiAgCXZpcnR1YWwgdm9pZAkJCQlTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhKTsKLSAJdmlydHVhbCBGWF9CT09MCQkJCUlzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KTsKKyAJdmlydHVhbCBib29sCQkJCUlzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KTsKIAl2aXJ0dWFsIHZvaWQJCQkJU2F2ZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAJdmlydHVhbCB2b2lkCQkJCVJlc3RvcmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCi0JdmlydHVhbCBDUFdMX1duZCoJCQlSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24sIEZYX1VJTlQgbkZsYWcpOworCXZpcnR1YWwgQ1BXTF9XbmQqCQkJUmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sIGJSZXN0b3JlVmFsdWUpOworCXZpcnR1YWwgdm9pZAkJCQlPbktleVN0cm9rZShib29sIGJLZXlEb3duLCBGWF9VSU5UIG5GbGFnKTsKIAogcHVibGljOgogCXZpcnR1YWwgdm9pZAkJCQlPblNldEZvY3VzKENQV0xfV25kKiBwV25kKTsKQEAgLTUzLDkgKzUzLDkgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJT25BZGRVbmRvKENQV0xfRWRpdCogcEVkaXQpOwogCiBwdWJsaWM6Ci0JdmlydHVhbCBGWF9CT09MCQkJCUNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJdmlydHVhbCBib29sCQkJCUNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJQ2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJdmlydHVhbCBib29sCQkJCUNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiAKIHByaXZhdGU6CiAJQ0ZYX1dpZGVTdHJpbmcJCQkJR2V0U2VsZWN0RXhwb3J0VGV4dCgpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Gb3JtRmlsbGVyLmgKaW5kZXggZmM4NThhOC4uOTg5OTVjMSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oCkBAIC0zOSwyMyArMzksMjMgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCU9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7CisJdmlydHVhbCBib29sCQkJCU9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJdmlydHVhbCBib29sCQkJCUNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJQ2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJdmlydHVhbCBib29sCQkJCUNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJRG9Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiAJdmlydHVhbCB2b2lkCQkJCURvQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CkBAIC03MiwxNSArNzIsMTUgQEAKICAJCQkJCQkJCQlQREZTREtfRmllbGRBY3Rpb24mIGZhKTsKICAJdmlydHVhbCB2b2lkCQkJCVNldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCiAgCQkJCQkJCQkJY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSk7Ci0gCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU9sZCwKKyAJdmlydHVhbCBib29sCQkJCUlzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLAogIAkJCQkJCQkJCWNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFOZXcpOwogCiAJdmlydHVhbCB2b2lkCQkJCVNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCXZpcnR1YWwgdm9pZAkJCQlSZXN0b3JlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAotCXZpcnR1YWwgQ1BXTF9XbmQqIAkJCVJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCBiUmVzdG9yZVZhbHVlKTsKKwl2aXJ0dWFsIENQV0xfV25kKiAJCQlSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wgYlJlc3RvcmVWYWx1ZSk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25LZXlTdHJva2UoRlhfQk9PTCBiS2V5RG93bik7CisJdmlydHVhbCB2b2lkCQkJCU9uS2V5U3Ryb2tlKGJvb2wgYktleURvd24pOwogCiAJQ1BERl9NYXRyaXgJCQkJCUdldEN1ck1hdHJpeCgpOwogCkBAIC05NSwxOSArOTUsMTkgQEAKIAl2b2lkCQkJCQkJU2V0V2luZG93UmVjdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IENQREZfUmVjdCYgcmNXaW5kb3cpOwogCUNQREZfUmVjdAkJCQkJR2V0V2luZG93UmVjdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCi0JRlhfQk9PTAkJCQkJCUNvbW1pdERhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9VSU5UIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworCWJvb2wJCQkJCQlDb21taXREYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfVUlOVCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCUlzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAl2aXJ0dWFsIHZvaWQJCQkJU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAotCUNQV0xfV25kKgkJCQkJR2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCBiTmV3KTsKKwlDUFdMX1duZCoJCQkJCUdldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wgYk5ldyk7CiAJdm9pZAkJCQkJCURlc3Ryb3lQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQl2b2lkCQkJCQkJRXNjYXBlRmlsbGVyKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCBiRGVzdHJveVBERldpbmRvdyk7CisJdm9pZAkJCQkJCUVzY2FwZUZpbGxlcihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wgYkRlc3Ryb3lQREZXaW5kb3cpOwogCiAJdmlydHVhbAlQV0xfQ1JFQVRFUEFSQU0JCUdldENyZWF0ZVBhcmFtKCk7CiAJdmlydHVhbCBDUFdMX1duZCoJCQlOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSA9IDA7CiAJdmlydHVhbCBDUERGX1JlY3QJCQlHZXRGb2N1c0JveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCi0JRlhfQk9PTAkJCQkJCUlzVmFsaWQoKSBjb25zdDsKKwlib29sCQkJCQkJSXNWYWxpZCgpIGNvbnN0OwogCUNQREZfUmVjdAkJCQkJR2V0UERGV2luZG93UmVjdCgpIGNvbnN0OwogCiAJQ1BERlNES19QYWdlVmlldyoJCQlHZXRDdXJQYWdlVmlldygpOwpAQCAtMTI0LDcgKzEyNCw3IEBACiAgICAgQ1BERlNES19XaWRnZXQqIG1fcFdpZGdldDsKICAgICBDUERGU0RLX0Fubm90KiBtX3BBbm5vdDsKIAotICAgIEZYX0JPT0wgbV9iVmFsaWQ7CisgICAgYm9vbCBtX2JWYWxpZDsKICAgICBDRkZMX1BhZ2VWaWV3MlBERldpbmRvdyBtX01hcHM7CiAgICAgQ1BERl9Qb2ludCBtX3B0T2xkUG9zOwogfTsKQEAgLTEzNyw5ICsxMzcsOSBAQAogCiAJdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAJdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAJdmlydHVhbCB2b2lkCQkJCU9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwKIAkJCQkJCQkJCUNGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCiAJCQkJCQkJCQlGWF9EV09SRCBkd0ZsYWdzKTsKQEAgLTE0OCw4ICsxNDgsOCBAQAogCQkJCQkJCQkJQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKIAkJCQkJCQkJCUZYX0RXT1JEIGR3RmxhZ3MpOwogcHJvdGVjdGVkOgotCUZYX0JPT0wJCQkJCQltX2JNb3VzZUluOwotCUZYX0JPT0wJCQkJCQltX2JNb3VzZURvd247CisJYm9vbAkJCQkJCW1fYk1vdXNlSW47CisJYm9vbAkJCQkJCW1fYk1vdXNlRG93bjsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZPUk1GSUxMRVJfRkZMX0ZPUk1GSUxMRVJfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9JRm9ybUZpbGxlci5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmgKaW5kZXggZTU1MzcyMy4uNTFiMDI3OSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmgKQEAgLTIwLDcgKzIwLDcgQEAKIAlDRkZMX0lGb3JtRmlsbGVyKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApOwogCXZpcnR1YWwgfkNGRkxfSUZvcm1GaWxsZXIoKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlBbm5vdF9IaXRUZXN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyxDUERGU0RLX0Fubm90KiBwQW5ub3QsIENQREZfUG9pbnQgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlBbm5vdF9IaXRUZXN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyxDUERGU0RLX0Fubm90KiBwQW5ub3QsIENQREZfUG9pbnQgcG9pbnQpOwogCXZpcnR1YWwgRlhfUkVDVAkJCQlHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAJdmlydHVhbCB2b2lkCQkJCU9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIC8qSERDIGhEQywqLyBDUERGU0RLX0Fubm90KiBwQW5ub3QsCiAJCQkJCQkJCQlDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLApAQCAtMzQsNDEgKzM0LDQxIEBACiAJdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyk7CiAJdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCU9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCU9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOworCXZpcnR1YWwgYm9vbAkJCQlPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncyk7CisJdmlydHVhbCBib29sCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCxGWF9VSU5UIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsRlhfVUlOVCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCU9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyk7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJUXVlcnlXaGVyZVBvcHVwKHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfRkxPQVQgZlBvcHVwTWluLEZYX0ZMT0FUIGZQb3B1cE1heCwgaW50MzJfdCAmIG5SZXQsIEZYX0ZMT0FUICYgZlBvcHVwUmV0KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25CZWZvcmVLZXlTdHJva2UoRlhfQk9PTCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBpbnQzMl90IG5LZXlDb2RlLAorCXZpcnR1YWwgdm9pZAkJCQlPbkJlZm9yZUtleVN0cm9rZShib29sIGJFZGl0T3JMaXN0LCB2b2lkKiBwUHJpdmF0ZURhdGEsIGludDMyX3QgbktleUNvZGUsCiAJCQkJCQkJCQkJQ0ZYX1dpZGVTdHJpbmcgJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKIAkJCQkJCQkJCQlpbnQgblNlbFN0YXJ0LCBpbnQgblNlbEVuZCwKLQkJCQkJCQkJCQlGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MICYgYlJDLCBGWF9CT09MICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25BZnRlcktleVN0cm9rZShGWF9CT09MIGJFZGl0T3JMaXN0LCB2b2lkKiBwUHJpdmF0ZURhdGEsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpIDsKKwkJCQkJCQkJCQlib29sIGJLZXlEb3duLCBib29sICYgYlJDLCBib29sICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25BZnRlcktleVN0cm9rZShib29sIGJFZGl0T3JMaXN0LCB2b2lkKiBwUHJpdmF0ZURhdGEsIGJvb2wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpIDsKIAotCUNGRkxfRm9ybUZpbGxlcioJCQlHZXRGb3JtRmlsbGVyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfQk9PTCBiUmVnaXN0ZXIpOworCUNGRkxfRm9ybUZpbGxlcioJCQlHZXRGb3JtRmlsbGVyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgYm9vbCBiUmVnaXN0ZXIpOwogCXZvaWQJCQkJCQlSZW1vdmVGb3JtRmlsbGVyKENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAKLQlzdGF0aWMgRlhfQk9PTAkJCQlJc1Zpc2libGUoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpOwotCXN0YXRpYyBGWF9CT09MCQkJCUlzUmVhZE9ubHkoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpOwotCXN0YXRpYyBGWF9CT09MCQkJCUlzRmlsbGluZ0FsbG93ZWQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpOwotIAlzdGF0aWMgRlhfQk9PTAkJCQlJc1ZhbGlkQW5ub3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOworCXN0YXRpYyBib29sCQkJCUlzVmlzaWJsZShDUERGU0RLX1dpZGdldCogcFdpZGdldCk7CisJc3RhdGljIGJvb2wJCQkJSXNSZWFkT25seShDUERGU0RLX1dpZGdldCogcFdpZGdldCk7CisJc3RhdGljIGJvb2wJCQkJSXNGaWxsaW5nQWxsb3dlZChDUERGU0RLX1dpZGdldCogcFdpZGdldCk7CisgCXN0YXRpYyBib29sCQkJCUlzVmFsaWRBbm5vdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAKLQl2b2lkCQkJCQkJT25LZXlTdHJva2VDb21taXQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCYgYlJDLCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwotCXZvaWQJCQkJCQlPblZhbGlkYXRlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSQywgRlhfQk9PTCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2b2lkCQkJCQkJT25LZXlTdHJva2VDb21taXQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCYgYlJDLCBib29sJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOworCXZvaWQJCQkJCQlPblZhbGlkYXRlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wmIGJSQywgYm9vbCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKTsKIAotCXZvaWQJCQkJCQlPbkNhbGN1bGF0ZShDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwotCXZvaWQJCQkJCQlPbkZvcm1hdChDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwotCXZvaWQJCQkJCQlPbkJ1dHRvblVwKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSZXNldCwgRlhfQk9PTCYgYkV4aXQsRlhfVUlOVCBuRmxhZyk7CisJdm9pZAkJCQkJCU9uQ2FsY3VsYXRlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7CisJdm9pZAkJCQkJCU9uRm9ybWF0KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7CisJdm9pZAkJCQkJCU9uQnV0dG9uVXAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCYgYlJlc2V0LCBib29sJiBiRXhpdCxGWF9VSU5UIG5GbGFnKTsKIAogcHJpdmF0ZToKICAgICB1c2luZyBDRkZMX1dpZGdldDJGaWxsZXIgPSBzdGQ6Om1hcDxDUERGU0RLX0Fubm90KiwgQ0ZGTF9Gb3JtRmlsbGVyKj47CkBAIC03Nyw3ICs3Nyw3IEBACiAKICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBtX3BBcHA7CiAgICAgQ0ZGTF9XaWRnZXQyRmlsbGVyIG1fTWFwczsKLSAgICBGWF9CT09MIG1fYk5vdGlmeWluZzsKKyAgICBib29sIG1fYk5vdGlmeWluZzsKIH07CiAKIGNsYXNzIENGRkxfUHJpdmF0ZURhdGEKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9MaXN0Qm94LmggYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTGlzdEJveC5oCmluZGV4IDRjMDgxM2YuLjU5ZTNkNmMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9MaXN0Qm94LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guaApAQCAtMjMsMTAgKzIzLDEwIEBACiAgICAgdmlydHVhbCBDUFdMX1duZCogTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wgT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwKKyAgICB2aXJ0dWFsIGJvb2wgT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzKTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTCBJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisgICAgdmlydHVhbCBib29sIElzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKICAgICB2aXJ0dWFsIHZvaWQgU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAogICAgIHZpcnR1YWwgdm9pZCBHZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKQEAgLTQwLDggKzQwLDggQEAKICAgICB2aXJ0dWFsIHZvaWQgUmVzdG9yZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKICAgICB2aXJ0dWFsIENQV0xfV25kKiBSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVzdG9yZVZhbHVlKTsKLSAgICB2aXJ0dWFsIHZvaWQgT25LZXlTdHJva2UoRlhfQk9PTCBiS2V5RG93biwgRlhfRFdPUkQgbkZsYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlc3RvcmVWYWx1ZSk7CisgICAgdmlydHVhbCB2b2lkIE9uS2V5U3Ryb2tlKGJvb2wgYktleURvd24sIEZYX0RXT1JEIG5GbGFnKTsKIAogcHJpdmF0ZToKICAgICBDQkFfRm9udE1hcCogbV9wRm9udE1hcDsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuaAppbmRleCA5NjFkNGI3Li44YTljMDRjIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTm90aWZ5LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5oCkBAIC0yMCwzNSArMjAsMzUgQEAKIAl2aXJ0dWFsIH5DRkZMX05vdGlmeSgpOwogCiBwdWJsaWM6Ci0JRlhfQk9PTAkJCQkJCQkJCU9uU2V0Rm9jdXMoRlhfQk9PTCAmIGJFeGl0KTsKLQlGWF9CT09MCQkJCQkJCQkJT25Nb3VzZUVudGVyKEZYX0JPT0wgJiBiRXhpdCk7Ci0JRlhfQk9PTAkJCQkJCQkJCU9uTW91c2VEb3duKEZYX0JPT0wgJiBiRXhpdCk7Ci0JRlhfQk9PTAkJCQkJCQkJCU9uTW91c2VVcChGWF9CT09MICYgYkV4aXQpOwotCUZYX0JPT0wJCQkJCQkJCQlPbk1vdXNlRXhpdChGWF9CT09MICYgYkV4aXQpOwotCUZYX0JPT0wJCQkJCQkJCQlPbktpbGxGb2N1cyhGWF9CT09MICYgYkV4aXQpOworCWJvb2wJCQkJCQkJCQlPblNldEZvY3VzKGJvb2wgJiBiRXhpdCk7CisJYm9vbAkJCQkJCQkJCU9uTW91c2VFbnRlcihib29sICYgYkV4aXQpOworCWJvb2wJCQkJCQkJCQlPbk1vdXNlRG93bihib29sICYgYkV4aXQpOworCWJvb2wJCQkJCQkJCQlPbk1vdXNlVXAoYm9vbCAmIGJFeGl0KTsKKwlib29sCQkJCQkJCQkJT25Nb3VzZUV4aXQoYm9vbCAmIGJFeGl0KTsKKwlib29sCQkJCQkJCQkJT25LaWxsRm9jdXMoYm9vbCAmIGJFeGl0KTsKIAotCUZYX0JPT0wJCQkJCQkJCQlPbkNhbGN1bGF0ZSgpOwotCUZYX0JPT0wJCQkJCQkJCQlPbkZvcm1hdChpbnQgaUNvbW1pdEtleSk7Ci0JRlhfQk9PTAkJCQkJCQkJCU9uVmFsaWRhdGUoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nJiBzdHJWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcgJiBzdHJDaGFuZ2UsCi0JCQkJCQkJCQkJCSAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsCi0JCQkJCQkJCQkJCSAgIEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MICYgYlJDKTsKLQlGWF9CT09MCQkJCQkJCQkJT25LZXlTdHJva2UoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIGludCBuQ29tbWl0S2V5LCBDRlhfV2lkZVN0cmluZyYgc3RyVmFsdWUsIENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCi0JCQkJCQkJCQkJCSAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsCi0JCQkJCQkJCQkJCSAgIEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJXaWxsQ29tbWl0LCBGWF9CT09MIGJGaWVsZEZ1bGwsCi0JCQkJCQkJCQkJCSAgIGludCYgblNlbFN0YXJ0LCBpbnQmIG5TZWxFbmQsIEZYX0JPT0wmIGJSQyk7CisJYm9vbAkJCQkJCQkJCU9uQ2FsY3VsYXRlKCk7CisJYm9vbAkJCQkJCQkJCU9uRm9ybWF0KGludCBpQ29tbWl0S2V5KTsKKwlib29sCQkJCQkJCQkJT25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIHN0clZhbHVlLCBDRlhfV2lkZVN0cmluZyAmIHN0ckNoYW5nZSwKKwkJCQkJCQkJCQkJICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBib29sIGJLZXlEb3duLCBib29sIGJNb2RpZmllciwKKwkJCQkJCQkJCQkJICAgYm9vbCBiU2hpZnQsIGJvb2wgJiBiUkMpOworCWJvb2wJCQkJCQkJCQlPbktleVN0cm9rZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgaW50IG5Db21taXRLZXksIENGWF9XaWRlU3RyaW5nJiBzdHJWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKwkJCQkJCQkJCQkJICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBib29sIGJLZXlEb3duLCBib29sIGJNb2RpZmllciwKKwkJCQkJCQkJCQkJICAgYm9vbCBiU2hpZnQsIGJvb2wgYldpbGxDb21taXQsIGJvb2wgYkZpZWxkRnVsbCwKKwkJCQkJCQkJCQkJICAgaW50JiBuU2VsU3RhcnQsIGludCYgblNlbEVuZCwgYm9vbCYgYlJDKTsKIAogCXZvaWQJCQkJCQkJCQlCZWZvcmVOb3RpZnkoKTsKIAl2b2lkCQkJCQkJCQkJQWZ0ZXJOb3RpZnkoKTsKLQlGWF9CT09MCQkJCQkJCQkJSXNOb3RpZnlpbmcoKSBjb25zdCB7cmV0dXJuIG1fbk5vdGlmeUZsYWcgPiAwO30KKwlib29sCQkJCQkJCQkJSXNOb3RpZnlpbmcoKSBjb25zdCB7cmV0dXJuIG1fbk5vdGlmeUZsYWcgPiAwO30KIAogcHJpdmF0ZToKLSAJRlhfQk9PTAkJCQkJCQkJCURvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsIEZYX0JPT0wgJiBiRXhpdCk7Ci0gCUZYX0JPT0wJCQkJCQkJCQlGaW5kQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24pOwotIAlGWF9CT09MCQkJCQkJCQkJRmluZEFBY3Rpb24oQ1BERl9BQWN0aW9uIGFhY3Rpb24sQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uKTsKLSAJRlhfQk9PTAkJCQkJCQkJCUV4ZWN1dGVBY3Rpb25UcmVlKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCwgQ1BERl9BY3Rpb24gJiBhY3Rpb24sIEZYX0JPT0wmIGJFeGl0KTsKLSAJRlhfQk9PTAkJCQkJCQkJCUV4ZWN1dGVBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uLEZYX0JPT0wmIGJFeGl0KTsKKyAJYm9vbAkJCQkJCQkJCURvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsIGJvb2wgJiBiRXhpdCk7CisgCWJvb2wJCQkJCQkJCQlGaW5kQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24pOworIAlib29sCQkJCQkJCQkJRmluZEFBY3Rpb24oQ1BERl9BQWN0aW9uIGFhY3Rpb24sQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uKTsKKyAJYm9vbAkJCQkJCQkJCUV4ZWN1dGVBY3Rpb25UcmVlKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCwgQ1BERl9BY3Rpb24gJiBhY3Rpb24sIGJvb2wmIGJFeGl0KTsKKyAJYm9vbAkJCQkJCQkJCUV4ZWN1dGVBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uLGJvb2wmIGJFeGl0KTsKIAotCUZYX0JPT0wJCQkJCQkJCQltX2JEb0FjdGlvbmluZzsKKwlib29sCQkJCQkJCQkJbV9iRG9BY3Rpb25pbmc7CiAJaW50MzJfdAkJCQkJCQkJbV9uTm90aWZ5RmxhZzsKIH07CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9QdXNoQnV0dG9uLmggYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5oCmluZGV4IDNjZmFlZmIuLjI2ZGU3YTEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9QdXNoQnV0dG9uLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uaApAQCAtMTcsNyArMTcsNyBAQAogCiAJdmlydHVhbCBDUFdMX1duZCoJCQlOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7CisJdmlydHVhbCBib29sCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKIAl2aXJ0dWFsIHZvaWQJCQkJT25EcmF3KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKIAkJCQkJCQkJCUNGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCiAJCQkJCQkJCQlGWF9EV09SRCBkd0ZsYWdzKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9SYWRpb0J1dHRvbi5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1JhZGlvQnV0dG9uLmgKaW5kZXggNDYzMzJlMC4uZTg1ODUzMyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1JhZGlvQnV0dG9uLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1JhZGlvQnV0dG9uLmgKQEAgLTE2LDEwICsxNiwxMCBAQAogCXZpcnR1YWwgfkNGRkxfUmFkaW9CdXR0b24oKTsKIAogCXZpcnR1YWwgQ1BXTF9XbmQqCQkJTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7Ci0gIAl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisgIAl2aXJ0dWFsIGJvb2wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpOworCXZpcnR1YWwgYm9vbAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAJdmlydHVhbCB2b2lkCQkJCVNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiB9OwogCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmggYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmgKaW5kZXggMTBiZDVjMC4uMTA1YjkwYyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9UZXh0RmllbGQuaApAQCAtMzIsMjEgKzMyLDIxIEBACiAJdmlydHVhbCBDUFdMX1duZCoJCQlOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUlzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKwl2aXJ0dWFsIGJvb2wJCQkJSXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCXZpcnR1YWwgdm9pZAkJCQlTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCiAgCXZpcnR1YWwgdm9pZAkJCQlHZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAogIAkJCQkJCQkJCQkJCVBERlNES19GaWVsZEFjdGlvbiYgZmEpOwogIAl2aXJ0dWFsIHZvaWQJCQkJU2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKIAkJCQkJCQkJCWNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmEpOwotIAl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsCisgCXZpcnR1YWwgYm9vbAkJCQlJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU9sZCwKICAJCQkJCQkJCQkJCQljb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KTsKIAl2aXJ0dWFsIHZvaWQJCQkJU2F2ZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAJdmlydHVhbCB2b2lkCQkJCVJlc3RvcmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCi0JdmlydHVhbCBDUFdMX1duZCoJCQlSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSk7CisJdmlydHVhbCBDUFdMX1duZCoJCQlSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wgYlJlc3RvcmVWYWx1ZSk7CiAKIHB1YmxpYzoKIAl2aXJ0dWFsIHZvaWQJCQkJT25TZXRGb2N1cyhDUFdMX1duZCogcFduZCk7CkBAIC01Niw5ICs1Niw5IEBACiAJdmlydHVhbCB2b2lkCQkJCU9uQWRkVW5kbyhDUFdMX0VkaXQqIHBFZGl0KTsKIAogcHVibGljOgotCXZpcnR1YWwgRlhfQk9PTAkJCQlDYW5Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUNhbkN1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlDYW5QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCXZpcnR1YWwgYm9vbAkJCQlDYW5Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJdmlydHVhbCBib29sCQkJCUNhbkN1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCXZpcnR1YWwgYm9vbAkJCQlDYW5QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwogCiBwcml2YXRlOgogCUNCQV9Gb250TWFwKgkJCQltX3BGb250TWFwOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1V0aWxzLmggYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVXRpbHMuaAppbmRleCBmZTAyNWVjLi44ZGZjNjRlIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVXRpbHMuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVXRpbHMuaApAQCAtMTcsNyArMTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfRkxPQVQmIGZTaXplKTsKICAgICBzdGF0aWMgQ1BERl9SZWN0IERlZmxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCYgY3JSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfRkxPQVQmIGZTaXplKTsKLSAgICBzdGF0aWMgRlhfQk9PTCBUcmFjZU9iamVjdChDUERGX09iamVjdCogcE9iaik7CisgICAgc3RhdGljIGJvb2wgVHJhY2VPYmplY3QoQ1BERl9PYmplY3QqIHBPYmopOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GRkxfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2FjdGlvbmhhbmRsZXIuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2FjdGlvbmhhbmRsZXIuaAppbmRleCAzOWVjNGY0Li43YzQxYTFkIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnNka19hY3Rpb25oYW5kbGVyLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYWN0aW9uaGFuZGxlci5oCkBAIC0yMywxOCArMjMsMTggQEAKIGNsYXNzIENQREZTREtfRm9ybUFjdGlvbkhhbmRsZXIKIHsKIHB1YmxpYzoKLQlGWF9CT09MCURvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlGWF9CT09MCURvQWN0aW9uX1N1Ym1pdEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlGWF9CT09MCURvQWN0aW9uX1Jlc2V0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCUZYX0JPT0wJRG9BY3Rpb25fSW1wb3J0RGF0YShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCWJvb2wJRG9BY3Rpb25fSGlkZShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCWJvb2wJRG9BY3Rpb25fU3VibWl0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCWJvb2wJRG9BY3Rpb25fUmVzZXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJYm9vbAlEb0FjdGlvbl9JbXBvcnREYXRhKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiB9OwogCiBjbGFzcyBDUERGU0RLX01lZGlhQWN0aW9uSGFuZGxlcgogewogcHVibGljOgotCUZYX0JPT0wJRG9BY3Rpb25fUmVuZGl0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JRlhfQk9PTAlEb0FjdGlvbl9Tb3VuZChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCUZYX0JPT0wJRG9BY3Rpb25fTW92aWUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwlib29sCURvQWN0aW9uX1JlbmRpdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCWJvb2wJRG9BY3Rpb25fU291bmQoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwlib29sCURvQWN0aW9uX01vdmllKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiB9OwogCiBjbGFzcyBDUERGU0RLX0FjdGlvbkhhbmRsZXIKQEAgLTQ0LDMxICs0NCwzMSBAQAogCiAJdm9pZCBTZXRNZWRpYUFjdGlvbkhhbmRsZXIoQ1BERlNES19NZWRpYUFjdGlvbkhhbmRsZXIqIHBIYW5kbGVyKTsKIAotCUZYX0JPT0wJCURvQWN0aW9uX0RvY09wZW4oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlGWF9CT09MCQlEb0FjdGlvbl9KYXZhU2NyaXB0KGNvbnN0IENQREZfQWN0aW9uJiBKc0FjdGlvbixDRlhfV2lkZVN0cmluZyBjc0pTTmFtZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlGWF9CT09MCQlEb0FjdGlvbl9QYWdlKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIGVudW0gQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlVHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlGWF9CT09MCQlEb0FjdGlvbl9Eb2N1bWVudChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBlbnVtIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZVR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JRlhfQk9PTAkJRG9BY3Rpb25fQm9va01hcmsoQ1BERl9Cb29rbWFyayAqcEJvb2tNYXJrLCBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JRlhfQk9PTAkJRG9BY3Rpb25fU2NyZWVuKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQlGWF9CT09MCQlEb0FjdGlvbl9MaW5rKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JRlhfQk9PTAkJRG9BY3Rpb25fRmllbGQoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhKTsKLQlGWF9CT09MCQlEb0FjdGlvbl9GaWVsZEphdmFTY3JpcHQoY29uc3QgQ1BERl9BY3Rpb24mIEpzQWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSk7CisJYm9vbAkJRG9BY3Rpb25fRG9jT3Blbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCWJvb2wJCURvQWN0aW9uX0phdmFTY3JpcHQoY29uc3QgQ1BERl9BY3Rpb24mIEpzQWN0aW9uLENGWF9XaWRlU3RyaW5nIGNzSlNOYW1lLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCWJvb2wJCURvQWN0aW9uX1BhZ2UoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgZW51bSBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVUeXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCWJvb2wJCURvQWN0aW9uX0RvY3VtZW50KGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIGVudW0gQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlVHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwlib29sCQlEb0FjdGlvbl9Cb29rTWFyayhDUERGX0Jvb2ttYXJrICpwQm9va01hcmssIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwlib29sCQlEb0FjdGlvbl9TY3JlZW4oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCWJvb2wJCURvQWN0aW9uX0xpbmsoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwlib29sCQlEb0FjdGlvbl9GaWVsZChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEpOworCWJvb2wJCURvQWN0aW9uX0ZpZWxkSmF2YVNjcmlwdChjb25zdCBDUERGX0FjdGlvbiYgSnNBY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhKTsKIAogcHJpdmF0ZToKLQlGWF9CT09MCQkJCUV4ZWN1dGVEb2N1bWVudE9wZW5BY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAgQ0ZYX1B0ckxpc3QmIGxpc3QpOwotCUZYX0JPT0wJCQkJRXhlY3V0ZURvY3VtZW50UGFnZUFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIENGWF9QdHJMaXN0JiBsaXN0KTsKLQlGWF9CT09MCQkJCUV4ZWN1dGVGaWVsZEFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsIENGWF9QdHJMaXN0JiBsaXN0KTsKLQlGWF9CT09MCQkJCUV4ZWN1dGVTY3JlZW5BY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsICBDUERGU0RLX0Fubm90KiBwU2NyZWVuLCBDRlhfUHRyTGlzdCYgbGlzdCk7Ci0JRlhfQk9PTAkJCQlFeGVjdXRlQm9va01hcmsoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAgQ1BERl9Cb29rbWFyayogcEJvb2ttYXJrLCBDRlhfUHRyTGlzdCYgbGlzdCk7Ci0JRlhfQk9PTAkJCQlFeGVjdXRlTGlua0FjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsICBDRlhfUHRyTGlzdCYgbGlzdCk7CisJYm9vbAkJCQlFeGVjdXRlRG9jdW1lbnRPcGVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIENGWF9QdHJMaXN0JiBsaXN0KTsKKwlib29sCQkJCUV4ZWN1dGVEb2N1bWVudFBhZ2VBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsICBDRlhfUHRyTGlzdCYgbGlzdCk7CisJYm9vbAkJCQlFeGVjdXRlRmllbGRBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLCBDRlhfUHRyTGlzdCYgbGlzdCk7CisJYm9vbAkJCQlFeGVjdXRlU2NyZWVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAgQ1BERlNES19Bbm5vdCogcFNjcmVlbiwgQ0ZYX1B0ckxpc3QmIGxpc3QpOworCWJvb2wJCQkJRXhlY3V0ZUJvb2tNYXJrKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIENQREZfQm9va21hcmsqIHBCb29rbWFyaywgQ0ZYX1B0ckxpc3QmIGxpc3QpOworCWJvb2wJCQkJRXhlY3V0ZUxpbmtBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAgQ0ZYX1B0ckxpc3QmIGxpc3QpOwogCiAJdm9pZAkJCQlEb0FjdGlvbl9Ob0pzKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiAJdm9pZAkJCQlSdW5Eb2N1bWVudFBhZ2VKYXZhU2NyaXB0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0KTsKIAl2b2lkCQkJCVJ1bkRvY3VtZW50T3BlbkphdmFTY3JpcHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc1NjcmlwdE5hbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpOwogCXZvaWQJCQkJUnVuRmllbGRKYXZhU2NyaXB0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0KTsKIAotCUZYX0JPT0wJCQkJSXNWYWxpZEZpZWxkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KTsKLQlGWF9CT09MCQkJCUlzVmFsaWREb2NWaWV3KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJYm9vbAkJCQlJc1ZhbGlkRmllbGQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpOworCWJvb2wJCQkJSXNWYWxpZERvY1ZpZXcoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKIAogCXZvaWQJCQkJRG9BY3Rpb25fR29UbyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKTsKIAl2b2lkCQkJCURvQWN0aW9uX0dvVG9SKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnNka19hbm5vdGhhbmRsZXIuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Fubm90aGFuZGxlci5oCmluZGV4IGI0NzA1NjkuLjZmM2JlZTUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Fubm90aGFuZGxlci5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Fubm90aGFuZGxlci5oCkBAIC0yOSw3ICsyOSw3IEBACiAKIAl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXROYW1lKCkgPSAwOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUNhbkFuc3dlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJQ2FuQW5zd2VyKENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwogCiAKIAl2aXJ0dWFsIENQREZTREtfQW5ub3QqCQlOZXdBbm5vdChDUERGX0Fubm90KiBwQW5ub3QsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlKSA9IDA7CkBAIC00MSw3ICs0MSw3IEBACiAKIAl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUhpdFRlc3QoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisJdmlydHVhbCBib29sCQkJCUhpdFRlc3QoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CiAKIAogCXZpcnR1YWwgdm9pZAkJCQlPbkRyYXcoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsCkBAIC02OCwyNCArNjgsMjQgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKSA9IDA7CiAKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQlPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQlPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQlPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisJdmlydHVhbCBib29sCQkJCU9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisJdmlydHVhbCBib29sCQkJCU9uUkJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOwogLy9ieSB3am0uCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZ3MpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKSA9MCA7CisJdmlydHVhbCBib29sCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZ3MpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKSA9MCA7CiAKIAl2aXJ0dWFsCXZvaWQJCQkJT25EZVNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwogCXZpcnR1YWwJdm9pZAkJCQlPblNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKSA9IDA7CisJdmlydHVhbCBib29sCQkJCU9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykgPSAwOworCXZpcnR1YWwgYm9vbAkJCQlPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKSA9IDA7CiAKIH07CiAKQEAgLTEwMSw3ICsxMDEsNyBAQAogCiAJdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0TmFtZSgpICB7cmV0dXJuIENGWF9CeXRlU3RyaW5nKCJXaWRnZXRIYW5kbGVyIik7fQogCi0JdmlydHVhbCBGWF9CT09MCQkJCUNhbkFuc3dlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpOworCXZpcnR1YWwgYm9vbAkJCQlDYW5BbnN3ZXIoQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAogCXZpcnR1YWwgQ1BERlNES19Bbm5vdCoJCU5ld0Fubm90KENQREZfQW5ub3QqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2UpOwogCkBAIC0xMTIsNyArMTEyLDcgQEAKIAogCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KSA7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlIaXRUZXN0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKIAogCXZpcnR1YWwgdm9pZAkJCQlPbkRyYXcoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsCkBAIC0xMzcsMjUgKzEzNywyNSBAQAogCXZpcnR1YWwgdm9pZAkJCQlPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpIDsKIAogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7cmV0dXJuIEZBTFNFO30KKwl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOworCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOworCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKKwl2aXJ0dWFsIGJvb2wJCQkJT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKKwl2aXJ0dWFsIGJvb2wJCQkJT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKKwl2aXJ0dWFsIGJvb2wJCQkJT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOworCXZpcnR1YWwgYm9vbAkJCQlPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOworCXZpcnR1YWwgYm9vbAkJCQlPblJCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHtyZXR1cm4gZmFsc2U7fQogCiAvL2J5IHdqbS4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFncyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFncyk7CisJdmlydHVhbCBib29sCQkJCU9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKIAogCXZpcnR1YWwJdm9pZAkJCQlPbkRlU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQogCXZpcnR1YWwJdm9pZAkJCQlPblNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7CiAKIAl2b2lkCQkJCQkJU2V0Rm9ybUZpbGxlcihDRkZMX0lGb3JtRmlsbGVyKiBwRmlsbGVyKXttX3BGb3JtRmlsbGVyID0gcEZpbGxlcjt9CiAJQ0ZGTF9JRm9ybUZpbGxlcioJCQlHZXRGb3JtRmlsbGVyKCkge3JldHVybiBtX3BGb3JtRmlsbGVyO30KQEAgLTE5MCwyOSArMTkwLDI5IEBACiAJdmlydHVhbCB2b2lkCQkJCUFubm90X09uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncyk7CiAJdmlydHVhbCB2b2lkCQkJCUFubm90X09uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlBbm5vdF9PbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlBbm5vdF9PbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCUFubm90X09uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCUFubm90X09uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJQW5ub3RfT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJQW5ub3RfT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJQW5ub3RfT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlBbm5vdF9PblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwogCiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFncyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJQW5ub3RfT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFncyk7CisJdmlydHVhbCBib29sCQkJCUFubm90X09uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJQW5ub3RfT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlBbm5vdF9PblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlBbm5vdF9PbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJQW5ub3RfT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJQW5ub3RfT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7CiAKIAl2aXJ0dWFsIENQREZfUmVjdAkJCUFubm90X09uR2V0Vmlld0JCb3goQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlBbm5vdF9PbkhpdFRlc3QoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJQW5ub3RfT25IaXRUZXN0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKIHByaXZhdGU6CiAJSVBERlNES19Bbm5vdEhhbmRsZXIqCQkJR2V0QW5ub3RIYW5kbGVyKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzVHlwZSkgY29uc3Q7Ci0JQ1BERlNES19Bbm5vdCoJCQkJR2V0TmV4dEFubm90KENQREZTREtfQW5ub3QqIHBTREtBbm5vdCxGWF9CT09MIGJOZXh0KTsKKwlDUERGU0RLX0Fubm90KgkJCQlHZXROZXh0QW5ub3QoQ1BERlNES19Bbm5vdCogcFNES0Fubm90LGJvb2wgYk5leHQpOwogcHJpdmF0ZToKIAlDQkFfQW5ub3RIYW5kbGVyQXJyYXkJCW1fSGFuZGxlcnM7CiAJQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgkJbV9tYXBUeXBlMkhhbmRsZXI7CkBAIC0yMjQsOCArMjI0LDggQEAKIGNsYXNzIENQREZTREtfQW5ub3RJdGVyYXRvcgogewogcHVibGljOgotICAgIENQREZTREtfQW5ub3RJdGVyYXRvcihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBGWF9CT09MIGJSZXZlcnNlLAotCQlGWF9CT09MIGJJZ25vcmVUb3Btb3N0PUZBTFNFLEZYX0JPT0wgYkNpcmNsZT1GQUxTRSxDRlhfUHRyQXJyYXkqIHBMaXN0PU5VTEwpOworICAgIENQREZTREtfQW5ub3RJdGVyYXRvcihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBib29sIGJSZXZlcnNlLAorCQlib29sIGJJZ25vcmVUb3Btb3N0PWZhbHNlLGJvb2wgYkNpcmNsZT1mYWxzZSxDRlhfUHRyQXJyYXkqIHBMaXN0PU5VTEwpOwogICAgIHZpcnR1YWwgfkNQREZTREtfQW5ub3RJdGVyYXRvcigpIHsgfQogCiAJdmlydHVhbCBDUERGU0RLX0Fubm90KglOZXh0IChjb25zdCBDUERGU0RLX0Fubm90KiBwQ3VycmVudCkgOwpAQCAtMjM0LDcgKzIzNCw3IEBACiAJdmlydHVhbCBDUERGU0RLX0Fubm90KglQcmV2KGludCYgaW5kZXggKSA7CiAJdmlydHVhbCBpbnQgICAgICAgICAgICAgQ291bnQoKXtyZXR1cm4gbV9wSXRlcmF0b3JBbm5vdExpc3QuR2V0U2l6ZSgpO30KIAotCXZpcnR1YWwgRlhfQk9PTCAgICAgICAgIEluaXRJdGVyYXRvckFubm90TGlzdChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LENGWF9QdHJBcnJheSogcExpc3Q9TlVMTCk7CisJdmlydHVhbCBib29sICAgICAgICAgSW5pdEl0ZXJhdG9yQW5ub3RMaXN0KENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsQ0ZYX1B0ckFycmF5KiBwTGlzdD1OVUxMKTsKIAogCXZvaWQJCQkJCUluc2VydFNvcnQoQ0ZYX1B0ckFycmF5ICZhcnJheUxpc3QsIEFJX0NPTVBBUkUgcENvbXBhcmUpOwogCkBAIC0yNDUsOSArMjQ1LDkgQEAKIAlDUERGU0RLX0Fubm90KglQcmV2QW5ub3QoaW50JiBpbmRleCApIDsKIAogCUNGWF9QdHJBcnJheQkgICAgIG1fcEl0ZXJhdG9yQW5ub3RMaXN0OwotCUZYX0JPT0wJCQkgICAgIG1fYlJldmVyc2U7Ci0JRlhfQk9PTCAgICAgICAgICAgICAgbV9iSWdub3JlVG9wbW9zdDsKLQlGWF9CT09MICAgICAgICAgICAgICBtX2JDaXJjbGU7CisJYm9vbAkJCSAgICAgbV9iUmV2ZXJzZTsKKwlib29sICAgICAgICAgICAgICBtX2JJZ25vcmVUb3Btb3N0OworCWJvb2wgICAgICAgICAgICAgIG1fYkNpcmNsZTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZTREtfQU5OT1RIQU5ETEVSX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnNka19iYXNlYW5ub3QuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vhbm5vdC5oCmluZGV4IGRjZDI5NWQuLmI5ZjFmY2QgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vhbm5vdC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vhbm5vdC5oCkBAIC0zOCwxMiArMzgsMTIgQEAKIAogCUNQREZTREtfRGF0ZVRpbWUmCW9wZXJhdG9yID0gKGNvbnN0IENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKIAlDUERGU0RLX0RhdGVUaW1lJglvcGVyYXRvciA9IChjb25zdCBGWF9TWVNURU1USU1FJiBzdCk7Ci0JRlhfQk9PTAkJCQlvcGVyYXRvciA9PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOwotCUZYX0JPT0wJCQkJb3BlcmF0b3IgIT0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKLQlGWF9CT09MCQkJCW9wZXJhdG9yID4gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKLQlGWF9CT09MCQkJCW9wZXJhdG9yID49IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7Ci0JRlhfQk9PTAkJCQlvcGVyYXRvciA8IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7Ci0JRlhfQk9PTAkJCQlvcGVyYXRvciA8PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOworCWJvb2wJCQkJb3BlcmF0b3IgPT0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKKwlib29sCQkJCW9wZXJhdG9yICE9IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7CisJYm9vbAkJCQlvcGVyYXRvciA+IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7CisJYm9vbAkJCQlvcGVyYXRvciA+PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOworCWJvb2wJCQkJb3BlcmF0b3IgPCAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOworCWJvb2wJCQkJb3BlcmF0b3IgPD0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKIAkJCQkJCW9wZXJhdG9yIHRpbWVfdCgpOwogCiAJQ1BERlNES19EYXRlVGltZSYJRnJvbVBERkRhdGVUaW1lU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBkdFN0cik7CkBAIC05Miw4ICs5Miw4IEBACiAJdm9pZAkJCQkJCVNldFRhYk9yZGVyKGludCBpVGFiT3JkZXIpOwogCiAJLy8gU2VsZWN0aW9uCi0JRlhfQk9PTAkJCQkJCUlzU2VsZWN0ZWQoKTsKLQl2b2lkCQkJCQkJU2V0U2VsZWN0ZWQoRlhfQk9PTCBiU2VsZWN0ZWQpOworCWJvb2wJCQkJCQlJc1NlbGVjdGVkKCk7CisJdm9pZAkJCQkJCVNldFNlbGVjdGVkKGJvb2wgYlNlbGVjdGVkKTsKIAogCUNGWF9CeXRlU3RyaW5nCQkJCUdldFR5cGUoKSBjb25zdDsKIAl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXRTdWJUeXBlKCkgY29uc3Q7CkBAIC0xNDYsOSArMTQ2LDkgQEAKIAogCXZvaWQJCQkJCQlTZXRDb2xvcihGWF9DT0xPUlJFRiBjb2xvcik7CiAJdm9pZAkJCQkJCVJlbW92ZUNvbG9yKCk7Ci0JRlhfQk9PTAkJCQkJCUdldENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7CisJYm9vbAkJCQkJCUdldENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7CiAKLQlGWF9CT09MCQkJCQkJSXNWaXNpYmxlKCkgY29uc3Q7CisJYm9vbAkJCQkJCUlzVmlzaWJsZSgpIGNvbnN0OwogCS8vYWN0aW9uCiAKIAlDUERGX0FjdGlvbgkJCQkJR2V0QWN0aW9uKCkgY29uc3Q7CkBAIC0xNjIsOCArMTYyLDggQEAKIAl2aXJ0dWFsIENQREZfQWN0aW9uCQkJR2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQpOwogCiBwdWJsaWM6Ci0JRlhfQk9PTAkJCQkJCUlzQXBwZWFyYW5jZVZhbGlkKCk7Ci0JRlhfQk9PTAkJCQkJCUlzQXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpOworCWJvb2wJCQkJCQlJc0FwcGVhcmFuY2VWYWxpZCgpOworCWJvb2wJCQkJCQlJc0FwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlKTsKIAl2b2lkCQkJCQkJRHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKIAkJQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7CiAJdm9pZAkJCQkJCURyYXdCb3JkZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKQEAgLTE4MSwxMSArMTgxLDExIEBACiAKIAogcHJpdmF0ZToKLQlGWF9CT09MIENyZWF0ZUZvcm1GaWxsZXIoKTsKKwlib29sIENyZWF0ZUZvcm1GaWxsZXIoKTsKIHByb3RlY3RlZDoKIAlDUERGX0Fubm90KgkJCW1fcEFubm90OwogCUNQREZTREtfUGFnZVZpZXcqCW1fcFBhZ2VWaWV3OwotCUZYX0JPT0wJCQkJbV9iU2VsZWN0ZWQ7CisJYm9vbAkJCQltX2JTZWxlY3RlZDsKIAlpbnQJCQkJCW1fblRhYk9yZGVyOwogCiB9OwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWZvcm0uaCBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vmb3JtLmgKaW5kZXggZWRiZDVlNC4uNmI5NzRjNSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWZvcm0uaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnNka19iYXNlZm9ybS5oCkBAIC0zNSwyOCArMzUsMjggQEAKIHsKIAlfUERGU0RLX0ZpZWxkQWN0aW9uKCkKIAl7Ci0JCWJNb2RpZmllciA9IEZBTFNFOwotCQliU2hpZnQgPSBGQUxTRTsKKwkJYk1vZGlmaWVyID0gZmFsc2U7CisJCWJTaGlmdCA9IGZhbHNlOwogCQluQ29tbWl0S2V5ID0gMDsKLQkJYktleURvd24gPSBGQUxTRTsKKwkJYktleURvd24gPSBmYWxzZTsKIAkJblNlbEVuZCA9IG5TZWxTdGFydCA9IDA7Ci0JCWJXaWxsQ29tbWl0ID0gRkFMU0U7Ci0JCWJGaWVsZEZ1bGwgPSBGQUxTRTsKLQkJYlJDID0gVFJVRTsKKwkJYldpbGxDb21taXQgPSBmYWxzZTsKKwkJYkZpZWxkRnVsbCA9IGZhbHNlOworCQliUkMgPSB0cnVlOwogCX0KIAotCUZYX0JPT0wJCQkJCWJNb2RpZmllcjsJCS8vaW4KLQlGWF9CT09MCQkJCQliU2hpZnQ7CQkJLy9pbgorCWJvb2wJCQkJCWJNb2RpZmllcjsJCS8vaW4KKwlib29sCQkJCQliU2hpZnQ7CQkJLy9pbgogCWludAkJCQkJCW5Db21taXRLZXk7CQkvL2luCiAJQ0ZYX1dpZGVTdHJpbmcJCQlzQ2hhbmdlOwkJLy9pbltvdXRdCiAJQ0ZYX1dpZGVTdHJpbmcJCQlzQ2hhbmdlRXg7CQkvL2luCi0JRlhfQk9PTAkJCQkJYktleURvd247CQkvL2luCisJYm9vbAkJCQkJYktleURvd247CQkvL2luCiAJaW50CQkJCQkJblNlbEVuZDsJCS8vaW5bb3V0XQogCWludAkJCQkJCW5TZWxTdGFydDsJCS8vaW5bb3V0XQogCUNGWF9XaWRlU3RyaW5nCQkJc1ZhbHVlOwkJCS8vaW5bb3V0XQotCUZYX0JPT0wJCQkJCWJXaWxsQ29tbWl0OwkvL2luCi0JRlhfQk9PTAkJCQkJYkZpZWxkRnVsbDsJCS8vaW4KLQlGWF9CT09MCQkJCQliUkM7CQkJLy9pbltvdXRdCisJYm9vbAkJCQkJYldpbGxDb21taXQ7CS8vaW4KKwlib29sCQkJCQliRmllbGRGdWxsOwkJLy9pbgorCWJvb2wJCQkJCWJSQzsJCQkvL2luW291dF0KIH1QREZTREtfRmllbGRBY3Rpb247CiBjbGFzcyBDUERGU0RLX1dpZGdldCA6IHB1YmxpYyBDUERGU0RLX0Fubm90CiB7CkBAIC04MCw5ICs4MCw5IEBACiAJaW50CQkJCQkJCQlHZXRGaWVsZEZsYWdzKCkgY29uc3Q7CiAJaW50CQkJCQkJCQlHZXRSb3RhdGUoKSBjb25zdDsKIAotCUZYX0JPT0wJCQkJCQkJR2V0RmlsbENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlHZXRCb3JkZXJDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJR2V0VGV4dENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7CisJYm9vbAkJCQkJCQlHZXRGaWxsQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdDsKKwlib29sCQkJCQkJCUdldEJvcmRlckNvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7CisJYm9vbAkJCQkJCQlHZXRUZXh0Q29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdDsKIAlGWF9GTE9BVAkJCQkJCUdldEZvbnRTaXplKCkgY29uc3Q7CiAKIAlpbnQJCQkJCQkJCUdldFNlbGVjdGVkSW5kZXgoaW50IG5JbmRleCkgY29uc3Q7CkBAIC05MCw5ICs5MCw5IEBACiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldERlZmF1bHRWYWx1ZSgpIGNvbnN0OwogCUNGWF9XaWRlU3RyaW5nCQkJCQlHZXRPcHRpb25MYWJlbChpbnQgbkluZGV4KSBjb25zdDsKIAlpbnQJCQkJCQkJCUNvdW50T3B0aW9ucygpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNPcHRpb25TZWxlY3RlZChpbnQgbkluZGV4KSBjb25zdDsKKwlib29sCQkJCQkJCUlzT3B0aW9uU2VsZWN0ZWQoaW50IG5JbmRleCkgY29uc3Q7CiAJaW50CQkJCQkJCQlHZXRUb3BWaXNpYmxlSW5kZXgoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzQ2hlY2tlZCgpIGNvbnN0OworCWJvb2wJCQkJCQkJSXNDaGVja2VkKCkgY29uc3Q7CiAJLyoKIAlCRl9BTElHTl9MRUZUCiAJQkZfQUxJR05fTUlEREwKQEAgLTEwMywyMCArMTAzLDIwIEBACiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldEFsdGVybmF0ZU5hbWUoKSBjb25zdDsKIAogLy9TZXQgUHJvcGVydGllcy4KLQl2b2lkCQkJCQkJCVNldENoZWNrKEZYX0JPT0wgYkNoZWNrZWQsIEZYX0JPT0wgYk5vdGlmeSk7Ci0Jdm9pZAkJCQkJCQlTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc1ZhbHVlLCBGWF9CT09MIGJOb3RpZnkpOworCXZvaWQJCQkJCQkJU2V0Q2hlY2soYm9vbCBiQ2hlY2tlZCwgYm9vbCBiTm90aWZ5KTsKKwl2b2lkCQkJCQkJCVNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVmFsdWUsIGJvb2wgYk5vdGlmeSk7CiAJdm9pZAkJCQkJCQlTZXREZWZhdWx0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNWYWx1ZSk7Ci0Jdm9pZAkJCQkJCQlTZXRPcHRpb25TZWxlY3Rpb24oaW50IGluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCwgRlhfQk9PTCBiTm90aWZ5KTsKLQl2b2lkCQkJCQkJCUNsZWFyU2VsZWN0aW9uKEZYX0JPT0wgYk5vdGlmeSk7CisJdm9pZAkJCQkJCQlTZXRPcHRpb25TZWxlY3Rpb24oaW50IGluZGV4LCBib29sIGJTZWxlY3RlZCwgYm9vbCBiTm90aWZ5KTsKKwl2b2lkCQkJCQkJCUNsZWFyU2VsZWN0aW9uKGJvb2wgYk5vdGlmeSk7CiAJdm9pZAkJCQkJCQlTZXRUb3BWaXNpYmxlSW5kZXgoaW50IGluZGV4KTsKIAotCXZvaWQJCQkJCQkJUmVzZXRBcHBlYXJhbmNlKGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUsIEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCk7Ci0Jdm9pZAkJCQkJCQlSZXNldEZpZWxkQXBwZWFyYW5jZShGWF9CT09MIGJWYWx1ZUNoYW5nZWQpOworCXZvaWQJCQkJCQkJUmVzZXRBcHBlYXJhbmNlKGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUsIGJvb2wgYlZhbHVlQ2hhbmdlZCk7CisJdm9pZAkJCQkJCQlSZXNldEZpZWxkQXBwZWFyYW5jZShib29sIGJWYWx1ZUNoYW5nZWQpOwogCXZvaWQJCQkJCQkJVXBkYXRlRmllbGQoKTsKLQlDRlhfV2lkZVN0cmluZwkJCQkJT25Gb3JtYXQoRlhfQk9PTCYgYkZvcm1hdGVkKTsKKwlDRlhfV2lkZVN0cmluZwkJCQkJT25Gb3JtYXQoYm9vbCYgYkZvcm1hdGVkKTsKIAogLy9NZXNzYWdlLgotIAlGWF9CT09MCQkJCQkJCU9uQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSwKKyAJYm9vbAkJCQkJCQlPbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsCiAJCQkJCQkJCQkJCQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCiAJQ1BERlNES19JbnRlckZvcm0qCQkJCUdldEludGVyRm9ybSgpIGNvbnN0IHtyZXR1cm4gbV9wSW50ZXJGb3JtO30KQEAgLTEyOCw3ICsxMjgsNyBAQAogCiAJdm9pZAkJCQkJCQlTZXRBcHBNb2RpZmllZCgpOwogCXZvaWQJCQkJCQkJQ2xlYXJBcHBNb2RpZmllZCgpOwotCUZYX0JPT0wJCQkJCQkJSXNBcHBNb2RpZmllZCgpIGNvbnN0OworCWJvb2wJCQkJCQkJSXNBcHBNb2RpZmllZCgpIGNvbnN0OwogCiAJaW50MzJfdAkJCQkJCUdldEFwcGVhcmFuY2VBZ2UoKSBjb25zdDsKIAlpbnQzMl90CQkJCQkJR2V0VmFsdWVBZ2UoKSBjb25zdDsKQEAgLTE1NSwxNCArMTU1LDE0IEBACiAJdm9pZAkJCQkJCQlBZGRJbWFnZVRvQXBwZWFyYW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0FQVHlwZSwgQ1BERl9TdHJlYW0qIHBJbWFnZSk7CiAJdm9pZAkJCQkJCQlSZW1vdmVBcHBlYXJhbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlKTsKIHB1YmxpYzoKLQlGWF9CT09MCQkJCQkJCUlzV2lkZ2V0QXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpOworCWJvb2wJCQkJCQkJSXNXaWRnZXRBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSk7CiAJdm9pZAkJCQkJCQlEcmF3QXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAogCQlDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKTsKIHB1YmxpYzoKLQlGWF9CT09MCQkJCQkJCUhpdFRlc3QoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKTsKKwlib29sCQkJCQkJCUhpdFRlc3QoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKTsKIHByaXZhdGU6CiAJQ1BERlNES19JbnRlckZvcm0qCQkJCW1fcEludGVyRm9ybTsKLQlGWF9CT09MCQkJCQkJCW1fYkFwcE1vZGlmaWVkOworCWJvb2wJCQkJCQkJbV9iQXBwTW9kaWZpZWQ7CiAJaW50MzJfdAkJCQkJCW1fbkFwcEFnZTsKIAlpbnQzMl90CQkJCQkJbV9uVmFsdWVBZ2U7CiB9OwpAQCAtMTc2LDkgKzE3Niw5IEBACiAJQ1BERl9JbnRlckZvcm0qIEdldEludGVyRm9ybSgpIGNvbnN0IHsgcmV0dXJuIG1fcEludGVyRm9ybTsgfQogCUNQREZTREtfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wRG9jdW1lbnQ7IH0KIAotCUZYX0JPT0wJCQkJCQkJSGlnaGxpZ2h0V2lkZ2V0cygpOworCWJvb2wJCQkJCQkJSGlnaGxpZ2h0V2lkZ2V0cygpOwogCi0JQ1BERlNES19XaWRnZXQqCQkJCQlHZXRTaWJsaW5nKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9CT09MIGJOZXh0KSBjb25zdDsKKwlDUERGU0RLX1dpZGdldCoJCQkJCUdldFNpYmxpbmcoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIGJvb2wgYk5leHQpIGNvbnN0OwogCUNQREZTREtfV2lkZ2V0KgkJCQkJR2V0V2lkZ2V0KENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sKSBjb25zdDsKIAl2b2lkCQkJCQkJCUdldFdpZGdldHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNGaWVsZE5hbWUsIENGWF9QdHJBcnJheSYgd2lkZ2V0cyk7CiAJdm9pZAkJCQkJCQlHZXRXaWRnZXRzKENQREZfRm9ybUZpZWxkKiBwRmllbGQsIENGWF9QdHJBcnJheSYgd2lkZ2V0cyk7CkBAIC0xODYsMzMgKzE4NiwzMyBAQAogCXZvaWQJCQkJCQkJQWRkTWFwKENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sLCBDUERGU0RLX1dpZGdldCogcFdpZGdldCk7CiAJdm9pZAkJCQkJCQlSZW1vdmVNYXAoQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wpOwogCi0Jdm9pZAkJCQkJCQlFbmFibGVDYWxjdWxhdGUoRlhfQk9PTCBiRW5hYmxlZCk7Ci0JRlhfQk9PTAkJCQkJCQlJc0NhbGN1bGF0ZUVuYWJsZWQoKSBjb25zdDsKKwl2b2lkCQkJCQkJCUVuYWJsZUNhbGN1bGF0ZShib29sIGJFbmFibGVkKTsKKwlib29sCQkJCQkJCUlzQ2FsY3VsYXRlRW5hYmxlZCgpIGNvbnN0OwogCiAjaWZkZWYgX1dJTjMyCiAJQ1BERl9TdHJlYW0qCQkJCQlMb2FkSW1hZ2VGcm9tRmlsZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc0ZpbGUpOwogI2VuZGlmCiAKLQl2b2lkCQkJCQkJCU9uS2V5U3Ryb2tlQ29tbWl0KENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSwgRlhfQk9PTCYgYlJDKTsKLQl2b2lkCQkJCQkJCU9uVmFsaWRhdGUoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlLCBGWF9CT09MJiBiUkMpOworCXZvaWQJCQkJCQkJT25LZXlTdHJva2VDb21taXQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlLCBib29sJiBiUkMpOworCXZvaWQJCQkJCQkJT25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUsIGJvb2wmIGJSQyk7CiAJdm9pZAkJCQkJCQlPbkNhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IE5VTEwpOwotCUNGWF9XaWRlU3RyaW5nCQkJCQlPbkZvcm1hdChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgRlhfQk9PTCYgYkZvcm1hdGVkKTsKKwlDRlhfV2lkZVN0cmluZwkJCQkJT25Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIGJvb2wmIGJGb3JtYXRlZCk7CiAKLQl2b2lkCQkJCQkJCVJlc2V0RmllbGRBcHBlYXJhbmNlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBjb25zdCBGWF9XQ0hBUiogc1ZhbHVlLCBGWF9CT09MIGJWYWx1ZUNoYW5nZWQpOworCXZvaWQJCQkJCQkJUmVzZXRGaWVsZEFwcGVhcmFuY2UoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUsIGJvb2wgYlZhbHVlQ2hhbmdlZCk7CiAJdm9pZAkJCQkJCQlVcGRhdGVGaWVsZChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCk7CiAKLQlGWF9CT09MCQkJCQkJCURvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7Ci0JRlhfQk9PTAkJCQkJCQlEb0FjdGlvbl9TdWJtaXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOwotCUZYX0JPT0wJCQkJCQkJRG9BY3Rpb25fUmVzZXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOwotCUZYX0JPT0wJCQkJCQkJRG9BY3Rpb25fSW1wb3J0RGF0YShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKTsKKwlib29sCQkJCQkJCURvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7CisJYm9vbAkJCQkJCQlEb0FjdGlvbl9TdWJtaXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOworCWJvb2wJCQkJCQkJRG9BY3Rpb25fUmVzZXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOworCWJvb2wJCQkJCQkJRG9BY3Rpb25fSW1wb3J0RGF0YShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKTsKIAogCXZvaWQJCQkJCQkJR2V0RmllbGRGcm9tT2JqZWN0cyhjb25zdCBDRlhfUHRyQXJyYXkmIG9iamVjdHMsIENGWF9QdHJBcnJheSYgZmllbGRzKTsKLQlGWF9CT09MCQkJCQkJCUlzVmFsaWRGaWVsZChDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpOwotCUZYX0JPT0wJCQkJCQkJU3VibWl0RmllbGRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0Rlc3RpbmF0aW9uLCBjb25zdCBDRlhfUHRyQXJyYXkmIGZpZWxkcywKLQkJRlhfQk9PTCBiSW5jbHVkZU9yRXhjbHVkZSwgRlhfQk9PTCBiVXJsRW5jb2RlZCk7Ci0JRlhfQk9PTAkJCQkJCQlTdWJtaXRGb3JtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRGVzdGluYXRpb24sIEZYX0JPT0wgYlVybEVuY29kZWQpOwotCUZYX0JPT0wJCQkJCQkJRXhwb3J0Rm9ybVRvRkRGVGV4dEJ1ZihDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYpOwotCUZYX0JPT0wJCQkJCQkJRXhwb3J0RmllbGRzVG9GREZUZXh0QnVmKGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUsIENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1Zik7CisJYm9vbAkJCQkJCQlJc1ZhbGlkRmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KTsKKwlib29sCQkJCQkJCVN1Ym1pdEZpZWxkcyhjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NEZXN0aW5hdGlvbiwgY29uc3QgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsCisJCWJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUsIGJvb2wgYlVybEVuY29kZWQpOworCWJvb2wJCQkJCQkJU3VibWl0Rm9ybShjb25zdCBDRlhfV2lkZVN0cmluZyYgc0Rlc3RpbmF0aW9uLCBib29sIGJVcmxFbmNvZGVkKTsKKwlib29sCQkJCQkJCUV4cG9ydEZvcm1Ub0ZERlRleHRCdWYoQ0ZYX0J5dGVUZXh0QnVmJiB0ZXh0QnVmKTsKKwlib29sCQkJCQkJCUV4cG9ydEZpZWxkc1RvRkRGVGV4dEJ1Zihjb25zdCBDRlhfUHRyQXJyYXkmIGZpZWxkcyxib29sIGJJbmNsdWRlT3JFeGNsdWRlLCBDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYpOwogCUNGWF9XaWRlU3RyaW5nCQkJCQlHZXRUZW1wb3JhcnlGaWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc0ZpbGVFeHQpOwogCiBwcml2YXRlOgpAQCAtMjI2LDggKzIyNiw4IEBACiAJdmlydHVhbCBpbnQJCQkJCQlCZWZvcmVGb3JtSW1wb3J0RGF0YShjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pOwogCXZpcnR1YWwgaW50CQkJCQkJQWZ0ZXJGb3JtSW1wb3J0RGF0YShjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pOwogCi0JRlhfQk9PTAkJCQkJCQlGREZUb1VSTEVuY29kZWREYXRhKENGWF9XaWRlU3RyaW5nIGNzRkRGRmlsZSwgQ0ZYX1dpZGVTdHJpbmcgY3NUeHRGaWxlKTsKLQlGWF9CT09MCQkJCQkJCUZERlRvVVJMRW5jb2RlZERhdGEodWludDhfdComIHBCdWYsIEZYX1NUUlNJWkUmIG5CdWZTaXplKTsKKwlib29sCQkJCQkJCUZERlRvVVJMRW5jb2RlZERhdGEoQ0ZYX1dpZGVTdHJpbmcgY3NGREZGaWxlLCBDRlhfV2lkZVN0cmluZyBjc1R4dEZpbGUpOworCWJvb2wJCQkJCQkJRkRGVG9VUkxFbmNvZGVkRGF0YSh1aW50OF90KiYgcEJ1ZiwgRlhfU1RSU0laRSYgbkJ1ZlNpemUpOwogCWludAkJCQkJCQkJR2V0UGFnZUluZGV4QnlBbm5vdERpY3QoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpIGNvbnN0OwogCXZvaWQJCQkJCQkJRG9GREZCdWZmZXIoQ0ZYX0J5dGVTdHJpbmcgc0J1ZmZlcik7CiAKQEAgLTIzNiwxMSArMjM2LDExIEBACiAgICAgQ1BERlNES19Eb2N1bWVudCogbV9wRG9jdW1lbnQ7CiAgICAgQ1BERl9JbnRlckZvcm0qIG1fcEludGVyRm9ybTsKICAgICBDUERGU0RLX1dpZGdldE1hcCBtX01hcDsKLSAgICBGWF9CT09MIG1fYkNhbGN1bGF0ZTsKLSAgICBGWF9CT09MIG1fYkJ1c3k7CisgICAgYm9vbCBtX2JDYWxjdWxhdGU7CisgICAgYm9vbCBtX2JCdXN5OwogCiBwdWJsaWM6Ci0JRlhfQk9PTCBJc05lZWRIaWdoTGlnaHQoaW50IG5GaWVsZFR5cGUpOworCWJvb2wgSXNOZWVkSGlnaExpZ2h0KGludCBuRmllbGRUeXBlKTsKIAl2b2lkICAgIFJlbW92ZUFsbEhpZ2hMaWdodCgpOwogCXZvaWQgICAgU2V0SGlnaGxpZ2h0QWxwaGEodWludDhfdCBhbHBoYSkge21faUhpZ2hsaWdodEFscGhhID0gYWxwaGE7fQogCXVpbnQ4X3QgR2V0SGlnaGxpZ2h0QWxwaGEoKSB7cmV0dXJuIG1faUhpZ2hsaWdodEFscGhhO30KQEAgLTI0OSw3ICsyNDksNyBAQAogcHJpdmF0ZToKIAlGWF9DT0xPUlJFRiBtX2FIaWdobGlnaHRDb2xvcls2XTsKIAl1aW50OF90IG1faUhpZ2hsaWdodEFscGhhOwotCUZYX0JPT0wJbV9iTmVlZEhpZ2h0bGlnaHRbNl07CisJYm9vbAltX2JOZWVkSGlnaHRsaWdodFs2XTsKIH07CiAKICNkZWZpbmUgQkFJX1NUUlVDVFVSRQkJMApkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfZGVmaW5lLmggYi9mcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaAppbmRleCAyOWIyNjVhLi40MTYwNzkyIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaApAQCAtNDksNyArNDksNyBAQAogCiAJdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkgb3ZlcnJpZGUgeyBkZWxldGUgdGhpczsgfQogCi0JdmlydHVhbCBGWF9CT09MCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKwl2aXJ0dWFsIGJvb2wJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogCUZQREZfRklMRUFDQ0VTUwkJbV9GaWxlQWNjZXNzOwpAQCAtNjAsNyArNjAsNyBAQAogRlBERl9CT09MIEZTREtfSXNTYW5kQm94UG9saWN5RW5hYmxlZChGUERGX0RXT1JEIHBvbGljeSk7CiB2b2lkIEZQREZfUmVuZGVyUGFnZV9SZXRhaWwoQ1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBGUERGX1BBR0UgcGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsIGludCBzaXplX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwgaW50IGZsYWdzLCBGWF9CT09MIGJOZWVkVG9SZXN0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsIGludCBmbGFncywgYm9vbCBiTmVlZFRvUmVzdG9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlNES19QQVVTRV9BZGFwdGVyKiBwYXVzZSk7CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZTREtfREVGSU5FX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnNka19tZ3IuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oCmluZGV4IGQ1NzEzOGIuLjFjZTU3YzUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oCkBAIC05MiwyNCArOTIsMjQgQEAKICAgICAgICAgICAgIG1fcEluZm8tPkZGSV9PbkNoYW5nZShtX3BJbmZvKTsKICAgICB9CiAKLSAgICBGWF9CT09MIEZGSV9Jc1NISUZUS2V5RG93bihGWF9EV09SRCBuRmxhZykgY29uc3QKKyAgICBib29sIEZGSV9Jc1NISUZUS2V5RG93bihGWF9EV09SRCBuRmxhZykgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiAobkZsYWcgJiBGV0xfRVZFTlRGTEFHX1NoaWZ0S2V5KSAhPSAwOwogICAgIH0KIAotICAgIEZYX0JPT0wgRkZJX0lzQ1RSTEtleURvd24oRlhfRFdPUkQgbkZsYWcpIGNvbnN0CisgICAgYm9vbCBGRklfSXNDVFJMS2V5RG93bihGWF9EV09SRCBuRmxhZykgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiAobkZsYWcgJiBGV0xfRVZFTlRGTEFHX0NvbnRyb2xLZXkpICE9IDA7CiAgICAgfQogCi0gICAgRlhfQk9PTCBGRklfSXNBTFRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSBjb25zdAorICAgIGJvb2wgRkZJX0lzQUxUS2V5RG93bihGWF9EV09SRCBuRmxhZykgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiAobkZsYWcgJiBGV0xfRVZFTlRGTEFHX0FsdEtleSkgIT0gMDsKICAgICB9CiAKLSAgICBGWF9CT09MIEZGSV9Jc0lOU0VSVEtleURvd24oRlhfRFdPUkQgbkZsYWcpIGNvbnN0CisgICAgYm9vbCBGRklfSXNJTlNFUlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgaW50IEpTX2FwcEFsZXJ0KGNvbnN0IEZYX1dDSEFSKiBNc2csIGNvbnN0IEZYX1dDSEFSKiBUaXRsZSwgRlhfVUlOVCBUeXBlLCBGWF9VSU5UIEljb24pOwpAQCAtMTc0LDcgKzE3NCw3IEBACiAgICAgICAgICAgICBtX3BJbmZvLT5GRklfRXhlY3V0ZU5hbWVkQWN0aW9uKG1fcEluZm8sIG5hbWVkQWN0aW9uKTsKICAgICB9CiAKLSAgICB2b2lkIEZGSV9PblNldEZpZWxkSW5wdXRGb2N1cyh2b2lkKiBmaWVsZCxGUERGX1dJREVTVFJJTkcgZm9jdXNUZXh0LCBGUERGX0RXT1JEIG5UZXh0TGVuLCBGWF9CT09MIGJGb2N1cykKKyAgICB2b2lkIEZGSV9PblNldEZpZWxkSW5wdXRGb2N1cyh2b2lkKiBmaWVsZCxGUERGX1dJREVTVFJJTkcgZm9jdXNUZXh0LCBGUERGX0RXT1JEIG5UZXh0TGVuLCBib29sIGJGb2N1cykKICAgICB7CiAgICAgICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9TZXRUZXh0RmllbGRGb2N1cykKICAgICAgICAgICAgIG1fcEluZm8tPkZGSV9TZXRUZXh0RmllbGRGb2N1cyhtX3BJbmZvLCBmb2N1c1RleHQsIG5UZXh0TGVuLCBiRm9jdXMpOwpAQCAtMTkyLDcgKzE5Miw3IEBACiAgICAgICAgICAgICBtX3BJbmZvLT5GRklfRG9Hb1RvQWN0aW9uKG1fcEluZm8sIG5QYWdlSW5kZXgsIHpvb21Nb2RlLCBmUG9zQXJyYXksIHNpemVPZkFycmF5KTsKICAgICB9CiAKLSAgICBGWF9CT09MIElzSlNJbml0aWF0ZWQoKSBjb25zdCB7IHJldHVybiBtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm07IH0KKyAgICBib29sIElzSlNJbml0aWF0ZWQoKSBjb25zdCB7IHJldHVybiBtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm07IH0KICAgICB2b2lkIFNldFNES0RvY3VtZW50KENQREZTREtfRG9jdW1lbnQqIHBGWERvYykgeyBtX3BTREtEb2MgPSBwRlhEb2M7IH0KICAgICBDUERGU0RLX0RvY3VtZW50KiBHZXRTREtEb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcFNES0RvYzsgfQogICAgIENQREZfRG9jdW1lbnQqIEdldFBERkRvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wUERGRG9jOyB9CkBAIC0yMjcsNyArMjI3LDcgQEAKICAgICBDUERGU0RLX0ludGVyRm9ybSogICAgICBHZXRJbnRlckZvcm0oKSA7CiAgICAgQ1BERl9Eb2N1bWVudCogICAgICAgICAgR2V0RG9jdW1lbnQoKSB7cmV0dXJuIG1fcERvYzt9CiAKLSAgICBDUERGU0RLX1BhZ2VWaWV3KiAgICAgICBHZXRQYWdlVmlldyhDUERGX1BhZ2UqIHBQREZQYWdlLCBGWF9CT09MIFJlTmV3ID0gVFJVRSk7CisgICAgQ1BERlNES19QYWdlVmlldyogICAgICAgR2V0UGFnZVZpZXcoQ1BERl9QYWdlKiBwUERGUGFnZSwgYm9vbCBSZU5ldyA9IHRydWUpOwogICAgIENQREZTREtfUGFnZVZpZXcqICAgICAgIEdldFBhZ2VWaWV3KGludCBuSW5kZXgpOwogICAgIENQREZTREtfUGFnZVZpZXcqICAgICAgIEdldEN1cnJlbnRWaWV3KCk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgUmVNb3ZlUGFnZVZpZXcoQ1BERl9QYWdlKiBwUERGUGFnZSk7CkBAIC0yMzcsMjUgKzIzNywyNSBAQAogCiAgICAgSUZYSlNfUnVudGltZSAqICAgICAgICAgR2V0SnNSdW50aW1lKCk7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBTZXRGb2N1c0Fubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyA9IDApOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIEtpbGxGb2N1c0Fubm90KEZYX1VJTlQgbkZsYWcgPSAwKTsKKyAgICBib29sICAgICAgICAgICAgICAgICBTZXRGb2N1c0Fubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyA9IDApOworICAgIGJvb2wgICAgICAgICAgICAgICAgIEtpbGxGb2N1c0Fubm90KEZYX1VJTlQgbkZsYWcgPSAwKTsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIEV4dHJhY3RQYWdlcyhjb25zdCBDRlhfV29yZEFycmF5ICZhcnJFeHRyYVBhZ2VzLCBDUERGX0RvY3VtZW50KiBwRHN0RG9jKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBJbnNlcnRQYWdlcyhpbnQgbkluc2VydEF0LCBjb25zdCBDUERGX0RvY3VtZW50KiBwU3JjRG9jLCBjb25zdCBDRlhfV29yZEFycmF5ICZhcnJTcmNQYWdlcyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgUmVwbGFjZVBhZ2VzKGludCBuUGFnZSwgY29uc3QgQ1BERl9Eb2N1bWVudCogcFNyY0RvYywgY29uc3QgQ0ZYX1dvcmRBcnJheSAmYXJyU3JjUGFnZXMpOworICAgIGJvb2wgICAgICAgICAgICAgICAgIEV4dHJhY3RQYWdlcyhjb25zdCBDRlhfV29yZEFycmF5ICZhcnJFeHRyYVBhZ2VzLCBDUERGX0RvY3VtZW50KiBwRHN0RG9jKTsKKyAgICBib29sICAgICAgICAgICAgICAgICBJbnNlcnRQYWdlcyhpbnQgbkluc2VydEF0LCBjb25zdCBDUERGX0RvY3VtZW50KiBwU3JjRG9jLCBjb25zdCBDRlhfV29yZEFycmF5ICZhcnJTcmNQYWdlcyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgUmVwbGFjZVBhZ2VzKGludCBuUGFnZSwgY29uc3QgQ1BERl9Eb2N1bWVudCogcFNyY0RvYywgY29uc3QgQ0ZYX1dvcmRBcnJheSAmYXJyU3JjUGFnZXMpOwogCiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgT25DbG9zZURvY3VtZW50KCk7CiAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBHZXRQYWdlQ291bnQoKSB7cmV0dXJuIG1fcERvYy0+R2V0UGFnZUNvdW50KCk7fQotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIEdldFBlcm1pc3Npb25zKGludCBuRmxhZyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgR2V0Q2hhbmdlTWFyaygpIHtyZXR1cm4gbV9iQ2hhbmdlTWFzazt9Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgU2V0Q2hhbmdlTWFyaygpIHttX2JDaGFuZ2VNYXNrID0gVFJVRTt9Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgQ2xlYXJDaGFuZ2VNYXJrKCkge21fYkNoYW5nZU1hc2s9IEZBTFNFO30KKyAgICBib29sICAgICAgICAgICAgICAgICBHZXRQZXJtaXNzaW9ucyhpbnQgbkZsYWcpOworICAgIGJvb2wgICAgICAgICAgICAgICAgIEdldENoYW5nZU1hcmsoKSB7cmV0dXJuIG1fYkNoYW5nZU1hc2s7fQorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIFNldENoYW5nZU1hcmsoKSB7bV9iQ2hhbmdlTWFzayA9IHRydWU7fQorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIENsZWFyQ2hhbmdlTWFyaygpIHttX2JDaGFuZ2VNYXNrPSBmYWxzZTt9CiAgICAgQ0ZYX1dpZGVTdHJpbmcgICAgICAgICAgR2V0UGF0aCgpIDsKICAgICBDUERGX1BhZ2UqICAgICAgICAgICAgICBHZXRQYWdlKGludCBuSW5kZXgpOwogICAgIENQREZEb2NfRW52aXJvbm1lbnQgKiAgIEdldEVudigpIHtyZXR1cm4gbV9wRW52OyB9CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgUHJvY0phdmFzY3JpcHRGdW4oKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBQcm9jT3BlbkFjdGlvbigpOworICAgIGJvb2wgICAgICAgICAgICAgICAgIFByb2NPcGVuQWN0aW9uKCk7CiAgICAgQ1BERl9PQ0NvbnRleHQqICAgICAgICAgR2V0T0NDb250ZXh0KCk7CiBwcml2YXRlOgogICAgIHN0ZDo6bWFwPENQREZfUGFnZSosIENQREZTREtfUGFnZVZpZXcqPiBtX3BhZ2VNYXA7CkBAIC0yNjQsNyArMjY0LDcgQEAKICAgICBDUERGU0RLX0Fubm90KiBtX3BGb2N1c0Fubm90OwogICAgIENQREZEb2NfRW52aXJvbm1lbnQqIG1fcEVudjsKICAgICBDUERGX09DQ29udGV4dCogbV9wT2Njb250ZW50OwotICAgIEZYX0JPT0wgbV9iQ2hhbmdlTWFzazsKKyAgICBib29sIG1fYkNoYW5nZU1hc2s7CiB9OwogY2xhc3MgQ1BERlNES19QYWdlVmlldyBmaW5hbAogewpAQCAtMjc4LDI4ICsyNzgsMjggQEAKICAgICBDUERGU0RLX0Fubm90KiAgICAgICAgICAgICAgICAgIEdldEZYV2lkZ2V0QXRQb2ludChGWF9GTE9BVCBwYWdlWCwgRlhfRkxPQVQgcGFnZVkpOwogICAgIENQREZTREtfQW5ub3QqICAgICAgICAgICAgICAgICAgR2V0Rm9jdXNBbm5vdCgpIDsKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEZvY3VzQW5ub3QoQ1BERlNES19Bbm5vdCogcFNES0Fubm90LEZYX1VJTlQgbkZsYWcgPSAwKSB7bV9wU0RLRG9jLT5TZXRGb2N1c0Fubm90KHBTREtBbm5vdCwgbkZsYWcpO30KLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgIEtpbGxGb2N1c0Fubm90KEZYX1VJTlQgbkZsYWcgPSAwKSB7cmV0dXJuIG1fcFNES0RvYy0+S2lsbEZvY3VzQW5ub3QobkZsYWcpO30KLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90X0hhc0FwcGVhcmFuY2UoQ1BERl9Bbm5vdCogcEFubm90KTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgIEtpbGxGb2N1c0Fubm90KEZYX1VJTlQgbkZsYWcgPSAwKSB7cmV0dXJuIG1fcFNES0RvYy0+S2lsbEZvY3VzQW5ub3QobkZsYWcpO30KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90X0hhc0FwcGVhcmFuY2UoQ1BERl9Bbm5vdCogcEFubm90KTsKIAogICAgIENQREZTREtfQW5ub3QqICAgICAgICAgICAgICAgICAgQWRkQW5ub3QoQ1BERl9EaWN0aW9uYXJ5ICogcERpY3QpOwogICAgIENQREZTREtfQW5ub3QqICAgICAgICAgICAgICAgICAgQWRkQW5ub3QoY29uc3QgRlhfQ0hBUiogbHBTdWJUeXBlLENQREZfRGljdGlvbmFyeSAqIHBEaWN0KTsKICAgICBDUERGU0RLX0Fubm90KiAgICAgICAgICAgICAgICAgIEFkZEFubm90KENQREZfQW5ub3QgKiBwUERGQW5ub3QpOwotICAgICAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgRGVsZXRlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgIERlbGV0ZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudEFubm90cygpOwogICAgIENQREZTREtfQW5ub3QqICAgICAgICAgICAgICAgICAgR2V0QW5ub3QoaW50IG5JbmRleCk7CiAgICAgQ1BERlNES19Bbm5vdCogICAgICAgICAgICAgICAgICBHZXRBbm5vdEJ5RGljdChDUERGX0RpY3Rpb25hcnkgKiBwRGljdCk7CiAgICAgQ1BERl9QYWdlKiAgICAgICAgICAgICAgICAgICAgICBHZXRQREZQYWdlKCl7cmV0dXJuIG1fcGFnZTt9CiAgICAgQ1BERl9Eb2N1bWVudCogICAgICAgICAgICAgICAgICBHZXRQREZEb2N1bWVudCgpOwogICAgIENQREZTREtfRG9jdW1lbnQqICAgICAgICAgICAgICAgR2V0U0RLRG9jdW1lbnQoKSB7cmV0dXJuIG1fcFNES0RvYzt9Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIE9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfVUlOVCBuRmxhZyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgT25DaGFyKGludCBuQ2hhciwgRlhfVUlOVCBuRmxhZyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgT25LZXlEb3duKGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBPbktleVVwKGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKKyAgICBib29sICAgICAgICAgICAgICAgICBPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfVUlOVCBuRmxhZyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9VSU5UIG5GbGFnKTsKKyAgICBib29sICAgICAgICAgICAgICAgICBPbkNoYXIoaW50IG5DaGFyLCBGWF9VSU5UIG5GbGFnKTsKKyAgICBib29sICAgICAgICAgICAgICAgICBPbktleURvd24oaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOworICAgIGJvb2wgICAgICAgICAgICAgICAgIE9uS2V5VXAoaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBpbnQgbkZsYWcpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIE9uTW91c2VXaGVlbChkb3VibGUgZGVsdGFYLCBkb3VibGUgZGVsdGFZLGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBpbnQgbkZsYWcpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIElzVmFsaWRBbm5vdCh2b2lkKiBwKTsKKyAgICBib29sICAgICAgICAgICAgICAgICBPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIGludCBuRmxhZyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgT25Nb3VzZVdoZWVsKGRvdWJsZSBkZWx0YVgsIGRvdWJsZSBkZWx0YVksY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIGludCBuRmxhZyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgSXNWYWxpZEFubm90KHZvaWQqIHApOwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRNYXRyaXgoQ1BERl9NYXRyaXgmIG1hdHJpeCkge21hdHJpeCA9IG1fY3VyTWF0cml4O30KICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBVcGRhdGVSZWN0cyhDRlhfUmVjdEFycmF5JiByZWN0cyk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVWaWV3KENQREZTREtfQW5ub3QqIHBBbm5vdCk7CkBAIC0zMDgsMTEgKzMwOCwxMSBAQAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIEdldFBhZ2VJbmRleCgpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZEZYQW5ub3RzKCk7CiAKLSAgICAgICAgdm9pZCBTZXRWYWxpZChGWF9CT09MIGJWYWxpZCkge21fYlZhbGlkID0gYlZhbGlkO30KLSAgICAgICAgRlhfQk9PTCBJc1ZhbGlkKCkge3JldHVybiBtX2JWYWxpZDt9Ci0gICAgICAgIHZvaWQgU2V0TG9jayhGWF9CT09MIGJMb2NrZWQpIHttX2JMb2NrZWQ9IGJMb2NrZWQ7fQotICAgICAgICBGWF9CT09MIElzTG9ja2VkKCkge3JldHVybiBtX2JMb2NrZWQ7fQotICAgICAgICB2b2lkIFRha2VPdmVyUGFnZSgpIHttX2JUYWtlT3ZlclBhZ2UgPSBUUlVFO30KKyAgICAgICAgdm9pZCBTZXRWYWxpZChib29sIGJWYWxpZCkge21fYlZhbGlkID0gYlZhbGlkO30KKyAgICAgICAgYm9vbCBJc1ZhbGlkKCkge3JldHVybiBtX2JWYWxpZDt9CisgICAgICAgIHZvaWQgU2V0TG9jayhib29sIGJMb2NrZWQpIHttX2JMb2NrZWQ9IGJMb2NrZWQ7fQorICAgICAgICBib29sIElzTG9ja2VkKCkge3JldHVybiBtX2JMb2NrZWQ7fQorICAgICAgICB2b2lkIFRha2VPdmVyUGFnZSgpIHttX2JUYWtlT3ZlclBhZ2UgPSB0cnVlO30KIHByaXZhdGU6CiAgICAgdm9pZCBQYWdlVmlld19PbkhpZ2hsaWdodEZvcm1GaWVsZHMoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpOwogICAgICAgICBDUERGX01hdHJpeCBtX2N1ck1hdHJpeDsKQEAgLTMyMiwxMiArMzIyLDEyIEBACiAgICAgQ0ZYX1B0ckFycmF5ICBtX2Z4QW5ub3RBcnJheTsKICAgICBDUERGU0RLX0RvY3VtZW50KiBtX3BTREtEb2M7CiAgICAgQ1BERlNES19XaWRnZXQqIG1fQ2FwdHVyZVdpZGdldDsKLSAgICBGWF9CT09MIG1fYkVudGVyV2lkZ2V0OwotICAgIEZYX0JPT0wgbV9iRXhpdFdpZGdldDsKLSAgICBGWF9CT09MIG1fYk9uV2lkZ2V0OwotICAgIEZYX0JPT0wgbV9iVmFsaWQ7Ci0gICAgICAgIEZYX0JPT0wgbV9iTG9ja2VkOwotICAgICAgICBGWF9CT09MIG1fYlRha2VPdmVyUGFnZTsKKyAgICBib29sIG1fYkVudGVyV2lkZ2V0OworICAgIGJvb2wgbV9iRXhpdFdpZGdldDsKKyAgICBib29sIG1fYk9uV2lkZ2V0OworICAgIGJvb2wgbV9iVmFsaWQ7CisgICAgICAgIGJvb2wgbV9iTG9ja2VkOworICAgICAgICBib29sIG1fYlRha2VPdmVyUGFnZTsKIH07CiAKIApAQCAtMzQwLDE0ICszNDAsMTQgQEAKIAogICAgIHR5cGVkZWYgaW50ICgqTFBfQ09NUEFSRSkoVFlQRSBwMSwgVFlQRSBwMik7CiAKLSAgICB2b2lkIFNvcnQoTFBfQ09NUEFSRSBwQ29tcGFyZSwgRlhfQk9PTCBiQXNjZW50ID0gVFJVRSkKKyAgICB2b2lkIFNvcnQoTFBfQ09NUEFSRSBwQ29tcGFyZSwgYm9vbCBiQXNjZW50ID0gdHJ1ZSkKICAgICB7CiAgICAgICAgIGludCBuU2l6ZSA9IHRoaXMtPkdldFNpemUoKTsKICAgICAgICAgUXVpY2tTb3J0KDAsIG5TaXplIC0xLCBiQXNjZW50LCBwQ29tcGFyZSk7CiAgICAgfQogCiBwcml2YXRlOgotICAgIHZvaWQgUXVpY2tTb3J0KEZYX1VJTlQgblN0YXJ0UG9zLCBGWF9VSU5UIG5TdG9wUG9zLCBGWF9CT09MIGJBc2NlbmQsIExQX0NPTVBBUkUgcENvbXBhcmUpCisgICAgdm9pZCBRdWlja1NvcnQoRlhfVUlOVCBuU3RhcnRQb3MsIEZYX1VJTlQgblN0b3BQb3MsIGJvb2wgYkFzY2VuZCwgTFBfQ09NUEFSRSBwQ29tcGFyZSkKICAgICB7CiAgICAgICAgIGlmIChuU3RhcnRQb3MgPj0gblN0b3BQb3MpIHJldHVybjsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfcmVuZGVyY29udGV4dC5oIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfcmVuZGVyY29udGV4dC5oCmluZGV4IGIyYmMxNjMuLjg5NDVkMTggMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX3JlbmRlcmNvbnRleHQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnNka19yZW5kZXJjb250ZXh0LmgKQEAgLTM0LDcgKzM0LDcgQEAKIHsKIHB1YmxpYzoKIAlJRlNES19QQVVTRV9BZGFwdGVyKElGU0RLX1BBVVNFKiBJUGF1c2UgKTsKLQlGWF9CT09MIE5lZWRUb1BhdXNlTm93KCk7CisJYm9vbCBOZWVkVG9QYXVzZU5vdygpOwogCiBwcml2YXRlOgogCUlGU0RLX1BBVVNFKiBtX0lQYXVzZTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9meF9zeXN0ZW1oYW5kbGVyLmggYi9mcGRmc2RrL2luY2x1ZGUvZnhfc3lzdGVtaGFuZGxlci5oCmluZGV4IGJmNTllNDUuLjMwMTY4ZDQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9meF9zeXN0ZW1oYW5kbGVyLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Z4X3N5c3RlbWhhbmRsZXIuaApAQCAtNDcsMTAgKzQ3LDEwIEBACiAJdmlydHVhbCB2b2lkCQkJCUludmFsaWRhdGVSZWN0KEZYX0hXTkQgaFduZCwgRlhfUkVDVCByZWN0KSA9IDA7CiAgICAgdmlydHVhbCB2b2lkCQkJCU91dHB1dFNlbGVjdGVkUmVjdCh2b2lkKiBwRm9ybUZpbGxlciwgQ1BERl9SZWN0JnJlY3QpID0gMDsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlJc1NlbGVjdGlvbkltcGxlbWVudGVkKCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQlJc1NlbGVjdGlvbkltcGxlbWVudGVkKCkgPSAwOwogCiAJdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJR2V0Q2xpcGJvYXJkVGV4dChGWF9IV05EIGhXbmQpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0Q2xpcGJvYXJkVGV4dChGWF9IV05EIGhXbmQsIENGWF9XaWRlU3RyaW5nIHN0cmluZykgPSAwOworCXZpcnR1YWwgYm9vbAkJCQlTZXRDbGlwYm9hcmRUZXh0KEZYX0hXTkQgaFduZCwgQ0ZYX1dpZGVTdHJpbmcgc3RyaW5nKSA9IDA7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJQ2xpZW50VG9TY3JlZW4oRlhfSFdORCBoV25kLCBpbnQzMl90JiB4LCBpbnQzMl90JiB5KSA9IDA7CiAJdmlydHVhbCB2b2lkCQkJCVNjcmVlblRvQ2xpZW50KEZYX0hXTkQgaFduZCwgaW50MzJfdCYgeCwgaW50MzJfdCYgeSkgPSAwOwpAQCAtNjYsMjMgKzY2LDIzIEBACiAJdmlydHVhbCB2b2lkCQkJCVNldEN1cnNvcihpbnQzMl90IG5DdXJzb3JUeXBlKSA9IDA7CiAKIAl2aXJ0dWFsIEZYX0hNRU5VCQkJQ3JlYXRlUG9wdXBNZW51KCkgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlBcHBlbmRNZW51SXRlbShGWF9ITUVOVSBoTWVudSwgaW50MzJfdCBuSUROZXdJdGVtLCBDRlhfV2lkZVN0cmluZyBzdHJpbmcpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJRW5hYmxlTWVudUl0ZW0oRlhfSE1FTlUgaE1lbnUsIGludDMyX3QgbklESXRlbSwgRlhfQk9PTCBiRW5hYmxlZCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQlBcHBlbmRNZW51SXRlbShGWF9ITUVOVSBoTWVudSwgaW50MzJfdCBuSUROZXdJdGVtLCBDRlhfV2lkZVN0cmluZyBzdHJpbmcpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJRW5hYmxlTWVudUl0ZW0oRlhfSE1FTlUgaE1lbnUsIGludDMyX3QgbklESXRlbSwgYm9vbCBiRW5hYmxlZCkgPSAwOwogCXZpcnR1YWwgaW50MzJfdAkJCVRyYWNrUG9wdXBNZW51KEZYX0hNRU5VIGhNZW51LCBpbnQzMl90IHgsIGludDMyX3QgeSwgRlhfSFdORCBoUGFyZW50KSA9IDA7CiAJdmlydHVhbCB2b2lkCQkJCURlc3Ryb3lNZW51KEZYX0hNRU5VIGhNZW51KSA9IDA7CiAKIAl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXROYXRpdmVUcnVlVHlwZUZvbnQoaW50MzJfdCBuQ2hhcnNldCkgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlGaW5kTmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQsIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJRmluZE5hdGl2ZVRydWVUeXBlRm9udChpbnQzMl90IG5DaGFyc2V0LCBDRlhfQnl0ZVN0cmluZyBzRm9udEZhY2VOYW1lKSA9IDA7CiAJdmlydHVhbCBDUERGX0ZvbnQqCQkJQWRkTmF0aXZlVHJ1ZVR5cGVGb250VG9QREYoQ1BERl9Eb2N1bWVudCogcERvYywgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRGYWNlTmFtZSwgdWludDhfdCBuQ2hhcnNldCkgPSAwOwogCiAJdmlydHVhbCBpbnQzMl90CQkJU2V0VGltZXIoaW50MzJfdCB1RWxhcHNlLCBUaW1lckNhbGxiYWNrIGxwVGltZXJGdW5jKSA9IDA7CiAJdmlydHVhbCB2b2lkCQkJCUtpbGxUaW1lcihpbnQzMl90IG5JRCkgPSAwOwogCiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNTSElGVEtleURvd24oRlhfRFdPUkQgbkZsYWcpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNDVFJMS2V5RG93bihGWF9EV09SRCBuRmxhZykgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0FMVEtleURvd24oRlhfRFdPUkQgbkZsYWcpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNJTlNFUlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSA9IDA7CisJdmlydHVhbCBib29sCQkJCUlzU0hJRlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSA9IDA7CisJdmlydHVhbCBib29sCQkJCUlzQ1RSTEtleURvd24oRlhfRFdPUkQgbkZsYWcpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJSXNBTFRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSA9IDA7CisJdmlydHVhbCBib29sCQkJCUlzSU5TRVJUS2V5RG93bihGWF9EV09SRCBuRmxhZykgPSAwOwogCiAJdmlydHVhbAlGWF9TWVNURU1USU1FCQlHZXRMb2NhbFRpbWUoKSA9IDA7CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhfZWRpdC5oIGIvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meF9lZGl0LmgKaW5kZXggYmY0NmU5MS4uNDVkMjY0NiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meF9lZGl0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meF9lZGl0LmgKQEAgLTkzLDcgKzkzLDcgQEAKIAkvL3NldCB0aGUgcG9zaXRpb24gb2YgdmVydGljYWwgc2Nyb2xsYmFyLgogCXZpcnR1YWwgdm9pZAkJCQkJCQlJT25TZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KSA9IDA7CiAJLy9zZXQgdGhlIGNhcmV0IGluZm9ybWF0aW9uLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlJT25TZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsY29uc3QgQ1BERl9Qb2ludCAmIHB0Rm9vdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCUlPblNldENhcmV0KGJvb2wgYlZpc2libGUsY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCxjb25zdCBDUERGX1BvaW50ICYgcHRGb290LCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpID0gMDsKIAkvL2lmIHRoZSBjYXJldCBwb3NpdGlvbiBpcyBjaGFuZ2VkICxzZW5kIHRoZSBpbmZvcm1hdGlvbiBvZiBjdXJyZW50IHBvc3Rpb24gdG8gdXNlci4KIAl2aXJ0dWFsIHZvaWQJCQkJCQkJSU9uQ2FyZXRDaGFuZ2UoY29uc3QgQ1BWVF9TZWNQcm9wcyAmIHNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIHdvcmRQcm9wcykgPSAwOwogCS8vaWYgdGhlIHRleHQgYXJlYSBpcyBjaGFuZ2VkLCBzZW5kIHRoZSBpbmZvcm1hdGlvbiB0byB1c2VyLgpAQCAtMTMxLDI1ICsxMzEsMjUgQEAKIAl2aXJ0dWFsIH5JRlhfRWRpdF9JdGVyYXRvcigpICB7fQogcHVibGljOgogCS8vbW92ZSB0aGUgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgbmV4dCB3b3JkLgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlOZXh0V29yZCgpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJTmV4dFdvcmQoKSA9IDA7CiAJLy9tb3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBuZXh0IGxpbmUuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCU5leHRMaW5lKCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlOZXh0TGluZSgpID0gMDsKIAkvL21vdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIG5leHQgc2VjdGlvbi4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJTmV4dFNlY3Rpb24oKSA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCU5leHRTZWN0aW9uKCkgPSAwOwogCiAJLy9tb3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBwcmV2aW91cyB3b3JkLgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlQcmV2V29yZCgpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJUHJldldvcmQoKSA9IDA7CiAJLy9tb3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBwcmV2aW91cyBsaW5lLgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlQcmV2TGluZSgpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJUHJldkxpbmUoKSA9IDA7CiAJLy9tb3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBwcmV2aW91cyBzZWN0aW9uLgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlQcmV2U2VjdGlvbigpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJUHJldlNlY3Rpb24oKSA9IDA7CiAKIAkvL2dldCB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGN1cnJlbnQgd29yZC4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJR2V0V29yZChDUFZUX1dvcmQgJiB3b3JkKSBjb25zdCA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCUdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3QgPSAwOwogCS8vZ2V0IHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgY3VycmVudCBsaW5lLgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJR2V0TGluZShDUFZUX0xpbmUgJiBsaW5lKSBjb25zdCA9IDA7CiAJLy9nZXQgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBjdXJyZW50IHNlY3Rpb24uCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlHZXRTZWN0aW9uKENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pIGNvbnN0ID0gMDsKIAkvL3NldCB0aGUgY3VycmVudCBwb3NpdGlvbi4KIAl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXQoaW50MzJfdCBuV29yZEluZGV4KSA9IDA7CiAJLy9zZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCkBAIC0xOTUsNjkgKzE5NSw2OSBAQAogCXZpcnR1YWwgdm9pZAkJCQkJCQlJbml0aWFsaXplKCkgPSAwOwogCiAJLy9zZXQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGV4dCBhcmVhLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCVNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0LCBib29sIGJQYWludCA9IHRydWUpID0gMDsKIAkvL3NldCB0aGUgc2Nyb2xsIG9yaWdpbgogCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRTY3JvbGxQb3MoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSA9IDA7CiAKIAkvL3NldCB0aGUgaG9yaXpvbnRhbCB0ZXh0IGFsaWdubWVudCBpbiB0ZXh0IGJveCwgbkZvcm1hdCAoMDpsZWZ0IDE6bWlkZGxlIDI6cmlnaHQpLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBbGlnbm1lbnRIKGludDMyX3QgbkZvcm1hdCA9IDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBbGlnbm1lbnRIKGludDMyX3QgbkZvcm1hdCA9IDAsIGJvb2wgYlBhaW50ID0gdHJ1ZSkgPSAwOwogCS8vc2V0IHRoZSB2ZXJ0aWNhbCB0ZXh0IGFsaWdubWVudCBpbiB0ZXh0IGJveCwgbkZvcm1hdCAoMDp0b3AgMTpjZW50ZXIgMjpib3R0b20pLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBbGlnbm1lbnRWKGludDMyX3QgbkZvcm1hdCA9IDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBbGlnbm1lbnRWKGludDMyX3QgbkZvcm1hdCA9IDAsIGJvb2wgYlBhaW50ID0gdHJ1ZSkgPSAwOwogCS8vaWYgdGhlIHRleHQgaXMgc2hvd24gaW4gc2VjcmV0ICwgc2V0IGEgY2hhcmFjdGVyIGZvciBzdWJzdGl0dXRlLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRQYXNzd29yZENoYXIoRlhfV09SRCB3U3ViV29yZCA9ICcqJywgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCVNldFBhc3N3b3JkQ2hhcihGWF9XT1JEIHdTdWJXb3JkID0gJyonLCBib29sIGJQYWludCA9IHRydWUpID0gMDsKIAkvL3NldCB0aGUgbWF4aW1hbCBjb3VudCBvZiB3b3JkcyBvZiB0aGUgdGV4dC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0TGltaXRDaGFyKGludDMyX3QgbkxpbWl0Q2hhciA9IDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyID0gMCwgYm9vbCBiUGFpbnQgPSB0cnVlKSA9IDA7CiAJLy9pZiBzZXQgdGhlIGNvdW50IG9mIGNoYXJBcnJheSAsIHRoZW4gYWxsIHdvcmRzIGlzIHNob3duIGluIGVxdWFsIHNwYWNlLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRDaGFyQXJyYXkoaW50MzJfdCBuQ2hhckFycmF5ID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCVNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkgPSAwLCBib29sIGJQYWludCA9IHRydWUpID0gMDsKIAkvL3NldCB0aGUgc3BhY2Ugb2YgdHdvIGNoYXJhY3RlcnMuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlID0gMC4wZiwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCVNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlID0gMC4wZiwgYm9vbCBiUGFpbnQgPSB0cnVlKSA9IDA7CiAJLy9zZXQgdGhlIGhvcml6b250YWwgc2NhbGUgb2YgYWxsIGNoYXJhY3RlcnMuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgPSAxMDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlID0gMTAwLCBib29sIGJQYWludCA9IHRydWUpID0gMDsKIAkvL3NldCB0aGUgbGVhZGluZyBvZiBhbGwgbGluZXMKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nLCBib29sIGJQYWludCA9IHRydWUpID0gMDsKIAkvL2lmIHNldCwgQ1JMRiBpcyBhbGxvd2VkLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRNdWx0aUxpbmUoRlhfQk9PTCBiTXVsdGlMaW5lID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCVNldE11bHRpTGluZShib29sIGJNdWx0aUxpbmUgPSB0cnVlLCBib29sIGJQYWludCA9IHRydWUpID0gMDsKIAkvL2lmIHNldCwgYWxsIHdvcmRzIGF1dG8gZml0IHRoZSB3aWR0aCBvZiB0aGUgYm91bmRpbmcgYm94LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdXRvUmV0dXJuKEZYX0JPT0wgYkF1dG8gPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXV0b1JldHVybihib29sIGJBdXRvID0gdHJ1ZSwgYm9vbCBiUGFpbnQgPSB0cnVlKSA9IDA7CiAJLy9pZiBzZXQsIGEgZm9udCBzaXplIGlzIGNhbGN1bGF0ZWQgdG8gZnVsbCBmaXQgdGhlIGJvdW5kaW5nIGJveC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXV0b0ZvbnRTaXplKEZYX0JPT0wgYkF1dG8gPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXV0b0ZvbnRTaXplKGJvb2wgYkF1dG8gPSB0cnVlLCBib29sIGJQYWludCA9IHRydWUpID0gMDsKIAkvL2lzIHNldCwgdGhlIHRleHQgaXMgYWxsb3dlZCB0byBzY3JvbGwuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldEF1dG9TY3JvbGwoRlhfQk9PTCBiQXV0byA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdXRvU2Nyb2xsKGJvb2wgYkF1dG8gPSB0cnVlLCBib29sIGJQYWludCA9IHRydWUpID0gMDsKIAkvL3NldCB0aGUgZm9udCBzaXplIG9mIGFsbCB3b3Jkcy4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplLCBib29sIGJQYWludCA9IHRydWUpID0gMDsKIAkvL3RoZSB0ZXh0IGlzIGFsbG93ZWQgdG8gYXV0by1zY3JvbGwsIGFsbG93IHRoZSB0ZXh0IG92ZXJmbG93PwotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRUZXh0T3ZlcmZsb3coRlhfQk9PTCBiQWxsb3dlZCA9IEZBTFNFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0VGV4dE92ZXJmbG93KGJvb2wgYkFsbG93ZWQgPSBmYWxzZSwgYm9vbCBiUGFpbnQgPSB0cnVlKSA9IDA7CiAKIAkvL3F1ZXJ5IGlmIHRoZSBlZGl0IGlzIHJpY2hlZGl0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc1JpY2hUZXh0KCkgY29uc3QgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlJc1JpY2hUZXh0KCkgY29uc3QgPSAwOwogCS8vc2V0IHRoZSBlZGl0IGlzIHJpY2hlZGl0LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRSaWNoVGV4dChGWF9CT09MIGJSaWNoVGV4dCA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRSaWNoVGV4dChib29sIGJSaWNoVGV4dCA9IHRydWUsIGJvb2wgYlBhaW50ID0gdHJ1ZSkgPSAwOwogCS8vc2V0IHRoZSBmb250c2l6ZSBvZiBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoRm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCVNldFJpY2hGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpID0gMDsKIAkvL3NldCB0aGUgZm9udGluZGV4IG9mIHNlbGVjdGVkIHRleHQsIHVzZXIgY2FuIGNoYW5nZSB0aGUgZm9udCBvZiBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoRm9udEluZGV4KGludDMyX3QgbkZvbnRJbmRleCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlTZXRSaWNoRm9udEluZGV4KGludDMyX3QgbkZvbnRJbmRleCkgPSAwOwogCS8vc2V0IHRoZSB0ZXh0Y29sb3Igb2Ygc2VsZWN0ZWQgdGV4dC4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0UmljaFRleHRDb2xvcihGWF9DT0xPUlJFRiBkd0NvbG9yKSA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCVNldFJpY2hUZXh0Q29sb3IoRlhfQ09MT1JSRUYgZHdDb2xvcikgPSAwOwogCS8vc2V0IHRoZSB0ZXh0IHNjcmlwdCB0eXBlIG9mIHNlbGVjdGVkIHRleHQuICgwOm5vcm1hbCAxOnN1cGVyc2NyaXB0IDI6c3Vic2NyaXB0KQotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dFNjcmlwdChpbnQzMl90IG5TY3JpcHRUeXBlKSA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCVNldFJpY2hUZXh0U2NyaXB0KGludDMyX3QgblNjcmlwdFR5cGUpID0gMDsKIAkvL3NldCB0aGUgYm9sZCBmb250IHN0eWxlIG9mIHNlbGVjdGVkIHRleHQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hUZXh0Qm9sZChGWF9CT09MIGJCb2xkID0gVFJVRSkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlTZXRSaWNoVGV4dEJvbGQoYm9vbCBiQm9sZCA9IHRydWUpID0gMDsKIAkvL3NldCB0aGUgaXRhbGljIGZvbnQgc3R5bGUgb2Ygc2VsZWN0ZWQgdGV4dC4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0UmljaFRleHRJdGFsaWMoRlhfQk9PTCBiSXRhbGljID0gVFJVRSkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlTZXRSaWNoVGV4dEl0YWxpYyhib29sIGJJdGFsaWMgPSB0cnVlKSA9IDA7CiAJLy9zZXQgdGhlIHVuZGVybGluZSBzdHlsZSBvZiBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dFVuZGVybGluZShGWF9CT09MIGJVbmRlcmxpbmUgPSBUUlVFKSA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCVNldFJpY2hUZXh0VW5kZXJsaW5lKGJvb2wgYlVuZGVybGluZSA9IHRydWUpID0gMDsKIAkvL3NldCB0aGUgY3Jvc3NvdXQgc3R5bGUgb2Ygc2VsZWN0ZWQgdGV4dC4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0UmljaFRleHRDcm9zc291dChGWF9CT09MIGJDcm9zc291dCA9IFRSVUUpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJU2V0UmljaFRleHRDcm9zc291dChib29sIGJDcm9zc291dCA9IHRydWUpID0gMDsKIAkvL3NldCB0aGUgY2hhcnNwYWNlIG9mIHNlbGVjdGVkIHRleHQsIGluIHVzZXIgY29vcmRpbmF0ZS4KLQl2aXJ0dWFsCUZYX0JPT0wJCQkJCQkJU2V0UmljaFRleHRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSkgPSAwOworCXZpcnR1YWwJYm9vbAkJCQkJCQlTZXRSaWNoVGV4dENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKSA9IDA7CiAJLy9zZXQgdGhlIGhvcml6b250YWwgc2NhbGUgb2Ygc2VsZWN0ZWQgdGV4dCwgZGVmYXVsdCB2YWx1ZSBpcyAxMDAuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hUZXh0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSA9IDEwMCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlTZXRSaWNoVGV4dEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgPSAxMDApID0gMDsKIAkvL3NldCB0aGUgbGVhZGluZyBvZiBzZWxlY3RlZCBzZWN0aW9uLCBpbiB1c2VyIGNvb3JkaW5hdGUuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hUZXh0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nKSA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCVNldFJpY2hUZXh0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nKSA9IDA7CiAJLy9zZXQgdGhlIGluZGVudCBvZiBzZWxlY3RlZCBzZWN0aW9uLCBpbiB1c2VyIGNvb3JkaW5hdGUuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hUZXh0TGluZUluZGVudChGWF9GTE9BVCBmTGluZUluZGVudCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlTZXRSaWNoVGV4dExpbmVJbmRlbnQoRlhfRkxPQVQgZkxpbmVJbmRlbnQpID0gMDsKIAkvL3NldCB0aGUgYWxpZ25tZW50IG9mIHNlbGVjdGVkIHNlY3Rpb24sIG5BbGlnbm1lbnQoMDpsZWZ0IDE6bWlkZGxlIDI6cmlnaHQpCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hUZXh0QWxpZ25tZW50KGludDMyX3QgbkFsaWdubWVudCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlTZXRSaWNoVGV4dEFsaWdubWVudChpbnQzMl90IG5BbGlnbm1lbnQpID0gMDsKIAogCS8vc2V0IHRoZSBzZWxlY3RlZCByYW5nZSBvZiB0ZXh0LgogCS8vaWYgblN0YXJ0Q2hhciA9PSAwIGFuZCBuRW5kQ2hhciA9PSAtMSwgc2VsZWN0IGFsbCB0aGUgdGV4dC4KQEAgLTI3Niw3ICsyNzYsNyBAQAogCS8vZ2V0IHRoZSB0ZXh0IGNvbmVudAogCXZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFRleHQoKSBjb25zdCA9IDA7CiAJLy9xdWVyeSBpZiBhbnkgdGV4dCBpcyBzZWxlY3RlZC4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNTZWxlY3RlZCgpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJSXNTZWxlY3RlZCgpIGNvbnN0ID0gMDsKIAkvL2dldCB0aGUgc2Nyb2xsIG9yaWdpbgogCXZpcnR1YWwgQ1BERl9Qb2ludAkJCQkJCUdldFNjcm9sbFBvcygpIGNvbnN0ID0gMDsKIAkvL2dldCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSB0ZXh0IGFyZWEuCkBAIC0yOTEsNDQgKzI5MSw0NCBAQAogCXZpcnR1YWwgQ1BWVF9Xb3JkUmFuZ2UJCQkJCUdldFNlbGVjdFdvcmRSYW5nZSgpIGNvbnN0ID0gMDsKIAogCS8vc2VuZCB0aGUgbW91c2Vkb3duIG1lc3NhZ2UgdG8gZWRpdCBmb3IgcmVzcG9uc2UuCi0JLy9pZiBTaGlmdCBrZXkgaXMgaG9sZCwgYlNoaWZ0IGlzIFRSVUUsIGlzIEN0cmwga2V5IGlzIGhvbGQsIGJDdHJsIGlzIFRSVUUuCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JLy9zZW5kIHRoZSBtb3VzZW1vdmUgbWVzc2FnZSB0byBlZGl0IHdoZW4gbW91c2UgZG93biBpcyBUUlVFLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOworCS8vaWYgU2hpZnQga2V5IGlzIGhvbGQsIGJTaGlmdCBpcyB0cnVlLCBpcyBDdHJsIGtleSBpcyBob2xkLCBiQ3RybCBpcyB0cnVlLgorCXZpcnR1YWwgdm9pZAkJCQkJCQlPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOworCS8vc2VuZCB0aGUgbW91c2Vtb3ZlIG1lc3NhZ2UgdG8gZWRpdCB3aGVuIG1vdXNlIGRvd24gaXMgdHJ1ZS4KKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKIAkvL3NlbmQgdGhlIFVQIGtleSBtZXNzYWdlIHRvIGVkaXQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfVVAoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX1VQKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKIAkvL3NlbmQgdGhlIERPV04ga2V5IG1lc3NhZ2UgdG8gZWRpdC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19ET1dOKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19ET1dOKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKIAkvL3NlbmQgdGhlIExFRlQga2V5IG1lc3NhZ2UgdG8gZWRpdC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19MRUZUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19MRUZUKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKIAkvL3NlbmQgdGhlIFJJR0hUIGtleSBtZXNzYWdlIHRvIGVkaXQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfUklHSFQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX1JJR0hUKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKIAkvL3NlbmQgdGhlIEhPTUUga2V5IG1lc3NhZ2UgdG8gZWRpdC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19IT01FKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19IT01FKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKIAkvL3NlbmQgdGhlIEVORCBrZXkgbWVzc2FnZSB0byBlZGl0LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0VORChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfRU5EKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKIAogCS8vcHV0IHRleHQgaW50byBlZGl0LgogCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LGludDMyX3QgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCwKIAkJCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKSA9IDA7CiAJLy9pbnNlcnQgYSB3b3JkIGludG8gdGhlIGVkaXQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUluc2VydFdvcmQoRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJSW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCwgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCkgPSAwOwogCS8vaW5zZXJ0IGEgcmV0dXJuIGludG8gdGhlIGVkaXQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUluc2VydFJldHVybihjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKSA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCUluc2VydFJldHVybihjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKSA9IDA7CiAJLy9pbnNlcnQgdGV4dCBpbnRvIHRoZSBlZGl0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJbnNlcnRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LCBpbnQzMl90IGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsCisJdmlydHVhbCBib29sCQkJCQkJCUluc2VydFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsIGludDMyX3QgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCwKIAkJCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKSA9IDA7CiAJLy9kbyBiYWNrc3BhY2Ugb3BlcmF0aW9uLgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlCYWNrc3BhY2UoKSA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCUJhY2tzcGFjZSgpID0gMDsKIAkvL2RvIGRlbGV0ZSBvcGVyYXRpb24uCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCURlbGV0ZSgpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJRGVsZXRlKCkgPSAwOwogCS8vZGVsZXRlIHRoZSBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlDbGVhcigpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJQ2xlYXIoKSA9IDA7CiAKIAkvL2RvIFJlZG8gb3BlcmF0aW9uLgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlSZWRvKCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlSZWRvKCkgPSAwOwogCS8vZG8gVW5kbyBvcGVyYXRpb24uCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVVuZG8oKSA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCVVuZG8oKSA9IDA7CiAJLy9tb3ZlIGNhcmV0CiAJdmlydHVhbCB2b2lkCQkJCQkJCVNldENhcmV0KGludDMyX3QgblBvcykgPSAwOwogCkBAIC0zMzYsMTggKzMzNiwxOCBAQAogCXZpcnR1YWwgdm9pZAkJCQkJCQlQYWludCgpID0gMDsKIAogCS8vYWxsb3cgdG8gcmVmcmVzaCBzY3JlZW4/Ci0JdmlydHVhbCB2b2lkCQkJCQkJCUVuYWJsZVJlZnJlc2goRlhfQk9PTCBiUmVmcmVzaCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlFbmFibGVSZWZyZXNoKGJvb2wgYlJlZnJlc2gpID0gMDsKIAogCXZpcnR1YWwgdm9pZAkJCQkJCQlSZWZyZXNoV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cikgPSAwOwogCiAJLy9hbGxvdyB1bmRvL3JlZG8/Ci0JdmlydHVhbCB2b2lkCQkJCQkJCUVuYWJsZVVuZG8oRlhfQk9PTCBiVW5kbykgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlFbmFibGVVbmRvKGJvb2wgYlVuZG8pID0gMDsKIAogCS8vYWxsb3cgbm90aWZ5PwotCXZpcnR1YWwgdm9pZAkJCQkJCQlFbmFibGVOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCUVuYWJsZU5vdGlmeShib29sIGJOb3RpZnkpID0gMDsKIAogCS8vYWxsb3cgb3ByIG5vdGlmeT8KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJRW5hYmxlT3ByTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlFbmFibGVPcHJOb3RpZnkoYm9vbCBiTm90aWZ5KSA9IDA7CiAKIAkvL21hcCB3b3JkIHBsYWNlIHRvIHdvcmQgaW5kZXguCiAJdmlydHVhbCBpbnQzMl90CQkJCQkJV29yZFBsYWNlVG9Xb3JkSW5kZXgoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QgPSAwOwpAQCAtMzgyLDExICszODIsMTEgQEAKIAkvL2dldCB0aGUgbGF0aW4gd29yZHMgb2Ygc3BlY2lmaWVkIHJhbmdlCiAJdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCQkJR2V0UmFuZ2VUZXh0KGNvbnN0IENQVlRfV29yZFJhbmdlICYgcmFuZ2UpIGNvbnN0ID0gMDsKIAkvL2lzIHRoZSB0ZXh0IGZ1bGwgaW4gYm91bmRpbmcgYm94Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUlzVGV4dEZ1bGwoKSBjb25zdCA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUNhblVuZG8oKSBjb25zdCA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUNhblJlZG8oKSBjb25zdCA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCUlzVGV4dEZ1bGwoKSBjb25zdCA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCUNhblVuZG8oKSBjb25zdCA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCUNhblJlZG8oKSBjb25zdCA9IDA7CiAJLy9pZiB0aGUgY29udGVudCBpcyBjaGFuZ2VkIGFmdGVyIHNldHRleHQ/Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdCA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdCA9IDA7CiAJLy9nZXQgdGhlIHRvdGFsIHdvcmRzIGluIGVkaXQKIAl2aXJ0dWFsIGludDMyX3QJCQkJCQlHZXRUb3RhbFdvcmRzKCkgY29uc3QgPSAwOwogCkBAIC0zOTQsNyArMzk0LDcgQEAKIAogCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0RWRpdEFwcGVhcmFuY2VTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LCBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsCiAJCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSA9IE5VTEwsCi0JCQkJCQkJCQkJCQkJRlhfQk9PTCBiQ29udGludW91cyA9IFRSVUUsIEZYX1dPUkQgU3ViV29yZCA9IDApOworCQkJCQkJCQkJCQkJCWJvb2wgYkNvbnRpbnVvdXMgPSB0cnVlLCBGWF9XT1JEIFN1YldvcmQgPSAwKTsKIAlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldFNlbGVjdEFwcGVhcmFuY2VTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LCBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UgPSBOVUxMKTsKIAlzdGF0aWMgdm9pZAkJCQkJCQkJRHJhd0VkaXQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwgSUZYX0VkaXQqIHBFZGl0LCBGWF9DT0xPUlJFRiBjclRleHRGaWxsLCBGWF9DT0xPUlJFRiBjclRleHRTdHJva2UsCiAJCQkJCQkJCQkJCQkJY29uc3QgQ1BERl9SZWN0JiByY0NsaXAsIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LCBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlLCBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIsIHZvaWQqIHBGRkxEYXRhKTsKQEAgLTQ1MSwxMiArNDUxLDEyIEBACiAJdmlydHVhbCBGWF9GTE9BVAkJCQkJCUdldEZvbnRTaXplKCkgY29uc3QgPSAwOwogCXZpcnR1YWwgSUZYX0VkaXQqCQkJCQkJR2V0SXRlbUVkaXQoaW50MzJfdCBuSW5kZXgpIGNvbnN0ID0gMDsKIAl2aXJ0dWFsIGludDMyX3QJCQkJCQlHZXRDb3VudCgpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNJdGVtU2VsZWN0ZWQoaW50MzJfdCBuSW5kZXgpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJSXNJdGVtU2VsZWN0ZWQoaW50MzJfdCBuSW5kZXgpIGNvbnN0ID0gMDsKIAl2aXJ0dWFsIEZYX0ZMT0FUCQkJCQkJR2V0Rmlyc3RIZWlnaHQoKSBjb25zdCA9IDA7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0TXVsdGlwbGVTZWwoRlhfQk9PTCBiTXVsdGlwbGUpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNNdWx0aXBsZVNlbCgpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNWYWxpZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0TXVsdGlwbGVTZWwoYm9vbCBiTXVsdGlwbGUpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJSXNNdWx0aXBsZVNlbCgpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJSXNWYWxpZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0ID0gMDsKIAl2aXJ0dWFsIGludDMyX3QJCQkJCQlGaW5kTmV4dChpbnQzMl90IG5JbmRleCxGWF9XQ0hBUiBuQ2hhcikgY29uc3QgPSAwOwogCiAJdmlydHVhbCB2b2lkCQkJCQkJCVNldFNjcm9sbFBvcyhjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpID0gMDsKQEAgLTQ3NywxNiArNDc3LDE2IEBACiAJdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCQkJR2V0VGV4dCgpIGNvbnN0ID0gMDsKIAogCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfVVAoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0RPV04oRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0xFRlQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX1JJR0hUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19IT01FKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19FTkQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLKGludDMyX3Qgbkl0ZW1JbmRleCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25Nb3VzZURvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19VUChib29sIGJTaGlmdCxib29sIGJDdHJsKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfRE9XTihib29sIGJTaGlmdCxib29sIGJDdHJsKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfTEVGVChib29sIGJTaGlmdCxib29sIGJDdHJsKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfUklHSFQoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0hPTUUoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0VORChib29sIGJTaGlmdCxib29sIGJDdHJsKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCU9uVksoaW50MzJfdCBuSXRlbUluZGV4LGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOwogCiBwcm90ZWN0ZWQ6CiAgICAgICAgIH5JRlhfTGlzdCgpIHsgfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2VkaXQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9lZGl0LmgKaW5kZXggN2EyNzQyZi4uZjcyOGQ4NyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2VkaXQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfZWRpdC5oCkBAIC02OCwyNyArNjgsMjcgQEAKIAl7CiAJfQogCi0JRlhfQk9PTCBvcGVyYXRvciAhPSAoY29uc3QgQ0ZYX0VkaXRfTGluZVJlY3QgJiBsaW5lcmVjdCkgY29uc3QKKwlib29sIG9wZXJhdG9yICE9IChjb25zdCBDRlhfRWRpdF9MaW5lUmVjdCAmIGxpbmVyZWN0KSBjb25zdAogCXsKIAkJcmV0dXJuIEZYU1lTX21lbWNtcCh0aGlzLCAmbGluZXJlY3QsIHNpemVvZihDRlhfRWRpdF9MaW5lUmVjdCkpICE9IDA7CiAJfQogCi0JRlhfQk9PTCBJc1NhbWVIZWlnaHQoY29uc3QgQ0ZYX0VkaXRfTGluZVJlY3QgJiBsaW5lcmVjdCkgY29uc3QKKwlib29sIElzU2FtZUhlaWdodChjb25zdCBDRlhfRWRpdF9MaW5lUmVjdCAmIGxpbmVyZWN0KSBjb25zdAogCXsKIAkJcmV0dXJuIEZYX0VESVRfSXNGbG9hdFplcm8oKG1fcmNMaW5lLnRvcCAtIG1fcmNMaW5lLmJvdHRvbSkgLSAobGluZXJlY3QubV9yY0xpbmUudG9wIC1saW5lcmVjdC5tX3JjTGluZS5ib3R0b20pKTsKIAl9CiAKLQlGWF9CT09MIElzU2FtZVRvcChjb25zdCBDRlhfRWRpdF9MaW5lUmVjdCAmIGxpbmVyZWN0KSBjb25zdAorCWJvb2wgSXNTYW1lVG9wKGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0ICYgbGluZXJlY3QpIGNvbnN0CiAJewogCQlyZXR1cm4gRlhfRURJVF9Jc0Zsb2F0WmVybyhtX3JjTGluZS50b3AgLSBsaW5lcmVjdC5tX3JjTGluZS50b3ApOwogCX0KIAotCUZYX0JPT0wgSXNTYW1lTGVmdChjb25zdCBDRlhfRWRpdF9MaW5lUmVjdCAmIGxpbmVyZWN0KSBjb25zdAorCWJvb2wgSXNTYW1lTGVmdChjb25zdCBDRlhfRWRpdF9MaW5lUmVjdCAmIGxpbmVyZWN0KSBjb25zdAogCXsKIAkJcmV0dXJuIEZYX0VESVRfSXNGbG9hdFplcm8obV9yY0xpbmUubGVmdCAtIGxpbmVyZWN0Lm1fcmNMaW5lLmxlZnQpOwogCX0KIAotCUZYX0JPT0wgSXNTYW1lUmlnaHQoY29uc3QgQ0ZYX0VkaXRfTGluZVJlY3QgJiBsaW5lcmVjdCkgY29uc3QKKwlib29sIElzU2FtZVJpZ2h0KGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0ICYgbGluZXJlY3QpIGNvbnN0CiAJewogCQlyZXR1cm4gRlhfRURJVF9Jc0Zsb2F0WmVybyhtX3JjTGluZS5yaWdodCAtIGxpbmVyZWN0Lm1fcmNMaW5lLnJpZ2h0KTsKIAl9CkBAIC0yNjcsMTIgKzI2NywxMiBAQAogCQlFbmRQb3MgPSBlbmQ7CiAJfQogCi0JRlhfQk9PTCBJc0V4aXN0KCkgY29uc3QKKwlib29sIElzRXhpc3QoKSBjb25zdAogCXsKIAkJcmV0dXJuIEJlZ2luUG9zICE9IEVuZFBvczsKIAl9CiAKLQlGWF9CT09MIG9wZXJhdG9yICE9IChjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyKSBjb25zdAorCWJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IpIGNvbnN0CiAJewogCQlyZXR1cm4gd3IuQmVnaW5Qb3MgIT0gQmVnaW5Qb3MgfHwgd3IuRW5kUG9zICE9IEVuZFBvczsKIAl9CkBAIC0yOTMsMTAgKzI5MywxMCBAQAogCiAJdm9pZAkJCQkJCQkJCUFkZEl0ZW0oSUZYX0VkaXRfVW5kb0l0ZW0qIHBJdGVtKTsKIAotCUZYX0JPT0wJCQkJCQkJCQlDYW5VbmRvKCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQkJCUNhblJlZG8oKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCQkJSXNNb2RpZmllZCgpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJCQlJc1dvcmtpbmcoKSBjb25zdDsKKwlib29sCQkJCQkJCQkJQ2FuVW5kbygpIGNvbnN0OworCWJvb2wJCQkJCQkJCQlDYW5SZWRvKCkgY29uc3Q7CisJYm9vbAkJCQkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdDsKKwlib29sCQkJCQkJCQkJSXNXb3JraW5nKCkgY29uc3Q7CiAKIAl2b2lkCQkJCQkJCQkJUmVzZXQoKTsKIApAQCAtMzE2LDI2ICszMTYsMjYgQEAKIAogCWludDMyX3QJCQkJCQkJCW1fbkN1clVuZG9Qb3M7CiAJaW50MzJfdAkJCQkJCQkJbV9uQnVmU2l6ZTsKLQlGWF9CT09MCQkJCQkJCQkJbV9iTW9kaWZpZWQ7Ci0JRlhfQk9PTAkJCQkJCQkJCW1fYlZpcmdpbjsKLQlGWF9CT09MCQkJCQkJCQkJbV9iV29ya2luZzsKKwlib29sCQkJCQkJCQkJbV9iTW9kaWZpZWQ7CisJYm9vbAkJCQkJCQkJCW1fYlZpcmdpbjsKKwlib29sCQkJCQkJCQkJbV9iV29ya2luZzsKIH07CiAKIGNsYXNzIENGWF9FZGl0X1VuZG9JdGVtIDogcHVibGljIElGWF9FZGl0X1VuZG9JdGVtCiB7CiBwdWJsaWM6Ci0JQ0ZYX0VkaXRfVW5kb0l0ZW0oKSA6IG1fYkZpcnN0KFRSVUUpLCBtX2JMYXN0KFRSVUUpIHt9CisJQ0ZYX0VkaXRfVW5kb0l0ZW0oKSA6IG1fYkZpcnN0KHRydWUpLCBtX2JMYXN0KHRydWUpIHt9CiAKIAlDRlhfV2lkZVN0cmluZyBHZXRVbmRvVGl0bGUoKSBvdmVycmlkZSB7IHJldHVybiBMIiI7IH0KIAotCXZvaWQJCQkJCQkJCQlTZXRGaXJzdChGWF9CT09MIGJGaXJzdCl7bV9iRmlyc3QgPSBiRmlyc3Q7fQotCUZYX0JPT0wJCQkJCQkJCQlJc0ZpcnN0KCl7cmV0dXJuIG1fYkZpcnN0O30KLQl2b2lkCQkJCQkJCQkJU2V0TGFzdChGWF9CT09MIGJMYXN0KXttX2JMYXN0ID0gYkxhc3Q7fQotCUZYX0JPT0wJCQkJCQkJCQlJc0xhc3QoKXtyZXR1cm4gbV9iTGFzdDt9CisJdm9pZAkJCQkJCQkJCVNldEZpcnN0KGJvb2wgYkZpcnN0KXttX2JGaXJzdCA9IGJGaXJzdDt9CisJYm9vbAkJCQkJCQkJCUlzRmlyc3QoKXtyZXR1cm4gbV9iRmlyc3Q7fQorCXZvaWQJCQkJCQkJCQlTZXRMYXN0KGJvb2wgYkxhc3Qpe21fYkxhc3QgPSBiTGFzdDt9CisJYm9vbAkJCQkJCQkJCUlzTGFzdCgpe3JldHVybiBtX2JMYXN0O30KIAogcHJpdmF0ZToKLQlGWF9CT09MCQkJCQkJCQkJbV9iRmlyc3Q7Ci0JRlhfQk9PTAkJCQkJCQkJCW1fYkxhc3Q7CisJYm9vbAkJCQkJCQkJCW1fYkZpcnN0OworCWJvb2wJCQkJCQkJCQltX2JMYXN0OwogfTsKIAogY2xhc3MgQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbSA6IHB1YmxpYyBJRlhfRWRpdF9VbmRvSXRlbQpAQCAtNDI0LDcgKzQyNCw3IEBACiBwdWJsaWM6CiAJQ0ZYRVVfRGVsZXRlKENGWF9FZGl0ICogcEVkaXQsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BPbGRQbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE5ld1BsYWNlLAogCQkJCQkJRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsCi0JCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICYgU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgV29yZFByb3BzLCBGWF9CT09MIGJTZWNFbmQpOworCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAmIFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIFdvcmRQcm9wcywgYm9vbCBiU2VjRW5kKTsKIAl2aXJ0dWFsIH5DRlhFVV9EZWxldGUoKTsKIAogCXZvaWQJCQkJCQlSZWRvKCk7CkBAIC00MzksNyArNDM5LDcgQEAKIAlpbnQzMl90CQkJCQltX25DaGFyc2V0OwogCUNQVlRfU2VjUHJvcHMJCQkJbV9TZWNQcm9wczsKIAlDUFZUX1dvcmRQcm9wcwkJCQltX1dvcmRQcm9wczsKLQlGWF9CT09MCQkJCQkJbV9iU2VjRW5kOworCWJvb2wJCQkJCQltX2JTZWNFbmQ7CiB9OwogCiBjbGFzcyBDRlhFVV9DbGVhciA6IHB1YmxpYyBDRlhfRWRpdF9VbmRvSXRlbQpAQCAtNTc1LDYxICs1NzUsNjEgQEAKIAlJRlhfRWRpdF9Gb250TWFwKgkJCQkJCUdldEZvbnRNYXAoKTsKIAogCXZvaWQJCQkJCQkJCQlJbml0aWFsaXplKCk7Ci0Jdm9pZAkJCQkJCQkJCVNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0LCBGWF9CT09MIGJQYWludCA9IFRSVUUpOworCXZvaWQJCQkJCQkJCQlTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCwgYm9vbCBiUGFpbnQgPSB0cnVlKTsKIAl2b2lkCQkJCQkJCQkJU2V0U2Nyb2xsUG9zKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCk7CiAKLQl2b2lkCQkJCQkJCQkJU2V0QWxpZ25tZW50SChpbnQzMl90IG5Gb3JtYXQgPSAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJCQlTZXRBbGlnbm1lbnRWKGludDMyX3QgbkZvcm1hdCA9IDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQkJCVNldFBhc3N3b3JkQ2hhcihGWF9XT1JEIHdTdWJXb3JkID0gJyonLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJCQlTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQl2b2lkCQkJCQkJCQkJU2V0Q2hhckFycmF5KGludDMyX3QgbkNoYXJBcnJheSA9IDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQkJCVNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlID0gMC4wZiwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQl2b2lkCQkJCQkJCQkJU2V0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSA9IDEwMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQl2b2lkCQkJCQkJCQkJU2V0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJCQlTZXRNdWx0aUxpbmUoRlhfQk9PTCBiTXVsdGlMaW5lID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQl2b2lkCQkJCQkJCQkJU2V0QXV0b1JldHVybihGWF9CT09MIGJBdXRvID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQl2b2lkCQkJCQkJCQkJU2V0QXV0b0ZvbnRTaXplKEZYX0JPT0wgYkF1dG8gPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJCQlTZXRBdXRvU2Nyb2xsKEZYX0JPT0wgYkF1dG8gPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQkJCVNldFRleHRPdmVyZmxvdyhGWF9CT09MIGJBbGxvd2VkID0gRkFMU0UsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CisJdm9pZAkJCQkJCQkJCVNldEFsaWdubWVudEgoaW50MzJfdCBuRm9ybWF0ID0gMCwgYm9vbCBiUGFpbnQgPSB0cnVlKTsKKwl2b2lkCQkJCQkJCQkJU2V0QWxpZ25tZW50VihpbnQzMl90IG5Gb3JtYXQgPSAwLCBib29sIGJQYWludCA9IHRydWUpOworCXZvaWQJCQkJCQkJCQlTZXRQYXNzd29yZENoYXIoRlhfV09SRCB3U3ViV29yZCA9ICcqJywgYm9vbCBiUGFpbnQgPSB0cnVlKTsKKwl2b2lkCQkJCQkJCQkJU2V0TGltaXRDaGFyKGludDMyX3QgbkxpbWl0Q2hhciA9IDAsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7CisJdm9pZAkJCQkJCQkJCVNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkgPSAwLCBib29sIGJQYWludCA9IHRydWUpOworCXZvaWQJCQkJCQkJCQlTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSA9IDAuMGYsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7CisJdm9pZAkJCQkJCQkJCVNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgPSAxMDAsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7CisJdm9pZAkJCQkJCQkJCVNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZywgYm9vbCBiUGFpbnQgPSB0cnVlKTsKKwl2b2lkCQkJCQkJCQkJU2V0TXVsdGlMaW5lKGJvb2wgYk11bHRpTGluZSA9IHRydWUsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7CisJdm9pZAkJCQkJCQkJCVNldEF1dG9SZXR1cm4oYm9vbCBiQXV0byA9IHRydWUsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7CisJdm9pZAkJCQkJCQkJCVNldEF1dG9Gb250U2l6ZShib29sIGJBdXRvID0gdHJ1ZSwgYm9vbCBiUGFpbnQgPSB0cnVlKTsKKwl2b2lkCQkJCQkJCQkJU2V0QXV0b1Njcm9sbChib29sIGJBdXRvID0gdHJ1ZSwgYm9vbCBiUGFpbnQgPSB0cnVlKTsKKwl2b2lkCQkJCQkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplLCBib29sIGJQYWludCA9IHRydWUpOworCXZvaWQJCQkJCQkJCQlTZXRUZXh0T3ZlcmZsb3coYm9vbCBiQWxsb3dlZCA9IGZhbHNlLCBib29sIGJQYWludCA9IHRydWUpOwogCi0JRlhfQk9PTAkJCQkJCQkJCUlzUmljaFRleHQoKSBjb25zdDsKLQl2b2lkCQkJCQkJCQkJU2V0UmljaFRleHQoRlhfQk9PTCBiUmljaFRleHQgPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoRm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKLQlGWF9CT09MCQkJCQkJCQkJU2V0UmljaEZvbnRJbmRleChpbnQzMl90IG5Gb250SW5kZXgpOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dENvbG9yKEZYX0NPTE9SUkVGIGR3Q29sb3IpOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dFNjcmlwdChpbnQzMl90IG5TY3JpcHRUeXBlKTsKLQlGWF9CT09MCQkJCQkJCQkJU2V0UmljaFRleHRCb2xkKEZYX0JPT0wgYkJvbGQgPSBUUlVFKTsKLQlGWF9CT09MCQkJCQkJCQkJU2V0UmljaFRleHRJdGFsaWMoRlhfQk9PTCBiSXRhbGljID0gVFJVRSk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0VW5kZXJsaW5lKEZYX0JPT0wgYlVuZGVybGluZSA9IFRSVUUpOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dENyb3Nzb3V0KEZYX0JPT0wgYkNyb3Nzb3V0ID0gVFJVRSk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgPSAxMDApOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZyk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0TGluZUluZGVudChGWF9GTE9BVCBmTGluZUluZGVudCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0QWxpZ25tZW50KGludDMyX3QgbkFsaWdubWVudCk7CisJYm9vbAkJCQkJCQkJCUlzUmljaFRleHQoKSBjb25zdDsKKwl2b2lkCQkJCQkJCQkJU2V0UmljaFRleHQoYm9vbCBiUmljaFRleHQgPSB0cnVlLCBib29sIGJQYWludCA9IHRydWUpOworCWJvb2wJCQkJCQkJCQlTZXRSaWNoRm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKKwlib29sCQkJCQkJCQkJU2V0UmljaEZvbnRJbmRleChpbnQzMl90IG5Gb250SW5kZXgpOworCWJvb2wJCQkJCQkJCQlTZXRSaWNoVGV4dENvbG9yKEZYX0NPTE9SUkVGIGR3Q29sb3IpOworCWJvb2wJCQkJCQkJCQlTZXRSaWNoVGV4dFNjcmlwdChpbnQzMl90IG5TY3JpcHRUeXBlKTsKKwlib29sCQkJCQkJCQkJU2V0UmljaFRleHRCb2xkKGJvb2wgYkJvbGQgPSB0cnVlKTsKKwlib29sCQkJCQkJCQkJU2V0UmljaFRleHRJdGFsaWMoYm9vbCBiSXRhbGljID0gdHJ1ZSk7CisJYm9vbAkJCQkJCQkJCVNldFJpY2hUZXh0VW5kZXJsaW5lKGJvb2wgYlVuZGVybGluZSA9IHRydWUpOworCWJvb2wJCQkJCQkJCQlTZXRSaWNoVGV4dENyb3Nzb3V0KGJvb2wgYkNyb3Nzb3V0ID0gdHJ1ZSk7CisJYm9vbAkJCQkJCQkJCVNldFJpY2hUZXh0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpOworCWJvb2wJCQkJCQkJCQlTZXRSaWNoVGV4dEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgPSAxMDApOworCWJvb2wJCQkJCQkJCQlTZXRSaWNoVGV4dExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZyk7CisJYm9vbAkJCQkJCQkJCVNldFJpY2hUZXh0TGluZUluZGVudChGWF9GTE9BVCBmTGluZUluZGVudCk7CisJYm9vbAkJCQkJCQkJCVNldFJpY2hUZXh0QWxpZ25tZW50KGludDMyX3QgbkFsaWdubWVudCk7CiAKLQl2b2lkCQkJCQkJCQkJT25Nb3VzZURvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQkJCU9uVktfVVAoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQkJCU9uVktfRE9XTihGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCQkJT25WS19MRUZUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJCQlPblZLX1JJR0hUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJCQlPblZLX0hPTUUoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQkJCU9uVktfRU5EKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOworCXZvaWQJCQkJCQkJCQlPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCk7CisJdm9pZAkJCQkJCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxib29sIGJTaGlmdCxib29sIGJDdHJsKTsKKwl2b2lkCQkJCQkJCQkJT25WS19VUChib29sIGJTaGlmdCxib29sIGJDdHJsKTsKKwl2b2lkCQkJCQkJCQkJT25WS19ET1dOKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpOworCXZvaWQJCQkJCQkJCQlPblZLX0xFRlQoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCk7CisJdm9pZAkJCQkJCQkJCU9uVktfUklHSFQoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCk7CisJdm9pZAkJCQkJCQkJCU9uVktfSE9NRShib29sIGJTaGlmdCxib29sIGJDdHJsKTsKKwl2b2lkCQkJCQkJCQkJT25WS19FTkQoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCk7CiAKIAl2b2lkCQkJCQkJCQkJU2V0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCxpbnQzMl90IGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsCiAJCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyA9IE5VTEwsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCk7Ci0JRlhfQk9PTAkJCQkJCQkJCUluc2VydFdvcmQoRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpOwotCUZYX0JPT0wJCQkJCQkJCQlJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyA9IE5VTEwsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCk7Ci0JRlhfQk9PTAkJCQkJCQkJCUJhY2tzcGFjZSgpOwotCUZYX0JPT0wJCQkJCQkJCQlEZWxldGUoKTsKLQlGWF9CT09MCQkJCQkJCQkJQ2xlYXIoKTsKLQlGWF9CT09MCQkJCQkJCQkJRW1wdHkoKTsKLQlGWF9CT09MCQkJCQkJCQkJSW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwgaW50MzJfdCBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VULAorCWJvb2wJCQkJCQkJCQlJbnNlcnRXb3JkKEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VULCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKTsKKwlib29sCQkJCQkJCQkJSW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgPSBOVUxMLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpOworCWJvb2wJCQkJCQkJCQlCYWNrc3BhY2UoKTsKKwlib29sCQkJCQkJCQkJRGVsZXRlKCk7CisJYm9vbAkJCQkJCQkJCUNsZWFyKCk7CisJYm9vbAkJCQkJCQkJCUVtcHR5KCk7CisJYm9vbAkJCQkJCQkJCUluc2VydFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsIGludDMyX3QgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCwKIAkJCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKTsKLQlGWF9CT09MCQkJCQkJCQkJUmVkbygpOwotCUZYX0JPT0wJCQkJCQkJCQlVbmRvKCk7CisJYm9vbAkJCQkJCQkJCVJlZG8oKTsKKwlib29sCQkJCQkJCQkJVW5kbygpOwogCUNQVlRfV29yZFBsYWNlCQkJCQkJCURvSW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IEZYX1dDSEFSKiB0ZXh0LCBpbnQzMl90IGNoYXJzZXQsCiAJCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMpOwogCWludDMyX3QJCQkJCQkJCUdldENoYXJTZXRGcm9tVW5pY29kZShGWF9XT1JEIHdvcmQsIGludDMyX3Qgbk9sZENoYXJzZXQpOwpAQCAtNjY2LDcgKzY2Niw3IEBACiAJdm9pZAkJCQkJCQkJCVNlbGVjdEFsbCgpOwogCXZvaWQJCQkJCQkJCQlTZWxlY3ROb25lKCk7CiAJdm9pZAkJCQkJCQkJCVNldFNlbChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIGJlZ2luLGNvbnN0IENQVlRfV29yZFBsYWNlICYgZW5kKTsKLQlGWF9CT09MCQkJCQkJCQkJSXNTZWxlY3RlZCgpIGNvbnN0OworCWJvb2wJCQkJCQkJCQlJc1NlbGVjdGVkKCkgY29uc3Q7CiAKIAl2b2lkCQkJCQkJCQkJUmVhcnJhbmdlQWxsKCk7CiAJdm9pZAkJCQkJCQkJCVJlYXJyYW5nZVBhcnQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiByYW5nZSk7CkBAIC02NzcsMjMgKzY3NywyMyBAQAogCXZvaWQJCQkJCQkJCQlTZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KTsKIAl2b2lkCQkJCQkJCQkJU2V0U2Nyb2xsTGltaXQoKTsKIAl2b2lkCQkJCQkJCQkJU2V0Q29udGVudENoYW5nZWQoKTsKLQl2b2lkCQkJCQkJCQkJRW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSk7CisJdm9pZAkJCQkJCQkJCUVuYWJsZU5vdGlmeShib29sIGJOb3RpZnkpOwogCiAJdm9pZAkJCQkJCQkJCVNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsaW50MzJfdCBjaGFyc2V0LAotCQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KTsKLQlGWF9CT09MCQkJCQkJCQkJSW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KTsKLQlGWF9CT09MCQkJCQkJCQkJSW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KTsKLQlGWF9CT09MCQkJCQkJCQkJQmFja3NwYWNlKEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KTsKLQlGWF9CT09MCQkJCQkJCQkJRGVsZXRlKEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KTsKLQlGWF9CT09MCQkJCQkJCQkJQ2xlYXIoRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpOwotCUZYX0JPT0wJCQkJCQkJCQlJbnNlcnRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LCBpbnQzMl90IGNoYXJzZXQsCi0JCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyxGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0UHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywKKwkJCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyxib29sIGJBZGRVbmRvLCBib29sIGJQYWludCk7CisJYm9vbAkJCQkJCQkJCUluc2VydFdvcmQoRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyxib29sIGJBZGRVbmRvLCBib29sIGJQYWludCk7CisJYm9vbAkJCQkJCQkJCUluc2VydFJldHVybihjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyxib29sIGJBZGRVbmRvLCBib29sIGJQYWludCk7CisJYm9vbAkJCQkJCQkJCUJhY2tzcGFjZShib29sIGJBZGRVbmRvLCBib29sIGJQYWludCk7CisJYm9vbAkJCQkJCQkJCURlbGV0ZShib29sIGJBZGRVbmRvLCBib29sIGJQYWludCk7CisJYm9vbAkJCQkJCQkJCUNsZWFyKGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KTsKKwlib29sCQkJCQkJCQkJSW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwgaW50MzJfdCBjaGFyc2V0LAorCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsYm9vbCBiQWRkVW5kbywgYm9vbCBiUGFpbnQpOworCWJvb2wJCQkJCQkJCQlTZXRSaWNoVGV4dFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsCiAJCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMpOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRTZWNQcm9wcyhFRElUX1BST1BTX0UgZVByb3BzLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLAotCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyLCBGWF9CT09MIGJBZGRVbmRvKTsKLQlGWF9CT09MCQkJCQkJCQkJU2V0V29yZFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsCi0JCQkJCQkJCQkJCQljb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IsIEZYX0JPT0wgYkFkZFVuZG8pOworCWJvb2wJCQkJCQkJCQlTZXRTZWNQcm9wcyhFRElUX1BST1BTX0UgZVByb3BzLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLAorCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyLCBib29sIGJBZGRVbmRvKTsKKwlib29sCQkJCQkJCQkJU2V0V29yZFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsCisJCQkJCQkJCQkJCQljb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IsIGJvb2wgYkFkZFVuZG8pOwogCXZvaWQJCQkJCQkJCQlQYWludFNldFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IpOwogCXZvaWQJCQkJCQkJCQlQYWludEluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE9sZCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE5ldyk7CiAKQEAgLTcwMiw3ICs3MDIsNyBAQAogCWlubGluZSBDUERGX1JlY3QJCQkJCQlWVFRvRWRpdChjb25zdCBDUERGX1JlY3QgJiByZWN0KSBjb25zdDsKIAlpbmxpbmUgQ1BERl9SZWN0CQkJCQkJRWRpdFRvVlQoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJCQkJRW5hYmxlUmVmcmVzaChGWF9CT09MIGJSZWZyZXNoKTsKKwl2b2lkCQkJCQkJCQkJRW5hYmxlUmVmcmVzaChib29sIGJSZWZyZXNoKTsKIAl2b2lkCQkJCQkJCQkJUmVmcmVzaChSRUZSRVNIX1BMQU5fRSBlUGxhbixjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZTEgPSBOVUxMLGNvbnN0IENQVlRfV29yZFJhbmdlICogcFJhbmdlMiA9IE5VTEwpOwogCXZvaWQJCQkJCQkJCQlSZWZyZXNoUHVzaExpbmVSZWN0cyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyKTsKIAl2b2lkCQkJCQkJCQkJUmVmcmVzaFB1c2hSYW5kb21SZWN0cyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyKTsKQEAgLTcyMCwxNCArNzIwLDE0IEBACiAJQ1BWVF9Xb3JkUmFuZ2UJCQkJCQkJQ29tYmluZVdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyMSwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3cjIpOwogCUNQVlRfV29yZFJhbmdlCQkJCQkJCUdldFNlbGVjdFdvcmRSYW5nZSgpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQkJCUVuYWJsZVVuZG8oRlhfQk9PTCBiVW5kbyk7Ci0Jdm9pZAkJCQkJCQkJCUVuYWJsZU9wck5vdGlmeShGWF9CT09MIGJOb3RpZnkpOworCXZvaWQJCQkJCQkJCQlFbmFibGVVbmRvKGJvb2wgYlVuZG8pOworCXZvaWQJCQkJCQkJCQlFbmFibGVPcHJOb3RpZnkoYm9vbCBiTm90aWZ5KTsKIAotCUZYX0JPT0wJCQkJCQkJCQlJc1RleHRGdWxsKCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQkJCUlzVGV4dE92ZXJmbG93KCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQkJCUNhblVuZG8oKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCQkJQ2FuUmVkbygpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJCQlJc01vZGlmaWVkKCkgY29uc3Q7CisJYm9vbAkJCQkJCQkJCUlzVGV4dEZ1bGwoKSBjb25zdDsKKwlib29sCQkJCQkJCQkJSXNUZXh0T3ZlcmZsb3coKSBjb25zdDsKKwlib29sCQkJCQkJCQkJQ2FuVW5kbygpIGNvbnN0OworCWJvb2wJCQkJCQkJCQlDYW5SZWRvKCkgY29uc3Q7CisJYm9vbAkJCQkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdDsKIAogCXZvaWQJCQkJCQkJCQlCZWdpbkdyb3VwVW5kbyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RpdGxlKTsKIAl2b2lkCQkJCQkJCQkJRW5kR3JvdXBVbmRvKCk7CkBAIC03NTEsMTkgKzc1MSwxOSBAQAogCiAJQ1BERl9Qb2ludAkJCQkJCQkJbV9wdFNjcm9sbFBvczsKIAlDUERGX1BvaW50CQkJCQkJCQltX3B0UmVmcmVzaFNjcm9sbFBvczsKLQlGWF9CT09MCQkJCQkJCQkJbV9iRW5hYmxlU2Nyb2xsOworCWJvb2wJCQkJCQkJCQltX2JFbmFibGVTY3JvbGw7CiAJSUZYX0VkaXRfSXRlcmF0b3IgKgkJCQkJCW1fcEl0ZXJhdG9yOwogCUNGWF9FZGl0X1JlZnJlc2gJCQkJCQltX1JlZnJlc2g7CiAJQ1BERl9Qb2ludAkJCQkJCQkJbV9wdENhcmV0OwogCUNGWF9FZGl0X1VuZG8JCQkJCQkJbV9VbmRvOwogCWludDMyX3QJCQkJCQkJCW1fbkFsaWdubWVudDsKLQlGWF9CT09MCQkJCQkJCQkJbV9iTm90aWZ5RmxhZzsKLQlGWF9CT09MCQkJCQkJCQkJbV9iRW5hYmxlT3ZlcmZsb3c7Ci0JRlhfQk9PTAkJCQkJCQkJCW1fYkVuYWJsZVJlZnJlc2g7CisJYm9vbAkJCQkJCQkJCW1fYk5vdGlmeUZsYWc7CisJYm9vbAkJCQkJCQkJCW1fYkVuYWJsZU92ZXJmbG93OworCWJvb2wJCQkJCQkJCQltX2JFbmFibGVSZWZyZXNoOwogCUNQREZfUmVjdAkJCQkJCQkJbV9yY09sZENvbnRlbnQ7Ci0JRlhfQk9PTAkJCQkJCQkJCW1fYkVuYWJsZVVuZG87Ci0JRlhfQk9PTAkJCQkJCQkJCW1fYk5vdGlmeTsKLQlGWF9CT09MCQkJCQkJCQkJbV9iT3ByTm90aWZ5OworCWJvb2wJCQkJCQkJCQltX2JFbmFibGVVbmRvOworCWJvb2wJCQkJCQkJCQltX2JOb3RpZnk7CisJYm9vbAkJCQkJCQkJCW1fYk9wck5vdGlmeTsKIAlDRlhfRWRpdF9Hcm91cFVuZG9JdGVtKgkJCQkJbV9wR3JvdXBVbmRvSXRlbTsKIH07CiAKQEAgLTc3NSwxNiArNzc1LDE2IEBACiAJQ0ZYX0VkaXRfSXRlcmF0b3IoQ0ZYX0VkaXQgKiBwRWRpdCxJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBWVEl0ZXJhdG9yKTsKIAl2aXJ0dWFsIH5DRlhfRWRpdF9JdGVyYXRvcigpOwogCi0JRlhfQk9PTAkJCQkJCQkJCU5leHRXb3JkKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCU5leHRMaW5lKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCU5leHRTZWN0aW9uKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVByZXZXb3JkKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVByZXZMaW5lKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVByZXZTZWN0aW9uKCk7CisJYm9vbAkJCQkJCQkJCU5leHRXb3JkKCk7CisJYm9vbAkJCQkJCQkJCU5leHRMaW5lKCk7CisJYm9vbAkJCQkJCQkJCU5leHRTZWN0aW9uKCk7CisJYm9vbAkJCQkJCQkJCVByZXZXb3JkKCk7CisJYm9vbAkJCQkJCQkJCVByZXZMaW5lKCk7CisJYm9vbAkJCQkJCQkJCVByZXZTZWN0aW9uKCk7CiAKLQlGWF9CT09MCQkJCQkJCQkJR2V0V29yZChDUFZUX1dvcmQgJiB3b3JkKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCQkJR2V0TGluZShDUFZUX0xpbmUgJiBsaW5lKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCQkJR2V0U2VjdGlvbihDUFZUX1NlY3Rpb24gJiBzZWN0aW9uKSBjb25zdDsKKwlib29sCQkJCQkJCQkJR2V0V29yZChDUFZUX1dvcmQgJiB3b3JkKSBjb25zdDsKKwlib29sCQkJCQkJCQkJR2V0TGluZShDUFZUX0xpbmUgJiBsaW5lKSBjb25zdDsKKwlib29sCQkJCQkJCQkJR2V0U2VjdGlvbihDUFZUX1NlY3Rpb24gJiBzZWN0aW9uKSBjb25zdDsKIAl2b2lkCQkJCQkJCQkJU2V0QXQoaW50MzJfdCBuV29yZEluZGV4KTsKIAl2b2lkCQkJCQkJCQkJU2V0QXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSk7CiAJY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJgkJCQkJR2V0QXQoKSBjb25zdDsKQEAgLTgwOCw3ICs4MDgsNyBAQAogCWludDMyX3QJCQkJCUdldFR5cGVEZXNjZW50KGludDMyX3QgbkZvbnRJbmRleCk7CiAJaW50MzJfdAkJCQkJR2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwgaW50MzJfdCBuRm9udEluZGV4KTsKIAlpbnQzMl90CQkJCQlHZXREZWZhdWx0Rm9udEluZGV4KCk7Ci0JRlhfQk9PTAkJCQkJCUlzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCk7CisJYm9vbAkJCQkJCUlzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCk7CiAKIHByaXZhdGU6CiAJSUZYX0VkaXRfRm9udE1hcCoJCQltX3BGb250TWFwOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2xpc3QuaCBiL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9saXN0LmgKaW5kZXggZmU3NWIwZi4uMDdlZGI0NiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2xpc3QuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfbGlzdC5oCkBAIC0zMSw3ICszMSw3IEBACiAJCXkgPSAwLjBmOwogCX0KIAotCUZYX0JPT0wgb3BlcmF0b3IgIT0gKGNvbnN0IENMU1RfU2l6ZSAmIHNpemUpIGNvbnN0CisJYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQ0xTVF9TaXplICYgc2l6ZSkgY29uc3QKIAl7CiAJCXJldHVybiBGWFNZU19tZW1jbXAodGhpcywgJnNpemUsIHNpemVvZihDTFNUX1NpemUpKSAhPSAwOwogCX0KQEAgLTgxLDEyICs4MSwxMiBAQAogCQlyZXR1cm4gKnRoaXM7CiAJfQogCi0JRlhfQk9PTCBvcGVyYXRvciA9PSAoY29uc3QgQ0xTVF9SZWN0ICYgcmVjdCkgY29uc3QKKwlib29sIG9wZXJhdG9yID09IChjb25zdCBDTFNUX1JlY3QgJiByZWN0KSBjb25zdAogCXsKIAkJcmV0dXJuIEZYU1lTX21lbWNtcCh0aGlzLCAmcmVjdCwgc2l6ZW9mKENMU1RfUmVjdCkpID09IDA7CiAJfQogCi0JRlhfQk9PTCBvcGVyYXRvciAhPSAoY29uc3QgQ0xTVF9SZWN0ICYgcmVjdCkgY29uc3QKKwlib29sIG9wZXJhdG9yICE9IChjb25zdCBDTFNUX1JlY3QgJiByZWN0KSBjb25zdAogCXsKIAkJcmV0dXJuIEZYU1lTX21lbWNtcCh0aGlzLCAmcmVjdCwgc2l6ZW9mKENMU1RfUmVjdCkpICE9IDA7CiAJfQpAQCAtMTYyLDIyICsxNjIsMjIgQEAKIAogcHVibGljOgogCXZvaWQJCQkJCQkJU2V0UmVjdChjb25zdCBDTFNUX1JlY3QgJiByZWN0KTsKLQl2b2lkCQkJCQkJCVNldFNlbGVjdChGWF9CT09MIGJTZWxlY3RlZCk7Ci0Jdm9pZAkJCQkJCQlTZXRDYXJldChGWF9CT09MIGJDYXJldCk7CisJdm9pZAkJCQkJCQlTZXRTZWxlY3QoYm9vbCBiU2VsZWN0ZWQpOworCXZvaWQJCQkJCQkJU2V0Q2FyZXQoYm9vbCBiQ2FyZXQpOwogCXZvaWQJCQkJCQkJU2V0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCk7CiAJdm9pZAkJCQkJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOwogCUNGWF9XaWRlU3RyaW5nCQkJCQlHZXRUZXh0KCkgY29uc3Q7CiAKIAlDTFNUX1JlY3QJCQkJCQlHZXRSZWN0KCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlJc1NlbGVjdGVkKCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlJc0NhcmV0KCkgY29uc3Q7CisJYm9vbAkJCQkJCQlJc1NlbGVjdGVkKCkgY29uc3Q7CisJYm9vbAkJCQkJCQlJc0NhcmV0KCkgY29uc3Q7CiAJRlhfRkxPQVQJCQkJCQlHZXRJdGVtSGVpZ2h0KCkgY29uc3Q7CiAJRlhfV09SRAkJCQkJCQlHZXRGaXJzdENoYXIoKSBjb25zdDsKIAogcHJpdmF0ZToKIAlJRlhfRWRpdCoJCQkJCQltX3BFZGl0OwotCUZYX0JPT0wJCQkJCQkJbV9iU2VsZWN0ZWQ7Ci0JRlhfQk9PTAkJCQkJCQltX2JDYXJldDsKKwlib29sCQkJCQkJCW1fYlNlbGVjdGVkOworCWJvb2wJCQkJCQkJbV9iQ2FyZXQ7CiAJQ0xTVF9SZWN0CQkJCQkJbV9yY0xpc3RJdGVtOwogfTsKIApAQCAtMjA5LDcgKzIwOSw3IEBACiB0ZW1wbGF0ZTxjbGFzcyBUWVBFPiBjbGFzcyBDTFNUX0FycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT4KIHsKIHB1YmxpYzoKLQlGWF9CT09MIElzRW1wdHkoKSB7IHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpIDw9IDA7IH0KKwlib29sIElzRW1wdHkoKSB7IHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpIDw9IDA7IH0KIAlUWVBFIEdldEF0KGludDMyX3QgbkluZGV4KSBjb25zdCB7IGlmIChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpKSByZXR1cm4gQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldEF0KG5JbmRleCk7IHJldHVybiBOVUxMO30KIAl2b2lkIFJlbW92ZUF0KGludDMyX3QgbkluZGV4KXtpZiAobkluZGV4ID49IDAgJiYgbkluZGV4IDwgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldFNpemUoKSkgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OlJlbW92ZUF0KG5JbmRleCk7fQogfTsKQEAgLTIzMCwxMiArMjMwLDEyIEBACiAJdmlydHVhbCBGWF9GTE9BVAkJCQlHZXRGb250U2l6ZSgpIGNvbnN0OwogCXZpcnR1YWwgSUZYX0VkaXQqCQkJCUdldEl0ZW1FZGl0KGludDMyX3QgbkluZGV4KSBjb25zdDsKIAl2aXJ0dWFsIGludDMyX3QJCQkJR2V0Q291bnQoKSBjb25zdDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCUlzSXRlbVNlbGVjdGVkKGludDMyX3QgbkluZGV4KSBjb25zdDsKKwl2aXJ0dWFsIGJvb2wJCQkJCUlzSXRlbVNlbGVjdGVkKGludDMyX3QgbkluZGV4KSBjb25zdDsKIAl2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEZpcnN0SGVpZ2h0KCkgY29uc3Q7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldE11bHRpcGxlU2VsKEZYX0JPT0wgYk11bHRpcGxlKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCUlzTXVsdGlwbGVTZWwoKSBjb25zdDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCUlzVmFsaWQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKKwl2aXJ0dWFsIHZvaWQJCQkJCVNldE11bHRpcGxlU2VsKGJvb2wgYk11bHRpcGxlKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCUlzTXVsdGlwbGVTZWwoKSBjb25zdDsKKwl2aXJ0dWFsIGJvb2wJCQkJCUlzVmFsaWQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKIAl2aXJ0dWFsIGludDMyX3QJCQkJRmluZE5leHQoaW50MzJfdCBuSW5kZXgsRlhfV0NIQVIgbkNoYXIpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CkBAIC0yNDcsOCArMjQ3LDggQEAKIAl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRJdGVtUmVjdChpbnQzMl90IG5JbmRleCkgY29uc3Q7CiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldEl0ZW1UZXh0KGludDMyX3QgbkluZGV4KSBjb25zdDsKIAotCXZvaWQJCQkJCQkJU2V0SXRlbVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkKTsKLQl2b2lkCQkJCQkJCVNldEl0ZW1DYXJldChpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYkNhcmV0KTsKKwl2b2lkCQkJCQkJCVNldEl0ZW1TZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4LCBib29sIGJTZWxlY3RlZCk7CisJdm9pZAkJCQkJCQlTZXRJdGVtQ2FyZXQoaW50MzJfdCBuSXRlbUluZGV4LCBib29sIGJDYXJldCk7CiAKIAl2aXJ0dWFsIGludDMyX3QJCQkJR2V0SXRlbUluZGV4KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3Q7CiAJaW50MzJfdAkJCQkJCUdldEZpcnN0U2VsZWN0ZWQoKSBjb25zdDsKQEAgLTI1OSw3ICsyNTksNyBAQAogCUNMU1RfQXJyYXlUZW1wbGF0ZTxDRlhfTGlzdEl0ZW0qPgltX2FMaXN0SXRlbXM7CiAJRlhfRkxPQVQJCQkJCQkJbV9mRm9udFNpemU7CiAJSUZYX0VkaXRfRm9udE1hcCoJCQkJCW1fcEZvbnRNYXA7Ci0JRlhfQk9PTAkJCQkJCQkJbV9iTXVsdGlwbGU7CisJYm9vbAkJCQkJCQkJbV9iTXVsdGlwbGU7CiB9OwogCiBzdHJ1Y3QgQ1BMU1RfU2VsZWN0X0l0ZW0KQEAgLTI4NSw3ICsyODUsNyBAQAogCXZvaWQJCQkJCQkJQWRkKGludDMyX3QgbkJlZ2luSW5kZXgsIGludDMyX3QgbkVuZEluZGV4KTsKIAl2b2lkCQkJCQkJCVN1YihpbnQzMl90IG5JdGVtSW5kZXgpOwogCXZvaWQJCQkJCQkJU3ViKGludDMyX3QgbkJlZ2luSW5kZXgsIGludDMyX3QgbkVuZEluZGV4KTsKLQlGWF9CT09MCQkJCQkJCUlzRXhpc3QoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKKwlib29sCQkJCQkJCUlzRXhpc3QoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKIAlpbnQzMl90CQkJCQkJRmluZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OwogCWludDMyX3QJCQkJCQlHZXRDb3VudCgpIGNvbnN0OwogCWludDMyX3QJCQkJCQlHZXRJdGVtSW5kZXgoaW50MzJfdCBuSW5kZXgpIGNvbnN0OwpAQCAtMzA2LDE2ICszMDYsMTYgQEAKIHB1YmxpYzoKIAl2b2lkCQkJCQkJCVNldE5vdGlmeShJRlhfTGlzdF9Ob3RpZnkgKiBwTm90aWZ5KTsKIAotCXZvaWQJCQkJCQkJT25Nb3VzZURvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJT25WS19VUChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCU9uVktfRE9XTihGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCU9uVktfTEVGVChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCU9uVktfUklHSFQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQlPblZLX0hPTUUoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQlPblZLX0VORChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCU9uVksoaW50MzJfdCBuSXRlbUluZGV4LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCUZYX0JPT0wJCQkJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7CisJdm9pZAkJCQkJCQlPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCk7CisJdm9pZAkJCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCk7CisJdm9pZAkJCQkJCQlPblZLX1VQKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpOworCXZvaWQJCQkJCQkJT25WS19ET1dOKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpOworCXZvaWQJCQkJCQkJT25WS19MRUZUKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpOworCXZvaWQJCQkJCQkJT25WS19SSUdIVChib29sIGJTaGlmdCxib29sIGJDdHJsKTsKKwl2b2lkCQkJCQkJCU9uVktfSE9NRShib29sIGJTaGlmdCxib29sIGJDdHJsKTsKKwl2b2lkCQkJCQkJCU9uVktfRU5EKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpOworCXZvaWQJCQkJCQkJT25WSyhpbnQzMl90IG5JdGVtSW5kZXgsYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCk7CisJYm9vbAkJCQkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhcixib29sIGJTaGlmdCxib29sIGJDdHJsKTsKIAogCXZpcnR1YWwgQ1BERl9Qb2ludAkJCQlJblRvT3V0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3Q7CiAJdmlydHVhbCBDUERGX1BvaW50CQkJCU91dFRvSW4oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKQEAgLTM0MSwyMyArMzQxLDIzIEBACiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFRleHQoKSBjb25zdDsKIAogcHJpdmF0ZToKLQl2b2lkCQkJCQkJCVNldE11bHRpcGxlU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQpOworCXZvaWQJCQkJCQkJU2V0TXVsdGlwbGVTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4LCBib29sIGJTZWxlY3RlZCk7CiAJdm9pZAkJCQkJCQlTZXRTaW5nbGVTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4KTsKIAl2b2lkCQkJCQkJCUludmFsaWRhdGVJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCk7CiAJdm9pZAkJCQkJCQlTZWxlY3RJdGVtcygpOwotCUZYX0JPT0wJCQkJCQkJSXNJdGVtVmlzaWJsZShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OworCWJvb2wJCQkJCQkJSXNJdGVtVmlzaWJsZShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OwogCXZvaWQJCQkJCQkJU2V0U2Nyb2xsSW5mbygpOwogCXZvaWQJCQkJCQkJU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSk7CiAJdmlydHVhbCB2b2lkCQkJCQlSZUFycmFuZ2UoaW50MzJfdCBuSXRlbUluZGV4KTsKIAogcHJpdmF0ZToKIAlJRlhfTGlzdF9Ob3RpZnkqCQkJCW1fcE5vdGlmeTsKLQlGWF9CT09MCQkJCQkJCW1fYk5vdGlmeUZsYWc7CisJYm9vbAkJCQkJCQltX2JOb3RpZnlGbGFnOwogCUNQREZfUG9pbnQJCQkJCQltX3B0U2Nyb2xsUG9zOwogCUNQTFNUX1NlbGVjdAkJCQkJbV9hU2VsSXRlbXM7CS8vZm9yIG11bHRpcGxlCiAJaW50MzJfdAkJCQkJCW1fblNlbEl0ZW07CQkvL2ZvciBzaW5nbGUKIAlpbnQzMl90CQkJCQkJbV9uRm9vdEluZGV4OwkvL2ZvciBtdWx0aXBsZQotCUZYX0JPT0wJCQkJCQkJbV9iQ3RybFNlbDsJCS8vZm9yIG11bHRpcGxlCisJYm9vbAkJCQkJCQltX2JDdHJsU2VsOwkJLy9mb3IgbXVsdGlwbGUKIAlpbnQzMl90CQkJCQkJbV9uQ2FyZXRJbmRleDsJLy9mb3IgbXVsdGlwbGUKIH07CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0RvY3VtZW50LmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9Eb2N1bWVudC5oCmluZGV4IGI2NDQ3ZmQuLmVhZTNlMDcgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0RvY3VtZW50LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvRG9jdW1lbnQuaApAQCAtMTYsMTQgKzE2LDE0IEBACiAJdmlydHVhbCB+UHJpbnRQYXJhbXNPYmooKXt9CiAKIHB1YmxpYzoKLQlGWF9CT09MIGJVSTsKKwlib29sIGJVSTsKIAlpbnQgblN0YXJ0OwogCWludCBuRW5kOwotCUZYX0JPT0wgYlNpbGVudDsKLQlGWF9CT09MIGJTaHJpbmtUb0ZpdDsKLQlGWF9CT09MIGJQcmludEFzSW1hZ2U7Ci0JRlhfQk9PTCBiUmV2ZXJzZTsKLQlGWF9CT09MIGJBbm5vdGF0aW9uczsKKwlib29sIGJTaWxlbnQ7CisJYm9vbCBiU2hyaW5rVG9GaXQ7CisJYm9vbCBiUHJpbnRBc0ltYWdlOworCWJvb2wgYlJldmVyc2U7CisJYm9vbCBiQW5ub3RhdGlvbnM7CiB9OwogCiBjbGFzcyBDSlNfUHJpbnRQYXJhbXNPYmogOiBwdWJsaWMgQ0pTX09iamVjdApAQCAtODUsODQgKzg1LDg0IEBACiAJdmlydHVhbCB+RG9jdW1lbnQoKTsKIAogcHVibGljOgotCUZYX0JPT0wJQURCRShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJYXV0aG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAliYXNlVVJMKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlib29rbWFya1Jvb3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWNhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJQ29sbGFiKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAljcmVhdGlvbkRhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWNyZWF0b3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWRlbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlkaXJ0eShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZG9jdW1lbnRGaWxlTmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZXh0ZXJuYWwoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWZpbGVzaXplKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlpY29ucyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJaW5mbyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJa2V5d29yZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWxheW91dChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJbWVkaWEoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCW1vZERhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCW1vdXNlWChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJbW91c2VZKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAludW1GaWVsZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCW51bVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlwYWdlTnVtKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlwYWdlV2luZG93UmVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJcGF0aChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJcHJvZHVjZXIoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXN1YmplY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXRpdGxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAl6b29tKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAl6b29tVHlwZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJQURCRShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJYXV0aG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAliYXNlVVJMKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlib29rbWFya1Jvb3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWNhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJQ29sbGFiKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAljcmVhdGlvbkRhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWNyZWF0b3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWRlbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlkaXJ0eShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJZG9jdW1lbnRGaWxlTmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgZXh0ZXJuYWwoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWZpbGVzaXplKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlpY29ucyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJaW5mbyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJa2V5d29yZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWxheW91dChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJbWVkaWEoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCW1vZERhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCW1vdXNlWChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJbW91c2VZKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAludW1GaWVsZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCW51bVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlwYWdlTnVtKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlwYWdlV2luZG93UmVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJcGF0aChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJcHJvZHVjZXIoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCXN1YmplY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCXRpdGxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAl6b29tKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAl6b29tVHlwZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogCi0JRlhfQk9PTCBhZGRBbm5vdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWFkZEZpZWxkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJYWRkTGluayhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWFkZEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAljYWxjdWxhdGVOb3coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAljbG9zZURvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWNyZWF0ZURhdGFPYmplY3QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBkZWxldGVQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWV4cG9ydEFzVGV4dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWV4cG9ydEFzRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZXhwb3J0QXNYRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZXh0cmFjdFBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZ2V0QW5ub3QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlnZXRBbm5vdHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlnZXRBbm5vdDNEKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZ2V0QW5ub3RzM0QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlnZXRGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlnZXRMaW5rcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldE50aEZpZWxkTmFtZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldE9DR3MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlnZXRQYWdlQm94KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZ2V0UGFnZU50aFdvcmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlnZXRQYWdlTnRoV29yZFF1YWRzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZ2V0UGFnZU51bVdvcmRzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZ2V0UHJpbnRQYXJhbXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBnZXRVUkwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlpbXBvcnRBbkZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWltcG9ydEFuWEZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWltcG9ydFRleHREYXRhKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgaW5zZXJ0UGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAltYWlsRm9ybShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXByaW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJcmVtb3ZlRmllbGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCByZXBsYWNlUGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlyZXNldEZvcm0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlzYXZlQXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlzdWJtaXRGb3JtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJbWFpbERvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXJlbW92ZUljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBhZGRBbm5vdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWFkZEZpZWxkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJYWRkTGluayhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWFkZEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAljYWxjdWxhdGVOb3coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAljbG9zZURvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWNyZWF0ZURhdGFPYmplY3QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBkZWxldGVQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWV4cG9ydEFzVGV4dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWV4cG9ydEFzRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJZXhwb3J0QXNYRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgZXh0cmFjdFBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJZ2V0QW5ub3QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlnZXRBbm5vdHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlnZXRBbm5vdDNEKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJZ2V0QW5ub3RzM0QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlnZXRGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWdldEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlnZXRMaW5rcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWdldE50aEZpZWxkTmFtZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWdldE9DR3MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlnZXRQYWdlQm94KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJZ2V0UGFnZU50aFdvcmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlnZXRQYWdlTnRoV29yZFF1YWRzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJZ2V0UGFnZU51bVdvcmRzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgZ2V0UHJpbnRQYXJhbXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBnZXRVUkwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlpbXBvcnRBbkZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWltcG9ydEFuWEZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWltcG9ydFRleHREYXRhKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgaW5zZXJ0UGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAltYWlsRm9ybShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCXByaW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJcmVtb3ZlRmllbGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCByZXBsYWNlUGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlyZXNldEZvcm0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlzYXZlQXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlzdWJtaXRGb3JtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJbWFpbERvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCXJlbW92ZUljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKIHB1YmxpYzoKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNoRG9jKENQREZTREtfRG9jdW1lbnQqIHBEb2MpOwogCUNQREZTREtfRG9jdW1lbnQqICAgICAgICAgICAgICAgICAgICAgICBHZXRSZWFkZXJEb2MoKTsKLQlzdGF0aWMgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFjdEZpbGVOYW1lKENQREZTREtfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzdHJGaWxlTmFtZSk7Ci0Jc3RhdGljIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RGb2xkZXJOYW1lKENQREZTREtfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzdHJGb2xkZXJOYW1lKTsKKwlzdGF0aWMgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFjdEZpbGVOYW1lKENQREZTREtfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzdHJGaWxlTmFtZSk7CisJc3RhdGljIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RGb2xkZXJOYW1lKENQREZTREtfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzdHJGb2xkZXJOYW1lKTsKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkRGVsYXlEYXRhKENKU19EZWxheURhdGEqIHBEYXRhKTsKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9GaWVsZERlbGF5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCk7CiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZERlbGF5QW5ub3REYXRhKENKU19Bbm5vdE9iaiAqcERhdGEpOwpAQCAtMTc2LDcgKzE3Niw3IEBACiAJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzRW5jbG9zZWRJblJlY3QoQ0ZYX0Zsb2F0UmVjdCByZWN0LCBDRlhfRmxvYXRSZWN0IExpbmtSZWN0KTsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRXb3JkcyhDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqKTsKIAlDRlhfV2lkZVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0T2JqV29yZFN0cihDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLCBpbnQgbldvcmRJbmRleCk7Ci0JRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlclBhcmFtcyhKU09iamVjdCAqcE9iaixDSlNfQW5ub3RPYmomIGFubm90b2JqKTsKKwlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VyUGFyYW1zKEpTT2JqZWN0ICpwT2JqLENKU19Bbm5vdE9iaiYgYW5ub3RvYmopOwogCiAJdjg6Oklzb2xhdGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faXNvbGF0ZTsKIAlJY29uVHJlZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wSWNvblRyZWU7CkBAIC0xOTMsNyArMTkzLDcgQEAKIAlDSlNfRG9jdW1lbnQoSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307CiAJdmlydHVhbCB+Q0pTX0RvY3VtZW50KCl7fTsKIAotCXZpcnR1YWwgRlhfQk9PTAlJbml0SW5zdGFuY2UoSUZYSlNfQ29udGV4dCogY2MpOworCXZpcnR1YWwgYm9vbAlJbml0SW5zdGFuY2UoSUZYSlNfQ29udGV4dCogY2MpOwogCiAJREVDTEFSRV9KU19DTEFTUyhDSlNfRG9jdW1lbnQpOwogCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9GaWVsZC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvRmllbGQuaAppbmRleCA3MGQxZDM5Li4yYTZiYTdkIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9GaWVsZC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0ZpZWxkLmgKQEAgLTEwMyw4NSArMTAzLDg1IEBACiAJRmllbGQoQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKIAl2aXJ0dWFsIH5GaWVsZCh2b2lkKTsKIAotICAgIEZYX0JPT0wgYWxpZ25tZW50KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gICAgRlhfQk9PTCBib3JkZXJTdHlsZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgYnV0dG9uQWxpZ25YKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBidXR0b25BbGlnblkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGJ1dHRvbkZpdEJvdW5kcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgYnV0dG9uUG9zaXRpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGJ1dHRvblNjYWxlSG93KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gICAgRlhfQk9PTCBidXR0b25TY2FsZVdoZW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGNhbGNPcmRlckluZGV4KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBjaGFyTGltaXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGNvbWIoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGNvbW1pdE9uU2VsQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBjdXJyZW50VmFsdWVJbmRpY2VzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gICAgRlhfQk9PTCBkZWZhdWx0U3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGRlZmF1bHRWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZG9Ob3RTY3JvbGwoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGRvTm90U3BlbGxDaGVjayhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZGVsYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGRpc3BsYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgICBGWF9CT09MIGRvYyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZWRpdGFibGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGV4cG9ydFZhbHVlcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZmlsZVNlbGVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZmlsbENvbG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBoaWRkZW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgICBGWF9CT09MIGhpZ2hsaWdodChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgbGluZVdpZHRoKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBtdWx0aWxpbmUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIG11bHRpcGxlU2VsZWN0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBuYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBudW1JdGVtcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICAgIEZYX0JPT0wgcGFnZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcGFzc3dvcmQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHByaW50KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCByYWRpb3NJblVuaXNvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcmVhZG9ubHkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJlY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgICBGWF9CT09MIHJlcXVpcmVkKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCByaWNoVGV4dChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcmljaFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCByb3RhdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc3Ryb2tlQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHN0eWxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzdWJtaXROYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB0ZXh0Q29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHRleHRGb250KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB0ZXh0U2l6ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgdHlwZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgdXNlck5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB2YWx1ZUFzU3RyaW5nKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzb3VyY2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgICBib29sIGFsaWdubWVudChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICAgIGJvb2wgYm9yZGVyU3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGJ1dHRvbkFsaWduWChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgYnV0dG9uQWxpZ25ZKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBidXR0b25GaXRCb3VuZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGJ1dHRvblBvc2l0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBidXR0b25TY2FsZUhvdyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICAgIGJvb2wgYnV0dG9uU2NhbGVXaGVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBjYWxjT3JkZXJJbmRleChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgY2hhckxpbWl0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBjb21iKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBjb21taXRPblNlbENoYW5nZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgY3VycmVudFZhbHVlSW5kaWNlcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICAgIGJvb2wgZGVmYXVsdFN0eWxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBkZWZhdWx0VmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGRvTm90U2Nyb2xsKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBkb05vdFNwZWxsQ2hlY2soSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGRlbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBkaXNwbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgICAgYm9vbCBkb2MoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGVkaXRhYmxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBleHBvcnRWYWx1ZXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGZpbGVTZWxlY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGZpbGxDb2xvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgaGlkZGVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgICAgYm9vbCBoaWdobGlnaHQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGxpbmVXaWR0aChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgbXVsdGlsaW5lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBtdWx0aXBsZVNlbGVjdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgbmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgbnVtSXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgICBib29sIHBhZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHBhc3N3b3JkKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBwcmludChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgcmFkaW9zSW5Vbmlzb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHJlYWRvbmx5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCByZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgICAgYm9vbCByZXF1aXJlZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgcmljaFRleHQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHJpY2hWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgcm90YXRpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHN0cm9rZUNvbG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBzdHlsZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgc3VibWl0TmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgdGV4dENvbG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCB0ZXh0Rm9udChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgdGV4dFNpemUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHVzZXJOYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCB2YWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgdmFsdWVBc1N0cmluZyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgc291cmNlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKLQlGWF9CT09MIGJyb3dzZUZvckZpbGVUb1N1Ym1pdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGJ1dHRvbkdldENhcHRpb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBidXR0b25HZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgYnV0dG9uSW1wb3J0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGJ1dHRvblNldENhcHRpb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBidXR0b25TZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgY2hlY2tUaGlzQm94KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgY2xlYXJJdGVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGRlZmF1bHRJc0NoZWNrZWQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBkZWxldGVJdGVtQXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBnZXRBcnJheShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGdldEl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGdldExvY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBpbnNlcnRJdGVtQXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBpc0JveENoZWNrZWQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBpc0RlZmF1bHRDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2V0QWN0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2V0Rm9jdXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzZXRJdGVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNldExvY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2lnbmF0dXJlR2V0U2VlZFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2lnbmF0dXJlSW5mbyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNpZ25hdHVyZVNldFNlZWRWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNpZ25hdHVyZVNpZ24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzaWduYXR1cmVWYWxpZGF0ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGJyb3dzZUZvckZpbGVUb1N1Ym1pdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGJ1dHRvbkdldENhcHRpb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBidXR0b25HZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgYnV0dG9uSW1wb3J0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGJ1dHRvblNldENhcHRpb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBidXR0b25TZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgY2hlY2tUaGlzQm94KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgY2xlYXJJdGVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGRlZmF1bHRJc0NoZWNrZWQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBkZWxldGVJdGVtQXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBnZXRBcnJheShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGdldEl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGdldExvY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBpbnNlcnRJdGVtQXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBpc0JveENoZWNrZWQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBpc0RlZmF1bHRDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgc2V0QWN0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgc2V0Rm9jdXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBzZXRJdGVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHNldExvY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgc2lnbmF0dXJlR2V0U2VlZFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgc2lnbmF0dXJlSW5mbyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHNpZ25hdHVyZVNldFNlZWRWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHNpZ25hdHVyZVNpZ24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBzaWduYXR1cmVWYWxpZGF0ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKIAogcHVibGljOgogCXN0YXRpYyB2b2lkIFNldEFsaWdubWVudChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpOwpAQCAtMjI1LDkgKzIyNSw5IEBACiAJCQkJCQkJCQkJCWNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSwgY29uc3QgQ1BERl9SZWN0JiByY0Nvb3Jkcyk7CiBwdWJsaWM6CiAJc3RhdGljIHZvaWQJCQkJCQkJVXBkYXRlRm9ybUZpZWxkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCi0JCQkJCQkJCQkJCUZYX0JPT0wgYkNoYW5nZU1hcmssIEZYX0JPT0wgYlJlc2V0QVAsIEZYX0JPT0wgYlJlZnJlc2gpOworCQkJCQkJCQkJCQlib29sIGJDaGFuZ2VNYXJrLCBib29sIGJSZXNldEFQLCBib29sIGJSZWZyZXNoKTsKIAlzdGF0aWMgdm9pZAkJCQkJCQlVcGRhdGVGb3JtQ29udHJvbChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCwKLQkJCQkJCQkJCQkJRlhfQk9PTCBiQ2hhbmdlTWFyaywgRlhfQk9PTCBiUmVzZXRBUCwgRlhfQk9PTCBiUmVmcmVzaCk7CisJCQkJCQkJCQkJCWJvb2wgYkNoYW5nZU1hcmssIGJvb2wgYlJlc2V0QVAsIGJvb2wgYlJlZnJlc2gpOwogCiAJc3RhdGljIENQREZTREtfV2lkZ2V0KgkJCQkJR2V0V2lkZ2V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sKTsKIAlzdGF0aWMgdm9pZAkJCQkJCQlHZXRGb3JtRmllbGRzKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lLCBDRlhfUHRyQXJyYXkmIEZpZWxkc0FycmF5KTsKQEAgLTIzNSwxNCArMjM1LDE0IEBACiAJc3RhdGljIHZvaWQJCQkJCQkJRG9EZWxheShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENKU19EZWxheURhdGEqIHBEYXRhKTsKIAogcHVibGljOgotCUZYX0JPT0wJCQkJCQkJCUF0dGFjaEZpZWxkKERvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSk7Ci0Jdm9pZAkJCQkJCQkJU2V0RGVsYXkoRlhfQk9PTCBiRGVsYXkpOworCWJvb2wJCQkJCQkJCUF0dGFjaEZpZWxkKERvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSk7CisJdm9pZAkJCQkJCQkJU2V0RGVsYXkoYm9vbCBiRGVsYXkpOwogCXZvaWQJCQkJCQkJCVNldElzb2xhdGUodjg6Oklzb2xhdGUqIGlzb2xhdGUpIHttX2lzb2xhdGUgPSBpc29sYXRlO30KIHByb3RlY3RlZDoKIAl2b2lkCQkJCQkJCQlQYXJzZUZpZWxkTmFtZShjb25zdCBzdGQ6OndzdHJpbmcgJnN0ckZpZWxkTmFtZVBhcnNlZCxzdGQ6OndzdHJpbmcgJnN0ckZpZWxkTmFtZSxpbnQgJiBpQ29udHJvbE5vKTsKIAl2b2lkCQkJCQkJCQlHZXRGb3JtRmllbGRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSwgQ0ZYX1B0ckFycmF5JiBGaWVsZHNBcnJheSk7CiAJQ1BERl9Gb3JtQ29udHJvbCogCQkJCQlHZXRTbWFydEZpZWxkQ29udHJvbChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCk7Ci0JRlhfQk9PTAkJCQkJCQkJVmFsdWVJc09jY3VyKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyBjc09wdExhYmVsKTsKKwlib29sCQkJCQkJCQlWYWx1ZUlzT2NjdXIoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwpOwogCiAJdm9pZAkJCQkJCQkJQWRkRGVsYXlfSW50KGVudW0gRklFTERfUFJPUCBwcm9wLCBpbnQzMl90IG4pOwogCXZvaWQJCQkJCQkJCUFkZERlbGF5X0Jvb2woZW51bSBGSUVMRF9QUk9QIHByb3AsYm9vbCBiKTsKQEAgLTI1OSw5ICsyNTksOSBAQAogCUNQREZTREtfRG9jdW1lbnQqCQkJCQltX3BEb2N1bWVudDsKIAlDRlhfV2lkZVN0cmluZwkJCQkJCW1fRmllbGROYW1lOwogCWludAkJCQkJCQkJCW1fbkZvcm1Db250cm9sSW5kZXg7Ci0JRlhfQk9PTAkJCQkJCQkJbV9iQ2FuU2V0OworCWJvb2wJCQkJCQkJCW1fYkNhblNldDsKIAotCUZYX0JPT0wJCQkJCQkJCW1fYkRlbGF5OworCWJvb2wJCQkJCQkJCW1fYkRlbGF5OwogCXY4OjpJc29sYXRlKgkJCQkJCQltX2lzb2xhdGU7CiB9OwogCkBAIC0yNzEsNyArMjcxLDcgQEAKIAlDSlNfRmllbGQoSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307CiAJdmlydHVhbCB+Q0pTX0ZpZWxkKHZvaWQpe307CiAKLQl2aXJ0dWFsIEZYX0JPT0wJSW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKTsKKwl2aXJ0dWFsIGJvb2wJSW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKTsKIAogCURFQ0xBUkVfSlNfQ0xBU1MoQ0pTX0ZpZWxkKTsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgKaW5kZXggNzgzYjI0OS4uMzdlMTJkYyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oCkBAIC0xOSw4ICsxOSw4IEBACiB7CiBwdWJsaWM6CiAgICAgICAgIHZpcnR1YWwgfklGWEpTX0NvbnRleHQoKSB7IH0KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ29tcGlsZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgaW5mbykgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlSdW5TY3JpcHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJQ29tcGlsZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgaW5mbykgPSAwOworCXZpcnR1YWwgYm9vbAkJCQlSdW5TY3JpcHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pID0gMDsKIAogCXZpcnR1YWwgdm9pZAkJCQlPbkFwcF9Jbml0KCkgPSAwOwogCkBAIC0zNiwzMiArMzYsMzIgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJT25QYWdlX0luVmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KSA9IDA7CiAJdmlydHVhbCB2b2lkCQkJCU9uUGFnZV9PdXRWaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Gb2N1cyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlRG93bihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VFbnRlcihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VFeGl0KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Nb3VzZVVwKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Gb2N1cyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9CbHVyKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkgPSAwOwogCi0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MJiBiUmMpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX0NhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcFNvdXJjZSwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCYgYlJjKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIGJvb2wgYldpbGxDb21taXQpID0gMDsKIAl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9LZXlzdHJva2UoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotCQkJCQkJCQkJRlhfQk9PTCBLZXlEb3duLCBGWF9CT09MIGJNb2RpZmllciwgaW50ICZuU2VsRW5kLGludCAmblNlbFN0YXJ0LCBGWF9CT09MIGJTaGlmdCwKLQkJCQkJCQkJCUNQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wgYldpbGxDb21taXQsCi0JCQkJCQkJCQlGWF9CT09MIGJGaWVsZEZ1bGwsIEZYX0JPT0wgJmJSYykgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX1ZhbGlkYXRlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgRlhfQk9PTCBiS2V5RG93biwKLQkJCQkJCQkJCUZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCYgYlJjKSA9IDA7CisJCQkJCQkJCQlib29sIEtleURvd24sIGJvb2wgYk1vZGlmaWVyLCBpbnQgJm5TZWxFbmQsaW50ICZuU2VsU3RhcnQsIGJvb2wgYlNoaWZ0LAorCQkJCQkJCQkJQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCBiV2lsbENvbW1pdCwKKwkJCQkJCQkJCWJvb2wgYkZpZWxkRnVsbCwgYm9vbCAmYlJjKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfVmFsaWRhdGUoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBib29sIGJLZXlEb3duLAorCQkJCQkJCQkJYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBib29sJiBiUmMpID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Gb2N1cyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fT3BlbihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fQ2xvc2UoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9JblZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX091dFZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0ZvY3VzKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9CbHVyKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9PcGVuKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9DbG9zZShib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VEb3duKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZVVwKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZUVudGVyKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZUV4aXQoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0luVmlldyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fT3V0Vmlldyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKIAogCXZpcnR1YWwgdm9pZAkJCQlPbkJvb2ttYXJrX01vdXNlVXAoQ1BERl9Cb29rbWFyayogcEJvb2tNYXJrKSA9IDA7CiAJdmlydHVhbCB2b2lkCQkJCU9uTGlua19Nb3VzZVVwKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpID0gMDsKQEAgLTcxLDcgKzcxLDcgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJT25Db25zb2xlX0V4ZWMoKSA9IDA7CiAJdmlydHVhbCB2b2lkCQkJCU9uRXh0ZXJuYWxfRXhlYygpID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQlFbmFibGVNZXNzYWdlQm94KEZYX0JPT0wgYkVuYWJsZSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlFbmFibGVNZXNzYWdlQm94KGJvb2wgYkVuYWJsZSkgPSAwOwogfTsKIAogY2xhc3MgSUZYSlNfUnVudGltZQpAQCAtOTQsNyArOTQsNyBAQAogY2xhc3MgQ0pTX1J1bnRpbWVGYWN0b3J5CiB7CiBwdWJsaWM6Ci0JQ0pTX1J1bnRpbWVGYWN0b3J5KCk6bV9iSW5pdChGQUxTRSksbV9uUmVmKDApLG1fcEdsb2JhbERhdGEoTlVMTCksbV9uR2xvYmFsRGF0YUNvdW50KDApIHt9CisJQ0pTX1J1bnRpbWVGYWN0b3J5KCk6bV9iSW5pdChmYWxzZSksbV9uUmVmKDApLG1fcEdsb2JhbERhdGEoTlVMTCksbV9uR2xvYmFsRGF0YUNvdW50KDApIHt9CiAJfkNKU19SdW50aW1lRmFjdG9yeSgpOwogCUlGWEpTX1J1bnRpbWUqCQkJCQlOZXdKU1J1bnRpbWUoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCk7CiAJdm9pZAkJCQkJCQlEZWxldGVKU1J1bnRpbWUoSUZYSlNfUnVudGltZSogcFJ1bnRpbWUpOwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJQ0pTX0dsb2JhbERhdGEqCQkJCQlOZXdHbG9iYWxEYXRhKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApOwogCXZvaWQJCQkJCQkJUmVsZWFzZUdsb2JhbERhdGEoKTsKIHByaXZhdGU6Ci0JRlhfQk9PTCBtX2JJbml0OworCWJvb2wgbV9iSW5pdDsKIAlpbnQgbV9uUmVmOwogCUNKU19HbG9iYWxEYXRhKgkJCQkJbV9wR2xvYmFsRGF0YTsKIAlpbnQzMl90CQkJCQkJbV9uR2xvYmFsRGF0YUNvdW50OwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSWNvbi5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSWNvbi5oCmluZGV4IDAyOTgwMDUuLjM2N2RiN2IgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0ljb24uaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JY29uLmgKQEAgLTE0LDcgKzE0LDcgQEAKIHB1YmxpYzoKIAlJY29uKENKU19PYmplY3QqIHBKU09iamVjdCk7CiAJdmlydHVhbCB+SWNvbigpOwotCUZYX0JPT0wgbmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgbmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogCXZvaWQJCQkJU2V0U3RyZWFtKENQREZfU3RyZWFtKiBwSWNvblN0cmVhbSk7CiAJQ1BERl9TdHJlYW0qCQlHZXRTdHJlYW0oKTsKIAl2b2lkCQkJCVNldEljb25OYW1lKENGWF9XaWRlU3RyaW5nIG5hbWUpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oCmluZGV4IDJlMmNmMzcuLjc5ZDAxYTAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19Db250ZXh0LmgKQEAgLTIxLDggKzIxLDggQEAKIAl2aXJ0dWFsIH5DSlNfQ29udGV4dCgpOwogCiBwdWJsaWM6Ci0JdmlydHVhbCBGWF9CT09MCQkJCUNvbXBpbGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlSdW5TY3JpcHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pOworCXZpcnR1YWwgYm9vbAkJCQlDb21waWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKTsKKwl2aXJ0dWFsIGJvb2wJCQkJUnVuU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKTsKIAogcHVibGljOgogCXZpcnR1YWwgdm9pZAkJCQlPbkFwcF9Jbml0KCk7CkBAIC0zOSwzMiArMzksMzIgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJT25QYWdlX0luVmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKIAl2aXJ0dWFsIHZvaWQJCQkJT25QYWdlX091dFZpZXcoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Gb2N1cyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VFbnRlcihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Nb3VzZUV4aXQoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VVcChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Gb2N1cyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpOworCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX0JsdXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKTsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX0NhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcFNvdXJjZSwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCYgYlJjKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCk7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBib29sJiBiUmMpOworCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX0Zvcm1hdChDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBib29sIGJXaWxsQ29tbWl0KTsKIAl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9LZXlzdHJva2UoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotCQkJCQkJCQkJRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsIGludCAmblNlbEVuZCxpbnQgJm5TZWxTdGFydCwgRlhfQk9PTCBiU2hpZnQsCi0JCQkJCQkJCQlDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MIGJXaWxsQ29tbWl0LAotCQkJCQkJCQkJRlhfQk9PTCBiRmllbGRGdWxsLCBGWF9CT09MICZiUmMpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX1ZhbGlkYXRlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgRlhfQk9PTCBiS2V5RG93biwKLQkJCQkJCQkJCUZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCYgYlJjKTsKKwkJCQkJCQkJCWJvb2wgYktleURvd24sIGJvb2wgYk1vZGlmaWVyLCBpbnQgJm5TZWxFbmQsaW50ICZuU2VsU3RhcnQsIGJvb2wgYlNoaWZ0LAorCQkJCQkJCQkJQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCBiV2lsbENvbW1pdCwKKwkJCQkJCQkJCWJvb2wgYkZpZWxkRnVsbCwgYm9vbCAmYlJjKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIGJvb2wgYktleURvd24sCisJCQkJCQkJCQlib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIGJvb2wmIGJSYyk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9PcGVuKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0Nsb3NlKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0luVmlldyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9PdXRWaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0ZvY3VzKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0JsdXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fT3Blbihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9DbG9zZShib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VVcChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZUVudGVyKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRXhpdChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9JblZpZXcoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fT3V0Vmlldyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwogCiAJdmlydHVhbCB2b2lkCQkJCU9uQm9va21hcmtfTW91c2VVcChDUERGX0Jvb2ttYXJrKiBwQm9va01hcmspOwogCXZpcnR1YWwgdm9pZAkJCQlPbkxpbmtfTW91c2VVcChDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKQEAgLTc0LDE0ICs3NCwxNCBAQAogCXZpcnR1YWwgdm9pZAkJCQlPbkNvbnNvbGVfRXhlYygpOwogCXZpcnR1YWwgdm9pZAkJCQlPbkV4dGVybmFsX0V4ZWMoKTsKIAotCXZpcnR1YWwgdm9pZAkJCQlFbmFibGVNZXNzYWdlQm94KEZYX0JPT0wgYkVuYWJsZSkge21fYk1zZ0JveEVuYWJsZSA9IGJFbmFibGU7fQotCUZYX0JPT0wJCQkJCQlJc01zZ0JveEVuYWJsZWQoKSBjb25zdCB7cmV0dXJuIG1fYk1zZ0JveEVuYWJsZTt9CisJdmlydHVhbCB2b2lkCQkJCUVuYWJsZU1lc3NhZ2VCb3goYm9vbCBiRW5hYmxlKSB7bV9iTXNnQm94RW5hYmxlID0gYkVuYWJsZTt9CisJYm9vbAkJCQkJCUlzTXNnQm94RW5hYmxlZCgpIGNvbnN0IHtyZXR1cm4gbV9iTXNnQm94RW5hYmxlO30KIAogcHVibGljOgogCUNQREZEb2NfRW52aXJvbm1lbnQqCQkJR2V0UmVhZGVyQXBwKCk7CiAJQ0pTX1J1bnRpbWUqCQkJCUdldEpTUnVudGltZSgpe3JldHVybiBtX3BSdW50aW1lO30KIAotCUZYX0JPT0wJCQkJCQlEb0pvYihpbnQgbk1vZGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKTsKKwlib29sCQkJCQkJRG9Kb2IoaW50IG5Nb2RlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgaW5mbyk7CiAKIAlDSlNfRXZlbnRIYW5kbGVyKgkJCUdldEV2ZW50SGFuZGxlcigpe3JldHVybiBtX3BFdmVudEhhbmRsZXI7fTsKIAlDUERGU0RLX0RvY3VtZW50KgkJCUdldFJlYWRlckRvY3VtZW50KCk7CkBAIC05MCw4ICs5MCw4IEBACiAJQ0pTX1J1bnRpbWUqCQkJCW1fcFJ1bnRpbWU7CiAJQ0pTX0V2ZW50SGFuZGxlcioJCQltX3BFdmVudEhhbmRsZXI7CiAKLQlGWF9CT09MCQkJCQkJbV9iQnVzeTsKLQlGWF9CT09MCQkJCQkJbV9iTXNnQm94RW5hYmxlOworCWJvb2wJCQkJCQltX2JCdXN5OworCWJvb2wJCQkJCQltX2JNc2dCb3hFbmFibGU7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0pTX0NPTlRFWFRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgKaW5kZXggZjFiMzZiZi4uMDg3ZjQ4OSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgKQEAgLTUxLDcgKzUxLDcgQEAKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQUk9QIENBTExCQUNLID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLXRlbXBsYXRlIDxjbGFzcyBDLCBGWF9CT09MIChDOjoqTSkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKT4KK3RlbXBsYXRlIDxjbGFzcyBDLCBib29sIChDOjoqTSkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKT4KIHZvaWQgSlNQcm9wR2V0dGVyKGNvbnN0IGNoYXIqIHByb3BfbmFtZV9zdHJpbmcsCiAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjbGFzc19uYW1lX3N0cmluZywKICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwKQEAgLTc0LDcgKzc0LDcgQEAKICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCgodjg6OkxvY2FsPHY4OjpWYWx1ZT4pdmFsdWUpOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgQywgRlhfQk9PTCAoQzo6Kk0pKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik+Cit0ZW1wbGF0ZSA8Y2xhc3MgQywgYm9vbCAoQzo6Kk0pKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik+CiB2b2lkIEpTUHJvcFNldHRlcihjb25zdCBjaGFyKiBwcm9wX25hbWVfc3RyaW5nLAogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xhc3NfbmFtZV9zdHJpbmcsCiAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksCkBAIC0xMTMsNyArMTEzLDcgQEAKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTUVUSE9EIENBTExCQUNLID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotdGVtcGxhdGUgPGNsYXNzIEMsIEZYX0JPT0wgKEM6OipNKShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKT4KK3RlbXBsYXRlIDxjbGFzcyBDLCBib29sIChDOjoqTSkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik+CiB2b2lkIEpTTWV0aG9kKGNvbnN0IGNoYXIqIG1ldGhvZF9uYW1lX3N0cmluZywKICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xhc3NfbmFtZV9zdHJpbmcsCiAgICAgICAgICAgICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7CkBAIC0yNDAsNyArMjQwLDcgQEAKICAgQ0ZYX1dpZGVTdHJpbmcgcHJvcG5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoKnV0ZjhfdmFsdWUsIHV0ZjhfdmFsdWUubGVuZ3RoKCkpOwogICBDSlNfT2JqZWN0KiBwSlNPYmogPSByZWludGVycHJldF9jYXN0PENKU19PYmplY3QqPihKU19HZXRQcml2YXRlKGlzb2xhdGUsIGluZm8uSG9sZGVyKCkpKTsKICAgQWx0KiBwT2JqID0gcmVpbnRlcnByZXRfY2FzdDxBbHQqPihwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpOwotICBGWF9CT09MIGJSZXQgPSBwT2JqLT5RdWVyeVByb3BlcnR5KHByb3BuYW1lLmNfc3RyKCkpOworICBib29sIGJSZXQgPSBwT2JqLT5RdWVyeVByb3BlcnR5KHByb3BuYW1lLmNfc3RyKCkpOwogICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGJSZXQgPyA0IDogMCk7CiB9CiAKQEAgLTM4Miw3ICszODIsNyBAQAogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEdMT0JBTCBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLXRlbXBsYXRlIDxGWF9CT09MICgqRikoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik+Cit0ZW1wbGF0ZSA8Ym9vbCAoKkYpKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpPgogdm9pZCBKU0dsb2JhbEZ1bmMoY29uc3QgY2hhciAqZnVuY19uYW1lX3N0cmluZywKICAgICAgICAgICAgICAgICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7CiAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oCmluZGV4IDYyYWZiODIuLjk5Nzc0NjIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oCkBAIC03OSwzMiArNzksMzIgQEAKIAl2b2lkCQkJCQlPblBhZ2VfSW5WaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpOwogCXZvaWQJCQkJCU9uUGFnZV9PdXRWaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpOwogCi0Jdm9pZAkJCQkJT25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYyk7Ci0Jdm9pZAkJCQkJT25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCk7CisJdm9pZAkJCQkJT25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIGJvb2wmIGJSYyk7CisJdm9pZAkJCQkJT25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCBiV2lsbENvbW1pdCk7CiAJdm9pZAkJCQkJT25GaWVsZF9LZXlzdHJva2UoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotCQkJCQkJCQlGWF9CT09MIEtleURvd24sIEZYX0JPT0wgYk1vZGlmaWVyLCBpbnQgJm5TZWxFbmQsaW50ICZuU2VsU3RhcnQsIEZYX0JPT0wgYlNoaWZ0LAotCQkJCQkJCQlDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MIGJXaWxsQ29tbWl0LAotCQkJCQkJCQlGWF9CT09MIGJGaWVsZEZ1bGwsIEZYX0JPT0wgJmJSYyk7Ci0Jdm9pZAkJCQkJT25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIEZYX0JPT0wgYktleURvd24sCi0JCQkJCQkJCUZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCYgYlJjKTsKKwkJCQkJCQkJYm9vbCBLZXlEb3duLCBib29sIGJNb2RpZmllciwgaW50ICZuU2VsRW5kLGludCAmblNlbFN0YXJ0LCBib29sIGJTaGlmdCwKKwkJCQkJCQkJQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCBiV2lsbENvbW1pdCwKKwkJCQkJCQkJYm9vbCBiRmllbGRGdWxsLCBib29sICZiUmMpOworCXZvaWQJCQkJCU9uRmllbGRfVmFsaWRhdGUoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBib29sIGJLZXlEb3duLAorCQkJCQkJCQlib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIGJvb2wmIGJSYyk7CiAKLQl2b2lkCQkJCQlPbkZpZWxkX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKLQl2b2lkCQkJCQlPbkZpZWxkX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7Ci0Jdm9pZAkJCQkJT25GaWVsZF9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7Ci0Jdm9pZAkJCQkJT25GaWVsZF9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpOwotCXZvaWQJCQkJCU9uRmllbGRfQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpOwotCXZvaWQJCQkJCU9uRmllbGRfRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKTsKKwl2b2lkCQkJCQlPbkZpZWxkX01vdXNlRG93bihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKKwl2b2lkCQkJCQlPbkZpZWxkX01vdXNlRW50ZXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7CisJdm9pZAkJCQkJT25GaWVsZF9Nb3VzZUV4aXQoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7CisJdm9pZAkJCQkJT25GaWVsZF9Nb3VzZVVwKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpOworCXZvaWQJCQkJCU9uRmllbGRfQmx1cihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpOworCXZvaWQJCQkJCU9uRmllbGRfRm9jdXMoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKTsKIAotCXZvaWQJCQkJCU9uU2NyZWVuX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0Jdm9pZAkJCQkJT25TY3JlZW5fQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZvaWQJCQkJCU9uU2NyZWVuX09wZW4oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2b2lkCQkJCQlPblNjcmVlbl9DbG9zZShGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZvaWQJCQkJCU9uU2NyZWVuX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZvaWQJCQkJCU9uU2NyZWVuX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2b2lkCQkJCQlPblNjcmVlbl9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0Jdm9pZAkJCQkJT25TY3JlZW5fTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0Jdm9pZAkJCQkJT25TY3JlZW5fSW5WaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0Jdm9pZAkJCQkJT25TY3JlZW5fT3V0VmlldyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZvaWQJCQkJCU9uU2NyZWVuX0ZvY3VzKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdm9pZAkJCQkJT25TY3JlZW5fQmx1cihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZvaWQJCQkJCU9uU2NyZWVuX09wZW4oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKwl2b2lkCQkJCQlPblNjcmVlbl9DbG9zZShib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZvaWQJCQkJCU9uU2NyZWVuX01vdXNlRG93bihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZvaWQJCQkJCU9uU2NyZWVuX01vdXNlVXAoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKwl2b2lkCQkJCQlPblNjcmVlbl9Nb3VzZUVudGVyKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdm9pZAkJCQkJT25TY3JlZW5fTW91c2VFeGl0KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdm9pZAkJCQkJT25TY3JlZW5fSW5WaWV3KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdm9pZAkJCQkJT25TY3JlZW5fT3V0Vmlldyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwogCiAJdm9pZAkJCQkJT25Cb29rbWFya19Nb3VzZVVwKENQREZfQm9va21hcmsqIHBCb29rTWFyayk7CiAJdm9pZAkJCQkJT25MaW5rX01vdXNlVXAoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCk7CkBAIC0xMTcsMjUgKzExNywyNSBAQAogcHVibGljOgogICAgIHZvaWQJCQkJCUluaXRpYWwoSlNfRVZFTlRfVCB0eXBlKTsKIAl2b2lkCQkJCQlEZXN0cm95KCk7Ci0JRlhfQk9PTAkJCQkJSXNWYWxpZCgpOworCWJvb2wJCQkJCUlzVmFsaWQoKTsKIAogCiAJQ0ZYX1dpZGVTdHJpbmcmCQkJQ2hhbmdlKCk7CiAJQ0ZYX1dpZGVTdHJpbmcJCQlDaGFuZ2VFeCgpOwogCWludAkJCQkJCUNvbW1pdEtleSgpOwotCUZYX0JPT0wJCQkJCUZpZWxkRnVsbCgpOwotCUZYX0JPT0wJCQkJCUtleURvd24oKTsKLQlGWF9CT09MCQkJCQlNb2RpZmllcigpOworCWJvb2wJCQkJCUZpZWxkRnVsbCgpOworCWJvb2wJCQkJCUtleURvd24oKTsKKwlib29sCQkJCQlNb2RpZmllcigpOwogCWNvbnN0IEZYX1dDSEFSKgkJCQlOYW1lKCk7CiAJY29uc3QgRlhfV0NIQVIqCQkJCVR5cGUoKTsKLQlGWF9CT09MJgkJCQlSYygpOworCWJvb2wmCQkJCVJjKCk7CiAJaW50JgkJCQkJU2VsRW5kKCk7CiAJaW50JgkJCQkJU2VsU3RhcnQoKTsKLQlGWF9CT09MCQkJCQlTaGlmdCgpOworCWJvb2wJCQkJCVNoaWZ0KCk7CiAJRmllbGQqCQkJCQlTb3VyY2UoKTsKIAlGaWVsZCoJCQkJCVRhcmdldF9GaWVsZCgpOwogCUNGWF9XaWRlU3RyaW5nJgkJCVZhbHVlKCk7Ci0JRlhfQk9PTAkJCQkJV2lsbENvbW1pdCgpOworCWJvb2wJCQkJCVdpbGxDb21taXQoKTsKIAlDRlhfV2lkZVN0cmluZwkJCVRhcmdldE5hbWUoKTsKIAogCUpTX0VWRU5UX1QJCQkJRXZlbnRUeXBlKCkge3JldHVybiBtX2VFdmVudFR5cGU7fTsKQEAgLTE0Myw3ICsxNDMsNyBAQAogcHVibGljOgogCUNKU19Db250ZXh0KgkJCW1fcEpTQ29udGV4dDsKIAlKU19FVkVOVF9UCQkJCW1fZUV2ZW50VHlwZTsKLQlGWF9CT09MCQkJCQltX2JWYWxpZDsKKwlib29sCQkJCQltX2JWYWxpZDsKIAogCUNGWF9XaWRlU3RyaW5nCQkJbV9zdHJUYXJnZXROYW1lOwogCUNGWF9XaWRlU3RyaW5nCQkJbV9zdHJTb3VyY2VOYW1lOwpAQCAtMTUxLDE4ICsxNTEsMTggQEAKIAlDRlhfV2lkZVN0cmluZwkJCW1fV2lkZVN0ckNoYW5nZUR1OwogCUNGWF9XaWRlU3RyaW5nCQkJbV9XaWRlU3RyQ2hhbmdlRXg7CiAJaW50CQkJCQkJbV9uQ29tbWl0S2V5OwotCUZYX0JPT0wJCQkJCW1fYktleURvd247Ci0JRlhfQk9PTAkJCQkJbV9iTW9kaWZpZXI7Ci0JRlhfQk9PTAkJCQkJbV9iU2hpZnQ7CisJYm9vbAkJCQkJbV9iS2V5RG93bjsKKwlib29sCQkJCQltX2JNb2RpZmllcjsKKwlib29sCQkJCQltX2JTaGlmdDsKIAlpbnQqCQkJCQltX3BJU2VsRW5kOwogCWludAkJCQkJCW1fblNlbEVuZER1OwogCWludCoJCQkJCW1fcElTZWxTdGFydDsKIAlpbnQJCQkJCQltX25TZWxTdGFydER1OwotCUZYX0JPT0wJCQkJCW1fYldpbGxDb21taXQ7CisJYm9vbAkJCQkJbV9iV2lsbENvbW1pdDsKIAlDRlhfV2lkZVN0cmluZyoJCQltX3BWYWx1ZTsKLQlGWF9CT09MCQkJCQltX2JGaWVsZEZ1bGw7Ci0JRlhfQk9PTCoJCQkJbV9wYlJjOwotCUZYX0JPT0wJCQkJCW1fYlJjRHU7CisJYm9vbAkJCQkJbV9iRmllbGRGdWxsOworCWJvb2wqCQkJCW1fcGJSYzsKKwlib29sCQkJCQltX2JSY0R1OwogCiAJQ1BERlNES19Eb2N1bWVudCoJCW1fcFNvdXJjZURvYzsKIAlDUERGX0Jvb2ttYXJrKgkJCW1fcFRhcmdldEJvb2tNYXJrOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5oCmluZGV4IGIzNjM3YjkuLjk4N2RlOTUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmgKQEAgLTU2LDcgKzU2LDcgQEAKIAl2aXJ0dWFsIH5DSlNfR2xvYmFsRGF0YV9FbGVtZW50KCl7fQogCiAJQ0pTX0tleVZhbHVlCQkJZGF0YTsKLQlGWF9CT09MCQkJCQliUGVyc2lzdGVudDsKKwlib29sCQkJCQliUGVyc2lzdGVudDsKIH07CiAKIGNsYXNzIENKU19HbG9iYWxEYXRhCkBAIC03Miw4ICs3Miw4IEBACiAJdm9pZAkJCQkJCQkJU2V0R2xvYmFsVmFyaWFibGVPYmplY3QoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsIGNvbnN0IENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSk7CiAJdm9pZAkJCQkJCQkJU2V0R2xvYmFsVmFyaWFibGVOdWxsKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lKTsKIAotCUZYX0JPT0wJCQkJCQkJCVNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwgRlhfQk9PTCBiUGVyc2lzdGVudCk7Ci0JRlhfQk9PTAkJCQkJCQkJRGVsZXRlR2xvYmFsVmFyaWFibGUoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUpOworCWJvb2wJCQkJCQkJCVNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwgYm9vbCBiUGVyc2lzdGVudCk7CisJYm9vbAkJCQkJCQkJRGVsZXRlR2xvYmFsVmFyaWFibGUoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUpOwogCiAJaW50MzJfdAkJCQkJCQlHZXRTaXplKCkgY29uc3Q7CiAJQ0pTX0dsb2JhbERhdGFfRWxlbWVudCoJCQkJR2V0QXQoaW50IGluZGV4KSBjb25zdDsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX09iamVjdC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgKaW5kZXggMzg5OGQxOC4uZjhlYzkwZSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgKQEAgLTQ4LDExICs0OCwxMSBAQAogCXZvaWQJCQkJCQlNYWtlV2VhaygpOwogICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwb3NlKCk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNUeXBlKGNvbnN0IEZYX0NIQVIqIHNDbGFzc05hbWUpe3JldHVybiBUUlVFO307CisJdmlydHVhbCBib29sCQkJCUlzVHlwZShjb25zdCBGWF9DSEFSKiBzQ2xhc3NOYW1lKXtyZXR1cm4gdHJ1ZTt9OwogCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldENsYXNzTmFtZSgpe3JldHVybiAiIjt9OwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYyl7cmV0dXJuIFRSVUU7fTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJRXhpdEluc3RhbmNlKCl7cmV0dXJuIFRSVUU7fTsKKwl2aXJ0dWFsIGJvb2wJCQkJSW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKXtyZXR1cm4gdHJ1ZTt9OworCXZpcnR1YWwgYm9vbAkJCQlFeGl0SW5zdGFuY2UoKXtyZXR1cm4gdHJ1ZTt9OwogCiAJb3BlcmF0b3IJCQkJCUpTRlhPYmplY3QgKCkge3JldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD46Ok5ldyhtX3BJc29sYXRlLCBtX3BPYmplY3QpO30KIAlvcGVyYXRvcgkJCQkJQ0pTX0VtYmVkT2JqKiAoKXtyZXR1cm4gbV9wRW1iZWRPYmo7fTsKQEAgLTE3Miw3ICsxNzIsNyBAQAogCUNKU19UaW1lcihDSlNfRW1iZWRPYmogKiBwT2JqLENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApOgogCQltX25UaW1lcklEKDApLAogCQltX3BFbWJlZE9iaihwT2JqKSwKLQkJbV9iUHJvY2Vzc2luZyhGQUxTRSksCisJCW1fYlByb2Nlc3NpbmcoZmFsc2UpLAogCQltX2R3U3RhcnRUaW1lKDApLAogCQltX2R3VGltZU91dCgwKSwKIAkJbV9kd0VsYXBzZSgwKSwKQEAgLTI2NSw5ICsyNjUsOSBAQAogCQl7CiAJCQlpZiAoIXBUaW1lci0+bV9iUHJvY2Vzc2luZykKIAkJCXsKLQkJCQlwVGltZXItPm1fYlByb2Nlc3NpbmcgPSBUUlVFOworCQkJCXBUaW1lci0+bV9iUHJvY2Vzc2luZyA9IHRydWU7CiAJCQkJaWYgKHBUaW1lci0+bV9wRW1iZWRPYmopIHBUaW1lci0+bV9wRW1iZWRPYmotPlRpbWVyUHJvYyhwVGltZXIpOwotCQkJCXBUaW1lci0+bV9iUHJvY2Vzc2luZyA9IEZBTFNFOworCQkJCXBUaW1lci0+bV9iUHJvY2Vzc2luZyA9IGZhbHNlOwogCQkJfQogCQkJZWxzZQogCQkJewpAQCAtMjc5LDcgKzI3OSw3IEBACiBwcml2YXRlOgogCUZYX1VJTlQJCQkJCQkJbV9uVGltZXJJRDsKIAlDSlNfRW1iZWRPYmoqCQkJCQltX3BFbWJlZE9iajsKLQlGWF9CT09MCQkJCQkJCW1fYlByb2Nlc3Npbmc7CisJYm9vbAkJCQkJCQltX2JQcm9jZXNzaW5nOwogCiAJLy9kYXRhCiAJRlhfRFdPUkQJCQkJCQkJbV9kd1N0YXJ0VGltZTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuaAppbmRleCA4ZmRmYThiLi5iOWFkNmVmIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfUnVudGltZS5oCkBAIC00NCwxNSArNDQsMTUgQEAKIAogCUNQREZEb2NfRW52aXJvbm1lbnQgKgkJCQkJCQlHZXRSZWFkZXJBcHAoKXtyZXR1cm4gbV9wQXBwO30KIAotCUZYX0JPT0wJCQkJCQkJCQlJbml0SlNPYmplY3RzKCk7CisJYm9vbAkJCQkJCQkJCUluaXRKU09iamVjdHMoKTsKIAotCUZYX0JPT0wJCQkJCQkJCQlBZGRFdmVudFRvTG9vcChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RhcmdldE5hbWUsIEpTX0VWRU5UX1QgZUV2ZW50VHlwZSk7CisJYm9vbAkJCQkJCQkJCUFkZEV2ZW50VG9Mb29wKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGFyZ2V0TmFtZSwgSlNfRVZFTlRfVCBlRXZlbnRUeXBlKTsKIAl2b2lkCQkJCQkJCQkJUmVtb3ZlRXZlbnRJbkxvb3AoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUYXJnZXROYW1lLCBKU19FVkVOVF9UIGVFdmVudFR5cGUpOwogCXZvaWQJCQkJCQkJCQlSZW1vdmVFdmVudHNJbkxvb3AoQ0pTX0ZpZWxkRXZlbnQqIHBTdGFydCk7CiAKLQl2b2lkCQkJCQkJCQkJQmVnaW5CbG9jaygpe21fYkJsb2NraW5nID0gVFJVRTt9Ci0Jdm9pZAkJCQkJCQkJCUVuZEJsb2NrKCl7bV9iQmxvY2tpbmcgPSBGQUxTRTt9Ci0JRlhfQk9PTAkJCQkJCQkJCUlzQmxvY2tpbmcoKXtyZXR1cm4gbV9iQmxvY2tpbmc7fQorCXZvaWQJCQkJCQkJCQlCZWdpbkJsb2NrKCl7bV9iQmxvY2tpbmcgPSB0cnVlO30KKwl2b2lkCQkJCQkJCQkJRW5kQmxvY2soKXttX2JCbG9ja2luZyA9IGZhbHNlO30KKwlib29sCQkJCQkJCQkJSXNCbG9ja2luZygpe3JldHVybiBtX2JCbG9ja2luZzt9CiAKIAlvcGVyYXRvcgkJCQkJCQkJSUpTX1J1bnRpbWUqKCkge3JldHVybiAoSUpTX1J1bnRpbWUqKW1faXNvbGF0ZTt9CiAJdjg6Oklzb2xhdGUqCQkJCQkJCQlHZXRJc29sYXRlKCl7cmV0dXJuIG1faXNvbGF0ZTt9OwpAQCAtNjMsNyArNjMsNyBAQAogCUNGWF9BcnJheVRlbXBsYXRlPENKU19Db250ZXh0Kj4JCW1fQ29udGV4dEFycmF5OwogCUNQREZEb2NfRW52aXJvbm1lbnQqCQkJCQkJCW1fcEFwcDsKIAlDUERGU0RLX0RvY3VtZW50KgkJCQkJCW1fcERvY3VtZW50OwotCUZYX0JPT0wJCQkJCQkJCQltX2JCbG9ja2luZzsKKwlib29sCQkJCQkJCQkJbV9iQmxvY2tpbmc7CiAJQ0pTX0ZpZWxkRXZlbnQqCQkJCQkJCW1fcEZpZWxkRXZlbnRQYXRoOwogCiAJdjg6Oklzb2xhdGUqIG1faXNvbGF0ZTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oCmluZGV4IDYxODY4MTcuLjAzNWNlZjAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfVmFsdWUuaApAQCAtNjMsMTIgKzYzLDEyIEBACiAJdm9pZCBvcGVyYXRvciA9IChjb25zdCBGWF9DSEFSKiBwU3RyKTsKIAl2b2lkIG9wZXJhdG9yID0gKENKU19WYWx1ZSB2YWx1ZSk7CiAKLQlGWF9CT09MIElzQXJyYXlPYmplY3QoKSBjb25zdDsKLQlGWF9CT09MCUlzRGF0ZU9iamVjdCgpIGNvbnN0OworCWJvb2wgSXNBcnJheU9iamVjdCgpIGNvbnN0OworCWJvb2wJSXNEYXRlT2JqZWN0KCkgY29uc3Q7CiAJRlhKU1ZBTFVFVFlQRSBHZXRUeXBlKCkgY29uc3Q7CiAKLQlGWF9CT09MIENvbnZlcnRUb0FycmF5KENKU19BcnJheSAmKSBjb25zdDsKLQlGWF9CT09MIENvbnZlcnRUb0RhdGUoQ0pTX0RhdGUgJikgY29uc3Q7CisJYm9vbCBDb252ZXJ0VG9BcnJheShDSlNfQXJyYXkgJikgY29uc3Q7CisJYm9vbCBDb252ZXJ0VG9EYXRlKENKU19EYXRlICYpIGNvbnN0OwogCiAJdjg6Oklzb2xhdGUqIEdldElzb2xhdGUoKSB7cmV0dXJuIG1faXNvbGF0ZTt9CiBwcm90ZWN0ZWQ6CkBAIC05NSw4ICs5NSw4IEBACiAJQ0pTX1Byb3BWYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSk7CiAJfkNKU19Qcm9wVmFsdWUoKTsKIHB1YmxpYzoKLQlGWF9CT09MIElzU2V0dGluZygpOwotCUZYX0JPT0wgSXNHZXR0aW5nKCk7CisJYm9vbCBJc1NldHRpbmcoKTsKKwlib29sIElzR2V0dGluZygpOwogCXZvaWQgb3BlcmF0b3I8PChpbnQpOwogCXZvaWQgb3BlcmF0b3I+PihpbnQmKSBjb25zdDsKIAl2b2lkIG9wZXJhdG9yPDwoYm9vbCk7CkBAIC0xMjIsNyArMTIyLDcgQEAKIAl2b2lkIFN0YXJ0U2V0dGluZygpOwogCXZvaWQgU3RhcnRHZXR0aW5nKCk7CiBwcml2YXRlOgotCUZYX0JPT0wgbV9iSXNTZXR0aW5nOworCWJvb2wgbV9iSXNTZXR0aW5nOwogfTsKIAogY2xhc3MgQ0pTX0FycmF5CkBAIC0xMzUsNyArMTM1LDcgQEAKIAl2b2lkIEdldEVsZW1lbnQodW5zaWduZWQgaW5kZXgsQ0pTX1ZhbHVlICZ2YWx1ZSk7CiAJdm9pZCBTZXRFbGVtZW50KHVuc2lnbmVkIGluZGV4LENKU19WYWx1ZSB2YWx1ZSk7CiAgICAgaW50IEdldExlbmd0aCgpOwotCUZYX0JPT0wgSXNBdHRhY2hlZCgpOworCWJvb2wgSXNBdHRhY2hlZCgpOwogCW9wZXJhdG9yIHY4OjpMb2NhbDx2ODo6QXJyYXk+KCk7CiAKIAl2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZSgpIHtyZXR1cm4gbV9pc29sYXRlO30KQEAgLTE3OSw3ICsxNzksNyBAQAogCiAJc3RhdGljIGRvdWJsZQlNYWtlRGF0ZShpbnQgeWVhciwgaW50IG1vbiwgaW50IG1kYXksaW50IGhvdXIsIGludCBtaW4sIGludCBzZWMsaW50IG1zKTsKIAotCUZYX0JPT0wJSXNWYWxpZERhdGUoKTsKKwlib29sCUlzVmFsaWREYXRlKCk7CiAKIHByb3RlY3RlZDoKIAl2ODo6TG9jYWw8djg6OlZhbHVlPiBtX3BEYXRlOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5oCmluZGV4IGNmZjllMTEuLjdmY2EzNjMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmgKQEAgLTE2LDI4ICsxNiwyOCBAQAogCXZpcnR1YWwgfkNKU19QdWJsaWNNZXRob2RzKHZvaWQpe307CiAKIHB1YmxpYzoKLQlzdGF0aWMgRlhfQk9PTCBBRk51bWJlcl9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZOdW1iZXJfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGUGVyY2VudF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZQZXJjZW50X0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRkRhdGVfRm9ybWF0RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZEYXRlX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGRGF0ZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZEYXRlX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRlRpbWVfRm9ybWF0RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7IC8vCi0Jc3RhdGljIEZYX0JPT0wgQUZUaW1lX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGVGltZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZUaW1lX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRlNwZWNpYWxfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGU3BlY2lhbF9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZTcGVjaWFsX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOy8vCi0Jc3RhdGljIEZYX0JPT0wgQUZTaW1wbGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZNYWtlTnVtYmVyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGU2ltcGxlX0NhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRlJhbmdlX1ZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGTWVyZ2VDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZQYXJzZURhdGVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRkV4dHJhY3ROdW1zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCXN0YXRpYyBib29sIEFGTnVtYmVyX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgYm9vbCBBRk51bWJlcl9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIGJvb2wgQUZQZXJjZW50X0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgYm9vbCBBRlBlcmNlbnRfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCXN0YXRpYyBib29sIEFGRGF0ZV9Gb3JtYXRFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgYm9vbCBBRkRhdGVfS2V5c3Ryb2tlRXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIGJvb2wgQUZEYXRlX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgYm9vbCBBRkRhdGVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCXN0YXRpYyBib29sIEFGVGltZV9Gb3JtYXRFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsgLy8KKwlzdGF0aWMgYm9vbCBBRlRpbWVfS2V5c3Ryb2tlRXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIGJvb2wgQUZUaW1lX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgYm9vbCBBRlRpbWVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCXN0YXRpYyBib29sIEFGU3BlY2lhbF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIGJvb2wgQUZTcGVjaWFsX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgYm9vbCBBRlNwZWNpYWxfS2V5c3Ryb2tlRXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ly8KKwlzdGF0aWMgYm9vbCBBRlNpbXBsZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgYm9vbCBBRk1ha2VOdW1iZXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIGJvb2wgQUZTaW1wbGVfQ2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCXN0YXRpYyBib29sIEFGUmFuZ2VfVmFsaWRhdGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIGJvb2wgQUZNZXJnZUNoYW5nZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgYm9vbCBBRlBhcnNlRGF0ZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCXN0YXRpYyBib29sIEFGRXh0cmFjdE51bXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKIHB1YmxpYzoKIAlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRk51bWJlcl9Gb3JtYXQpOwpAQCAtNjgsMTMgKzY4LDEzIEBACiBwdWJsaWM6CiAJc3RhdGljIGludAkJCQlQYXJzZVN0cmluZ0ludGVnZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBzdHJpbmcsaW50IG5TdGFydCxpbnQgJiBuU2tpcCwgaW50IG5NYXhTdGVwKTsKIAlzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcJUGFyc2VTdHJpbmdTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZywgaW50IG5TdGFydCwgaW50JiBuU2tpcCk7Ci0Jc3RhdGljIGRvdWJsZQkJCU1ha2VSZWd1bGFyRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLGNvbnN0IENGWF9XaWRlU3RyaW5nICYgZm9ybWF0LCBGWF9CT09MJiBiV3JvbmdGb3JtYXQpOworCXN0YXRpYyBkb3VibGUJCQlNYWtlUmVndWxhckRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB2YWx1ZSxjb25zdCBDRlhfV2lkZVN0cmluZyAmIGZvcm1hdCwgYm9vbCYgYldyb25nRm9ybWF0KTsKIAlzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcJTWFrZUZvcm1hdERhdGUoZG91YmxlIGREYXRlLGNvbnN0IENGWF9XaWRlU3RyaW5nICYgZm9ybWF0KTsKLQlzdGF0aWMgRlhfQk9PTAkJCUNvbnZlcnRTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsIGRvdWJsZSAmIGRSZXQsIEZYX0JPT0wgJiBiRG90KTsKKwlzdGF0aWMgYm9vbAkJCUNvbnZlcnRTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsIGRvdWJsZSAmIGRSZXQsIGJvb2wgJiBiRG90KTsKIAlzdGF0aWMgZG91YmxlCQkJUGFyc2VTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UpOwotCXN0YXRpYyBkb3VibGUJCQlQYXJzZU5vcm1hbERhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB2YWx1ZSwgRlhfQk9PTCYgYldyb25nRm9ybWF0KTsKKwlzdGF0aWMgZG91YmxlCQkJUGFyc2VOb3JtYWxEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdmFsdWUsIGJvb2wmIGJXcm9uZ0Zvcm1hdCk7CiAJc3RhdGljIGRvdWJsZSAgICAgICAgICAgTWFrZUludGVyRGF0ZShDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSk7Ci0Jc3RhdGljIGRvdWJsZQkJCVBhcnNlTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzd1NvdXJjZSwgRlhfQk9PTCYgYkFsbERpZ2l0cywgRlhfQk9PTCYgYkRvdCwgRlhfQk9PTCYgYlNpZ24sIEZYX0JPT0wmIGJLWEpTKTsKKwlzdGF0aWMgZG91YmxlCQkJUGFyc2VOdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlLCBib29sJiBiQWxsRGlnaXRzLCBib29sJiBiRG90LCBib29sJiBiU2lnbiwgYm9vbCYgYktYSlMpOwogCiBwdWJsaWM6CiAJc3RhdGljIENGWF9XaWRlU3RyaW5nCVN0ckxUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKTsKQEAgLTg1LDE2ICs4NSwxNiBAQAogCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwlTdHJSVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKTsKIAlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJU3RyVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKTsKIAotCXN0YXRpYyBGWF9CT09MCQkJSXNOdW1iZXIoY29uc3QgRlhfQ0hBUiogc3RyaW5nKTsKLQlzdGF0aWMgRlhfQk9PTAkJCUlzTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpOworCXN0YXRpYyBib29sCQkJSXNOdW1iZXIoY29uc3QgRlhfQ0hBUiogc3RyaW5nKTsKKwlzdGF0aWMgYm9vbAkJCUlzTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpOwogCi0Jc3RhdGljIEZYX0JPT0wJCQlJc0RpZ2l0KGNoYXIgY2gpOwotCXN0YXRpYyBGWF9CT09MCQkJSXNEaWdpdCh3Y2hhcl90IGNoKTsKLQlzdGF0aWMgRlhfQk9PTAkJCUlzQWxwaGFiZXRpYyh3Y2hhcl90IGNoKTsKLQlzdGF0aWMgRlhfQk9PTAkJCUlzQWxwaGFOdW1lcmljKHdjaGFyX3QgY2gpOworCXN0YXRpYyBib29sCQkJSXNEaWdpdChjaGFyIGNoKTsKKwlzdGF0aWMgYm9vbAkJCUlzRGlnaXQod2NoYXJfdCBjaCk7CisJc3RhdGljIGJvb2wJCQlJc0FscGhhYmV0aWMod2NoYXJfdCBjaCk7CisJc3RhdGljIGJvb2wJCQlJc0FscGhhTnVtZXJpYyh3Y2hhcl90IGNoKTsKIAotCXN0YXRpYyBGWF9CT09MCQkJbWFza1NhdGlzZmllZCh3Y2hhcl90IGNfQ2hhbmdlLHdjaGFyX3QgY19NYXNrKTsKLQlzdGF0aWMgRlhfQk9PTAkJCWlzUmVzZXJ2ZWRNYXNrQ2hhcih3Y2hhcl90IGNoKTsKKwlzdGF0aWMgYm9vbAkJCW1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSx3Y2hhcl90IGNfTWFzayk7CisJc3RhdGljIGJvb2wJCQlpc1Jlc2VydmVkTWFza0NoYXIod2NoYXJfdCBjaCk7CiAKIAlzdGF0aWMgZG91YmxlCQkJQUZfU2ltcGxlKGNvbnN0IEZYX1dDSEFSKiBzRnVjdGlvbiwgZG91YmxlIGRWYWx1ZTEsIGRvdWJsZSBkVmFsdWUyKTsKIAlzdGF0aWMgQ0pTX0FycmF5CQlBRl9NYWtlQXJyYXlGcm9tTGlzdCh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgQ0pTX1ZhbHVlIHZhbCk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9hcHAuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2FwcC5oCmluZGV4IGFjOTBlNjIuLmZmZDdlZGIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2FwcC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2FwcC5oCkBAIC0xMTAsNDEgKzExMCw0MSBAQAogCXZpcnR1YWwgfmFwcCgpOwogCiBwdWJsaWM6Ci0JRlhfQk9PTAkJCQkJCWFjdGl2ZURvY3MoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJY2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWZvcm1zVmVyc2lvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlmcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlmdWxsc2NyZWVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWxhbmd1YWdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCW1lZGlhKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCXBsYXRmb3JtKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCXJ1bnRpbWVIaWdobGlnaHQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJdmlld2VyVHlwZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQl2aWV3ZXJWYXJpYXRpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJdmlld2VyVmVyc2lvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQlhY3RpdmVEb2NzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCWNhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQlmb3Jtc1ZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJZnMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJZnVsbHNjcmVlbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQlsYW5ndWFnZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQltZWRpYShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQlwbGF0Zm9ybShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQlydW50aW1lSGlnaGxpZ2h0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCXZpZXdlclR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJdmlld2VyVmFyaWF0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCXZpZXdlclZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKIAogCi0JRlhfQk9PTAkJCQkJCWFsZXJ0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQliZWVwKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlicm93c2VGb3JEb2MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWNsZWFySW50ZXJ2YWwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWNsZWFyVGltZU91dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJZXhlY0RpYWxvZyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJZXhlY01lbnVJdGVtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlmaW5kQ29tcG9uZW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlnb0JhY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWdvRm9yd2FyZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJbGF1bmNoVVJMKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQltYWlsTXNnKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQluZXdGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCW5ld0RvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJb3BlbkRvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJb3BlbkZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJcG9wVXBNZW51RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCXBvcFVwTWVudShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJcmVzcG9uc2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCXNldEludGVydmFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlzZXRUaW1lT3V0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQlhbGVydChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJYmVlcChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJYnJvd3NlRm9yRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQljbGVhckludGVydmFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQljbGVhclRpbWVPdXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCWV4ZWNEaWFsb2coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCWV4ZWNNZW51SXRlbShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJZmluZENvbXBvbmVudChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJZ29CYWNrKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQlnb0ZvcndhcmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCWxhdW5jaFVSTChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJbWFpbE1zZyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJbmV3RkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQluZXdEb2MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCW9wZW5Eb2MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCW9wZW5GREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCXBvcFVwTWVudUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQlwb3BVcE1lbnUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCXJlc3BvbnNlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQlzZXRJbnRlcnZhbChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJc2V0VGltZU91dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKIAogcHJpdmF0ZToKIC8vCUZYX0RXT1JECQkJCQlBcHBHZXRUaWNrQ291bnQoKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2NvbG9yLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9jb2xvci5oCmluZGV4IGRmODYzYjUuLmFiN2JiYWUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2NvbG9yLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvY29sb3IuaApAQCAtMTYsMjEgKzE2LDIxIEBACiAJY29sb3IoQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKIAl2aXJ0dWFsIH5jb2xvcih2b2lkKTsKIAotCUZYX0JPT0wgYmxhY2soSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGJsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGN5YW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGRrR3JheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZ3JheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZ3JlZW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGx0R3JheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgbWFnZW50YShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcmVkKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB0cmFuc3BhcmVudChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgd2hpdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHllbGxvdyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgYmxhY2soSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGJsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGN5YW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGRrR3JheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgZ3JheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgZ3JlZW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGx0R3JheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgbWFnZW50YShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgcmVkKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCB0cmFuc3BhcmVudChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgd2hpdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHllbGxvdyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogCi0JRlhfQk9PTCBjb252ZXJ0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZXF1YWwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBjb252ZXJ0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgZXF1YWwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKIHB1YmxpYzoKIAlzdGF0aWMgdm9pZAkJQ29udmVydFBXTENvbG9yVG9BcnJheShjb25zdCBDUFdMX0NvbG9yJiBjb2xvciwgQ0pTX0FycmF5JiBhcnJheSk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9jb25zb2xlLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9jb25zb2xlLmgKaW5kZXggMGNiYzI5MS4uNDI0ZjBlMiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvY29uc29sZS5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2NvbnNvbGUuaApAQCAtMTYsMTAgKzE2LDEwIEBACiAJdmlydHVhbCB+Y29uc29sZSh2b2lkKTsKIAogcHVibGljOgotCUZYX0JPT0wgY2xlYXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBoaWRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcHJpbnRsbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNob3coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBjbGVhcihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGhpZGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBwcmludGxuKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgc2hvdyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKIH07CiAKIGNsYXNzIENKU19Db25zb2xlIDogcHVibGljIENKU19PYmplY3QKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2V2ZW50LmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9ldmVudC5oCmluZGV4IDkxYTM4YmEuLmU5ODBhOTYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2V2ZW50LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvZXZlbnQuaApAQCAtMTYsMjYgKzE2LDI2IEBACiAJdmlydHVhbCB+ZXZlbnQodm9pZCk7CiAKIHB1YmxpYzoKLQlGWF9CT09MIGNoYW5nZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgY2hhbmdlRXgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGNvbW1pdEtleShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZmllbGRGdWxsKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBrZXlEb3duKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBtb2RpZmllcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgbmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcmMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJpY2hDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJpY2hDaGFuZ2VFeChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcmljaFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzZWxFbmQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNlbFN0YXJ0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzaGlmdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc291cmNlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB0YXJnZXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHRhcmdldE5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB3aWxsQ29tbWl0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBjaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGNoYW5nZUV4KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBjb21taXRLZXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGZpZWxkRnVsbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wga2V5RG93bihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgbW9kaWZpZXIoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIG5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHJjKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCByaWNoQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCByaWNoQ2hhbmdlRXgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHJpY2hWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgc2VsRW5kKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBzZWxTdGFydChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgc2hpZnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHNvdXJjZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgdGFyZ2V0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCB0YXJnZXROYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCB0eXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCB2YWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgd2lsbENvbW1pdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogCiB9OwogCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9nbG9iYWwuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2dsb2JhbC5oCmluZGV4IDgzZTA3ZjYuLjRjNmNjZDkgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2dsb2JhbC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2dsb2JhbC5oCkBAIC0xOSwxMCArMTksMTAgQEAKIAl7CiAJCW5UeXBlID0gMDsKIAkJZERhdGEgPSAwOwotCQliRGF0YSA9IEZBTFNFOworCQliRGF0YSA9IGZhbHNlOwogCQlzRGF0YSA9ICIiOwotCQliUGVyc2lzdGVudCA9IEZBTFNFOwotCQliRGVsZXRlZCA9IEZBTFNFOworCQliUGVyc2lzdGVudCA9IGZhbHNlOworCQliRGVsZXRlZCA9IGZhbHNlOwogCX0KIAogCX5qc19nbG9iYWxfZGF0YSgpCkBAIC00NSwxMiArNDUsMTIgQEAKIAl2aXJ0dWFsIH5nbG9iYWxfYWx0ZXJuYXRlKCk7CiAKIHB1YmxpYzoKLQlGWF9CT09MCQkJCQkJc2V0UGVyc2lzdGVudChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJc2V0UGVyc2lzdGVudChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKIAogcHVibGljOgotCUZYX0JPT0wJCQkJCQlRdWVyeVByb3BlcnR5KGNvbnN0IEZYX1dDSEFSKiBwcm9wbmFtZSk7Ci0JRlhfQk9PTAkJCQkJCURvUHJvcGVydHkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IEZYX1dDSEFSKiBwcm9wbmFtZSwgQ0pTX1Byb3BWYWx1ZSAmIHZwLCBDRlhfV2lkZVN0cmluZyAmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCURlbFByb3BlcnR5KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUsIENGWF9XaWRlU3RyaW5nICYgc0Vycm9yKTsKKwlib29sCQkJCQkJUXVlcnlQcm9wZXJ0eShjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUpOworCWJvb2wJCQkJCQlEb1Byb3BlcnR5KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUsIENKU19Qcm9wVmFsdWUgJiB2cCwgQ0ZYX1dpZGVTdHJpbmcgJiBzRXJyb3IpOworCWJvb2wJCQkJCQlEZWxQcm9wZXJ0eShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lLCBDRlhfV2lkZVN0cmluZyAmIHNFcnJvcik7CiAKIAl2b2lkCQkJCQkJSW5pdGlhbChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKTsKIApAQCAtNTgsNyArNTgsNyBAQAogCXZvaWQJCQkJCQlVcGRhdGVHbG9iYWxQZXJzaXN0ZW50VmFyaWFibGVzKCk7CiAJdm9pZAkJCQkJCUNvbW1pdEdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCk7CiAJdm9pZAkJCQkJCURlc3Ryb3lHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcygpOwotCUZYX0JPT0wJCQkJCQlTZXRHbG9iYWxWYXJpYWJsZXMoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsIGludCBuVHlwZSwKKwlib29sCQkJCQkJU2V0R2xvYmFsVmFyaWFibGVzKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lLCBpbnQgblR5cGUsCiAJCQkJCQkJCQlkb3VibGUgZERhdGEsIGJvb2wgYkRhdGEsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRGF0YSwgSlNPYmplY3QgcERhdGEsIGJvb2wgYkRlZmF1bHRQZXJzaXN0ZW50KTsKIAogCXZvaWQJCQkJCQlPYmplY3RUb0FycmF5KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLCBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSYgYXJyYXkpOwpAQCAtNzgsNyArNzgsNyBAQAogCUNKU19HbG9iYWwoSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307CiAJdmlydHVhbCB+Q0pTX0dsb2JhbCh2b2lkKXt9OwogCi0JdmlydHVhbCBGWF9CT09MCUluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYyk7CisJdmlydHVhbCBib29sCUluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYyk7CiAKIAlERUNMQVJFX1NQRUNJQUxfSlNfQ0xBU1MoQ0pTX0dsb2JhbCk7CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L3JlcG9ydC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvcmVwb3J0LmgKaW5kZXggNTZmNzQyYy4uZTU0NTgzMyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvcmVwb3J0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvcmVwb3J0LmgKQEAgLTE2LDggKzE2LDggQEAKIAl2aXJ0dWFsIH5SZXBvcnQoKTsKIAogcHVibGljOgotCUZYX0JPT0wgc2F2ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHdyaXRlVGV4dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHNhdmUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCB3cml0ZVRleHQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiB9OwogCiBjbGFzcyBDSlNfUmVwb3J0IDogcHVibGljIENKU19PYmplY3QKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L3V0aWwuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L3V0aWwuaAppbmRleCBjYTRkYjM0Li5hMmQ2NzQ5IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC91dGlsLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvdXRpbC5oCkBAIC0xOCwxMSArMTgsMTEgQEAKIAl2aXJ0dWFsIH51dGlsKHZvaWQpOwogCiBwdWJsaWM6Ci0JRlhfQk9PTCBwcmludGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBwcmludGYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBwcmludHgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzY2FuZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGJ5dGVUb0NoYXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBwcmludGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBwcmludGYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBwcmludHgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBzY2FuZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGJ5dGVUb0NoYXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKIHB1YmxpYzoKIAlzdGF0aWMgdm9pZAkJcHJpbnRkKGNvbnN0IHN0ZDo6d3N0cmluZyAmY0Zvcm1hdCxDSlNfRGF0ZSBEYXRlLGJvb2wgYlhGQVBpY3R1cmUsIHN0ZDo6d3N0cmluZyAmY1B1cnBvc2UpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQnV0dG9uLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9CdXR0b24uaAppbmRleCAyYmYyZWVhLi4zMjJiOWQ0IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9CdXR0b24uaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9CdXR0b24uaApAQCAtMTcsMTEgKzE3LDExIEBACiAKIAl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXRDbGFzc05hbWUoKSBjb25zdDsKIAl2aXJ0dWFsIHZvaWQJCQkJT25DcmVhdGUoUFdMX0NSRUFURVBBUkFNICYgY3ApOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CiAKIHByb3RlY3RlZDoKLQlGWF9CT09MCQkJCQkJbV9iTW91c2VEb3duOworCWJvb2wJCQkJCQltX2JNb3VzZURvd247CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX0JVVFRPTl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ2FyZXQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NhcmV0LmgKaW5kZXggNjgzOGJjNC4uNDI3NDM2NSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ2FyZXQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9DYXJldC5oCkBAIC0xMiwxMSArMTIsMTEgQEAKIHN0cnVjdCBQV0xfQ0FSRVRfSU5GTwogewogcHVibGljOgotCVBXTF9DQVJFVF9JTkZPKCkgOiBiVmlzaWJsZShGQUxTRSksIHB0SGVhZCgwLDApLCBwdEZvb3QoMCwwKQorCVBXTF9DQVJFVF9JTkZPKCkgOiBiVmlzaWJsZShmYWxzZSksIHB0SGVhZCgwLDApLCBwdEZvb3QoMCwwKQogCXsKIAl9CiAKLQlGWF9CT09MCQkJCQkJYlZpc2libGU7CisJYm9vbAkJCQkJCWJWaXNpYmxlOwogCUNQREZfUG9pbnQJCQkJCXB0SGVhZDsKIAlDUERGX1BvaW50CQkJCQlwdEZvb3Q7CiB9OwpAQCAtMzIsOSArMzIsOSBAQAogCXZpcnR1YWwgdm9pZAkJCQlHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKTsKIAl2aXJ0dWFsIHZvaWQJCQkJRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwogCXZpcnR1YWwgdm9pZAkJCQlJbnZhbGlkYXRlUmVjdChDUERGX1JlY3QgKiBwUmVjdCA9IE5VTEwpOwotCXZpcnR1YWwgdm9pZAkJCQlTZXRWaXNpYmxlKEZYX0JPT0wgYlZpc2libGUpIHt9CisJdmlydHVhbCB2b2lkCQkJCVNldFZpc2libGUoYm9vbCBiVmlzaWJsZSkge30KIAl2aXJ0dWFsCXZvaWQJCQkJVGltZXJQcm9jKCk7Ci0Jdm9pZAkJCQkJCVNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsIGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsIGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QpOworCXZvaWQJCQkJCQlTZXRDYXJldChib29sIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290KTsKIAlDRlhfQnl0ZVN0cmluZwkJCQlHZXRDYXJldEFwcGVhcmFuY2VTdHJlYW0oY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0KTsKIAl2b2lkCQkJCQkJU2V0SW52YWxpZFJlY3QoQ1BERl9SZWN0IHJjKSB7bV9yY0ludmFsaWQgPSByYzt9CiAKQEAgLTQyLDcgKzQyLDcgQEAKIAl2b2lkCQkJCQkJR2V0Q2FyZXRBcHAoQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSxjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQpOwogCUNQREZfUmVjdAkJCQkJR2V0Q2FyZXRSZWN0KCkgY29uc3Q7CiAKLQlGWF9CT09MCQkJCQkJbV9iRmxhc2g7CisJYm9vbAkJCQkJCW1fYkZsYXNoOwogCUNQREZfUG9pbnQJCQkJCW1fcHRIZWFkOwogCUNQREZfUG9pbnQJCQkJCW1fcHRGb290OwogCUZYX0ZMT0FUCQkJCQltX2ZXaWR0aDsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Db21ib0JveC5oCmluZGV4IDNmODYwNGYuLjIxZDRlNGEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guaApAQCAtMjUsMTAgKzI1LDEwIEBACiAJdmlydHVhbCB+Q1BXTF9DQkxpc3RCb3goKXt9OwogCiBwdWJsaWM6Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKIAotCUZYX0JPT0wJCQkJT25LZXlEb3duV2l0aEV4aXQoRlhfV09SRCBuQ2hhciwgRlhfQk9PTCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7Ci0JRlhfQk9PTAkJCQlPbkNoYXJXaXRoRXhpdChGWF9XT1JEIG5DaGFyLCBGWF9CT09MICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKTsKKwlib29sCQkJCU9uS2V5RG93bldpdGhFeGl0KEZYX1dPUkQgbkNoYXIsIGJvb2wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOworCWJvb2wJCQkJT25DaGFyV2l0aEV4aXQoRlhfV09SRCBuQ2hhciwgYm9vbCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7CiB9OwogCiAjZGVmaW5lIFBXTF9DT01CT0JPWF9CVVRUT05fV0lEVEgJCTEzCkBAIC00Myw4ICs0Myw4IEBACiAJdmlydHVhbCB2b2lkCQkJCUdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0pOwogCXZpcnR1YWwgdm9pZAkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwogCiB9OwogCkBAIC01OCw4ICs1OCw4IEBACiAJdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7CiAJdmlydHVhbCB2b2lkCQkJCU9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOwogCiAJdmlydHVhbCB2b2lkCQkJCU9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIGludHB0cl90IHdQYXJhbSA9IDAsIGludHB0cl90IGxQYXJhbSA9IDApOwogCkBAIC03MSw3ICs3MSw3IEBACiAJdmlydHVhbCB2b2lkCQkJCVNldEZvY3VzKCk7CiAJdmlydHVhbCB2b2lkCQkJCUtpbGxGb2N1cygpOwogCi0JRlhfQk9PTAkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdDsKKwlib29sCQkJCQkJSXNNb2RpZmllZCgpIGNvbnN0OwogCiBwdWJsaWM6CiAJdm9pZAkJCQkJCVNldEZpbGxlck5vdGlmeShJUFdMX0ZpbGxlcl9Ob3RpZnkqIHBOb3RpZnkpOwpAQCAtODcsNyArODcsNyBAQAogCXZvaWQJCQkJCQlHZXRFZGl0U2VsKGludDMyX3QgJiBuU3RhcnRDaGFyLCBpbnQzMl90ICYgbkVuZENoYXIgKSBjb25zdDsKIAl2b2lkCQkJCQkJQ2xlYXIoKTsKIAl2b2lkCQkJCQkJU2VsZWN0QWxsKCk7Ci0JRlhfQk9PTAkJCQkJCUlzUG9wdXAoKSBjb25zdDsKKwlib29sCQkJCQkJSXNQb3B1cCgpIGNvbnN0OwogCiAJdm9pZAkJCQkJCVNldFNlbGVjdFRleHQoKTsKIApAQCAtOTYsMTQgKzk2LDE0IEBACiAJdm9pZAkJCQkJCUNyZWF0ZUJ1dHRvbihjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7CiAJdm9pZAkJCQkJCUNyZWF0ZUxpc3RCb3goY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwogCi0Jdm9pZAkJCQkJCVNldFBvcHVwKEZYX0JPT0wgYlBvcHVwKTsKKwl2b2lkCQkJCQkJU2V0UG9wdXAoYm9vbCBiUG9wdXApOwogCiBwcml2YXRlOgogCUNQV0xfQ0JFZGl0KgkJCQltX3BFZGl0OwogCUNQV0xfQ0JCdXR0b24qCQkJCW1fcEJ1dHRvbjsKIAlDUFdMX0NCTGlzdEJveCoJCQkJbV9wTGlzdDsKIAotCUZYX0JPT0wJCQkJCQltX2JQb3B1cDsKKwlib29sCQkJCQkJbV9iUG9wdXA7CiAJQ1BERl9SZWN0CQkJCQltX3JjT2xkV2luZG93OwogCWludDMyX3QJCQkJCW1fblBvcHVwV2hlcmU7CiAJaW50MzJfdAkJCQkJbV9uU2VsZWN0SXRlbTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXQuaAppbmRleCA5NzE0N2E5Li41MGUxZWJlIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRWRpdC5oCkBAIC0yMSwxMSArMjEsMTEgQEAKICAgICAgICAgdmlydHVhbCB+SVBXTF9GaWxsZXJfTm90aWZ5KCkgeyB9CiAJdmlydHVhbCB2b2lkCQkJCQlRdWVyeVdoZXJlUG9wdXAodm9pZCogcFByaXZhdGVEYXRhLCBGWF9GTE9BVCBmUG9wdXBNaW4sRlhfRkxPQVQgZlBvcHVwTWF4LAogCQkJCQkJCQkJCWludDMyX3QgJiBuUmV0LCBGWF9GTE9BVCAmIGZQb3B1cFJldCkgPSAwOyAvL25SZXQ6ICgwOmJvdHRvbSAxOnRvcCkKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uQmVmb3JlS2V5U3Ryb2tlKEZYX0JPT0wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgaW50MzJfdCBuS2V5Q29kZSwKKwl2aXJ0dWFsIHZvaWQJCQkJCU9uQmVmb3JlS2V5U3Ryb2tlKGJvb2wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgaW50MzJfdCBuS2V5Q29kZSwKIAkJCQkJCQkJCQlDRlhfV2lkZVN0cmluZyAmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAogCQkJCQkJCQkJCWludCBuU2VsU3RhcnQsIGludCBuU2VsRW5kLAotCQkJCQkJCQkJCUZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgJiBiUkMsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uQWZ0ZXJLZXlTdHJva2UoRlhfQk9PTCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBGWF9CT09MICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKSA9IDA7CisJCQkJCQkJCQkJYm9vbCBiS2V5RG93biwgYm9vbCAmIGJSQywgYm9vbCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJT25BZnRlcktleVN0cm9rZShib29sIGJFZGl0T3JMaXN0LCB2b2lkKiBwUHJpdmF0ZURhdGEsIGJvb2wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpID0gMDsKIH07CiAKIGNsYXNzIFBXTF9DTEFTUyBDUFdMX0VkaXQgOiBwdWJsaWMgQ1BXTF9FZGl0Q3RybCwgcHVibGljIElGWF9FZGl0X09wck5vdGlmeQpAQCAtNDQsMzUgKzQ0LDM1IEBACiAJdmlydHVhbCB2b2lkCQkJCQlHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTEJ1dHRvbkRibENsayhjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25MQnV0dG9uRGJsQ2xrKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKIAogCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUdldEZvY3VzUmVjdCgpIGNvbnN0OwogCiBwdWJsaWM6Ci0Jdm9pZAkJCQkJCQlTZXRBbGlnbkZvcm1hdEgoUFdMX0VESVRfQUxJR05GT1JNQVRfSCBuRm9ybWF0ID0gUEVBSF9MRUZULCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwkvLzA6bGVmdCAxOnJpZ2h0IDI6bWlkZGxlCi0Jdm9pZAkJCQkJCQlTZXRBbGlnbkZvcm1hdFYoUFdMX0VESVRfQUxJR05GT1JNQVRfViBuRm9ybWF0ID0gUEVBVl9UT1AsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CS8vMDp0b3AgMTpib3R0b20gMjpjZW50ZXIKKwl2b2lkCQkJCQkJCVNldEFsaWduRm9ybWF0SChQV0xfRURJVF9BTElHTkZPUk1BVF9IIG5Gb3JtYXQgPSBQRUFIX0xFRlQsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7CS8vMDpsZWZ0IDE6cmlnaHQgMjptaWRkbGUKKwl2b2lkCQkJCQkJCVNldEFsaWduRm9ybWF0VihQV0xfRURJVF9BTElHTkZPUk1BVF9WIG5Gb3JtYXQgPSBQRUFWX1RPUCwgYm9vbCBiUGFpbnQgPSB0cnVlKTsJLy8wOnRvcCAxOmJvdHRvbSAyOmNlbnRlcgogCiAJdm9pZAkJCQkJCQlTZXRDaGFyQXJyYXkoaW50MzJfdCBuQ2hhckFycmF5KTsKIAl2b2lkCQkJCQkJCVNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIpOwogCi0Jdm9pZAkJCQkJCQlTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJU2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CisJdm9pZAkJCQkJCQlTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlLCBib29sIGJQYWludCA9IHRydWUpOworCXZvaWQJCQkJCQkJU2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7CiAKLQl2b2lkCQkJCQkJCVNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZywgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKKwl2b2lkCQkJCQkJCVNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZywgYm9vbCBiUGFpbnQgPSB0cnVlKTsKIAotCXZvaWQJCQkJCQkJRW5hYmxlU3BlbGxDaGVjayhGWF9CT09MIGJFbmFibGVkKTsKKwl2b2lkCQkJCQkJCUVuYWJsZVNwZWxsQ2hlY2soYm9vbCBiRW5hYmxlZCk7CiAKLQlGWF9CT09MCQkJCQkJCUNhblNlbGVjdEFsbCgpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJQ2FuQ2xlYXIoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUNhbkNvcHkoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUNhbkN1dCgpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJQ2FuUGFzdGUoKSBjb25zdDsKKwlib29sCQkJCQkJCUNhblNlbGVjdEFsbCgpIGNvbnN0OworCWJvb2wJCQkJCQkJQ2FuQ2xlYXIoKSBjb25zdDsKKwlib29sCQkJCQkJCUNhbkNvcHkoKSBjb25zdDsKKwlib29sCQkJCQkJCUNhbkN1dCgpIGNvbnN0OworCWJvb2wJCQkJCQkJQ2FuUGFzdGUoKSBjb25zdDsKIAogCXZpcnR1YWwgdm9pZAkJCQkJQ29weVRleHQoKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCVBhc3RlVGV4dCgpOwpAQCAtODUsNyArODUsNyBAQAogCUNGWF9CeXRlU3RyaW5nCQkJCQlHZXRDYXJldEFwcGVhcmFuY2VTdHJlYW0oY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0KSBjb25zdDsKIAlDRlhfQnl0ZVN0cmluZwkJCQkJR2V0U2VsZWN0QXBwZWFyYW5jZVN0cmVhbShjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQpIGNvbnN0OwogCi0JRlhfQk9PTAkJCQkJCQlJc1RleHRGdWxsKCkgY29uc3Q7CisJYm9vbAkJCQkJCQlJc1RleHRGdWxsKCkgY29uc3Q7CiAKIAlzdGF0aWMgRlhfRkxPQVQJCQkJCUdldENoYXJBcnJheUF1dG9Gb250U2l6ZShDUERGX0ZvbnQqIHBGb250LCBjb25zdCBDUERGX1JlY3QmIHJjUGxhdGUsIGludDMyX3QgbkNoYXJBcnJheSk7CiAKQEAgLTExMiw4ICsxMTIsOCBAQAogCiBwcml2YXRlOgogCUNQVlRfV29yZFJhbmdlCQkJCQlHZXRTZWxlY3RXb3JkUmFuZ2UoKSBjb25zdDsKLQl2aXJ0dWFsIHZvaWQJCQkJCVNob3dWU2Nyb2xsQmFyKEZYX0JPT0wgYlNob3cpOwotCUZYX0JPT0wJCQkJCQkJSXNWU2Nyb2xsQmFyVmlzaWJsZSgpIGNvbnN0OworCXZpcnR1YWwgdm9pZAkJCQkJU2hvd1ZTY3JvbGxCYXIoYm9vbCBiU2hvdyk7CisJYm9vbAkJCQkJCQlJc1ZTY3JvbGxCYXJWaXNpYmxlKCkgY29uc3Q7CiAJdm9pZAkJCQkJCQlTZXRQYXJhbUJ5RmxhZygpOwogCiAJRlhfRkxPQVQJCQkJCQlHZXRDaGFyQXJyYXlBdXRvRm9udFNpemUoaW50MzJfdCBuQ2hhckFycmF5KTsKQEAgLTEyMywxNSArMTIzLDE1IEBACiAJQ1BWVF9Xb3JkUmFuZ2UJCQkJCUdldExhdGluV29yZHNSYW5nZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0OwogCUNQVlRfV29yZFJhbmdlCQkJCQlHZXRMYXRpbldvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7CiAJQ1BWVF9Xb3JkUmFuZ2UJCQkJCUdldEFyYWJpY1dvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0JQ1BWVF9Xb3JkUmFuZ2UJCQkJCUdldFNhbWVXb3Jkc1JhbmdlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIEZYX0JPT0wgYkxhdGluLCBGWF9CT09MIGJBcmFiaWMpIGNvbnN0OworCUNQVlRfV29yZFJhbmdlCQkJCQlHZXRTYW1lV29yZHNSYW5nZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBib29sIGJMYXRpbiwgYm9vbCBiQXJhYmljKSBjb25zdDsKIAogCXZvaWQJCQkJCQkJQWp1c3RBcmFiaWNXb3Jkcyhjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpOwogcHVibGljOgotCUZYX0JPT0wJCQkJCQkJSXNQcm9jZWVkdG9PbkNoYXIoRlhfV09SRCBuS2V5Q29kZSwgRlhfRFdPUkQgbkZsYWcpOworCWJvb2wJCQkJCQkJSXNQcm9jZWVkdG9PbkNoYXIoRlhfV09SRCBuS2V5Q29kZSwgRlhfRFdPUkQgbkZsYWcpOwogcHJpdmF0ZToKIAlJUFdMX0ZpbGxlcl9Ob3RpZnkqCQkJCW1fcEZpbGxlck5vdGlmeTsKIAlJUFdMX1NwZWxsQ2hlY2sqCQkJCW1fcFNwZWxsQ2hlY2s7Ci0JRlhfQk9PTAkJCQkJCQltX2JGb2N1czsKKwlib29sCQkJCQkJCW1fYkZvY3VzOwogCUNQREZfUmVjdAkJCQkJCW1fcmNPbGRXaW5kb3c7CiBwdWJsaWM6CiAJdm9pZAkJCQkJCQlBdHRhY2hGRkxEYXRhKHZvaWQqIHBEYXRhKSB7bV9wRm9ybUZpbGxlciA9IHBEYXRhO30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5oCmluZGV4IDliMDg4YjEuLmU1MTIzZmQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRWRpdEN0cmwuaApAQCAtNjgsMTEgKzY4LDExIEBACiAJdmlydHVhbCB2b2lkCQkJCQlPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7CiAJdmlydHVhbCB2b2lkCQkJCQlPbkNyZWF0ZWQoKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CiAJdmlydHVhbCB2b2lkCQkJCQlPbk5vdGlmeShDUFdMX1duZCogcFduZCwgRlhfRFdPUkQgbXNnLCBpbnRwdHJfdCB3UGFyYW0gPSAwLCBpbnRwdHJfdCBsUGFyYW0gPSAwKTsKIAogCXZpcnR1YWwgdm9pZAkJCQkJQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwpAQCAtODksNyArODksNyBAQAogCiAJQ1BERl9SZWN0CQkJCQkJR2V0Q29udGVudFJlY3QoKSBjb25zdDsKIAl2b2lkCQkJCQkJCUdldENhcmV0UG9zKGludDMyX3QmIHgsIGludDMyX3QmIHkpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNNb2RpZmllZCgpIGNvbnN0OworCWJvb2wJCQkJCQkJSXNNb2RpZmllZCgpIGNvbnN0OwogCiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFRleHQoKSBjb25zdDsKIAl2b2lkCQkJCQkJCVNldFNlbChpbnQzMl90IG5TdGFydENoYXIsaW50MzJfdCBuRW5kQ2hhcik7CkBAIC0xMDUsNyArMTA1LDcgQEAKIAogCXZvaWQJCQkJCQkJUGFpbnQoKTsKIAotCXZvaWQJCQkJCQkJRW5hYmxlUmVmcmVzaChGWF9CT09MIGJSZWZyZXNoKTsKKwl2b2lkCQkJCQkJCUVuYWJsZVJlZnJlc2goYm9vbCBiUmVmcmVzaCk7CiAJQ1BERl9Qb2ludAkJCQkJCUdldFNjcm9sbFBvcygpIGNvbnN0OwogCXZvaWQJCQkJCQkJU2V0U2Nyb2xsUG9zKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKIApAQCAtMTIwLDMwICsxMjAsMzAgQEAKIAlDUERGX0ZvbnQgKgkJCQkJCUdldENhcmV0Rm9udCgpIGNvbnN0OwogCUZYX0ZMT0FUCQkJCQkJR2V0Q2FyZXRGb250U2l6ZSgpIGNvbnN0OwogCi0JRlhfQk9PTAkJCQkJCQlDYW5VbmRvKCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlDYW5SZWRvKCkgY29uc3Q7CisJYm9vbAkJCQkJCQlDYW5VbmRvKCkgY29uc3Q7CisJYm9vbAkJCQkJCQlDYW5SZWRvKCkgY29uc3Q7CiAJdm9pZAkJCQkJCQlSZWRvKCk7CiAJdm9pZAkJCQkJCQlVbmRvKCk7CiAKIAl2b2lkCQkJCQkJCVNldFJlYWR5VG9JbnB1dCgpOwogcHJvdGVjdGVkOgotCXZpcnR1YWwgdm9pZAkJCQkJU2hvd1ZTY3JvbGxCYXIoRlhfQk9PTCBiU2hvdyk7CisJdmlydHVhbCB2b2lkCQkJCQlTaG93VlNjcm9sbEJhcihib29sIGJTaG93KTsKIAogCXZpcnR1YWwgdm9pZAkJCQkJSW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIGludDMyX3QgbkNoYXJzZXQpOwogCXZpcnR1YWwgdm9pZAkJCQkJSW5zZXJ0UmV0dXJuKCk7CiAJdmlydHVhbCB2b2lkCQkJCQlJbnNlcnRUZXh0KGNvbnN0IEZYX1dDSEFSKiBjc1RleHQpOwogCiAJdmlydHVhbCB2b2lkCQkJCQlTZXRDdXJzb3IoKTsKLQlGWF9CT09MCQkJCQkJCUlzV25kSG9yVigpOworCWJvb2wJCQkJCQkJSXNXbmRIb3JWKCk7CiAKIAl2b2lkCQkJCQkJCURlbGV0ZSgpOwogCXZvaWQJCQkJCQkJQmFja3NwYWNlKCk7CiAKIHByb3RlY3RlZDoKIAl2b2lkCQkJCQkJCUdldENhcmV0SW5mbyhDUERGX1BvaW50ICYgcHRIZWFkLCBDUERGX1BvaW50ICYgcHRGb290KSBjb25zdDsKLQl2b2lkCQkJCQkJCVNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsIGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsIGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QpOworCXZvaWQJCQkJCQkJU2V0Q2FyZXQoYm9vbCBiVmlzaWJsZSwgY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0Rm9vdCk7CiAKLQl2b2lkCQkJCQkJCVNldEVkaXRDYXJldChGWF9CT09MIGJWaXNpYmxlKTsKKwl2b2lkCQkJCQkJCVNldEVkaXRDYXJldChib29sIGJWaXNpYmxlKTsKIAogcHJvdGVjdGVkOgogCXZpcnR1YWwgdm9pZAkJCQkJSU9uU2V0U2Nyb2xsSW5mb1goRlhfRkxPQVQgZlBsYXRlTWluLCBGWF9GTE9BVCBmUGxhdGVNYXgsCkBAIC0xNTQsNyArMTU0LDcgQEAKIAkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZTbWFsbFN0ZXAsIEZYX0ZMT0FUIGZCaWdTdGVwKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCUlPblNldFNjcm9sbFBvc1goRlhfRkxPQVQgZngpe30KIAl2aXJ0dWFsIHZvaWQJCQkJCUlPblNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpOwotCXZpcnR1YWwgdm9pZAkJCQkJSU9uU2V0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSxjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSk7CisJdmlydHVhbCB2b2lkCQkJCQlJT25TZXRDYXJldChib29sIGJWaXNpYmxlLGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsY29uc3QgQ1BERl9Qb2ludCAmIHB0Rm9vdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCUlPbkNhcmV0Q2hhbmdlKGNvbnN0IENQVlRfU2VjUHJvcHMgJiBzZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgJiB3b3JkUHJvcHMpOwogCXZpcnR1YWwgdm9pZAkJCQkJSU9uQ29udGVudENoYW5nZShjb25zdCBDUERGX1JlY3QmIHJjQ29udGVudCk7CiAJdmlydHVhbCB2b2lkCQkJCQlJT25JbnZhbGlkYXRlUmVjdChDUERGX1JlY3QgKiBwUmVjdCk7CkBAIC0xNjUsNyArMTY1LDcgQEAKIHByb3RlY3RlZDoKIAlJRlhfRWRpdCoJCQkJCQltX3BFZGl0OwogCUNQV0xfQ2FyZXQqCQkJCQkJbV9wRWRpdENhcmV0OwotCUZYX0JPT0wJCQkJCQkJbV9iTW91c2VEb3duOworCWJvb2wJCQkJCQkJbV9iTW91c2VEb3duOwogCUlQV0xfRWRpdF9Ob3RpZnkqCQkJCW1fcEVkaXROb3RpZnk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Gb250TWFwLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Gb250TWFwLmgKaW5kZXggZDMyY2M5My4uZTRiYmJmMiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuaApAQCAtODUsNyArODUsNyBAQAogCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJCUdldERlZmF1bHRGb250QnlDaGFyc2V0KGludDMyX3QgbkNoYXJzZXQpOwogCiAJQ1BERl9Gb250KgkJCQkJCQkJCUFkZEZvbnRUb0RvY3VtZW50KENQREZfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsIHVpbnQ4X3QgbkNoYXJzZXQpOwotCXN0YXRpYyBGWF9CT09MCQkJCQkJCQlJc1N0YW5kYXJkRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lKTsKKwlzdGF0aWMgYm9vbAkJCQkJCQkJSXNTdGFuZGFyZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSk7CiAJQ1BERl9Gb250KgkJCQkJCQkJCUFkZFN0YW5kYXJkRm9udChDUERGX0RvY3VtZW50KiBwRG9jLCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lKTsKIAlDUERGX0ZvbnQqCQkJCQkJCQkJQWRkU3lzdGVtRm9udChDUERGX0RvY3VtZW50KiBwRG9jLCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLAogCQkJCQkJCQkJCQkJCXVpbnQ4X3QgbkNoYXJzZXQpOwpAQCAtOTMsMTIgKzkzLDEyIEBACiBwcm90ZWN0ZWQ6CiAJdmlydHVhbCBDUERGX0ZvbnQqCQkJCQkJCUZpbmRGb250U2FtZUNoYXJzZXQoQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMsIGludDMyX3QgbkNoYXJzZXQpOwogCXZpcnR1YWwgdm9pZAkJCQkJCQkJQWRkZWRGb250KENQREZfRm9udCogcEZvbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzKTsKLQlGWF9CT09MCQkJCQkJCQkJCUtub3dXb3JkKGludDMyX3QgbkZvbnRJbmRleCwgRlhfV09SRCB3b3JkKTsKKwlib29sCQkJCQkJCQkJCUtub3dXb3JkKGludDMyX3QgbkZvbnRJbmRleCwgRlhfV09SRCB3b3JkKTsKIAogCXZpcnR1YWwgQ1BERl9Eb2N1bWVudCoJCQkJCQlHZXREb2N1bWVudCgpOwogCiAJdm9pZAkJCQkJCQkJCQlFbXB0eSgpOwotCWludDMyX3QJCQkJCQkJCQlHZXRGb250SW5kZXgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgaW50MzJfdCBuQ2hhcnNldCwgRlhfQk9PTCBiRmluZCk7CisJaW50MzJfdAkJCQkJCQkJCUdldEZvbnRJbmRleChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLCBpbnQzMl90IG5DaGFyc2V0LCBib29sIGJGaW5kKTsKIAlpbnQzMl90CQkJCQkJCQkJR2V0UFdMRm9udEluZGV4KEZYX1dPUkQgd29yZCwgaW50MzJfdCBuQ2hhcnNldCk7CiAJaW50MzJfdAkJCQkJCQkJCUFkZEZvbnREYXRhKENQREZfRm9udCogcEZvbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzLCBpbnQzMl90IG5DaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VUKTsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfSWNvbi5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfSWNvbi5oCmluZGV4IDQ0YTVjMGMuLmI2MzMxYjYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ljb24uaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9JY29uLmgKQEAgLTQ2LDkgKzQ2LDkgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJCUdldEltYWdlT2Zmc2V0KEZYX0ZMT0FUICYgeCxGWF9GTE9BVCAmIHkpOwogCiAJaW50MzJfdAkJCQkJCUdldFNjYWxlTWV0aG9kKCk7Ci0JRlhfQk9PTAkJCQkJCQlJc1Byb3BvcnRpb25hbFNjYWxlKCk7CisJYm9vbAkJCQkJCQlJc1Byb3BvcnRpb25hbFNjYWxlKCk7CiAJdm9pZAkJCQkJCQlHZXRJY29uUG9zaXRpb24oRlhfRkxPQVQgJiBmTGVmdCwgRlhfRkxPQVQgJiBmQm90dG9tKTsKLQlGWF9CT09MCQkJCQkJCUdldEZpdHRpbmdCb3VuZHMoKTsKKwlib29sCQkJCQkJCUdldEZpdHRpbmdCb3VuZHMoKTsKIAogCXZvaWQJCQkJCQkJU2V0SWNvbkZpdChDUERGX0ljb25GaXQgKiBwSWNvbkZpdCl7bV9wSWNvbkZpdCA9IHBJY29uRml0O307CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ljb25MaXN0LmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9JY29uTGlzdC5oCmluZGV4IDJmNmIzMjMuLjNjNzFlNTcgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ljb25MaXN0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfSWNvbkxpc3QuaApAQCAtMzQsOCArMzQsOCBAQAogCXZpcnR1YWwgdm9pZAkJCQkJCUNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCQlSZVBvc0NoaWxkV25kKCk7CiAKLQl2b2lkCQkJCQkJCQlTZXRTZWxlY3QoRlhfQk9PTCBiU2VsZWN0ZWQpOwotCUZYX0JPT0wJCQkJCQkJCUlzU2VsZWN0ZWQoKSBjb25zdDsKKwl2b2lkCQkJCQkJCQlTZXRTZWxlY3QoYm9vbCBiU2VsZWN0ZWQpOworCWJvb2wJCQkJCQkJCUlzU2VsZWN0ZWQoKSBjb25zdDsKIAl2b2lkCQkJCQkJCQlTZXREYXRhKHZvaWQqIHBEYXRhKTsKIAl2b2lkCQkJCQkJCQlTZXRJY29uKGludDMyX3Qgbkljb25JbmRleCk7CiAJdm9pZAkJCQkJCQkJU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKQEAgLTUyLDcgKzUyLDcgQEAKIHByaXZhdGU6CiAJaW50MzJfdAkJCQkJCQltX25JY29uSW5kZXg7CiAJdm9pZCoJCQkJCQkJCW1fcERhdGE7Ci0JRlhfQk9PTAkJCQkJCQkJbV9iU2VsZWN0ZWQ7CisJYm9vbAkJCQkJCQkJbV9iU2VsZWN0ZWQ7CiAJQ1BXTF9MYWJlbCoJCQkJCQkJbV9wVGV4dDsKIAlDUFdMX0NvbG9yCQkJCQkJCW1fY3JJY29uOwogfTsKQEAgLTY2LDcgKzY2LDcgQEAKIAl2b2lkCQkJCQkJCQlTZXRTZWxlY3QoaW50MzJfdCBuSW5kZXgpOwogCWludDMyX3QJCQkJCQkJR2V0U2VsZWN0KCkgY29uc3Q7CiAJdm9pZAkJCQkJCQkJU2V0Tm90aWZ5KElQV0xfSWNvbkxpc3RfTm90aWZ5KiBwTm90aWZ5KTsKLQl2b2lkCQkJCQkJCQlFbmFibGVOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KTsKKwl2b2lkCQkJCQkJCQlFbmFibGVOb3RpZnkoYm9vbCBiTm90aWZ5KTsKIAl2b2lkCQkJCQkJCQlTZXRMaXN0RGF0YShpbnQzMl90IG5JdGVtSW5kZXgsIHZvaWQqIHBEYXRhKTsKIAl2b2lkCQkJCQkJCQlTZXRMaXN0SWNvbihpbnQzMl90IG5JdGVtSW5kZXgsIGludDMyX3Qgbkljb25JbmRleCk7CiAJdm9pZAkJCQkJCQkJU2V0TGlzdFN0cmluZyhpbnQzMl90IG5JdGVtSW5kZXgsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOwpAQCAtNzcsMjAgKzc3LDIwIEBACiAKIHByb3RlY3RlZDoKIAl2aXJ0dWFsIHZvaWQJCQkJCQlDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKIAogcHJpdmF0ZToKIAlDUFdMX0ljb25MaXN0X0l0ZW0qCQkJCQlHZXRMaXN0SXRlbShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OwotCXZvaWQJCQkJCQkJCVNlbGVjdEl0ZW0oaW50MzJfdCBuSXRlbUluZGV4LCBGWF9CT09MIGJTZWxlY3QpOworCXZvaWQJCQkJCQkJCVNlbGVjdEl0ZW0oaW50MzJfdCBuSXRlbUluZGV4LCBib29sIGJTZWxlY3QpOwogCWludDMyX3QJCQkJCQkJRmluZEl0ZW1JbmRleChjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKLQlGWF9CT09MCQkJCQkJCQltX25TZWxlY3RJbmRleDsKKwlib29sCQkJCQkJCQltX25TZWxlY3RJbmRleDsKIAlJUFdMX0ljb25MaXN0X05vdGlmeSoJCQkJbV9wTm90aWZ5OwotCUZYX0JPT0wJCQkJCQkJCW1fYkVuYWJsZU5vdGlmeTsKLQlGWF9CT09MCQkJCQkJCQltX2JNb3VzZURvd247CisJYm9vbAkJCQkJCQkJbV9iRW5hYmxlTm90aWZ5OworCWJvb2wJCQkJCQkJCW1fYk1vdXNlRG93bjsKIAlpbnQzMl90CQkJCQkJCW1fbkxpc3RDb3VudDsKIH07CiAKQEAgLTEwMCwxMyArMTAwLDEzIEBACiAJQ1BXTF9JY29uTGlzdChpbnQzMl90IG5MaXN0Q291bnQpOwogCXZpcnR1YWwgfkNQV0xfSWNvbkxpc3QoKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJCU9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwogCiAJdm9pZAkJCQkJCQkJU2V0U2VsZWN0KGludDMyX3QgbkluZGV4KTsKIAl2b2lkCQkJCQkJCQlTZXRUb3BJdGVtKGludDMyX3QgbkluZGV4KTsKIAlpbnQzMl90CQkJCQkJCUdldFNlbGVjdCgpIGNvbnN0OwogCXZvaWQJCQkJCQkJCVNldE5vdGlmeShJUFdMX0ljb25MaXN0X05vdGlmeSogcE5vdGlmeSk7Ci0Jdm9pZAkJCQkJCQkJRW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSk7CisJdm9pZAkJCQkJCQkJRW5hYmxlTm90aWZ5KGJvb2wgYk5vdGlmeSk7CiAJdm9pZAkJCQkJCQkJU2V0TGlzdERhdGEoaW50MzJfdCBuSXRlbUluZGV4LCB2b2lkKiBwRGF0YSk7CiAJdm9pZAkJCQkJCQkJU2V0TGlzdEljb24oaW50MzJfdCBuSXRlbUluZGV4LCBpbnQzMl90IG5JY29uSW5kZXgpOwogCXZvaWQJCQkJCQkJCVNldExpc3RTdHJpbmcoaW50MzJfdCBuSXRlbUluZGV4LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guaAppbmRleCA5N2E0NTI5Li40M2Q2MGEyIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MaXN0Qm94LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEJveC5oCkBAIC0yOSw3ICsyOSw3IEBACiAJCQkJCQkJCQkJCQlGWF9GTE9BVCBmU21hbGxTdGVwLCBGWF9GTE9BVCBmQmlnU3RlcCk7CiAJdm9pZAkJCQkJCQlJT25TZXRTY3JvbGxQb3NYKEZYX0ZMT0FUIGZ4KXt9CiAJdm9pZAkJCQkJCQlJT25TZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KTsKLQl2b2lkCQkJCQkJCUlPblNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCxjb25zdCBDUERGX1BvaW50ICYgcHRGb290LCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpOworCXZvaWQJCQkJCQkJSU9uU2V0Q2FyZXQoYm9vbCBiVmlzaWJsZSxjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSk7CiAJdm9pZAkJCQkJCQlJT25DYXJldENoYW5nZShjb25zdCBDUFZUX1NlY1Byb3BzICYgc2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgd29yZFByb3BzKTsKIAl2b2lkCQkJCQkJCUlPbkludmFsaWRhdGVSZWN0KENQREZfUmVjdCAqIHBSZWN0KTsKIApAQCAtNDksMTIgKzQ5LDEyIEBACiAJdmlydHVhbCB2b2lkCQkJCQlHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwogCXZpcnR1YWwgdm9pZAkJCQkJS2lsbEZvY3VzKCk7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJCU9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIGludHB0cl90IHdQYXJhbSA9IDAsIGludHB0cl90IGxQYXJhbSA9IDApOwpAQCAtNjQsNyArNjQsNyBAQAogCXZpcnR1YWwgdm9pZAkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKIAl2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEZvbnRTaXplKCkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJCU9uTm90aWZ5U2VsQ2hhbmdlZChGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MICYgYkV4aXQgLCBGWF9EV09SRCBuRmxhZyk7CisJdm9pZAkJCQkJCQlPbk5vdGlmeVNlbENoYW5nZWQoYm9vbCBiS2V5RG93biwgYm9vbCAmIGJFeGl0ICwgRlhfRFdPUkQgbkZsYWcpOwogCiAJdm9pZAkJCQkJCQlBZGRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHN0cmluZyk7CiAJdm9pZAkJCQkJCQlTZXRUb3BWaXNpYmxlSW5kZXgoaW50MzJfdCBuSXRlbUluZGV4KTsKQEAgLTczLDEzICs3MywxMyBAQAogCXZvaWQJCQkJCQkJUmVzZXQoKTsKIAl2b2lkCQkJCQkJCVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgpOwogCXZvaWQJCQkJCQkJU2V0Q2FyZXQoaW50MzJfdCBuSXRlbUluZGV4KTsKLQl2b2lkCQkJCQkJCVNldEhvdmVyU2VsKEZYX0JPT0wgYkhvdmVyU2VsKTsKKwl2b2lkCQkJCQkJCVNldEhvdmVyU2VsKGJvb2wgYkhvdmVyU2VsKTsKIAogCWludDMyX3QJCQkJCQlHZXRDb3VudCgpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNNdWx0aXBsZVNlbCgpIGNvbnN0OworCWJvb2wJCQkJCQkJSXNNdWx0aXBsZVNlbCgpIGNvbnN0OwogCWludDMyX3QJCQkJCQlHZXRDYXJldEluZGV4KCkgY29uc3Q7CiAJaW50MzJfdAkJCQkJCUdldEN1clNlbCgpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNJdGVtU2VsZWN0ZWQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKKwlib29sCQkJCQkJCUlzSXRlbVNlbGVjdGVkKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3Q7CiAJaW50MzJfdAkJCQkJCUdldFRvcFZpc2libGVJbmRleCgpIGNvbnN0OwogCWludDMyX3QJCQkJCQlGaW5kTmV4dChpbnQzMl90IG5JbmRleCxGWF9XQ0hBUiBuQ2hhcikgY29uc3Q7CiAJQ1BERl9SZWN0CQkJCQkJR2V0Q29udGVudFJlY3QoKSBjb25zdDsKQEAgLTkxLDggKzkxLDggQEAKIHByb3RlY3RlZDoKIAlJRlhfTGlzdCoJCQkJCQltX3BMaXN0OwogCUNQV0xfTGlzdF9Ob3RpZnkqCQkJCW1fcExpc3ROb3RpZnk7Ci0JRlhfQk9PTAkJCQkJCQltX2JNb3VzZURvd247Ci0JRlhfQk9PTAkJCQkJCQltX2JIb3ZlclNlbDsKKwlib29sCQkJCQkJCW1fYk1vdXNlRG93bjsKKwlib29sCQkJCQkJCW1fYkhvdmVyU2VsOwogCUlQV0xfRmlsbGVyX05vdGlmeSoJCQkJbV9wRmlsbGVyTm90aWZ5OwogcHVibGljOgogCXZvaWQJCQkJCQkJQXR0YWNoRkZMRGF0YSh2b2lkKiBwRGF0YSkge21fcEZvcm1GaWxsZXIgPSBwRGF0YTt9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEN0cmwuaAppbmRleCBjMTA3YTBjLi4zYmVlZTE5IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xpc3RDdHJsLmgKQEAgLTM1LDcgKzM1LDcgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJCQlEcmF3Q2hpbGRBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwogCiBwcml2YXRlOgotCXZvaWQJCQkJCQkJCVJlc2V0QWxsKEZYX0JPT0wgYk1vdmUsaW50MzJfdCBuU3RhcnQpOworCXZvaWQJCQkJCQkJCVJlc2V0QWxsKGJvb2wgYk1vdmUsaW50MzJfdCBuU3RhcnQpOwogCiAJQ1BERl9SZWN0CQkJCQkJCW1fcmNDb250ZW50OwogCUNQREZfUG9pbnQJCQkJCQkJbV9wdFNjcm9sbDsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX05vdGUuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX05vdGUuaAppbmRleCBhNjBlYmEzLi5iMWU2MWM0IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Ob3RlLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTm90ZS5oCkBAIC0zMyw4ICszMyw4IEBACiBwdWJsaWM6CiAJdmlydHVhbCB+SVBXTF9Ob3RlTm90aWZ5KCkgeyB9CiAJdmlydHVhbCB2b2lkCQkJCQkJT25Ob3RlTW92ZShjb25zdCBGWF9SRUNUJiBydFdpbikgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90ZVNob3coRlhfQk9PTCBiU2hvdykgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90ZUFjdGl2YXRlKEZYX0JPT0wgYkFjdGl2ZSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90ZVNob3coYm9vbCBiU2hvdykgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90ZUFjdGl2YXRlKGJvb2wgYkFjdGl2ZSkgPSAwOwogCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90ZUNsb3NlKCkgPSAwOwogCXZpcnR1YWwgdm9pZAkJCQkJCU9uSXRlbUNyZWF0ZShJUFdMX05vdGVJdGVtKiBwSXRlbSkgPSAwOwogCXZpcnR1YWwgdm9pZAkJCQkJCU9uSXRlbURlbGV0ZShJUFdMX05vdGVJdGVtKiBwSXRlbSkgPSAwOwpAQCAtMTA3LDExICsxMDcsMTEgQEAKIAogcHJvdGVjdGVkOgogCXZpcnR1YWwgdm9pZAkJCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CiAKIHByaXZhdGU6Ci0JRlhfQk9PTAkJCQkJCQkJbV9iTW91c2VEb3duOworCWJvb2wJCQkJCQkJCW1fYk1vdXNlRG93bjsKIH07CiAKIGNsYXNzIENQV0xfTm90ZV9MQkJveCA6IHB1YmxpYyBDUFdMX1duZApAQCAtMTQwLDcgKzE0MCw3IEBACiAJQ1BXTF9Ob3RlX0VkaXQoKTsKIAl2aXJ0dWFsIH5DUFdMX05vdGVfRWRpdCgpOwogCi0Jdm9pZAkJCQkJCQkJRW5hYmxlTm90aWZ5KEZYX0JPT0wgYkVuYWJsZSkge21fYkVuYWJsZU5vdGlmeSA9IGJFbmFibGU7fQorCXZvaWQJCQkJCQkJCUVuYWJsZU5vdGlmeShib29sIGJFbmFibGUpIHttX2JFbmFibGVOb3RpZnkgPSBiRW5hYmxlO30KIAl2aXJ0dWFsIEZYX0ZMT0FUCQkJCQlHZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKTsKIAlGWF9GTE9BVAkJCQkJCQlHZXRJdGVtTGVmdE1hcmdpbigpOwogCUZYX0ZMT0FUCQkJCQkJCUdldEl0ZW1SaWdodE1hcmdpbigpOwpAQCAtMTU0LDkgKzE1NCw5IEBACiAJdmlydHVhbCB2b2lkCQkJCQkJT25LaWxsRm9jdXMoKTsKIAogcHJpdmF0ZToKLQlGWF9CT09MCQkJCQkJCQltX2JFbmFibGVOb3RpZnk7CisJYm9vbAkJCQkJCQkJbV9iRW5hYmxlTm90aWZ5OwogCUZYX0ZMT0FUCQkJCQkJCW1fZk9sZEl0ZW1IZWlnaHQ7Ci0JRlhfQk9PTAkJCQkJCQkJbV9iU2l6ZUNoYW5nZWQ7CisJYm9vbAkJCQkJCQkJbV9iU2l6ZUNoYW5nZWQ7CiAJRlhfRkxPQVQJCQkJCQkJbV9mT2xkTWluOwogCUZYX0ZMT0FUCQkJCQkJCW1fZk9sZE1heDsKIH07CkBAIC0xODgsOSArMTg4LDkgQEAKIAogCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCQkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7CiAJdmlydHVhbCB2b2lkCQkJCQkJT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtID0gMCwgaW50cHRyX3QgbFBhcmFtID0gMCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKIAotCXZvaWQJCQkJCQkJCVNldEVkaXRGb2N1cyhGWF9CT09MIGJMYXN0KTsKKwl2b2lkCQkJCQkJCQlTZXRFZGl0Rm9jdXMoYm9vbCBiTGFzdCk7CiAJQ1BXTF9FZGl0KgkJCQkJCQlHZXRFZGl0KCkgY29uc3Q7CiAKIHB1YmxpYzoKQEAgLTIwMyw4ICsyMDMsOCBAQAogCUlQV0xfTm90ZUl0ZW0qCQkJCQkJR2V0U3ViSXRlbXMoaW50MzJfdCBpbmRleCkgY29uc3Q7CiAKIAl2aXJ0dWFsIElQV0xfTm90ZUl0ZW0qCQkJCUdldEhpdE5vdGVJdGVtKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2b2lkCQkJCQkJCQlFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpOwotCXZvaWQJCQkJCQkJCUVuYWJsZU1vZGlmeShGWF9CT09MIGJFbmFibGVkKTsKKwl2b2lkCQkJCQkJCQlFbmFibGVSZWFkKGJvb2wgYkVuYWJsZWQpOworCXZvaWQJCQkJCQkJCUVuYWJsZU1vZGlmeShib29sIGJFbmFibGVkKTsKIAogcHJvdGVjdGVkOgogCXZpcnR1YWwgdm9pZAkJCQkJCUNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKQEAgLTIzMSw3ICsyMzEsNyBAQAogCXZpcnR1YWwgaW50MzJfdAkJCQkJQ291bnRTdWJJdGVtcygpIGNvbnN0OwogCXZpcnR1YWwgSVBXTF9Ob3RlSXRlbSoJCQkJR2V0U3ViSXRlbXMoaW50MzJfdCBpbmRleCkgY29uc3Q7CiAJdmlydHVhbCB2b2lkCQkJCQkJRGVsZXRlU3ViSXRlbShJUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0pOwotCXZpcnR1YWwgdm9pZAkJCQkJCVNldEZvY3VzKCl7U2V0Tm90ZUZvY3VzKEZBTFNFKTt9CisJdmlydHVhbCB2b2lkCQkJCQkJU2V0Rm9jdXMoKXtTZXROb3RlRm9jdXMoZmFsc2UpO30KIAogCXZpcnR1YWwgSVBXTF9Ob3RlSXRlbSoJCQkJR2V0UGFyZW50SXRlbSgpIGNvbnN0OwogCXZpcnR1YWwgdm9pZCoJCQkJCQlHZXRQcml2YXRlRGF0YSgpIGNvbnN0OwpAQCAtMjQwLDE5ICsyNDAsMTkgQEAKIAl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQkJCUdldENvbnRlbnRzKCkgY29uc3Q7CiAJdmlydHVhbCBGWF9TWVNURU1USU1FCQkJCUdldERhdGVUaW1lKCkgY29uc3Q7CiAJdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCQlHZXRTdWJqZWN0TmFtZSgpIGNvbnN0OwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCUlzVG9wSXRlbSgpIGNvbnN0IHsgcmV0dXJuIEZBTFNFO30KKwl2aXJ0dWFsIGJvb2wJCQkJCQlJc1RvcEl0ZW0oKSBjb25zdCB7IHJldHVybiBmYWxzZTt9CiAJdmlydHVhbCBDUFdMX0VkaXQqCQkJCQlHZXRFZGl0KCkgY29uc3Q7CiAKIHB1YmxpYzoKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJCU9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwogCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCQkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7CiAJdmlydHVhbCBJUFdMX05vdGVJdGVtKgkJCQlHZXRIaXROb3RlSXRlbShjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAJdmlydHVhbCBJUFdMX05vdGVJdGVtKgkJCQlHZXRGb2N1c2VkTm90ZUl0ZW0oKSBjb25zdDsKIAogCXZpcnR1YWwgdm9pZAkJCQkJCVJlc2V0U3ViamVjdE5hbWUoaW50MzJfdCBuSXRlbUluZGV4KTsKLQl2b2lkCQkJCQkJCQlFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpOwotCXZvaWQJCQkJCQkJCUVuYWJsZU1vZGlmeShGWF9CT09MIGJFbmFibGVkKTsKKwl2b2lkCQkJCQkJCQlFbmFibGVSZWFkKGJvb2wgYkVuYWJsZWQpOworCXZvaWQJCQkJCQkJCUVuYWJsZU1vZGlmeShib29sIGJFbmFibGVkKTsKIAogcHJvdGVjdGVkOgogCXZpcnR1YWwgdm9pZAkJCQkJCVJlUG9zQ2hpbGRXbmQoKTsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCUNQV0xfTm90ZUl0ZW0qCQkJCQkJQ3JlYXRlTm90ZUl0ZW0oKTsKIAlDUFdMX05vdGVJdGVtKgkJCQkJCUdldFBhcmVudE5vdGVJdGVtKCkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJCQlTZXROb3RlRm9jdXMoRlhfQk9PTCBiTGFzdCk7CisJdm9pZAkJCQkJCQkJU2V0Tm90ZUZvY3VzKGJvb2wgYkxhc3QpOwogCXZvaWQJCQkJCQkJCU9uQ29udGVudHNWYWxpZGF0ZSgpOwogCiAJdm9pZAkJCQkJCQkJT25DcmVhdGVOb3RlSXRlbSgpOwpAQCAtMjg5LDggKzI4OSw4IEBACiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCQltX3NBdXRob3I7CiAKIAlGWF9GTE9BVAkJCQkJCQltX2ZPbGRJdGVtSGVpZ2h0OwotCUZYX0JPT0wJCQkJCQkJCW1fYlNpemVDaGFuZ2VkOwotCUZYX0JPT0wJCQkJCQkJCW1fYkFsbG93TW9kaWZ5OworCWJvb2wJCQkJCQkJCW1fYlNpemVDaGFuZ2VkOworCWJvb2wJCQkJCQkJCW1fYkFsbG93TW9kaWZ5OwogfTsKIAogY2xhc3MgUFdMX0NMQVNTIENQV0xfTm90ZSA6IHB1YmxpYyBDUFdMX05vdGVJdGVtCkBAIC0zMDUsMTcgKzMwNSwxNyBAQAogCXZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCQkJR2V0QXV0aG9yTmFtZSgpIGNvbnN0OwogCXZpcnR1YWwgdm9pZAkJCQkJCVNldEJrQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOwogCXZpcnR1YWwgdm9pZAkJCQkJCVJlc2V0U3ViamVjdE5hbWUoaW50MzJfdCBuSXRlbUluZGV4KXt9Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJSXNUb3BJdGVtKCkgY29uc3Qge3JldHVybiBUUlVFO30KKwl2aXJ0dWFsIGJvb2wJCQkJCQlJc1RvcEl0ZW0oKSBjb25zdCB7cmV0dXJuIHRydWU7fQogCXZpcnR1YWwgY29uc3QgQ1BXTF9Ob3RlKgkJCUdldE5vdGUoKSBjb25zdDsKIAl2aXJ0dWFsIElQV0xfTm90ZU5vdGlmeSoJCQlHZXROb3RlTm90aWZ5KCkgY29uc3Q7CiAKIHB1YmxpYzoKIAlJUFdMX05vdGVJdGVtKgkJCQkJCVJlcGx5KCk7Ci0Jdm9pZAkJCQkJCQkJRW5hYmxlTm90aWZ5KEZYX0JPT0wgYkVuYWJsZWQpOworCXZvaWQJCQkJCQkJCUVuYWJsZU5vdGlmeShib29sIGJFbmFibGVkKTsKIAl2b2lkCQkJCQkJCQlTZXRJY29uVHlwZShpbnQzMl90IG5UeXBlKTsKIAl2b2lkCQkJCQkJCQlTZXRPcHRpb25zVGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RleHQpOwotCXZvaWQJCQkJCQkJCUVuYWJsZVJlYWQoRlhfQk9PTCBiRW5hYmxlZCk7Ci0Jdm9pZAkJCQkJCQkJRW5hYmxlTW9kaWZ5KEZYX0JPT0wgYkVuYWJsZWQpOworCXZvaWQJCQkJCQkJCUVuYWJsZVJlYWQoYm9vbCBiRW5hYmxlZCk7CisJdm9pZAkJCQkJCQkJRW5hYmxlTW9kaWZ5KGJvb2wgYkVuYWJsZWQpOwogCiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCQlHZXRSZXBseVN0cmluZygpIGNvbnN0OwogCXZvaWQJCQkJCQkJCVNldFJlcGx5U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpOwpAQCAtMzI2LDkgKzMyNiw5IEBACiAJSVBvcHVwX05vdGUqCQkJCQkJR2V0UG9wdXBOb3RlKCkgY29uc3Qge3JldHVybiBtX3BQb3B1cE5vdGU7fQogCiBwdWJsaWM6Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlPblJCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJCU9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJCU9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwogCiBwcm90ZWN0ZWQ6CiAJdmlydHVhbCB2b2lkCQkJCQkJUmVQb3NDaGlsZFduZCgpOwpAQCAtMzM2LDkgKzMzNiw5IEBACiAKIAl2aXJ0dWFsIHZvaWQJCQkJCQlPbk5vdGlmeShDUFdMX1duZCogcFduZCwgRlhfRFdPUkQgbXNnLCBpbnRwdHJfdCB3UGFyYW0gPSAwLCBpbnRwdHJfdCBsUGFyYW0gPSAwKTsKIAotCUZYX0JPT0wJCQkJCQkJCVJlc2V0U2Nyb2xsQmFyKCk7CisJYm9vbAkJCQkJCQkJUmVzZXRTY3JvbGxCYXIoKTsKIAl2b2lkCQkJCQkJCQlSZVBvc05vdGVDaGlsZHJlbigpOwotCUZYX0JPT0wJCQkJCQkJCVNjcm9sbEJhclNob3VsZFZpc2libGUoKTsKKwlib29sCQkJCQkJCQlTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCk7CiAKIHByaXZhdGU6CiAJQ1BXTF9MYWJlbCoJCQkJCQkJbV9wQXV0aG9yOwpAQCAtMzQ5LDEwICszNDksMTAgQEAKIAlDUFdMX1Njcm9sbEJhcioJCQkJCQltX3BDb250ZW50c0JhcjsKIAlDUFdMX05vdGVfT3B0aW9ucyoJCQkJCW1fcE9wdGlvbnM7CiAJSVBXTF9Ob3RlTm90aWZ5KgkJCQkJbV9wTm90ZU5vdGlmeTsKLQlGWF9CT09MCQkJCQkJCQltX2JSZXNpemluZzsKKwlib29sCQkJCQkJCQltX2JSZXNpemluZzsKIAlQV0xfU0NST0xMX0lORk8JCQkJCQltX09sZFNjcm9sbEluZm87CiAJQ1BERl9SZWN0CQkJCQkJCW1fcmNDYXB0aW9uOwotCUZYX0JPT0wJCQkJCQkJCW1fYkVuYWxibGVOb3RpZnk7CisJYm9vbAkJCQkJCQkJbV9iRW5hbGJsZU5vdGlmeTsKIAlJUG9wdXBfTm90ZSoJCQkJCQltX3BQb3B1cE5vdGU7CiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCQltX3NSZXBseVN0cmluZzsKIH07CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5oCmluZGV4IDAzOTAyMjIuLjQ3MzU5MjIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5oCkBAIC00OSwxNSArNDksMTUgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJT25DcmVhdGUoUFdMX0NSRUFURVBBUkFNICYgY3ApOwogCXZpcnR1YWwgdm9pZAkJCQlHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKTsKIAl2aXJ0dWFsIHZvaWQJCQkJRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKIAogcHJvdGVjdGVkOgogCVBXTF9TQ1JPTExCQVJfVFlQRQkJCW1fZVNjcm9sbEJhclR5cGU7CiAJUFdMX1NCQlVUVE9OX1RZUEUJCQltX2VTQkJ1dHRvblR5cGU7CiAKLQlGWF9CT09MCQkJCQkJbV9iTW91c2VEb3duOworCWJvb2wJCQkJCQltX2JNb3VzZURvd247CiB9OwogCiBzdHJ1Y3QgUFdMX0ZMT0FUUkFOR0UKQEAgLTY3LDcgKzY3LDcgQEAKIAlQV0xfRkxPQVRSQU5HRShGWF9GTE9BVCBtaW4sRlhfRkxPQVQgbWF4KTsKIAl2b2lkIERlZmF1bHQoKTsKIAl2b2lkIFNldChGWF9GTE9BVCBtaW4sRlhfRkxPQVQgbWF4KTsKLQlGWF9CT09MCUluKEZYX0ZMT0FUIHgpIGNvbnN0OworCWJvb2wJSW4oRlhfRkxPQVQgeCkgY29uc3Q7CiAJRlhfRkxPQVQgR2V0V2lkdGgoKSBjb25zdDsKIAogCUZYX0ZMT0FUIGZNaW4sZk1heDsKQEAgLTgzLDcgKzgzLDcgQEAKIAl2b2lkIFNldENsaWVudFdpZHRoKEZYX0ZMT0FUIHdpZHRoKTsKIAl2b2lkIFNldFNtYWxsU3RlcChGWF9GTE9BVCBzdGVwKTsKIAl2b2lkIFNldEJpZ1N0ZXAoRlhfRkxPQVQgc3RlcCk7Ci0JRlhfQk9PTCBTZXRQb3MoRlhfRkxPQVQgcG9zKTsKKwlib29sIFNldFBvcyhGWF9GTE9BVCBwb3MpOwogCiAJdm9pZCBBZGRTbWFsbCgpOwogCXZvaWQgU3ViU21hbGwoKTsKQEAgLTExMCw4ICsxMTAsOCBAQAogCXZpcnR1YWwgdm9pZAkJCQlHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKTsKIAl2aXJ0dWFsIHZvaWQJCQkJRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKIAl2aXJ0dWFsIHZvaWQJCQkJT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtID0gMCwgaW50cHRyX3QgbFBhcmFtID0gMCk7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwpAQCAtMTE5LDEyICsxMTksMTIgQEAKIAlGWF9GTE9BVAkJCQkJR2V0U2Nyb2xsQmFyV2lkdGgoKSBjb25zdDsKIAlQV0xfU0NST0xMQkFSX1RZUEUJCQlHZXRTY3JvbGxCYXJUeXBlKCkgY29uc3Qge3JldHVybiBtX3NiVHlwZTt9OwogCi0Jdm9pZAkJCQkJCVNldE5vdGlmeUZvcmV2ZXIoRlhfQk9PTCBiRm9yZXZlcikge21fYk5vdGlmeUZvcmV2ZXIgPSBiRm9yZXZlcjt9CisJdm9pZAkJCQkJCVNldE5vdGlmeUZvcmV2ZXIoYm9vbCBiRm9yZXZlcikge21fYk5vdGlmeUZvcmV2ZXIgPSBiRm9yZXZlcjt9CiAKIHByb3RlY3RlZDoKIAl2b2lkCQkJCQkJU2V0U2Nyb2xsUmFuZ2UoRlhfRkxPQVQgZk1pbixGWF9GTE9BVCBmTWF4LEZYX0ZMT0FUIGZDbGllbnRXaWR0aCk7CiAJdm9pZAkJCQkJCVNldFNjcm9sbFBvcyhGWF9GTE9BVCBmUG9zKTsKLQl2b2lkCQkJCQkJTW92ZVBvc0J1dHRvbihGWF9CT09MIGJSZWZyZXNoKTsKKwl2b2lkCQkJCQkJTW92ZVBvc0J1dHRvbihib29sIGJSZWZyZXNoKTsKIAl2b2lkCQkJCQkJU2V0U2Nyb2xsU3RlcChGWF9GTE9BVCBmQmlnU3RlcCxGWF9GTE9BVCBmU21hbGxTdGVwKTsKIAl2b2lkCQkJCQkJTm90aWZ5U2Nyb2xsV2luZG93KCk7CiAJQ1BERl9SZWN0CQkJCQlHZXRTY3JvbGxBcmVhKCkgY29uc3Q7CkBAIC0xNTYsOSArMTU2LDkgQEAKIAlDUFdMX1NCQnV0dG9uKgkJCQltX3BNYXhCdXR0b247CiAJQ1BXTF9TQkJ1dHRvbioJCQkJbV9wUG9zQnV0dG9uOwogCVBXTF9TQ1JPTExfUFJJVkFURURBVEEJCW1fc0RhdGE7Ci0JRlhfQk9PTAkJCQkJCW1fYk1vdXNlRG93bjsKLQlGWF9CT09MCQkJCQkJbV9iTWluT3JNYXg7Ci0JRlhfQk9PTAkJCQkJCW1fYk5vdGlmeUZvcmV2ZXI7CisJYm9vbAkJCQkJCW1fYk1vdXNlRG93bjsKKwlib29sCQkJCQkJbV9iTWluT3JNYXg7CisJYm9vbAkJCQkJCW1fYk5vdGlmeUZvcmV2ZXI7CiAJRlhfRkxPQVQJCQkJCW1fbk9sZFBvczsKIAlGWF9GTE9BVAkJCQkJbV9mT2xkUG9zQnV0dG9uOwogfTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1NpZ25hdHVyZS5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU2lnbmF0dXJlLmgKaW5kZXggYzk0NTI3Ny4uYzU1NTdkNiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU2lnbmF0dXJlLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU2lnbmF0dXJlLmgKQEAgLTQzLDkgKzQzLDkgQEAKIAl2b2lkCQkJCQkJCQlTZXRJbWFnZShDRlhfRElCU291cmNlKiBwSW1hZ2UpOwogCXZvaWQJCQkJCQkJCVNldEltYWdlU3RyZWFtKENQREZfU3RyZWFtICogcFN0cmVhbSwgY29uc3QgRlhfQ0hBUiogc0ltYWdlQWxpYXMpOwogCi0Jdm9pZAkJCQkJCQkJU2V0VGV4dEZsYWcoRlhfQk9PTCBiVGV4dEV4aXN0KTsKLQl2b2lkCQkJCQkJCQlTZXRJbWFnZUZsYWcoRlhfQk9PTCBiSW1hZ2VFeGlzdCk7Ci0Jdm9pZAkJCQkJCQkJU2V0Rm94aXRGbGFnKEZYX0JPT0wgYkZsYWdFeGlzdCk7CisJdm9pZAkJCQkJCQkJU2V0VGV4dEZsYWcoYm9vbCBiVGV4dEV4aXN0KTsKKwl2b2lkCQkJCQkJCQlTZXRJbWFnZUZsYWcoYm9vbCBiSW1hZ2VFeGlzdCk7CisJdm9pZAkJCQkJCQkJU2V0Rm94aXRGbGFnKGJvb2wgYkZsYWdFeGlzdCk7CiAKIHByb3RlY3RlZDoKIAl2aXJ0dWFsIHZvaWQJCQkJCQlSZVBvc0NoaWxkV25kKCk7CkBAIC01OSw5ICs1OSw5IEBACiAJQ1BXTF9MYWJlbCoJCQkJCQkJbV9wRGVzY3JpcHRpb247CiAJQ1BXTF9TaWduYXR1cmVfSW1hZ2UqCQkJCW1fcEltYWdlOwogCi0JRlhfQk9PTAkJCQkJCQkJbV9iVGV4dEV4aXN0OwotCUZYX0JPT0wJCQkJCQkJCW1fYkltYWdlRXhpc3Q7Ci0JRlhfQk9PTAkJCQkJCQkJbV9iRmxhZ0V4aXN0OworCWJvb2wJCQkJCQkJCW1fYlRleHRFeGlzdDsKKwlib29sCQkJCQkJCQltX2JJbWFnZUV4aXN0OworCWJvb2wJCQkJCQkJCW1fYkZsYWdFeGlzdDsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfU0lHTkFUVVJFX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmgKaW5kZXggZjY2NTlkZi4uMTRlNTc2ZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1NwZWNpYWxCdXR0b24uaApAQCAtMjYsMTQgKzI2LDE0IEBACiAJdmlydHVhbCB+Q1BXTF9DaGVja0JveCgpOwogCiAJdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKIAotCXZvaWQJCQkJCQlTZXRDaGVjayhGWF9CT09MIGJDaGVjayk7Ci0JRlhfQk9PTAkJCQkJCUlzQ2hlY2tlZCgpIGNvbnN0OworCXZvaWQJCQkJCQlTZXRDaGVjayhib29sIGJDaGVjayk7CisJYm9vbAkJCQkJCUlzQ2hlY2tlZCgpIGNvbnN0OwogCiBwcml2YXRlOgotCUZYX0JPT0wJCQkJCQltX2JDaGVja2VkOworCWJvb2wJCQkJCQltX2JDaGVja2VkOwogfTsKIAogY2xhc3MgUFdMX0NMQVNTIENQV0xfUmFkaW9CdXR0b24gOiBwdWJsaWMgQ1BXTF9CdXR0b24KQEAgLTQzLDE0ICs0MywxNCBAQAogCXZpcnR1YWwgfkNQV0xfUmFkaW9CdXR0b24oKTsKIAogCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldENsYXNzTmFtZSgpIGNvbnN0OwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CiAKLQl2b2lkCQkJCQkJU2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2spOwotCUZYX0JPT0wJCQkJCQlJc0NoZWNrZWQoKSBjb25zdDsKKwl2b2lkCQkJCQkJU2V0Q2hlY2soYm9vbCBiQ2hlY2spOworCWJvb2wJCQkJCQlJc0NoZWNrZWQoKSBjb25zdDsKIAogcHJpdmF0ZToKLQlGWF9CT09MCQkJCQkJbV9iQ2hlY2tlZDsKKwlib29sCQkJCQkJbV9iQ2hlY2tlZDsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfU1BFQ0lBTEJVVFRPTl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1V0aWxzLmgKaW5kZXggMmRhMGY0Mi4uZjFlMzRjOSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oCkBAIC0xMDksOCArMTA5LDggQEAKIHB1YmxpYzoKIAlzdGF0aWMgQ1BERl9SZWN0CQkJCQkJSW5mbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0JiByY1JlY3QsIEZYX0ZMT0FUIGZTaXplKTsKIAlzdGF0aWMgQ1BERl9SZWN0CQkJCQkJRGVmbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0JiByY1JlY3QsIEZYX0ZMT0FUIGZTaXplKTsKLQlzdGF0aWMgRlhfQk9PTAkJCQkJCQlJbnRlcnNlY3RSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdDEsIGNvbnN0IENQREZfUmVjdCYgcmVjdDIpOwotCXN0YXRpYyBGWF9CT09MCQkJCQkJCUNvbnRhaW5zUmVjdChjb25zdCBDUERGX1JlY3QmIHJjUGFyZW50LCBjb25zdCBDUERGX1JlY3QmIHJjQ2hpbGQpOworCXN0YXRpYyBib29sCQkJCQkJCUludGVyc2VjdFJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0MSwgY29uc3QgQ1BERl9SZWN0JiByZWN0Mik7CisJc3RhdGljIGJvb2wJCQkJCQkJQ29udGFpbnNSZWN0KGNvbnN0IENQREZfUmVjdCYgcmNQYXJlbnQsIGNvbnN0IENQREZfUmVjdCYgcmNDaGlsZCk7CiAJc3RhdGljIENQREZfUmVjdAkJCQkJCVNjYWxlUmVjdChjb25zdCBDUERGX1JlY3QmIHJjUmVjdCxGWF9GTE9BVCBmU2NhbGUpOwogCXN0YXRpYyBDUFZUX1dvcmRSYW5nZQkJCQkJT3ZlcmxhcFdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IxLCBjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IyKTsKIAlzdGF0aWMgQ1BERl9SZWN0CQkJCQkJR2V0Q2VudGVyU3F1YXJlKGNvbnN0IENQREZfUmVjdCAmIHJlY3QpOwpAQCAtMTIwLDEwICsxMjAsMTAgQEAKIAlzdGF0aWMgQ1BERl9SZWN0CQkJCQkJT2Zmc2V0UmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0LEZYX0ZMT0FUIHgsRlhfRkxPQVQgeSk7CiAJc3RhdGljIENQREZfUG9pbnQJCQkJCQlPZmZzZXRQb2ludChjb25zdCAgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0ZMT0FUIHgsRlhfRkxPQVQgeSk7CiAJc3RhdGljIEZYX0NPTE9SUkVGCQkJCQkJUFdMQ29sb3JUb0ZYQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsIGludDMyX3QgblRyYW5zcGFyYW5jeSA9IDI1NSk7Ci0Jc3RhdGljIEZYX0JPT0wJCQkJCQkJSXNCbGFja09yV2hpdGUoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOworCXN0YXRpYyBib29sCQkJCQkJCUlzQmxhY2tPcldoaXRlKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKIAlzdGF0aWMgQ1BXTF9Db2xvcgkJCQkJCUdldFJldmVyc2VDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7CiAKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldENvbG9yQXBwU3RyZWFtKGNvbnN0IENQV0xfQ29sb3IgJiBjb2xvcixjb25zdCBGWF9CT09MICYgYkZpbGxPclN0cm9rZSA9IFRSVUUpOworCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0Q29sb3JBcHBTdHJlYW0oY29uc3QgQ1BXTF9Db2xvciAmIGNvbG9yLGNvbnN0IGJvb2wgJiBiRmlsbE9yU3Ryb2tlID0gdHJ1ZSk7CiAJc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRCb3JkZXJBcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0ICYgcmVjdCwgRlhfRkxPQVQgZldpZHRoLAogCQkJCQkJCQkJCQkJY29uc3QgQ1BXTF9Db2xvciAmIGNvbG9yLCBjb25zdCBDUFdMX0NvbG9yICYgY3JMZWZ0VG9wLCBjb25zdCBDUFdMX0NvbG9yICYgY3JSaWdodEJvdHRvbSwKIAkJCQkJCQkJCQkJCWludDMyX3QgblN0eWxlLCBjb25zdCBDUFdMX0Rhc2ggJiBkYXNoKTsKQEAgLTE0OSw3ICsxNDksNyBAQAogCQkJCQkJCQkJCQkJCQljb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KTsKIAogCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0RWRpdEFwcFN0cmVhbShJRlhfRWRpdCogcEVkaXQsIGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgKiBwUmFuZ2UgPSBOVUxMLAotCQkJCQkJCQkJCQkJCQlGWF9CT09MIGJDb250aW51b3VzID0gVFJVRSwgRlhfV09SRCBTdWJXb3JkID0gMCk7CisJCQkJCQkJCQkJCQkJCWJvb2wgYkNvbnRpbnVvdXMgPSB0cnVlLCBGWF9XT1JEIFN1YldvcmQgPSAwKTsKIAlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldEVkaXRTZWxBcHBTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LCBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsCiAJCQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfV29yZFJhbmdlICogcFJhbmdlID0gTlVMTCk7CiAJc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRTcGVsbENoZWNrQXBwU3RyZWFtKElGWF9FZGl0KiBwRWRpdCwgSVBXTF9TcGVsbENoZWNrKiBwU3BlbGxDaGVjaywKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCQkJCQkJCQkJCQkJCQljb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZSA9IE5VTEwpOwogCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0VGV4dEFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsSUZYX0VkaXRfRm9udE1hcCAqIHBGb250TWFwLAogCQkJCQkJCQkJCQkJCQljb25zdCBDRlhfV2lkZVN0cmluZyAmIHNUZXh0LCBpbnQzMl90IG5BbGlnbm1lbnRILCBpbnQzMl90IG5BbGlnbm1lbnRWLAotCQkJCQkJCQkJCQkJCQlGWF9GTE9BVCBmRm9udFNpemUsIEZYX0JPT0wgYk11bHRpTGluZSwgRlhfQk9PTCBiQXV0b1JldHVybiwgY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCk7CisJCQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZGb250U2l6ZSwgYm9vbCBiTXVsdGlMaW5lLCBib29sIGJBdXRvUmV0dXJuLCBjb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KTsKIAlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldERyb3BCdXR0b25BcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0ICYgcmNCQm94KTsKIAogCXN0YXRpYyB2b2lkCQkJCQkJCQlEcmF3RmlsbFJlY3QoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSxjb25zdCBDUERGX1JlY3QgJiByZWN0LApAQCAtMTc1LDcgKzE3NSw3IEBACiAJc3RhdGljIHZvaWQJCQkJCQkJCURyYXdGaWxsQXJlYShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAogCQkJCQkJCQkJCQkJCQljb25zdCBDUERGX1BvaW50KiBwUHRzLCBpbnQzMl90IG5Db3VudCwgY29uc3QgRlhfQ09MT1JSRUYmIGNvbG9yKTsKIAlzdGF0aWMgdm9pZAkJCQkJCQkJRHJhd1NoYWRvdyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkJCQkJCQkJCQkJCQlGWF9CT09MIGJWZXJ0aWNhbCwgRlhfQk9PTCBiSG9yaXpvbnRhbCwgQ1BERl9SZWN0IHJlY3QsCisJCQkJCQkJCQkJCQkJCWJvb2wgYlZlcnRpY2FsLCBib29sIGJIb3Jpem9udGFsLCBDUERGX1JlY3QgcmVjdCwKIAkJCQkJCQkJCQkJCQkJaW50MzJfdCBuVHJhbnNwYXJhbmN5LCBpbnQzMl90IG5TdGFydEdyYXksIGludDMyX3QgbkVuZEdyYXkpOwogCXN0YXRpYyB2b2lkCQkJCQkJCQlEcmF3RWRpdFNwZWxsQ2hlY2soQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwgSUZYX0VkaXQqIHBFZGl0LAogCQkJCQkJCQkJCQkJCQljb25zdCBDUERGX1JlY3QmIHJjQ2xpcCwgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oCmluZGV4IGM1YjZjYTQuLjNiMWQyOTkgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oCkBAIC0xMzcsNyArMTM3LDcgQEAKIAlGWF9GTE9BVAkJCQkJZkNvbG9yMSxmQ29sb3IyLGZDb2xvcjMsZkNvbG9yNDsKIH07CiAKLWlubGluZSBGWF9CT09MIG9wZXJhdG9yID09IChjb25zdCBDUFdMX0NvbG9yICZjMSwgY29uc3QgQ1BXTF9Db2xvciAmYzIpCitpbmxpbmUgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQ1BXTF9Db2xvciAmYzEsIGNvbnN0IENQV0xfQ29sb3IgJmMyKQogewogCXJldHVybiBjMS5uQ29sb3JUeXBlID09IGMyLm5Db2xvclR5cGUgJiYKIAkJYzEuZkNvbG9yMSAtIGMyLmZDb2xvcjEgPCAwLjAwMDEgJiYgYzEuZkNvbG9yMSAtIGMyLmZDb2xvcjEgPiAtMC4wMDAxICYmCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAkJYzEuZkNvbG9yNCAtIGMyLmZDb2xvcjQgPCAwLjAwMDEgJiYgYzEuZkNvbG9yNCAtIGMyLmZDb2xvcjQgPiAtMC4wMDAxOwogfQogCi1pbmxpbmUgRlhfQk9PTCBvcGVyYXRvciAhPSAoY29uc3QgQ1BXTF9Db2xvciAmYzEsIGNvbnN0IENQV0xfQ29sb3IgJmMyKQoraW5saW5lIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IENQV0xfQ29sb3IgJmMxLCBjb25zdCBDUFdMX0NvbG9yICZjMikKIHsKIAlyZXR1cm4gIW9wZXJhdG9yID09IChjMSwgYzIpOwogfQpAQCAtMTczLDcgKzE3Myw3IEBACiB7CiBwdWJsaWM6CiAgICAgICAgIHZpcnR1YWwgfklQV0xfU3BlbGxDaGVjaygpIHsgfQotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlDaGVja1dvcmQoY29uc3QgRlhfQ0hBUiogc1dvcmQpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJQ2hlY2tXb3JkKGNvbnN0IEZYX0NIQVIqIHNXb3JkKSA9IDA7CiAJdmlydHVhbCB2b2lkCQkJCQkJCVN1Z2dlc3RXb3Jkcyhjb25zdCBGWF9DSEFSKiBzV29yZCwgQ0ZYX0J5dGVTdHJpbmdBcnJheSAmIHNTdWdnZXN0KSA9IDA7CiB9OwogCkBAIC0yOTgsMjUgKzI5OCwyNSBAQAogCXZvaWQJCQkJCQkJQ3JlYXRlKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKIAl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7CiAJdm9pZAkJCQkJCQlEZXN0cm95KCk7Ci0Jdm9pZAkJCQkJCQlNb3ZlKGNvbnN0IENQREZfUmVjdCAmIHJjTmV3LEZYX0JPT0wgYlJlc2V0LEZYX0JPT0wgYlJlZnJlc2gpOworCXZvaWQJCQkJCQkJTW92ZShjb25zdCBDUERGX1JlY3QgJiByY05ldyxib29sIGJSZXNldCxib29sIGJSZWZyZXNoKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCUludmFsaWRhdGVSZWN0KENQREZfUmVjdCogcFJlY3QgPSBOVUxMKTsKIAogCXZvaWQJCQkJCQkJR2V0QXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVN0cmluZyAmIHNBcHBTdHJlYW0pOwogCXZvaWQJCQkJCQkJRHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbktleVVwKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbkxCdXR0b25EYmxDbGsoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbk1CdXR0b25EYmxDbGsoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbk1CdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25NQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPblJCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uS2V5VXAoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uTEJ1dHRvbkRibENsayhjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uTUJ1dHRvbkRibENsayhjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uTUJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPbk1CdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uUkJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPblJCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJCVNldEZvY3VzKCk7CiAJdmlydHVhbCB2b2lkCQkJCQlLaWxsRm9jdXMoKTsKQEAgLTMyNiw3ICszMjYsNyBAQAogCXZpcnR1YWwgdm9pZAkJCQkJT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtID0gMCwgaW50cHRyX3QgbFBhcmFtID0gMCk7CiAJdmlydHVhbCB2b2lkCQkJCQlTZXRUZXh0Q29sb3IoY29uc3QgQ1BXTF9Db2xvciAmIGNvbG9yKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCVNldFRleHRTdHJva2VDb2xvcihjb25zdCBDUFdMX0NvbG9yICYgY29sb3IpOwotCXZpcnR1YWwgdm9pZAkJCQkJU2V0VmlzaWJsZShGWF9CT09MIGJWaXNpYmxlKTsKKwl2aXJ0dWFsIHZvaWQJCQkJCVNldFZpc2libGUoYm9vbCBiVmlzaWJsZSk7CiAKIAl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRGb2N1c1JlY3QoKSBjb25zdDsKIAl2aXJ0dWFsIENQV0xfQ29sb3IJCQkJR2V0QmFja2dyb3VuZENvbG9yKCkgY29uc3Q7CkBAIC0zMzgsNyArMzM4LDcgQEAKIAl2aXJ0dWFsIENQV0xfQ29sb3IJCQkJR2V0Qm9yZGVyTGVmdFRvcENvbG9yKGludDMyX3QgbkJvcmRlclN0eWxlKSBjb25zdDsKIAl2aXJ0dWFsIENQV0xfQ29sb3IJCQkJR2V0Qm9yZGVyUmlnaHRCb3R0b21Db2xvcihpbnQzMl90IG5Cb3JkZXJTdHlsZSkgY29uc3Q7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCUlzTW9kaWZpZWQoKSBjb25zdCB7cmV0dXJuIEZBTFNFO30KKwl2aXJ0dWFsIGJvb2wJCQkJCUlzTW9kaWZpZWQoKSBjb25zdCB7cmV0dXJuIGZhbHNlO30KIAogCXZpcnR1YWwgdm9pZAkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKIApAQCAtMzU2LDggKzM1Niw4IEBACiAJQ1BERl9SZWN0CQkJCQkJR2V0Q2xpZW50Q2VudGVyU3F1YXJlKCkgY29uc3Q7CiAJQ1BERl9SZWN0CQkJCQkJR2V0V2luZG93Q2VudGVyU3F1YXJlKCkgY29uc3Q7CiAJaW50MzJfdAkJCQkJCUdldEJvcmRlcldpZHRoKCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlJc1Zpc2libGUoKSBjb25zdCB7cmV0dXJuIG1fYlZpc2libGU7fQotCUZYX0JPT0wJCQkJCQkJSGFzRmxhZyhGWF9EV09SRCBkd0ZsYWdzKSBjb25zdDsKKwlib29sCQkJCQkJCUlzVmlzaWJsZSgpIGNvbnN0IHtyZXR1cm4gbV9iVmlzaWJsZTt9CisJYm9vbAkJCQkJCQlIYXNGbGFnKEZYX0RXT1JEIGR3RmxhZ3MpIGNvbnN0OwogCXZvaWQJCQkJCQkJQWRkRmxhZyhGWF9EV09SRCBkd0ZsYWdzKTsKIAl2b2lkCQkJCQkJCVJlbW92ZUZsYWcoRlhfRFdPUkQgZHdGbGFncyk7CiAJQ1BERl9SZWN0CQkJCQkJR2V0Q2xpcFJlY3QoKSBjb25zdDsKQEAgLTM2NiwxMyArMzY2LDEzIEBACiAJQ1BXTF9EYXNoCQkJCQkJR2V0Qm9yZGVyRGFzaCgpIGNvbnN0OwogCXZvaWQqCQkJCQkJCUdldEF0dGFjaGVkRGF0YSgpIGNvbnN0OwogCi0JRlhfQk9PTAkJCQkJCQlXbmRIaXRUZXN0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlDbGllbnRIaXRUZXN0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlJc0NhcHR1cmVNb3VzZSgpIGNvbnN0OworCWJvb2wJCQkJCQkJV25kSGl0VGVzdChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0OworCWJvb2wJCQkJCQkJQ2xpZW50SGl0VGVzdChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0OworCWJvb2wJCQkJCQkJSXNDYXB0dXJlTW91c2UoKSBjb25zdDsKIAogCWNvbnN0IENQV0xfV25kKgkJCQkJR2V0Rm9jdXNlZCgpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNGb2N1c2VkKCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlJc1JlYWRPbmx5KCkgY29uc3Q7CisJYm9vbAkJCQkJCQlJc0ZvY3VzZWQoKSBjb25zdDsKKwlib29sCQkJCQkJCUlzUmVhZE9ubHkoKSBjb25zdDsKIAlDUFdMX1Njcm9sbEJhcioJCQkJCUdldFZTY3JvbGxCYXIoKSBjb25zdDsKIAogCUlGWF9FZGl0X0ZvbnRNYXAqCQkJCUdldEZvbnRNYXAoKSBjb25zdDsKQEAgLTM5OCw4ICszOTgsOCBAQAogCXZpcnR1YWwgRlhfRkxPQVQJCQkJR2V0SXRlbUxlZnRNYXJnaW4oKSB7cmV0dXJuIDA7fQogCXZpcnR1YWwgRlhfRkxPQVQJCQkJR2V0SXRlbVJpZ2h0TWFyZ2luKCkge3JldHVybiAwO30KIAotCXZvaWQJCQkJCQkJRW5hYmxlV2luZG93KEZYX0JPT0wgYkVuYWJsZSk7Ci0JRlhfQk9PTAkJCQkJCQlJc0VuYWJsZWQoKTsKKwl2b2lkCQkJCQkJCUVuYWJsZVdpbmRvdyhib29sIGJFbmFibGUpOworCWJvb2wJCQkJCQkJSXNFbmFibGVkKCk7CiAJdmlydHVhbCB2b2lkCQkJCQlTZXRDdXJzb3IoKTsKIAogcHJvdGVjdGVkOgpAQCAtNDIyLDExICs0MjIsMTEgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJCU9uRW5hYmxlZCgpOwogCXZpcnR1YWwgdm9pZAkJCQkJT25EaXNhYmxlZCgpOwogCi0Jdm9pZAkJCQkJCQlTZXROb3RpZnlGbGFnKEZYX0JPT0wgYk5vdGlmeWluZyA9IFRSVUUpe21fYk5vdGlmeWluZyA9IGJOb3RpZnlpbmc7fTsKKwl2b2lkCQkJCQkJCVNldE5vdGlmeUZsYWcoYm9vbCBiTm90aWZ5aW5nID0gdHJ1ZSl7bV9iTm90aWZ5aW5nID0gYk5vdGlmeWluZzt9OwogCi0JRlhfQk9PTAkJCQkJCQlJc1ZhbGlkKCkgY29uc3Q7CisJYm9vbAkJCQkJCQlJc1ZhbGlkKCkgY29uc3Q7CiAJUFdMX0NSRUFURVBBUkFNCQkJCQlHZXRDcmVhdGlvblBhcmFtKCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlJc05vdGlmeWluZygpIGNvbnN0IHtyZXR1cm4gbV9iTm90aWZ5aW5nO30KKwlib29sCQkJCQkJCUlzTm90aWZ5aW5nKCkgY29uc3Qge3JldHVybiBtX2JOb3RpZnlpbmc7fQogCiAJdm9pZAkJCQkJCQlJbnZhbGlkYXRlUmVjdE1vdmUoY29uc3QgQ1BERl9SZWN0ICYgcmNPbGQsIGNvbnN0IENQREZfUmVjdCAmIHJjTmV3KTsKIApAQCAtNDM0LDE0ICs0MzQsMTQgQEAKIAlGWF9SRUNUCQkJCQkJCVBXTHRvV25kKGNvbnN0IENQREZfUmVjdCAmIHJlY3QpIGNvbnN0OwogCUZYX0hXTkQJCQkJCQkJR2V0QXR0YWNoZWRIV25kKCkgY29uc3Q7CiAKLQlGWF9CT09MCQkJCQkJCUlzV25kQ2FwdHVyZU1vdXNlKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlJc1duZENhcHR1cmVLZXlib2FyZChjb25zdCBDUFdMX1duZCAqIHBXbmQpIGNvbnN0OworCWJvb2wJCQkJCQkJSXNXbmRDYXB0dXJlTW91c2UoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdDsKKwlib29sCQkJCQkJCUlzV25kQ2FwdHVyZUtleWJvYXJkKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3Q7CiAJY29uc3QgQ1BXTF9XbmQqCQkJCQlHZXRSb290V25kKCkgY29uc3Q7CiAKLQlGWF9CT09MCQkJCQkJCUlzQ1RSTHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNTSElGVHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNBTFRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzSU5TRVJUcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3Q7CisJYm9vbAkJCQkJCQlJc0NUUkxwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdDsKKwlib29sCQkJCQkJCUlzU0hJRlRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdDsKKwlib29sCQkJCQkJCUlzQUxUcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3Q7CisJYm9vbAkJCQkJCQlJc0lOU0VSVHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0OwogCiBwcml2YXRlOgogCXZvaWQJCQkJCQkJQWRkQ2hpbGQoQ1BXTF9XbmQgKiBwV25kKTsKQEAgLTQ2NywxMCArNDY3LDEwIEBACiAJQ1BERl9SZWN0CQkJCQkJbV9yY1dpbmRvdzsKIAlDUERGX1JlY3QJCQkJCQltX3JjQ2xpcDsKIAotCUZYX0JPT0wJCQkJCQkJbV9iQ3JlYXRlZDsKLQlGWF9CT09MCQkJCQkJCW1fYlZpc2libGU7Ci0JRlhfQk9PTAkJCQkJCQltX2JOb3RpZnlpbmc7Ci0JRlhfQk9PTAkJCQkJCQltX2JFbmFibGVkOworCWJvb2wJCQkJCQkJbV9iQ3JlYXRlZDsKKwlib29sCQkJCQkJCW1fYlZpc2libGU7CisJYm9vbAkJCQkJCQltX2JOb3RpZnlpbmc7CisJYm9vbAkJCQkJCQltX2JFbmFibGVkOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9XTkRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NCQV9Gb250bWFwLmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NCQV9Gb250bWFwLmNwcAppbmRleCA2OTlhN2U0Li42NTcwYjNlIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9DQkFfRm9udG1hcC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ0JBX0ZvbnRtYXAuY3BwCkBAIC0yMzAsNyArMjMwLDcgQEAKIAogCUNQREZfRGljdGlvbmFyeSogcEFjcm9Gb3JtRGljdCA9IE5VTEw7CiAKLQlGWF9CT09MIGJXaWRnZXQgPSAobV9wQW5ub3REaWN0LT5HZXRTdHJpbmcoIlN1YnR5cGUiKSA9PSAiV2lkZ2V0Iik7CisJYm9vbCBiV2lkZ2V0ID0gKG1fcEFubm90RGljdC0+R2V0U3RyaW5nKCJTdWJ0eXBlIikgPT0gIldpZGdldCIpOwogCiAJaWYgKGJXaWRnZXQpCiAJewpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ2hlY2tCb3guY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ2hlY2tCb3guY3BwCmluZGV4IDU1ZDJkNDUuLjcyZmY1NzUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9DaGVja0JveC5jcHAKQEAgLTMxLDE4ICszMSwxOCBAQAogCXJldHVybiBwV25kOwogfQogCi1GWF9CT09MCUNGRkxfQ2hlY2tCb3g6Ok9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKQorYm9vbAlDRkZMX0NoZWNrQm94OjpPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncykKIHsKIAlzd2l0Y2ggKG5LZXlDb2RlKQogCXsKIAljYXNlIEZXTF9WS0VZX1JldHVybjoKIAljYXNlIEZXTF9WS0VZX1NwYWNlOgotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25LZXlEb3duKHBBbm5vdCwgbktleUNvZGUsIG5GbGFncyk7CiAJfQogfQotRlhfQk9PTAlDRkZMX0NoZWNrQm94OjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykKK2Jvb2wJQ0ZGTF9DaGVja0JveDo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpCiB7CiAJc3dpdGNoIChuQ2hhcikKIAl7CkBAIC01NSw1NyArNTUsNTcgQEAKIAkJCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBBbm5vdC0+R2V0UGFnZVZpZXcoKTsKIAkJCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CiAKLQkJCUZYX0JPT0wgYlJlc2V0ID0gRkFMU0U7Ci0JCQlGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisJCQlib29sIGJSZXNldCA9IGZhbHNlOworCQkJYm9vbCBiRXhpdCA9IGZhbHNlOwogCiAJCQlwSUZvcm1GaWxsZXItPk9uQnV0dG9uVXAobV9wV2lkZ2V0LCBwUGFnZVZpZXcsIGJSZXNldCwgYkV4aXQsbkZsYWdzKTsKIAotCQkJaWYgKGJSZXNldCkgcmV0dXJuIFRSVUU7Ci0JCQlpZiAoYkV4aXQpIHJldHVybiBUUlVFOworCQkJaWYgKGJSZXNldCkgcmV0dXJuIHRydWU7CisJCQlpZiAoYkV4aXQpIHJldHVybiB0cnVlOwogCiAJCQlDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOwogCi0JCQlpZiAoQ1BXTF9DaGVja0JveCAqIHBXbmQgPSAoQ1BXTF9DaGVja0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCisJCQlpZiAoQ1BXTF9DaGVja0JveCAqIHBXbmQgPSAoQ1BXTF9DaGVja0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgdHJ1ZSkpCiAJCQkJcFduZC0+U2V0Q2hlY2soIXBXbmQtPklzQ2hlY2tlZCgpKTsKIAogCQkJQ29tbWl0RGF0YShwUGFnZVZpZXcsbkZsYWdzKTsKLQkJCXJldHVybiBUUlVFOworCQkJcmV0dXJuIHRydWU7CiAJCX0KIAlkZWZhdWx0OgogCQlyZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKIAl9CiB9CiAKLUZYX0JPT0wgQ0ZGTF9DaGVja0JveDo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ0ZGTF9DaGVja0JveDo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKIAlDRkZMX0J1dHRvbjo6T25MQnV0dG9uVXAocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogCiAJaWYgKElzVmFsaWQoKSkKIAl7Ci0JCWlmIChDUFdMX0NoZWNrQm94ICogcFduZCA9IChDUFdMX0NoZWNrQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKKwkJaWYgKENQV0xfQ2hlY2tCb3ggKiBwV25kID0gKENQV0xfQ2hlY2tCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpKQogCQl7CiAJCQlDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwogCQkJcFduZC0+U2V0Q2hlY2soIXBXaWRnZXQtPklzQ2hlY2tlZCgpKTsKIAkJLy8JcFduZC0+U2V0Q2hlY2soIXBXbmQtPklzQ2hlY2tlZCgpKTsKIAkJfQogCi0JCWlmICghQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFncykpIHJldHVybiBGQUxTRTsKKwkJaWYgKCFDb21taXREYXRhKHBQYWdlVmlldywgbkZsYWdzKSkgcmV0dXJuIGZhbHNlOwogCX0KIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MCUNGRkxfQ2hlY2tCb3g6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQorYm9vbAlDRkZMX0NoZWNrQm94OjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKIHsKIAogCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiAKLQlpZiAoQ1BXTF9DaGVja0JveCogcFduZCA9IChDUFdMX0NoZWNrQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisJaWYgKENQV0xfQ2hlY2tCb3gqIHBXbmQgPSAoQ1BXTF9DaGVja0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogCXsKIAkJcmV0dXJuIHBXbmQtPklzQ2hlY2tlZCgpICE9IG1fcFdpZGdldC0+SXNDaGVja2VkKCk7CiAJfQogCi0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBDRkZMX0NoZWNrQm94OjpTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCkBAIC0xMTMsMTAgKzExMywxMCBAQAogCiAJQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKIAotCWlmIChDUFdMX0NoZWNrQm94KiBwV25kID0gKENQV0xfQ2hlY2tCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKwlpZiAoQ1BXTF9DaGVja0JveCogcFduZCA9IChDUFdMX0NoZWNrQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAJewogCi0JCUZYX0JPT0wgYk5ld0NoZWNrZWQgPSBwV25kLT5Jc0NoZWNrZWQoKTsKKwkJYm9vbCBiTmV3Q2hlY2tlZCA9IHBXbmQtPklzQ2hlY2tlZCgpOwogCiAKIAkJaWYgKGJOZXdDaGVja2VkKQpAQCAtMTM2LDcgKzEzNiw3IEBACiAJCQl9CiAJCX0KIAotCQltX3BXaWRnZXQtPlNldENoZWNrKGJOZXdDaGVja2VkLCBGQUxTRSk7CisJCW1fcFdpZGdldC0+U2V0Q2hlY2soYk5ld0NoZWNrZWQsIGZhbHNlKTsKIAkJbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOwogCQlTZXRDaGFuZ2VNYXJrKCk7CiAJfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ29tYm9Cb3guY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ29tYm9Cb3guY3BwCmluZGV4IDg0MWI0NWUuLmQ2ZDRkM2QgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5jcHAKQEAgLTc4LDE2ICs3OCwxNiBAQAogfQogCiAKLUZYX0JPT0wgQ0ZGTF9Db21ib0JveDo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpCitib29sIENGRkxfQ29tYm9Cb3g6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQogewogICAgIHJldHVybiBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOwogfQogCi1GWF9CT09MIENGRkxfQ29tYm9Cb3g6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQorYm9vbCBDRkZMX0NvbWJvQm94OjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKIHsKLSAgICBDUFdMX0NvbWJvQm94KiBwV25kID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKKyAgICBDUFdMX0NvbWJvQm94KiBwV25kID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKTsKICAgICBpZiAoIXBXbmQpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgaW50MzJfdCBuQ3VyU2VsID0gcFduZC0+R2V0U2VsZWN0KCk7CiAgICAgaWYgKCEobV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfRURJVCkpCkBAIC0xMDMsMjggKzEwMywyOCBAQAogewogICAgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiAKLSAgICBpZiAoQ1BXTF9Db21ib0JveCogcFduZCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisgICAgaWYgKENQV0xfQ29tYm9Cb3gqIHBXbmQgPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogICAgIHsKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dUZXh0ID0gcFduZC0+R2V0VGV4dCgpOwogICAgICAgICBpbnQzMl90IG5DdXJTZWwgPSBwV25kLT5HZXRTZWxlY3QoKTsKIAogICAgICAgICAvL21hbnRpczowMDA0MTU3Ci0gICAgICAgIEZYX0JPT0wgYlNldFZhbHVlID0gVFJVRTsKKyAgICAgICAgYm9vbCBiU2V0VmFsdWUgPSB0cnVlOwogCiAgICAgICAgIGlmIChtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19FRElUKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobkN1clNlbCA+PSAwKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChzd1RleHQgIT0gbV9wV2lkZ2V0LT5HZXRPcHRpb25MYWJlbChuQ3VyU2VsKSkKLSAgICAgICAgICAgICAgICAgICAgYlNldFZhbHVlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYlNldFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGJTZXRWYWx1ZSA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBiU2V0VmFsdWUgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBiU2V0VmFsdWUgPSBUUlVFOworICAgICAgICAgICAgICAgIGJTZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQotICAgICAgICAgICAgYlNldFZhbHVlID0gRkFMU0U7CisgICAgICAgICAgICBiU2V0VmFsdWUgPSBmYWxzZTsKIAogICAgICAgICBDRlhfV2lkZVN0cmluZyBzT2xkVmFsdWU7CiAKQEAgLTEzMiwxNSArMTMyLDE1IEBACiAgICAgICAgIGlmIChiU2V0VmFsdWUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHNPbGRWYWx1ZSA9IG1fcFdpZGdldC0+R2V0VmFsdWUoKTsKLSAgICAgICAgICAgIG1fcFdpZGdldC0+U2V0VmFsdWUoc3dUZXh0LCBGQUxTRSk7CisgICAgICAgICAgICBtX3BXaWRnZXQtPlNldFZhbHVlKHN3VGV4dCwgZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgbV9wV2lkZ2V0LT5HZXRTZWxlY3RlZEluZGV4KDApOwotICAgICAgICAgICAgbV9wV2lkZ2V0LT5TZXRPcHRpb25TZWxlY3Rpb24obkN1clNlbCwgVFJVRSwgRkFMU0UpOworICAgICAgICAgICAgbV9wV2lkZ2V0LT5TZXRPcHRpb25TZWxlY3Rpb24obkN1clNlbCwgdHJ1ZSwgZmFsc2UpOwogICAgICAgICB9CiAKLSAgICAgICAgbV9wV2lkZ2V0LT5SZXNldEZpZWxkQXBwZWFyYW5jZShUUlVFKTsKKyAgICAgICAgbV9wV2lkZ2V0LT5SZXNldEZpZWxkQXBwZWFyYW5jZSh0cnVlKTsKICAgICAgICAgbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOwogICAgICAgICBTZXRDaGFuZ2VNYXJrKCk7CiAKQEAgLTE1NSw3ICsxNTUsNyBAQAogICAgIHN3aXRjaCAodHlwZSkKICAgICB7CiAgICAgY2FzZSBDUERGX0FBY3Rpb246OktleVN0cm9rZToKLSAgICAgICAgaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisgICAgICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKSpwQ29tYm9Cb3gpCiAgICAgICAgICAgICB7CkBAIC0xNzcsNyArMTc3LDcgQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIENQREZfQUFjdGlvbjo6VmFsaWRhdGU6Ci0gICAgICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgICAgICBpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKENQV0xfRWRpdCogcEVkaXQgPSAoQ1BXTF9FZGl0KikqcENvbWJvQm94KQogICAgICAgICAgICAgewpAQCAtMjAzLDcgKzIwMyw3IEBACiAgICAgc3dpdGNoICh0eXBlKQogICAgIHsKICAgICBjYXNlIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlOgotICAgICAgICBpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKyAgICAgICAgaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChDUFdMX0VkaXQqIHBFZGl0ID0gKENQV0xfRWRpdCopKnBDb21ib0JveCkKICAgICAgICAgICAgIHsKQEAgLTIxNyw3ICsyMTcsNyBAQAogICAgIH0KIH0KIAotRlhfQk9PTCBDRkZMX0NvbWJvQm94OjpJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU9sZCwKK2Jvb2wgQ0ZGTF9Db21ib0JveDo6SXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KQogewogICAgIHN3aXRjaCAodHlwZSkKQEAgLTIyOSwxNCArMjI5LDE0IEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ0ZGTF9Db21ib0JveDo6U2F2ZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKIHsKICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogCi0gICAgaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisgICAgaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAgICAgewogICAgICAgICBtX1N0YXRlLm5JbmRleCA9IHBDb21ib0JveC0+R2V0U2VsZWN0KCk7CiAKQEAgLTI1Miw3ICsyNTIsNyBAQAogewogICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CiAKLSAgICBpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKQorICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgdHJ1ZSkpCiAgICAgewogICAgICAgICBpZiAobV9TdGF0ZS5uSW5kZXggPj0gMCkKICAgICAgICAgICAgIHBDb21ib0JveC0+U2V0U2VsZWN0KG1fU3RhdGUubkluZGV4KTsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogICAgIH0KIH0KIAotQ1BXTF9XbmQqIENGRkxfQ29tYm9Cb3g6OlJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCBiUmVzdG9yZVZhbHVlKQorQ1BXTF9XbmQqIENGRkxfQ29tYm9Cb3g6OlJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCBiUmVzdG9yZVZhbHVlKQogewogICAgIGlmIChiUmVzdG9yZVZhbHVlKQogICAgICAgICBTYXZlU3RhdGUocFBhZ2VWaWV3KTsKQEAgLTI3OSwxNyArMjc5LDE3IEBACiAgICAgaWYgKGJSZXN0b3JlVmFsdWUpCiAgICAgewogICAgICAgICBSZXN0b3JlU3RhdGUocFBhZ2VWaWV3KTsKLSAgICAgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKKyAgICAgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKTsKICAgICB9CiAgICAgZWxzZQotICAgICAgICBwUmV0ID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSk7CisgICAgICAgIHBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCB0cnVlKTsKIAogICAgIG1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKIAogICAgIHJldHVybiBwUmV0OwogfQogCi12b2lkIENGRkxfQ29tYm9Cb3g6Ok9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24sIEZYX1VJTlQgbkZsYWcpCit2b2lkIENGRkxfQ29tYm9Cb3g6Ok9uS2V5U3Ryb2tlKGJvb2wgYktleURvd24sIEZYX1VJTlQgbkZsYWcpCiB7CiAgICAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKIApAQCAtMzA1LDcgKzMwNSw3IEBACiAgICAgICAgICAgICBpZiAoQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFnKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBEZXN0cm95UERGV2luZG93KHBQYWdlVmlldyk7Ci0gICAgICAgICAgICAgICAgbV9iVmFsaWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBtX2JWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzI4LDcgKzMyOCw3IEBACiAgICAgICAgIGludCBuQ2hhcmFjdGVycyA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNVVEZUZXh0ID0gd3NUZXh0LlVURjE2TEVfRW5jb2RlKCk7CiAgICAgICAgIHVuc2lnbmVkIHNob3J0KiBwQnVmZmVyID0gKHVuc2lnbmVkIHNob3J0Kilic1VURlRleHQuY19zdHIoKTsKLSAgICAgICAgbV9wQXBwLT5GRklfT25TZXRGaWVsZElucHV0Rm9jdXMobV9wV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSwgcEJ1ZmZlciwgbkNoYXJhY3RlcnMsIFRSVUUpOworICAgICAgICBtX3BBcHAtPkZGSV9PblNldEZpZWxkSW5wdXRGb2N1cyhtX3BXaWRnZXQtPkdldEZvcm1GaWVsZCgpLCBwQnVmZmVyLCBuQ2hhcmFjdGVycywgdHJ1ZSk7CiAKICAgICAgICAgcEVkaXQtPlNldEVkaXROb3RpZnkodGhpcyk7CiAgICAgfQpAQCAtMzM5LDI1ICszMzksMjUgQEAKICAgICBBU1NFUlQobV9wQXBwICE9IE5VTEwpOwogfQogCi1GWF9CT09MIENGRkxfQ29tYm9Cb3g6OkNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQorYm9vbCBDRkZMX0NvbWJvQm94OjpDYW5Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKICAgICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX0NvbWJvQm94OjpDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQorYm9vbCBDRkZMX0NvbWJvQm94OjpDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewogICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGRkxfQ29tYm9Cb3g6OkNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK2Jvb2wgQ0ZGTF9Db21ib0JveDo6Q2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewogICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENGRkxfQ29tYm9Cb3g6Ok9uQWRkVW5kbyhDUFdMX0VkaXQqIHBFZGl0KQpAQCAtMzcxLDcgKzM3MSw3IEBACiAKICAgICBpbnQgbkV4cG9ydCA9IC0xOwogICAgIENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7Ci0gICAgaWYgKENQV0xfQ29tYm9Cb3ggKiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgIGlmIChDUFdMX0NvbWJvQm94ICogcENvbWJvQm94ID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIG5FeHBvcnQgPSBwQ29tYm9Cb3gtPkdldFNlbGVjdCgpOwogICAgIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5jcHAKaW5kZXggMTgxMWNiMC4uMzRhYTE3YyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5jcHAKQEAgLTIwLDcgKzIwLDcgQEAKIENGRkxfRm9ybUZpbGxlcjo6Q0ZGTF9Gb3JtRmlsbGVyKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKICAgICA6IG1fcEFwcChwQXBwKSwKICAgICAgIG1fcEFubm90KHBBbm5vdCksCi0gICAgICBtX2JWYWxpZChGQUxTRSksCisgICAgICBtX2JWYWxpZChmYWxzZSksCiAgICAgICBtX3B0T2xkUG9zKDAsMCkKIHsKICAgICBtX3BXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKSBwQW5ub3Q7CkBAIC00MCwxNSArNDAsMTUgQEAKIAogdm9pZCBDRkZMX0Zvcm1GaWxsZXI6OlNldFdpbmRvd1JlY3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBjb25zdCBDUERGX1JlY3QmIHJjV2luZG93KQogewotICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKyAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAgICAgewotICAgICAgICBwV25kLT5Nb3ZlKENQREZfUmVjdChyY1dpbmRvdyksIFRSVUUsIEZBTFNFKTsKKyAgICAgICAgcFduZC0+TW92ZShDUERGX1JlY3QocmNXaW5kb3cpLCB0cnVlLCBmYWxzZSk7CiAgICAgfQogfQogCiBDUERGX1JlY3QgQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRXaW5kb3dSZWN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKIHsKLSAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisgICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogICAgIHsKICAgICAgICAgcmV0dXJuIHBXbmQtPkdldFdpbmRvd1JlY3QoKTsKICAgICB9CkBAIC02Myw3ICs2Myw3IEBACiAKICAgICBDUERGX1JlY3QgcmNBbm5vdCA9IG1fcFdpZGdldC0+R2V0UmVjdCgpOwogCi0gICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIENQREZfUmVjdCByY1dpbmRvdyA9IHBXbmQtPkdldFdpbmRvd1JlY3QoKTsKICAgICAgICAgcmNBbm5vdCA9IFBXTHRvRkZMKHJjV2luZG93KTsKQEAgLTg2LDcgKzg2LDcgQEAKIHsKICAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwogCi0gICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKyAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogICAgIHsKICAgICAgICAgQ1BERl9NYXRyaXggbXQgPSBHZXRDdXJNYXRyaXgoKTsKICAgICAgICAgbXQuQ29uY2F0KCpwVXNlcjJEZXZpY2UpOwpAQCAtMTMxLDE1MyArMTMxLDE1MyBAQAogICAgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENGRkxfRm9ybUZpbGxlcjo6T25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewotICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKKyAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgdHJ1ZSkpCiAgICAgewotICAgICAgICBtX2JWYWxpZCA9IFRSVUU7CisgICAgICAgIG1fYlZhbGlkID0gdHJ1ZTsKICAgICAgICAgRlhfUkVDVCByZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LHBBbm5vdCk7CiAgICAgICAgIEludmFsaWRhdGVSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKTsKIAogICAgICAgICBpZighcmVjdC5Db250YWlucygoaW50KXBvaW50LngsIChpbnQpcG9pbnQueSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgcmV0dXJuIHBXbmQtPk9uTEJ1dHRvbkRvd24oV25kdG9QV0wocFBhZ2VWaWV3LCBwb2ludCksbkZsYWdzKTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewotICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisgICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIEZYX1JFQ1QgcmNGRkwgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7CiAgICAgICAgIEludmFsaWRhdGVSZWN0KHJjRkZMLmxlZnQsIHJjRkZMLnRvcCwgcmNGRkwucmlnaHQsIHJjRkZMLmJvdHRvbSk7CiAgICAgICAgIHBXbmQtPk9uTEJ1dHRvblVwKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLG5GbGFncyk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENGRkxfRm9ybUZpbGxlcjo6T25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7Ci0gICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKyAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogICAgIHsKICAgICAgICAgcFduZC0+T25MQnV0dG9uRGJsQ2xrKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLG5GbGFncyk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIGlmICgobV9wdE9sZFBvcy54ICE9IHBvaW50LngpIHx8IChtX3B0T2xkUG9zLnkgIT0gcG9pbnQueSkpCiAgICAgewogICAgICAgICBtX3B0T2xkUG9zID0gcG9pbnQ7CiAgICAgfQogCi0gICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKyAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogICAgIHsKICAgICAgICAgcFduZC0+T25Nb3VzZU1vdmUoV25kdG9QV0wocFBhZ2VWaWV3LCBwb2ludCksbkZsYWdzKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7Ci0gICAgaWYgKCFJc1ZhbGlkKCkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIUlzVmFsaWQoKSkgcmV0dXJuIGZhbHNlOwogCi0gICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKQorICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCB0cnVlKSkKICAgICB7CiAgICAgICAgIHJldHVybiBwV25kLT5Pbk1vdXNlV2hlZWwoekRlbHRhLCBXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSxuRmxhZ3MpOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENGRkxfRm9ybUZpbGxlcjo6T25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewotICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKKyAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgdHJ1ZSkpCiAgICAgewogICAgICAgICBwV25kLT5PblJCdXR0b25Eb3duKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLG5GbGFncyk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ0ZGTF9Gb3JtRmlsbGVyOjpPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewotICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisgICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIHBXbmQtPk9uUkJ1dHRvblVwKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLG5GbGFncyk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpCitib29sIENGRkxfRm9ybUZpbGxlcjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpCiB7CiAgICAgaWYgKElzVmFsaWQoKSkKICAgICB7CiAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7CiAgICAgICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CiAKLSAgICAgICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKyAgICAgICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHBXbmQtPk9uS2V5RG93bihuS2V5Q29kZSxuRmxhZ3MpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQorYm9vbCBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQogewogICAgIGlmIChJc1ZhbGlkKCkpCiAgICAgewogICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBHZXRDdXJQYWdlVmlldygpOwogICAgICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogCi0gICAgICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisgICAgICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBwV25kLT5PbkNoYXIobkNoYXIsbkZsYWdzKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZykKK2Jvb2wgQ0ZGTF9Gb3JtRmlsbGVyOjpPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZykKIHsKICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwogICAgIENQREZfUGFnZSogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZQYWdlKCk7CiAgICAgQ1BERlNES19Eb2N1bWVudCogcERvYyA9IG1fcEFwcC0+R2V0U0RLRG9jdW1lbnQoKTsKICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwRG9jLT5HZXRQYWdlVmlldyhwUGFnZSk7Ci0gICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCisgICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgdHJ1ZSkpCiAgICAgICAgIHBXbmQtPlNldEZvY3VzKCk7CiAKLSAgICBtX2JWYWxpZCA9IFRSVUU7CisgICAgbV9iVmFsaWQgPSB0cnVlOwogICAgIEZYX1JFQ1QgcmNSZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LHBBbm5vdCk7CiAgICAgSW52YWxpZGF0ZVJlY3QocmNSZWN0LmxlZnQsIHJjUmVjdC50b3AsIHJjUmVjdC5yaWdodCwgcmNSZWN0LmJvdHRvbSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcpCitib29sIENGRkxfRm9ybUZpbGxlcjo6T25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKQogewogICAgIGlmICghSXNWYWxpZCgpKQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBHZXRDdXJQYWdlVmlldygpOwogICAgIENvbW1pdERhdGEocFBhZ2VWaWV3LCBuRmxhZyk7CiAKLSAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisgICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogICAgICAgICBwV25kLT5LaWxsRm9jdXMoKTsKIAogICAgIHN3aXRjaCAobV9wV2lkZ2V0LT5HZXRGaWVsZFR5cGUoKSkKQEAgLTI4NSwxNiArMjg1LDE2IEBACiAgICAgY2FzZSBGSUVMRFRZUEVfUFVTSEJVVFRPTjoKICAgICBjYXNlIEZJRUxEVFlQRV9DSEVDS0JPWDoKICAgICBjYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKLSAgICAgICAgRXNjYXBlRmlsbGVyKHBQYWdlVmlldywgVFJVRSk7CisgICAgICAgIEVzY2FwZUZpbGxlcihwUGFnZVZpZXcsIHRydWUpOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBFc2NhcGVGaWxsZXIocFBhZ2VWaWV3LCBGQUxTRSk7CisgICAgICAgIEVzY2FwZUZpbGxlcihwUGFnZVZpZXcsIGZhbHNlKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6SXNWYWxpZCgpIGNvbnN0Citib29sIENGRkxfRm9ybUZpbGxlcjo6SXNWYWxpZCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fYlZhbGlkOwogfQpAQCAtMzcwLDcgKzM3MCw3IEBACiAgICAgcmV0dXJuIGNwOwogfQogCi1DUFdMX1duZCogQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJOZXcpCitDUFdMX1duZCogQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sIGJOZXcpCiB7CiAgICAgQVNTRVJUKHBQYWdlVmlldyk7CiAKQEAgLTQ5OSw3ICs0OTksNyBAQAogCiBDUERGX1JlY3QgQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRGb2N1c0JveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCiB7Ci0gICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIENQREZfUmVjdCByY0ZvY3VzID0gRkZMdG9XbmQocFBhZ2VWaWV3LCBQV0x0b0ZGTChwV25kLT5HZXRGb2N1c1JlY3QoKSkpOwogICAgICAgICBDUERGX1JlY3QgcmNQYWdlID0gcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCktPkdldFBhZ2VCQm94KCk7CkBAIC01NjEsNDQgKzU2MSw0NCBAQAogICAgIHJldHVybiByZWN0OwogfQogCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6Q29tbWl0RGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX1VJTlQgbkZsYWcpCitib29sIENGRkxfRm9ybUZpbGxlcjo6Q29tbWl0RGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX1VJTlQgbkZsYWcpCiB7CiAgICAgaWYgKElzRGF0YUNoYW5nZWQocFBhZ2VWaWV3KSkKICAgICB7Ci0gICAgICAgIEZYX0JPT0wgYlJDID0gVFJVRTsKLSAgICAgICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworICAgICAgICBib29sIGJSQyA9IHRydWU7CisgICAgICAgIGJvb2wgYkV4aXQgPSBmYWxzZTsKICAgICAgICAgQ0ZGTF9JRm9ybUZpbGxlciogcElGb3JtRmlsbGVyID0gbV9wQXBwLT5HZXRJRm9ybUZpbGxlcigpOwogICAgICAgICBwSUZvcm1GaWxsZXItPk9uS2V5U3Ryb2tlQ29tbWl0KG1fcFdpZGdldCwgcFBhZ2VWaWV3LCBiUkMsIGJFeGl0LCBuRmxhZyk7CiAgICAgICAgIGlmIChiRXhpdCkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGlmICghYlJDKQogICAgICAgICB7Ci0gICAgICAgICAgICBSZXNldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgUmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIHBJRm9ybUZpbGxlci0+T25WYWxpZGF0ZShtX3BXaWRnZXQsIHBQYWdlVmlldywgYlJDLCBiRXhpdCwgbkZsYWcpOwogICAgICAgICBpZiAoYkV4aXQpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBpZiAoIWJSQykKICAgICAgICAgewotICAgICAgICAgICAgUmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIFJlc2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBTYXZlRGF0YShwUGFnZVZpZXcpOwogICAgICAgICBwSUZvcm1GaWxsZXItPk9uQ2FsY3VsYXRlKG1fcFdpZGdldCwgcFBhZ2VWaWV3LCBiRXhpdCxuRmxhZyk7CiAgICAgICAgIGlmIChiRXhpdCkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICAgICAgcElGb3JtRmlsbGVyLT5PbkZvcm1hdChtX3BXaWRnZXQsIHBQYWdlVmlldywgYkV4aXQsbkZsYWcpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQorYm9vbCBDRkZMX0Zvcm1GaWxsZXI6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCkBAIC02MjEsMTAgKzYyMSwxMCBAQAogewogfQogCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6SXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsCitib29sIENGRkxfRm9ybUZpbGxlcjo6SXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpTYXZlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQpAQCAtNjM1LDkgKzYzNSw5IEBACiB7CiB9CiAKLUNQV0xfV25kKiAgQ0ZGTF9Gb3JtRmlsbGVyOjpSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSkKK0NQV0xfV25kKiAgQ0ZGTF9Gb3JtRmlsbGVyOjpSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wgYlJlc3RvcmVWYWx1ZSkKIHsKLSAgICByZXR1cm4gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpOworICAgIHJldHVybiBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSk7CiB9CiAKIHZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpUaW1lclByb2MoKQpAQCAtNjUwLDEzICs2NTAsMTMgQEAKICAgICByZXR1cm4gbV9wQXBwLT5HZXRTeXNIYW5kbGVyKCk7CiB9CiAKLXZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpPbktleVN0cm9rZShGWF9CT09MIGJLZXlEb3duKQordm9pZCBDRkZMX0Zvcm1GaWxsZXI6Ok9uS2V5U3Ryb2tlKGJvb2wgYktleURvd24pCiB7CiB9CiAKLXZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpFc2NhcGVGaWxsZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJEZXN0cm95UERGV2luZG93KQordm9pZCBDRkZMX0Zvcm1GaWxsZXI6OkVzY2FwZUZpbGxlcihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wgYkRlc3Ryb3lQREZXaW5kb3cpCiB7Ci0gICAgbV9iVmFsaWQgPSBGQUxTRTsKKyAgICBtX2JWYWxpZCA9IGZhbHNlOwogCiAgICAgRlhfUkVDVCByY1JlY3QgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcsIG1fcFdpZGdldCk7CiAgICAgSW52YWxpZGF0ZVJlY3QocmNSZWN0LmxlZnQsIHJjUmVjdC50b3AsIHJjUmVjdC5yaWdodCwgcmNSZWN0LmJvdHRvbSk7CkBAIC02NjUsMTkgKzY2NSwxOSBAQAogICAgICAgICBEZXN0cm95UERGV2luZG93KHBQYWdlVmlldyk7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpDYW5Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK2Jvb2wgQ0ZGTF9Gb3JtRmlsbGVyOjpDYW5Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6Q2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK2Jvb2wgQ0ZGTF9Gb3JtRmlsbGVyOjpDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpDYW5QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCitib29sIENGRkxfRm9ybUZpbGxlcjo6Q2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpEb0NvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQpAQCAtNzAyLDggKzcwMiw4IEBACiAKIENGRkxfQnV0dG9uOjpDRkZMX0J1dHRvbihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwV2lkZ2V0KSA6CiAgICAgQ0ZGTF9Gb3JtRmlsbGVyKHBBcHAsIHBXaWRnZXQpLAotICAgIG1fYk1vdXNlSW4oRkFMU0UpLAotICAgIG1fYk1vdXNlRG93bihGQUxTRSkKKyAgICBtX2JNb3VzZUluKGZhbHNlKSwKKyAgICBtX2JNb3VzZURvd24oZmFsc2UpCiB7CiB9CiAKQEAgLTcxMywxNCArNzEzLDE0IEBACiAKIHZvaWQgQ0ZGTF9CdXR0b246Ok9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKIHsKLSAgICBtX2JNb3VzZUluID0gVFJVRTsKKyAgICBtX2JNb3VzZUluID0gdHJ1ZTsKICAgICBGWF9SRUNUIHJlY3QgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcscEFubm90KTsKICAgICBJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7CiB9CiAKIHZvaWQgQ0ZGTF9CdXR0b246Ok9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KQogewotICAgIG1fYk1vdXNlSW4gPSBGQUxTRTsKKyAgICBtX2JNb3VzZUluID0gZmFsc2U7CiAKICAgICBGWF9SRUNUIHJlY3QgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcscEFubm90KTsKICAgICBJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7CkBAIC03MjgsMzkgKzcyOCwzOSBAQAogICAgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9CdXR0b246Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ0ZGTF9CdXR0b246Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBDUERGX1JlY3QgcmNBbm5vdCA9IHBBbm5vdC0+R2V0UmVjdCgpOwogICAgIGlmKCFyY0Fubm90LkNvbnRhaW5zKHBvaW50LngsIHBvaW50LnkpKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIG1fYk1vdXNlRG93biA9IFRSVUU7Ci0gICAgbV9iVmFsaWQgPSBUUlVFOworICAgIG1fYk1vdXNlRG93biA9IHRydWU7CisgICAgbV9iVmFsaWQgPSB0cnVlOwogICAgIEZYX1JFQ1QgcmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKICAgICBJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9CdXR0b246Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENGRkxfQnV0dG9uOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIENQREZfUmVjdCByY0Fubm90ID0gcEFubm90LT5HZXRSZWN0KCk7CiAgICAgaWYoIXJjQW5ub3QuQ29udGFpbnMocG9pbnQueCwgcG9pbnQueSkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgbV9iTW91c2VEb3duID0gRkFMU0U7CisgICAgbV9iTW91c2VEb3duID0gZmFsc2U7CiAgICAgbV9wV2lkZ2V0LT5HZXRQREZQYWdlKCk7CiAKIAogICAgIEZYX1JFQ1QgcmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKICAgICBJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9CdXR0b246Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENGRkxfQnV0dG9uOjpPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChtX3BBcHAgIT0gTlVMTCk7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBDRkZMX0J1dHRvbjo6T25EcmF3KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuY3BwCmluZGV4IDdjZTgxMWUuLjkyMmQ4YzAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9JRm9ybUZpbGxlci5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKIAogQ0ZGTF9JRm9ybUZpbGxlcjo6Q0ZGTF9JRm9ybUZpbGxlcihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKSA6CiAgICAgbV9wQXBwKHBBcHApLAotICAgIG1fYk5vdGlmeWluZyhGQUxTRSkKKyAgICBtX2JOb3RpZnlpbmcoZmFsc2UpCiB7CiB9CiAKQEAgLTMzLDE3ICszMywxNyBAQAogICAgIG1fTWFwcy5jbGVhcigpOwogfQogCi1GWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6OkFubm90X0hpdFRlc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LENQREZTREtfQW5ub3QqIHBBbm5vdCwgQ1BERl9Qb2ludCBwb2ludCkKK2Jvb2wgQ0ZGTF9JRm9ybUZpbGxlcjo6QW5ub3RfSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsQ1BERlNES19Bbm5vdCogcEFubm90LCBDUERGX1BvaW50IHBvaW50KQogewogICAgIENQREZfUmVjdCByYyA9IHBBbm5vdC0+R2V0UmVjdCgpOwogICAgIGlmKHJjLkNvbnRhaW5zKHBvaW50LngsIHBvaW50LnkpKQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogRlhfUkVDVCBDRkZMX0lGb3JtRmlsbGVyOjpHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKIHsKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQogICAgICAgICByZXR1cm4gcEZvcm1GaWxsZXItPkdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKIAogICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CkBAIC02NSw3ICs2NSw3IEBACiAKICAgICBpZiAoSXNWaXNpYmxlKHBXaWRnZXQpKQogICAgIHsKLSAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQorICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChwRm9ybUZpbGxlci0+SXNWYWxpZCgpKQogICAgICAgICAgICAgewpAQCAtOTgsNyArOTgsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQorICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSkpCiAgICAgICAgICAgICBwRm9ybUZpbGxlci0+T25EcmF3RGVhY3RpdmUocFBhZ2VWaWV3LCBwQW5ub3QsIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgZHdGbGFncyk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHBXaWRnZXQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6Tm9ybWFsLCBOVUxMKTsKQEAgLTExMCw3ICsxMTAsNyBAQAogCiB2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uQ3JlYXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkKIHsKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQogICAgIHsKICAgICAgICAgcEZvcm1GaWxsZXItPk9uQ3JlYXRlKHBBbm5vdCk7CiAgICAgfQpAQCAtMTE4LDcgKzExOCw3IEBACiAKIHZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25Mb2FkKENQREZTREtfQW5ub3QqIHBBbm5vdCkKIHsKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQogICAgIHsKICAgICAgICAgcEZvcm1GaWxsZXItPk9uTG9hZChwQW5ub3QpOwogICAgIH0KQEAgLTEyNiw3ICsxMjYsNyBAQAogCiB2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uRGVsZXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkKIHsKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQogICAgIHsKICAgICAgICAgcEZvcm1GaWxsZXItPk9uRGVsZXRlKHBBbm5vdCk7CiAgICAgfQpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CiAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6Q3Vyc29yRW50ZXIpKQogICAgICAgICB7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOworICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gdHJ1ZTsKIAogICAgICAgICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CiAKQEAgLTE1OCwxMyArMTU4LDEzIEBACiAgICAgICAgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKICAgICAgICAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKICAgICAgICAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OkN1cnNvckVudGVyLCBmYSwgcFBhZ2VWaWV3ICk7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IGZhbHNlOwogCiAgICAgICAgICAgICAvL2lmICggIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBBbm5vdCkgKSByZXR1cm47CiAKICAgICAgICAgICAgIGlmIChwV2lkZ2V0LT5Jc0FwcE1vZGlmaWVkKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKSkKKyAgICAgICAgICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgZmFsc2UpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywgcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSA9PSBuVmFsdWVBZ2UpOwogICAgICAgICAgICAgICAgIH0KQEAgLTE3Miw3ICsxNzIsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgVFJVRSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgdHJ1ZSkpCiAgICAgewogICAgICAgICBwRm9ybUZpbGxlci0+T25Nb3VzZUVudGVyKHBQYWdlVmlldywgcEFubm90KTsKICAgICB9CkBAIC0xODgsNyArMTg4LDcgQEAKICAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKICAgICAgICAgaWYgKHBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpDdXJzb3JFeGl0KSkKICAgICAgICAgewotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKyAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IHRydWU7CiAgICAgICAgICAgICBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CiAgICAgICAgICAgICBpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKICAgICAgICAgICAgIHBXaWRnZXQtPkNsZWFyQXBwTW9kaWZpZWQoKTsKQEAgLTIwMiwxMyArMjAyLDEzIEBACiAgICAgICAgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CiAKICAgICAgICAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OkN1cnNvckV4aXQsIGZhLCBwUGFnZVZpZXcpOwotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CisgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKIAogICAgICAgICAgICAgLy9pZiAoIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBBbm5vdCkpIHJldHVybjsKIAogICAgICAgICAgICAgaWYgKHBXaWRnZXQtPklzQXBwTW9kaWZpZWQoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpKQorICAgICAgICAgICAgICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBmYWxzZSkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwRm9ybUZpbGxlci0+UmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBuVmFsdWVBZ2UgPT0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjE2LDEzICsyMTYsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKKyAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSkpCiAgICAgewogICAgICAgICBwRm9ybUZpbGxlci0+T25Nb3VzZUV4aXQocFBhZ2VWaWV3LCBwQW5ub3QpOwogICAgIH0KIH0KIAotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENGRkxfSUZvcm1GaWxsZXI6Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CkBAIC0yMzIsNyArMjMyLDcgQEAKICAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKICAgICAgICAgaWYgKEFubm90X0hpdFRlc3QocFBhZ2VWaWV3LCBwQW5ub3QsIHBvaW50KSAmJiBwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6QnV0dG9uRG93bikpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IFRSVUU7CisgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSB0cnVlOwogICAgICAgICAgICAgcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOwogICAgICAgICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CiAgICAgICAgICAgICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7CkBAIC0yNDUsMTMgKzI0NSwxMyBAQAogICAgICAgICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZ3MpOwogICAgICAgICAgICAgZmEuYlNoaWZ0ID0gbV9wQXBwLT5GRklfSXNTSElGVEtleURvd24obkZsYWdzKTsKICAgICAgICAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OkJ1dHRvbkRvd24sIGZhLCBwUGFnZVZpZXcpOwotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CisgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKIAotICAgICAgICAgICAgaWYgKCFJc1ZhbGlkQW5ub3QocFBhZ2VWaWV3LCBwQW5ub3QpKSByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIGlmICghSXNWYWxpZEFubm90KHBQYWdlVmlldywgcEFubm90KSkgcmV0dXJuIHRydWU7CiAKICAgICAgICAgICAgIGlmIChwV2lkZ2V0LT5Jc0FwcE1vZGlmaWVkKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKSkKKyAgICAgICAgICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgZmFsc2UpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOwogICAgICAgICAgICAgICAgIH0KQEAgLTI1OSwxNSArMjU5LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQogICAgIHsKICAgICAgICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5PbkxCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENGRkxfSUZvcm1GaWxsZXI6Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwpAQCAtMjg2LDI0ICsyODYsMjQgQEAKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7CisgICAgYm9vbCBiUmV0ID0gZmFsc2U7CiAKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQogICAgIHsKICAgICAgICAgYlJldCA9IHBGb3JtRmlsbGVyLT5PbkxCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAgICAgfQogCiAgICAgaWYgKHBEb2N1bWVudC0+R2V0Rm9jdXNBbm5vdCgpID09IHBBbm5vdCkKICAgICB7Ci0gICAgICAgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLSAgICAgICAgRlhfQk9PTCBiUmVzZXQgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiRXhpdCA9IGZhbHNlOworICAgICAgICBib29sIGJSZXNldCA9IGZhbHNlOwogICAgICAgICBPbkJ1dHRvblVwKHBXaWRnZXQsIHBQYWdlVmlldywgYlJlc2V0LCBiRXhpdCxuRmxhZ3MpOwotICAgICAgICBpZiAoYkV4aXQpIHJldHVybiBUUlVFOworICAgICAgICBpZiAoYkV4aXQpIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gYlJldDsKIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkJ1dHRvblVwKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSZXNldCwgRlhfQk9PTCYgYkV4aXQsRlhfVUlOVCBuRmxhZykKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25CdXR0b25VcChDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sJiBiUmVzZXQsIGJvb2wmIGJFeGl0LEZYX1VJTlQgbkZsYWcpCiB7CiAgICAgQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7CiAKQEAgLTMxMSw3ICszMTEsNyBAQAogICAgIHsKICAgICAgICAgaWYgKHBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpCdXR0b25VcCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IFRSVUU7CisgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSB0cnVlOwogICAgICAgICAgICAgaW50IG5BZ2UgPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CiAgICAgICAgICAgICBpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKIApAQCAtMzI2LDEyMiArMzI2LDEyMiBAQAogICAgICAgICAgICAgZmEuYlNoaWZ0ID0gbV9wQXBwLT5GRklfSXNTSElGVEtleURvd24obkZsYWcpOwogCiAgICAgICAgICAgICBwV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpCdXR0b25VcCwgZmEsIHBQYWdlVmlldyk7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IGZhbHNlOwogCiAgICAgICAgICAgICBpZiAoIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBXaWRnZXQpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJFeGl0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiRXhpdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobkFnZSAhPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKSkKKyAgICAgICAgICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgZmFsc2UpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGJSZXNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYlJlc2V0ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwogCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQorICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25MQnV0dG9uRGJsQ2xrKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENGRkxfSUZvcm1GaWxsZXI6Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwogCiAgICAgLy9jaGFuZ2UgY3Vyc29yCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgVFJVRSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgdHJ1ZSkpCiAgICAgewogICAgICAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uTW91c2VNb3ZlKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENGRkxfSUZvcm1GaWxsZXI6Ok9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwogCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQorICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25Nb3VzZVdoZWVsKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHpEZWx0YSwgcG9pbnQpOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDRkZMX0lGb3JtRmlsbGVyOjpPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwogCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQorICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25SQnV0dG9uRG93bihwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDRkZMX0lGb3JtRmlsbGVyOjpPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAgICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKIAotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKKyAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSkpCiAgICAgewogICAgICAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uUkJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKQorYm9vbCBDRkZMX0lGb3JtRmlsbGVyOjpPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncykKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CiAKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQogICAgIHsKICAgICAgICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5PbktleURvd24ocEFubm90LCBuS2V5Q29kZSwgbkZsYWdzKTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQorYm9vbCBDRkZMX0lGb3JtRmlsbGVyOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykKIHsKICAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwogICAgIGlmIChuQ2hhciA9PSBGV0xfVktFWV9UYWIpCi0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKIAotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKKyAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSkpCiAgICAgICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LEZYX1VJTlQgbkZsYWcpCitib29sIENGRkxfSUZvcm1GaWxsZXI6Ok9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LEZYX1VJTlQgbkZsYWcpCiB7CiAgICAgaWYgKCFwQW5ub3QpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKIApAQCAtNDUwLDcgKzQ1MCw3IEBACiAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CiAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6R2V0Rm9jdXMpKQogICAgICAgICB7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOworICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gdHJ1ZTsKICAgICAgICAgICAgIHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKIAogICAgICAgICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CkBAIC00NjMsMTUgKzQ2MywxNSBAQAogICAgICAgICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CiAgICAgICAgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CiAKLSAgICAgICAgICAgIENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIFRSVUUpOwotICAgICAgICAgICAgaWYoIXBGb3JtRmlsbGVyKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCB0cnVlKTsKKyAgICAgICAgICAgIGlmKCFwRm9ybUZpbGxlcikgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgcEZvcm1GaWxsZXItPkdldEFjdGlvbkRhdGEocFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OkdldEZvY3VzLCBmYSk7CiAgICAgICAgICAgICBwV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpHZXRGb2N1cywgZmEsIHBQYWdlVmlldyk7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IGZhbHNlOwogCiAgICAgICAgICAgICBpZiAocFdpZGdldC0+SXNBcHBNb2RpZmllZCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSkpCisgICAgICAgICAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIGZhbHNlKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKICAgICAgICAgICAgICAgICB9CkBAIC00NzksMTggKzQ3OSwxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgVFJVRSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgdHJ1ZSkpCiAgICAgICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25TZXRGb2N1cyhwQW5ub3QsIG5GbGFnKTsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCxGWF9VSU5UIG5GbGFnKQorYm9vbCBDRkZMX0lGb3JtRmlsbGVyOjpPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsRlhfVUlOVCBuRmxhZykKIHsKLSAgICBpZighcEFubm90KSByZXR1cm4gRkFMU0U7CisgICAgaWYoIXBBbm5vdCkgcmV0dXJuIGZhbHNlOwogICAgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CiAKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQogICAgIHsKICAgICAgICAgaWYgKHBGb3JtRmlsbGVyLT5PbktpbGxGb2N1cyhwQW5ub3QsIG5GbGFnKSkKICAgICAgICAgewpAQCAtNDk5LDcgKzQ5OSw3IEBACiAgICAgICAgICAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKICAgICAgICAgICAgICAgICBpZiAocFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246Okxvc2VGb2N1cykpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7CiAKICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcFdpZGdldC0+R2V0UGFnZVZpZXcoKTsKQEAgLTUxMiwyNCArNTEyLDI0IEBACiAgICAgICAgICAgICAgICAgICAgIHBGb3JtRmlsbGVyLT5HZXRBY3Rpb25EYXRhKHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXMsIGZhKTsKIAogICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXMsIGZhLCBwUGFnZVZpZXcpOwotICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gZmFsc2U7CiAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6OklzVmlzaWJsZShDUERGU0RLX1dpZGdldCogcFdpZGdldCkKK2Jvb2wgQ0ZGTF9JRm9ybUZpbGxlcjo6SXNWaXNpYmxlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KQogewogICAgIHJldHVybiBwV2lkZ2V0LT5Jc1Zpc2libGUoKTsKIH0KIAotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpJc1JlYWRPbmx5KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KQorYm9vbCBDRkZMX0lGb3JtRmlsbGVyOjpJc1JlYWRPbmx5KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KQogewogICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwogCkBAIC01MzgsMTIgKzUzOCwxMiBAQAogICAgIHJldHVybiAobkZpZWxkRmxhZ3MgJiBGSUVMREZMQUdfUkVBRE9OTFkpID09IEZJRUxERkxBR19SRUFET05MWTsKIH0KIAotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpJc0ZpbGxpbmdBbGxvd2VkKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KQorYm9vbCBDRkZMX0lGb3JtRmlsbGVyOjpJc0ZpbGxpbmdBbGxvd2VkKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KQogewogICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwogCiAgICAgaWYgKHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgQ1BERl9QYWdlKiBwUGFnZSA9IHBXaWRnZXQtPkdldFBERlBhZ2UoKTsKQEAgLTU1NywxMCArNTU3LDEwIEBACiAgICAgICAgICAgICAgICAgKGR3UGVybWlzc2lvbnMmRlBERlBFUk1fQU5OT1RfRk9STSkgfHwKICAgICAgICAgICAgIChkd1Blcm1pc3Npb25zJkZQREZQRVJNX01PRElGWSk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1DRkZMX0Zvcm1GaWxsZXIqIENGRkxfSUZvcm1GaWxsZXI6OkdldEZvcm1GaWxsZXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9CT09MIGJSZWdpc3RlcikKK0NGRkxfRm9ybUZpbGxlciogQ0ZGTF9JRm9ybUZpbGxlcjo6R2V0Rm9ybUZpbGxlcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIGJvb2wgYlJlZ2lzdGVyKQogewogICAgIGF1dG8gaXQgPSBtX01hcHMuZmluZChwQW5ub3QpOwogICAgIGlmIChpdCAhPSBtX01hcHMuZW5kKCkpCkBAIC02NjYsNyArNjY2LDcgQEAKICAgICB9CiAKICAgICBGWF9GTE9BVCBmRmFjdEhlaWdodCA9IDA7Ci0gICAgRlhfQk9PTCBiQm90dG9tID0gVFJVRTsKKyAgICBib29sIGJCb3R0b20gPSB0cnVlOwogICAgIEZYX0ZMT0FUIGZNYXhMaXN0Qm94SGVpZ2h0ID0gMDsKICAgICBpZiAoZlBvcHVwTWF4ID4gRkZMX01BWExJU1RCT1hIRUlHSFQpCiAgICAgewpAQCAtNjg1LDI2ICs2ODUsMjYgQEAKICAgICBpZiAoZkJvdHRvbSA+IGZNYXhMaXN0Qm94SGVpZ2h0KQogICAgIHsKICAgICAgICAgZkZhY3RIZWlnaHQgPSBmTWF4TGlzdEJveEhlaWdodDsKLSAgICAgICAgYkJvdHRvbSA9IFRSVUU7CisgICAgICAgIGJCb3R0b20gPSB0cnVlOwogICAgIH0KICAgICBlbHNlCiAgICAgewogICAgICAgICBpZiAoZlRvcCA+IGZNYXhMaXN0Qm94SGVpZ2h0KQogICAgICAgICB7CiAgICAgICAgICAgICBmRmFjdEhlaWdodCA9IGZNYXhMaXN0Qm94SGVpZ2h0OwotICAgICAgICAgICAgYkJvdHRvbSA9IEZBTFNFOworICAgICAgICAgICAgYkJvdHRvbSA9IGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGZUb3AgPiBmQm90dG9tKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZGYWN0SGVpZ2h0ID0gZlRvcDsKLSAgICAgICAgICAgICAgICBiQm90dG9tID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYkJvdHRvbSA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZGYWN0SGVpZ2h0ID0gZkJvdHRvbTsKLSAgICAgICAgICAgICAgICBiQm90dG9tID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiQm90dG9tID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTcxMywxNCArNzEzLDE0IEBACiAgICAgZlBvcHVwUmV0ID0gZkZhY3RIZWlnaHQ7CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25LZXlTdHJva2VDb21taXQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCYgYlJDLCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uS2V5U3Ryb2tlQ29tbWl0KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wmIGJSQywgYm9vbCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQogewogICAgIGlmICghbV9iTm90aWZ5aW5nKQogICAgIHsKICAgICAgICAgQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7CiAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlKSkKICAgICAgICAgewotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKyAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IHRydWU7CiAgICAgICAgICAgICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7CiAKICAgICAgICAgICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CkBAIC03MjgsMTEgKzcyOCwxMSBAQAogICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOwogICAgICAgICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CiAgICAgICAgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7Ci0gICAgICAgICAgICBmYS5iV2lsbENvbW1pdCA9IFRSVUU7Ci0gICAgICAgICAgICBmYS5iS2V5RG93biA9IFRSVUU7Ci0gICAgICAgICAgICBmYS5iUkMgPSBUUlVFOworICAgICAgICAgICAgZmEuYldpbGxDb21taXQgPSB0cnVlOworICAgICAgICAgICAgZmEuYktleURvd24gPSB0cnVlOworICAgICAgICAgICAgZmEuYlJDID0gdHJ1ZTsKIAotICAgICAgICAgICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpOworICAgICAgICAgICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgZmFsc2UpOwogICAgICAgICAgICAgQVNTRVJUKHBGb3JtRmlsbGVyICE9IE5VTEwpOwogCiAgICAgICAgICAgICBwRm9ybUZpbGxlci0+R2V0QWN0aW9uRGF0YShwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlLCBmYSk7CkBAIC03NDQsMTkgKzc0NCwxOSBAQAogICAgICAgICAgICAgYlJDID0gZmEuYlJDOwogLy8gICAgICAgICAgYkV4aXQgPSAhSXNWYWxpZEFubm90KG1fcEFwcCwgcERvY3VtZW50LCBwRG9jVmlldywgcFBhZ2VWaWV3LCBwV2lkZ2V0KTsKIAotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CisgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPblZhbGlkYXRlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSQywgRlhfQk9PTCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPblZhbGlkYXRlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wmIGJSQywgYm9vbCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQogewogICAgIGlmICghbV9iTm90aWZ5aW5nKQogICAgIHsKICAgICAgICAgQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7CiAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6VmFsaWRhdGUpKQogICAgICAgICB7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOworICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gdHJ1ZTsKICAgICAgICAgICAgIHBXaWRnZXQtPkNsZWFyQXBwTW9kaWZpZWQoKTsKIAogICAgICAgICAgICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKQEAgLTc2OCwxMCArNzY4LDEwIEBACiAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7CiAgICAgICAgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKICAgICAgICAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKLSAgICAgICAgICAgIGZhLmJLZXlEb3duID0gVFJVRTsKLSAgICAgICAgICAgIGZhLmJSQyA9IFRSVUU7CisgICAgICAgICAgICBmYS5iS2V5RG93biA9IHRydWU7CisgICAgICAgICAgICBmYS5iUkMgPSB0cnVlOwogCi0gICAgICAgICAgICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSk7CisgICAgICAgICAgICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBmYWxzZSk7CiAgICAgICAgICAgICBBU1NFUlQocEZvcm1GaWxsZXIgIT0gTlVMTCk7CiAKICAgICAgICAgICAgIHBGb3JtRmlsbGVyLT5HZXRBY3Rpb25EYXRhKHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZSwgZmEpOwpAQCAtNzgzLDEyICs3ODMsMTIgQEAKICAgICAgICAgICAgIGJSQyA9IGZhLmJSQzsKIC8vICAgICAgICAgIGJFeGl0ID0gIUlzVmFsaWRBbm5vdChtX3BBcHAsIHBEb2N1bWVudCwgcERvY1ZpZXcsIHBQYWdlVmlldywgcFdpZGdldCk7CiAKLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOworICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25DYWxjdWxhdGUoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkNhbGN1bGF0ZShDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgaWYgKCFtX2JOb3RpZnlpbmcpCiAgICAgewpAQCAtODA2LDExICs4MDYsMTEgQEAKIAogLy8gICAgICBiRXhpdCA9ICFJc1ZhbGlkQW5ub3QobV9wQXBwLCBwRG9jdW1lbnQsIHBEb2NWaWV3LCBwUGFnZVZpZXcsIHBXaWRnZXQpOwogCi0gICAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOworICAgICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKICAgICB9CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25Gb3JtYXQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkZvcm1hdChDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgaWYgKCFtX2JOb3RpZnlpbmcpCiAgICAgewpAQCAtODI0LDcgKzgyNCw3IEBACiAgICAgICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwogICAgICAgICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKIAotICAgICAgICBGWF9CT09MIGJGb3JtYXRlZCA9IEZBTFNFOworICAgICAgICBib29sIGJGb3JtYXRlZCA9IGZhbHNlOwogICAgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBwSW50ZXJGb3JtLT5PbkZvcm1hdChwV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSwgYkZvcm1hdGVkKTsKIAogLy8gICAgICBiRXhpdCA9ICFJc1ZhbGlkQW5ub3QobV9wQXBwLCBwRG9jdW1lbnQsIHBEb2NWaWV3LCBwUGFnZVZpZXcsIHBXaWRnZXQpOwpAQCAtODMzLDE1ICs4MzMsMTUgQEAKIAogICAgICAgICBpZiAoYkZvcm1hdGVkKQogICAgICAgICB7Ci0gICAgICAgICAgICBwSW50ZXJGb3JtLT5SZXNldEZpZWxkQXBwZWFyYW5jZShwV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSwgc1ZhbHVlLmNfc3RyKCksIFRSVUUpOworICAgICAgICAgICAgcEludGVyRm9ybS0+UmVzZXRGaWVsZEFwcGVhcmFuY2UocFdpZGdldC0+R2V0Rm9ybUZpZWxkKCksIHNWYWx1ZS5jX3N0cigpLCB0cnVlKTsKICAgICAgICAgICAgIHBJbnRlckZvcm0tPlVwZGF0ZUZpZWxkKHBXaWRnZXQtPkdldEZvcm1GaWVsZCgpKTsKICAgICAgICAgfQogCi0gICAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOworICAgICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKICAgICB9CiB9CiAKLUZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6SXNWYWxpZEFubm90KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KQorYm9vbCBDRkZMX0lGb3JtRmlsbGVyOjpJc1ZhbGlkQW5ub3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpCiB7CiAKICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwpAQCAtODUwLDI2ICs4NTAsMjYgQEAKICAgICBpZihwUGFnZVZpZXcpCiAgICAgICAgIHJldHVybiBwUGFnZVZpZXctPklzVmFsaWRBbm5vdChwQW5ub3QtPkdldFBERkFubm90KCkpOwogICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25CZWZvcmVLZXlTdHJva2UoRlhfQk9PTCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBpbnQzMl90IG5LZXlDb2RlLAordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkJlZm9yZUtleVN0cm9rZShib29sIGJFZGl0T3JMaXN0LCB2b2lkKiBwUHJpdmF0ZURhdGEsIGludDMyX3QgbktleUNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblNlbFN0YXJ0LCBpbnQgblNlbEVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MICYgYlJDLCBGWF9CT09MICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYktleURvd24sIGJvb2wgJiBiUkMsIGJvb2wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgQVNTRVJUKHBQcml2YXRlRGF0YSAhPSBOVUxMKTsKICAgICBDRkZMX1ByaXZhdGVEYXRhKiBwRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwUHJpdmF0ZURhdGE7CiAgICAgQVNTRVJUKHBEYXRhLT5wV2lkZ2V0ICE9IE5VTEwpOwogCi0gICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocERhdGEtPnBXaWRnZXQsIEZBTFNFKTsKKyAgICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwRGF0YS0+cFdpZGdldCwgZmFsc2UpOwogICAgIEFTU0VSVChwRm9ybUZpbGxlciAhPSBOVUxMKTsKIAogICAgIGlmICghbV9iTm90aWZ5aW5nKQogICAgIHsKICAgICAgICAgaWYgKHBEYXRhLT5wV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlKSkKICAgICAgICAgewotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKyAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IHRydWU7CiAgICAgICAgICAgICBpbnQgbkFnZSA9IHBEYXRhLT5wV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CiAgICAgICAgICAgICBpbnQgblZhbHVlQWdlID0gcERhdGEtPnBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CiAKQEAgLTg4Miw4ICs4ODIsOCBAQAogICAgICAgICAgICAgZmEuc0NoYW5nZSA9IHN0ckNoYW5nZTsKICAgICAgICAgICAgIGZhLnNDaGFuZ2VFeCA9IHN0ckNoYW5nZUV4OwogICAgICAgICAgICAgZmEuYktleURvd24gPSBiS2V5RG93bjsKLSAgICAgICAgICAgIGZhLmJXaWxsQ29tbWl0ID0gRkFMU0U7Ci0gICAgICAgICAgICBmYS5iUkMgPSBUUlVFOworICAgICAgICAgICAgZmEuYldpbGxDb21taXQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZhLmJSQyA9IHRydWU7CiAgICAgICAgICAgICBmYS5uU2VsU3RhcnQgPSBuU2VsU3RhcnQ7CiAgICAgICAgICAgICBmYS5uU2VsRW5kID0gblNlbEVuZDsKIApAQCAtODk1LDggKzg5NSw4IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKCFJc1ZhbGlkQW5ub3QocERhdGEtPnBQYWdlVmlldywgcERhdGEtPnBXaWRnZXQpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KIApAQCAtOTA0LDQ4ICs5MDQsNDggQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIENQV0xfV25kKiBwV25kID0gcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBEYXRhLT5wUGFnZVZpZXcsIG5WYWx1ZUFnZSA9PSBwRGF0YS0+cFdpZGdldC0+R2V0VmFsdWVBZ2UoKSk7CiAgICAgICAgICAgICAgICAgICAgIHBEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBXbmQtPkdldEF0dGFjaGVkRGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBiRXhpdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJFeGl0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoZmEuYlJDKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWxsZXItPlNldEFjdGlvbkRhdGEocERhdGEtPnBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UsIGZhKTsKLSAgICAgICAgICAgICAgICAgICAgYlJDID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJSQyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwRm9ybUZpbGxlci0+UmVzdG9yZVN0YXRlKHBEYXRhLT5wUGFnZVZpZXcpOwotICAgICAgICAgICAgICAgICAgICBiUkMgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYlJDID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHBEb2N1bWVudC0+R2V0Rm9jdXNBbm5vdCgpICE9IHBEYXRhLT5wV2lkZ2V0KQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWxsZXItPkNvbW1pdERhdGEocERhdGEtPnBQYWdlVmlldyxuRmxhZyk7Ci0gICAgICAgICAgICAgICAgICAgIGJFeGl0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoIUlzVmFsaWRBbm5vdChwRGF0YS0+cFBhZ2VWaWV3LCBwRGF0YS0+cFdpZGdldCkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiRXhpdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBiRXhpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQogfQogCi12b2lkICAgIENGRkxfSUZvcm1GaWxsZXI6Ok9uQWZ0ZXJLZXlTdHJva2UoRlhfQk9PTCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBGWF9CT09MICYgYkV4aXQsRlhfRFdPUkQgbkZsYWcpCit2b2lkICAgIENGRkxfSUZvcm1GaWxsZXI6Ok9uQWZ0ZXJLZXlTdHJva2UoYm9vbCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBib29sICYgYkV4aXQsRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgQVNTRVJUKHBQcml2YXRlRGF0YSAhPSBOVUxMKTsKICAgICBDRkZMX1ByaXZhdGVEYXRhKiBwRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwUHJpdmF0ZURhdGE7CiAgICAgQVNTRVJUKHBEYXRhLT5wV2lkZ2V0ICE9IE5VTEwpOwogCi0gICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocERhdGEtPnBXaWRnZXQsIEZBTFNFKTsKKyAgICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwRGF0YS0+cFdpZGdldCwgZmFsc2UpOwogICAgIEFTU0VSVChwRm9ybUZpbGxlciAhPSBOVUxMKTsKIAogICAgIGlmICghYkVkaXRPckxpc3QpCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9MaXN0Qm94LmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guY3BwCmluZGV4IGMxMDVjZmMuLmVmMTEzZGEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guY3BwCkBAIC03Myw3ICs3Myw3IEBACiAJewogCQltX09yaWdpblNlbGVjdGlvbnMuY2xlYXIoKTsKIAotCQlGWF9CT09MIGJTZXRDYXJldCA9IEZBTFNFOworCQlib29sIGJTZXRDYXJldCA9IGZhbHNlOwogCQlmb3IgKGludDMyX3QgaT0wLHN6PW1fcFdpZGdldC0+Q291bnRPcHRpb25zKCk7IGk8c3o7IGkrKykKIAkJewogCQkJaWYgKG1fcFdpZGdldC0+SXNPcHRpb25TZWxlY3RlZChpKSkKQEAgLTgxLDcgKzgxLDcgQEAKIAkJCQlpZiAoIWJTZXRDYXJldCkKIAkJCQl7CiAJCQkJCXBXbmQtPlNldENhcmV0KGkpOwotCQkJCQliU2V0Q2FyZXQgPSBUUlVFOworCQkJCQliU2V0Q2FyZXQgPSB0cnVlOwogCQkJCX0KIAkJCQlwV25kLT5TZWxlY3QoaSk7CiAJCQkJbV9PcmlnaW5TZWxlY3Rpb25zLmluc2VydChpKTsKQEAgLTEwNiwyMyArMTA2LDIzIEBACiB9CiAKIAotRlhfQk9PTAlDRkZMX0xpc3RCb3g6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQorYm9vbAlDRkZMX0xpc3RCb3g6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQogewogCXJldHVybiBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOwogfQogCi1GWF9CT09MIENGRkxfTGlzdEJveDo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCitib29sIENGRkxfTGlzdEJveDo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCiB7Ci0gICAgQ1BXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDUFdMX0xpc3RCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKKyAgICBDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpOwogICAgIGlmICghcExpc3RCb3gpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX01VTFRJU0VMRUNUKSB7CiAgICAgICAgIGludCBuU2VsQ291bnQgPSAwOwogICAgICAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gcExpc3RCb3gtPkdldENvdW50KCk7IGkgPCBzejsgKytpKSB7CiAgICAgICAgICAgICBpZiAocExpc3RCb3gtPklzSXRlbVNlbGVjdGVkKGkpKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1fT3JpZ2luU2VsZWN0aW9ucy5jb3VudChpKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICAgICAgICAgICAgICBuU2VsQ291bnQrKzsKICAgICAgICAgICAgIH0KQEAgLTEzNyw3ICsxMzcsNyBAQAogewogCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiAKLQlpZiAoQ1BXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDUFdMX0xpc3RCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKwlpZiAoQ1BXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDUFdMX0xpc3RCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKIAl7CiAJCUNGWF9JbnRBcnJheSBhT2xkU2VsZWN0LCBhTmV3U2VsZWN0OwogCkBAIC0xNTQsNyArMTU0LDcgQEAKIAogCQlpbnQzMl90IG5OZXdUb3BJbmRleCA9IHBMaXN0Qm94LT5HZXRUb3BWaXNpYmxlSW5kZXgoKTsKIAotCQltX3BXaWRnZXQtPkNsZWFyU2VsZWN0aW9uKEZBTFNFKTsKKwkJbV9wV2lkZ2V0LT5DbGVhclNlbGVjdGlvbihmYWxzZSk7CiAKIAkJaWYgKG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX01VTFRJU0VMRUNUKQogCQl7CkBAIC0xNjIsMTkgKzE2MiwxOSBAQAogCQkJewogCQkJCWlmIChwTGlzdEJveC0+SXNJdGVtU2VsZWN0ZWQoaSkpCiAJCQkJewotCQkJCQltX3BXaWRnZXQtPlNldE9wdGlvblNlbGVjdGlvbihpLCBUUlVFLCBGQUxTRSk7CisJCQkJCW1fcFdpZGdldC0+U2V0T3B0aW9uU2VsZWN0aW9uKGksIHRydWUsIGZhbHNlKTsKIAkJCQkJYU5ld1NlbGVjdC5BZGQoaSk7CiAJCQkJfQogCQkJfQogCQl9CiAJCWVsc2UKIAkJewotCQkJbV9wV2lkZ2V0LT5TZXRPcHRpb25TZWxlY3Rpb24ocExpc3RCb3gtPkdldEN1clNlbCgpLCBUUlVFLCBGQUxTRSk7CisJCQltX3BXaWRnZXQtPlNldE9wdGlvblNlbGVjdGlvbihwTGlzdEJveC0+R2V0Q3VyU2VsKCksIHRydWUsIGZhbHNlKTsKIAkJCWFOZXdTZWxlY3QuQWRkKHBMaXN0Qm94LT5HZXRDdXJTZWwoKSk7CiAJCX0KIAogCQltX3BXaWRnZXQtPlNldFRvcFZpc2libGVJbmRleChuTmV3VG9wSW5kZXgpOwotCQltX3BXaWRnZXQtPlJlc2V0RmllbGRBcHBlYXJhbmNlKFRSVUUpOworCQltX3BXaWRnZXQtPlJlc2V0RmllbGRBcHBlYXJhbmNlKHRydWUpOwogCQltX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7CiAJCVNldENoYW5nZU1hcmsoKTsKIAl9CkBAIC0xOTIsNyArMTkyLDcgQEAKIAkJfQogCQllbHNlCiAJCXsKLQkJCWlmIChDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorCQkJaWYgKENQV0xfTGlzdEJveCogcExpc3RCb3ggPSAoQ1BXTF9MaXN0Qm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAJCQl7CiAJCQkJQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKIAkJCQlpbnQzMl90IG5DdXJTZWwgPSBwTGlzdEJveC0+R2V0Q3VyU2VsKCk7CkBAIC0yMzAsNyArMjMwLDcgQEAKIHsKIAlBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogCi0JaWYgKENQV0xfTGlzdEJveCogcExpc3RCb3ggPSAoQ1BXTF9MaXN0Qm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisJaWYgKENQV0xfTGlzdEJveCogcExpc3RCb3ggPSAoQ1BXTF9MaXN0Qm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAJewogCQlmb3IgKGludDMyX3QgaT0wLHN6PXBMaXN0Qm94LT5HZXRDb3VudCgpOyBpPHN6OyBpKyspCiAJCXsKQEAgLTI0NCwxNCArMjQ0LDE0IEBACiAKIHZvaWQgQ0ZGTF9MaXN0Qm94OjpSZXN0b3JlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQogewotCWlmIChDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorCWlmIChDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogCXsKIAkJZm9yIChpbnQgaT0wLHN6PW1fU3RhdGUuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCiAJCQlwTGlzdEJveC0+U2VsZWN0KG1fU3RhdGVbaV0pOwogCX0KIH0KIAotQ1BXTF9XbmQqIENGRkxfTGlzdEJveDo6UmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJSZXN0b3JlVmFsdWUpCitDUFdMX1duZCogQ0ZGTF9MaXN0Qm94OjpSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wgYlJlc3RvcmVWYWx1ZSkKIHsKIAlpZiAoYlJlc3RvcmVWYWx1ZSkKIAkJU2F2ZVN0YXRlKHBQYWdlVmlldyk7CkBAIC0yNjMsMTcgKzI2MywxNyBAQAogCWlmIChiUmVzdG9yZVZhbHVlKQogCXsKIAkJUmVzdG9yZVN0YXRlKHBQYWdlVmlldyk7Ci0JCXBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7CisJCXBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSk7CiAJfQogCWVsc2UKLQkJcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpOworCQlwUmV0ID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgdHJ1ZSk7CiAKIAltX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7CiAKIAlyZXR1cm4gcFJldDsKIH0KIAotdm9pZCBDRkZMX0xpc3RCb3g6Ok9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24sIEZYX0RXT1JEIG5GbGFnKQordm9pZCBDRkZMX0xpc3RCb3g6Ok9uS2V5U3Ryb2tlKGJvb2wgYktleURvd24sIEZYX0RXT1JEIG5GbGFnKQogewogCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiAKQEAgLTI4OSw3ICsyODksNyBAQAogCQkJaWYgKENvbW1pdERhdGEocFBhZ2VWaWV3LCBuRmxhZykpCiAJCQl7CiAJCQkJRGVzdHJveVBERldpbmRvdyhwUGFnZVZpZXcpOwotCQkJCW1fYlZhbGlkID0gRkFMU0U7CisJCQkJbV9iVmFsaWQgPSBmYWxzZTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5jcHAgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuY3BwCmluZGV4IDU4YTIyMDIuLmZkYzRiY2YgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfTm90aWZ5LmNwcApAQCAtMTUsNyArMTUsNyBAQAogLy8jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDgwMCkKIAogQ0ZGTF9Ob3RpZnk6OkNGRkxfTm90aWZ5KENGRkxfRm9ybUZpbGxlciAqIHBGb3JtRmlsbGVyKSA6Ci0JbV9iRG9BY3Rpb25pbmcoRkFMU0UpLAorCW1fYkRvQWN0aW9uaW5nKGZhbHNlKSwKIAltX25Ob3RpZnlGbGFnKDApCiB7CiAJQVNTRVJUKHBGb3JtRmlsbGVyICE9IE5VTEwpOwpAQCAtMzYsMTE2ICszNiwxMTYgQEAKIAltX25Ob3RpZnlGbGFnIC0tOwogfQogCi1GWF9CT09MIENGRkxfTm90aWZ5OjpPbk1vdXNlVXAoRlhfQk9PTCAmIGJFeGl0KQorYm9vbCBDRkZMX05vdGlmeTo6T25Nb3VzZVVwKGJvb2wgJiBiRXhpdCkKIHsKIAlCZWZvcmVOb3RpZnkoKTsKLQlGWF9CT09MIGJSZXQgPSBGQUxTRTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpCdXR0b25VcCwgYkV4aXQpOworCWJvb2wgYlJldCA9IGZhbHNlOy8vRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGU6OkJ1dHRvblVwLCBiRXhpdCk7CiAJQWZ0ZXJOb3RpZnkoKTsKIAlyZXR1cm4gYlJldDsKIH0KIAotRlhfQk9PTCBDRkZMX05vdGlmeTo6T25Nb3VzZURvd24oRlhfQk9PTCAmIGJFeGl0KQorYm9vbCBDRkZMX05vdGlmeTo6T25Nb3VzZURvd24oYm9vbCAmIGJFeGl0KQogewogCUJlZm9yZU5vdGlmeSgpOwotCUZYX0JPT0wgYlJldCA9IEZBTFNFOy8vRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGU6OkJ1dHRvbkRvd24sIGJFeGl0KTsKKwlib29sIGJSZXQgPSBmYWxzZTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpCdXR0b25Eb3duLCBiRXhpdCk7CiAJQWZ0ZXJOb3RpZnkoKTsKIAlyZXR1cm4gYlJldDsKIH0KIAotRlhfQk9PTCBDRkZMX05vdGlmeTo6T25Nb3VzZUVudGVyKEZYX0JPT0wgJiBiRXhpdCkKK2Jvb2wgQ0ZGTF9Ob3RpZnk6Ok9uTW91c2VFbnRlcihib29sICYgYkV4aXQpCiB7CiAJQmVmb3JlTm90aWZ5KCk7Ci0JRlhfQk9PTCBiUmV0ID0gRkFMU0U7Ly9Eb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZTo6Q3Vyc29yRW50ZXIsIGJFeGl0KTsKKwlib29sIGJSZXQgPSBmYWxzZTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpDdXJzb3JFbnRlciwgYkV4aXQpOwogCUFmdGVyTm90aWZ5KCk7CiAJcmV0dXJuIGJSZXQ7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uTW91c2VFeGl0KEZYX0JPT0wgJiBiRXhpdCkKK2Jvb2wgQ0ZGTF9Ob3RpZnk6Ok9uTW91c2VFeGl0KGJvb2wgJiBiRXhpdCkKIHsKIAlCZWZvcmVOb3RpZnkoKTsKLQlGWF9CT09MIGJSZXQgPSBGQUxTRTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpDdXJzb3JFeGl0LCBiRXhpdCk7CisJYm9vbCBiUmV0ID0gZmFsc2U7Ly9Eb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZTo6Q3Vyc29yRXhpdCwgYkV4aXQpOwogCUFmdGVyTm90aWZ5KCk7CiAJcmV0dXJuIGJSZXQ7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uU2V0Rm9jdXMoRlhfQk9PTCAmIGJFeGl0KQorYm9vbCBDRkZMX05vdGlmeTo6T25TZXRGb2N1cyhib29sICYgYkV4aXQpCiB7CiAJQmVmb3JlTm90aWZ5KCk7Ci0JRlhfQk9PTCBiUmV0ID0gRkFMU0U7Ly9Eb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZTo6R2V0Rm9jdXMsIGJFeGl0KTsKKwlib29sIGJSZXQgPSBmYWxzZTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpHZXRGb2N1cywgYkV4aXQpOwogCUFmdGVyTm90aWZ5KCk7CiAJcmV0dXJuIGJSZXQ7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uS2lsbEZvY3VzKEZYX0JPT0wgJiBiRXhpdCkKK2Jvb2wgQ0ZGTF9Ob3RpZnk6Ok9uS2lsbEZvY3VzKGJvb2wgJiBiRXhpdCkKIHsKIAlCZWZvcmVOb3RpZnkoKTsKLQlGWF9CT09MIGJSZXQgPSBGQUxTRTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpMb3NlRm9jdXMsIGJFeGl0KTsKKwlib29sIGJSZXQgPSBmYWxzZTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpMb3NlRm9jdXMsIGJFeGl0KTsKIAlBZnRlck5vdGlmeSgpOwogCXJldHVybiBiUmV0OwogfQogCi1GWF9CT09MIENGRkxfTm90aWZ5OjpPbkNhbGN1bGF0ZSgpCitib29sIENGRkxfTm90aWZ5OjpPbkNhbGN1bGF0ZSgpCiB7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uRm9ybWF0KGludCBpQ29tbWl0S2V5KQorYm9vbCBDRkZMX05vdGlmeTo6T25Gb3JtYXQoaW50IGlDb21taXRLZXkpCiB7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uS2V5U3Ryb2tlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBpbnQgbkNvbW1pdEtleSwgQ0ZYX1dpZGVTdHJpbmcmIHN0clZhbHVlLCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAotCQkJCQkJCSAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsCi0JCQkJCQkJICAgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYldpbGxDb21taXQsIEZYX0JPT0wgYkZpZWxkRnVsbCwKLQkJCQkJCQkgICBpbnQmIG5TZWxTdGFydCwgaW50JiBuU2VsRW5kLCBGWF9CT09MJiBiUkMpCitib29sIENGRkxfTm90aWZ5OjpPbktleVN0cm9rZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgaW50IG5Db21taXRLZXksIENGWF9XaWRlU3RyaW5nJiBzdHJWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKwkJCQkJCQkgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIGJvb2wgYktleURvd24sIGJvb2wgYk1vZGlmaWVyLAorCQkJCQkJCSAgIGJvb2wgYlNoaWZ0LCBib29sIGJXaWxsQ29tbWl0LCBib29sIGJGaWVsZEZ1bGwsCisJCQkJCQkJICAgaW50JiBuU2VsU3RhcnQsIGludCYgblNlbEVuZCwgYm9vbCYgYlJDKQogewotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENGRkxfTm90aWZ5OjpPblZhbGlkYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyYgc3RyVmFsdWUsIENGWF9XaWRlU3RyaW5nICYgc3RyQ2hhbmdlLAotCQkJCQkJCQkJICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MIGJNb2RpZmllciwKLQkJCQkJCQkJCSAgIEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MICYgYlJDKQorYm9vbCBDRkZMX05vdGlmeTo6T25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIHN0clZhbHVlLCBDRlhfV2lkZVN0cmluZyAmIHN0ckNoYW5nZSwKKwkJCQkJCQkJCSAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgYm9vbCBiS2V5RG93biwgYm9vbCBiTW9kaWZpZXIsCisJCQkJCQkJCQkgICBib29sIGJTaGlmdCwgYm9vbCAmIGJSQykKIHsKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTAlDRkZMX05vdGlmeTo6RG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCwgRlhfQk9PTCAmIGJFeGl0KQorYm9vbAlDRkZMX05vdGlmeTo6RG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCwgYm9vbCAmIGJFeGl0KQogewogICAgIGlmIChtX2JEb0FjdGlvbmluZykKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0FjdGlvbiBhY3Rpb247CiAgICAgaWYgKCFGaW5kQUFjdGlvbihlQUFULCBhY3Rpb24pKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIG1fYkRvQWN0aW9uaW5nID0gVFJVRTsKKyAgICBtX2JEb0FjdGlvbmluZyA9IHRydWU7CiAgICAgRXhlY3V0ZUFjdGlvblRyZWUoZUFBVCxhY3Rpb24sYkV4aXQpOwotICAgIG1fYkRvQWN0aW9uaW5nID0gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgbV9iRG9BY3Rpb25pbmcgPSBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTAlDRkZMX05vdGlmeTo6RXhlY3V0ZUFjdGlvblRyZWUoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uLCBGWF9CT09MJiBiRXhpdCkKK2Jvb2wJQ0ZGTF9Ob3RpZnk6OkV4ZWN1dGVBY3Rpb25UcmVlKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCxDUERGX0FjdGlvbiAmIGFjdGlvbiwgYm9vbCYgYkV4aXQpCiB7Ci0JaWYgKCFFeGVjdXRlQWN0aW9uKGVBQVQsYWN0aW9uLGJFeGl0KSkgcmV0dXJuIEZBTFNFOwotCWlmIChiRXhpdCkgcmV0dXJuIFRSVUU7CisJaWYgKCFFeGVjdXRlQWN0aW9uKGVBQVQsYWN0aW9uLGJFeGl0KSkgcmV0dXJuIGZhbHNlOworCWlmIChiRXhpdCkgcmV0dXJuIHRydWU7CiAKIAlmb3IgKGludDMyX3QgaT0wLHN6PWFjdGlvbi5HZXRTdWJBY3Rpb25zQ291bnQoKTsgaTxzejsgaSsrKQogCXsKIAkJQ1BERl9BY3Rpb24gc3ViYWN0aW9uID0gYWN0aW9uLkdldFN1YkFjdGlvbihpKTsKLQkJaWYgKCFFeGVjdXRlQWN0aW9uVHJlZShlQUFULHN1YmFjdGlvbixiRXhpdCkpIHJldHVybiBGQUxTRTsKKwkJaWYgKCFFeGVjdXRlQWN0aW9uVHJlZShlQUFULHN1YmFjdGlvbixiRXhpdCkpIHJldHVybiBmYWxzZTsKIAkJaWYgKGJFeGl0KSBicmVhazsKIAl9CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogCi1GWF9CT09MCUNGRkxfTm90aWZ5OjpGaW5kQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24pCitib29sCUNGRkxfTm90aWZ5OjpGaW5kQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24pCiB7Ci0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX05vdGlmeTo6RmluZEFBY3Rpb24oQ1BERl9BQWN0aW9uIGFhY3Rpb24sQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uKQorYm9vbCBDRkZMX05vdGlmeTo6RmluZEFBY3Rpb24oQ1BERl9BQWN0aW9uIGFhY3Rpb24sQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uKQogewogCUNQREZfQWN0aW9uIE15QWN0aW9uOwogCkBAIC0xNTQsMjAgKzE1NCwyMCBAQAogCQlNeUFjdGlvbiA9IGFhY3Rpb24uR2V0QWN0aW9uKGVBQVQpOwogCX0KIAllbHNlCi0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogCiAKIAlpZiAoTXlBY3Rpb24uR2V0VHlwZSgpID09IENQREZfQWN0aW9uOjpVbmtub3duKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAogCWFjdGlvbiA9IE15QWN0aW9uOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9Ob3RpZnk6OkV4ZWN1dGVBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uLEZYX0JPT0wmIGJFeGl0KQorYm9vbAlDRkZMX05vdGlmeTo6RXhlY3V0ZUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24sYm9vbCYgYkV4aXQpCiB7Ci0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIC8vI3ByYWdtYSB3YXJuaW5nKGRlZmF1bHQ6IDQ4MDApCiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5jcHAKaW5kZXggYTVkZjQ4OC4uNDRlNGVkMCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKIH0KIAogCi1GWF9CT09MCUNGRkxfUHVzaEJ1dHRvbjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpCitib29sCUNGRkxfUHVzaEJ1dHRvbjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpCiB7CiAJcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9SYWRpb0J1dHRvbi5jcHAgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9SYWRpb0J1dHRvbi5jcHAKaW5kZXggMWY3M2U4Yy4uZTdiMzM0OCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1JhZGlvQnV0dG9uLmNwcApAQCAtMzEsMTkgKzMxLDE5IEBACiAJcmV0dXJuIHBXbmQ7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9SYWRpb0J1dHRvbjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpCitib29sCUNGRkxfUmFkaW9CdXR0b246Ok9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKQogewogCXN3aXRjaCAobktleUNvZGUpCiAJewogCWNhc2UgRldMX1ZLRVlfUmV0dXJuOgogCWNhc2UgRldMX1ZLRVlfU3BhY2U6Ci0JCXJldHVybiBUUlVFOworCQlyZXR1cm4gdHJ1ZTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbktleURvd24ocEFubm90LCBuS2V5Q29kZSwgbkZsYWdzKTsKIAl9CiB9CiAKLUZYX0JPT0wJQ0ZGTF9SYWRpb0J1dHRvbjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpCitib29sCUNGRkxfUmFkaW9CdXR0b246Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQogewogCXN3aXRjaCAobkNoYXIpCiAJewpAQCAtNTYsNjEgKzU2LDYxIEBACiAJCQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwQW5ub3QtPkdldFBhZ2VWaWV3KCk7CiAJCQlBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogCi0JCQlGWF9CT09MIGJSZXNldCA9IEZBTFNFOwotCQkJRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworCQkJYm9vbCBiUmVzZXQgPSBmYWxzZTsKKwkJCWJvb2wgYkV4aXQgPSBmYWxzZTsKIAogCQkJcElGb3JtRmlsbGVyLT5PbkJ1dHRvblVwKG1fcFdpZGdldCwgcFBhZ2VWaWV3LCBiUmVzZXQsIGJFeGl0LG5GbGFncyk7CiAKLQkJCWlmIChiUmVzZXQpIHJldHVybiBUUlVFOwotCQkJaWYgKGJFeGl0KSByZXR1cm4gVFJVRTsKKwkJCWlmIChiUmVzZXQpIHJldHVybiB0cnVlOworCQkJaWYgKGJFeGl0KSByZXR1cm4gdHJ1ZTsKIAogCQkJQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKIAotCQkJaWYgKENQV0xfUmFkaW9CdXR0b24gKiBwV25kID0gKENQV0xfUmFkaW9CdXR0b24qKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKQotCQkJCXBXbmQtPlNldENoZWNrKFRSVUUpOworCQkJaWYgKENQV0xfUmFkaW9CdXR0b24gKiBwV25kID0gKENQV0xfUmFkaW9CdXR0b24qKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpKQorCQkJCXBXbmQtPlNldENoZWNrKHRydWUpOwogCQkJQ29tbWl0RGF0YShwUGFnZVZpZXcsbkZsYWdzKTsKLQkJCXJldHVybiBUUlVFOworCQkJcmV0dXJuIHRydWU7CiAJCX0KIAlkZWZhdWx0OgogCQlyZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKIAl9CiB9CiAKLUZYX0JPT0wJQ0ZGTF9SYWRpb0J1dHRvbjo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wJQ0ZGTF9SYWRpb0J1dHRvbjo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKIAlDRkZMX0J1dHRvbjo6T25MQnV0dG9uVXAocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogCiAJaWYgKElzVmFsaWQoKSkKIAl7Ci0JCWlmIChDUFdMX1JhZGlvQnV0dG9uICogcFduZCA9IChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKLQkJCXBXbmQtPlNldENoZWNrKFRSVUUpOworCQlpZiAoQ1BXTF9SYWRpb0J1dHRvbiAqIHBXbmQgPSAoQ1BXTF9SYWRpb0J1dHRvbiopR2V0UERGV2luZG93KHBQYWdlVmlldywgdHJ1ZSkpCisJCQlwV25kLT5TZXRDaGVjayh0cnVlKTsKIAotCQlpZiAoIUNvbW1pdERhdGEocFBhZ2VWaWV3LG5GbGFncykpIHJldHVybiBGQUxTRTsKKwkJaWYgKCFDb21taXREYXRhKHBQYWdlVmlldyxuRmxhZ3MpKSByZXR1cm4gZmFsc2U7CiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9SYWRpb0J1dHRvbjo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCitib29sCUNGRkxfUmFkaW9CdXR0b246OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQogewogCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiAKLQlpZiAoQ1BXTF9SYWRpb0J1dHRvbiogcFduZCA9IChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisJaWYgKENQV0xfUmFkaW9CdXR0b24qIHBXbmQgPSAoQ1BXTF9SYWRpb0J1dHRvbiopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogCXsKIAkJcmV0dXJuIHBXbmQtPklzQ2hlY2tlZCgpICE9IG1fcFdpZGdldC0+SXNDaGVja2VkKCk7CiAJfQogCi0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBDRkZMX1JhZGlvQnV0dG9uOjpTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCiB7CiAJQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKIAotCWlmIChDUFdMX1JhZGlvQnV0dG9uKiBwV25kID0gKENQV0xfUmFkaW9CdXR0b24qKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKwlpZiAoQ1BXTF9SYWRpb0J1dHRvbiogcFduZCA9IChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAJewogCi0JCUZYX0JPT0wgYk5ld0NoZWNrZWQgPSBwV25kLT5Jc0NoZWNrZWQoKTsKKwkJYm9vbCBiTmV3Q2hlY2tlZCA9IHBXbmQtPklzQ2hlY2tlZCgpOwogCiAJCWlmIChiTmV3Q2hlY2tlZCkKIAkJewpAQCAtMTI5LDcgKzEyOSw3IEBACiAJCQl9CiAJCX0KIAotCQltX3BXaWRnZXQtPlNldENoZWNrKGJOZXdDaGVja2VkLCBGQUxTRSk7CisJCW1fcFdpZGdldC0+U2V0Q2hlY2soYk5ld0NoZWNrZWQsIGZhbHNlKTsKIAkJbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOwogCQlTZXRDaGFuZ2VNYXJrKCk7CiAJfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5jcHAKaW5kZXggYTRiODcyNi4uYTg2OTVmNCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9UZXh0RmllbGQuY3BwCkBAIC0xMjksNyArMTI5LDcgQEAKIH0KIAogCi1GWF9CT09MIENGRkxfVGV4dEZpZWxkOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykKK2Jvb2wgQ0ZGTF9UZXh0RmllbGQ6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQogewogICAgIHN3aXRjaCAobkNoYXIpCiAgICAgewpAQCAtMTQ0LDcgKzE0NCw3IEBACiAKICAgICAgICAgICAgIGlmIChtX2JWYWxpZCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKKyAgICAgICAgICAgICAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCB0cnVlKSkKICAgICAgICAgICAgICAgICAgICAgcFduZC0+U2V0Rm9jdXMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKQEAgLTE1Miw5ICsxNTIsOSBAQAogICAgICAgICAgICAgICAgIGlmIChDb21taXREYXRhKHBQYWdlVmlldywgbkZsYWdzKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIERlc3Ryb3lQREZXaW5kb3cocFBhZ2VWaWV3KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwpAQCAtMTYyLDM1ICsxNjIsMzUgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gR2V0Q3VyUGFnZVZpZXcoKTsKICAgICAgICAgICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0gICAgICAgICAgICBFc2NhcGVGaWxsZXIocFBhZ2VWaWV3LFRSVUUpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICBFc2NhcGVGaWxsZXIocFBhZ2VWaWV3LHRydWUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKIH0KIAotRlhfQk9PTCBDRkZMX1RleHRGaWVsZDo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCitib29sIENGRkxfVGV4dEZpZWxkOjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKIHsKICAgICBBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwogCi0gICAgaWYgKENQV0xfRWRpdCAqIHBFZGl0ID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgIGlmIChDUFdMX0VkaXQgKiBwRWRpdCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKICAgICAgICAgcmV0dXJuIHBFZGl0LT5HZXRUZXh0KCkgIT0gbV9wV2lkZ2V0LT5HZXRWYWx1ZSgpOwogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBDRkZMX1RleHRGaWVsZDo6U2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQogewogICAgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiAKLSAgICBpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgIGlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAgICAgewogICAgICAgICBDRlhfV2lkZVN0cmluZyBzT2xkVmFsdWUgPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7CiAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNOZXdWYWx1ZSA9IHBXbmQtPkdldFRleHQoKTsKIAotICAgICAgICBtX3BXaWRnZXQtPlNldFZhbHVlKHNOZXdWYWx1ZSwgRkFMU0UpOwotICAgICAgICBtX3BXaWRnZXQtPlJlc2V0RmllbGRBcHBlYXJhbmNlKFRSVUUpOworICAgICAgICBtX3BXaWRnZXQtPlNldFZhbHVlKHNOZXdWYWx1ZSwgZmFsc2UpOworICAgICAgICBtX3BXaWRnZXQtPlJlc2V0RmllbGRBcHBlYXJhbmNlKHRydWUpOwogICAgICAgICBtX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7CiAgICAgICAgIFNldENoYW5nZU1hcmsoKTsKICAgICB9CkBAIC0yMDIsNyArMjAyLDcgQEAKICAgICBzd2l0Y2ggKHR5cGUpCiAgICAgewogICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2U6Ci0gICAgICAgIGlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisgICAgICAgIGlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGZhLmJGaWVsZEZ1bGwgPSBwV25kLT5Jc1RleHRGdWxsKCk7CiAKQEAgLTIxNiw3ICsyMTYsNyBAQAogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZToKLSAgICAgICAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKyAgICAgICAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKICAgICAgICAgewogICAgICAgICAgICAgZmEuc1ZhbHVlID0gcFduZC0+R2V0VGV4dCgpOwogICAgICAgICB9CkBAIC0yMzcsNyArMjM3LDcgQEAKICAgICBzd2l0Y2ggKHR5cGUpCiAgICAgewogICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2U6Ci0gICAgICAgIGlmIChDUFdMX0VkaXQgKiBwRWRpdCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKyAgICAgICAgaWYgKENQV0xfRWRpdCAqIHBFZGl0ID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogICAgICAgICB7CiAgICAgICAgICAgICBwRWRpdC0+U2V0Rm9jdXMoKTsKICAgICAgICAgICAgIHBFZGl0LT5TZXRTZWwoZmEublNlbFN0YXJ0LCBmYS5uU2VsRW5kKTsKQEAgLTI1MCw3ICsyNTAsNyBAQAogfQogCiAKLUZYX0JPT0wgQ0ZGTF9UZXh0RmllbGQ6OklzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLAorYm9vbCBDRkZMX1RleHRGaWVsZDo6SXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KQogewogICAgIHN3aXRjaCAodHlwZSkKQEAgLTI2MiwxNCArMjYyLDE0IEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ0ZGTF9UZXh0RmllbGQ6OlNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCiB7CiAgICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKIAotICAgIGlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisgICAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIHBXbmQtPkdldFNlbChtX1N0YXRlLm5TdGFydCwgbV9TdGF0ZS5uRW5kKTsKICAgICAgICAgbV9TdGF0ZS5zVmFsdWUgPSBwV25kLT5HZXRUZXh0KCk7CkBAIC0yODAsMTQgKzI4MCwxNCBAQAogewogICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CiAKLSAgICBpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCisgICAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpKQogICAgIHsKICAgICAgICAgcFduZC0+U2V0VGV4dChtX1N0YXRlLnNWYWx1ZS5jX3N0cigpKTsKICAgICAgICAgcFduZC0+U2V0U2VsKG1fU3RhdGUublN0YXJ0LCBtX1N0YXRlLm5FbmQpOwogICAgIH0KIH0KIAotQ1BXTF9XbmQqIENGRkxfVGV4dEZpZWxkOjpSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSkKK0NQV0xfV25kKiBDRkZMX1RleHRGaWVsZDo6UmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sIGJSZXN0b3JlVmFsdWUpCiB7CiAgICAgaWYgKGJSZXN0b3JlVmFsdWUpCiAgICAgICAgIFNhdmVTdGF0ZShwUGFnZVZpZXcpOwpAQCAtMjk5LDEwICsyOTksMTAgQEAKICAgICBpZiAoYlJlc3RvcmVWYWx1ZSkKICAgICB7CiAgICAgICAgIFJlc3RvcmVTdGF0ZShwUGFnZVZpZXcpOwotICAgICAgICBwUmV0ID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpOworICAgICAgICBwUmV0ID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpOwogICAgIH0KICAgICBlbHNlCi0gICAgICAgIHBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKTsKKyAgICAgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpOwogCiAgICAgbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOwogCkBAIC0zMjYsNyArMzI2LDcgQEAKICAgICAgICAgaW50IG5DaGFyYWN0ZXJzID0gd3NUZXh0LkdldExlbmd0aCgpOwogICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1VURlRleHQgPSB3c1RleHQuVVRGMTZMRV9FbmNvZGUoKTsKICAgICAgICAgdW5zaWduZWQgc2hvcnQqIHBCdWZmZXIgPSAodW5zaWduZWQgc2hvcnQqKWJzVVRGVGV4dC5jX3N0cigpOwotICAgICAgICBtX3BBcHAtPkZGSV9PblNldEZpZWxkSW5wdXRGb2N1cyhtX3BXaWRnZXQtPkdldEZvcm1GaWVsZCgpLCBwQnVmZmVyLCBuQ2hhcmFjdGVycywgVFJVRSk7CisgICAgICAgIG1fcEFwcC0+RkZJX09uU2V0RmllbGRJbnB1dEZvY3VzKG1fcFdpZGdldC0+R2V0Rm9ybUZpZWxkKCksIHBCdWZmZXIsIG5DaGFyYWN0ZXJzLCB0cnVlKTsKIAogICAgICAgICBwRWRpdC0+U2V0RWRpdE5vdGlmeSh0aGlzKTsKICAgICAgICAgLy9wVW5kby0+QmVnaW5FZGl0KHBEb2N1bWVudCk7CkBAIC0zMzgsMTkgKzMzOCwxOSBAQAogCiB9CiAKLUZYX0JPT0wgQ0ZGTF9UZXh0RmllbGQ6OkNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQorYm9vbCBDRkZMX1RleHRGaWVsZDo6Q2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX1RleHRGaWVsZDo6Q2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK2Jvb2wgQ0ZGTF9UZXh0RmllbGQ6OkNhbkN1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX1RleHRGaWVsZDo6Q2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQorYm9vbCBDRkZMX1RleHRGaWVsZDo6Q2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ0ZGTF9UZXh0RmllbGQ6Ok9uQWRkVW5kbyhDUFdMX0VkaXQqIHBFZGl0KQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVXRpbHMuY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVXRpbHMuY3BwCmluZGV4IDhkMmQ3NmQuLjBlNTAyMmMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1V0aWxzLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9VdGlscy5jcHAKQEAgLTQxLDkgKzQxLDkgQEAKIAlyZXR1cm4gY3JOZXc7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9VdGlsczo6VHJhY2VPYmplY3QoQ1BERl9PYmplY3QqIHBPYmopCitib29sIENGRkxfVXRpbHM6OlRyYWNlT2JqZWN0KENQREZfT2JqZWN0KiBwT2JqKQogewotCWlmICghcE9iaikgcmV0dXJuIEZBTFNFOworCWlmICghcE9iaikgcmV0dXJuIGZhbHNlOwogCiAJRlhfRFdPUkQJZHdPYmpOdW0gPSBwT2JqLT5HZXRPYmpOdW0oKTsKIAlzd2l0Y2ggKHBPYmotPkdldFR5cGUoKSkKQEAgLTcxLDcgKzcxLDcgQEAKICAJCQkJLy9UUkFDRShjc0tleSArICJcbiIpOwogCQkJCWlmICghcEVsZW1lbnQpIGJyZWFrOwogCQkJCVRyYWNlT2JqZWN0KHBFbGVtZW50KTsKLQkJCX13aGlsZSAoVFJVRSk7CisJCQl9d2hpbGUgKHRydWUpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0xMDcsOCArMTA3LDggQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9Ci0JaWYgKGR3T2JqTnVtID09IDApIHJldHVybiBGQUxTRTsKKwlpZiAoZHdPYmpOdW0gPT0gMCkgcmV0dXJuIGZhbHNlOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZfZGF0YWF2YWlsLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZfZGF0YWF2YWlsLmNwcAppbmRleCBiMjZkMmFmLi44NWViYTU1IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmX2RhdGFhdmFpbC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZl9kYXRhYXZhaWwuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiAJCW1fcGZpbGVBdmFpbCA9IHBmaWxlQXZhaWw7CiAJfQogCi0JdmlydHVhbCBGWF9CT09MCQkJSXNEYXRhQXZhaWwoIEZYX0ZJTEVTSVpFIG9mZnNldCwgRlhfRFdPUkQgc2l6ZSkKKwl2aXJ0dWFsIGJvb2wJCQlJc0RhdGFBdmFpbCggRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9EV09SRCBzaXplKQogCXsKIAkJcmV0dXJuIG1fcGZpbGVBdmFpbC0+SXNEYXRhQXZhaWwobV9wZmlsZUF2YWlsLCBvZmZzZXQsIHNpemUpOwogCX0KQEAgLTQ4LDcgKzQ4LDcgQEAKIAkJcmV0dXJuIG1fcEZpbGVBY2Nlc3MtPm1fRmlsZUxlbjsKIAl9CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKQorCXZpcnR1YWwgYm9vbAkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpCiAJewogCQlyZXR1cm4gbV9wRmlsZUFjY2Vzcy0+bV9HZXRCbG9jayhtX3BGaWxlQWNjZXNzLT5tX1BhcmFtLCBvZmZzZXQsICh1aW50OF90KilidWZmZXIsIHNpemUpOwogCX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZfZXh0LmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZfZXh0LmNwcAppbmRleCAwZDhkYjQxLi43NDEzNDc0IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmX2V4dC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZl9leHQuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiB7CiBwdWJsaWM6CiAgICAgQ0ZTREtfVW5zdXBwb3J0SW5mb19BZGFwdGVyKFVOU1VQUE9SVF9JTkZPKiB1bnNwX2luZm8peyBtX3Vuc3BfaW5mbyA9IHVuc3BfaW5mbzt9Ci0vLyAgRlhfQk9PTCBOZWVkVG9QYXVzZU5vdygpOworLy8gIGJvb2wgTmVlZFRvUGF1c2VOb3coKTsKICAgICB2b2lkIFJlcG9ydEVycm9yKGludCBuRXJyb3JUeXBlKTsKIAogcHJpdmF0ZToKQEAgLTM1LDI1ICszNSwyNSBAQAogICAgIGRlbGV0ZSBwQWRhcHRlcjsKIH0KIAotRlhfQk9PTCBGUERGX1VuU3VwcG9ydEVycm9yKGludCBuRXJyb3IpCitib29sIEZQREZfVW5TdXBwb3J0RXJyb3IoaW50IG5FcnJvcikKIHsKICAgICBDRlNES19VbnN1cHBvcnRJbmZvX0FkYXB0ZXIgKiBwQWRhcHRlciA9IChDRlNES19VbnN1cHBvcnRJbmZvX0FkYXB0ZXIgKilDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFByaXZhdGVEYXRhKCh2b2lkICopRlBERlNES19VTlNVUFBPUlRfQ0FMTCk7CiAKICAgICBpZighcEFkYXB0ZXIpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIHBBZGFwdGVyLT5SZXBvcnRFcnJvcihuRXJyb3IpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlNES19TZXRVblNwT2JqUHJvY2Vzc0hhbmRsZXIoVU5TVVBQT1JUX0lORk8qIHVuc3BfaW5mbykKIHsKICAgICBpZiAoIXVuc3BfaW5mbyB8fCB1bnNwX2luZm8tPnZlcnNpb24hPTEpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlciAqIHBBZGFwdGVyID0gbmV3IENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlcih1bnNwX2luZm8pOwogCiAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5TZXRQcml2YXRlRGF0YSgodm9pZCAqKUZQREZTREtfVU5TVVBQT1JUX0NBTEwscEFkYXB0ZXIsICZGcmVlVW5zdXBwb3J0SW5mbyk7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBDaGVja1VuU3VwcG9ydEFubm90KENQREZfRG9jdW1lbnQgKiBwRG9jLCBDUERGX0Fubm90KiBwUERGQW5ub3QpCkBAIC0xMDQsNyArMTA0LDcgQEAKIAogfQogCi1GWF9CT09MIENoZWNrU2hhcmVkRm9ybShDWE1MX0VsZW1lbnQgKiBwRWxlbWVudCwgQ0ZYX0J5dGVTdHJpbmcgY2JOYW1lKQorYm9vbCBDaGVja1NoYXJlZEZvcm0oQ1hNTF9FbGVtZW50ICogcEVsZW1lbnQsIENGWF9CeXRlU3RyaW5nIGNiTmFtZSkKIHsKICAgICBpbnQgY291bnQgPSBwRWxlbWVudC0+Q291bnRBdHRycygpOwogICAgIGludCBpPTA7CkBAIC0xNDMsMTAgKzE0MywxMCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDWE1MX0VsZW1lbnQgKiBwQ2hpbGQgPSBwRWxlbWVudC0+R2V0RWxlbWVudChpKTsKICAgICAgICAgICAgIGlmKENoZWNrU2hhcmVkRm9ybShwQ2hpbGQsIGNiTmFtZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBDaGVja1VuU3VwcG9ydEVycm9yKENQREZfRG9jdW1lbnQgKiBwRG9jLCBGWF9EV09SRCBlcnJfY29kZSkKQEAgLTIwNiw3ICsyMDYsNyBAQAogICAgICAgICBDaGVja1NoYXJlZEZvcm0ocEVsZW1lbnQsICJ3b3JrZmxvd1R5cGUiKTsKIAogICAgIC8vIFhGQSBGb3JtcwotICAgIENQREZfSW50ZXJGb3JtICogcEludGVyRm9ybSA9IG5ldyBDUERGX0ludGVyRm9ybShwRG9jLEZBTFNFKTsKKyAgICBDUERGX0ludGVyRm9ybSAqIHBJbnRlckZvcm0gPSBuZXcgQ1BERl9JbnRlckZvcm0ocERvYyxmYWxzZSk7CiAgICAgaWYgKHBJbnRlckZvcm0tPkhhc1hGQUZvcm0oKSkKICAgICB7CiAgICAgICAgIEZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0RPQ19YRkFGT1JNKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZfZmxhdHRlbi5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmX2ZsYXR0ZW4uY3BwCmluZGV4IDk4OGQ3ZjQuLjNkYmIwYTEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZfZmxhdHRlbi5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZl9mbGF0dGVuLmNwcApAQCAtMTMsMTcgKzEzLDE3IEBACiBlbnVtIEZQREZfVFlQRSB7IE1BWCwgTUlOIH07CiBlbnVtIEZQREZfVkFMVUUgeyBUT1AsIExFRlQsIFJJR0hULCBCT1RUT00gfTsKIAotRlhfQk9PTCBJc1ZhbGlhYmxlUmVjdChDUERGX1JlY3QgcmVjdCwgQ1BERl9SZWN0IHJjUGFnZSkKK2Jvb2wgSXNWYWxpYWJsZVJlY3QoQ1BERl9SZWN0IHJlY3QsIENQREZfUmVjdCByY1BhZ2UpCiB7CiAJaWYgKCByZWN0LmxlZnQgLSByZWN0LnJpZ2h0ID4gMC4wMDAwMDFmIHx8CiAJCSByZWN0LmJvdHRvbSAtIHJlY3QudG9wID4gMC4wMDAwMDFmKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAogCWlmIChyZWN0LmxlZnQgPT0gMC4wZiAmJgogCQlyZWN0LnRvcCA9PSAwLjBmICYmCiAJCXJlY3QucmlnaHQgPT0gMC4wZiAmJgogCQlyZWN0LmJvdHRvbSA9PSAwLjBmKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAogCWlmICghcmNQYWdlLklzRW1wdHkoKSkKIAl7CkBAIC0zMSwxNyArMzEsMTcgQEAKIAkJCXJlY3QucmlnaHQgLSByY1BhZ2UucmlnaHQgPiAxMC4wMDAwMDFmIHx8CiAJCQlyZWN0LnRvcCAtIHJjUGFnZS50b3AgPiAxMC4wMDAwMDFmIHx8CiAJCQlyZWN0LmJvdHRvbSAtIHJjUGFnZS5ib3R0b20gPCAtMTAuMDAwMDAxZikKLQkJCXJldHVybiBGQUxTRTsKKwkJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogCi1GWF9CT09MIEdldENvbnRlbnRzUmVjdCggQ1BERl9Eb2N1bWVudCAqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfUmVjdEFycmF5ICogcFJlY3RBcnJheSApCitib29sIEdldENvbnRlbnRzUmVjdCggQ1BERl9Eb2N1bWVudCAqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfUmVjdEFycmF5ICogcFJlY3RBcnJheSApCiB7CiAJQ1BERl9QYWdlKiBwUERGUGFnZSA9IG5ldyBDUERGX1BhZ2U7Ci0JcFBERlBhZ2UtPkxvYWQoIHBEb2MsIHBEaWN0LCBGQUxTRSApOworCXBQREZQYWdlLT5Mb2FkKCBwRG9jLCBwRGljdCwgZmFsc2UgKTsKIAlwUERGUGFnZS0+UGFyc2VDb250ZW50KCk7CiAKIAlGWF9QT1NJVElPTiBwb3MgPSBwUERGUGFnZS0+R2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOwpAQCAtNjQsNyArNjQsNyBAQAogCX0KIAogCWRlbGV0ZSBwUERGUGFnZTsKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogCkBAIC0yMTcsNyArMjE3LDcgQEAKIAogCQkJQ0ZYX0J5dGVTdHJpbmcgc1N0cmVhbTsKIAkJCXNTdHJlYW0uRm9ybWF0KCJxIDEgMCAwIDEgMCAwIGNtIC8lcyBEbyBRIiwga2V5LmNfc3RyKCkpOwotCQkJcE5ld0NvbnRlbnRzLT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOworCQkJcE5ld0NvbnRlbnRzLT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBmYWxzZSwgZmFsc2UpOwogCQl9CiAJCXJldHVybjsKIAl9CkBAIC0yMzcsNyArMjM3LDcgQEAKIAkJCUNGWF9CeXRlU3RyaW5nIHNTdHJlYW0gPSAicVxuIjsKIAkJCUNGWF9CeXRlU3RyaW5nIHNCb2R5ID0gQ0ZYX0J5dGVTdHJpbmcoKGNvbnN0IEZYX0NIQVIqKWFjYy5HZXREYXRhKCksIGFjYy5HZXRTaXplKCkpOwogCQkJc1N0cmVhbSA9IHNTdHJlYW0gKyBzQm9keSArICJcblEiOwotCQkJcENvbnRlbnRzLT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOworCQkJcENvbnRlbnRzLT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBmYWxzZSwgZmFsc2UpOwogCQkJcENvbnRlbnRzQXJyYXktPkFkZFJlZmVyZW5jZShwRG9jdW1lbnQsIGR3T2JqTnVtKTsKIAkJCWJyZWFrOwogCQl9CkBAIC0yNjQsNyArMjY0LDcgQEAKIAogCQlDRlhfQnl0ZVN0cmluZyBzU3RyZWFtOwogCQlzU3RyZWFtLkZvcm1hdCgicSAxIDAgMCAxIDAgMCBjbSAvJXMgRG8gUSIsIGtleS5jX3N0cigpKTsKLQkJcE5ld0NvbnRlbnRzLT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOworCQlwTmV3Q29udGVudHMtPlNldERhdGEoKGNvbnN0IHVpbnQ4X3QqKXNTdHJlYW0sIHNTdHJlYW0uR2V0TGVuZ3RoKCksIGZhbHNlLCBmYWxzZSk7CiAJfQogfQogCkBAIC01MzgsNyArNTM4LDcgQEAKIAkJc1RlbXAuRm9ybWF0KCJxICVmIDAgMCAlZiAlZiAlZiBjbSAvJXMgRG8gUVxuIiwgbS5hLCBtLmQsIG0uZSwgbS5mLCBzRm9ybU5hbWUuY19zdHIoKSk7CiAJCXNTdHJlYW0gKz0gc1RlbXA7CiAKLQkJcE5ld1hPYmplY3QtPlNldERhdGEoKGNvbnN0IHVpbnQ4X3QqKXNTdHJlYW0sIHNTdHJlYW0uR2V0TGVuZ3RoKCksIEZBTFNFLCBGQUxTRSk7CisJCXBOZXdYT2JqZWN0LT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBmYWxzZSwgZmFsc2UpOwogCX0KIAlwUGFnZURpY3QtPlJlbW92ZUF0KCAiQW5ub3RzIiApOwogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmX3Byb2dyZXNzaXZlLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZfcHJvZ3Jlc3NpdmUuY3BwCmluZGV4IDRlYzczYWMuLjBjNDlkZjYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZfcHJvZ3Jlc3NpdmUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZfcHJvZ3Jlc3NpdmUuY3BwCkBAIC0yOSwyMCArMjksMjAgQEAKICNpZmRlZiBfU0tJQV9TVVBQT1JUXwogICAgIHBDb250ZXh0LT5tX3BEZXZpY2UgPSBuZXcgQ0ZYX1NraWFEZXZpY2U7CiAgICAgaWYgKGZsYWdzICYgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIpCi0gICAgICAgICgoQ0ZYX1NraWFEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLDAsVFJVRSk7CisgICAgICAgICgoQ0ZYX1NraWFEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLDAsdHJ1ZSk7CiAgICAgZWxzZQogICAgICAgICAoKENGWF9Ta2lhRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCk7CiAjZWxzZQogICAgIHBDb250ZXh0LT5tX3BEZXZpY2UgPSBuZXcgQ0ZYX0Z4Z2VEZXZpY2U7CiAgICAgaWYgKGZsYWdzICYgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIpCi0gICAgICAgICgoQ0ZYX0Z4Z2VEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLDAsVFJVRSk7CisgICAgICAgICgoQ0ZYX0Z4Z2VEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLDAsdHJ1ZSk7CiAgICAgZWxzZQogICAgICAgICAoKENGWF9GeGdlRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCk7CiAjZW5kaWYKICAgICBJRlNES19QQVVTRV9BZGFwdGVyIElQYXVzZUFkYXB0ZXIocGF1c2UpOwogCiAgICAgRlBERl9SZW5kZXJQYWdlX1JldGFpbChwQ29udGV4dCwgcGFnZSwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGUsIGZsYWdzLEZBTFNFLCAmSVBhdXNlQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGUsIGZsYWdzLGZhbHNlLCAmSVBhdXNlQWRhcHRlcik7CiAKICAgICBpZiAocENvbnRleHQtPm1fcFJlbmRlcmVyKQogICAgICAgICByZXR1cm4gQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpUb0ZQREZTdGF0dXMocENvbnRleHQtPm1fcFJlbmRlcmVyLT5HZXRTdGF0dXMoKSk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmX3N5c2ZvbnRpbmZvLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZfc3lzZm9udGluZm8uY3BwCmluZGV4IGNmMGNkZDkuLjY5MTcxMDcgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZfc3lzZm9udGluZm8uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZfc3lzZm9udGluZm8uY3BwCkBAIC0yMCwxNiArMjAsMTYgQEAKIAkJZGVsZXRlIHRoaXM7CiAJfQogCi0JdmlydHVhbAlGWF9CT09MCQlFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpIG92ZXJyaWRlCisJdmlydHVhbAlib29sCQlFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpIG92ZXJyaWRlCiAJewogCQlpZiAobV9wSW5mby0+RW51bUZvbnRzKSB7CiAJCQltX3BJbmZvLT5FbnVtRm9udHMobV9wSW5mbywgcE1hcHBlcik7Ci0JCQlyZXR1cm4gVFJVRTsKKwkJCXJldHVybiB0cnVlOwogCQl9Ci0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAotCXZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFtaWx5LCBpbnQmIGlFeGFjdCkgIG92ZXJyaWRlCisJdmlydHVhbCB2b2lkKgkJTWFwRm9udChpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYW1pbHksIGludCYgaUV4YWN0KSAgb3ZlcnJpZGUKIAl7CiAJCWlmIChtX3BJbmZvLT5NYXBGb250KQogCQkJcmV0dXJuIG1fcEluZm8tPk1hcEZvbnQobV9wSW5mbywgd2VpZ2h0LCBiSXRhbGljLCBjaGFyc2V0LCBwaXRjaF9mYW1pbHksIGZhbWlseSwgJmlFeGFjdCk7CkBAIC01MCwyNSArNTAsMjUgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JdmlydHVhbCBGWF9CT09MCQlHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpICBvdmVycmlkZQorCXZpcnR1YWwgYm9vbAkJR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSAgb3ZlcnJpZGUKIAl7Ci0JCWlmIChtX3BJbmZvLT5HZXRGYWNlTmFtZSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisJCWlmIChtX3BJbmZvLT5HZXRGYWNlTmFtZSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CiAJCUZYX0RXT1JEIHNpemUgPSBtX3BJbmZvLT5HZXRGYWNlTmFtZShtX3BJbmZvLCBoRm9udCwgTlVMTCwgMCk7Ci0JCWlmIChzaXplID09IDApIHJldHVybiBGQUxTRTsKKwkJaWYgKHNpemUgPT0gMCkgcmV0dXJuIGZhbHNlOwogCQljaGFyKiBidWZmZXIgPSBGWF9BbGxvYyhjaGFyLCBzaXplKTsKIAkJc2l6ZSA9IG1fcEluZm8tPkdldEZhY2VOYW1lKG1fcEluZm8sIGhGb250LCBidWZmZXIsIHNpemUpOwogCQluYW1lID0gQ0ZYX0J5dGVTdHJpbmcoYnVmZmVyLCBzaXplKTsKIAkJRlhfRnJlZShidWZmZXIpOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCi0JdmlydHVhbCBGWF9CT09MCQlHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KSAgb3ZlcnJpZGUKKwl2aXJ0dWFsIGJvb2wJCUdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpICBvdmVycmlkZQogCXsKIAkJaWYgKG1fcEluZm8tPkdldEZvbnRDaGFyc2V0KSB7CiAJCQljaGFyc2V0ID0gbV9wSW5mby0+R2V0Rm9udENoYXJzZXQobV9wSW5mbywgaEZvbnQpOwotCQkJcmV0dXJuIFRSVUU7CisJCQlyZXR1cm4gdHJ1ZTsKIAkJfQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAl9CiAKIAl2aXJ0dWFsIHZvaWQJCURlbGV0ZUZvbnQodm9pZCogaEZvbnQpICBvdmVycmlkZQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZl90cmFuc2Zvcm1wYWdlLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZfdHJhbnNmb3JtcGFnZS5jcHAKaW5kZXggYTI5ZGI1YS4uY2YxN2YyMCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZl90cmFuc2Zvcm1wYWdlLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmX3RyYW5zZm9ybXBhZ2UuY3BwCkBAIC00Miw3ICs0Miw3IEBACiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfR2V0TWVkaWFCb3goRlBERl9QQUdFIHBhZ2UsIGZsb2F0KiBsZWZ0LCBmbG9hdCogYm90dG9tLCBmbG9hdCogcmlnaHQsIGZsb2F0KiB0b3ApCiB7CiAJaWYoIXBhZ2UpCi0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOwogCUNQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0OwogCUNQREZfQXJyYXkqIHBBcnJheSA9IHBQYWdlRGljdC0+R2V0QXJyYXkoIk1lZGlhQm94Iik7CkBAIC01MiwxNSArNTIsMTUgQEAKIAkJKmJvdHRvbSA9IHBBcnJheS0+R2V0RmxvYXQoMSk7CiAJCSpyaWdodCA9IHBBcnJheS0+R2V0RmxvYXQoMik7CiAJCSp0b3AgPSBwQXJyYXktPkdldEZsb2F0KDMpOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9HZXRDcm9wQm94KEZQREZfUEFHRSBwYWdlLCBmbG9hdCogbGVmdCwgZmxvYXQqIGJvdHRvbSwgZmxvYXQqIHJpZ2h0LCBmbG9hdCogdG9wKQogewogCWlmKCFwYWdlKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKIAlDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKIAlDUERGX0FycmF5KiBwQXJyYXkgPSBwUGFnZURpY3QtPkdldEFycmF5KCJDcm9wQm94Iik7CkBAIC03MCwxNSArNzAsMTUgQEAKIAkJKmJvdHRvbSA9IHBBcnJheS0+R2V0RmxvYXQoMSk7CiAJCSpyaWdodCA9IHBBcnJheS0+R2V0RmxvYXQoMik7CiAJCSp0b3AgPSBwQXJyYXktPkdldEZsb2F0KDMpOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9UcmFuc0Zvcm1XaXRoQ2xpcChGUERGX1BBR0UgcGFnZSwgRlNfTUFUUklYKiBtYXRyaXgsIEZTX1JFQ1RGKiBjbGlwUmVjdCkKIHsKIAlpZighcGFnZSkKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAKIAlDRlhfQnl0ZVRleHRCdWYgdGV4dEJ1ZjsKIAl0ZXh0QnVmPDwicSAiOwpAQCAtOTksMTkgKzk5LDE5IEBACiAJaWYoIXBDb250ZW50T2JqKQogCQlwQ29udGVudE9iaiA9IHBQYWdlRGljID8gcFBhZ2VEaWMtPkdldEFycmF5KCJDb250ZW50cyIpIDogTlVMTDsKIAlpZighcENvbnRlbnRPYmopCi0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogCiAJQ1BERl9EaWN0aW9uYXJ5KiBwRGljID0gbmV3IENQREZfRGljdGlvbmFyeTsKIAlDUERGX1N0cmVhbSogcFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShOVUxMLDAsIHBEaWMpOwotCXBTdHJlYW0tPlNldERhdGEodGV4dEJ1Zi5HZXRCdWZmZXIoKSwgdGV4dEJ1Zi5HZXRTaXplKCksIEZBTFNFLCBGQUxTRSk7CisJcFN0cmVhbS0+U2V0RGF0YSh0ZXh0QnVmLkdldEJ1ZmZlcigpLCB0ZXh0QnVmLkdldFNpemUoKSwgZmFsc2UsIGZhbHNlKTsKIAlDUERGX0RvY3VtZW50KiBwRG9jID0gcFBhZ2UtPm1fcERvY3VtZW50OwogCWlmKCFwRG9jKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAlwRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwU3RyZWFtKTsKIAogCXBEaWMgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwogCUNQREZfU3RyZWFtKiBwRW5kU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsMCwgcERpYyk7Ci0JcEVuZFN0cmVhbS0+U2V0RGF0YSgoY29uc3QgdWludDhfdCopIiBRIiwgMiwgRkFMU0UsIEZBTFNFKTsKKwlwRW5kU3RyZWFtLT5TZXREYXRhKChjb25zdCB1aW50OF90KikiIFEiLCAyLCBmYWxzZSwgZmFsc2UpOwogCXBEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBFbmRTdHJlYW0pOwogCiAJQ1BERl9BcnJheSogcENvbnRlbnRBcnJheSA9IE5VTEw7CkBAIC0xODEsNyArMTgxLDcgQEAKIAkJfQogCX0KIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlT2JqX1RyYW5zZm9ybUNsaXBQYXRoKEZQREZfUEFHRU9CSkVDVCBwYWdlX29iamVjdCxkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBjLCBkb3VibGUgZCwgZG91YmxlIGUsIGRvdWJsZSBmKQpAQCAtMjA1LDcgKzIwNSw3IEBACiAJQ1BERl9QYXRoIFBhdGg7CiAJUGF0aC5HZXRNb2RpZnkoKTsKIAlQYXRoLkFwcGVuZFJlY3QobGVmdCwgYm90dG9tLCByaWdodCwgdG9wKTsKLQlwTmV3Q2xpcFBhdGgtPkFwcGVuZFBhdGgoUGF0aCwgRlhGSUxMX0FMVEVSTkFURSwgRkFMU0UpOworCXBOZXdDbGlwUGF0aC0+QXBwZW5kUGF0aChQYXRoLCBGWEZJTExfQUxURVJOQVRFLCBmYWxzZSk7CiAJcmV0dXJuIHBOZXdDbGlwUGF0aDsKIH0KIApAQCAtMjgyLDcgKzI4Miw3IEBACiAJfQogCUNQREZfRGljdGlvbmFyeSogcERpYyA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CiAJQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW0oTlVMTCwwLCBwRGljKTsKLQlwU3RyZWFtLT5TZXREYXRhKHN0ckNsaXAuR2V0QnVmZmVyKCksIHN0ckNsaXAuR2V0U2l6ZSgpLCBGQUxTRSwgRkFMU0UpOworCXBTdHJlYW0tPlNldERhdGEoc3RyQ2xpcC5HZXRCdWZmZXIoKSwgc3RyQ2xpcC5HZXRTaXplKCksIGZhbHNlLCBmYWxzZSk7CiAJQ1BERl9Eb2N1bWVudCogcERvYyA9IHBQYWdlLT5tX3BEb2N1bWVudDsKIAlpZighcERvYykKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZmRvYy5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmZG9jLmNwcAppbmRleCBmNzUxOTdiLi5lMjY0MDY5IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmZG9jLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmZG9jLmNwcApAQCAtMjA4LDEzICsyMDgsMTMgQEAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19FbnVtZXJhdGUoRlBERl9QQUdFIHBhZ2UsIGludCogc3RhcnRQb3MsIEZQREZfTElOSyogbGlua0Fubm90KQogewogICAgIGlmKCFwYWdlIHx8ICFzdGFydFBvcyB8fCAhbGlua0Fubm90KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKICAgICBpZighcFBhZ2UtPm1fcEZvcm1EaWN0KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBDUERGX0FycmF5KiBwQW5ub3RzID0gcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRBcnJheSgiQW5ub3RzIik7CiAgICAgaWYoIXBBbm5vdHMpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGZvciAoaW50IGkgPSAqc3RhcnRQb3M7IGkgPCAoaW50KXBBbm5vdHMtPkdldENvdW50KCk7IGkrKykgewogICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcEFubm90cy0+R2V0RWxlbWVudFZhbHVlKGkpOwogICAgICAgICBpZiAoIXBEaWN0IHx8IHBEaWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpCkBAIC0yMjIsMjMgKzIyMiwyMyBAQAogICAgICAgICBpZihwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTdWJ0eXBlIikpLkVxdWFsKEZYX0JTVFJDKCJMaW5rIikpKSB7CiAgICAgICAgICAgICAqc3RhcnRQb3MgPSBpICsgMTsKICAgICAgICAgICAgICpsaW5rQW5ub3QgPSAoRlBERl9MSU5LKXBEaWN0OwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfR2V0QW5ub3RSZWN0KEZQREZfTElOSyBsaW5rQW5ub3QsIEZTX1JFQ1RGKiByZWN0KQogewogICAgIGlmKCFsaW5rQW5ub3QgfHwgIXJlY3QpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9IChDUERGX0RpY3Rpb25hcnkqKWxpbmtBbm5vdDsKICAgICBDUERGX1JlY3QgcnQgPSBwQW5ub3REaWN0LT5HZXRSZWN0KEZYX0JTVFJDKCJSZWN0IikpOwogICAgIHJlY3QtPmxlZnQgPSBydC5sZWZ0OwogICAgIHJlY3QtPmJvdHRvbSA9IHJ0LmJvdHRvbTsKICAgICByZWN0LT5yaWdodCA9IHJ0LnJpZ2h0OwogICAgIHJlY3QtPnRvcCA9IHJ0LnRvcDsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZMaW5rX0NvdW50UXVhZFBvaW50cyhGUERGX0xJTksgbGlua0Fubm90KQpAQCAtMjU1LDEyICsyNTUsMTIgQEAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19HZXRRdWFkUG9pbnRzKEZQREZfTElOSyBsaW5rQW5ub3QsIGludCBxdWFkSW5kZXgsIEZTX1FVQURQT0lOVFNGKiBxdWFkUG9pbnRzKQogewogICAgIGlmKCFsaW5rQW5ub3QgfHwgIXF1YWRQb2ludHMpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9IChDUERGX0RpY3Rpb25hcnkqKWxpbmtBbm5vdDsKICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBwQW5ub3REaWN0LT5HZXRBcnJheShGWF9CU1RSQygiUXVhZFBvaW50cyIpKTsKICAgICBpZiAocEFycmF5KSB7CiAgICAgICAgIGlmIChxdWFkSW5kZXggPCAwIHx8IHF1YWRJbmRleCA+PSAoaW50KXBBcnJheS0+R2V0Q291bnQoKS84IHx8ICgocXVhZEluZGV4KjgrNykgPj0gKGludClwQXJyYXktPkdldENvdW50KCkpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICBxdWFkUG9pbnRzLT54MSA9IHBBcnJheS0+R2V0TnVtYmVyKHF1YWRJbmRleCo4KTsKICAgICAgICAgcXVhZFBvaW50cy0+eTEgPSBwQXJyYXktPkdldE51bWJlcihxdWFkSW5kZXgqOCsxKTsKICAgICAgICAgcXVhZFBvaW50cy0+eDIgPSBwQXJyYXktPkdldE51bWJlcihxdWFkSW5kZXgqOCsyKTsKQEAgLTI2OSw5ICsyNjksOSBAQAogICAgICAgICBxdWFkUG9pbnRzLT55MyA9IHBBcnJheS0+R2V0TnVtYmVyKHF1YWRJbmRleCo4KzUpOwogICAgICAgICBxdWFkUG9pbnRzLT54NCA9IHBBcnJheS0+R2V0TnVtYmVyKHF1YWRJbmRleCo4KzYpOwogICAgICAgICBxdWFkUG9pbnRzLT55NCA9IHBBcnJheS0+R2V0TnVtYmVyKHF1YWRJbmRleCo4KzcpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIERMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERl9HZXRNZXRhVGV4dChGUERGX0RPQ1VNRU5UIGRvYywgRlBERl9CWVRFU1RSSU5HIHRhZywKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0aW1nLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0aW1nLmNwcAppbmRleCA5NmNmYmE0Li5jZWMzZTIyIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmZWRpdGltZy5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZmVkaXRpbWcuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkltYWdlT2JqX0xvYWRKcGVnRmlsZShGUERGX1BBR0UqIHBhZ2VzLCBpbnQgbkNvdW50LEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsIEZQREZfRklMRUFDQ0VTUyogZmlsZUFjY2VzcykKIHsKIAlpZiAoIWltYWdlX29iamVjdCB8fCAhZmlsZUFjY2VzcykKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAKIAlJRlhfRmlsZVJlYWQqIHBGaWxlID0gbmV3IENQREZfQ3VzdG9tQWNjZXNzKGZpbGVBY2Nlc3MpOwogCUNQREZfSW1hZ2VPYmplY3QqIHBJbWdPYmogPSAoQ1BERl9JbWFnZU9iamVjdCopaW1hZ2Vfb2JqZWN0OwpAQCAtMzMsNyArMzMsNyBAQAogCX0KIAlwSW1nT2JqLT5tX3BJbWFnZS0+U2V0SnBlZ0ltYWdlKHBGaWxlKTsKIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCiAKQEAgLTQxLDcgKzQxLDcgQEAKIAkJCQkJCQkJCQkJCSBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBjLCBkb3VibGUgZCwgZG91YmxlIGUsIGRvdWJsZSBmKQogewogCWlmICghaW1hZ2Vfb2JqZWN0KQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAlDUERGX0ltYWdlT2JqZWN0KiBwSW1nT2JqID0gKENQREZfSW1hZ2VPYmplY3QqKWltYWdlX29iamVjdDsKIAlwSW1nT2JqLT5tX01hdHJpeC5hID0gKEZYX0ZMT0FUKWE7CiAJcEltZ09iai0+bV9NYXRyaXguYiA9IChGWF9GTE9BVCliOwpAQCAtNTAsMTMgKzUwLDEzIEBACiAJcEltZ09iai0+bV9NYXRyaXguZSA9IChGWF9GTE9BVCllOwogCXBJbWdPYmotPm1fTWF0cml4LmYgPSAoRlhfRkxPQVQpZjsKIAlwSW1nT2JqLT5DYWxjQm91bmRpbmdCb3goKTsKLQlyZXR1cm4gIFRSVUU7CisJcmV0dXJuICB0cnVlOwogfQogCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkltYWdlT2JqX1NldEJpdG1hcChGUERGX1BBR0UqIHBhZ2VzLGludCBuQ291bnQsRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCxGUERGX0JJVE1BUCBiaXRtYXApCiB7CiAJaWYgKCFpbWFnZV9vYmplY3QgfHwgIWJpdG1hcCkKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJQ0ZYX0RJQml0bWFwKiBwQm1wID0gTlVMTDsKIAlwQm1wID0gKENGWF9ESUJpdG1hcCopYml0bWFwOwogCUNQREZfSW1hZ2VPYmplY3QqIHBJbWdPYmogPSAoQ1BERl9JbWFnZU9iamVjdCopaW1hZ2Vfb2JqZWN0OwpAQCAtNjYsOCArNjYsOCBAQAogCQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZXNbaW5kZXhdOwogCQlwSW1nT2JqLT5tX3BJbWFnZS0+UmVzZXRDYWNoZShwUGFnZSxOVUxMKTsKIAl9Ci0JcEltZ09iai0+bV9wSW1hZ2UtPlNldEltYWdlKHBCbXAsRkFMU0UpOworCXBJbWdPYmotPm1fcEltYWdlLT5TZXRJbWFnZShwQm1wLGZhbHNlKTsKIAlwSW1nT2JqLT5DYWxjQm91bmRpbmdCb3goKTsKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZmVkaXRwYWdlLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0cGFnZS5jcHAKaW5kZXggMTJjMmNjZTEuLjgyMzZjYjIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0cGFnZS5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZmVkaXRwYWdlLmNwcApAQCAtMjE1LDcgKzIxNSw3IEBACiAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9IYXNUcmFuc3BhcmVuY3koRlBERl9QQUdFIHBhZ2UpCiB7Ci0JaWYoIXBhZ2UpIHJldHVybiBGQUxTRTsKKwlpZighcGFnZSkgcmV0dXJuIGZhbHNlOwogCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOwogCiAJcmV0dXJuIHBQYWdlLT5CYWNrZ3JvdW5kQWxwaGFOZWVkZWQoKTsKQEAgLTIyMywzNCArMjIzLDM0IEBACiAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZU9ial9IYXNUcmFuc3BhcmVuY3koRlBERl9QQUdFT0JKRUNUIHBhZ2VPYmplY3QpCiB7Ci0JaWYoIXBhZ2VPYmplY3QpIHJldHVybiBGQUxTRTsKKwlpZighcGFnZU9iamVjdCkgcmV0dXJuIGZhbHNlOwogCUNQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSAoQ1BERl9QYWdlT2JqZWN0KilwYWdlT2JqZWN0OwogCiAJY29uc3QgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwR2VuZXJhbFN0YXRlID0gcFBhZ2VPYmotPm1fR2VuZXJhbFN0YXRlOwogCWludCBibGVuZF90eXBlID0gcEdlbmVyYWxTdGF0ZSA/IHBHZW5lcmFsU3RhdGUtPm1fQmxlbmRUeXBlIDogRlhESUJfQkxFTkRfTk9STUFMOwotCWlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgcmV0dXJuIFRSVUU7CisJaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSByZXR1cm4gdHJ1ZTsKIAogCUNQREZfRGljdGlvbmFyeSogcFNNYXNrRGljdCA9IHBHZW5lcmFsU3RhdGUgPyAoQ1BERl9EaWN0aW9uYXJ5KilwR2VuZXJhbFN0YXRlLT5tX3BTb2Z0TWFzayA6IE5VTEw7Ci0JaWYocFNNYXNrRGljdCkgcmV0dXJuIFRSVUU7CisJaWYocFNNYXNrRGljdCkgcmV0dXJuIHRydWU7CiAKIAlpZihwR2VuZXJhbFN0YXRlICYmIHBHZW5lcmFsU3RhdGUtPm1fRmlsbEFscGhhICE9IDEuMGYpCi0JCXJldHVybiBUUlVFOworCQlyZXR1cm4gdHJ1ZTsKIAogCWlmKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9QQVRIKQogCXsKIAkJaWYocEdlbmVyYWxTdGF0ZSAmJiBwR2VuZXJhbFN0YXRlLT5tX1N0cm9rZUFscGhhICE9IDEuMGYpCi0JCQlyZXR1cm4gVFJVRTsKKwkJCXJldHVybiB0cnVlOwogCX0KIAogCWlmKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9GT1JNKQogCXsKIAkJQ1BERl9Gb3JtT2JqZWN0KiBwRm9ybU9iaiA9IChDUERGX0Zvcm1PYmplY3QqKXBQYWdlT2JqOwogCQlpZihwRm9ybU9iai0+bV9wRm9ybSAmJiAocEZvcm1PYmotPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQpKQotCQkJcmV0dXJuIFRSVUU7CisJCQlyZXR1cm4gdHJ1ZTsKIAkJaWYocEZvcm1PYmotPm1fcEZvcm0gJiYgKCEocEZvcm1PYmotPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQpICYmIChwRm9ybU9iai0+bV9wRm9ybS0+bV9UcmFuc3BhcmVuY3kgJiBQREZUUkFOU19HUk9VUCkpKQotCQkJcmV0dXJuIFRSVUU7CisJCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0dlbmVyYXRlQ29udGVudChGUERGX1BBR0UgcGFnZSkKQEAgLTI1OSwxMiArMjU5LDEyIEBACiAJaWYgKCFwUGFnZSB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0IHx8ICFwUGFnZS0+bV9wRm9ybURpY3QtPktleUV4aXN0KCJUeXBlIikgfHwgIXBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKQogCQl8fCBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCktPkdldFN0cmluZygpLkNvbXBhcmUoIlBhZ2UiKSkKIAl7Ci0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAlDUERGX1BhZ2VDb250ZW50R2VuZXJhdGUgQ0cocFBhZ2UpOwogCUNHLkdlbmVyYXRlQ29udGVudCgpOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VPYmpfVHJhbnNmb3JtKEZQREZfUEFHRU9CSkVDVCBwYWdlX29iamVjdCwKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZmb3JtZmlsbC5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmZm9ybWZpbGwuY3BwCmluZGV4IGQyMWQ1ZDIuLjIxYTQ0MWMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZmb3JtZmlsbC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZmZvcm1maWxsLmNwcApAQCAtMjgsNyArMjgsNyBAQAogQ1BERlNES19QYWdlVmlldyogRm9ybUhhbmRsZVRvUGFnZVZpZXcoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIEZQREZfUEFHRSBwYWdlKQogewogICAgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBGb3JtSGFuZGxlVG9TREtEb2MoaEhhbmRsZSk7Ci0gICAgcmV0dXJuIHBTREtEb2MgPyBwU0RLRG9jLT5HZXRQYWdlVmlldygoQ1BERl9QYWdlKilwYWdlLCBUUlVFKSA6IG51bGxwdHI7CisgICAgcmV0dXJuIHBTREtEb2MgPyBwU0RLRG9jLT5HZXRQYWdlVmlldygoQ1BERl9QYWdlKilwYWdlLCB0cnVlKSA6IG51bGxwdHI7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZQpAQCAtNDEsNyArNDEsNyBAQAogICAgIENQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKikgcGFnZTsKIAogICAgIG5vbnN0ZDo6dW5pcXVlX3B0cjxDUERGX0ludGVyRm9ybT4gcEludGVyRm9ybSgKLSAgICAgICAgbmV3IENQREZfSW50ZXJGb3JtKHBQYWdlLT5tX3BEb2N1bWVudCwgRkFMU0UpKTsKKyAgICAgICAgbmV3IENQREZfSW50ZXJGb3JtKHBQYWdlLT5tX3BEb2N1bWVudCwgZmFsc2UpKTsKICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBwSW50ZXJGb3JtLT5HZXRDb250cm9sQXRQb2ludCgKICAgICAgICAgcFBhZ2UsIChGWF9GTE9BVClwYWdlX3gsIChGWF9GTE9BVClwYWdlX3kpOwogICAgIGlmICghcEZvcm1DdHJsKQpAQCAtODQsNyArODQsNyBAQAogewogICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOwogICAgIGlmICghcFBhZ2VWaWV3KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfUG9pbnQgcHQoKEZYX0ZMT0FUKXBhZ2VfeCwgKEZYX0ZMT0FUKXBhZ2VfeSk7CiAgICAgcmV0dXJuIHBQYWdlVmlldy0+T25Nb3VzZU1vdmUocHQsIG1vZGlmaWVyKTsKQEAgLTk0LDcgKzk0LDcgQEAKIHsKICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKTsKICAgICBpZiAoIXBQYWdlVmlldykKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX1BvaW50IHB0KChGWF9GTE9BVClwYWdlX3gsIChGWF9GTE9BVClwYWdlX3kpOwogICAgIHJldHVybiBwUGFnZVZpZXctPk9uTEJ1dHRvbkRvd24ocHQsIG1vZGlmaWVyKTsKQEAgLTEwNCw3ICsxMDQsNyBAQAogewogICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOwogICAgIGlmICghcFBhZ2VWaWV3KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfUG9pbnQgcHQoKEZYX0ZMT0FUKXBhZ2VfeCwgKEZYX0ZMT0FUKXBhZ2VfeSk7CiAgICAgcmV0dXJuIHBQYWdlVmlldy0+T25MQnV0dG9uVXAocHQsIG1vZGlmaWVyKTsKQEAgLTExNCw3ICsxMTQsNyBAQAogewogICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOwogICAgIGlmICghcFBhZ2VWaWV3KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIHJldHVybiBwUGFnZVZpZXctPk9uS2V5RG93bihuS2V5Q29kZSwgbW9kaWZpZXIpOwogfQpAQCAtMTIzLDcgKzEyMyw3IEBACiB7CiAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSk7CiAgICAgaWYgKCFwUGFnZVZpZXcpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgcmV0dXJuIHBQYWdlVmlldy0+T25LZXlVcChuS2V5Q29kZSwgbW9kaWZpZXIpOwogfQpAQCAtMTMyLDcgKzEzMiw3IEBACiB7CiAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSk7CiAgICAgaWYgKCFwUGFnZVZpZXcpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgcmV0dXJuIHBQYWdlVmlldy0+T25DaGFyKG5DaGFyLCBtb2RpZmllcik7CiB9CkBAIC0xNDEsNyArMTQxLDcgQEAKIHsKICAgICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gRm9ybUhhbmRsZVRvU0RLRG9jKGhIYW5kbGUpOwogICAgIGlmICghcFNES0RvYykKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICByZXR1cm4gcFNES0RvYy0+S2lsbEZvY3VzQW5ub3QoMCk7CiB9CkBAIC0yMTYsNyArMjE2LDcgQEAKIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9PbkFmdGVyTG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UsIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKQogewogICAgIGlmIChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKSkKLSAgICAgICAgcFBhZ2VWaWV3LT5TZXRWYWxpZChUUlVFKTsKKyAgICAgICAgcFBhZ2VWaWV3LT5TZXRWYWxpZCh0cnVlKTsKIH0KIAogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGT1JNX09uQmVmb3JlQ2xvc2VQYWdlKEZQREZfUEFHRSBwYWdlLCBGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkKQEAgLTIyOSwxMCArMjI5LDEwIEBACiAgICAgICAgIHJldHVybjsKIAogICAgIENQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOwotICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBTREtEb2MtPkdldFBhZ2VWaWV3KHBQYWdlLCBGQUxTRSk7CisgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcFNES0RvYy0+R2V0UGFnZVZpZXcocFBhZ2UsIGZhbHNlKTsKICAgICBpZiAocFBhZ2VWaWV3KQogICAgIHsKLSAgICAgICAgcFBhZ2VWaWV3LT5TZXRWYWxpZChGQUxTRSk7CisgICAgICAgIHBQYWdlVmlldy0+U2V0VmFsaWQoZmFsc2UpOwogICAgICAgICAvLyBSZU1vdmVQYWdlVmlldygpIHRha2VzIGNhcmUgb2YgdGhlIGRlbGV0ZSBmb3IgdXMuCiAgICAgICAgIHBTREtEb2MtPlJlTW92ZVBhZ2VWaWV3KHBQYWdlKTsKICAgICB9CkBAIC0yNzksNyArMjc5LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSAoKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGUpLT5HZXRTREtEb2N1bWVudCgpOwogICAgIENQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOwotICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBTREtEb2MtPkdldFBhZ2VWaWV3KHBQYWdlLCBGQUxTRSk7CisgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcFNES0RvYy0+R2V0UGFnZVZpZXcocFBhZ2UsIGZhbHNlKTsKICAgICBpZihwUGFnZVZpZXcpCiAgICAgewogICAgICAgICBDUERGRG9jX0Vudmlyb25tZW50ICpwRW52ID0gcFNES0RvYy0+R2V0RW52KCk7CkBAIC0yOTMsOCArMjkzLDggQEAKIAogICAgICAgICBDUERGX0FBY3Rpb24gYWEgPSBwUGFnZURpY3QtPkdldERpY3QoRlhfQlNUUkMoIkFBIikpOwogCi0gICAgICAgIEZYX0JPT0wgYkV4aXN0T0FBY3Rpb24gPSBGQUxTRTsKLSAgICAgICAgRlhfQk9PTCBiRXhpc3RDQUFjdGlvbiA9IEZBTFNFOworICAgICAgICBib29sIGJFeGlzdE9BQWN0aW9uID0gZmFsc2U7CisgICAgICAgIGJvb2wgYkV4aXN0Q0FBY3Rpb24gPSBmYWxzZTsKICAgICAgICAgaWYgKEZQREZQQUdFX0FBQ1RJT05fT1BFTiA9PSBhYVR5cGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJFeGlzdE9BQWN0aW9uID0gYWEuQWN0aW9uRXhpc3QoQ1BERl9BQWN0aW9uOjpPcGVuUGFnZSk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmcHBvLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZwcG8uY3BwCmluZGV4IDQwZDU2YjMuLjFlZjY5YmYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZwcG8uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZwcG8uY3BwCkBAIC0xNSwxNCArMTUsMTQgQEAKICAgICBDUERGX1BhZ2VPcmdhbml6ZXIoKTsKICAgICB+Q1BERl9QYWdlT3JnYW5pemVyKCk7CiAKLSAgICBGWF9CT09MIFBERkRvY0luaXQoQ1BERl9Eb2N1bWVudCogcERlc3RQREZEb2MsIENQREZfRG9jdW1lbnQqIHBTcmNQREZEb2MpOwotICAgIEZYX0JPT0wgRXhwb3J0UGFnZShDUERGX0RvY3VtZW50KiBwU3JjUERGRG9jLAorICAgIGJvb2wgUERGRG9jSW5pdChDUERGX0RvY3VtZW50KiBwRGVzdFBERkRvYywgQ1BERl9Eb2N1bWVudCogcFNyY1BERkRvYyk7CisgICAgYm9vbCBFeHBvcnRQYWdlKENQREZfRG9jdW1lbnQqIHBTcmNQREZEb2MsCiAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Xb3JkQXJyYXkqIG5QYWdlTnVtLAogICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRGVzdFBERkRvYywKICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5JbmRleCk7CiAgICAgQ1BERl9PYmplY3QqIFBhZ2VEaWN0R2V0SW5oZXJpdGFibGVUYWcoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBuU3JjdGFnKTsKLSAgICBGWF9CT09MIFVwZGF0ZVJlZmVyZW5jZShDUERGX09iamVjdCogcE9iaiwKKyAgICBib29sIFVwZGF0ZVJlZmVyZW5jZShDUERGX09iamVjdCogcE9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE51bWJlck1hcCogcE9iak51bWJlck1hcCk7CiAgICAgRlhfRFdPUkQgR2V0TmV3T2JqSWQoQ1BERl9Eb2N1bWVudCogcERvYywKQEAgLTM5LDIxICszOSwyMSBAQAogewogfQogCi1GWF9CT09MIENQREZfUGFnZU9yZ2FuaXplcjo6UERGRG9jSW5pdChDUERGX0RvY3VtZW50KiBwRGVzdFBERkRvYywKK2Jvb2wgQ1BERl9QYWdlT3JnYW5pemVyOjpQREZEb2NJbml0KENQREZfRG9jdW1lbnQqIHBEZXN0UERGRG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcFNyY1BERkRvYykKIHsKICAgICBpZiAoIXBEZXN0UERGRG9jIHx8ICFwU3JjUERGRG9jKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfRGljdGlvbmFyeSogcE5ld1Jvb3QgPSBwRGVzdFBERkRvYy0+R2V0Um9vdCgpOwogICAgIGlmICghcE5ld1Jvb3QpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgLy9TZXQgdGhlIGRvY3VtZW50IGluZm9ybWF0aW9uLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogICAgIENQREZfRGljdGlvbmFyeSogREluZm9EaWN0ID0gcERlc3RQREZEb2MtPkdldEluZm8oKTsKICAgICBpZiAoIURJbmZvRGljdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDRlhfQnl0ZVN0cmluZyBwcm9kdWNlcnN0cjsKICAgICBwcm9kdWNlcnN0ci5Gb3JtYXQoIlBERml1bSIpOwpAQCAtODksMTAgKzg5LDEwIEBACiAgICAgICAgIHBOZXdQYWdlcy0+U2V0QXQoIkNvdW50IiwgbmV3IENQREZfTnVtYmVyKDApKTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDUERGX1BhZ2VPcmdhbml6ZXI6OkV4cG9ydFBhZ2UoQ1BERl9Eb2N1bWVudCogcFNyY1BERkRvYywKK2Jvb2wgQ1BERl9QYWdlT3JnYW5pemVyOjpFeHBvcnRQYWdlKENQREZfRG9jdW1lbnQqIHBTcmNQREZEb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV29yZEFycmF5KiBuUGFnZU51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEZXN0UERGRG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5JbmRleCkKQEAgLTEwNiw3ICsxMDYsNyBAQAogICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBTcmNQYWdlRGljdCA9CiAgICAgICAgICAgICBwU3JjUERGRG9jLT5HZXRQYWdlKG5QYWdlTnVtLT5HZXRBdChpKSAtIDEpOwogICAgICAgICBpZiAoIXBTcmNQYWdlRGljdCB8fCAhcEN1clBhZ2VEaWN0KQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIC8vIENsb25lIHRoZSBwYWdlIGRpY3Rpb25hcnkvLy8vLy8vLy8vLwogICAgICAgICBGWF9QT1NJVElPTiBTcmNQb3MgPSBwU3JjUGFnZURpY3QtPkdldFN0YXJ0UG9zKCk7CkBAIC0xNTEsNyArMTUxLDcgQEAKICAgICAgICAgaWYgKCFwQ3VyUGFnZURpY3QtPktleUV4aXN0KCJSZXNvdXJjZXMiKSkgewogICAgICAgICAgICAgcEluaGVyaXRhYmxlID0gUGFnZURpY3RHZXRJbmhlcml0YWJsZVRhZyhwU3JjUGFnZURpY3QsICJSZXNvdXJjZXMiKTsKICAgICAgICAgICAgIGlmICghcEluaGVyaXRhYmxlKQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICBwQ3VyUGFnZURpY3QtPlNldEF0KCJSZXNvdXJjZXMiLCBwSW5oZXJpdGFibGUtPkNsb25lKCkpOwogICAgICAgICB9CiAgICAgICAgIC8vMyBDcm9wQm94ICAvL09wdGlvbmFsCkBAIC0xNzgsNyArMTc4LDcgQEAKICAgICAgICAgKytjdXJwYWdlOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiBDUERGX09iamVjdCogQ1BERl9QYWdlT3JnYW5pemVyOjpQYWdlRGljdEdldEluaGVyaXRhYmxlVGFnKApAQCAtMjIwLDcgKzIyMCw3IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLUZYX0JPT0wgQ1BERl9QYWdlT3JnYW5pemVyOjpVcGRhdGVSZWZlcmVuY2UoQ1BERl9PYmplY3QqIHBPYmosCitib29sIENQREZfUGFnZU9yZ2FuaXplcjo6VXBkYXRlUmVmZXJlbmNlKENQREZfT2JqZWN0KiBwT2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3ROdW1iZXJNYXAqIHBPYmpOdW1iZXJNYXApCiB7CkBAIC0yMjksNyArMjI5LDcgQEAKICAgICAgICAgICAgIENQREZfUmVmZXJlbmNlKiBwUmVmZXJlbmNlID0gKENQREZfUmVmZXJlbmNlKilwT2JqOwogICAgICAgICAgICAgRlhfRFdPUkQgbmV3b2JqbnVtID0gR2V0TmV3T2JqSWQocERvYywgcE9iak51bWJlck1hcCwgcFJlZmVyZW5jZSk7CiAgICAgICAgICAgICBpZiAobmV3b2JqbnVtID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIHBSZWZlcmVuY2UtPlNldFJlZihwRG9jLCBuZXdvYmpudW0pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI0OSw3ICsyNDksNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoIVVwZGF0ZVJlZmVyZW5jZShwTmV4dE9iaiwgcERvYywgcE9iak51bWJlck1hcCkpCiAgICAgICAgICAgICAgICAgICAgICAgcERpY3QtPlJlbW92ZUF0KGtleSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKQEAgLTI2MCw5ICsyNjAsOSBAQAogICAgICAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE5leHRPYmogPSBwQXJyYXktPkdldEVsZW1lbnQoaSk7CiAgICAgICAgICAgICAgICAgaWYgKCFwTmV4dE9iaikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKCFVcGRhdGVSZWZlcmVuY2UocE5leHRPYmosIHBEb2MsIHBPYmpOdW1iZXJNYXApKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNzEsOSArMjcxLDkgQEAKICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7CiAgICAgICAgICAgICBpZiAocERpY3QpIHsKICAgICAgICAgICAgICAgICBpZiAoIVVwZGF0ZVJlZmVyZW5jZShwRGljdCwgcERvYywgcE9iak51bWJlck1hcCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI4MSw3ICsyODEsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIEZYX0RXT1JEIENQREZfUGFnZU9yZ2FuaXplcjo6R2V0TmV3T2JqSWQoQ1BERl9Eb2N1bWVudCogcERvYywKQEAgLTM0MSw3ICszNDEsNyBAQAogICAgICAgICBDRlhfQnl0ZVN0cmluZyBjYkNvbXBhcmVTdHJpbmcoIjAxMjM0NTY3ODktLCIpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5MZW5ndGg7ICsraSkgewogICAgICAgICAgICAgaWYgKGNiQ29tcGFyZVN0cmluZy5GaW5kKHJhbmdzdHJpbmdbaV0pID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY2JNaWRSYW5nZTsKICAgICAgICAgaW50IG5TdHJpbmdGcm9tID0gMDsKQEAgLTM1NSwyMyArMzU1LDIzIEBACiAgICAgICAgICAgICBpZiAobk1pZCA9PSAtMSkgewogICAgICAgICAgICAgICAgIGxvbmcgbFBhZ2VOdW0gPSBhdG9sKGNiTWlkUmFuZ2UpOwogICAgICAgICAgICAgICAgIGlmIChsUGFnZU51bSA8PSAwIHx8IGxQYWdlTnVtID4gbkNvdW50KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICBwYWdlQXJyYXktPkFkZCgoRlhfV09SRClsUGFnZU51bSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGludCBuU3RhcnRQYWdlTnVtID0gYXRvbChjYk1pZFJhbmdlLk1pZCgwLCBuTWlkKSk7CiAgICAgICAgICAgICAgICAgaWYgKG5TdGFydFBhZ2VOdW0gPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgICAgICAgICArK25NaWQ7CiAgICAgICAgICAgICAgICAgaW50IG5FbmQgPSBjYk1pZFJhbmdlLkdldExlbmd0aCgpIC0gbk1pZDsKICAgICAgICAgICAgICAgICBpZiAobkVuZCA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICAgICAgICAgIGludCBuRW5kUGFnZU51bSA9IGF0b2woY2JNaWRSYW5nZS5NaWQobk1pZCwgbkVuZCkpOwogICAgICAgICAgICAgICAgIGlmIChuU3RhcnRQYWdlTnVtIDwgMCB8fAogICAgICAgICAgICAgICAgICAgICBuU3RhcnRQYWdlTnVtID5uRW5kUGFnZU51bSB8fAogICAgICAgICAgICAgICAgICAgICBuRW5kUGFnZU51bSA+IG5Db3VudCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG5TdGFydFBhZ2VOdW07IGkgPD0gbkVuZFBhZ2VOdW07ICsraSkgewogICAgICAgICAgICAgICAgICAgICBwYWdlQXJyYXktPkFkZChpKTsKQEAgLTM4MCw3ICszODAsNyBAQAogICAgICAgICAgICAgblN0cmluZ0Zyb20gPSBuU3RyaW5nVG8gKyAxOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9JbXBvcnRQYWdlcyhGUERGX0RPQ1VNRU5UIGRlc3RfZG9jLApAQCAtMzg5LDE0ICszODksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkKIHsKICAgICBpZiAoIWRlc3RfZG9jIHx8ICFzcmNfZG9jKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIENGWF9Xb3JkQXJyYXkgcGFnZUFycmF5OwogICAgIENQREZfRG9jdW1lbnQqIHBTcmNEb2MgPSAoQ1BERl9Eb2N1bWVudCopc3JjX2RvYzsKICAgICBpbnQgbkNvdW50ID0gcFNyY0RvYy0+R2V0UGFnZUNvdW50KCk7CiAgICAgaWYgKHBhZ2VyYW5nZSkgewogICAgICAgICBpZiAoIVBhcnNlclBhZ2VSYW5nZVN0cmluZyhwYWdlcmFuZ2UsJnBhZ2VBcnJheSxuQ291bnQpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG5Db3VudDsgKytpKSB7CiAgICAgICAgICAgICBwYWdlQXJyYXkuQWRkKGkpOwpAQCAtNDIxLDEyICs0MjEsMTIgQEAKICAgICBDUERGX0RpY3Rpb25hcnkqIHBTcmNEaWN0ID0gcFNyY0RvYy0+R2V0Um9vdCgpOwogICAgIHBTcmNEaWN0ID0gcFNyY0RpY3QtPkdldERpY3QoRlhfQlNUUkMoIlZpZXdlclByZWZlcmVuY2VzIikpOzsKICAgICBpZiAoIXBTcmNEaWN0KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfRG9jdW1lbnQqIHBEc3REb2MgPSAoQ1BERl9Eb2N1bWVudCopZGVzdF9kb2M7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRHN0RGljdCA9IHBEc3REb2MtPkdldFJvb3QoKTsKICAgICBpZiAoIXBEc3REaWN0KQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcERzdERpY3QtPlNldEF0KEZYX0JTVFJDKCJWaWV3ZXJQcmVmZXJlbmNlcyIpLCBwU3JjRGljdC0+Q2xvbmUoVFJVRSkpOwotICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcERzdERpY3QtPlNldEF0KEZYX0JTVFJDKCJWaWV3ZXJQcmVmZXJlbmNlcyIpLCBwU3JjRGljdC0+Q2xvbmUodHJ1ZSkpOworICAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZnNhdmUuY3BwIGIvZnBkZnNkay9zcmMvZnBkZnNhdmUuY3BwCmluZGV4IGRkZDZmNmUuLjhlNWU0NzYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZzYXZlLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmc2F2ZS5jcHAKQEAgLTE5LDggKzE5LDggQEAKIAogcHVibGljOgogICAgIENGWF9JRmlsZVdyaXRlKCk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICBJbml0KCBGUERGX0ZJTEVXUklURSAqIHBGaWxlV3JpdGVTdHJ1Y3QgKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKyAgICBib29sICAgICAgICAgICAgIEluaXQoIEZQREZfRklMRVdSSVRFICogcEZpbGVXcml0ZVN0cnVjdCApOworICAgIHZpcnR1YWwgYm9vbCAgICAgV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgUmVsZWFzZSgpIG92ZXJyaWRlIHt9CiAKIHByb3RlY3RlZDoKQEAgLTMyLDIyICszMiwyMiBAQAogICAgIG1fcEZpbGVXcml0ZVN0cnVjdCA9IE5VTEw7CiB9CiAKLUZYX0JPT0wgQ0ZYX0lGaWxlV3JpdGU6OkluaXQoIEZQREZfRklMRVdSSVRFICogcEZpbGVXcml0ZVN0cnVjdCApCitib29sIENGWF9JRmlsZVdyaXRlOjpJbml0KCBGUERGX0ZJTEVXUklURSAqIHBGaWxlV3JpdGVTdHJ1Y3QgKQogewogICAgIGlmICghcEZpbGVXcml0ZVN0cnVjdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBtX3BGaWxlV3JpdGVTdHJ1Y3QgPSBwRmlsZVdyaXRlU3RydWN0OwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENGWF9JRmlsZVdyaXRlOjpXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBzaXplX3Qgc2l6ZSkKK2Jvb2wgQ0ZYX0lGaWxlV3JpdGU6OldyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKQogewogICAgIGlmICghbV9wRmlsZVdyaXRlU3RydWN0KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIG1fcEZpbGVXcml0ZVN0cnVjdC0+V3JpdGVCbG9jayggbV9wRmlsZVdyaXRlU3RydWN0LCBwRGF0YSwgc2l6ZSApOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiBGUERGX0JPT0wgX0ZQREZfRG9jX1NhdmUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCxGUERGX0ZJTEVXUklURSAqIHBGaWxlV3JpdGUsRlBERl9EV09SRCBmbGFncywgRlBERl9CT09MIGJTZXRWZXJzaW9uLApAQCAtNzEsNyArNzEsNyBAQAogICAgICAgICBGaWxlTWFrZXIuUmVtb3ZlU2VjdXJpdHkoKTsKICAgICB9CiAgICAgQ0ZYX0lGaWxlV3JpdGUqIHBTdHJlYW1Xcml0ZSA9IE5VTEw7Ci0gICAgRlhfQk9PTCBiUmV0OworICAgIGJvb2wgYlJldDsKICAgICBwU3RyZWFtV3JpdGUgPSBuZXcgQ0ZYX0lGaWxlV3JpdGU7CiAgICAgcFN0cmVhbVdyaXRlLT5Jbml0KCBwRmlsZVdyaXRlICk7CiAgICAgYlJldCA9IEZpbGVNYWtlci5DcmVhdGUocFN0cmVhbVdyaXRlLCBmbGFncyk7CkBAIC04MiwxMiArODIsMTIgQEAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1NhdmVBc0NvcHkoICAgIEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsRlBERl9GSUxFV1JJVEUgKiBwRmlsZVdyaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBmbGFncyApCiB7Ci0gICAgcmV0dXJuIF9GUERGX0RvY19TYXZlKGRvY3VtZW50LCBwRmlsZVdyaXRlLCBmbGFncywgRkFMU0UgLCAwKTsKKyAgICByZXR1cm4gX0ZQREZfRG9jX1NhdmUoZG9jdW1lbnQsIHBGaWxlV3JpdGUsIGZsYWdzLCBmYWxzZSAsIDApOwogfQogCiAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1NhdmVXaXRoVmVyc2lvbiggICBGUERGX0RPQ1VNRU5UIGRvY3VtZW50LEZQREZfRklMRVdSSVRFICogcEZpbGVXcml0ZSwKICAgICBGUERGX0RXT1JEIGZsYWdzLCBpbnQgZmlsZVZlcnNpb24pCiB7Ci0gICAgcmV0dXJuIF9GUERGX0RvY19TYXZlKGRvY3VtZW50LCBwRmlsZVdyaXRlLCBmbGFncywgVFJVRSAsIGZpbGVWZXJzaW9uKTsKKyAgICByZXR1cm4gX0ZQREZfRG9jX1NhdmUoZG9jdW1lbnQsIHBGaWxlV3JpdGUsIGZsYWdzLCB0cnVlICwgZmlsZVZlcnNpb24pOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZnRleHQuY3BwIGIvZnBkZnNkay9zcmMvZnBkZnRleHQuY3BwCmluZGV4IDRhNjU3MTUuLjRmZWNlZjQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZ0ZXh0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmdGV4dC5jcHAKQEAgLTE1NCwxMyArMTU0LDEzIEBACiB9CiBETExFWFBPUlQgRlBERl9CT09MCVNURENBTEwgRlBERlRleHRfRmluZE5leHQoRlBERl9TQ0hIQU5ETEUgaGFuZGxlKQogewotCWlmICghaGFuZGxlKSByZXR1cm4gRkFMU0U7CisJaWYgKCFoYW5kbGUpIHJldHVybiBmYWxzZTsKIAlJUERGX1RleHRQYWdlRmluZCogdGV4dHBhZ2VGaW5kPShJUERGX1RleHRQYWdlRmluZCopaGFuZGxlOwogCXJldHVybgl0ZXh0cGFnZUZpbmQtPkZpbmROZXh0KCk7CiB9CiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlRleHRfRmluZFByZXYoRlBERl9TQ0hIQU5ETEUgaGFuZGxlKQogewotCWlmICghaGFuZGxlKSByZXR1cm4gRkFMU0U7CisJaWYgKCFoYW5kbGUpIHJldHVybiBmYWxzZTsKIAlJUERGX1RleHRQYWdlRmluZCogdGV4dHBhZ2VGaW5kPShJUERGX1RleHRQYWdlRmluZCopaGFuZGxlOwogCXJldHVybgl0ZXh0cGFnZUZpbmQtPkZpbmRQcmV2KCk7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmdmlldy5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmdmlldy5jcHAKaW5kZXggOWVkZDVkOS4uNWE3MmU4ZiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZnZpZXcuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZ2aWV3LmNwcApAQCAtMjEsMTUgKzIxLDE1IEBACiAgICAgICAgIG1fRmlsZUFjY2VzcyA9ICpwRmlsZUFjY2VzczsKIH0KIAotRlhfQk9PTCBDUERGX0N1c3RvbUFjY2Vzczo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKK2Jvb2wgQ1BERl9DdXN0b21BY2Nlc3M6OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpCiB7CiAgICAgaWYgKG9mZnNldCA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX1NBRkVfRklMRVNJWkUgbmV3UG9zID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRklMRVNJWkUsIHNpemVfdD4oc2l6ZSk7CiAgICAgbmV3UG9zICs9IG9mZnNldDsKICAgICBpZiAoIW5ld1Bvcy5Jc1ZhbGlkKCkgfHwgbmV3UG9zLlZhbHVlT3JEaWUoKSA+IG1fRmlsZUFjY2Vzcy5tX0ZpbGVMZW4pIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBtX0ZpbGVBY2Nlc3MubV9HZXRCbG9jayhtX0ZpbGVBY2Nlc3MubV9QYXJhbSwgb2Zmc2V0LCh1aW50OF90KikgYnVmZmVyLCBzaXplKTsKIH0KQEAgLTU5LDkgKzU5LDkgQEAKICAgICBzd2l0Y2gocG9saWN5KQogICAgIHsKICAgICBjYXNlIEZQREZfUE9MSUNZX01BQ0hJTkVUSU1FX0FDQ0VTUzoKLSAgICAgICAgcmV0dXJuIChmb3hpdF9zYW5kYm94X3BvbGljeSAmIDB4MDEpID8gVFJVRSA6IEZBTFNFOworICAgICAgICByZXR1cm4gKGZveGl0X3NhbmRib3hfcG9saWN5ICYgMHgwMSkgPyB0cnVlIDogZmFsc2U7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogfQogCkBAIC04MSwxMSArODEsMTEgQEAKICAgICB2aXJ0dWFsIEZUX0ZhY2UgRmluZFN1YnN0Rm9udCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jLCAgICAgICAgICAgICAgICAvLyBbSU5dIFRoZSBQREYgZG9jdW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCAgICAvLyBbSU5dIE9yaWdpbmFsIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcnVlVHlwZSwgICAgICAgICAgICAgICAgICAvLyBbSU5dIFRydWVUeXBlIG9yIFR5cGUxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVHJ1ZVR5cGUsICAgICAgICAgICAgICAgICAgLy8gW0lOXSBUcnVlVHlwZSBvciBUeXBlMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLCAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gUERGIGZvbnQgZmxhZ3MgKHNlZSBQREYgUmVmZXJlbmNlIHNlY3Rpb24gNS43LjEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRfd2VpZ2h0LCAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBvcmlnaW5hbCBmb250IHdlaWdodC4gMCBmb3Igbm90IHNwZWNpZmllZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDaGFyc2V0Q1AsICAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gY29kZSBwYWdlIGZvciBjaGFyc2V0IChzZWUgV2luMzIgR2V0QUNQKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydGljYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVmVydGljYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TdWJzdEZvbnQqIHBTdWJzdEZvbnQgICAgICAgICAgLy8gW09VVF0gU3Vic3QgZm9udCBkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICApOwogCkBAIC0xOTEsMTggKzE5MSwxOCBAQAogCiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgUmVsZWFzZSgpIHtkZWxldGUgdGhpczt9CiAgICAgdmlydHVhbCBGWF9GSUxFU0laRSAgICAgR2V0U2l6ZSgpIHtyZXR1cm4gbV9zaXplO30KLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgIHZpcnR1YWwgYm9vbCAgICAgICAgIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpCiAgICAgewogICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgRlhfU0FGRV9GSUxFU0laRSBuZXdQb3MgPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9GSUxFU0laRSwgc2l6ZV90PihzaXplKTsKICAgICAgICAgICAgIG5ld1BvcyArPSBvZmZzZXQ7CiAgICAgICAgICAgICBpZiAoIW5ld1Bvcy5Jc1ZhbGlkKCkgfHwgbmV3UG9zLlZhbHVlT3JEaWUoKSA+IChGWF9EV09SRCltX3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICBGWFNZU19tZW1jcHkoYnVmZmVyLCBtX3BCdWYrb2Zmc2V0LCBzaXplKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIHByaXZhdGU6CiAgICAgdWludDhfdCogbV9wQnVmOwpAQCAtMjQ0LDE0ICsyNDQsMTQgQEAKIAogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfR2V0RmlsZVZlcnNpb24oRlBERl9ET0NVTUVOVCBkb2MsIGludCogZmlsZVZlcnNpb24pCiB7Ci0gICAgaWYoIWRvY3x8IWZpbGVWZXJzaW9uKSByZXR1cm4gRkFMU0U7CisgICAgaWYoIWRvY3x8IWZpbGVWZXJzaW9uKSByZXR1cm4gZmFsc2U7CiAgICAgKmZpbGVWZXJzaW9uID0gMDsKICAgICBDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvYzsKICAgICBDUERGX1BhcnNlciogcFBhcnNlciA9IChDUERGX1BhcnNlciopcERvYy0+R2V0UGFyc2VyKCk7CiAgICAgaWYoIXBQYXJzZXIpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICpmaWxlVmVyc2lvbiA9IHBQYXJzZXItPkdldEZpbGVWZXJzaW9uKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8vIGphYmRlbG1hbGVrOiBjaGFuZ2VkIHJldHVybiB0eXBlIGZyb20gRlhfRFdPUkQgdG8gYnVpbGQgb24gTGludXggKGFuZCBtYXRjaCBoZWFkZXIpLgpAQCAtMzMyLDcgKzMzMiw3IEBACiAKICNpZm5kZWYgX1dJTjMyX1dDRQogICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IE5VTEw7Ci0gICAgRlhfQk9PTCBiQmFja2dyb3VuZEFscGhhTmVlZGVkPUZBTFNFOworICAgIGJvb2wgYkJhY2tncm91bmRBbHBoYU5lZWRlZD1mYWxzZTsKICAgICBiQmFja2dyb3VuZEFscGhhTmVlZGVkID0gcFBhZ2UtPkJhY2tncm91bmRBbHBoYU5lZWRlZCgpOwogICAgIGlmIChiQmFja2dyb3VuZEFscGhhTmVlZGVkKQogICAgIHsKQEAgLTM1Miw3ICszNTIsNyBAQAogICAgICAgICBwQ29udGV4dC0+bV9wRGV2aWNlID0gbmV3IENGWF9XaW5kb3dzRGV2aWNlKGRjKTsKIAogICAgIEZQREZfUmVuZGVyUGFnZV9SZXRhaWwocENvbnRleHQsIHBhZ2UsIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlLCBmbGFncywgVFJVRSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGUsIGZsYWdzLCB0cnVlLCBOVUxMKTsKIAogICAgIGlmIChiQmFja2dyb3VuZEFscGhhTmVlZGVkKQogICAgIHsKQEAgLTM2Niw3ICszNjYsNyBAQAogICAgICAgICAgICAgICAgIGludCBwaXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7CiAgICAgICAgICAgICAgICAgcERzdC0+Q3JlYXRlKHNpemVfeCwgc2l6ZV95LCBGWERJQl9SZ2IzMik7CiAgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KHBEc3QtPkdldEJ1ZmZlcigpLCAtMSwgcGl0Y2gqc2l6ZV95KTsKLSAgICAgICAgICAgICAgICBwRHN0LT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgc2l6ZV94LCBzaXplX3ksIHBCaXRtYXAsIDAsIDAsIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgRkFMU0UsIE5VTEwpOworICAgICAgICAgICAgICAgIHBEc3QtPkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBzaXplX3gsIHNpemVfeSwgcEJpdG1hcCwgMCwgMCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBmYWxzZSwgTlVMTCk7CiAgICAgICAgICAgICAgICAgV2luREMuU3RyZXRjaERJQml0cyhwRHN0LDAsMCxzaXplX3gsc2l6ZV95KTsKICAgICAgICAgICAgICAgICBkZWxldGUgcERzdDsKICAgICAgICAgICAgIH0KQEAgLTQ5MiwyMCArNDkyLDIwIEBACiAgICAgcENvbnRleHQtPm1fcERldmljZSA9IG5ldyBDRlhfU2tpYURldmljZTsKIAogICAgIGlmIChmbGFncyAmIEZQREZfUkVWRVJTRV9CWVRFX09SREVSKQotICAgICAgICAoKENGWF9Ta2lhRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCwwLFRSVUUpOworICAgICAgICAoKENGWF9Ta2lhRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCwwLHRydWUpOwogICAgIGVsc2UKICAgICAgICAgKChDRlhfU2tpYURldmljZSopcENvbnRleHQtPm1fcERldmljZSktPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKiliaXRtYXApOwogI2Vsc2UKICAgICBwQ29udGV4dC0+bV9wRGV2aWNlID0gbmV3IENGWF9GeGdlRGV2aWNlOwogCiAgICAgaWYgKGZsYWdzICYgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIpCi0gICAgICAgICgoQ0ZYX0Z4Z2VEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLDAsVFJVRSk7CisgICAgICAgICgoQ0ZYX0Z4Z2VEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLDAsdHJ1ZSk7CiAgICAgZWxzZQogICAgICAgICAoKENGWF9GeGdlRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCk7CiAjZW5kaWYKIAogICAgIEZQREZfUmVuZGVyUGFnZV9SZXRhaWwocENvbnRleHQsIHBhZ2UsIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlLCBmbGFncywgVFJVRSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGUsIGZsYWdzLCB0cnVlLCBOVUxMKTsKIAogICAgIGRlbGV0ZSBwQ29udGV4dDsKICAgICBwUGFnZS0+UmVtb3ZlUHJpdmF0ZURhdGEoKHZvaWQqKTEpOwpAQCAtNjUzLDcgKzY1Myw3IEBACiB9CiAKIHZvaWQgRlBERl9SZW5kZXJQYWdlX1JldGFpbChDUmVuZGVyQ29udGV4dCogcENvbnRleHQsIEZQREZfUEFHRSBwYWdlLCBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsIGludCBzaXplX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwgaW50IGZsYWdzLEZYX0JPT0wgYk5lZWRUb1Jlc3RvcmUsIElGU0RLX1BBVVNFX0FkYXB0ZXIgKiBwYXVzZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwgaW50IGZsYWdzLGJvb2wgYk5lZWRUb1Jlc3RvcmUsIElGU0RLX1BBVVNFX0FkYXB0ZXIgKiBwYXVzZSApCiB7CiAgICAgQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7CiAgICAgaWYgKHBQYWdlID09IE5VTEwpIHJldHVybjsKQEAgLTcwNSw4ICs3MDUsOCBAQAogCiAgICAgaWYgKGZsYWdzICYgRlBERl9BTk5PVCkgewogICAgICAgICBwQ29udGV4dC0+bV9wQW5ub3RzID0gbmV3IENQREZfQW5ub3RMaXN0KHBQYWdlKTsKLSAgICAgICAgRlhfQk9PTCBiUHJpbnRpbmcgPSBwQ29udGV4dC0+bV9wRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpICE9IEZYRENfRElTUExBWTsKLSAgICAgICAgcENvbnRleHQtPm1fcEFubm90cy0+RGlzcGxheUFubm90cyhwUGFnZSwgcENvbnRleHQtPm1fcENvbnRleHQsIGJQcmludGluZywgJm1hdHJpeCwgVFJVRSwgTlVMTCk7CisgICAgICAgIGJvb2wgYlByaW50aW5nID0gcENvbnRleHQtPm1fcERldmljZS0+R2V0RGV2aWNlQ2xhc3MoKSAhPSBGWERDX0RJU1BMQVk7CisgICAgICAgIHBDb250ZXh0LT5tX3BBbm5vdHMtPkRpc3BsYXlBbm5vdHMocFBhZ2UsIHBDb250ZXh0LT5tX3BDb250ZXh0LCBiUHJpbnRpbmcsICZtYXRyaXgsIHRydWUsIE5VTEwpOwogICAgIH0KIAogICAgIHBDb250ZXh0LT5tX3BSZW5kZXJlciA9IG5ldyBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXIoCkBAIC03MjAsMjMgKzcyMCwyMyBAQAogewogICAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jdW1lbnQ7CiAgICAgaWYocERvYyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwRG9jLT5HZXRQYWdlKHBhZ2VfaW5kZXgpOwotICAgIGlmIChwRGljdCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKHBEaWN0ID09IE5VTEwpIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfUGFnZSBwYWdlOwogICAgIHBhZ2UuTG9hZChwRG9jLCBwRGljdCk7CiAgICAgKndpZHRoID0gcGFnZS5HZXRQYWdlV2lkdGgoKTsKICAgICAqaGVpZ2h0ID0gcGFnZS5HZXRQYWdlSGVpZ2h0KCk7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfVklFV0VSUkVGX0dldFByaW50U2NhbGluZyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50KQogewogICAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jdW1lbnQ7Ci0gICAgaWYgKCFwRG9jKSByZXR1cm4gVFJVRTsKKyAgICBpZiAoIXBEb2MpIHJldHVybiB0cnVlOwogICAgIENQREZfVmlld2VyUHJlZmVyZW5jZXMgdmlld1JlZihwRG9jKTsKICAgICByZXR1cm4gdmlld1JlZi5QcmludFNjYWxpbmcoKTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZzZGtfYWN0aW9uaGFuZGxlci5jcHAgYi9mcGRmc2RrL3NyYy9mc2RrX2FjdGlvbmhhbmRsZXIuY3BwCmluZGV4IDE0NTU1OWUuLjdiYTIyN2YgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZzZGtfYWN0aW9uaGFuZGxlci5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnNka19hY3Rpb25oYW5kbGVyLmNwcApAQCAtMjQsMTQgKzI0LDE0IEBACiB9CiAKIC8vZG9jdW1lbnQgb3BlbgotRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0RvY09wZW4oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQorYm9vbAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0RvY09wZW4oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewogCUNGWF9QdHJMaXN0IGxpc3Q7CiAJcmV0dXJuIEV4ZWN1dGVEb2N1bWVudE9wZW5BY3Rpb24oYWN0aW9uLCBwRG9jdW1lbnQsIGxpc3QpOwogfQogCiAvL2RvY3VtZW50IG9wZW4KLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9KYXZhU2NyaXB0KGNvbnN0IENQREZfQWN0aW9uJiBKc0FjdGlvbixDRlhfV2lkZVN0cmluZyBjc0pTTmFtZSwKK2Jvb2wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9KYXZhU2NyaXB0KGNvbnN0IENQREZfQWN0aW9uJiBKc0FjdGlvbixDRlhfV2lkZVN0cmluZyBjc0pTTmFtZSwKIAkJCQkJCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7CiAJaWYgKEpzQWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdCkKQEAgLTQwLDE0ICs0MCwxNCBAQAogCQlpZiAoIXN3SlMuSXNFbXB0eSgpKQogCQl7CiAJCQlSdW5Eb2N1bWVudE9wZW5KYXZhU2NyaXB0KHBEb2N1bWVudCwgY3NKU05hbWUsIHN3SlMpOwotCQkJcmV0dXJuIFRSVUU7CisJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCX0KIAotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9GaWVsZEphdmFTY3JpcHQoY29uc3QgQ1BERl9BY3Rpb24mIEpzQWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCitib29sCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fRmllbGRKYXZhU2NyaXB0KGNvbnN0IENQREZfQWN0aW9uJiBKc0FjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAogCQkJCQkJCQkJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKIAkJCQkJCQkJCVBERlNES19GaWVsZEFjdGlvbiYgZGF0YSkKIHsKQEAgLTU5LDQ4ICs1OSw0OCBAQAogCQlpZiAoIXN3SlMuSXNFbXB0eSgpKQogCQl7CiAJCQlSdW5GaWVsZEphdmFTY3JpcHQocERvY3VtZW50LCBwRm9ybUZpZWxkLCB0eXBlLCBkYXRhLCBzd0pTKTsKLQkJCXJldHVybiBUUlVFOworCQkJcmV0dXJuIHRydWU7CiAJCX0KIAl9Ci0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1BhZ2UoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgZW51bSBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVUeXBlLAorYm9vbAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1BhZ2UoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgZW51bSBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVUeXBlLAogCQkJCQkJCQkJCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKIAlDRlhfUHRyTGlzdCBsaXN0OwogCXJldHVybiBFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKGFjdGlvbiwgZVR5cGUsIHBEb2N1bWVudCwgbGlzdCk7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Eb2N1bWVudChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBlbnVtIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZVR5cGUsCitib29sCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fRG9jdW1lbnQoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgZW51bSBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVUeXBlLAogCQkJCQkJCQkJCQkgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewogCUNGWF9QdHJMaXN0IGxpc3Q7CiAJcmV0dXJuIEV4ZWN1dGVEb2N1bWVudFBhZ2VBY3Rpb24oYWN0aW9uLCBlVHlwZSwgcERvY3VtZW50LCBsaXN0KTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0Jvb2tNYXJrKENQREZfQm9va21hcmsgKnBCb29rTWFyaywgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorYm9vbAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0Jvb2tNYXJrKENQREZfQm9va21hcmsgKnBCb29rTWFyaywgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAogCQkJCQkJCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKIAlDRlhfUHRyTGlzdCBsaXN0OwogCXJldHVybiBFeGVjdXRlQm9va01hcmsoYWN0aW9uLCBwRG9jdW1lbnQsIHBCb29rTWFyaywgbGlzdCk7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9TY3JlZW4oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorYm9vbAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1NjcmVlbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCiAJCQkJCQkJCQkJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUNGWF9QdHJMaXN0IGxpc3Q7CiAJcmV0dXJuIEV4ZWN1dGVTY3JlZW5BY3Rpb24oYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIHBTY3JlZW4sIGxpc3QpOwogfQogCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fTGluayhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorYm9vbAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0xpbmsoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKIAkJCQkJCQkJCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7CiAJQ0ZYX1B0ckxpc3QgbGlzdDsKIAlyZXR1cm4gRXhlY3V0ZUxpbmtBY3Rpb24oYWN0aW9uLCBwRG9jdW1lbnQsIGxpc3QpOwogfQogCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fRmllbGQoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorYm9vbAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0ZpZWxkKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKIAkJCQkJCQkJCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCiAJCQkJCQkJCQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSkKIHsKQEAgLTEwOCwxMiArMTA4LDEyIEBACiAJcmV0dXJuIEV4ZWN1dGVGaWVsZEFjdGlvbihhY3Rpb24sIHR5cGUsIHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgZGF0YSwgbGlzdCk7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlRG9jdW1lbnRPcGVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKK2Jvb2wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlRG9jdW1lbnRPcGVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJMaXN0JiBsaXN0KQogewogCUNQREZfRGljdGlvbmFyeSogcERpY3QgPSBhY3Rpb24uR2V0RGljdCgpOwogCWlmIChsaXN0LkZpbmQocERpY3QpKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAogCWxpc3QuQWRkVGFpbChwRGljdCk7CiAKQEAgLTEzOCwyMCArMTM4LDIwIEBACiAJZm9yIChpbnQzMl90IGk9MCxzej1hY3Rpb24uR2V0U3ViQWN0aW9uc0NvdW50KCk7IGk8c3o7IGkrKykKIAl7CiAJCUNQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7Ci0JCWlmICghRXhlY3V0ZURvY3VtZW50T3BlbkFjdGlvbihzdWJhY3Rpb24sIHBEb2N1bWVudCwgbGlzdCkpIHJldHVybiBGQUxTRTsKKwkJaWYgKCFFeGVjdXRlRG9jdW1lbnRPcGVuQWN0aW9uKHN1YmFjdGlvbiwgcERvY3VtZW50LCBsaXN0KSkgcmV0dXJuIGZhbHNlOwogCX0KIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZUxpbmtBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorYm9vbCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkV4ZWN1dGVMaW5rQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKIAkJCQkJCQkJCQkJCSAgQ0ZYX1B0ckxpc3QmIGxpc3QpCiB7CiAJQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKIAogCUNQREZfRGljdGlvbmFyeSogcERpY3QgPSBhY3Rpb24uR2V0RGljdCgpOwogCWlmIChsaXN0LkZpbmQocERpY3QpKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAogCWxpc3QuQWRkVGFpbChwRGljdCk7CiAKQEAgLTE3NSw3ICsxNzUsNyBAQAogCQkJCXBDb250ZXh0LT5PbkxpbmtfTW91c2VVcChwRG9jdW1lbnQpOwogCiAJCQkJQ0ZYX1dpZGVTdHJpbmcgY3NJbmZvOwotCQkJCUZYX0JPT0wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc3dKUywgY3NJbmZvKTsKKwkJCQlib29sIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHN3SlMsIGNzSW5mbyk7CiAJCQkJaWYgKCFiUmV0KQogCQkJCXsKIAkJCQkJLy8gRklYTUU6IHJldHVybiBlcnJvci4KQEAgLTE5MywyMCArMTkzLDIwIEBACiAJZm9yIChpbnQzMl90IGk9MCxzej1hY3Rpb24uR2V0U3ViQWN0aW9uc0NvdW50KCk7IGk8c3o7IGkrKykKIAl7CiAJCUNQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7Ci0JCWlmICghRXhlY3V0ZUxpbmtBY3Rpb24oc3ViYWN0aW9uLCBwRG9jdW1lbnQsIGxpc3QpKSByZXR1cm4gRkFMU0U7CisJCWlmICghRXhlY3V0ZUxpbmtBY3Rpb24oc3ViYWN0aW9uLCBwRG9jdW1lbnQsIGxpc3QpKSByZXR1cm4gZmFsc2U7CiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKK2Jvb2wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKIAkJCQkJCQkJCQkJCSBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9QdHJMaXN0JiBsaXN0KQogewogCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKIAlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKIAlpZiAobGlzdC5GaW5kKHBEaWN0KSkKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAKIAlsaXN0LkFkZFRhaWwocERpY3QpOwogCkBAIC0yMjksMTggKzIyOSwxOCBAQAogCX0KIAogCWlmICghSXNWYWxpZERvY1ZpZXcocERvY3VtZW50KSkKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAKIAlmb3IgKGludDMyX3QgaT0wLHN6PWFjdGlvbi5HZXRTdWJBY3Rpb25zQ291bnQoKTsgaTxzejsgaSsrKQogCXsKIAkJQ1BERl9BY3Rpb24gc3ViYWN0aW9uID0gYWN0aW9uLkdldFN1YkFjdGlvbihpKTsKLQkJaWYgKCFFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKHN1YmFjdGlvbiwgdHlwZSwgcERvY3VtZW50LCBsaXN0KSkgcmV0dXJuIEZBTFNFOworCQlpZiAoIUV4ZWN1dGVEb2N1bWVudFBhZ2VBY3Rpb24oc3ViYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIGxpc3QpKSByZXR1cm4gZmFsc2U7CiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpJc1ZhbGlkRmllbGQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpCitib29sCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6SXNWYWxpZEZpZWxkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KQogewogICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogICBBU1NFUlQocEZpZWxkRGljdCAhPSBOVUxMKTsKQEAgLTI1NCw3ICsyNTQsNyBAQAogICByZXR1cm4gcFBERkludGVyRm9ybS0+R2V0RmllbGRCeURpY3QocEZpZWxkRGljdCkgIT0gTlVMTDsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkV4ZWN1dGVGaWVsZEFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCitib29sCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZUZpZWxkQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKIAkJCQkJCQkJCQkgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCiAJCQkJCQkJCQkJICBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsIENGWF9QdHJMaXN0JiBsaXN0KQogewpAQCAtMjYyLDcgKzI2Miw3IEBACiAKIAlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKIAlpZiAobGlzdC5GaW5kKHBEaWN0KSkKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAKIAlsaXN0LkFkZFRhaWwocERpY3QpOwogCkBAIC0yNzcsNyArMjc3LDcgQEAKIAkJCXsKIAkJCQlSdW5GaWVsZEphdmFTY3JpcHQocERvY3VtZW50LCBwRm9ybUZpZWxkLCB0eXBlLCBkYXRhLCBzd0pTKTsKIAkJCQlpZiAoIUlzVmFsaWRGaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQtPkdldEZpZWxkRGljdCgpKSkKLQkJCQkJcmV0dXJuIEZBTFNFOworCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAJCX0KIAl9CkBAIC0yODksMjAgKzI4OSwyMCBAQAogCWZvciAoaW50MzJfdCBpPTAsc3o9YWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpPHN6OyBpKyspCiAJewogCQlDUERGX0FjdGlvbiBzdWJhY3Rpb24gPSBhY3Rpb24uR2V0U3ViQWN0aW9uKGkpOwotCQlpZiAoIUV4ZWN1dGVGaWVsZEFjdGlvbihzdWJhY3Rpb24sIHR5cGUsIHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgZGF0YSwgbGlzdCkpIHJldHVybiBGQUxTRTsKKwkJaWYgKCFFeGVjdXRlRmllbGRBY3Rpb24oc3ViYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIHBGb3JtRmllbGQsIGRhdGEsIGxpc3QpKSByZXR1cm4gZmFsc2U7CiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlU2NyZWVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKK2Jvb2wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlU2NyZWVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKIAkJCQkJCQkJCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4sIENGWF9QdHJMaXN0JiBsaXN0KQogewogCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKIAlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKIAlpZiAobGlzdC5GaW5kKHBEaWN0KSkKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAKIAlsaXN0LkFkZFRhaWwocERpY3QpOwogCkBAIC0zNTYsMTIgKzM1NiwxMiBAQAogCS8vIAkJCQlwQ29udGV4dC0+T25TY3JlZW5fT3V0VmlldyhJc0NUUkxwcmVzc2VkKCksIElzU0hJRlRwcmVzc2VkKCksIHBTY3JlZW4pOwogCS8vIAkJCQlicmVhazsKIAkvLyAJCQlkZWZhdWx0OgotCS8vIAkJCQlBU1NFUlQoRkFMU0UpOworCS8vIAkJCQlBU1NFUlQoZmFsc2UpOwogCS8vIAkJCQlicmVhazsKIAkvLyAJCQl9CiAKIAkJCQlDRlhfV2lkZVN0cmluZyBjc0luZm87Ci0JCQkJRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzd0pTLCBjc0luZm8pOworCQkJCWJvb2wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc3dKUywgY3NJbmZvKTsKIAkJCQlpZiAoIWJSZXQpCiAJCQkJewogCQkJCQkvL0NCQ0xfRm9ybU5vdGlmeTo6TXNnQm94SlNFcnJvcihwUGFnZVZpZXctPkdldFBhZ2VWaWV3V25kKCksIGNzSW5mbyk7CkBAIC0zNzksMjAgKzM3OSwyMCBAQAogCWZvciAoaW50MzJfdCBpPTAsc3o9YWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpPHN6OyBpKyspCiAJewogCQlDUERGX0FjdGlvbiBzdWJhY3Rpb24gPSBhY3Rpb24uR2V0U3ViQWN0aW9uKGkpOwotCQlpZiAoIUV4ZWN1dGVTY3JlZW5BY3Rpb24oc3ViYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIHBTY3JlZW4sIGxpc3QpKSByZXR1cm4gRkFMU0U7CisJCWlmICghRXhlY3V0ZVNjcmVlbkFjdGlvbihzdWJhY3Rpb24sIHR5cGUsIHBEb2N1bWVudCwgcFNjcmVlbiwgbGlzdCkpIHJldHVybiBmYWxzZTsKIAl9CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkV4ZWN1dGVCb29rTWFyayhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCitib29sCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZUJvb2tNYXJrKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKIAkJCQkJCQkJCQkgQ1BERl9Cb29rbWFyayogcEJvb2ttYXJrLCBDRlhfUHRyTGlzdCYgbGlzdCkKIHsKIAlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCiAJQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7CiAJaWYgKGxpc3QuRmluZChwRGljdCkpCi0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogCiAJbGlzdC5BZGRUYWlsKHBEaWN0KTsKIApAQCAtNDE2LDcgKzQxNiw3IEBACiAJCQkJcENvbnRleHQtPk9uQm9va21hcmtfTW91c2VVcChwQm9va21hcmspOwogCiAJCQkJQ0ZYX1dpZGVTdHJpbmcgY3NJbmZvOwotCQkJCUZYX0JPT0wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc3dKUywgY3NJbmZvKTsKKwkJCQlib29sIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHN3SlMsIGNzSW5mbyk7CiAJCQkJaWYgKCFiUmV0KQogCQkJCXsKIAkJCQkJLy9DQkNMX0Zvcm1Ob3RpZnk6Ok1zZ0JveEpTRXJyb3IocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCBjc0luZm8pOwpAQCAtNDM0LDEwICs0MzQsMTAgQEAKIAlmb3IgKGludDMyX3QgaT0wLHN6PWFjdGlvbi5HZXRTdWJBY3Rpb25zQ291bnQoKTsgaTxzejsgaSsrKQogCXsKIAkJQ1BERl9BY3Rpb24gc3ViYWN0aW9uID0gYWN0aW9uLkdldFN1YkFjdGlvbihpKTsKLQkJaWYgKCFFeGVjdXRlQm9va01hcmsoc3ViYWN0aW9uLCBwRG9jdW1lbnQsIHBCb29rbWFyaywgbGlzdCkpIHJldHVybiBGQUxTRTsKKwkJaWYgKCFFeGVjdXRlQm9va01hcmsoc3ViYWN0aW9uLCBwRG9jdW1lbnQsIHBCb29rbWFyaywgbGlzdCkpIHJldHVybiBmYWxzZTsKIAl9CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX05vSnMoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQpAQCAtNTAyLDcgKzUwMiw3IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdDoKLQkJQVNTRVJUKEZBTFNFKTsKKwkJQVNTRVJUKGZhbHNlKTsKIAkJYnJlYWs7CiAJY2FzZSBDUERGX0FjdGlvbjo6U2V0T0NHU3RhdGU6CiAJCURvQWN0aW9uX1NldE9DR1N0YXRlKHBEb2N1bWVudCwgIGFjdGlvbik7CkBAIC01MjIsMTAgKzUyMiwxMCBAQAogCX0KIH0KIAotRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OklzVmFsaWREb2NWaWV3KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK2Jvb2wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpJc1ZhbGlkRG9jVmlldyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7CiAJQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0dvVG8oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LApAQCAtNjM5LDEyICs2MzksMTIgQEAKIAkJCWRhdGEuYlNoaWZ0LCBwRm9ybUZpZWxkLCBkYXRhLnNWYWx1ZSwgZGF0YS5iUkMpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlBU1NFUlQoRkFMU0UpOworCQlBU1NFUlQoZmFsc2UpOwogCQlicmVhazsKIAl9CiAKIAlDRlhfV2lkZVN0cmluZyBjc0luZm87Ci0JRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzY3JpcHQsIGNzSW5mbyk7CisJYm9vbCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzY3JpcHQsIGNzSW5mbyk7CiAJaWYgKCFiUmV0KQogCXsKIAkJLy9DQkNMX0Zvcm1Ob3RpZnk6Ok1zZ0JveEpTRXJyb3IocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCBjc0luZm8pOwpAQCAtNjY4LDcgKzY2OCw3IEBACiAJcENvbnRleHQtPk9uRG9jX09wZW4ocERvY3VtZW50LCBzU2NyaXB0TmFtZSk7CiAKIAlDRlhfV2lkZVN0cmluZyBjc0luZm87Ci0JRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzY3JpcHQsIGNzSW5mbyk7CisJYm9vbCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzY3JpcHQsIGNzSW5mbyk7CiAJaWYgKCFiUmV0KQogCXsKIAkJLy9DQkNMX0Zvcm1Ob3RpZnk6Ok1zZ0JveEpTRXJyb3IocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCBjc0luZm8pOwpAQCAtNzE5LDEyICs3MTksMTIgQEAKIAkJcENvbnRleHQtPk9uUGFnZV9PdXRWaWV3KHBEb2N1bWVudCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCUFTU0VSVChGQUxTRSk7CisJCUFTU0VSVChmYWxzZSk7CiAJCWJyZWFrOwogCX0KIAogCUNGWF9XaWRlU3RyaW5nIGNzSW5mbzsKLQlGWF9CT09MIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHNjcmlwdCwgY3NJbmZvKTsKKwlib29sIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHNjcmlwdCwgY3NJbmZvKTsKIAlpZiAoIWJSZXQpCiAJewogCQkvL0NCQ0xfRm9ybU5vdGlmeTo6TXNnQm94SlNFcnJvcihwUGFnZVZpZXctPkdldFBhZ2VWaWV3V25kKCksIGNzSW5mbyk7CkBAIC03MzQsNyArNzM0LDcgQEAKIH0KIAogCi1GWF9CT09MCUNQREZTREtfRm9ybUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQorYm9vbAlDUERGU0RLX0Zvcm1BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9IaWRlKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKIAlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC03NDQsMTMgKzc0NCwxMyBAQAogCWlmIChwSW50ZXJGb3JtLT5Eb0FjdGlvbl9IaWRlKGFjdGlvbikpCiAJewogCQlwRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCX0KIAotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fU3VibWl0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCitib29sCUNQREZTREtfRm9ybUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1N1Ym1pdEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewogCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKQEAgLTc2MCw3ICs3NjAsNyBAQAogCXJldHVybiBwSW50ZXJGb3JtLT5Eb0FjdGlvbl9TdWJtaXRGb3JtKGFjdGlvbik7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fUmVzZXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK2Jvb2wJQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fUmVzZXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKIAlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC03NjksMTMgKzc2OSwxMyBAQAogCiAJaWYgKHBJbnRlckZvcm0tPkRvQWN0aW9uX1Jlc2V0Rm9ybShhY3Rpb24pKQogCXsKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCX0KIAotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fSW1wb3J0RGF0YShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCitib29sCUNQREZTREtfRm9ybUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0ltcG9ydERhdGEoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewogCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKQEAgLTc4NSwyMyArNzg1LDIzIEBACiAJaWYgKHBJbnRlckZvcm0tPkRvQWN0aW9uX0ltcG9ydERhdGEoYWN0aW9uKSkKIAl7CiAJCXBEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCi0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX01lZGlhQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fUmVuZGl0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK2Jvb2wJQ1BERlNES19NZWRpYUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1JlbmRpdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7Ci0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX01lZGlhQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fU291bmQoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQorYm9vbAlDUERGU0RLX01lZGlhQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fU291bmQoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19NZWRpYUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX01vdmllKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK2Jvb2wJQ1BERlNES19NZWRpYUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX01vdmllKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnNka19hbm5vdGhhbmRsZXIuY3BwIGIvZnBkZnNkay9zcmMvZnNka19hbm5vdGhhbmRsZXIuY3BwCmluZGV4IDliMDA4Y2QuLjY2OTVmZTAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZzZGtfYW5ub3RoYW5kbGVyLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mc2RrX2Fubm90aGFuZGxlci5jcHAKQEAgLTE0NCw3ICsxNDQsNyBAQAogfQogCiAKLUZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIApAQCAtMTUyLDkgKzE1Miw5IEBACiAgICAgewogICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25MQnV0dG9uRG93bihwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiAgewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAKQEAgLTE2Miw5ICsxNjIsOSBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uTEJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKICB9Ci1GWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCkBAIC0xNzIsOSArMTcyLDkgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5PbkxCdXR0b25EYmxDbGsocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAKQEAgLTE4Miw5ICsxODIsOSBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uTW91c2VNb3ZlKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCkBAIC0xOTIsOSArMTkyLDkgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5Pbk1vdXNlV2hlZWwocFBhZ2VWaWV3LCBwQW5ub3QsbkZsYWdzLHpEZWx0YSwgcG9pbnQpOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCkBAIC0yMDIsOSArMjAyLDkgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5PblJCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCkBAIC0yMTIsNyArMjEyLDcgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5PblJCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKQpAQCAtMjM3LDE4ICsyMzcsMTggQEAKICAgICByZXR1cm47CiB9CiAKLUZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZ3MpCitib29sIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWdzKQogewogCiAgICAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCiAgICAgewogICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25DaGFyKHBBbm5vdCxuQ2hhciwgbkZsYWdzKTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIAogfQogCi1GWF9CT09MICAgICAgICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQorYm9vbCAgICAgICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykKIHsKIAogICAgIGlmICghbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZykgJiYgIW1fcEFwcC0+RkZJX0lzQUxUS2V5RG93bihuRmxhZykpCkBAIC0yNjMsNyArMjYzLDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZS0+R2V0U0RLRG9jdW1lbnQoKTsKICAgICAgICAgICAgICAgICBwRG9jdW1lbnQtPlNldEZvY3VzQW5ub3QocE5leHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjcyLDE0ICsyNzIsMTQgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5PbktleURvd24ocEFubm90LG5LZXlDb2RlLCBuRmxhZyk7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MICAgICAgICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uS2V5VXAoQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykKK2Jvb2wgICAgICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgICAgICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCAgICAgICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIApAQCAtMjg5LDE5ICsyODksMTkgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2UgPSBwQW5ub3QtPkdldFBhZ2VWaWV3KCk7CiAgICAgICAgICAgICBwUGFnZS0+R2V0U0RLRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCAgICAgICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCAgICAgICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKQogewogICAgIEFTU0VSVChwQW5ub3QpOwogICAgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQogICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25LaWxsRm9jdXMocEFubm90LCBuRmxhZyk7CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBDUERGX1JlY3QgICBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25HZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKQEAgLTMxMyw3ICszMTMsNyBAQAogICAgIHJldHVybiBwQW5ub3QtPkdldFJlY3QoKTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25IaXRUZXN0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCk7CiAgICAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCkBAIC0zMjEsMzEgKzMyMSwzMSBAQAogICAgICAgICBpZiAocEFubm90SGFuZGxlci0+Q2FuQW5zd2VyKHBBbm5vdCkpCiAgICAgICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+SGl0VGVzdChwUGFnZVZpZXcsIHBBbm5vdCwgcG9pbnQpOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1DUERGU0RLX0Fubm90KiAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkdldE5leHRBbm5vdChDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QsRlhfQk9PTCBiTmV4dCkKK0NQREZTREtfQW5ub3QqICBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6R2V0TmV4dEFubm90KENQREZTREtfQW5ub3QqIHBTREtBbm5vdCxib29sIGJOZXh0KQogewogICAgIENCQV9Bbm5vdEl0ZXJhdG9yIGFpKHBTREtBbm5vdC0+R2V0UGFnZVZpZXcoKSwgIldpZGdldCIsICIiKTsKICAgICByZXR1cm4gYk5leHQgPyBhaS5HZXROZXh0QW5ub3QocFNES0Fubm90KSA6IGFpLkdldFByZXZBbm5vdChwU0RLQW5ub3QpOwogfQogCi1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6OkNhbkFuc3dlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpCitib29sIENQREZTREtfQkZBbm5vdEhhbmRsZXI6OkNhbkFuc3dlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpCiB7CiAgICAgQVNTRVJUKHBBbm5vdC0+R2V0VHlwZSgpID09ICJXaWRnZXQiKTsKICAgICBpZiAocEFubm90LT5HZXRTdWJUeXBlKCkgPT0gQkZGVF9TSUdOQVRVUkUpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKICAgICBpZiAoIXBXaWRnZXQtPklzVmlzaWJsZSgpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgaW50IG5GaWVsZEZsYWdzID0gcFdpZGdldC0+R2V0RmllbGRGbGFncygpOwogICAgIGlmICgobkZpZWxkRmxhZ3MgJiBGSUVMREZMQUdfUkVBRE9OTFkpID09IEZJRUxERkxBR19SRUFET05MWSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBpZiAocFdpZGdldC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1BVU0hCVVRUT04pCi0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgIENQREZfUGFnZSogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZQYWdlKCk7CiAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gcFBhZ2UtPm1fcERvY3VtZW50OwpAQCAtMzY2LDcgKzM2Niw3IEBACiAgICAgcEludGVyRm9ybS0+QWRkTWFwKHBDdHJsLCBwV2lkZ2V0KTsKICAgICBDUERGX0ludGVyRm9ybSogcFBERkludGVyRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwogICAgIGlmIChwUERGSW50ZXJGb3JtICYmIHBQREZJbnRlckZvcm0tPk5lZWRDb25zdHJ1Y3RBUCgpKQotICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UobnVsbHB0ciwgRkFMU0UpOworICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UobnVsbHB0ciwgZmFsc2UpOwogCiAgICAgcmV0dXJuIHBXaWRnZXQ7CiB9CkBAIC00MzksNyArNDM5LDcgQEAKICAgICB9CiAKIH0KLUZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CkBAIC00NTMsMTAgKzQ1MywxMCBAQAogICAgICAgICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uTEJ1dHRvbkRvd24ocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKQEAgLTQ3MCwxMCArNDcwLDEwIEBACiAgICAgICAgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+T25MQnV0dG9uVXAocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwpAQCAtNDg3LDEwICs0ODcsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PbkxCdXR0b25EYmxDbGsocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKQEAgLTUwNCwxMiArNTA0LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+T25Nb3VzZU1vdmUocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiAKIH0KIAogCi1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CkBAIC01MjMsMTAgKzUyMywxMCBAQAogICAgICAgICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uTW91c2VXaGVlbChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCB6RGVsdGEscG9pbnQpOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CkBAIC01NDAsOSArNTQwLDkgQEAKICAgICAgICAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PblJCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwpAQCAtNTU2LDEwICs1NTYsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PblJCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWdzKQorYm9vbCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWdzKQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKQEAgLTU3MywxMCArNTczLDEwIEBACiAgICAgICAgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+T25DaGFyKHBBbm5vdCxuQ2hhciwgbkZsYWdzKTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQorYm9vbCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CkBAIC01OTAsMTMgKzU5MCwxMyBAQAogICAgICAgICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uS2V5RG93bihwQW5ub3QsbktleUNvZGUsIG5GbGFnKTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uS2V5VXAoQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykKK2Jvb2wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQogewogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIHZvaWQgICAgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KQogewpAQCAtNjI2LDE2ICs2MjYsMTYgQEAKICAgICB7CiAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CiAgICAgICAgIGlmICghcFdpZGdldC0+SXNBcHBlYXJhbmNlVmFsaWQoKSkKLSAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShOVUxMLCBGQUxTRSk7CisgICAgICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UoTlVMTCwgZmFsc2UpOwogCiAgICAgICAgIGludCBuRmllbGRUeXBlID0gcFdpZGdldC0+R2V0RmllbGRUeXBlKCk7CiAgICAgICAgIGlmIChuRmllbGRUeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQgfHwgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1gpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYkZvcm1hdGVkID0gRkFMU0U7CisgICAgICAgICAgICBib29sIGJGb3JtYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gcFdpZGdldC0+T25Gb3JtYXQoYkZvcm1hdGVkKTsKICAgICAgICAgICAgIGlmIChiRm9ybWF0ZWQgJiYgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1gpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKHNWYWx1ZS5jX3N0cigpLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKHNWYWx1ZS5jX3N0cigpLCBmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNjQ0LDcgKzY0NCw3IEBACiAgICAgfQogfQogCi1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKQEAgLTY1OCw5ICs2NTgsOSBAQAogICAgICAgICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uU2V0Rm9jdXMocEFubm90LG5GbGFnKTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CkBAIC02NzQsNyArNjc0LDcgQEAKICAgICAgICAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PbktpbGxGb2N1cyhwQW5ub3QsbkZsYWcpOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiBDUERGX1JlY3QgQ1BERlNES19CRkFubm90SGFuZGxlcjo6R2V0Vmlld0JCb3goQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpCkBAIC02OTUsNyArNjk1LDcgQEAKICAgICByZXR1cm4gQ1BERl9SZWN0KDAsMCwwLDApOwogfQogCi1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6OkhpdFRlc3QoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpIaXRUZXN0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocFBhZ2VWaWV3KTsKICAgICBBU1NFUlQocEFubm90KTsKQEAgLTcwNiw5ICs3MDYsOSBAQAogCiAvL0NSZWFkZXJfQW5ub3RJdGVyYXRvckV4CiAKLUNQREZTREtfQW5ub3RJdGVyYXRvcjo6Q1BERlNES19Bbm5vdEl0ZXJhdG9yKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsRlhfQk9PTCBiUmV2ZXJzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJZ25vcmVUb3Btb3N0Lyo9RkFMU0UqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaXJjbGUvKj1GQUxTRSovLAorQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpDUERGU0RLX0Fubm90SXRlcmF0b3IoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldyxib29sIGJSZXZlcnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYklnbm9yZVRvcG1vc3QvKj1mYWxzZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNpcmNsZS8qPWZhbHNlKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5ICpwTGlzdC8qPU5VTEwqLykKIHsKICAgICBBU1NFUlQocFBhZ2VWaWV3KTsKQEAgLTg1MCw3ICs4NTAsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1GWF9CT09MIENQREZTREtfQW5ub3RJdGVyYXRvcjo6SW5pdEl0ZXJhdG9yQW5ub3RMaXN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyxDRlhfUHRyQXJyYXkgKiBwQW5ub3RMaXN0KQorYm9vbCBDUERGU0RLX0Fubm90SXRlcmF0b3I6OkluaXRJdGVyYXRvckFubm90TGlzdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsQ0ZYX1B0ckFycmF5ICogcEFubm90TGlzdCkKIHsKICAgICBBU1NFUlQocFBhZ2VWaWV3KTsKIApAQCAtODU5LDcgKzg1OSw3IEBACiAgICAgfQogCiAgICAgbV9wSXRlcmF0b3JBbm5vdExpc3QuUmVtb3ZlQWxsKCk7Ci0gICAgaWYoIXBBbm5vdExpc3QpIHJldHVybiBGQUxTRTsKKyAgICBpZighcEFubm90TGlzdCkgcmV0dXJuIGZhbHNlOwogCiAgICAgQ1BERlNES19Bbm5vdCAqIHBUb3BNb3N0QW5ub3Q9IChtX2JJZ25vcmVUb3Btb3N0KSA/IE5VTEwgOiBwUGFnZVZpZXctPkdldEZvY3VzQW5ub3QoKTsKIApAQCAtODg4LDUgKzg4OCw1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWFubm90LmNwcCBiL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWFubm90LmNwcAppbmRleCBkMGRjNGVmLi5iYmRmYzE5IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mc2RrX2Jhc2Vhbm5vdC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnNka19iYXNlYW5ub3QuY3BwCkBAIC0xNywxNCArMTcsMTQgQEAKICAgICByZXR1cm4gKGludCl0emhvdXIgKiAzNjAwICsgKGludCl0em1pbnV0ZSAqICh0emhvdXIgPj0gMCA/IDYwIDogLTYwKTsKIH0KIAotRlhfQk9PTCBfZ0FmeElzTGVhcFllYXIoaW50MTZfdCB5ZWFyKQorYm9vbCBfZ0FmeElzTGVhcFllYXIoaW50MTZfdCB5ZWFyKQogewogICAgIHJldHVybiAoKHllYXIgJSA0MDAgPT0gMCkgfHwgKCh5ZWFyICUgNCA9PSAwKSAmJiAoeWVhciAlIDEwMCAhPSAwKSkpOwogfQogCiBGWF9XT1JEIF9nQWZ4R2V0WWVhckRheXMoaW50MTZfdCB5ZWFyKQogewotICAgIHJldHVybiAoX2dBZnhJc0xlYXBZZWFyKHllYXIpID09IFRSVUUgPyAzNjYgOiAzNjUpOworICAgIHJldHVybiAoX2dBZnhJc0xlYXBZZWFyKHllYXIpID09IHRydWUgPyAzNjYgOiAzNjUpOwogfQogCiB1aW50OF90IF9nQWZ4R2V0TW9udGhEYXlzKGludDE2X3QgeWVhciwgdWludDhfdCBtb250aCkKQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDI6Ci0gICAgICAgIGlmIChfZ0FmeElzTGVhcFllYXIoeWVhcikgPT0gVFJVRSkKKyAgICAgICAgaWYgKF9nQWZ4SXNMZWFwWWVhcih5ZWFyKSA9PSB0cnVlKQogICAgICAgICAgICAgbURheXMgPSAyOTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgbURheXMgPSAyODsKQEAgLTEyOCwxNyArMTI4LDE3IEBACiAgICAgcmV0dXJuICp0aGlzOwogfQogCi1GWF9CT09MIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yID09IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKK2Jvb2wgQ1BERlNES19EYXRlVGltZTo6b3BlcmF0b3IgPT0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKQogewogICAgIHJldHVybiAoRlhTWVNfbWVtY21wKCZkdCwgJmRhdGV0aW1lLmR0LCBzaXplb2YoRlhfREFURVRJTUUpKSA9PSAwKTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciAhPSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpCitib29sIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yICE9IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKIHsKICAgICByZXR1cm4gKEZYU1lTX21lbWNtcCgmZHQsICZkYXRldGltZS5kdCwgc2l6ZW9mKEZYX0RBVEVUSU1FKSkgIT0gMCk7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19EYXRlVGltZTo6b3BlcmF0b3IgPiAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpCitib29sIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yID4gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKQogewogICAgIENQREZTREtfRGF0ZVRpbWUgZHQxID0gVG9HTVQoKTsKICAgICBDUERGU0RLX0RhdGVUaW1lIGR0MiA9IGRhdGV0aW1lLlRvR01UKCk7CkBAIC0xNDcsMTIgKzE0NywxMiBAQAogICAgIGludCBkMyA9ICgoKGludClkdDIuZHQueWVhcikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5tb250aCkgPDwgOCkgfCAoaW50KWR0Mi5kdC5kYXk7CiAgICAgaW50IGQ0ID0gKCgoaW50KWR0Mi5kdC5ob3VyKSA8PCAxNikgfCAoKChpbnQpZHQyLmR0Lm1pbnV0ZSkgPDwgOCkgfCAoaW50KWR0Mi5kdC5zZWNvbmQ7CiAKLSAgICBpZiAoZDEgPiBkMykgcmV0dXJuIFRSVUU7Ci0gICAgaWYgKGQyID4gZDQpIHJldHVybiBUUlVFOwotICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoZDEgPiBkMykgcmV0dXJuIHRydWU7CisgICAgaWYgKGQyID4gZDQpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciA+PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpCitib29sIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yID49IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKIHsKICAgICBDUERGU0RLX0RhdGVUaW1lIGR0MSA9IFRvR01UKCk7CiAgICAgQ1BERlNES19EYXRlVGltZSBkdDIgPSBkYXRldGltZS5Ub0dNVCgpOwpAQCAtMTYxLDEyICsxNjEsMTIgQEAKICAgICBpbnQgZDMgPSAoKChpbnQpZHQyLmR0LnllYXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubW9udGgpIDw8IDgpIHwgKGludClkdDIuZHQuZGF5OwogICAgIGludCBkNCA9ICgoKGludClkdDIuZHQuaG91cikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5taW51dGUpIDw8IDgpIHwgKGludClkdDIuZHQuc2Vjb25kOwogCi0gICAgaWYgKGQxID49IGQzKSByZXR1cm4gVFJVRTsKLSAgICBpZiAoZDIgPj0gZDQpIHJldHVybiBUUlVFOwotICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoZDEgPj0gZDMpIHJldHVybiB0cnVlOworICAgIGlmIChkMiA+PSBkNCkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yIDwgKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKQorYm9vbCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciA8IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKIHsKICAgICBDUERGU0RLX0RhdGVUaW1lIGR0MSA9IFRvR01UKCk7CiAgICAgQ1BERlNES19EYXRlVGltZSBkdDIgPSBkYXRldGltZS5Ub0dNVCgpOwpAQCAtMTc1LDEyICsxNzUsMTIgQEAKICAgICBpbnQgZDMgPSAoKChpbnQpZHQyLmR0LnllYXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubW9udGgpIDw8IDgpIHwgKGludClkdDIuZHQuZGF5OwogICAgIGludCBkNCA9ICgoKGludClkdDIuZHQuaG91cikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5taW51dGUpIDw8IDgpIHwgKGludClkdDIuZHQuc2Vjb25kOwogCi0gICAgaWYgKGQxIDwgZDMpIHJldHVybiBUUlVFOwotICAgIGlmIChkMiA8IGQ0KSByZXR1cm4gVFJVRTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKGQxIDwgZDMpIHJldHVybiB0cnVlOworICAgIGlmIChkMiA8IGQ0KSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19EYXRlVGltZTo6b3BlcmF0b3IgPD0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKQorYm9vbCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciA8PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpCiB7CiAgICAgQ1BERlNES19EYXRlVGltZSBkdDEgPSBUb0dNVCgpOwogICAgIENQREZTREtfRGF0ZVRpbWUgZHQyID0gZGF0ZXRpbWUuVG9HTVQoKTsKQEAgLTE4OSw5ICsxODksOSBAQAogICAgIGludCBkMyA9ICgoKGludClkdDIuZHQueWVhcikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5tb250aCkgPDwgOCkgfCAoaW50KWR0Mi5kdC5kYXk7CiAgICAgaW50IGQ0ID0gKCgoaW50KWR0Mi5kdC5ob3VyKSA8PCAxNikgfCAoKChpbnQpZHQyLmR0Lm1pbnV0ZSkgPDwgOCkgfCAoaW50KWR0Mi5kdC5zZWNvbmQ7CiAKLSAgICBpZiAoZDEgPD0gZDMpIHJldHVybiBUUlVFOwotICAgIGlmIChkMiA8PSBkNCkgcmV0dXJuIFRSVUU7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChkMSA8PSBkMykgcmV0dXJuIHRydWU7CisgICAgaWYgKGQyIDw9IGQ0KSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yIHRpbWVfdCgpCkBAIC01MDYsNyArNTA2LDcgQEAKIENQREZTREtfQW5ub3Q6OkNQREZTREtfQW5ub3QoQ1BERl9Bbm5vdCogcEFubm90LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIDoKIG1fcEFubm90KHBBbm5vdCksCiBtX3BQYWdlVmlldyhwUGFnZVZpZXcpLAotbV9iU2VsZWN0ZWQoRkFMU0UpLAorbV9iU2VsZWN0ZWQoZmFsc2UpLAogbV9uVGFiT3JkZXIoLTEpCiB7CiB9CkBAIC01MzksMTIgKzUzOSwxMiBAQAogICAgIHJldHVybiBtX3BQYWdlVmlldzsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0Fubm90OjpJc1NlbGVjdGVkKCkKK2Jvb2wgQ1BERlNES19Bbm5vdDo6SXNTZWxlY3RlZCgpCiB7CiAgICAgcmV0dXJuIG1fYlNlbGVjdGVkOwogfQogCi12b2lkIENQREZTREtfQW5ub3Q6OlNldFNlbGVjdGVkKEZYX0JPT0wgYlNlbGVjdGVkKQordm9pZCBDUERGU0RLX0Fubm90OjpTZXRTZWxlY3RlZChib29sIGJTZWxlY3RlZCkKIHsKICAgICBtX2JTZWxlY3RlZCA9IGJTZWxlY3RlZDsKIH0KQEAgLTYwNiwxNSArNjA2LDE1IEBACiAgICAgbV9wQW5ub3QtPkRyYXdBcHBlYXJhbmNlKG1fcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCksIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbW9kZSwgcE9wdGlvbnMpOwogfQogCi1GWF9CT09MIENQREZTREtfQW5ub3Q6OklzQXBwZWFyYW5jZVZhbGlkKCkKK2Jvb2wgQ1BERlNES19Bbm5vdDo6SXNBcHBlYXJhbmNlVmFsaWQoKQogewogICAgIHJldHVybiBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkFQIikgIT0gTlVMTDsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0Fubm90OjpJc0FwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlKQorYm9vbCBDUERGU0RLX0Fubm90OjpJc0FwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlKQogewogICAgIENQREZfRGljdGlvbmFyeSogcEFQID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0KCJBUCIpOwotICAgIGlmIChwQVAgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChwQVAgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwogCiAgICAgLy8gQ2hvb3NlIHRoZSByaWdodCBzdWItYXAKICAgICBjb25zdCBGWF9DSEFSKiBhcF9lbnRyeSA9ICJOIjsKQEAgLTYyNyw5ICs2MjcsOSBAQAogCiAgICAgLy8gR2V0IHRoZSBBUCBzdHJlYW0gb3Igc3ViZGlyZWN0b3J5CiAgICAgQ1BERl9PYmplY3QqIHBzdWIgPSBwQVAtPkdldEVsZW1lbnRWYWx1ZShhcF9lbnRyeSk7Ci0gICAgaWYgKHBzdWIgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChwc3ViID09IE5VTEwpIHJldHVybiBmYWxzZTsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIENQREZTREtfQW5ub3Q6OkRyYXdCb3JkZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKQEAgLTg3NSw3ICs4NzUsNyBAQAogICAgIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+UmVtb3ZlQXQoIkMiKTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0Fubm90OjpHZXRDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0Citib29sIENQREZTREtfQW5ub3Q6OkdldENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3QKIHsKICAgICBpZiAoQ1BERl9BcnJheSogcEVudHJ5ID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRBcnJheSgiQyIpKQogICAgIHsKQEAgLTg4Niw3ICs4ODYsNyBAQAogCiAgICAgICAgICAgICBjb2xvciA9IEZYU1lTX1JHQigoaW50KWcsIChpbnQpZywgKGludClnKTsKIAotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChuQ291bnQgPT0gMykKICAgICAgICAgewpAQCAtODk2LDcgKzg5Niw3IEBACiAKICAgICAgICAgICAgIGNvbG9yID0gRlhTWVNfUkdCKChpbnQpciwgKGludClnLCAoaW50KWIpOwogCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKG5Db3VudCA9PSA0KQogICAgICAgICB7CkBAIC05MTEsMTEgKzkxMSwxMSBAQAogCiAgICAgICAgICAgICBjb2xvciA9IEZYU1lTX1JHQigoaW50KShyICogMjU1KSwgKGludCkoZyAqIDI1NSksIChpbnQpKGIgKiAyNTUpKTsKIAotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIApAQCAtOTc2LDcgKzk3Niw3IEBACiAgICAgICAgIHBTdHJlYW1EaWN0LT5TZXRBdFJlY3QoIkJCb3giLCByY0JCb3gpOwogICAgIH0KIAotICAgIHBTdHJlYW0tPlNldERhdGEoKHVpbnQ4X3QqKXNDb250ZW50cy5jX3N0cigpLCBzQ29udGVudHMuR2V0TGVuZ3RoKCksIEZBTFNFLCBGQUxTRSk7CisgICAgcFN0cmVhbS0+U2V0RGF0YSgodWludDhfdCopc0NvbnRlbnRzLmNfc3RyKCksIHNDb250ZW50cy5HZXRMZW5ndGgoKSwgZmFsc2UsIGZhbHNlKTsKIH0KIAogI2RlZmluZSBCQV9BTk5PVF9NSU5XSURUSCAgICAgICAgICAgMQpAQCAtOTkyLDExICs5OTIsMTEgQEAKICAgICByZXR1cm4gQkFfQU5OT1RfTUlOSEVJR0hUOwogfQogCi1GWF9CT09MIENQREZTREtfQW5ub3Q6OkNyZWF0ZUZvcm1GaWxsZXIoKQorYm9vbCBDUERGU0RLX0Fubm90OjpDcmVhdGVGb3JtRmlsbGVyKCkKIHsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERlNES19Bbm5vdDo6SXNWaXNpYmxlKCkgY29uc3QKK2Jvb2wgQ1BERlNES19Bbm5vdDo6SXNWaXNpYmxlKCkgY29uc3QKIHsKICAgICBpbnQgbkZsYWdzID0gR2V0RmxhZ3MoKTsKICAgICByZXR1cm4gISgobkZsYWdzICYgQU5OT1RGTEFHX0lOVklTSUJMRSkgfHwgKG5GbGFncyAmIEFOTk9URkxBR19ISURERU4pIHx8IChuRmxhZ3MgJiBBTk5PVEZMQUdfTk9WSUVXKSk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mc2RrX2Jhc2Vmb3JtLmNwcCBiL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWZvcm0uY3BwCmluZGV4IGVlMTYyMTIuLjQ5MzNhMDUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWZvcm0uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWZvcm0uY3BwCkBAIC0zNywxMCArMzcsMTAgQEAKIAogfQogCi1GWF9CT09MICAgICBDUERGU0RLX1dpZGdldDo6SXNXaWRnZXRBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSkKK2Jvb2wgICAgIENQREZTREtfV2lkZ2V0OjpJc1dpZGdldEFwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlKQogewogICAgIENQREZfRGljdGlvbmFyeSogcEFQID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0KCJBUCIpOwotICAgIGlmIChwQVAgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChwQVAgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwogCiAgICAgLy8gQ2hvb3NlIHRoZSByaWdodCBzdWItYXAKICAgICBjb25zdCBGWF9DSEFSKiBhcF9lbnRyeSA9ICJOIjsKQEAgLTUzLDcgKzUzLDcgQEAKIAogICAgIC8vIEdldCB0aGUgQVAgc3RyZWFtIG9yIHN1YmRpcmVjdG9yeQogICAgIENQREZfT2JqZWN0KiBwc3ViID0gcEFQLT5HZXRFbGVtZW50VmFsdWUoYXBfZW50cnkpOwotICAgIGlmIChwc3ViID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyAgICBpZiAocHN1YiA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CiAKICAgICBpbnQgbkZpZWxkVHlwZSA9IEdldEZpZWxkVHlwZSgpOwogICAgIHN3aXRjaCAobkZpZWxkVHlwZSkKQEAgLTcwLDEwICs3MCwxMCBAQAogICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3ViRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBzdWI7CiAgICAgICAgICAgICByZXR1cm4gcFN1YkRpY3QtPkdldFN0cmVhbShHZXRBcHBTdGF0ZSgpKSAhPSBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiBpbnQgQ1BERlNES19XaWRnZXQ6OkdldEZpZWxkVHlwZSgpIGNvbnN0CkBAIC0xNDEsNyArMTQxLDcgQEAKICAgICByZXR1cm4gcEN0cmwtPkdldFJvdGF0aW9uKCkgJSAzNjA7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19XaWRnZXQ6OkdldEZpbGxDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0Citib29sIENQREZTREtfV2lkZ2V0OjpHZXRGaWxsQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdAogewogICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7CiAgICAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKQEAgLTE1Miw3ICsxNTIsNyBAQAogICAgIHJldHVybiBpQ29sb3JUeXBlICE9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKIH0KIAotRlhfQk9PTCBDUERGU0RLX1dpZGdldDo6R2V0Qm9yZGVyQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdAorYm9vbCBDUERGU0RLX1dpZGdldDo6R2V0Qm9yZGVyQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdAogewogICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7CiAgICAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKQEAgLTE2Myw3ICsxNjMsNyBAQAogICAgIHJldHVybiBpQ29sb3JUeXBlICE9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKIH0KIAotRlhfQk9PTCBDUERGU0RLX1dpZGdldDo6R2V0VGV4dENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3QKK2Jvb2wgQ1BERlNES19XaWRnZXQ6OkdldFRleHRDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0CiB7CiAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKICAgICBBU1NFUlQocEZvcm1DdHJsICE9IE5VTEwpOwpAQCAtMTc5LDcgKzE3OSw3IEBACiAgICAgICAgIHJldHVybiBpQ29sb3JUeXBlICE9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBGWF9GTE9BVCBDUERGU0RLX1dpZGdldDo6R2V0Rm9udFNpemUoKSBjb25zdApAQCAtMjM1LDcgKzIzNSw3IEBACiAgICAgcmV0dXJuIHBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpOwogfQogCi1GWF9CT09MIENQREZTREtfV2lkZ2V0OjpJc09wdGlvblNlbGVjdGVkKGludCBuSW5kZXgpIGNvbnN0Citib29sIENQREZTREtfV2lkZ2V0OjpJc09wdGlvblNlbGVjdGVkKGludCBuSW5kZXgpIGNvbnN0CiB7CiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKQEAgLTI1MSw3ICsyNTEsNyBAQAogICAgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRUb3BWaXNpYmxlSW5kZXgoKTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX1dpZGdldDo6SXNDaGVja2VkKCkgY29uc3QKK2Jvb2wgQ1BERlNES19XaWRnZXQ6OklzQ2hlY2tlZCgpIGNvbnN0CiB7CiAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKICAgICBBU1NFUlQocEZvcm1DdHJsICE9IE5VTEwpOwpAQCAtMjc1LDcgKzI3NSw3IEBACiAgICAgcmV0dXJuIHBGb3JtRmllbGQtPkdldE1heExlbigpOwogfQogCi12b2lkIENQREZTREtfV2lkZ2V0OjpTZXRDaGVjayhGWF9CT09MIGJDaGVja2VkLCBGWF9CT09MIGJOb3RpZnkpCit2b2lkIENQREZTREtfV2lkZ2V0OjpTZXRDaGVjayhib29sIGJDaGVja2VkLCBib29sIGJOb3RpZnkpCiB7CiAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKICAgICBBU1NFUlQocEZvcm1DdHJsICE9IE5VTEwpOwpAQCAtMjg2LDcgKzI4Niw3IEBACiAgICAgcEZvcm1GaWVsZC0+Q2hlY2tDb250cm9sKHBGb3JtRmllbGQtPkdldENvbnRyb2xJbmRleChwRm9ybUN0cmwpLCBiQ2hlY2tlZCwgYk5vdGlmeSk7CiB9CiAKLXZvaWQgQ1BERlNES19XaWRnZXQ6OlNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSkKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVmFsdWUsIGJvb2wgYk5vdGlmeSkKIHsKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwpAQCAtMjk3LDcgKzI5Nyw3IEBACiB2b2lkIENQREZTREtfV2lkZ2V0OjpTZXREZWZhdWx0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNWYWx1ZSkKIHsKIH0KLXZvaWQgQ1BERlNES19XaWRnZXQ6OlNldE9wdGlvblNlbGVjdGlvbihpbnQgaW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkLCBGWF9CT09MIGJOb3RpZnkpCit2b2lkIENQREZTREtfV2lkZ2V0OjpTZXRPcHRpb25TZWxlY3Rpb24oaW50IGluZGV4LCBib29sIGJTZWxlY3RlZCwgYm9vbCBiTm90aWZ5KQogewogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CkBAIC0zMDUsNyArMzA1LDcgQEAKICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGluZGV4LCBiU2VsZWN0ZWQsIGJOb3RpZnkpOwogfQogCi12b2lkIENQREZTREtfV2lkZ2V0OjpDbGVhclNlbGVjdGlvbihGWF9CT09MIGJOb3RpZnkpCit2b2lkIENQREZTREtfV2lkZ2V0OjpDbGVhclNlbGVjdGlvbihib29sIGJOb3RpZnkpCiB7CiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKQEAgLTMxOSwyMCArMzE5LDIwIEBACiAKIHZvaWQgQ1BERlNES19XaWRnZXQ6OlNldEFwcE1vZGlmaWVkKCkKIHsKLSAgICBtX2JBcHBNb2RpZmllZCA9IFRSVUU7CisgICAgbV9iQXBwTW9kaWZpZWQgPSB0cnVlOwogfQogCiB2b2lkIENQREZTREtfV2lkZ2V0OjpDbGVhckFwcE1vZGlmaWVkKCkKIHsKLSAgICBtX2JBcHBNb2RpZmllZCA9IEZBTFNFOworICAgIG1fYkFwcE1vZGlmaWVkID0gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19XaWRnZXQ6OklzQXBwTW9kaWZpZWQoKSBjb25zdAorYm9vbCBDUERGU0RLX1dpZGdldDo6SXNBcHBNb2RpZmllZCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fYkFwcE1vZGlmaWVkOwogfQogCi12b2lkIENQREZTREtfV2lkZ2V0OjpSZXNldEFwcGVhcmFuY2UoY29uc3QgRlhfV0NIQVIqIHNWYWx1ZSwgRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKQordm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlKGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUsIGJvb2wgYlZhbHVlQ2hhbmdlZCkKIHsKICAgICBTZXRBcHBNb2RpZmllZCgpOwogCkBAIC0zNzAsMTQgKzM3MCwxNCBAQAogICAgIG1fcEFubm90LT5DbGVhckNhY2hlZEFQKCk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZTREtfV2lkZ2V0OjpPbkZvcm1hdChGWF9CT09MJiBiRm9ybWF0ZWQpCitDRlhfV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6T25Gb3JtYXQoYm9vbCYgYkZvcm1hdGVkKQogewogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAgICAgcmV0dXJuIG1fcEludGVyRm9ybS0+T25Gb3JtYXQocEZvcm1GaWVsZCwgYkZvcm1hdGVkKTsKIH0KIAotdm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRGaWVsZEFwcGVhcmFuY2UoRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKQordm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRGaWVsZEFwcGVhcmFuY2UoYm9vbCBiVmFsdWVDaGFuZ2VkKQogewogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CkBAIC0xMDE3LDcgKzEwMTcsNyBAQAogCiAgICAgaWYgKElGWF9FZGl0ICogcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpKQogICAgIHsKLSAgICAgICAgcEVkaXQtPkVuYWJsZVJlZnJlc2goRkFMU0UpOworICAgICAgICBwRWRpdC0+RW5hYmxlUmVmcmVzaChmYWxzZSk7CiAKICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvYyA9IG1fcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKTsKICAgICAgICAgQVNTRVJUKHBEb2MgIT0gTlVMTCk7CkBAIC0xMDM1LDcgKzEwMzUsNyBAQAogCiAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEdldEZvbnRTaXplKCk7CiAgICAgICAgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKQotICAgICAgICAgICAgcEVkaXQtPlNldEF1dG9Gb250U2l6ZShUUlVFKTsKKyAgICAgICAgICAgIHBFZGl0LT5TZXRBdXRvRm9udFNpemUodHJ1ZSk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHBFZGl0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOwogCkBAIC0xMDkzLDcgKzEwOTMsNyBAQAogCiAgICAgaWYgKElGWF9FZGl0ICogcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpKQogICAgIHsKLSAgICAgICAgcEVkaXQtPkVuYWJsZVJlZnJlc2goRkFMU0UpOworICAgICAgICBwRWRpdC0+RW5hYmxlUmVmcmVzaChmYWxzZSk7CiAKICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvYyA9IG1fcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKTsKICAgICAgICAgQVNTRVJUKHBEb2MgIT0gTlVMTCk7CkBAIC0xMTIzLDEyICsxMTIzLDEyIEBACiAKICAgICAgICAgZm9yIChpbnQzMl90IGk9blRvcDsgaTxuQ291bnQ7IGkrKykKICAgICAgICAgewotICAgICAgICAgICAgRlhfQk9PTCBiU2VsZWN0ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIGJvb2wgYlNlbGVjdGVkID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKGludDMyX3Qgaj0wOyBqPG5TZWxDb3VudDsgaisrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChwRmllbGQtPkdldFNlbGVjdGVkSW5kZXgoaikgPT0gaSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJTZWxlY3RlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJTZWxlY3RlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTExNDEsMTYgKzExNDEsMTYgQEAKICAgICAgICAgICAgIGlmIChiU2VsZWN0ZWQpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjSXRlbSA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0LGZ5LWZJdGVtSGVpZ2h0LHJjQ2xpZW50LnJpZ2h0LGZ5KTsKLSAgICAgICAgICAgICAgICBzTGlzdCA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsMCw1MS4wZi8yNTUuMGYsMTEzLjBmLzI1NS4wZiksVFJVRSkKKyAgICAgICAgICAgICAgICBzTGlzdCA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsMCw1MS4wZi8yNTUuMGYsMTEzLjBmLzI1NS4wZiksdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgPDwgcmNJdGVtLmxlZnQgPDwgIiAiIDw8IHJjSXRlbS5ib3R0b20gPDwgIiAiIDw8IHJjSXRlbS5XaWR0aCgpIDw8ICIgIiA8PCByY0l0ZW0uSGVpZ2h0KCkgPDwgIiByZSBmXG4iIDw8ICJRXG4iOwogCi0gICAgICAgICAgICAgICAgc0xpc3QgPDwgIkJUXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMSksVFJVRSkgPDwKKyAgICAgICAgICAgICAgICBzTGlzdCA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwxKSx0cnVlKSA8PAogICAgICAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKHBFZGl0LENQREZfUG9pbnQoMC4wZixmeSkpIDw8ICJFVFxuIjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBDUFdMX0NvbG9yIGNyVGV4dCA9IEdldFRleHRQV0xDb2xvcigpOwotICAgICAgICAgICAgICAgIHNMaXN0IDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsVFJVRSkgPDwKKyAgICAgICAgICAgICAgICBzTGlzdCA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LHRydWUpIDw8CiAgICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShwRWRpdCxDUERGX1BvaW50KDAuMGYsZnkpKSA8PCAiRVRcbiI7CiAgICAgICAgICAgICB9CiAKQEAgLTExODMsNyArMTE4Myw3IEBACiAKICAgICBpZiAoSUZYX0VkaXQgKiBwRWRpdCA9IElGWF9FZGl0OjpOZXdFZGl0KCkpCiAgICAgewotICAgICAgICBwRWRpdC0+RW5hYmxlUmVmcmVzaChGQUxTRSk7CisgICAgICAgIHBFZGl0LT5FbmFibGVSZWZyZXNoKGZhbHNlKTsKIAogICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gbV9wSW50ZXJGb3JtLT5HZXREb2N1bWVudCgpOwogICAgICAgICBBU1NFUlQocERvYyAhPSBOVUxMKTsKQEAgLTExOTgsMTIgKzExOTgsMTIgQEAKICAgICAgICAgcEVkaXQtPlNldEFsaWdubWVudEgocENvbnRyb2wtPkdldENvbnRyb2xBbGlnbm1lbnQoKSk7CiAKICAgICAgICAgRlhfRFdPUkQgZHdGaWVsZEZsYWdzID0gcEZpZWxkLT5HZXRGaWVsZEZsYWdzKCk7Ci0gICAgICAgIEZYX0JPT0wgYk11bHRpTGluZSA9IChkd0ZpZWxkRmxhZ3MgPj4gMTIpICYgMTsKKyAgICAgICAgYm9vbCBiTXVsdGlMaW5lID0gKGR3RmllbGRGbGFncyA+PiAxMikgJiAxOwogCiAgICAgICAgIGlmIChiTXVsdGlMaW5lKQogICAgICAgICB7Ci0gICAgICAgICAgICBwRWRpdC0+U2V0TXVsdGlMaW5lKFRSVUUpOwotICAgICAgICAgICAgcEVkaXQtPlNldEF1dG9SZXR1cm4oVFJVRSk7CisgICAgICAgICAgICBwRWRpdC0+U2V0TXVsdGlMaW5lKHRydWUpOworICAgICAgICAgICAgcEVkaXQtPlNldEF1dG9SZXR1cm4odHJ1ZSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC0xMjE4LDcgKzEyMTgsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50IG5NYXhMZW4gPSBwRmllbGQtPkdldE1heExlbigpOwotICAgICAgICBGWF9CT09MIGJDaGFyQXJyYXkgPSAoZHdGaWVsZEZsYWdzID4+IDI0KSAmIDE7CisgICAgICAgIGJvb2wgYkNoYXJBcnJheSA9IChkd0ZpZWxkRmxhZ3MgPj4gMjQpICYgMTsKICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUoKTsKIAogICAgICAgICBpZiAobk1heExlbiA+IDApCkBAIC0xMjQxLDcgKzEyNDEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCi0gICAgICAgICAgICBwRWRpdC0+U2V0QXV0b0ZvbnRTaXplKFRSVUUpOworICAgICAgICAgICAgcEVkaXQtPlNldEF1dG9Gb250U2l6ZSh0cnVlKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7CiAKQEAgLTEyNzYsMTEgKzEyNzYsMTEgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgQkJTX1NPTElEOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyUFdMQ29sb3IoKSxGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlclBXTENvbG9yKCksZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgc0xpbmVzIDw8ICJxXG4iIDw8IEdldEJvcmRlcldpZHRoKCkgPDwgIiB3XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyUFdMQ29sb3IoKSxGQUxTRSkgPDwgIiAyIEogMCBqXG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlclBXTENvbG9yKCksZmFsc2UpIDw8ICIgMiBKIDAgalxuIjsKIAogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGk9MTtpPG5NYXhMZW47aSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgewpAQCAtMTI5NiwxMyArMTI5NiwxMyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBCQlNfREFTSDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlclBXTENvbG9yKCksRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJQV0xDb2xvcigpLGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfRGFzaCBkc0JvcmRlciA9IENQV0xfRGFzaCgzLCAzLCAwKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgc0xpbmVzIDw8ICJxXG4iIDw8IEdldEJvcmRlcldpZHRoKCkgPDwgIiB3XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyUFdMQ29sb3IoKSxGQUxTRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJQV0xDb2xvcigpLGZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJbIiA8PCBkc0JvcmRlci5uRGFzaCA8PCAiICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBkc0JvcmRlci5uR2FwIDw8ICJdICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBkc0JvcmRlci5uUGhhc2UgPDwgIiBkXG4iOwpAQCAtMTU0OSw3ICsxNTQ5LDcgQEAKICAgICB9CiB9CiAKLUZYX0JPT0wgQ1BERlNES19XaWRnZXQ6Ok9uQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQorYm9vbCBDUERGU0RLX1dpZGdldDo6T25BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCiB7CiAgICAgQ1BERl9BY3Rpb24gYWN0aW9uID0gR2V0QUFjdGlvbih0eXBlKTsKIApAQCAtMTU2Nyw3ICsxNTY3LDcgQEAKICAgICAgICAgcmV0dXJuIHBBY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9GaWVsZChhY3Rpb24sIHR5cGUsIHBEb2N1bWVudCwgR2V0Rm9ybUZpZWxkKCksIGRhdGEpOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIENQREZfQWN0aW9uIENQREZTREtfV2lkZ2V0OjpHZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCkKQEAgLTE2MjQsMzcgKzE2MjQsMzcgQEAKIH0KIAogCi1GWF9CT09MIENQREZTREtfV2lkZ2V0OjpIaXRUZXN0KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSkKK2Jvb2wgQ1BERlNES19XaWRnZXQ6OkhpdFRlc3QoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKQogewogICAgIENQREZfQW5ub3QqIHBBbm5vdCA9IEdldFBERkFubm90KCk7CiAgICAgQ0ZYX0Zsb2F0UmVjdCBhbm5vdFJlY3Q7CiAgICAgcEFubm90LT5HZXRSZWN0KGFubm90UmVjdCk7CiAgICAgaWYoYW5ub3RSZWN0LkNvbnRhaW5zKHBhZ2VYLCBwYWdlWSkpCiAgICAgewotICAgICAgICBpZiAoIUlzVmlzaWJsZSgpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghSXNWaXNpYmxlKCkpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpbnQgbkZpZWxkRmxhZ3MgPSBHZXRGaWVsZEZsYWdzKCk7CiAgICAgICAgIGlmICgobkZpZWxkRmxhZ3MgJiBGSUVMREZMQUdfUkVBRE9OTFkpID09IEZJRUxERkxBR19SRUFET05MWSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIENQREZTREtfSW50ZXJGb3JtOjpDUERGU0RLX0ludGVyRm9ybShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiAgICAgOm1fcERvY3VtZW50KHBEb2N1bWVudCksCiAgICAgbV9wSW50ZXJGb3JtKE5VTEwpLAotICAgIG1fYkNhbGN1bGF0ZShUUlVFKSwKLSAgICBtX2JCdXN5KEZBTFNFKQorICAgIG1fYkNhbGN1bGF0ZSh0cnVlKSwKKyAgICBtX2JCdXN5KGZhbHNlKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLSAgICBtX3BJbnRlckZvcm0gPSBuZXcgQ1BERl9JbnRlckZvcm0obV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCksIEZBTFNFKTsKKyAgICBtX3BJbnRlckZvcm0gPSBuZXcgQ1BERl9JbnRlckZvcm0obV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCksIGZhbHNlKTsKICAgICBBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOwogICAgIG1fcEludGVyRm9ybS0+U2V0Rm9ybU5vdGlmeSh0aGlzKTsKIAogICAgIGZvcihpbnQgaT0wOyBpPDY7IGkrKykKLSAgICAgICAgbV9iTmVlZEhpZ2h0bGlnaHRbaV0gPSBGQUxTRTsKKyAgICAgICAgbV9iTmVlZEhpZ2h0bGlnaHRbaV0gPSBmYWxzZTsKICAgICBtX2lIaWdobGlnaHRBbHBoYSA9IDA7CiB9CiAKQEAgLTE2NjUsMTIgKzE2NjUsMTIgQEAKICAgICBtX01hcC5jbGVhcigpOwogfQogCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpIaWdobGlnaHRXaWRnZXRzKCkKK2Jvb2wgQ1BERlNES19JbnRlckZvcm06OkhpZ2hsaWdodFdpZGdldHMoKQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUNQREZTREtfV2lkZ2V0KiBDUERGU0RLX0ludGVyRm9ybTo6R2V0U2libGluZyhDUERGU0RLX1dpZGdldCogcFdpZGdldCwgRlhfQk9PTCBiTmV4dCkgY29uc3QKK0NQREZTREtfV2lkZ2V0KiBDUERGU0RLX0ludGVyRm9ybTo6R2V0U2libGluZyhDUERGU0RLX1dpZGdldCogcFdpZGdldCwgYm9vbCBiTmV4dCkgY29uc3QKIHsKICAgICBub25zdGQ6OnVuaXF1ZV9wdHI8Q0JBX0Fubm90SXRlcmF0b3I+IHBJdGVyYXRvcigKICAgICAgICAgbmV3IENCQV9Bbm5vdEl0ZXJhdG9yKHBXaWRnZXQtPkdldFBhZ2VWaWV3KCksICJXaWRnZXQiLCAiIikpOwpAQCAtMTc4MiwxMiArMTc4MiwxMiBAQAogICAgIG1fTWFwLmVyYXNlKHBDb250cm9sKTsKIH0KIAotdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6RW5hYmxlQ2FsY3VsYXRlKEZYX0JPT0wgYkVuYWJsZWQpCit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpFbmFibGVDYWxjdWxhdGUoYm9vbCBiRW5hYmxlZCkKIHsKICAgICBtX2JDYWxjdWxhdGUgPSBiRW5hYmxlZDsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6SXNDYWxjdWxhdGVFbmFibGVkKCkgY29uc3QKK2Jvb2wgQ1BERlNES19JbnRlckZvcm06OklzQ2FsY3VsYXRlRW5hYmxlZCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fYkNhbGN1bGF0ZTsKIH0KQEAgLTE4MDcsNyArMTgwNyw3IEBACiAgICAgICAgIGludCBuSGVpZ2h0ID0gcEJtcC0+R2V0SGVpZ2h0KCk7CiAKICAgICAgICAgQ1BERl9JbWFnZSBJbWFnZShwRG9jdW1lbnQpOwotICAgICAgICBJbWFnZS5TZXRJbWFnZShwQm1wLCBGQUxTRSk7CisgICAgICAgIEltYWdlLlNldEltYWdlKHBCbXAsIGZhbHNlKTsKICAgICAgICAgQ1BERl9TdHJlYW0qIHBJbWFnZVN0cmVhbSA9IEltYWdlLkdldFN0cmVhbSgpOwogICAgICAgICBpZiAocEltYWdlU3RyZWFtKQogICAgICAgICB7CkBAIC0xODY3LDcgKzE4NjcsNyBAQAogCiAgICAgaWYgKG1fYkJ1c3kpIHJldHVybjsKIAotICAgIG1fYkJ1c3kgPSBUUlVFOworICAgIG1fYkJ1c3kgPSB0cnVlOwogCiAgICAgaWYgKElzQ2FsY3VsYXRlRW5hYmxlZCgpKQogICAgIHsKQEAgLTE4OTksMTEgKzE4OTksMTEgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzT2xkVmFsdWUgPSBwRmllbGQtPkdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHNPbGRWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUkMgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSQyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PbkZpZWxkX0NhbGN1bGF0ZShwRm9ybUZpZWxkLCBwRmllbGQsIHNWYWx1ZSwgYlJDKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzSW5mbzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChjc0pTLCBzSW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoY3NKUywgc0luZm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVudGltZS0+UmVsZWFzZUNvbnRleHQocENvbnRleHQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiUmV0KQpAQCAtMTkxMSw3ICsxOTExLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiUkMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNWYWx1ZS5Db21wYXJlKHNPbGRWYWx1ZSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpZWxkLT5TZXRWYWx1ZShzVmFsdWUsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmllbGQtPlNldFZhbHVlKHNWYWx1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xOTI0LDEwICsxOTI0LDEwIEBACiAKICAgICB9CiAKLSAgICBtX2JCdXN5ID0gRkFMU0U7CisgICAgbV9iQnVzeSA9IGZhbHNlOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX0ludGVyRm9ybTo6T25Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIEZYX0JPT0wmIGJGb3JtYXRlZCkKK0NGWF9XaWRlU3RyaW5nIENQREZTREtfSW50ZXJGb3JtOjpPbkZvcm1hdChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgYm9vbCYgYkZvcm1hdGVkKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKQEAgLTE5MzcsNyArMTkzNyw3IEBACiAgICAgQVNTRVJUKHBFbnYpOwogICAgIGlmKCFwRW52LT5Jc0pTSW5pdGlhdGVkKCkpCiAgICAgewotICAgICAgICBiRm9ybWF0ZWQgPSBGQUxTRTsKKyAgICAgICAgYkZvcm1hdGVkID0gZmFsc2U7CiAgICAgICAgIHJldHVybiBzVmFsdWU7CiAgICAgfQogCkBAIC0xOTU2LDcgKzE5NTYsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgYkZvcm1hdGVkID0gRkFMU0U7CisgICAgYkZvcm1hdGVkID0gZmFsc2U7CiAKICAgICBDUERGX0FBY3Rpb24gYUFjdGlvbiA9IHBGb3JtRmllbGQtPkdldEFkZGl0aW9uYWxBY3Rpb24oKTsKICAgICBpZiAoYUFjdGlvbiAhPSBOVUxMICYmIGFBY3Rpb24uQWN0aW9uRXhpc3QoQ1BERl9BQWN0aW9uOjpGb3JtYXQpKQpAQCAtMTk3MiwxNiArMTk3MiwxNiBAQAogICAgICAgICAgICAgICAgIElGWEpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKICAgICAgICAgICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+T25GaWVsZF9Gb3JtYXQocEZvcm1GaWVsZCwgVmFsdWUsIFRSVUUpOworICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PbkZpZWxkX0Zvcm1hdChwRm9ybUZpZWxkLCBWYWx1ZSwgdHJ1ZSk7CiAKICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzSW5mbzsKLSAgICAgICAgICAgICAgICBGWF9CT09MIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHNjcmlwdCwgc0luZm8pOworICAgICAgICAgICAgICAgIGJvb2wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc2NyaXB0LCBzSW5mbyk7CiAgICAgICAgICAgICAgICAgcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKIAogICAgICAgICAgICAgICAgIGlmIChiUmV0KQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgc1ZhbHVlID0gVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGJGb3JtYXRlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJGb3JtYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xOTkwLDcgKzE5OTAsNyBAQAogICAgIHJldHVybiBzVmFsdWU7CiB9CiAKLXZvaWQgQ1BERlNES19JbnRlckZvcm06OlJlc2V0RmllbGRBcHBlYXJhbmNlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBjb25zdCBGWF9XQ0hBUiogc1ZhbHVlLCBGWF9CT09MIGJWYWx1ZUNoYW5nZWQpCit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpSZXNldEZpZWxkQXBwZWFyYW5jZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgY29uc3QgRlhfV0NIQVIqIHNWYWx1ZSwgYm9vbCBiVmFsdWVDaGFuZ2VkKQogewogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCkBAIC0yMDIwLDcgKzIwMjAsNyBAQAogICAgICAgICAgICAgQ0ZGTF9JRm9ybUZpbGxlciogcElGb3JtRmlsbGVyID0gcEVudi0+R2V0SUZvcm1GaWxsZXIoKTsKIAogICAgICAgICAgICAgQ1BERl9QYWdlICogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZQYWdlKCk7Ci0gICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VWaWV3KHBQYWdlLEZBTFNFKTsKKyAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcgPSBtX3BEb2N1bWVudC0+R2V0UGFnZVZpZXcocFBhZ2UsZmFsc2UpOwogCiAgICAgICAgICAgICBGWF9SRUNUIHJjQkJveCA9IHBJRm9ybUZpbGxlci0+R2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwV2lkZ2V0KTsKIApAQCAtMjAyOSw3ICsyMDI5LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQ1BERlNES19JbnRlckZvcm06Ok9uS2V5U3Ryb2tlQ29tbWl0KENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSwgRlhfQk9PTCYgYlJDKQordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6T25LZXlTdHJva2VDb21taXQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlLCBib29sJiBiUkMpCiB7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKQEAgLTIwNTgsNyArMjA1OCw3IEBACiAgICAgfQogfQogCi12b2lkIENQREZTREtfSW50ZXJGb3JtOjpPblZhbGlkYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSwgRlhfQk9PTCYgYlJDKQordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6T25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUsIGJvb2wmIGJSQykKIHsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIApAQCAtMjA4OSw3ICsyMDg5LDcgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkRvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikKK2Jvb2wgQ1BERlNES19JbnRlckZvcm06OkRvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikKIHsKICAgICBBU1NFUlQoYWN0aW9uKTsKIApAQCAtMjEwMCw5ICsyMTAwLDkgQEAKICAgICBDRlhfUHRyQXJyYXkgZmllbGRzOwogICAgIEdldEZpZWxkRnJvbU9iamVjdHMoZmllbGRPYmplY3RzLCBmaWVsZHMpOwogCi0gICAgRlhfQk9PTCBiSGlkZSA9IGFjdGlvbi5HZXRIaWRlU3RhdHVzKCk7CisgICAgYm9vbCBiSGlkZSA9IGFjdGlvbi5HZXRIaWRlU3RhdHVzKCk7CiAKLSAgICBGWF9CT09MIGJDaGFuZ2VkID0gRkFMU0U7CisgICAgYm9vbCBiQ2hhbmdlZCA9IGZhbHNlOwogCiAgICAgZm9yIChpbnQgaT0wLCBzej1maWVsZHMuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCiAgICAgewpAQCAtMjEzNyw3ICsyMTM3LDcgQEAKIAogICAgICAgICAgICAgICAgIHBQYWdlVmlldy0+VXBkYXRlVmlldyhwV2lkZ2V0KTsKIAotICAgICAgICAgICAgICAgIGJDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yMTQ1LDEyICsyMTQ1LDEyIEBACiAgICAgcmV0dXJuIGJDaGFuZ2VkOwogfQogCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpEb0FjdGlvbl9TdWJtaXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pCitib29sIENQREZTREtfSW50ZXJGb3JtOjpEb0FjdGlvbl9TdWJtaXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pCiB7CiAgICAgQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKICAgICBDRlhfV2lkZVN0cmluZyBzRGVzdGluYXRpb24gPSBhY3Rpb24uR2V0RmlsZVBhdGgoKTsKICAgICBpZiAoc0Rlc3RpbmF0aW9uLklzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0RpY3Rpb25hcnkqIHBBY3Rpb25EaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKICAgICBpZiAocEFjdGlvbkRpY3QtPktleUV4aXN0KCJGaWVsZHMiKSkKQEAgLTIxNjQsMjEgKzIxNjQsMjEgQEAKICAgICAgICAgR2V0RmllbGRGcm9tT2JqZWN0cyhmaWVsZE9iamVjdHMsIGZpZWxkcyk7CiAgICAgICAgIGlmIChmaWVsZHMuR2V0U2l6ZSgpICE9IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUgPSAhKGR3RmxhZ3MgJiAweDAxKTsKKyAgICAgICAgICAgIGJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUgPSAhKGR3RmxhZ3MgJiAweDAxKTsKICAgICAgICAgICAgIGlmIChtX3BJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMoJmZpZWxkcywgYkluY2x1ZGVPckV4Y2x1ZGUpKQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgICAgIHJldHVybiBTdWJtaXRGaWVsZHMoc0Rlc3RpbmF0aW9uLCBmaWVsZHMsIGJJbmNsdWRlT3JFeGNsdWRlLCBGQUxTRSk7CisgICAgICAgICAgICByZXR1cm4gU3VibWl0RmllbGRzKHNEZXN0aW5hdGlvbiwgZmllbGRzLCBiSW5jbHVkZU9yRXhjbHVkZSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtX3BJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMoKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICByZXR1cm4gU3VibWl0Rm9ybShzRGVzdGluYXRpb24sIEZBTFNFKTsKKyAgICByZXR1cm4gU3VibWl0Rm9ybShzRGVzdGluYXRpb24sIGZhbHNlKTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6U3VibWl0RmllbGRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0Rlc3RpbmF0aW9uLCBjb25zdCBDRlhfUHRyQXJyYXkmIGZpZWxkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUsIEZYX0JPT0wgYlVybEVuY29kZWQpCitib29sIENQREZTREtfSW50ZXJGb3JtOjpTdWJtaXRGaWVsZHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRGVzdGluYXRpb24sIGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSW5jbHVkZU9yRXhjbHVkZSwgYm9vbCBiVXJsRW5jb2RlZCkKIHsKICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpOwogICAgIEFTU0VSVChwRW52ICE9IE5VTEwpOwpAQCAtMjE5MiwxMiArMjE5MiwxMiBAQAogICAgIGlmIChiVXJsRW5jb2RlZCkKICAgICB7CiAgICAgICAgIGlmKCFGREZUb1VSTEVuY29kZWREYXRhKHBCdWZmZXIsIG5CdWZTaXplKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBwRW52LT5KU19kb2NTdWJtaXRGb3JtKHBCdWZmZXIsIG5CdWZTaXplLCBjc0Rlc3RpbmF0aW9uLmNfc3RyKCkpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQ1BERlNES19JbnRlckZvcm06OkRvRkRGQnVmZmVyKENGWF9CeXRlU3RyaW5nIHNCdWZmZXIpCkBAIC0yMjM2LDIyICsyMjM2LDIyIEBACiAgICAgc0J1ZmZlci5SZWxlYXNlQnVmZmVyKCk7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkZERlRvVVJMRW5jb2RlZERhdGEoQ0ZYX1dpZGVTdHJpbmcgY3NGREZGaWxlLCBDRlhfV2lkZVN0cmluZyBjc1R4dEZpbGUpCitib29sIENQREZTREtfSW50ZXJGb3JtOjpGREZUb1VSTEVuY29kZWREYXRhKENGWF9XaWRlU3RyaW5nIGNzRkRGRmlsZSwgQ0ZYX1dpZGVTdHJpbmcgY3NUeHRGaWxlKQogewotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpGREZUb1VSTEVuY29kZWREYXRhKHVpbnQ4X3QqJiBwQnVmLCBGWF9TVFJTSVpFJiBuQnVmU2l6ZSkKK2Jvb2wgQ1BERlNES19JbnRlckZvcm06OkZERlRvVVJMRW5jb2RlZERhdGEodWludDhfdComIHBCdWYsIEZYX1NUUlNJWkUmIG5CdWZTaXplKQogewogICAgIENGREZfRG9jdW1lbnQqIHBGREYgPSBDRkRGX0RvY3VtZW50OjpQYXJzZU1lbW9yeShwQnVmLCBuQnVmU2l6ZSk7CiAgICAgaWYgKHBGREYpCiAgICAgewogICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBNYWluRGljdCA9IHBGREYtPkdldFJvb3QoKS0+R2V0RGljdCgiRkRGIik7Ci0gICAgICAgIGlmIChwTWFpbkRpY3QgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAocE1haW5EaWN0ID09IE5VTEwpIHJldHVybiBmYWxzZTsKIAogICAgICAgICAvLyBHZXQgZmllbGRzCiAgICAgICAgIENQREZfQXJyYXkqIHBGaWVsZHMgPSBwTWFpbkRpY3QtPkdldEFycmF5KCJGaWVsZHMiKTsKLSAgICAgICAgaWYgKHBGaWVsZHMgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAocEZpZWxkcyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmIGZkZkVuY29kZWREYXRhOwogCkBAIC0yMjc5LDE3ICsyMjc5LDE3IEBACiAgICAgICAgIHBCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBuQnVmU2l6ZSk7CiAgICAgICAgIEZYU1lTX21lbWNweShwQnVmLCBmZGZFbmNvZGVkRGF0YS5HZXRCdWZmZXIoKSwgbkJ1ZlNpemUpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6RXhwb3J0RmllbGRzVG9GREZUZXh0QnVmKGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUsIENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1ZikKK2Jvb2wgQ1BERlNES19JbnRlckZvcm06OkV4cG9ydEZpZWxkc1RvRkRGVGV4dEJ1Zihjb25zdCBDRlhfUHRyQXJyYXkmIGZpZWxkcyxib29sIGJJbmNsdWRlT3JFeGNsdWRlLCBDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogICAgIEFTU0VSVChtX3BJbnRlckZvcm0gIT0gTlVMTCk7CiAKICAgICBDRkRGX0RvY3VtZW50KiBwRkRGID0gbV9wSW50ZXJGb3JtLT5FeHBvcnRUb0ZERihtX3BEb2N1bWVudC0+R2V0UGF0aCgpLChDRlhfUHRyQXJyYXkmKWZpZWxkcywgYkluY2x1ZGVPckV4Y2x1ZGUpOwotICAgIGlmICghcEZERikgcmV0dXJuIEZBTFNFOwotICAgIEZYX0JPT0wgYlJldCA9IHBGREYtPldyaXRlQnVmKHRleHRCdWYpOyAvLyA9IEZBTFNFOy8vCisgICAgaWYgKCFwRkRGKSByZXR1cm4gZmFsc2U7CisgICAgYm9vbCBiUmV0ID0gcEZERi0+V3JpdGVCdWYodGV4dEJ1Zik7IC8vID0gZmFsc2U7Ly8KICAgICBkZWxldGUgcEZERjsKIAogICAgIHJldHVybiBiUmV0OwpAQCAtMjMwMSwyNCArMjMwMSwyNCBAQAogICAgIHJldHVybiBMIiI7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OlN1Ym1pdEZvcm0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNEZXN0aW5hdGlvbiwgRlhfQk9PTCBiVXJsRW5jb2RlZCkKK2Jvb2wgQ1BERlNES19JbnRlckZvcm06OlN1Ym1pdEZvcm0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNEZXN0aW5hdGlvbiwgYm9vbCBiVXJsRW5jb2RlZCkKIHsKLSAgICBpZiAoc0Rlc3RpbmF0aW9uLklzRW1wdHkoKSkgcmV0dXJuIEZBTFNFOworICAgIGlmIChzRGVzdGluYXRpb24uSXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpOwogICAgIEFTU0VSVChwRW52ICE9IE5VTEwpOwogCi0gICAgaWYoTlVMTCA9PSBtX3BEb2N1bWVudCkgcmV0dXJuIEZBTFNFOworICAgIGlmKE5VTEwgPT0gbV9wRG9jdW1lbnQpIHJldHVybiBmYWxzZTsKICAgICBDRlhfV2lkZVN0cmluZyB3c1BERkZpbGVQYXRoID0gbV9wRG9jdW1lbnQtPkdldFBhdGgoKTsKIAotICAgIGlmKE5VTEwgPT0gbV9wSW50ZXJGb3JtKSByZXR1cm4gRkFMU0U7CisgICAgaWYoTlVMTCA9PSBtX3BJbnRlckZvcm0pIHJldHVybiBmYWxzZTsKICAgICBDRkRGX0RvY3VtZW50KiBwRkRGRG9jID0gbV9wSW50ZXJGb3JtLT5FeHBvcnRUb0ZERih3c1BERkZpbGVQYXRoKTsKLSAgICBpZiAoTlVMTCA9PSBwRkRGRG9jKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKE5VTEwgPT0gcEZERkRvYykgcmV0dXJuIGZhbHNlOwogCiAgICAgQ0ZYX0J5dGVUZXh0QnVmIEZkZkJ1ZmZlcjsKLSAgICBGWF9CT09MIGJSZXQgPSBwRkRGRG9jLT5Xcml0ZUJ1ZihGZGZCdWZmZXIpOworICAgIGJvb2wgYlJldCA9IHBGREZEb2MtPldyaXRlQnVmKEZkZkJ1ZmZlcik7CiAgICAgZGVsZXRlIHBGREZEb2M7Ci0gICAgaWYgKCFiUmV0KSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFiUmV0KSByZXR1cm4gZmFsc2U7CiAKICAgICB1aW50OF90KiBwQnVmZmVyID0gRmRmQnVmZmVyLkdldEJ1ZmZlcigpOwogICAgIEZYX1NUUlNJWkUgbkJ1ZlNpemUgPSBGZGZCdWZmZXIuR2V0TGVuZ3RoKCk7CkBAIC0yMzI2LDcgKzIzMjYsNyBAQAogICAgIGlmIChiVXJsRW5jb2RlZCkKICAgICB7CiAgICAgICAgIGlmKCFGREZUb1VSTEVuY29kZWREYXRhKHBCdWZmZXIsIG5CdWZTaXplKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBwRW52LT5KU19kb2NTdWJtaXRGb3JtKHBCdWZmZXIsIG5CdWZTaXplLCBzRGVzdGluYXRpb24uY19zdHIoKSk7CkBAIC0yMzM3LDI2ICsyMzM3LDI2IEBACiAgICAgICAgIHBCdWZmZXIgPSBOVUxMOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpFeHBvcnRGb3JtVG9GREZUZXh0QnVmKENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1ZikKK2Jvb2wgQ1BERlNES19JbnRlckZvcm06OkV4cG9ydEZvcm1Ub0ZERlRleHRCdWYoQ0ZYX0J5dGVUZXh0QnVmJiB0ZXh0QnVmKQogewogCiAgICAgQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBDRkRGX0RvY3VtZW50KiBwRkRGID0gbV9wSW50ZXJGb3JtLT5FeHBvcnRUb0ZERihtX3BEb2N1bWVudC0+R2V0UGF0aCgpKTsKLSAgICBpZiAoIXBGREYpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIXBGREYpIHJldHVybiBmYWxzZTsKIAotICAgIEZYX0JPT0wgYlJldCA9IHBGREYtPldyaXRlQnVmKHRleHRCdWYpOworICAgIGJvb2wgYlJldCA9IHBGREYtPldyaXRlQnVmKHRleHRCdWYpOwogICAgIGRlbGV0ZSBwRkRGOwogCiAgICAgcmV0dXJuIGJSZXQ7CiB9CiAKIAotRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6RG9BY3Rpb25fUmVzZXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pCitib29sIENQREZTREtfSW50ZXJGb3JtOjpEb0FjdGlvbl9SZXNldEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikKIHsKICAgICBBU1NFUlQoYWN0aW9uKTsKIApAQCAtMjM3MCwxNSArMjM3MCwxNSBAQAogICAgICAgICBhZi5HZXRBbGxGaWVsZHMoZmllbGRPYmplY3RzKTsKICAgICAgICAgQ0ZYX1B0ckFycmF5IGZpZWxkczsKICAgICAgICAgR2V0RmllbGRGcm9tT2JqZWN0cyhmaWVsZE9iamVjdHMsIGZpZWxkcyk7Ci0gICAgICAgIHJldHVybiBtX3BJbnRlckZvcm0tPlJlc2V0Rm9ybShmaWVsZHMsICEoZHdGbGFncyAmIDB4MDEpLCBUUlVFKTsKKyAgICAgICAgcmV0dXJuIG1fcEludGVyRm9ybS0+UmVzZXRGb3JtKGZpZWxkcywgIShkd0ZsYWdzICYgMHgwMSksIHRydWUpOwogICAgIH0KIAotICAgIHJldHVybiBtX3BJbnRlckZvcm0tPlJlc2V0Rm9ybShUUlVFKTsKKyAgICByZXR1cm4gbV9wSW50ZXJGb3JtLT5SZXNldEZvcm0odHJ1ZSk7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkRvQWN0aW9uX0ltcG9ydERhdGEoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikKK2Jvb2wgQ1BERlNES19JbnRlckZvcm06OkRvQWN0aW9uX0ltcG9ydERhdGEoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENQREZTREtfSW50ZXJGb3JtOjpHZXRGaWVsZEZyb21PYmplY3RzKGNvbnN0IENGWF9QdHJBcnJheSYgb2JqZWN0cywgQ0ZYX1B0ckFycmF5JiBmaWVsZHMpCkBAIC0yNDE1LDcgKzI0MTUsNyBAQAogICAgIGludCBuVHlwZSA9IHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpOwogICAgIGlmIChuVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgblR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkKICAgICB7Ci0gICAgICAgIEZYX0JPT0wgYlJDID0gVFJVRTsKKyAgICAgICAgYm9vbCBiUkMgPSB0cnVlOwogICAgICAgICBPbktleVN0cm9rZUNvbW1pdChwRm9ybUZpZWxkLCBjc1ZhbHVlLCBiUkMpOwogICAgICAgICBpZiAoYlJDKQogICAgICAgICB7CkBAIC0yNDM0LDEyICsyNDM0LDEyIEBACiAgICAgaWYgKG5UeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCB8fCBuVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKQogICAgIHsKICAgICAgICAgT25DYWxjdWxhdGUocEZvcm1GaWVsZCk7Ci0gICAgICAgIEZYX0JPT0wgYkZvcm1hdGVkID0gRkFMU0U7CisgICAgICAgIGJvb2wgYkZvcm1hdGVkID0gZmFsc2U7CiAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IE9uRm9ybWF0KHBGb3JtRmllbGQsIGJGb3JtYXRlZCk7CiAgICAgICAgIGlmIChiRm9ybWF0ZWQpCi0gICAgICAgICAgICBSZXNldEZpZWxkQXBwZWFyYW5jZShwRm9ybUZpZWxkLCBzVmFsdWUuY19zdHIoKSwgVFJVRSk7CisgICAgICAgICAgICBSZXNldEZpZWxkQXBwZWFyYW5jZShwRm9ybUZpZWxkLCBzVmFsdWUuY19zdHIoKSwgdHJ1ZSk7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIFJlc2V0RmllbGRBcHBlYXJhbmNlKHBGb3JtRmllbGQsIE5VTEwsIFRSVUUpOworICAgICAgICAgICAgUmVzZXRGaWVsZEFwcGVhcmFuY2UocEZvcm1GaWVsZCwgTlVMTCwgdHJ1ZSk7CiAgICAgICAgIFVwZGF0ZUZpZWxkKHBGb3JtRmllbGQpOwogICAgIH0KICAgICByZXR1cm4gMDsKQEAgLTI0NTEsNyArMjQ1MSw3IEBACiAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9MSVNUQk9YKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIEZYX0JPT0wgYlJDID0gVFJVRTsKKyAgICBib29sIGJSQyA9IHRydWU7CiAgICAgT25LZXlTdHJva2VDb21taXQocEZvcm1GaWVsZCwgY3NWYWx1ZSwgYlJDKTsKICAgICBpZiAoIWJSQykKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMjQ2OSw3ICsyNDY5LDcgQEAKICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0xJU1RCT1gpCiAgICAgewogICAgICAgICBPbkNhbGN1bGF0ZShwRm9ybUZpZWxkKTsKLSAgICAgICAgUmVzZXRGaWVsZEFwcGVhcmFuY2UocEZvcm1GaWVsZCwgTlVMTCwgVFJVRSk7CisgICAgICAgIFJlc2V0RmllbGRBcHBlYXJhbmNlKHBGb3JtRmllbGQsIE5VTEwsIHRydWUpOwogICAgICAgICBVcGRhdGVGaWVsZChwRm9ybUZpZWxkKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CkBAIC0yNTA5LDE2ICsyNTA5LDE2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OklzTmVlZEhpZ2hMaWdodChpbnQgbkZpZWxkVHlwZSkKK2Jvb2wgQ1BERlNES19JbnRlckZvcm06OklzTmVlZEhpZ2hMaWdodChpbnQgbkZpZWxkVHlwZSkKIHsKICAgICBpZihuRmllbGRUeXBlIDwxIHx8IG5GaWVsZFR5cGUgPiA2KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICByZXR1cm4gbV9iTmVlZEhpZ2h0bGlnaHRbbkZpZWxkVHlwZS0xXTsKIH0KIAogdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6UmVtb3ZlQWxsSGlnaExpZ2h0KCkKIHsKLSAgICBtZW1zZXQoKHZvaWQqKW1fYk5lZWRIaWdodGxpZ2h0LCAwLCA2KnNpemVvZihGWF9CT09MKSk7CisgICAgbWVtc2V0KCh2b2lkKiltX2JOZWVkSGlnaHRsaWdodCwgMCwgNipzaXplb2YoYm9vbCkpOwogfQogdm9pZCAgIENQREZTREtfSW50ZXJGb3JtOjpTZXRIaWdobGlnaHRDb2xvcihGWF9DT0xPUlJFRiBjbHIsIGludCBuRmllbGRUeXBlKQogewpAQCAtMjUzMCwxNCArMjUzMCwxNCBAQAogICAgICAgICAgICAgZm9yKGludCBpPTA7IGk8NjsgaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG1fYUhpZ2hsaWdodENvbG9yW2ldID0gY2xyOwotICAgICAgICAgICAgICAgIG1fYk5lZWRIaWdodGxpZ2h0W2ldID0gVFJVRTsKKyAgICAgICAgICAgICAgICBtX2JOZWVkSGlnaHRsaWdodFtpXSA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIG1fYUhpZ2hsaWdodENvbG9yW25GaWVsZFR5cGUtMV0gPSBjbHI7Ci0gICAgICAgICAgICBtX2JOZWVkSGlnaHRsaWdodFtuRmllbGRUeXBlLTFdID0gVFJVRTsKKyAgICAgICAgICAgIG1fYk5lZWRIaWdodGxpZ2h0W25GaWVsZFR5cGUtMV0gPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0yNzgzLDcgKzI3ODMsNyBAQAogCiAgICAgICAgICAgICBpZiAoc2EuR2V0U2l6ZSgpID4gMCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYS5Tb3J0KENCQV9Bbm5vdEl0ZXJhdG9yOjpDb21wYXJlQnlUb3AsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICBzYS5Tb3J0KENCQV9Bbm5vdEl0ZXJhdG9yOjpDb21wYXJlQnlUb3AsIGZhbHNlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgd2hpbGUgKHNhLkdldFNpemUoKSA+IDApCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mc2RrX21nci5jcHAgYi9mcGRmc2RrL3NyYy9mc2RrX21nci5jcHAKaW5kZXggMDVjMWEzZC4uZGE0MDVjZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnNka19tZ3IuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZzZGtfbWdyLmNwcApAQCAtMjYsMTAgKzI2LDEwIEBACiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgIEludmFsaWRhdGVSZWN0KEZYX0hXTkQgaFduZCwgRlhfUkVDVCByZWN0KSA7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgIE91dHB1dFNlbGVjdGVkUmVjdCh2b2lkKiBwRm9ybUZpbGxlciwgQ1BERl9SZWN0JiByZWN0KTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgICAgICBJc1NlbGVjdGlvbkltcGxlbWVudGVkKCk7CisgICAgdmlydHVhbCBib29sICAgICAgICAgICAgIElzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKTsKIAogICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgICAgICBHZXRDbGlwYm9hcmRUZXh0KEZYX0hXTkQgaFduZCl7cmV0dXJuIEwiIjt9Ci0gICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgICAgIFNldENsaXBib2FyZFRleHQoRlhfSFdORCBoV25kLCBDRlhfV2lkZVN0cmluZyBzdHJpbmcpIHtyZXR1cm4gRkFMU0U7fQorICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgICBTZXRDbGlwYm9hcmRUZXh0KEZYX0hXTkQgaFduZCwgQ0ZYX1dpZGVTdHJpbmcgc3RyaW5nKSB7cmV0dXJuIGZhbHNlO30KIAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICBDbGllbnRUb1NjcmVlbihGWF9IV05EIGhXbmQsIGludDMyX3QmIHgsIGludDMyX3QmIHkpIHt9CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgIFNjcmVlblRvQ2xpZW50KEZYX0hXTkQgaFduZCwgaW50MzJfdCYgeCwgaW50MzJfdCYgeSkge30KQEAgLTQ1LDIzICs0NSwyMyBAQAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICBTZXRDdXJzb3IoaW50MzJfdCBuQ3Vyc29yVHlwZSk7CiAKICAgICB2aXJ0dWFsIEZYX0hNRU5VICAgICAgICAgICAgQ3JlYXRlUG9wdXBNZW51KCkge3JldHVybiBOVUxMO30KLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICAgICAgQXBwZW5kTWVudUl0ZW0oRlhfSE1FTlUgaE1lbnUsIGludDMyX3QgbklETmV3SXRlbSwgQ0ZYX1dpZGVTdHJpbmcgc3RyaW5nKSB7cmV0dXJuIEZBTFNFO30KLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICAgICAgRW5hYmxlTWVudUl0ZW0oRlhfSE1FTlUgaE1lbnUsIGludDMyX3QgbklESXRlbSwgRlhfQk9PTCBiRW5hYmxlZCkge3JldHVybiBGQUxTRTt9CisgICAgdmlydHVhbCBib29sICAgICAgICAgICAgIEFwcGVuZE1lbnVJdGVtKEZYX0hNRU5VIGhNZW51LCBpbnQzMl90IG5JRE5ld0l0ZW0sIENGWF9XaWRlU3RyaW5nIHN0cmluZykge3JldHVybiBmYWxzZTt9CisgICAgdmlydHVhbCBib29sICAgICAgICAgICAgIEVuYWJsZU1lbnVJdGVtKEZYX0hNRU5VIGhNZW51LCBpbnQzMl90IG5JREl0ZW0sIGJvb2wgYkVuYWJsZWQpIHtyZXR1cm4gZmFsc2U7fQogICAgIHZpcnR1YWwgaW50MzJfdCAgICAgICAgIFRyYWNrUG9wdXBNZW51KEZYX0hNRU5VIGhNZW51LCBpbnQzMl90IHgsIGludDMyX3QgeSwgRlhfSFdORCBoUGFyZW50KSB7cmV0dXJuIC0xO30KICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgRGVzdHJveU1lbnUoRlhfSE1FTlUgaE1lbnUpIHt9CiAKICAgICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nICAgICAgR2V0TmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQpOwotICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgICAgICBGaW5kTmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQsIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUpOworICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgICBGaW5kTmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQsIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUpOwogICAgIHZpcnR1YWwgQ1BERl9Gb250KiAgICAgICAgICBBZGROYXRpdmVUcnVlVHlwZUZvbnRUb1BERihDUERGX0RvY3VtZW50KiBwRG9jLCBDRlhfQnl0ZVN0cmluZyBzRm9udEZhY2VOYW1lLCB1aW50OF90IG5DaGFyc2V0KTsKIAogICAgIHZpcnR1YWwgaW50MzJfdCAgICAgICAgIFNldFRpbWVyKGludDMyX3QgdUVsYXBzZSwgVGltZXJDYWxsYmFjayBscFRpbWVyRnVuYykgOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICBLaWxsVGltZXIoaW50MzJfdCBuSUQpIDsKIAogCi0gICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgICAgIElzU0hJRlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSB7cmV0dXJuIG1fcEVudi0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTt9Ci0gICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgICAgIElzQ1RSTEtleURvd24oRlhfRFdPUkQgbkZsYWcpIHtyZXR1cm4gbV9wRW52LT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7fQotICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgICAgICBJc0FMVEtleURvd24oRlhfRFdPUkQgbkZsYWcpIHtyZXR1cm4gbV9wRW52LT5GRklfSXNBTFRLZXlEb3duKG5GbGFnKTt9Ci0gICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgICAgIElzSU5TRVJUS2V5RG93bihGWF9EV09SRCBuRmxhZykge3JldHVybiBtX3BFbnYtPkZGSV9Jc0lOU0VSVEtleURvd24obkZsYWcpO30KKyAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICAgSXNTSElGVEtleURvd24oRlhfRFdPUkQgbkZsYWcpIHtyZXR1cm4gbV9wRW52LT5GRklfSXNTSElGVEtleURvd24obkZsYWcpO30KKyAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICAgSXNDVFJMS2V5RG93bihGWF9EV09SRCBuRmxhZykge3JldHVybiBtX3BFbnYtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTt9CisgICAgdmlydHVhbCBib29sICAgICAgICAgICAgIElzQUxUS2V5RG93bihGWF9EV09SRCBuRmxhZykge3JldHVybiBtX3BFbnYtPkZGSV9Jc0FMVEtleURvd24obkZsYWcpO30KKyAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICAgSXNJTlNFUlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSB7cmV0dXJuIG1fcEVudi0+RkZJX0lzSU5TRVJUS2V5RG93bihuRmxhZyk7fQogCiAgICAgdmlydHVhbCBGWF9TWVNURU1USU1FICAgICAgIEdldExvY2FsVGltZSgpOwogCkBAIC0xMjIsMTUgKzEyMiwxNSBAQAogCiB9CiAKLUZYX0JPT0wgQ0ZYX1N5c3RlbUhhbmRsZXI6OklzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKQorYm9vbCBDRlhfU3lzdGVtSGFuZGxlcjo6SXNTZWxlY3Rpb25JbXBsZW1lbnRlZCgpCiB7CiAgICAgaWYobV9wRW52KQogICAgIHsKICAgICAgICAgRlBERl9GT1JNRklMTElORk8qIHBJbmZvID0gbV9wRW52LT5HZXRGb3JtRmlsbEluZm8oKTsKICAgICAgICAgaWYocEluZm8gJiYgcEluZm8tPkZGSV9PdXRwdXRTZWxlY3RlZFJlY3QpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBDRlhfQnl0ZVN0cmluZyBDRlhfU3lzdGVtSGFuZGxlcjo6R2V0TmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQpCkBAIC0xMzgsNyArMTM4LDcgQEAKICAgICByZXR1cm4gIiI7CiB9CiAKLUZYX0JPT0wgQ0ZYX1N5c3RlbUhhbmRsZXI6OkZpbmROYXRpdmVUcnVlVHlwZUZvbnQoaW50MzJfdCBuQ2hhcnNldCwgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRGYWNlTmFtZSkKK2Jvb2wgQ0ZYX1N5c3RlbUhhbmRsZXI6OkZpbmROYXRpdmVUcnVlVHlwZUZvbnQoaW50MzJfdCBuQ2hhcnNldCwgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRGYWNlTmFtZSkKIHsKICAgICBDRlhfRm9udE1nciogcEZvbnRNZ3IgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCk7CiAgICAgaWYocEZvbnRNZ3IpCkBAIC0xNTYsMTMgKzE1NiwxMyBAQAogICAgICAgICAgICAgZm9yKGludCBpPTA7IGk8blNpemU7IGkrKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZihwRm9udE1hcHBlci0+bV9JbnN0YWxsZWRUVEZvbnRzW2ldLkNvbXBhcmUoc0ZvbnRGYWNlTmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIGludCBDaGFyU2V0MkNQKGludCBjaGFyc2V0KQpAQCAtMTgzLDggKzE4Myw4IEBACiAgICAgaWYocERvYykKICAgICB7CiAgICAgICAgIENGWF9Gb250KiBwRlhGb250ID0gbmV3IENGWF9Gb250KCk7Ci0gICAgICAgIHBGWEZvbnQtPkxvYWRTdWJzdChzRm9udEZhY2VOYW1lLFRSVUUsMCwwLDAsQ2hhclNldDJDUChuQ2hhcnNldCksRkFMU0UpOwotICAgICAgICBDUERGX0ZvbnQqIHBGb250ID0gcERvYy0+QWRkRm9udChwRlhGb250LG5DaGFyc2V0LEZBTFNFKTsKKyAgICAgICAgcEZYRm9udC0+TG9hZFN1YnN0KHNGb250RmFjZU5hbWUsdHJ1ZSwwLDAsMCxDaGFyU2V0MkNQKG5DaGFyc2V0KSxmYWxzZSk7CisgICAgICAgIENQREZfRm9udCogcEZvbnQgPSBwRG9jLT5BZGRGb250KHBGWEZvbnQsbkNoYXJzZXQsZmFsc2UpOwogICAgICAgICBkZWxldGUgcEZYRm9udDsKICAgICAgICAgcmV0dXJuIHBGb250OwogICAgIH0KQEAgLTQwOSw3ICs0MDksNyBAQAogICAgIG1fcEZvY3VzQW5ub3QobnVsbHB0ciksCiAgICAgbV9wRW52KHBFbnYpLAogICAgIG1fcE9jY29udGVudChudWxscHRyKSwKLSAgICBtX2JDaGFuZ2VNYXNrKEZBTFNFKQorICAgIG1fYkNoYW5nZU1hc2soZmFsc2UpCiB7CiB9CiAKQEAgLTQyNiw3ICs0MjYsNyBAQAogICAgIG1fcE9jY29udGVudCA9IG51bGxwdHI7CiB9CiAKLUNQREZTREtfUGFnZVZpZXcqIENQREZTREtfRG9jdW1lbnQ6OkdldFBhZ2VWaWV3KENQREZfUGFnZSogcFBERlBhZ2UsIEZYX0JPT0wgUmVOZXcpCitDUERGU0RLX1BhZ2VWaWV3KiBDUERGU0RLX0RvY3VtZW50OjpHZXRQYWdlVmlldyhDUERGX1BhZ2UqIHBQREZQYWdlLCBib29sIFJlTmV3KQogewogICAgIGF1dG8gaXQgPSBtX3BhZ2VNYXAuZmluZChwUERGUGFnZSk7CiAgICAgaWYgKGl0ICE9IG1fcGFnZU1hcC5lbmQoKSkKQEAgLTQ0NSw3ICs0NDUsNyBAQAogQ1BERlNES19QYWdlVmlldyogQ1BERlNES19Eb2N1bWVudDo6R2V0Q3VycmVudFZpZXcoKQogewogICAgIENQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKiltX3BFbnYtPkZGSV9HZXRDdXJyZW50UGFnZShtX3BEb2MpOwotICAgIHJldHVybiBwUGFnZSA/IEdldFBhZ2VWaWV3KHBQYWdlLCBUUlVFKSA6IG51bGxwdHI7CisgICAgcmV0dXJuIHBQYWdlID8gR2V0UGFnZVZpZXcocFBhZ2UsIHRydWUpIDogbnVsbHB0cjsKIH0KIAogQ1BERlNES19QYWdlVmlldyogQ1BERlNES19Eb2N1bWVudDo6R2V0UGFnZVZpZXcoaW50IG5JbmRleCkKQEAgLTQ3NCwyNCArNDc0LDI0IEBACiAKIH0KIAotRlhfQk9PTCBDUERGU0RLX0RvY3VtZW50OjpQcm9jT3BlbkFjdGlvbigpCitib29sIENQREZTREtfRG9jdW1lbnQ6OlByb2NPcGVuQWN0aW9uKCkKIHsKICAgICBpZighbV9wRG9jKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BEb2MtPkdldFJvb3QoKTsKICAgICBpZiAoIXBSb290KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfT2JqZWN0KiBwT3BlbkFjdGlvbiA9IHBSb290LT5HZXREaWN0KCJPcGVuQWN0aW9uIik7CiAgICAgaWYoIXBPcGVuQWN0aW9uKQogICAgICAgICBwT3BlbkFjdGlvbiA9IHBSb290LT5HZXRBcnJheSgiT3BlbkFjdGlvbiIpOwogCiAgICAgaWYoIXBPcGVuQWN0aW9uKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGlmKHBPcGVuQWN0aW9uLT5HZXRUeXBlKCk9PVBERk9CSl9BUlJBWSkKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgaWYocE9wZW5BY3Rpb24tPkdldFR5cGUoKT09UERGT0JKX0RJQ1RJT05BUlkpCiAgICAgewpAQCAtNDk5LDkgKzQ5OSw5IEBACiAgICAgICAgIENQREZfQWN0aW9uIGFjdGlvbihwRGljdCk7CiAgICAgICAgIGlmKG1fcEVudi0+R2V0QWN0aW9uSGFuZGVyKCkpCiAgICAgICAgICAgICBtX3BFbnYtPkdldEFjdGlvbkhhbmRlcigpLT5Eb0FjdGlvbl9Eb2NPcGVuKGFjdGlvbiwgdGhpcyk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogQ1BERl9PQ0NvbnRleHQqIENQREZTREtfRG9jdW1lbnQ6OkdldE9DQ29udGV4dCgpCkBAIC01NTUsMTQgKzU1NSwxNCBAQAogICAgIHJldHVybiBtX3BGb2N1c0Fubm90OwogfQogCi1GWF9CT09MIENQREZTREtfRG9jdW1lbnQ6OlNldEZvY3VzQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90LEZYX1VJTlQgbkZsYWcpCitib29sIENQREZTREtfRG9jdW1lbnQ6OlNldEZvY3VzQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90LEZYX1VJTlQgbkZsYWcpCiB7CiAKLSAgICBpZihtX3BGb2N1c0Fubm90PT1wQW5ub3QpIHJldHVybiBUUlVFOworICAgIGlmKG1fcEZvY3VzQW5ub3Q9PXBBbm5vdCkgcmV0dXJuIHRydWU7CiAKICAgICBpZihtX3BGb2N1c0Fubm90KQogICAgIHsKLSAgICAgICAgaWYoIUtpbGxGb2N1c0Fubm90KG5GbGFnKSApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYoIUtpbGxGb2N1c0Fubm90KG5GbGFnKSApIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcEFubm90LT5HZXRQYWdlVmlldygpOwogICAgIGlmKHBBbm5vdCAmJiBwUGFnZVZpZXctPklzVmFsaWQoKSkKQEAgLTU3MiwxOCArNTcyLDE4IEBACiAgICAgICAgIGlmKHBBbm5vdEhhbmRsZXImJiFtX3BGb2N1c0Fubm90KQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIXBBbm5vdEhhbmRsZXItPkFubm90X09uU2V0Rm9jdXMocEFubm90LG5GbGFnKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgaWYoIW1fcEZvY3VzQW5ub3QpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbV9wRm9jdXNBbm5vdD1wQW5ub3Q7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0RvY3VtZW50OjpLaWxsRm9jdXNBbm5vdChGWF9VSU5UIG5GbGFnKQorYm9vbCBDUERGU0RLX0RvY3VtZW50OjpLaWxsRm9jdXNBbm5vdChGWF9VSU5UIG5GbGFnKQogewogICAgIGlmKG1fcEZvY3VzQW5ub3QpCiAgICAgewpAQCAtNjAwLDExICs2MDAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBGb2N1c0Fubm90OwogICAgICAgICAgICAgICAgICAgICBpbnQgbkZpZWxkVHlwZSA9IHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICBpZihGSUVMRFRZUEVfVEVYVEZJRUxEID09IG5GaWVsZFR5cGUgfHwgRklFTERUWVBFX0NPTUJPQk9YID09IG5GaWVsZFR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BFbnYtPkZGSV9PblNldEZpZWxkSW5wdXRGb2N1cyhOVUxMLCBOVUxMLCAwLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3BFbnYtPkZGSV9PblNldEZpZWxkSW5wdXRGb2N1cyhOVUxMLCBOVUxMLCAwLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYoIW1fcEZvY3VzQW5ub3QpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKQEAgLTYxMiw3ICs2MTIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ1BERlNES19Eb2N1bWVudDo6T25DbG9zZURvY3VtZW50KCkKQEAgLTYyMCw3ICs2MjAsNyBAQAogICAgIEtpbGxGb2N1c0Fubm90KCk7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19Eb2N1bWVudDo6R2V0UGVybWlzc2lvbnMoaW50IG5GbGFnKQorYm9vbCBDUERGU0RLX0RvY3VtZW50OjpHZXRQZXJtaXNzaW9ucyhpbnQgbkZsYWcpCiB7CiAgICAgRlhfRFdPUkQgZHdQZXJtaXNzaW9ucyA9IG1fcERvYy0+R2V0VXNlclBlcm1pc3Npb25zKCk7CiAgICAgcmV0dXJuIGR3UGVybWlzc2lvbnMmbkZsYWc7CkBAIC02NTAsMTMgKzY1MCwxMyBAQAogICAgICAgICBtX3BhZ2UtPlNldFByaXZhdGVEYXRhKCh2b2lkKiltX3BhZ2UsICh2b2lkKil0aGlzLCBOVUxMKTsKICAgICBtX2Z4QW5ub3RBcnJheS5SZW1vdmVBbGwoKTsKIAotICAgIG1fYkVudGVyV2lkZ2V0ID0gRkFMU0U7Ci0gICAgbV9iRXhpdFdpZGdldCA9IEZBTFNFOwotICAgIG1fYk9uV2lkZ2V0ID0gRkFMU0U7CisgICAgbV9iRW50ZXJXaWRnZXQgPSBmYWxzZTsKKyAgICBtX2JFeGl0V2lkZ2V0ID0gZmFsc2U7CisgICAgbV9iT25XaWRnZXQgPSBmYWxzZTsKICAgICBtX0NhcHR1cmVXaWRnZXQgPSBOVUxMOwotICAgIG1fYlZhbGlkID0gRkFMU0U7Ci0gICAgICAgIG1fYkxvY2tlZCA9IEZBTFNFOwotICAgICAgICBtX2JUYWtlT3ZlclBhZ2UgPSBGQUxTRTsKKyAgICBtX2JWYWxpZCA9IGZhbHNlOworICAgICAgICBtX2JMb2NrZWQgPSBmYWxzZTsKKyAgICAgICAgbV9iVGFrZU92ZXJQYWdlID0gZmFsc2U7CiB9CiAKIENQREZTREtfUGFnZVZpZXc6On5DUERGU0RLX1BhZ2VWaWV3KCkKQEAgLTY5MCw3ICs2OTAsNyBAQAogICAgIG1fY3VyTWF0cml4ID0gKnBVc2VyMkRldmljZTsKIAogICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwotICAgIENQREZTREtfQW5ub3RJdGVyYXRvciBhbm5vdEl0ZXJhdG9yKHRoaXMsIFRSVUUpOworICAgIENQREZTREtfQW5ub3RJdGVyYXRvciBhbm5vdEl0ZXJhdG9yKHRoaXMsIHRydWUpOwogICAgIENQREZTREtfQW5ub3QqIHBTREtBbm5vdCA9IG51bGxwdHI7CiAgICAgaW50IGluZGV4ID0gLTE7CiAgICAgd2hpbGUgKChwU0RLQW5ub3QgPSBhbm5vdEl0ZXJhdG9yLk5leHQoaW5kZXgpKSkgewpAQCAtNzM3LDcgKzczNyw3IEBACiBDUERGU0RLX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRGWEFubm90QXRQb2ludChGWF9GTE9BVCBwYWdlWCwgRlhfRkxPQVQgcGFnZVkpCiB7CiAKLSAgICBDUERGU0RLX0Fubm90SXRlcmF0b3IgYW5ub3RJdGVyYXRvcih0aGlzLCBGQUxTRSk7CisgICAgQ1BERlNES19Bbm5vdEl0ZXJhdG9yIGFubm90SXRlcmF0b3IodGhpcywgZmFsc2UpOwogICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwogICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RNZ3IgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKICAgICBDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QgPSBOVUxMOwpAQCAtNzU1LDcgKzc1NSw3IEBACiBDUERGU0RLX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRGWFdpZGdldEF0UG9pbnQoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKQogewogCi0gICAgQ1BERlNES19Bbm5vdEl0ZXJhdG9yIGFubm90SXRlcmF0b3IodGhpcywgRkFMU0UpOworICAgIENQREZTREtfQW5ub3RJdGVyYXRvciBhbm5vdEl0ZXJhdG9yKHRoaXMsIGZhbHNlKTsKICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90TWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CiAgICAgQ1BERlNES19Bbm5vdCogcFNES0Fubm90ID0gTlVMTDsKQEAgLTc3NSwxMiArNzc1LDEyIEBACiB9CiAKIAotRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpBbm5vdF9IYXNBcHBlYXJhbmNlKENQREZfQW5ub3QqIHBBbm5vdCkKK2Jvb2wgQ1BERlNES19QYWdlVmlldzo6QW5ub3RfSGFzQXBwZWFyYW5jZShDUERGX0Fubm90KiBwQW5ub3QpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWMgPSBwQW5ub3QtPkdldEFubm90RGljdCgpOwogICAgIGlmKHBBbm5vdERpYykKICAgICAgICAgcmV0dXJuICBwQW5ub3REaWMtPktleUV4aXN0KCJBUyIpOwotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIENQREZTREtfQW5ub3QqICBDUERGU0RLX1BhZ2VWaWV3OjpBZGRBbm5vdChDUERGX0Fubm90ICogcFBERkFubm90KQpAQCAtODE5LDkgKzgxOSw5IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLUZYX0JPT0wgIENQREZTREtfUGFnZVZpZXc6OkRlbGV0ZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCkKK2Jvb2wgIENQREZTREtfUGFnZVZpZXc6OkRlbGV0ZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCkKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBDUERGX0RvY3VtZW50KiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRQREZEb2N1bWVudCgpCkBAIC04NjEsNyArODYxLDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfVUlOVCBuRmxhZykKK2Jvb2wgQ1BERlNES19QYWdlVmlldzo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpCiB7CiAgICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7CiAgICAgQVNTRVJUKHBFbnYpOwpAQCAtODc1LDE4ICs4NzUsMTggQEAKICAgICAgICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXJNZ3IgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKICAgICAgICAgQVNTRVJUKHBBbm5vdEhhbmRsZXJNZ3IpOwogCi0gICAgICAgIEZYX0JPT0wgYlJldCA9IHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTEJ1dHRvbkRvd24odGhpcywgcEZYQW5ub3QsIG5GbGFnLHBvaW50KTsKKyAgICAgICAgYm9vbCBiUmV0ID0gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25MQnV0dG9uRG93bih0aGlzLCBwRlhBbm5vdCwgbkZsYWcscG9pbnQpOwogICAgICAgICBpZihiUmV0KQogICAgICAgICB7CiAgICAgICAgICAgICBTZXRGb2N1c0Fubm90KHBGWEFubm90KTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYlJldDsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogCi1GWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfVUlOVCBuRmxhZykKK2Jvb2wgQ1BERlNES19QYWdlVmlldzo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9VSU5UIG5GbGFnKQogewogICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwogICAgIEFTU0VSVChwRW52KTsKQEAgLTg5NCw3ICs4OTQsNyBAQAogICAgIEFTU0VSVChwQW5ub3RIYW5kbGVyTWdyKTsKICAgICBDUERGU0RLX0Fubm90KiBwRlhBbm5vdCA9IEdldEZYV2lkZ2V0QXRQb2ludChwb2ludC54LCBwb2ludC55KTsKICAgICBDUERGU0RLX0Fubm90KiBwRm9jdXNBbm5vdCA9IEdldEZvY3VzQW5ub3QoKTsKLSAgICBGWF9CT09MIGJSZXQgID0gRkFMU0U7CisgICAgYm9vbCBiUmV0ICA9IGZhbHNlOwogICAgIGlmKHBGb2N1c0Fubm90ICYmIHBGb2N1c0Fubm90ICE9IHBGWEFubm90KQogICAgIHsKICAgICAgICAgLy9MYXN0IGZvY3VzIEFubm90IGdldHMgYSBjaGFuY2UgdG8gaGFuZGxlIHRoZSBldmVudC4KQEAgLTkwOCw3ICs5MDgsNyBAQAogICAgIHJldHVybiBiUmV0OwogfQogCi1GWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgaW50IG5GbGFnKQorYm9vbCBDUERGU0RLX1BhZ2VWaWV3OjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIGludCBuRmxhZykKIHsKIAogICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwpAQCAtOTE4LDM2ICs5MTgsMzYgQEAKICAgICB7CiAgICAgICAgIGlmKG1fQ2FwdHVyZVdpZGdldCAmJiBtX0NhcHR1cmVXaWRnZXQgIT0gcEZYQW5ub3QpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fYkV4aXRXaWRnZXQgPSBUUlVFOwotICAgICAgICAgICAgbV9iRW50ZXJXaWRnZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIG1fYkV4aXRXaWRnZXQgPSB0cnVlOworICAgICAgICAgICAgbV9iRW50ZXJXaWRnZXQgPSBmYWxzZTsKICAgICAgICAgICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTW91c2VFeGl0KHRoaXMsIG1fQ2FwdHVyZVdpZGdldCwgbkZsYWcpOwogICAgICAgICB9CiAgICAgICAgIG1fQ2FwdHVyZVdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEZYQW5ub3Q7Ci0gICAgICAgIG1fYk9uV2lkZ2V0ID0gVFJVRTsKKyAgICAgICAgbV9iT25XaWRnZXQgPSB0cnVlOwogICAgICAgICBpZighbV9iRW50ZXJXaWRnZXQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fYkVudGVyV2lkZ2V0ID0gVFJVRTsKLSAgICAgICAgICAgIG1fYkV4aXRXaWRnZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIG1fYkVudGVyV2lkZ2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fYkV4aXRXaWRnZXQgPSBmYWxzZTsKICAgICAgICAgICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTW91c2VFbnRlcih0aGlzLCBwRlhBbm5vdCxuRmxhZyk7CiAgICAgICAgIH0KICAgICAgICAgcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Nb3VzZU1vdmUodGhpcywgcEZYQW5ub3QsIG5GbGFnLCBwb2ludCk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYobV9iT25XaWRnZXQpCiAgICAgewotICAgICAgICBtX2JPbldpZGdldCA9IEZBTFNFOwotICAgICAgICBtX2JFeGl0V2lkZ2V0ID0gVFJVRTsKLSAgICAgICAgbV9iRW50ZXJXaWRnZXQgPSBGQUxTRTsKKyAgICAgICAgbV9iT25XaWRnZXQgPSBmYWxzZTsKKyAgICAgICAgbV9iRXhpdFdpZGdldCA9IHRydWU7CisgICAgICAgIG1fYkVudGVyV2lkZ2V0ID0gZmFsc2U7CiAgICAgICAgIGlmKG1fQ2FwdHVyZVdpZGdldCkKICAgICAgICAgewogICAgICAgICAgICAgcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Nb3VzZUV4aXQodGhpcywgbV9DYXB0dXJlV2lkZ2V0LCBuRmxhZyk7CiAgICAgICAgICAgICBtX0NhcHR1cmVXaWRnZXQgPSBOVUxMOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6T25Nb3VzZVdoZWVsKGRvdWJsZSBkZWx0YVgsIGRvdWJsZSBkZWx0YVksY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIGludCBuRmxhZykKK2Jvb2wgQ1BERlNES19QYWdlVmlldzo6T25Nb3VzZVdoZWVsKGRvdWJsZSBkZWx0YVgsIGRvdWJsZSBkZWx0YVksY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIGludCBuRmxhZykKIHsKICAgICBpZihDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBHZXRGWFdpZGdldEF0UG9pbnQocG9pbnQueCwgcG9pbnQueSkpCiAgICAgewpAQCAtOTU2LDExICs5NTYsMTEgQEAKICAgICAgICAgQVNTRVJUKHBBbm5vdEhhbmRsZXJNZ3IpOwogICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Nb3VzZVdoZWVsKHRoaXMsIHBBbm5vdCwgbkZsYWcsIChpbnQpZGVsdGFZLCBwb2ludCk7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiAKIH0KIAotRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPbkNoYXIoaW50IG5DaGFyLCBGWF9VSU5UIG5GbGFnKQorYm9vbCBDUERGU0RLX1BhZ2VWaWV3OjpPbkNoYXIoaW50IG5DaGFyLCBGWF9VSU5UIG5GbGFnKQogewogICAgIGlmKENQREZTREtfQW5ub3QqIHBBbm5vdCA9IEdldEZvY3VzQW5ub3QoKSkKICAgICB7CkBAIC05NzAsMTAgKzk3MCwxMCBAQAogICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFnKTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uS2V5RG93bihpbnQgbktleUNvZGUsIGludCBuRmxhZykKK2Jvb2wgQ1BERlNES19QYWdlVmlldzo6T25LZXlEb3duKGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQogewogICAgIGlmKENQREZTREtfQW5ub3QqIHBBbm5vdCA9IEdldEZvY3VzQW5ub3QoKSkKICAgICB7CkBAIC05ODIsMTcgKzk4MiwxNyBAQAogICAgICAgICBBU1NFUlQocEFubm90SGFuZGxlck1ncik7CiAgICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9PbktleURvd24ocEFubm90LCBuS2V5Q29kZSwgbkZsYWcpOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uS2V5VXAoaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpCitib29sIENQREZTREtfUGFnZVZpZXc6Ok9uS2V5VXAoaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpCiB7CiAvLyAgaWYoQ1BERlNES19Bbm5vdCogcEFubm90ID0gR2V0Rm9jdXNBbm5vdCgpKQogLy8gIHsKIC8vICAgICAgQ0ZGTF9JRm9ybUZpbGxlciogcElGb3JtRmlsbGVyID0gZ19wRm9ybUZpbGxBcHAtPkdldElGb3JtRmlsbGVyKCk7CiAvLyAgICAgIHJldHVybiBwSUZvcm1GaWxsZXItPk9uS2V5VXAocEFubm90LCBuS2V5Q29kZSwgbkZsYWcpOwogLy8gIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBleHRlcm4gdm9pZCBDaGVja1VuU3VwcG9ydEFubm90KENQREZfRG9jdW1lbnQgKiBwRG9jLCBDUERGX0Fubm90KiBwUERGQW5ub3QpOwpAQCAtMTAwMSwxMyArMTAwMSwxMyBAQAogewogICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwogCi0gICAgRlhfQk9PTCBlbmFibGVBUFVwZGF0ZSA9IENQREZfSW50ZXJGb3JtOjpVcGRhdGluZ0FQRW5hYmxlZCgpOworICAgIGJvb2wgZW5hYmxlQVBVcGRhdGUgPSBDUERGX0ludGVyRm9ybTo6VXBkYXRpbmdBUEVuYWJsZWQoKTsKICAgICAvL0Rpc2FibGUgdGhlIGRlZmF1bHQgQVAgY29uc3RydWN0aW9uLgotICAgIENQREZfSW50ZXJGb3JtOjpFbmFibGVVcGRhdGVBUChGQUxTRSk7CisgICAgQ1BERl9JbnRlckZvcm06OkVuYWJsZVVwZGF0ZUFQKGZhbHNlKTsKICAgICBtX3BBbm5vdExpc3QgPSBuZXcgQ1BERl9Bbm5vdExpc3QobV9wYWdlKTsKICAgICBDUERGX0ludGVyRm9ybTo6RW5hYmxlVXBkYXRlQVAoZW5hYmxlQVBVcGRhdGUpOwogICAgIGludCBuQ291bnQgPSBtX3BBbm5vdExpc3QtPkNvdW50KCk7Ci0gICAgICAgIFNldExvY2soVFJVRSk7CisgICAgICAgIFNldExvY2sodHJ1ZSk7CiAgICAgZm9yKGludCBpPTA7IGk8bkNvdW50OyBpKyspCiAgICAgewogICAgICAgICBDUERGX0Fubm90KiBwUERGQW5ub3QgPSBtX3BBbm5vdExpc3QtPkdldEF0KGkpOwpAQCAtMTAyOSw3ICsxMDI5LDcgQEAKICAgICAgICAgfQogCiAgICAgfQotICAgICAgICBTZXRMb2NrKEZBTFNFKTsKKyAgICAgICAgU2V0TG9jayhmYWxzZSk7CiB9CiAKIHZvaWQgICAgQ1BERlNES19QYWdlVmlldzo6VXBkYXRlUmVjdHMoQ0ZYX1JlY3RBcnJheSYgcmVjdHMpCkBAIC0xMDY0LDE2ICsxMDY0LDE2IEBACiAgICAgcmV0dXJuIC0xOwogfQogCi1GWF9CT09MIENQREZTREtfUGFnZVZpZXc6OklzVmFsaWRBbm5vdCh2b2lkKiBwKQorYm9vbCBDUERGU0RLX1BhZ2VWaWV3OjpJc1ZhbGlkQW5ub3Qodm9pZCogcCkKIHsKLSAgICBpZiAocCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwogICAgIGludCBpQ291bnQgPSBtX3BBbm5vdExpc3QtPkNvdW50KCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykKICAgICB7CiAgICAgICAgIGlmIChtX3BBbm5vdExpc3QtPkdldEF0KGkpID09IHApCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZzZGtfcmVuZGVyY29udGV4dC5jcHAgYi9mcGRmc2RrL3NyYy9mc2RrX3JlbmRlcmNvbnRleHQuY3BwCmluZGV4IGY5NmRiOTQuLjJiYzNlYTggMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZzZGtfcmVuZGVyY29udGV4dC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnNka19yZW5kZXJjb250ZXh0LmNwcApAQCAtMzgsMTAgKzM4LDEwIEBACiAgICAgbV9JUGF1c2UgPSBJUGF1c2U7CiB9CiAKLUZYX0JPT0wgSUZTREtfUEFVU0VfQWRhcHRlcjo6TmVlZFRvUGF1c2VOb3coKQorYm9vbCBJRlNES19QQVVTRV9BZGFwdGVyOjpOZWVkVG9QYXVzZU5vdygpCiB7CiAgICAgaWYgKG1fSVBhdXNlLT5OZWVkVG9QYXVzZU5vdykgewogICAgICAgICByZXR1cm4gbV9JUGF1c2UtPk5lZWRUb1BhdXNlTm93KG1fSVBhdXNlKTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2FwLmNwcCBiL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2FwLmNwcAppbmRleCAzMDlhOThmLi43ZjI4NDNjIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9hcC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfYXAuY3BwCkBAIC02Niw3ICs2Niw3IEBACiB9CiAKIENGWF9CeXRlU3RyaW5nIElGWF9FZGl0OjpHZXRFZGl0QXBwZWFyYW5jZVN0cmVhbShJRlhfRWRpdCogcEVkaXQsIGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCwKLQkJCQkJCQkJCQkJCSBjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZSAvKiA9IE5VTEwqLywgRlhfQk9PTCBiQ29udGludW91cy8qID0gVFJVRSovLCBGWF9XT1JEIFN1YldvcmQvKiA9IDAqLykKKwkJCQkJCQkJCQkJCSBjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZSAvKiA9IE5VTEwqLywgYm9vbCBiQ29udGludW91cy8qID0gdHJ1ZSovLCBGWF9XT1JEIFN1YldvcmQvKiA9IDAqLykKIHsKIAlDRlhfQnl0ZVRleHRCdWYgc0VkaXRTdHJlYW0sIHNXb3JkczsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfZWRpdC5jcHAgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9lZGl0LmNwcAppbmRleCA2MzExNWMyLi5iMWFkNTlkIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9lZGl0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9lZGl0LmNwcApAQCAtMjEsNzAgKzIxLDcwIEBACiB7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6Ok5leHRXb3JkKCkKK2Jvb2wgQ0ZYX0VkaXRfSXRlcmF0b3I6Ok5leHRXb3JkKCkKIHsKICAgICByZXR1cm4gbV9wVlRJdGVyYXRvci0+TmV4dFdvcmQoKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdF9JdGVyYXRvcjo6TmV4dExpbmUoKQorYm9vbCBDRlhfRWRpdF9JdGVyYXRvcjo6TmV4dExpbmUoKQogewogICAgIHJldHVybiBtX3BWVEl0ZXJhdG9yLT5OZXh0TGluZSgpOwogfQogCi1GWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpOZXh0U2VjdGlvbigpCitib29sIENGWF9FZGl0X0l0ZXJhdG9yOjpOZXh0U2VjdGlvbigpCiB7CiAgICAgcmV0dXJuIG1fcFZUSXRlcmF0b3ItPk5leHRTZWN0aW9uKCk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6OlByZXZXb3JkKCkKK2Jvb2wgQ0ZYX0VkaXRfSXRlcmF0b3I6OlByZXZXb3JkKCkKIHsKICAgICByZXR1cm4gbV9wVlRJdGVyYXRvci0+UHJldldvcmQoKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdF9JdGVyYXRvcjo6UHJldkxpbmUoKQorYm9vbCBDRlhfRWRpdF9JdGVyYXRvcjo6UHJldkxpbmUoKQogewogICAgIHJldHVybiBtX3BWVEl0ZXJhdG9yLT5QcmV2TGluZSgpOwogfQogCi1GWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpQcmV2U2VjdGlvbigpCitib29sIENGWF9FZGl0X0l0ZXJhdG9yOjpQcmV2U2VjdGlvbigpCiB7CiAgICAgcmV0dXJuIG1fcFZUSXRlcmF0b3ItPlByZXZTZWN0aW9uKCk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3QKK2Jvb2wgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3QKIHsKICAgICBBU1NFUlQobV9wRWRpdCk7CiAKICAgICBpZiAobV9wVlRJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkKICAgICB7CiAgICAgICAgIHdvcmQucHRXb3JkID0gbV9wRWRpdC0+VlRUb0VkaXQod29yZC5wdFdvcmQpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldExpbmUoQ1BWVF9MaW5lICYgbGluZSkgY29uc3QKK2Jvb2wgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldExpbmUoQ1BWVF9MaW5lICYgbGluZSkgY29uc3QKIHsKICAgICBBU1NFUlQobV9wRWRpdCk7CiAKICAgICBpZiAobV9wVlRJdGVyYXRvci0+R2V0TGluZShsaW5lKSkKICAgICB7CiAgICAgICAgIGxpbmUucHRMaW5lID0gbV9wRWRpdC0+VlRUb0VkaXQobGluZS5wdExpbmUpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QKK2Jvb2wgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QKIHsKICAgICBBU1NFUlQobV9wRWRpdCk7CiAKICAgICBpZiAobV9wVlRJdGVyYXRvci0+R2V0U2VjdGlvbihzZWN0aW9uKSkKICAgICB7CiAgICAgICAgIHNlY3Rpb24ucmNTZWN0aW9uID0gbV9wRWRpdC0+VlRUb0VkaXQoc2VjdGlvbi5yY1NlY3Rpb24pOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ0ZYX0VkaXRfSXRlcmF0b3I6OlNldEF0KGludDMyX3QgbldvcmRJbmRleCkKQEAgLTE2Nyw3ICsxNjcsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1GWF9CT09MIENGWF9FZGl0X1Byb3ZpZGVyOjpJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpCitib29sIENGWF9FZGl0X1Byb3ZpZGVyOjpJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpCiB7CiAgICAgcmV0dXJuIEZYX0VESVRfSVNMQVRJTldPUkQod29yZCk7CiB9CkBAIC0yMTAsNyArMjEwLDcgQEAKIAogdm9pZCBDRlhfRWRpdF9SZWZyZXNoOjpBbmFseXNlKGludDMyX3QgbkFsaWdubWVudCkKIHsKLSAgICBGWF9CT09MIGJMaW5lVG9wQ2hhbmdlZCA9IEZBTFNFOworICAgIGJvb2wgYkxpbmVUb3BDaGFuZ2VkID0gZmFsc2U7CiAgICAgQ1BERl9SZWN0IHJjUmVzdWx0OwogICAgIEZYX0ZMT0FUIGZXaWR0aERpZmY7CiAKQEAgLTIzOCw3ICsyMzgsNyBAQAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBOZXdSZWN0LT5Jc1NhbWVUb3AoKnBPbGRSZWN0KSB8fCAhcE5ld1JlY3QtPklzU2FtZUhlaWdodCgqcE9sZFJlY3QpKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMaW5lVG9wQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxpbmVUb3BDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMzI0LDkgKzMyNCw5IEBACiAKIENGWF9FZGl0X1VuZG86OkNGWF9FZGl0X1VuZG8oaW50MzJfdCBuQnVmc2l6ZSkgOiBtX25DdXJVbmRvUG9zKDApLAogICAgIG1fbkJ1ZlNpemUobkJ1ZnNpemUpLAotICAgIG1fYk1vZGlmaWVkKEZBTFNFKSwKLSAgICBtX2JWaXJnaW4oVFJVRSksCi0gICAgbV9iV29ya2luZyhGQUxTRSkKKyAgICBtX2JNb2RpZmllZChmYWxzZSksCisgICAgbV9iVmlyZ2luKHRydWUpLAorICAgIG1fYldvcmtpbmcoZmFsc2UpCiB7CiB9CiAKQEAgLTMzNSwxNCArMzM1LDE0IEBACiAgICAgUmVzZXQoKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdF9VbmRvOjpDYW5VbmRvKCkgY29uc3QKK2Jvb2wgQ0ZYX0VkaXRfVW5kbzo6Q2FuVW5kbygpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fbkN1clVuZG9Qb3MgPiAwOwogfQogCiB2b2lkIENGWF9FZGl0X1VuZG86OlVuZG8oKQogewotICAgIG1fYldvcmtpbmcgPSBUUlVFOworICAgIG1fYldvcmtpbmcgPSB0cnVlOwogCiAgICAgaWYgKG1fbkN1clVuZG9Qb3MgPiAwKQogICAgIHsKQEAgLTM1NSwxNyArMzU1LDE3IEBACiAgICAgICAgIG1fYk1vZGlmaWVkID0gKG1fbkN1clVuZG9Qb3MgIT0gMCk7CiAgICAgfQogCi0gICAgbV9iV29ya2luZyA9IEZBTFNFOworICAgIG1fYldvcmtpbmcgPSBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdF9VbmRvOjpDYW5SZWRvKCkgY29uc3QKK2Jvb2wgQ0ZYX0VkaXRfVW5kbzo6Q2FuUmVkbygpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fbkN1clVuZG9Qb3MgPCBtX1VuZG9JdGVtU3RhY2suR2V0U2l6ZSgpOwogfQogCiB2b2lkIENGWF9FZGl0X1VuZG86OlJlZG8oKQogewotICAgIG1fYldvcmtpbmcgPSBUUlVFOworICAgIG1fYldvcmtpbmcgPSB0cnVlOwogCiAgICAgaW50MzJfdCBuU3RhY2tTaXplID0gbV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKTsKIApAQCAtMzgwLDEwICszODAsMTAgQEAKICAgICAgICAgbV9iTW9kaWZpZWQgPSAobV9uQ3VyVW5kb1BvcyAhPSAwKTsKICAgICB9CiAKLSAgICBtX2JXb3JraW5nID0gRkFMU0U7CisgICAgbV9iV29ya2luZyA9IGZhbHNlOwogfQogCi1GWF9CT09MIENGWF9FZGl0X1VuZG86OklzV29ya2luZygpIGNvbnN0Citib29sIENGWF9FZGl0X1VuZG86OklzV29ya2luZygpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fYldvcmtpbmc7CiB9CkBAIC00MDAsNyArNDAwLDcgQEAKICAgICBpZiAobV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKSA+PSBtX25CdWZTaXplKQogICAgIHsKICAgICAgICAgUmVtb3ZlSGVhZHMoKTsKLSAgICAgICAgbV9iVmlyZ2luID0gRkFMU0U7CisgICAgICAgIG1fYlZpcmdpbiA9IGZhbHNlOwogICAgIH0KIAogICAgIG1fVW5kb0l0ZW1TdGFjay5BZGQocEl0ZW0pOwpAQCAtNDA5LDkgKzQwOSw5IEBACiAgICAgbV9iTW9kaWZpZWQgPSAobV9uQ3VyVW5kb1BvcyAhPSAwKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdF9VbmRvOjpJc01vZGlmaWVkKCkgY29uc3QKK2Jvb2wgQ0ZYX0VkaXRfVW5kbzo6SXNNb2RpZmllZCgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1fYlZpcmdpbiA/IG1fYk1vZGlmaWVkIDogVFJVRTsKKyAgICByZXR1cm4gbV9iVmlyZ2luID8gbV9iTW9kaWZpZWQgOiB0cnVlOwogfQogCiBJRlhfRWRpdF9VbmRvSXRlbSogQ0ZYX0VkaXRfVW5kbzo6R2V0SXRlbShpbnQzMl90IG5JbmRleCkKQEAgLTQ2OSw4ICs0NjksOCBAQAogewogICAgIEFTU0VSVChwVW5kb0l0ZW0gIT0gTlVMTCk7CiAKLSAgICBwVW5kb0l0ZW0tPlNldEZpcnN0KEZBTFNFKTsKLSAgICBwVW5kb0l0ZW0tPlNldExhc3QoRkFMU0UpOworICAgIHBVbmRvSXRlbS0+U2V0Rmlyc3QoZmFsc2UpOworICAgIHBVbmRvSXRlbS0+U2V0TGFzdChmYWxzZSk7CiAKICAgICBtX0l0ZW1zLkFkZChwVW5kb0l0ZW0pOwogCkBAIC00ODQsMTEgKzQ4NCwxMSBAQAogICAgIHsKICAgICAgICAgQ0ZYX0VkaXRfVW5kb0l0ZW0qIHBGaXJzdEl0ZW0gPSBtX0l0ZW1zWzBdOwogICAgICAgICBBU1NFUlQocEZpcnN0SXRlbSAhPSBOVUxMKTsKLSAgICAgICAgcEZpcnN0SXRlbS0+U2V0Rmlyc3QoVFJVRSk7CisgICAgICAgIHBGaXJzdEl0ZW0tPlNldEZpcnN0KHRydWUpOwogCiAgICAgICAgIENGWF9FZGl0X1VuZG9JdGVtKiBwTGFzdEl0ZW0gPSBtX0l0ZW1zW21fSXRlbXMuR2V0U2l6ZSgpIC0gMV07CiAgICAgICAgIEFTU0VSVChwTGFzdEl0ZW0gIT0gTlVMTCk7Ci0gICAgICAgIHBMYXN0SXRlbS0+U2V0TGFzdChUUlVFKTsKKyAgICAgICAgcExhc3RJdGVtLT5TZXRMYXN0KHRydWUpOwogICAgIH0KIH0KIApAQCAtNTM5LDcgKzUzOSw3IEBACiAgICAgewogICAgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CiAgICAgICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BPbGQpOwotICAgICAgICBtX3BFZGl0LT5JbnNlcnRXb3JkKG1fV29yZCxtX25DaGFyc2V0LCZtX1dvcmRQcm9wcyxGQUxTRSxUUlVFKTsKKyAgICAgICAgbV9wRWRpdC0+SW5zZXJ0V29yZChtX1dvcmQsbV9uQ2hhcnNldCwmbV9Xb3JkUHJvcHMsZmFsc2UsdHJ1ZSk7CiAgICAgfQogfQogCkBAIC01NDksNyArNTQ5LDcgQEAKICAgICB7CiAgICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKICAgICAgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE5ldyk7Ci0gICAgICAgIG1fcEVkaXQtPkJhY2tzcGFjZShGQUxTRSxUUlVFKTsKKyAgICAgICAgbV9wRWRpdC0+QmFja3NwYWNlKGZhbHNlLHRydWUpOwogICAgIH0KIH0KIApAQCAtNTc5LDcgKzU3OSw3IEBACiAgICAgewogICAgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CiAgICAgICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BPbGQpOwotICAgICAgICBtX3BFZGl0LT5JbnNlcnRSZXR1cm4oJm1fU2VjUHJvcHMsJm1fV29yZFByb3BzLEZBTFNFLFRSVUUpOworICAgICAgICBtX3BFZGl0LT5JbnNlcnRSZXR1cm4oJm1fU2VjUHJvcHMsJm1fV29yZFByb3BzLGZhbHNlLHRydWUpOwogICAgIH0KIH0KIApAQCAtNTg5LDcgKzU4OSw3IEBACiAgICAgewogICAgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CiAgICAgICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BOZXcpOwotICAgICAgICBtX3BFZGl0LT5CYWNrc3BhY2UoRkFMU0UsVFJVRSk7CisgICAgICAgIG1fcEVkaXQtPkJhY2tzcGFjZShmYWxzZSx0cnVlKTsKICAgICB9CiB9CiAKQEAgLTYxOSw3ICs2MTksNyBAQAogICAgIHsKICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwogICAgICAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwT2xkKTsKLSAgICAgICAgbV9wRWRpdC0+QmFja3NwYWNlKEZBTFNFLFRSVUUpOworICAgICAgICBtX3BFZGl0LT5CYWNrc3BhY2UoZmFsc2UsdHJ1ZSk7CiAgICAgfQogfQogCkBAIC02MzEsMTEgKzYzMSwxMSBAQAogICAgICAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwTmV3KTsKICAgICAgICAgaWYgKG1fd3BOZXcuU2VjQ21wKG1fd3BPbGQpICE9IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fcEVkaXQtPkluc2VydFJldHVybigmbV9TZWNQcm9wcywmbV9Xb3JkUHJvcHMsRkFMU0UsVFJVRSk7CisgICAgICAgICAgICBtX3BFZGl0LT5JbnNlcnRSZXR1cm4oJm1fU2VjUHJvcHMsJm1fV29yZFByb3BzLGZhbHNlLHRydWUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgbV9wRWRpdC0+SW5zZXJ0V29yZChtX1dvcmQsbV9uQ2hhcnNldCwmbV9Xb3JkUHJvcHMsRkFMU0UsVFJVRSk7CisgICAgICAgICAgICBtX3BFZGl0LT5JbnNlcnRXb3JkKG1fV29yZCxtX25DaGFyc2V0LCZtX1dvcmRQcm9wcyxmYWxzZSx0cnVlKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTY0NSw3ICs2NDUsNyBAQAogCiBDRlhFVV9EZWxldGU6OkNGWEVVX0RlbGV0ZShDRlhfRWRpdCAqIHBFZGl0LCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwT2xkUGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BOZXdQbGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICYgU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgV29yZFByb3BzLCBGWF9CT09MIGJTZWNFbmQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICYgU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgV29yZFByb3BzLCBib29sIGJTZWNFbmQpIDoKICAgICAgICAgICAgIG1fcEVkaXQocEVkaXQpLAogICAgICAgICAgICAgbV93cE9sZCh3cE9sZFBsYWNlKSwKICAgICAgICAgICAgIG1fd3BOZXcod3BOZXdQbGFjZSksCkBAIC02NjcsNyArNjY3LDcgQEAKICAgICB7CiAgICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKICAgICAgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE9sZCk7Ci0gICAgICAgIG1fcEVkaXQtPkRlbGV0ZShGQUxTRSxUUlVFKTsKKyAgICAgICAgbV9wRWRpdC0+RGVsZXRlKGZhbHNlLHRydWUpOwogICAgIH0KIH0KIApAQCAtNjc5LDExICs2NzksMTEgQEAKICAgICAgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE5ldyk7CiAgICAgICAgIGlmIChtX2JTZWNFbmQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fcEVkaXQtPkluc2VydFJldHVybigmbV9TZWNQcm9wcywmbV9Xb3JkUHJvcHMsRkFMU0UsVFJVRSk7CisgICAgICAgICAgICBtX3BFZGl0LT5JbnNlcnRSZXR1cm4oJm1fU2VjUHJvcHMsJm1fV29yZFByb3BzLGZhbHNlLHRydWUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgbV9wRWRpdC0+SW5zZXJ0V29yZChtX1dvcmQsbV9uQ2hhcnNldCwmbV9Xb3JkUHJvcHMsRkFMU0UsVFJVRSk7CisgICAgICAgICAgICBtX3BFZGl0LT5JbnNlcnRXb3JkKG1fV29yZCxtX25DaGFyc2V0LCZtX1dvcmRQcm9wcyxmYWxzZSx0cnVlKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTcwOCw3ICs3MDgsNyBAQAogICAgIHsKICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwogICAgICAgICBtX3BFZGl0LT5TZXRTZWwobV93clNlbC5CZWdpblBvcyxtX3dyU2VsLkVuZFBvcyk7Ci0gICAgICAgIG1fcEVkaXQtPkNsZWFyKEZBTFNFLFRSVUUpOworICAgICAgICBtX3BFZGl0LT5DbGVhcihmYWxzZSx0cnVlKTsKICAgICB9CiB9CiAKQEAgLTcxOCw3ICs3MTgsNyBAQAogICAgIHsKICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwogICAgICAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dyU2VsLkJlZ2luUG9zKTsKLSAgICAgICAgbV9wRWRpdC0+SW5zZXJ0VGV4dChtX3N3VGV4dC5jX3N0cigpLCBERUZBVUxUX0NIQVJTRVQsIE5VTEwsIE5VTEwsIEZBTFNFLCBUUlVFKTsKKyAgICAgICAgbV9wRWRpdC0+SW5zZXJ0VGV4dChtX3N3VGV4dC5jX3N0cigpLCBERUZBVUxUX0NIQVJTRVQsIE5VTEwsIE5VTEwsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgbV9wRWRpdC0+U2V0U2VsKG1fd3JTZWwuQmVnaW5Qb3MsbV93clNlbC5FbmRQb3MpOwogICAgIH0KIH0KQEAgLTc1MCw3ICs3NTAsNyBAQAogICAgIHsKICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwogICAgICAgICBtX3BFZGl0LT5TZXRTZWwobV93clNlbC5CZWdpblBvcyxtX3dyU2VsLkVuZFBvcyk7Ci0gICAgICAgIG1fcEVkaXQtPkNsZWFyKEZBTFNFLFRSVUUpOworICAgICAgICBtX3BFZGl0LT5DbGVhcihmYWxzZSx0cnVlKTsKICAgICB9CiB9CiAKQEAgLTc2MiwxMSArNzYyLDExIEBACiAgICAgICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BPbGQpOwogICAgICAgICBpZiAobV93cE5ldy5TZWNDbXAobV93cE9sZCkgIT0gMCkKICAgICAgICAgewotICAgICAgICAgICAgbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKCZtX1NlY1Byb3BzLCZtX1dvcmRQcm9wcyxGQUxTRSxGQUxTRSk7CisgICAgICAgICAgICBtX3BFZGl0LT5JbnNlcnRSZXR1cm4oJm1fU2VjUHJvcHMsJm1fV29yZFByb3BzLGZhbHNlLGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fcEVkaXQtPkluc2VydFdvcmQobV9Xb3JkLG1fbkNoYXJzZXQsJm1fV29yZFByb3BzLEZBTFNFLEZBTFNFKTsKKyAgICAgICAgICAgIG1fcEVkaXQtPkluc2VydFdvcmQobV9Xb3JkLG1fbkNoYXJzZXQsJm1fV29yZFByb3BzLGZhbHNlLGZhbHNlKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChJc0ZpcnN0KCkpCkBAIC04MDYsNyArODA2LDcgQEAKICAgICB7CiAgICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKICAgICAgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE9sZCk7Ci0gICAgICAgIG1fcEVkaXQtPkluc2VydFRleHQobV9zd1RleHQuY19zdHIoKSwgbV9uQ2hhcnNldCwgJm1fU2VjUHJvcHMsICZtX1dvcmRQcm9wcywgRkFMU0UsIFRSVUUpOworICAgICAgICBtX3BFZGl0LT5JbnNlcnRUZXh0KG1fc3dUZXh0LmNfc3RyKCksIG1fbkNoYXJzZXQsICZtX1NlY1Byb3BzLCAmbV9Xb3JkUHJvcHMsIGZhbHNlLCB0cnVlKTsKICAgICB9CiB9CiAKQEAgLTgxNiw3ICs4MTYsNyBAQAogICAgIHsKICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwogICAgICAgICBtX3BFZGl0LT5TZXRTZWwobV93cE9sZCxtX3dwTmV3KTsKLSAgICAgICAgbV9wRWRpdC0+Q2xlYXIoRkFMU0UsVFJVRSk7CisgICAgICAgIG1fcEVkaXQtPkNsZWFyKGZhbHNlLHRydWUpOwogICAgIH0KIH0KIApAQCAtODQ0LDcgKzg0NCw3IEBACiB7CiAgICAgaWYgKG1fcEVkaXQpCiAgICAgewotICAgICAgICBtX3BFZGl0LT5TZXRTZWNQcm9wcyhtX2VQcm9wcyxtX3dwUGxhY2UsJm1fTmV3U2VjUHJvcHMsJm1fTmV3V29yZFByb3BzLG1fd3JQbGFjZSxGQUxTRSk7CisgICAgICAgIG1fcEVkaXQtPlNldFNlY1Byb3BzKG1fZVByb3BzLG1fd3BQbGFjZSwmbV9OZXdTZWNQcm9wcywmbV9OZXdXb3JkUHJvcHMsbV93clBsYWNlLGZhbHNlKTsKICAgICAgICAgaWYgKElzTGFzdCgpKQogICAgICAgICB7CiAgICAgICAgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CkBAIC04NTgsNyArODU4LDcgQEAKIHsKICAgICBpZiAobV9wRWRpdCkKICAgICB7Ci0gICAgICAgIG1fcEVkaXQtPlNldFNlY1Byb3BzKG1fZVByb3BzLG1fd3BQbGFjZSwmbV9PbGRTZWNQcm9wcywmbV9PbGRXb3JkUHJvcHMsbV93clBsYWNlLEZBTFNFKTsKKyAgICAgICAgbV9wRWRpdC0+U2V0U2VjUHJvcHMobV9lUHJvcHMsbV93cFBsYWNlLCZtX09sZFNlY1Byb3BzLCZtX09sZFdvcmRQcm9wcyxtX3dyUGxhY2UsZmFsc2UpOwogICAgICAgICBpZiAoSXNGaXJzdCgpKQogICAgICAgICB7CiAgICAgICAgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CkBAIC04ODksNyArODg5LDcgQEAKIHsKICAgICBpZiAobV9wRWRpdCkKICAgICB7Ci0gICAgICAgIG1fcEVkaXQtPlNldFdvcmRQcm9wcyhtX2VQcm9wcyxtX3dwUGxhY2UsJm1fTmV3V29yZFByb3BzLG1fd3JQbGFjZSxGQUxTRSk7CisgICAgICAgIG1fcEVkaXQtPlNldFdvcmRQcm9wcyhtX2VQcm9wcyxtX3dwUGxhY2UsJm1fTmV3V29yZFByb3BzLG1fd3JQbGFjZSxmYWxzZSk7CiAgICAgICAgIGlmIChJc0xhc3QoKSkKICAgICAgICAgewogICAgICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwpAQCAtOTAzLDcgKzkwMyw3IEBACiB7CiAgICAgaWYgKG1fcEVkaXQpCiAgICAgewotICAgICAgICBtX3BFZGl0LT5TZXRXb3JkUHJvcHMobV9lUHJvcHMsbV93cFBsYWNlLCZtX09sZFdvcmRQcm9wcyxtX3dyUGxhY2UsRkFMU0UpOworICAgICAgICBtX3BFZGl0LT5TZXRXb3JkUHJvcHMobV9lUHJvcHMsbV93cFBsYWNlLCZtX09sZFdvcmRQcm9wcyxtX3dyUGxhY2UsZmFsc2UpOwogICAgICAgICBpZiAoSXNGaXJzdCgpKQogICAgICAgICB7CiAgICAgICAgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CkBAIC05MjUsMTggKzkyNSwxOCBAQAogICAgIG1fU2VsU3RhdGUoKSwKICAgICBtX3B0U2Nyb2xsUG9zKDAsMCksCiAgICAgbV9wdFJlZnJlc2hTY3JvbGxQb3MoMCwwKSwKLSAgICBtX2JFbmFibGVTY3JvbGwoRkFMU0UpLAorICAgIG1fYkVuYWJsZVNjcm9sbChmYWxzZSksCiAgICAgbV9wSXRlcmF0b3IoTlVMTCksCiAgICAgbV9wdENhcmV0KDAuMGYsMC4wZiksCiAgICAgbV9VbmRvKEZYX0VESVRfVU5ET19NQVhJVEVNKSwKICAgICBtX25BbGlnbm1lbnQoMCksCi0gICAgbV9iTm90aWZ5RmxhZyhGQUxTRSksCi0gICAgbV9iRW5hYmxlT3ZlcmZsb3coRkFMU0UpLAotICAgIG1fYkVuYWJsZVJlZnJlc2goVFJVRSksCisgICAgbV9iTm90aWZ5RmxhZyhmYWxzZSksCisgICAgbV9iRW5hYmxlT3ZlcmZsb3coZmFsc2UpLAorICAgIG1fYkVuYWJsZVJlZnJlc2godHJ1ZSksCiAgICAgbV9yY09sZENvbnRlbnQoMC4wZiwwLjBmLDAuMGYsMC4wZiksCi0gICAgbV9iRW5hYmxlVW5kbyhUUlVFKSwKLSAgICBtX2JOb3RpZnkoVFJVRSksCi0gICAgbV9iT3ByTm90aWZ5KEZBTFNFKSwKKyAgICBtX2JFbmFibGVVbmRvKHRydWUpLAorICAgIG1fYk5vdGlmeSh0cnVlKSwKKyAgICBtX2JPcHJOb3RpZnkoZmFsc2UpLAogICAgIG1fcEdyb3VwVW5kb0l0ZW0oTlVMTCkKIHsKICAgICBBU1NFUlQocFZUICE9IE5VTEwpOwpAQCAtMTAwMiw5MiArMTAwMiw5MiBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCwgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKK3ZvaWQgQ0ZYX0VkaXQ6OlNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0LCBib29sIGJQYWludC8qID0gdHJ1ZSovKQogewogICAgIG1fcFZULT5TZXRQbGF0ZVJlY3QocmVjdCk7CiAgICAgbV9wdFNjcm9sbFBvcyA9IENQREZfUG9pbnQocmVjdC5sZWZ0LHJlY3QudG9wKTsKICAgICBpZiAoYlBhaW50KSBQYWludCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRBbGlnbm1lbnRIKGludDMyX3QgbkZvcm1hdC8qID0wICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQordm9pZCBDRlhfRWRpdDo6U2V0QWxpZ25tZW50SChpbnQzMl90IG5Gb3JtYXQvKiA9MCAqLywgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKIHsKICAgICBtX3BWVC0+U2V0QWxpZ25tZW50KG5Gb3JtYXQpOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldEFsaWdubWVudFYoaW50MzJfdCBuRm9ybWF0LyogPTAgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCit2b2lkIENGWF9FZGl0OjpTZXRBbGlnbm1lbnRWKGludDMyX3QgbkZvcm1hdC8qID0wICovLCBib29sIGJQYWludC8qID0gdHJ1ZSovKQogewogICAgIG1fbkFsaWdubWVudCA9IG5Gb3JtYXQ7CiAgICAgaWYgKGJQYWludCkgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0UGFzc3dvcmRDaGFyKEZYX1dPUkQgd1N1YldvcmQvKiA9JyonICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQordm9pZCBDRlhfRWRpdDo6U2V0UGFzc3dvcmRDaGFyKEZYX1dPUkQgd1N1YldvcmQvKiA9JyonICovLCBib29sIGJQYWludC8qID0gdHJ1ZSovKQogewogICAgIG1fcFZULT5TZXRQYXNzd29yZENoYXIod1N1YldvcmQpOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIvKiA9MCAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKK3ZvaWQgQ0ZYX0VkaXQ6OlNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIvKiA9MCAqLywgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKIHsKICAgICBtX3BWVC0+U2V0TGltaXRDaGFyKG5MaW1pdENoYXIpOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkvKiA9MCAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKK3ZvaWQgQ0ZYX0VkaXQ6OlNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkvKiA9MCAqLywgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKIHsKICAgICBtX3BWVC0+U2V0Q2hhckFycmF5KG5DaGFyQXJyYXkpOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlLyogPTAuMGYgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCit2b2lkIENGWF9FZGl0OjpTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZS8qID0wLjBmICovLCBib29sIGJQYWludC8qID0gdHJ1ZSovKQogewogICAgIG1fcFZULT5TZXRDaGFyU3BhY2UoZkNoYXJTcGFjZSk7CiAgICAgaWYgKGJQYWludCkgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZS8qID0xMDAgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCit2b2lkIENGWF9FZGl0OjpTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlLyogPTEwMCAqLywgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKIHsKICAgICBtX3BWVC0+U2V0SG9yelNjYWxlKG5Ib3J6U2NhbGUpOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldE11bHRpTGluZShGWF9CT09MIGJNdWx0aUxpbmUvKiA9VFJVRSAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKK3ZvaWQgQ0ZYX0VkaXQ6OlNldE11bHRpTGluZShib29sIGJNdWx0aUxpbmUvKiA9dHJ1ZSAqLywgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKIHsKICAgICBtX3BWVC0+U2V0TXVsdGlMaW5lKGJNdWx0aUxpbmUpOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldEF1dG9SZXR1cm4oRlhfQk9PTCBiQXV0by8qID1UUlVFICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQordm9pZCBDRlhfRWRpdDo6U2V0QXV0b1JldHVybihib29sIGJBdXRvLyogPXRydWUgKi8sIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCiB7CiAgICAgbV9wVlQtPlNldEF1dG9SZXR1cm4oYkF1dG8pOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZy8qID1UUlVFICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQordm9pZCBDRlhfRWRpdDo6U2V0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nLyogPXRydWUgKi8sIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCiB7CiAgICAgbV9wVlQtPlNldExpbmVMZWFkaW5nKGZMaW5lTGVhZGluZyk7CiAgICAgaWYgKGJQYWludCkgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0QXV0b0ZvbnRTaXplKEZYX0JPT0wgYkF1dG8vKiA9VFJVRSAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKK3ZvaWQgQ0ZYX0VkaXQ6OlNldEF1dG9Gb250U2l6ZShib29sIGJBdXRvLyogPXRydWUgKi8sIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCiB7CiAgICAgbV9wVlQtPlNldEF1dG9Gb250U2l6ZShiQXV0byk7CiAgICAgaWYgKGJQYWludCkgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQordm9pZCBDRlhfRWRpdDo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplLCBib29sIGJQYWludC8qID0gdHJ1ZSovKQogewogICAgIG1fcFZULT5TZXRGb250U2l6ZShmRm9udFNpemUpOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldEF1dG9TY3JvbGwoRlhfQk9PTCBiQXV0by8qID1UUlVFICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQordm9pZCBDRlhfRWRpdDo6U2V0QXV0b1Njcm9sbChib29sIGJBdXRvLyogPXRydWUgKi8sIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCiB7CiAgICAgbV9iRW5hYmxlU2Nyb2xsID0gYkF1dG87CiAgICAgaWYgKGJQYWludCkgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0VGV4dE92ZXJmbG93KEZYX0JPT0wgYkFsbG93ZWQgLyo9IEZBTFNFKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCit2b2lkIENGWF9FZGl0OjpTZXRUZXh0T3ZlcmZsb3coYm9vbCBiQWxsb3dlZCAvKj0gZmFsc2UqLywgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKIHsKICAgICBtX2JFbmFibGVPdmVyZmxvdyA9IGJBbGxvd2VkOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CkBAIC0xMTkzLDcgKzExOTMsNyBAQAogICAgIHsKICAgICAgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYlJpY2ggPSBtX3BWVC0+SXNSaWNoVGV4dCgpOworICAgICAgICAgICAgYm9vbCBiUmljaCA9IG1fcFZULT5Jc1JpY2hUZXh0KCk7CiAKICAgICAgICAgICAgIHBJdGVyYXRvci0+U2V0QXQoMCk7CiAKQEAgLTEyMzUsNyArMTIzNSw3IEBACiAKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKICAgICB7Ci0gICAgICAgIEZYX0JPT0wgYlJpY2ggPSBtX3BWVC0+SXNSaWNoVGV4dCgpOworICAgICAgICBib29sIGJSaWNoID0gbV9wVlQtPklzUmljaFRleHQoKTsKIAogICAgICAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkKICAgICAgICAgewpAQCAtMTMzMSw0NiArMTMzMSw0NiBAQAogICAgIHJldHVybiB3clJldDsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6SXNSaWNoVGV4dCgpIGNvbnN0Citib29sIENGWF9FZGl0OjpJc1JpY2hUZXh0KCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9wVlQtPklzUmljaFRleHQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0UmljaFRleHQoRlhfQk9PTCBiUmljaFRleHQvKiA9VFJVRSAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKK3ZvaWQgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0KGJvb2wgYlJpY2hUZXh0LyogPXRydWUgKi8sIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCiB7CiAgICAgbV9wVlQtPlNldFJpY2hUZXh0KGJSaWNoVGV4dCk7CiAgICAgaWYgKGJQYWludCkgUGFpbnQoKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaEZvbnRJbmRleChpbnQzMl90IG5Gb250SW5kZXgpCitib29sIENGWF9FZGl0OjpTZXRSaWNoRm9udEluZGV4KGludDMyX3QgbkZvbnRJbmRleCkKIHsKICAgICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CiAgICAgV29yZFByb3BzLm5Gb250SW5kZXggPSBuRm9udEluZGV4OwogICAgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0ZPTlRJTkRFWCxOVUxMLCZXb3JkUHJvcHMpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoRm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKQorYm9vbCBDRlhfRWRpdDo6U2V0UmljaEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkKIHsKICAgICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CiAgICAgV29yZFByb3BzLmZGb250U2l6ZSA9IGZGb250U2l6ZTsKICAgICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9GT05UU0laRSxOVUxMLCZXb3JkUHJvcHMpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dENvbG9yKEZYX0NPTE9SUkVGIGR3Q29sb3IpCitib29sIENGWF9FZGl0OjpTZXRSaWNoVGV4dENvbG9yKEZYX0NPTE9SUkVGIGR3Q29sb3IpCiB7CiAgICAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOwogICAgIFdvcmRQcm9wcy5kd1dvcmRDb2xvciA9IGR3Q29sb3I7CiAgICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfV09SRENPTE9SLE5VTEwsJldvcmRQcm9wcyk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0U2NyaXB0KGludDMyX3QgblNjcmlwdFR5cGUpCitib29sIENGWF9FZGl0OjpTZXRSaWNoVGV4dFNjcmlwdChpbnQzMl90IG5TY3JpcHRUeXBlKQogewogICAgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKICAgICBXb3JkUHJvcHMublNjcmlwdFR5cGUgPSBuU2NyaXB0VHlwZTsKICAgICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9TQ1JJUFRUWVBFLE5VTEwsJldvcmRQcm9wcyk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0Qm9sZChGWF9CT09MIGJCb2xkKQorYm9vbCBDRlhfRWRpdDo6U2V0UmljaFRleHRCb2xkKGJvb2wgYkJvbGQpCiB7CiAgICAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOwogICAgIGlmIChiQm9sZCkKQEAgLTEzNzgsNyArMTM3OCw3IEBACiAgICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfQk9MRCxOVUxMLCZXb3JkUHJvcHMpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dEl0YWxpYyhGWF9CT09MIGJJdGFsaWMpCitib29sIENGWF9FZGl0OjpTZXRSaWNoVGV4dEl0YWxpYyhib29sIGJJdGFsaWMpCiB7CiAgICAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOwogICAgIGlmIChiSXRhbGljKQpAQCAtMTM4Niw3ICsxMzg2LDcgQEAKICAgICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9JVEFMSUMsTlVMTCwmV29yZFByb3BzKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRVbmRlcmxpbmUoRlhfQk9PTCBiVW5kZXJsaW5lKQorYm9vbCBDRlhfRWRpdDo6U2V0UmljaFRleHRVbmRlcmxpbmUoYm9vbCBiVW5kZXJsaW5lKQogewogICAgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKICAgICBpZiAoYlVuZGVybGluZSkKQEAgLTEzOTQsNyArMTM5NCw3IEBACiAgICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfVU5ERVJMSU5FLE5VTEwsJldvcmRQcm9wcyk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0Q3Jvc3NvdXQoRlhfQk9PTCBiQ3Jvc3NvdXQpCitib29sIENGWF9FZGl0OjpTZXRSaWNoVGV4dENyb3Nzb3V0KGJvb2wgYkNyb3Nzb3V0KQogewogICAgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKICAgICBpZiAoYkNyb3Nzb3V0KQpAQCAtMTQwMiw0NSArMTQwMiw0NSBAQAogICAgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0NST1NTT1VULE5VTEwsJldvcmRQcm9wcyk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpCitib29sIENGWF9FZGl0OjpTZXRSaWNoVGV4dENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKQogewogICAgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKICAgICBXb3JkUHJvcHMuZkNoYXJTcGFjZSA9IGZDaGFyU3BhY2U7CiAgICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfQ0hBUlNQQUNFLE5VTEwsJldvcmRQcm9wcyk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSAvKj0gMTAwKi8pCitib29sIENGWF9FZGl0OjpTZXRSaWNoVGV4dEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgLyo9IDEwMCovKQogewogICAgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKICAgICBXb3JkUHJvcHMubkhvcnpTY2FsZSA9IG5Ib3J6U2NhbGU7CiAgICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfSE9SWlNDQUxFLE5VTEwsJldvcmRQcm9wcyk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nKQorYm9vbCBDRlhfRWRpdDo6U2V0UmljaFRleHRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcpCiB7CiAgICAgQ1BWVF9TZWNQcm9wcyBTZWNQcm9wczsKICAgICBTZWNQcm9wcy5mTGluZUxlYWRpbmcgPSBmTGluZUxlYWRpbmc7CiAgICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfTElORUxFQURJTkcsJlNlY1Byb3BzLE5VTEwpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dExpbmVJbmRlbnQoRlhfRkxPQVQgZkxpbmVJbmRlbnQpCitib29sIENGWF9FZGl0OjpTZXRSaWNoVGV4dExpbmVJbmRlbnQoRlhfRkxPQVQgZkxpbmVJbmRlbnQpCiB7CiAgICAgQ1BWVF9TZWNQcm9wcyBTZWNQcm9wczsKICAgICBTZWNQcm9wcy5mTGluZUluZGVudCA9IGZMaW5lSW5kZW50OwogICAgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0xJTkVJTkRFTlQsJlNlY1Byb3BzLE5VTEwpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dEFsaWdubWVudChpbnQzMl90IG5BbGlnbm1lbnQpCitib29sIENGWF9FZGl0OjpTZXRSaWNoVGV4dEFsaWdubWVudChpbnQzMl90IG5BbGlnbm1lbnQpCiB7CiAgICAgQ1BWVF9TZWNQcm9wcyBTZWNQcm9wczsKICAgICBTZWNQcm9wcy5uQWxpZ25tZW50ID0gbkFsaWdubWVudDsKICAgICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9BTElHTk1FTlQsJlNlY1Byb3BzLE5VTEwpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcykKK2Jvb2wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0UHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzKQogewotICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOwotICAgIEZYX0JPT0wgYlNldDEsYlNldDI7CisgICAgYm9vbCBiU2V0ID0gZmFsc2U7CisgICAgYm9vbCBiU2V0MSxiU2V0MjsKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSAmJiBtX3BWVC0+SXNSaWNoVGV4dCgpKQogICAgIHsKICAgICAgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCkBAIC0xNDUzLDE0ICsxNDUzLDE0IEBACiAKICAgICAgICAgICAgIEJlZ2luR3JvdXBVbmRvKEwiIik7OwogCi0gICAgICAgICAgICBiU2V0ID0gU2V0U2VjUHJvcHMoZVByb3BzLHdyVGVtcC5CZWdpblBvcyxwU2VjUHJvcHMscFdvcmRQcm9wcyx3clRlbXAsVFJVRSk7CisgICAgICAgICAgICBiU2V0ID0gU2V0U2VjUHJvcHMoZVByb3BzLHdyVGVtcC5CZWdpblBvcyxwU2VjUHJvcHMscFdvcmRQcm9wcyx3clRlbXAsdHJ1ZSk7CiAKICAgICAgICAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CiAgICAgICAgICAgICAgICAgaWYgKHBsYWNlLldvcmRDbXAod3JUZW1wLkVuZFBvcykgPiAwKSBicmVhazsKLSAgICAgICAgICAgICAgICBiU2V0MSA9IFNldFNlY1Byb3BzKGVQcm9wcyxwbGFjZSxwU2VjUHJvcHMscFdvcmRQcm9wcyx3clRlbXAsVFJVRSk7Ci0gICAgICAgICAgICAgICAgYlNldDIgPSBTZXRXb3JkUHJvcHMoZVByb3BzLHBsYWNlLHBXb3JkUHJvcHMsd3JUZW1wLFRSVUUpOworICAgICAgICAgICAgICAgIGJTZXQxID0gU2V0U2VjUHJvcHMoZVByb3BzLHBsYWNlLHBTZWNQcm9wcyxwV29yZFByb3BzLHdyVGVtcCx0cnVlKTsKKyAgICAgICAgICAgICAgICBiU2V0MiA9IFNldFdvcmRQcm9wcyhlUHJvcHMscGxhY2UscFdvcmRQcm9wcyx3clRlbXAsdHJ1ZSk7CiAKICAgICAgICAgICAgICAgICBpZiAoIWJTZXQpCiAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSAoYlNldDEgfHwgYlNldDIpOwpAQCAtMTUxNiwxNSArMTUxNiwxNSBAQAogICAgIH0KIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6U2V0U2VjUHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwKK2Jvb2wgQ0ZYX0VkaXQ6OlNldFNlY1Byb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IsIEZYX0JPT0wgYkFkZFVuZG8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3ciwgYm9vbCBiQWRkVW5kbykKIHsKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSAmJiBtX3BWVC0+SXNSaWNoVGV4dCgpKQogICAgIHsKICAgICAgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOworICAgICAgICAgICAgYm9vbCBiU2V0ID0gZmFsc2U7CiAgICAgICAgICAgICBDUFZUX1NlY3Rpb24gc2VjaW5mbzsKICAgICAgICAgICAgIENQVlRfU2VjdGlvbiBPbGRTZWNpbmZvOwogCkBAIC0xNTQ1LDIxICsxNTQ1LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbChzZWNpbmZvLlNlY1Byb3BzLmZMaW5lTGVhZGluZyxwU2VjUHJvcHMtPmZMaW5lTGVhZGluZykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLlNlY1Byb3BzLmZMaW5lTGVhZGluZyA9IHBTZWNQcm9wcy0+ZkxpbmVMZWFkaW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9MSU5FSU5ERU5UOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwoc2VjaW5mby5TZWNQcm9wcy5mTGluZUluZGVudCxwU2VjUHJvcHMtPmZMaW5lSW5kZW50KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uU2VjUHJvcHMuZkxpbmVJbmRlbnQgPSBwU2VjUHJvcHMtPmZMaW5lSW5kZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9BTElHTk1FTlQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlY2luZm8uU2VjUHJvcHMubkFsaWdubWVudCAhPSBwU2VjUHJvcHMtPm5BbGlnbm1lbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLlNlY1Byb3BzLm5BbGlnbm1lbnQgPSBwU2VjUHJvcHMtPm5BbGlnbm1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtMTU4Myw0MiArMTU4Myw0MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNpbmZvLldvcmRQcm9wcy5uRm9udEluZGV4ICE9IHBXb3JkUHJvcHMtPm5Gb250SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uRm9udEluZGV4ID0gcFdvcmRQcm9wcy0+bkZvbnRJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfRk9OVFNJWkU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbChzZWNpbmZvLldvcmRQcm9wcy5mRm9udFNpemUscFdvcmRQcm9wcy0+ZkZvbnRTaXplKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLmZGb250U2l6ZSA9IHBXb3JkUHJvcHMtPmZGb250U2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfV09SRENPTE9SOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNpbmZvLldvcmRQcm9wcy5kd1dvcmRDb2xvciAhPSBwV29yZFByb3BzLT5kd1dvcmRDb2xvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLmR3V29yZENvbG9yID0gcFdvcmRQcm9wcy0+ZHdXb3JkQ29sb3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX1NDUklQVFRZUEU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlY2luZm8uV29yZFByb3BzLm5TY3JpcHRUeXBlICE9IHBXb3JkUHJvcHMtPm5TY3JpcHRUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMublNjcmlwdFR5cGUgPSBwV29yZFByb3BzLT5uU2NyaXB0VHlwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfQ0hBUlNQQUNFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwoc2VjaW5mby5Xb3JkUHJvcHMuZkNoYXJTcGFjZSxwV29yZFByb3BzLT5mQ2hhclNwYWNlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLmZDaGFyU3BhY2UgPSBwV29yZFByb3BzLT5mQ2hhclNwYWNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9IT1JaU0NBTEU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlY2luZm8uV29yZFByb3BzLm5Ib3J6U2NhbGUgIT0gcFdvcmRQcm9wcy0+bkhvcnpTY2FsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Ib3J6U2NhbGUgPSBwV29yZFByb3BzLT5uSG9yelNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9VTkRFUkxJTkU6CkBAIC0xNjI3LDcgKzE2MjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX1VOREVSTElORSkgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX1VOREVSTElORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMTYzNSw3ICsxNjM1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpICE9IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE2NDUsNyArMTY0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQpID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9DUk9TU09VVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMTY1Myw3ICsxNjUzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9DUk9TU09VVCkgIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmPSB+UFZUV09SRF9TVFlMRV9DUk9TU09VVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xNjYzLDcgKzE2NjMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0JPTEQpID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9CT0xEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCkBAIC0xNjcxLDcgKzE2NzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0JPTEQpICE9IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfQk9MRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xNjgxLDcgKzE2ODEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0lUQUxJQykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0lUQUxJQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMTY4OSw3ICsxNjg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9JVEFMSUMpICE9IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfSVRBTElDOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE3MTcsMTcgKzE3MTcsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFdvcmRQcm9wcyhFRElUX1BST1BTX0UgZVByb3BzLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IsIEZYX0JPT0wgYkFkZFVuZG8pCitib29sIENGWF9FZGl0OjpTZXRXb3JkUHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyLCBib29sIGJBZGRVbmRvKQogewogICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpICYmIG1fcFZULT5Jc1JpY2hUZXh0KCkpCiAgICAgewogICAgICAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkKICAgICAgICAgewotICAgICAgICAgICAgRlhfQk9PTCBiU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBib29sIGJTZXQgPSBmYWxzZTsKICAgICAgICAgICAgIENQVlRfV29yZCB3b3JkaW5mbzsKICAgICAgICAgICAgIENQVlRfV29yZCBPbGRXb3JkaW5mbzsKIApAQCAtMTc0OSw0MiArMTc0OSw0MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Gb250SW5kZXggPSBwRm9udE1hcC0+R2V0V29yZEZvbnRJbmRleCh3b3JkaW5mby5Xb3JkLHdvcmRpbmZvLm5DaGFyc2V0LHBXb3JkUHJvcHMtPm5Gb250SW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX0ZPTlRTSVpFOgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbCh3b3JkaW5mby5Xb3JkUHJvcHMuZkZvbnRTaXplLHBXb3JkUHJvcHMtPmZGb250U2l6ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLmZGb250U2l6ZSA9IHBXb3JkUHJvcHMtPmZGb250U2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX1dPUkRDT0xPUjoKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JkaW5mby5Xb3JkUHJvcHMuZHdXb3JkQ29sb3IgIT0gcFdvcmRQcm9wcy0+ZHdXb3JkQ29sb3IpCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLmR3V29yZENvbG9yID0gcFdvcmRQcm9wcy0+ZHdXb3JkQ29sb3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9TQ1JJUFRUWVBFOgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRpbmZvLldvcmRQcm9wcy5uU2NyaXB0VHlwZSAhPSBwV29yZFByb3BzLT5uU2NyaXB0VHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMublNjcmlwdFR5cGUgPSBwV29yZFByb3BzLT5uU2NyaXB0VHlwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX0NIQVJTUEFDRToKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwod29yZGluZm8uV29yZFByb3BzLmZDaGFyU3BhY2UscFdvcmRQcm9wcy0+ZkNoYXJTcGFjZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLmZDaGFyU3BhY2UgPSBwV29yZFByb3BzLT5mQ2hhclNwYWNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfSE9SWlNDQUxFOgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRpbmZvLldvcmRQcm9wcy5uSG9yelNjYWxlICE9IHBXb3JkUHJvcHMtPm5Ib3J6U2NhbGUpCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Ib3J6U2NhbGUgPSBwV29yZFByb3BzLT5uSG9yelNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfVU5ERVJMSU5FOgpAQCAtMTc5Myw3ICsxNzkzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX1VOREVSTElORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKQEAgLTE4MDEsNyArMTgwMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xODExLDcgKzE4MTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0NST1NTT1VUKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9DUk9TU09VVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKQEAgLTE4MTksNyArMTgxOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQpICE9IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmPSB+UFZUV09SRF9TVFlMRV9DUk9TU09VVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTgyOSw3ICsxODI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9CT0xEKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9CT0xEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMTgzNyw3ICsxODM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9CT0xEKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfQk9MRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTg0Nyw3ICsxODQ3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9JVEFMSUMpID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0lUQUxJQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKQEAgLTE4NTUsNyArMTg1NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfSVRBTElDKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfSVRBTElDOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xODgxLDQ0ICsxODgxLDQ0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENGWF9FZGl0OjpTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LGludDMyX3QgY2hhcnNldCAvKj0gREVGQVVMVF9DSEFSU0VUKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzIC8qPSBOVUxMKi8sY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzIC8qPSBOVUxMKi8pCiB7Ci0gICAgU2V0VGV4dCh0ZXh0LGNoYXJzZXQscFNlY1Byb3BzLHBXb3JkUHJvcHMsVFJVRSxUUlVFKTsKKyAgICBTZXRUZXh0KHRleHQsY2hhcnNldCxwU2VjUHJvcHMscFdvcmRQcm9wcyx0cnVlLHRydWUpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpJbnNlcnRXb3JkKEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0IC8qPSBERUZBVUxUX0NIQVJTRVQqLywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzIC8qPSBOVUxMKi8pCitib29sIENGWF9FZGl0OjpJbnNlcnRXb3JkKEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0IC8qPSBERUZBVUxUX0NIQVJTRVQqLywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzIC8qPSBOVUxMKi8pCiB7Ci0gICAgcmV0dXJuIEluc2VydFdvcmQod29yZCxjaGFyc2V0LHBXb3JkUHJvcHMsVFJVRSxUUlVFKTsKKyAgICByZXR1cm4gSW5zZXJ0V29yZCh3b3JkLGNoYXJzZXQscFdvcmRQcm9wcyx0cnVlLHRydWUpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyAvKj0gTlVMTCovLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyAvKj0gTlVMTCovKQorYm9vbCBDRlhfRWRpdDo6SW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgLyo9IE5VTEwqLyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgLyo9IE5VTEwqLykKIHsKLSAgICByZXR1cm4gSW5zZXJ0UmV0dXJuKHBTZWNQcm9wcyxwV29yZFByb3BzLFRSVUUsVFJVRSk7CisgICAgcmV0dXJuIEluc2VydFJldHVybihwU2VjUHJvcHMscFdvcmRQcm9wcyx0cnVlLHRydWUpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpCYWNrc3BhY2UoKQorYm9vbCBDRlhfRWRpdDo6QmFja3NwYWNlKCkKIHsKLSAgICByZXR1cm4gQmFja3NwYWNlKFRSVUUsVFJVRSk7CisgICAgcmV0dXJuIEJhY2tzcGFjZSh0cnVlLHRydWUpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpEZWxldGUoKQorYm9vbCBDRlhfRWRpdDo6RGVsZXRlKCkKIHsKLSAgICByZXR1cm4gRGVsZXRlKFRSVUUsVFJVRSk7CisgICAgcmV0dXJuIERlbGV0ZSh0cnVlLHRydWUpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpDbGVhcigpCitib29sIENGWF9FZGl0OjpDbGVhcigpCiB7Ci0gICAgcmV0dXJuIENsZWFyKFRSVUUsVFJVRSk7CisgICAgcmV0dXJuIENsZWFyKHRydWUsdHJ1ZSk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6Okluc2VydFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsIGludDMyX3QgY2hhcnNldCAvKj0gREVGQVVMVF9DSEFSU0VUKi8sCitib29sIENGWF9FZGl0OjpJbnNlcnRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LCBpbnQzMl90IGNoYXJzZXQgLyo9IERFRkFVTFRfQ0hBUlNFVCovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzIC8qPSBOVUxMKi8sY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzIC8qPSBOVUxMKi8pCiB7Ci0gICAgcmV0dXJuIEluc2VydFRleHQodGV4dCxjaGFyc2V0LHBTZWNQcm9wcyxwV29yZFByb3BzLFRSVUUsVFJVRSk7CisgICAgcmV0dXJuIEluc2VydFRleHQodGV4dCxjaGFyc2V0LHBTZWNQcm9wcyxwV29yZFByb3BzLHRydWUsdHJ1ZSk7CiB9CiAKIEZYX0ZMT0FUIENGWF9FZGl0OjpHZXRGb250U2l6ZSgpIGNvbnN0CkBAIC0yMDM5LDkgKzIwMzksOSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25Db250ZW50Q2hhbmdlKHJjQ29udGVudCk7Ci0gICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IEZBTFNFOworICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1fcmNPbGRDb250ZW50ID0gcmNDb250ZW50OwogICAgICAgICB9CkBAIC0yMDc1LDcgKzIwNzUsNyBAQAogICAgIH0KIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6SXNTZWxlY3RlZCgpIGNvbnN0Citib29sIENGWF9FZGl0OjpJc1NlbGVjdGVkKCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9TZWxTdGF0ZS5Jc0V4aXN0KCk7CiB9CkBAIC0yMTUzLDEzICsyMTUzLDEzIEBACiAKICAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKQogICAgICAgICB7Ci0gICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKKyAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSB0cnVlOwogICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25TZXRTY3JvbGxJbmZvWChyY1BsYXRlLmxlZnQsIHJjUGxhdGUucmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ29udGVudC5sZWZ0LCByY0NvbnRlbnQucmlnaHQsIHJjUGxhdGUuV2lkdGgoKSAvIDMsIHJjUGxhdGUuV2lkdGgoKSk7CiAKICAgICAgICAgICAgIG1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsSW5mb1kocmNQbGF0ZS5ib3R0b20sIHJjUGxhdGUudG9wLAogICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQuYm90dG9tLCByY0NvbnRlbnQudG9wLCByY1BsYXRlLkhlaWdodCgpIC8gMywgcmNQbGF0ZS5IZWlnaHQoKSk7Ci0gICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yMTc5LDkgKzIxNzksOSBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmICghbV9iTm90aWZ5RmxhZykKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25TZXRTY3JvbGxQb3NYKGZ4KTsKLSAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMjAzLDkgKzIyMDMsOSBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmICghbV9iTm90aWZ5RmxhZykKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25TZXRTY3JvbGxQb3NZKGZ5KTsKLSAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMzczLDEzICsyMzczLDEzIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghbV9iTm90aWZ5RmxhZykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKKyAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBpZiAoY29uc3QgQ0ZYX0VkaXRfUmVjdEFycmF5ICogcFJlY3RzID0gbV9SZWZyZXNoLkdldFJlZnJlc2hSZWN0cygpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IHBSZWN0cy0+R2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE5vdGlmeS0+SU9uSW52YWxpZGF0ZVJlY3QocFJlY3RzLT5HZXRBdChpKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjQ5OSwxMCArMjQ5OSwxMCBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjUmVmcmVzaCA9IFZUVG9FZGl0KHJjV29yZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtX3BOb3RpZnktPklPbkludmFsaWRhdGVSZWN0KCZyY1JlZnJlc2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjUxNywxMCArMjUxNywxMCBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjUmVmcmVzaCA9IFZUVG9FZGl0KHJjTGluZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtX3BOb3RpZnktPklPbkludmFsaWRhdGVSZWN0KCZyY1JlZnJlc2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yNTY1LDkgKzI1NjUsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKICAgICAgICAgICAgIG1fcE5vdGlmeS0+SU9uU2V0Q2FyZXQoIW1fU2VsU3RhdGUuSXNFeGlzdCgpLFZUVG9FZGl0KHB0SGVhZCksVlRUb0VkaXQocHRGb290KSwgbV93cENhcmV0KTsKLSAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKKyAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjYwMyw5ICsyNjAzLDkgQEAKIAogICAgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBUUlVFOworICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IHRydWU7CiAgICAgICAgICAgICBtX3BOb3RpZnktPklPbkNhcmV0Q2hhbmdlKFNlY1Byb3BzLFdvcmRQcm9wcyk7Ci0gICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yNjI0LDcgKzI2MjQsNyBAQAogICAgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6T25Nb3VzZURvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCit2b2lkIENGWF9FZGl0OjpPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkKIHsKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKICAgICB7CkBAIC0yNjM4LDcgKzI2MzgsNyBAQAogICAgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCit2b2lkIENGWF9FZGl0OjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkKIHsKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKICAgICB7CkBAIC0yNjU3LDcgKzI2NTcsNyBAQAogICAgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6T25WS19VUChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQordm9pZCBDRlhfRWRpdDo6T25WS19VUChib29sIGJTaGlmdCxib29sIGJDdHJsKQogewogICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQogICAgIHsKQEAgLTI2ODgsNyArMjY4OCw3IEBACiAgICAgfQogfQogCi12b2lkIENGWF9FZGl0OjpPblZLX0RPV04oRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKK3ZvaWQgQ0ZYX0VkaXQ6Ok9uVktfRE9XTihib29sIGJTaGlmdCxib29sIGJDdHJsKQogewogICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQogICAgIHsKQEAgLTI3MTksNyArMjcxOSw3IEBACiAgICAgfQogfQogCi12b2lkIENGWF9FZGl0OjpPblZLX0xFRlQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKK3ZvaWQgQ0ZYX0VkaXQ6Ok9uVktfTEVGVChib29sIGJTaGlmdCxib29sIGJDdHJsKQogewogICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQogICAgIHsKQEAgLTI3NzMsNyArMjc3Myw3IEBACiAgICAgfQogfQogCi12b2lkIENGWF9FZGl0OjpPblZLX1JJR0hUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCit2b2lkIENGWF9FZGl0OjpPblZLX1JJR0hUKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCiB7CiAgICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCiAgICAgewpAQCAtMjgyNyw3ICsyODI3LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6Ok9uVktfSE9NRShGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQordm9pZCBDRlhfRWRpdDo6T25WS19IT01FKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCiB7CiAgICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCiAgICAgewpAQCAtMjg3Niw3ICsyODc2LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6Ok9uVktfRU5EKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCit2b2lkIENGWF9FZGl0OjpPblZLX0VORChib29sIGJTaGlmdCxib29sIGJDdHJsKQogewogICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQogICAgIHsKQEAgLTI5MjYsNyArMjkyNiw3IEBACiB9CiAKIHZvaWQgQ0ZYX0VkaXQ6OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsaW50MzJfdCBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KQogewogICAgIEVtcHR5KCk7CiAgICAgRG9JbnNlcnRUZXh0KENQVlRfV29yZFBsYWNlKDAsMCwtMSksIHRleHQsIGNoYXJzZXQsIHBTZWNQcm9wcywgcFdvcmRQcm9wcyk7CkBAIC0yOTM2LDkgKzI5MzYsOSBAQAogICAgIC8vaWYgKGJBZGRVbmRvKQogfQogCi1GWF9CT09MIENGWF9FZGl0OjpJbnNlcnRXb3JkKEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0LCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KQorYm9vbCBDRlhfRWRpdDo6SW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLCBib29sIGJBZGRVbmRvLCBib29sIGJQYWludCkKIHsKLSAgICBpZiAoSXNUZXh0T3ZlcmZsb3coKSkgcmV0dXJuIEZBTFNFOworICAgIGlmIChJc1RleHRPdmVyZmxvdygpKSByZXR1cm4gZmFsc2U7CiAKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKICAgICB7CkBAIC0yOTYwLDE3ICsyOTYwLDE3IEBACiAgICAgICAgICAgICBpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKICAgICAgICAgICAgICAgICBtX3BPcHJOb3RpZnktPk9uSW5zZXJ0V29yZChtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCk7CiAKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpCitib29sIENGWF9FZGl0OjpJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWRkVW5kbywgYm9vbCBiUGFpbnQpCiB7Ci0gICAgaWYgKElzVGV4dE92ZXJmbG93KCkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoSXNUZXh0T3ZlcmZsb3coKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCiAgICAgewpAQCAtMjk5OCwxOCArMjk5OCwxOCBAQAogICAgICAgICAgICAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCiAgICAgICAgICAgICAgICAgbV9wT3ByTm90aWZ5LT5Pbkluc2VydFJldHVybihtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCk7CiAKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpCYWNrc3BhY2UoRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpCitib29sIENGWF9FZGl0OjpCYWNrc3BhY2UoYm9vbCBiQWRkVW5kbywgYm9vbCBiUGFpbnQpCiB7CiAgICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCiAgICAgewotICAgICAgICBpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChtX3dwQ2FyZXQgPT0gbV9wVlQtPkdldEJlZ2luV29yZFBsYWNlKCkpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUFZUX1NlY3Rpb24gc2VjdGlvbjsKICAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7CkBAIC0zMDYyLDE4ICszMDYyLDE4IEBACiAgICAgICAgICAgICBpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKICAgICAgICAgICAgICAgICBtX3BPcHJOb3RpZnktPk9uQmFja1NwYWNlKG1fd3BDYXJldCwgbV93cE9sZENhcmV0KTsKIAotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OkRlbGV0ZShGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCkKK2Jvb2wgQ0ZYX0VkaXQ6OkRlbGV0ZShib29sIGJBZGRVbmRvLCBib29sIGJQYWludCkKIHsKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKICAgICB7Ci0gICAgICAgIGlmIChtX3dwQ2FyZXQgPT0gbV9wVlQtPkdldEVuZFdvcmRQbGFjZSgpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChtX3dwQ2FyZXQgPT0gbV9wVlQtPkdldEVuZFdvcmRQbGFjZSgpKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BWVF9TZWN0aW9uIHNlY3Rpb247CiAgICAgICAgIENQVlRfV29yZCB3b3JkOwpAQCAtMzA4OSw3ICszMDg5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2UobV93cENhcmV0KTsKLSAgICAgICAgRlhfQk9PTCBiU2VjRW5kID0gKG1fd3BDYXJldCA9PSBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpOworICAgICAgICBib29sIGJTZWNFbmQgPSAobV93cENhcmV0ID09IG1fcFZULT5HZXRTZWN0aW9uRW5kUGxhY2UobV93cENhcmV0KSk7CiAKICAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkRlbGV0ZVdvcmQobV93cENhcmV0KSk7CiAgICAgICAgIG1fU2VsU3RhdGUuU2V0KG1fd3BDYXJldCxtX3dwQ2FyZXQpOwpAQCAtMzEyNiwyNiArMzEyNiwyNiBAQAogICAgICAgICBpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKICAgICAgICAgICAgIG1fcE9wck5vdGlmeS0+T25EZWxldGUobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOwogCi0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpFbXB0eSgpCitib29sIENGWF9FZGl0OjpFbXB0eSgpCiB7CiAgICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCiAgICAgewogICAgICAgICBtX3BWVC0+RGVsZXRlV29yZHMoR2V0V2hvbGVXb3JkUmFuZ2UoKSk7CiAgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKTsKIAotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6Q2xlYXIoRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpCitib29sIENGWF9FZGl0OjpDbGVhcihib29sIGJBZGRVbmRvLCBib29sIGJQYWludCkKIHsKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKICAgICB7CkBAIC0zMTg0LDggKzMxODQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZHBsYWNlID0gbV9wVlQtPkFqdXN0TGluZUhlYWRlcihvbGRwbGFjZSxUUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gbV9wVlQtPkFqdXN0TGluZUhlYWRlcihwbGFjZSxUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZHBsYWNlID0gbV9wVlQtPkFqdXN0TGluZUhlYWRlcihvbGRwbGFjZSx0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gbV9wVlQtPkFqdXN0TGluZUhlYWRlcihwbGFjZSx0cnVlKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkRWRpdFVuZG9JdGVtKG5ldyBDRlhFVV9DbGVhclJpY2godGhpcyxvbGRwbGFjZSxwbGFjZSxyYW5nZSx3b3JkaW5mby5Xb3JkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLm5DaGFyc2V0LHNlY2luZm8uU2VjUHJvcHMsd29yZGluZm8uV29yZFByb3BzKSk7CkBAIC0zMjIwLDE3ICszMjIwLDE3IEBACiAgICAgICAgICAgICBpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKICAgICAgICAgICAgICAgICBtX3BPcHJOb3RpZnktPk9uQ2xlYXIobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOwogCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6SW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwgaW50MzJfdCBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KQorYm9vbCBDRlhfRWRpdDo6SW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KQogewotICAgIGlmIChJc1RleHRPdmVyZmxvdygpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKElzVGV4dE92ZXJmbG93KCkpIHJldHVybiBmYWxzZTsKIAogICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2UobV93cENhcmV0KTsKICAgICBTZXRDYXJldChEb0luc2VydFRleHQobV93cENhcmV0LCB0ZXh0LCBjaGFyc2V0LCBwU2VjUHJvcHMsIHBXb3JkUHJvcHMpKTsKQEAgLTMyNDksOSArMzI0OSw5IEBACiAgICAgICAgIGlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQogICAgICAgICAgICAgbV9wT3ByTm90aWZ5LT5Pbkluc2VydFRleHQobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOwogCi0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBDRlhfRWRpdDo6UGFpbnRJbnNlcnRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BPbGQsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BOZXcpCkBAIC0zMjcyLDMyICszMjcyLDMyIEBACiAgICAgfQogfQogCi1GWF9CT09MIENGWF9FZGl0OjpSZWRvKCkKK2Jvb2wgQ0ZYX0VkaXQ6OlJlZG8oKQogewogICAgIGlmIChtX2JFbmFibGVVbmRvKQogICAgIHsKICAgICAgICAgaWYgKG1fVW5kby5DYW5SZWRvKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIG1fVW5kby5SZWRvKCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6VW5kbygpCitib29sIENGWF9FZGl0OjpVbmRvKCkKIHsKICAgICBpZiAobV9iRW5hYmxlVW5kbykKICAgICB7CiAgICAgICAgIGlmIChtX1VuZG8uQ2FuVW5kbygpKQogICAgICAgICB7CiAgICAgICAgICAgICBtX1VuZG8uVW5kbygpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ0ZYX0VkaXQ6OlNldENhcmV0T3JpZ2luKCkKQEAgLTMzMzksNyArMzMzOSw3IEBACiAgICAgcmV0dXJuIENQVlRfV29yZFBsYWNlKCk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OklzVGV4dEZ1bGwoKSBjb25zdAorYm9vbCBDRlhfRWRpdDo6SXNUZXh0RnVsbCgpIGNvbnN0CiB7CiAgICAgaW50MzJfdCBuVG90YWxXb3JkcyA9IG1fcFZULT5HZXRUb3RhbFdvcmRzKCk7CiAgICAgaW50MzJfdCBuTGltaXRDaGFyID0gbV9wVlQtPkdldExpbWl0Q2hhcigpOwpAQCAtMzM0OSw3ICszMzQ5LDcgQEAKICAgICAgICAgfHwgKG5DaGFyQXJyYXk+MCAmJiBuVG90YWxXb3JkcyA+PSBuQ2hhckFycmF5KTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6SXNUZXh0T3ZlcmZsb3coKSBjb25zdAorYm9vbCBDRlhfRWRpdDo6SXNUZXh0T3ZlcmZsb3coKSBjb25zdAogewogICAgIGlmICghbV9iRW5hYmxlU2Nyb2xsICYmICFtX2JFbmFibGVPdmVyZmxvdykKICAgICB7CkBAIC0zMzU4LDEzICszMzU4LDEzIEBACiAKICAgICAgICAgaWYgKG1fcFZULT5Jc011bHRpTGluZSgpICYmIEdldFRvdGFsTGluZXMoKSA+IDEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocmNDb250ZW50LkhlaWdodCgpLHJjUGxhdGUuSGVpZ2h0KCkpKSByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIGlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocmNDb250ZW50LkhlaWdodCgpLHJjUGxhdGUuSGVpZ2h0KCkpKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocmNDb250ZW50LldpZHRoKCkscmNQbGF0ZS5XaWR0aCgpKSkgcmV0dXJuIFRSVUU7CisgICAgICAgIGlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocmNDb250ZW50LldpZHRoKCkscmNQbGF0ZS5XaWR0aCgpKSkgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogQ1BWVF9Xb3JkUGxhY2UgQ0ZYX0VkaXQ6OkdldExpbmVCZWdpblBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0CkBAIC0zMzg3LDUyICszMzg3LDUyIEBACiAgICAgcmV0dXJuIG1fcFZULT5HZXRTZWN0aW9uRW5kUGxhY2UocGxhY2UpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpDYW5VbmRvKCkgY29uc3QKK2Jvb2wgQ0ZYX0VkaXQ6OkNhblVuZG8oKSBjb25zdAogewogICAgIGlmIChtX2JFbmFibGVVbmRvKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fVW5kby5DYW5VbmRvKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6Q2FuUmVkbygpIGNvbnN0Citib29sIENGWF9FZGl0OjpDYW5SZWRvKCkgY29uc3QKIHsKICAgICBpZiAobV9iRW5hYmxlVW5kbykKICAgICB7CiAgICAgICAgIHJldHVybiBtX1VuZG8uQ2FuUmVkbygpOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OklzTW9kaWZpZWQoKSBjb25zdAorYm9vbCBDRlhfRWRpdDo6SXNNb2RpZmllZCgpIGNvbnN0CiB7CiAgICAgaWYgKG1fYkVuYWJsZVVuZG8pCiAgICAgewogICAgICAgICByZXR1cm4gbV9VbmRvLklzTW9kaWZpZWQoKTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIENGWF9FZGl0OjpFbmFibGVSZWZyZXNoKEZYX0JPT0wgYlJlZnJlc2gpCit2b2lkIENGWF9FZGl0OjpFbmFibGVSZWZyZXNoKGJvb2wgYlJlZnJlc2gpCiB7CiAgICAgbV9iRW5hYmxlUmVmcmVzaCA9IGJSZWZyZXNoOwogfQogCi12b2lkIENGWF9FZGl0OjpFbmFibGVVbmRvKEZYX0JPT0wgYlVuZG8pCit2b2lkIENGWF9FZGl0OjpFbmFibGVVbmRvKGJvb2wgYlVuZG8pCiB7CiAgICAgbV9iRW5hYmxlVW5kbyA9IGJVbmRvOwogfQogCi12b2lkIENGWF9FZGl0OjpFbmFibGVOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KQordm9pZCBDRlhfRWRpdDo6RW5hYmxlTm90aWZ5KGJvb2wgYk5vdGlmeSkKIHsKICAgICBtX2JOb3RpZnkgPSBiTm90aWZ5OwogfQogCi12b2lkIENGWF9FZGl0OjpFbmFibGVPcHJOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KQordm9pZCBDRlhfRWRpdDo6RW5hYmxlT3ByTm90aWZ5KGJvb2wgYk5vdGlmeSkKIHsKICAgICBtX2JPcHJOb3RpZnkgPSBiTm90aWZ5OwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfbGlzdC5jcHAgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9saXN0LmNwcAppbmRleCBkOTRjYzE2Li5jODRkYjRkIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9saXN0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9saXN0LmNwcApAQCAtMTEsOCArMTEsOCBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRlhfTGlzdEl0ZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBDRlhfTGlzdEl0ZW06OkNGWF9MaXN0SXRlbSgpIDogbV9wRWRpdChOVUxMKSwKLQltX2JTZWxlY3RlZChGQUxTRSksCi0JbV9iQ2FyZXQoRkFMU0UpLAorCW1fYlNlbGVjdGVkKGZhbHNlKSwKKwltX2JDYXJldChmYWxzZSksCiAJbV9yY0xpc3RJdGVtKDAuMGYsMC4wZiwwLjBmLDAuMGYpCiB7CiAJbV9wRWRpdCA9IElGWF9FZGl0OjpOZXdFZGl0KCk7CkBAIC01NiwyMiArNTYsMjIgQEAKIAlyZXR1cm4gbV9yY0xpc3RJdGVtOwogfQogCi1GWF9CT09MIENGWF9MaXN0SXRlbTo6SXNTZWxlY3RlZCgpIGNvbnN0Citib29sIENGWF9MaXN0SXRlbTo6SXNTZWxlY3RlZCgpIGNvbnN0CiB7CiAJcmV0dXJuIG1fYlNlbGVjdGVkOwogfQogCi12b2lkIENGWF9MaXN0SXRlbTo6U2V0U2VsZWN0KEZYX0JPT0wgYlNlbGVjdGVkKQordm9pZCBDRlhfTGlzdEl0ZW06OlNldFNlbGVjdChib29sIGJTZWxlY3RlZCkKIHsKIAltX2JTZWxlY3RlZCA9IGJTZWxlY3RlZDsKIH0KIAotRlhfQk9PTCBDRlhfTGlzdEl0ZW06OklzQ2FyZXQoKSBjb25zdAorYm9vbCBDRlhfTGlzdEl0ZW06OklzQ2FyZXQoKSBjb25zdAogewogCXJldHVybiBtX2JDYXJldDsKIH0KIAotdm9pZCBDRlhfTGlzdEl0ZW06OlNldENhcmV0KEZYX0JPT0wgYkNhcmV0KQordm9pZCBDRlhfTGlzdEl0ZW06OlNldENhcmV0KGJvb2wgYkNhcmV0KQogewogCW1fYkNhcmV0ID0gYkNhcmV0OwogfQpAQCAtMTE5LDcgKzExOSw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRlhfTGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ0ZYX0xpc3Q6OkNGWF9MaXN0KCkgOiBtX2ZGb250U2l6ZSgwLjBmKSwgbV9wRm9udE1hcChOVUxMKSwgbV9iTXVsdGlwbGUoRkFMU0UpCitDRlhfTGlzdDo6Q0ZYX0xpc3QoKSA6IG1fZkZvbnRTaXplKDAuMGYpLCBtX3BGb250TWFwKE5VTEwpLCBtX2JNdWx0aXBsZShmYWxzZSkKIHsKIH0KIApAQCAtMjExLDggKzIxMSw4IEBACiB7CiAJQ1BERl9Qb2ludCBwdCA9IE91dGVyVG9Jbm5lcihwb2ludCk7CiAKLQlGWF9CT09MIGJGaXJzdCA9IFRSVUU7Ci0JRlhfQk9PTCBiTGFzdCA9IFRSVUU7CisJYm9vbCBiRmlyc3QgPSB0cnVlOworCWJvb2wgYkxhc3QgPSB0cnVlOwogCiAJZm9yIChpbnQzMl90IGk9MCxzej1tX2FMaXN0SXRlbXMuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCiAJewpAQCAtMjIyLDEyICsyMjIsMTIgQEAKIAogCQkJaWYgKEZYX0VESVRfSXNGbG9hdEJpZ2dlcihwdC55LCByY0xpc3RJdGVtLnRvcCkpCiAJCQl7Ci0JCQkJYkZpcnN0ID0gRkFMU0U7CisJCQkJYkZpcnN0ID0gZmFsc2U7CiAJCQl9CiAKIAkJCWlmIChGWF9FRElUX0lzRmxvYXRTbWFsbGVyKHB0LnksIHJjTGlzdEl0ZW0uYm90dG9tKSkKIAkJCXsKLQkJCQliTGFzdCA9IEZBTFNFOworCQkJCWJMYXN0ID0gZmFsc2U7CiAJCQl9CiAKIAkJCWlmIChwdC55ID49IHJjTGlzdEl0ZW0udG9wICYmIHB0LnkgPCByY0xpc3RJdGVtLmJvdHRvbSkKQEAgLTMxOCwxNyArMzE4LDE3IEBACiAJcmV0dXJuIENQREZfUmVjdCgpOwogfQogCi1GWF9CT09MIENGWF9MaXN0OjpJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JbmRleCkgY29uc3QKK2Jvb2wgQ0ZYX0xpc3Q6OklzSXRlbVNlbGVjdGVkKGludDMyX3QgbkluZGV4KSBjb25zdAogewogCWlmIChDRlhfTGlzdEl0ZW0gKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkluZGV4KSkKIAl7CiAJCXJldHVybiBwTGlzdEl0ZW0tPklzU2VsZWN0ZWQoKTsKIAl9CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIENGWF9MaXN0OjpTZXRJdGVtU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQpCit2b2lkIENGWF9MaXN0OjpTZXRJdGVtU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCwgYm9vbCBiU2VsZWN0ZWQpCiB7CiAJaWYgKENGWF9MaXN0SXRlbSAqIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChuSXRlbUluZGV4KSkKIAl7CkBAIC0zMzYsNyArMzM2LDcgQEAKIAl9CiB9CiAKLXZvaWQgQ0ZYX0xpc3Q6OlNldEl0ZW1DYXJldChpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYkNhcmV0KQordm9pZCBDRlhfTGlzdDo6U2V0SXRlbUNhcmV0KGludDMyX3Qgbkl0ZW1JbmRleCwgYm9vbCBiQ2FyZXQpCiB7CiAJaWYgKENGWF9MaXN0SXRlbSAqIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChuSXRlbUluZGV4KSkKIAl7CkBAIC0zNDQsMTcgKzM0NCwxNyBAQAogCX0KIH0KIAotdm9pZCBDRlhfTGlzdDo6U2V0TXVsdGlwbGVTZWwoRlhfQk9PTCBiTXVsdGlwbGUpCit2b2lkIENGWF9MaXN0OjpTZXRNdWx0aXBsZVNlbChib29sIGJNdWx0aXBsZSkKIHsKIAltX2JNdWx0aXBsZSA9IGJNdWx0aXBsZTsKIH0KIAotRlhfQk9PTCBDRlhfTGlzdDo6SXNNdWx0aXBsZVNlbCgpIGNvbnN0Citib29sIENGWF9MaXN0OjpJc011bHRpcGxlU2VsKCkgY29uc3QKIHsKIAlyZXR1cm4gbV9iTXVsdGlwbGU7CiB9CiAKLUZYX0JPT0wgQ0ZYX0xpc3Q6OklzVmFsaWQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdAorYm9vbCBDRlhfTGlzdDo6SXNWYWxpZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0CiB7CiAJcmV0dXJuIG5JdGVtSW5kZXggPj0gMCAmJiBuSXRlbUluZGV4IDwgbV9hTGlzdEl0ZW1zLkdldFNpemUoKTsKIH0KQEAgLTQ0Niw3ICs0NDYsNyBAQAogCXJldHVybiAtMTsKIH0KIAotRlhfQk9PTCBDUExTVF9TZWxlY3Q6OklzRXhpc3QoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdAorYm9vbCBDUExTVF9TZWxlY3Q6OklzRXhpc3QoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdAogewogCXJldHVybiBGaW5kKG5JdGVtSW5kZXgpID49IDA7CiB9CkBAIC01MDcsMTEgKzUwNywxMSBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9MaXN0Q3RybCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogQ0ZYX0xpc3RDdHJsOjpDRlhfTGlzdEN0cmwoKSA6IG1fcE5vdGlmeShOVUxMKSwKLQltX2JOb3RpZnlGbGFnKEZBTFNFKSwKKwltX2JOb3RpZnlGbGFnKGZhbHNlKSwKIAltX3B0U2Nyb2xsUG9zKDAuMGYsMC4wZiksCiAJbV9uU2VsSXRlbSgtMSksCiAJbV9uRm9vdEluZGV4KC0xKSwKLQltX2JDdHJsU2VsKEZBTFNFKSwKKwltX2JDdHJsU2VsKGZhbHNlKSwKIAltX25DYXJldEluZGV4KC0xKQogewogfQpAQCAtNTU3LDcgKzU1Nyw3IEBACiAJcmV0dXJuIENQREZfUmVjdChwdExlZnRCb3R0b20ueCxwdExlZnRCb3R0b20ueSxwdFJpZ2h0VG9wLngscHRSaWdodFRvcC55KTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQordm9pZCBDRlhfTGlzdEN0cmw6Ok9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxib29sIGJTaGlmdCxib29sIGJDdHJsKQogewogCWludDMyX3QgbkhpdEluZGV4ID0gR2V0SXRlbUluZGV4KHBvaW50KTsKIApAQCAtNTY5LDEzICs1NjksMTMgQEAKIAkJCXsKIAkJCQltX2FTZWxJdGVtcy5TdWIobkhpdEluZGV4KTsKIAkJCQlTZWxlY3RJdGVtcygpOwotCQkJCW1fYkN0cmxTZWwgPSBGQUxTRTsKKwkJCQltX2JDdHJsU2VsID0gZmFsc2U7CiAJCQl9CiAJCQllbHNlCiAJCQl7CiAJCQkJbV9hU2VsSXRlbXMuQWRkKG5IaXRJbmRleCk7CiAJCQkJU2VsZWN0SXRlbXMoKTsKLQkJCQltX2JDdHJsU2VsID0gVFJVRTsKKwkJCQltX2JDdHJsU2VsID0gdHJ1ZTsKIAkJCX0KIAogCQkJbV9uRm9vdEluZGV4ID0gbkhpdEluZGV4OwpAQCAtNjA2LDcgKzYwNiw3IEBACiAJCVNjcm9sbFRvTGlzdEl0ZW0obkhpdEluZGV4KTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQordm9pZCBDRlhfTGlzdEN0cmw6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxib29sIGJTaGlmdCxib29sIGJDdHJsKQogewogCWludDMyX3QgbkhpdEluZGV4ID0gR2V0SXRlbUluZGV4KHBvaW50KTsKIApAQCAtNjM5LDcgKzYzOSw3IEBACiAJCVNjcm9sbFRvTGlzdEl0ZW0obkhpdEluZGV4KTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uVksoaW50MzJfdCBuSXRlbUluZGV4LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCit2b2lkIENGWF9MaXN0Q3RybDo6T25WSyhpbnQzMl90IG5JdGVtSW5kZXgsYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkKIHsKIAlpZiAoSXNNdWx0aXBsZVNlbCgpKQogCXsKQEAgLTY3NCwzNyArNjc0LDM3IEBACiAJCVNjcm9sbFRvTGlzdEl0ZW0obkl0ZW1JbmRleCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX1VQKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCit2b2lkIENGWF9MaXN0Q3RybDo6T25WS19VUChib29sIGJTaGlmdCxib29sIGJDdHJsKQogewogCU9uVksoSXNNdWx0aXBsZVNlbCgpID8gR2V0Q2FyZXQoKS0xIDogR2V0U2VsZWN0KCktMSwgYlNoaWZ0LCBiQ3RybCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX0RPV04oRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX0RPV04oYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkKIHsKIAlPblZLKElzTXVsdGlwbGVTZWwoKSA/IEdldENhcmV0KCkrMSA6IEdldFNlbGVjdCgpKzEsIGJTaGlmdCwgYkN0cmwpOwogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6T25WS19MRUZUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCit2b2lkIENGWF9MaXN0Q3RybDo6T25WS19MRUZUKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCiB7CiAJT25WSygwLCBiU2hpZnQsIGJDdHJsKTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfUklHSFQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX1JJR0hUKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCiB7CiAJT25WSyhHZXRDb3VudCgpLTEsIGJTaGlmdCwgYkN0cmwpOwogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6T25WS19IT01FKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCit2b2lkIENGWF9MaXN0Q3RybDo6T25WS19IT01FKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCiB7CiAJT25WSygwLCBiU2hpZnQsIGJDdHJsKTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfRU5EKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCit2b2lkIENGWF9MaXN0Q3RybDo6T25WS19FTkQoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkKIHsKIAlPblZLKEdldENvdW50KCktMSwgYlNoaWZ0LCBiQ3RybCk7CiB9CiAKLUZYX0JPT0wJQ0ZYX0xpc3RDdHJsOjpPbkNoYXIoRlhfV09SRCBuQ2hhcixGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQorYm9vbAlDRlhfTGlzdEN0cmw6Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCiB7CiAJaW50MzJfdCBuSW5kZXggPSBHZXRMYXN0U2VsZWN0ZWQoKTsKIAlpbnQzMl90IG5GaW5kSW5kZXggPSBGaW5kTmV4dChuSW5kZXgsbkNoYXIpOwpAQCAtNzEyLDkgKzcxMiw5IEBACiAJaWYgKG5GaW5kSW5kZXggIT0gbkluZGV4KQogCXsKIAkJT25WSyhuRmluZEluZGV4LCBiU2hpZnQsIGJDdHJsKTsKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCX0KLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCiAvKiAtLS0tLS0tLSBpbm5lciBtZXRob2RzIC0tLS0tLS0gKi8KQEAgLTczOSw3ICs3MzksNyBAQAogCVJlQXJyYW5nZShHZXRDb3VudCgpIC0gMSk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRNdWx0aXBsZVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkKQordm9pZCBDRlhfTGlzdEN0cmw6OlNldE11bHRpcGxlU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCwgYm9vbCBiU2VsZWN0ZWQpCiB7CiAJaWYgKCFJc1ZhbGlkKG5JdGVtSW5kZXgpKSByZXR1cm47CiAKQEAgLTc0NywxMiArNzQ3LDEyIEBACiAJewogCQlpZiAoYlNlbGVjdGVkKQogCQl7Ci0JCQlTZXRJdGVtU2VsZWN0KG5JdGVtSW5kZXgsVFJVRSk7CisJCQlTZXRJdGVtU2VsZWN0KG5JdGVtSW5kZXgsdHJ1ZSk7CiAJCQlJbnZhbGlkYXRlSXRlbShuSXRlbUluZGV4KTsKIAkJfQogCQllbHNlCiAJCXsKLQkJCVNldEl0ZW1TZWxlY3Qobkl0ZW1JbmRleCxGQUxTRSk7CisJCQlTZXRJdGVtU2VsZWN0KG5JdGVtSW5kZXgsZmFsc2UpOwogCQkJSW52YWxpZGF0ZUl0ZW0obkl0ZW1JbmRleCk7CiAJCX0KIAl9CkBAIC03NjYsMTEgKzc2NiwxMSBAQAogCXsKIAkJaWYgKG1fblNlbEl0ZW0gPj0gMCkKIAkJewotCQkJU2V0SXRlbVNlbGVjdChtX25TZWxJdGVtLEZBTFNFKTsKKwkJCVNldEl0ZW1TZWxlY3QobV9uU2VsSXRlbSxmYWxzZSk7CiAJCQlJbnZhbGlkYXRlSXRlbShtX25TZWxJdGVtKTsKIAkJfQogCi0JCVNldEl0ZW1TZWxlY3Qobkl0ZW1JbmRleCxUUlVFKTsKKwkJU2V0SXRlbVNlbGVjdChuSXRlbUluZGV4LHRydWUpOwogCQlJbnZhbGlkYXRlSXRlbShuSXRlbUluZGV4KTsKIAkJbV9uU2VsSXRlbSA9IG5JdGVtSW5kZXg7CiAJfQpAQCAtNzg4LDggKzc4OCw4IEBACiAJCXsKIAkJCW1fbkNhcmV0SW5kZXggPSBuSXRlbUluZGV4OwogCi0JCQlTZXRJdGVtQ2FyZXQobk9sZEluZGV4LCBGQUxTRSk7Ci0JCQlTZXRJdGVtQ2FyZXQobkl0ZW1JbmRleCxUUlVFKTsKKwkJCVNldEl0ZW1DYXJldChuT2xkSW5kZXgsIGZhbHNlKTsKKwkJCVNldEl0ZW1DYXJldChuSXRlbUluZGV4LHRydWUpOwogCiAJCQlJbnZhbGlkYXRlSXRlbShuT2xkSW5kZXgpOwogCQkJSW52YWxpZGF0ZUl0ZW0obkl0ZW1JbmRleCk7CkBAIC04MDUsMTcgKzgwNSwxNyBAQAogCQl7CiAJCQlpZiAoIW1fYk5vdGlmeUZsYWcpCiAJCQl7Ci0JCQkJbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisJCQkJbV9iTm90aWZ5RmxhZyA9IHRydWU7CiAJCQkJQ1BERl9SZWN0IHJjUmVmcmVzaCA9IEdldFBsYXRlUmVjdCgpOwogCQkJCW1fcE5vdGlmeS0+SU9uSW52YWxpZGF0ZVJlY3QoJnJjUmVmcmVzaCk7Ci0JCQkJbV9iTm90aWZ5RmxhZyA9IEZBTFNFOworCQkJCW1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKIAkJCX0KIAkJfQogCQllbHNlCiAJCXsKIAkJCWlmICghbV9iTm90aWZ5RmxhZykKIAkJCXsKLQkJCQltX2JOb3RpZnlGbGFnID0gVFJVRTsKKwkJCQltX2JOb3RpZnlGbGFnID0gdHJ1ZTsKIAkJCQlDUERGX1JlY3QgcmNSZWZyZXNoID0gR2V0SXRlbVJlY3Qobkl0ZW1JbmRleCk7CiAJCQkJcmNSZWZyZXNoLmxlZnQgLT0gMS4wZjsKIAkJCQlyY1JlZnJlc2gucmlnaHQgKz0gMS4wZjsKQEAgLTgyMyw3ICs4MjMsNyBAQAogCQkJCXJjUmVmcmVzaC50b3AgKz0gMS4wZjsKIAogCQkJCW1fcE5vdGlmeS0+SU9uSW52YWxpZGF0ZVJlY3QoJnJjUmVmcmVzaCk7Ci0JCQkJbV9iTm90aWZ5RmxhZyA9IEZBTFNFOworCQkJCW1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKIAkJCX0KIAkJfQogCX0KQEAgLTgzOSwxMCArODM5LDEwIEBACiAJCXN3aXRjaChuU3RhdGUpCiAJCXsKIAkJY2FzZSAxOgotCQkJU2V0TXVsdGlwbGVTZWxlY3Qobkl0ZW1JbmRleCwgVFJVRSk7CisJCQlTZXRNdWx0aXBsZVNlbGVjdChuSXRlbUluZGV4LCB0cnVlKTsKIAkJCWJyZWFrOwogCQljYXNlIC0xOgotCQkJU2V0TXVsdGlwbGVTZWxlY3Qobkl0ZW1JbmRleCwgRkFMU0UpOworCQkJU2V0TXVsdGlwbGVTZWxlY3Qobkl0ZW1JbmRleCwgZmFsc2UpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC04NjMsNyArODYzLDcgQEAKIAkJU2V0U2luZ2xlU2VsZWN0KG5JdGVtSW5kZXgpOwogfQogCi1GWF9CT09MCUNGWF9MaXN0Q3RybDo6SXNJdGVtVmlzaWJsZShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0Citib29sCUNGWF9MaXN0Q3RybDo6SXNJdGVtVmlzaWJsZShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0CiB7CiAJQ1BERl9SZWN0IHJjUGxhdGUgPSBHZXRQbGF0ZVJlY3QoKTsKIAlDUERGX1JlY3QgcmNJdGVtID0gR2V0SXRlbVJlY3Qobkl0ZW1JbmRleCk7CkBAIC05MDQsMTAgKzkwNCwxMCBAQAogCiAJCWlmICghbV9iTm90aWZ5RmxhZykKIAkJewotCQkJbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisJCQltX2JOb3RpZnlGbGFnID0gdHJ1ZTsKIAkJCW1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsSW5mb1kocmNQbGF0ZS5ib3R0b20sIHJjUGxhdGUudG9wLAogCQkJCQlyY0NvbnRlbnQuYm90dG9tLCByY0NvbnRlbnQudG9wLCBHZXRGaXJzdEhlaWdodCgpLCByY1BsYXRlLkhlaWdodCgpKTsKLQkJCW1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKKwkJCW1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKIAkJfQogCX0KIH0KQEAgLTk0Nyw5ICs5NDcsOSBAQAogCQl7CiAJCQlpZiAoIW1fYk5vdGlmeUZsYWcpCiAJCQl7Ci0JCQkJbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisJCQkJbV9iTm90aWZ5RmxhZyA9IHRydWU7CiAJCQkJbV9wTm90aWZ5LT5JT25TZXRTY3JvbGxQb3NZKGZ5KTsKLQkJCQltX2JOb3RpZnlGbGFnID0gRkFMU0U7CisJCQkJbV9iTm90aWZ5RmxhZyA9IGZhbHNlOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfcGFnZW9ianMuY3BwIGIvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfcGFnZW9ianMuY3BwCmluZGV4IDFjMDI2OWIuLjA0ODA5YTQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X3BhZ2VvYmpzLmNwcAorKysgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9wYWdlb2Jqcy5jcHAKQEAgLTEzMiw5ICsxMzIsOSBAQAogCQkJCQkJY29uc3QgQ1BERl9SZWN0JiByY0NsaXAsIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LCBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlLCBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIsIHZvaWQqIHBGRkxEYXRhKQogewogCi0JRlhfQk9PTCBiQ29udGludW91cyA9IHBFZGl0LT5HZXRDaGFyQXJyYXkoKSA9PSAwOworCWJvb2wgYkNvbnRpbnVvdXMgPSBwRWRpdC0+R2V0Q2hhckFycmF5KCkgPT0gMDsKIAlpZiAocEVkaXQtPkdldENoYXJTcGFjZSgpID4gMC4wZikKLQkJYkNvbnRpbnVvdXMgPSBGQUxTRTsKKwkJYkNvbnRpbnVvdXMgPSBmYWxzZTsKIAogCUZYX1dPUkQgU3ViV29yZCA9IHBFZGl0LT5HZXRQYXNzd29yZENoYXIoKTsKIAlGWF9GTE9BVCBmRm9udFNpemUgPSBwRWRpdC0+R2V0Rm9udFNpemUoKTsKQEAgLTE0NCw3ICsxNDQsNyBAQAogCUZYX0NPTE9SUkVGIGNyQ3VyRmlsbCA9IGNyVGV4dEZpbGw7CiAJRlhfQ09MT1JSRUYgY3JPbGRGaWxsID0gY3JDdXJGaWxsOwogCi0JRlhfQk9PTCBiU2VsZWN0ID0gRkFMU0U7CisJYm9vbCBiU2VsZWN0ID0gZmFsc2U7CiAJY29uc3QgRlhfQ09MT1JSRUYgY3JXaGl0ZSA9IEFyZ2JFbmNvZGUoMjU1LDI1NSwyNTUsMjU1KTsKIAljb25zdCBGWF9DT0xPUlJFRiBjclNlbEJLID0gQXJnYkVuY29kZSgyNTUsMCw1MSwxMTMpOwogCkBAIC0yNzgsNyArMjc4LDcgQEAKIAogCUZYX0NPTE9SUkVGIGNyQ3VyVGV4dCA9IEFyZ2JFbmNvZGUoMjU1LCAwLDAsMCk7CiAJRlhfQ09MT1JSRUYgY3JPbGQgPSBjckN1clRleHQ7Ci0JRlhfQk9PTCBiU2VsZWN0ID0gRkFMU0U7CisJYm9vbCBiU2VsZWN0ID0gZmFsc2U7CiAJY29uc3QgRlhfQ09MT1JSRUYgY3JXaGl0ZSA9IEFyZ2JFbmNvZGUoMjU1LDI1NSwyNTUsMjU1KTsKIAljb25zdCBGWF9DT0xPUlJFRiBjclNlbEJLID0gQXJnYkVuY29kZSgyNTUsMCw1MSwxMTMpOwogCkBAIC00MTAsNyArNDEwLDcgQEAKIAlwUGF0aE9iai0+bV9Db2xvclN0YXRlLlNldEZpbGxDb2xvcihDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFUkdCKSwgcmdiLCAzKTsKIAogCXBQYXRoT2JqLT5tX0ZpbGxUeXBlID0gRlhGSUxMX0FMVEVSTkFURTsKLQlwUGF0aE9iai0+bV9iU3Ryb2tlID0gRkFMU0U7CisJcFBhdGhPYmotPm1fYlN0cm9rZSA9IGZhbHNlOwogCiAJcFBhZ2VPYmpzLT5JbnNlcnRPYmplY3QocFBhZ2VPYmpzLT5HZXRMYXN0T2JqZWN0UG9zaXRpb24oKSxwUGF0aE9iaik7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0RvY3VtZW50LmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRG9jdW1lbnQuY3BwCmluZGV4IDU5ODE2ZjAuLjY2ODAzMmQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRG9jdW1lbnQuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRG9jdW1lbnQuY3BwCkBAIC00NSwxNCArNDUsMTQgQEAKIFByaW50UGFyYW1zT2JqOjpQcmludFBhcmFtc09iaihDSlNfT2JqZWN0KiBwSlNPYmplY3QpCiA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpCiB7Ci0gICAgYlVJID0gVFJVRTsKKyAgICBiVUkgPSB0cnVlOwogICAgIG5TdGFydCA9IDA7CiAgICAgbkVuZCA9IDA7Ci0gICAgYlNpbGVudCA9IEZBTFNFOwotICAgIGJTaHJpbmtUb0ZpdCA9IEZBTFNFOwotICAgIGJQcmludEFzSW1hZ2UgPSBGQUxTRTsKLSAgICBiUmV2ZXJzZSA9IEZBTFNFOwotICAgIGJBbm5vdGF0aW9ucyA9IFRSVUU7CisgICAgYlNpbGVudCA9IGZhbHNlOworICAgIGJTaHJpbmtUb0ZpdCA9IGZhbHNlOworICAgIGJQcmludEFzSW1hZ2UgPSBmYWxzZTsKKyAgICBiUmV2ZXJzZSA9IGZhbHNlOworICAgIGJBbm5vdGF0aW9ucyA9IHRydWU7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRG9jdW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTQyLDcgKzE0Miw3IEBACiAKIElNUExFTUVOVF9KU19DTEFTUyhDSlNfRG9jdW1lbnQsIERvY3VtZW50KQogCi1GWF9CT09MIENKU19Eb2N1bWVudDo6SW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKQorYm9vbCBDSlNfRG9jdW1lbnQ6OkluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYykKIHsKICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTE1Miw3ICsxNTIsNyBAQAogCiAgICAgcERvYy0+QXR0YWNoRG9jKHBDb250ZXh0LT5HZXRSZWFkZXJEb2N1bWVudCgpKTsKICAgICBwRG9jLT5TZXRJc29sYXRlKHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKS0+R2V0SXNvbGF0ZSgpKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEb2N1bWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE2Miw3ICsxNjIsNyBAQAogICAgIG1fcEljb25UcmVlKE5VTEwpLAogICAgIG1fcERvY3VtZW50KE5VTEwpLAogICAgIG1fY3dCYXNlVVJMKEwiIiksCi0gICAgbV9iRGVsYXkoRkFMU0UpCisgICAgbV9iRGVsYXkoZmFsc2UpCiB7CiB9CiAKQEAgLTE5MCwyMCArMTkwLDIwIEBACiB9CiAKIC8vdGhlIHRvdGFsIG51bWJlciBvZiBmaWxlZHMgaW4gZG9jdW1lbnQuCi1GWF9CT09MIERvY3VtZW50OjpudW1GaWVsZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6bnVtRmllbGRzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKICAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERlNES19JbnRlckZvcm0gKnBJbnRlckZvcm0gPSBtX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CiAgICAgQ1BERl9JbnRlckZvcm0gKnBQREZGb3JtID0gcEludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7CiAgICAgdnAgPDwgKGludClwUERGRm9ybS0+Q291bnRGaWVsZHMoKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6ZGlydHkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6ZGlydHkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIApAQCAtMjI2LDEwICsyMjYsMTAgQEAKICAgICAgICAgICAgIG1fcERvY3VtZW50LT5DbGVhckNoYW5nZU1hcmsoKTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6QURCRShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpBREJFKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKQEAgLTI0MSwxMCArMjQxLDEwIEBACiAgICAgewogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpwYWdlTnVtKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OnBhZ2VOdW0oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIApAQCAtMjc2LDU1ICsyNzYsNTUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpQYXJzZXJQYXJhbXMoSlNPYmplY3QqIHBPYmosQ0pTX0Fubm90T2JqJiBhbm5vdG9iaikKK2Jvb2wgRG9jdW1lbnQ6OlBhcnNlclBhcmFtcyhKU09iamVjdCogcE9iaixDSlNfQW5ub3RPYmomIGFubm90b2JqKQogewogICAgIC8vIE5vdCBzdXBwb3J0ZWQuCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmFkZEFubm90KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjphZGRBbm5vdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIC8vIE5vdCBzdXBwb3J0ZWQuCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmFkZEZpZWxkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjphZGRGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIC8vIE5vdCBzdXBwb3J0ZWQuCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmV4cG9ydEFzVGV4dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6ZXhwb3J0QXNUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpleHBvcnRBc0ZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6ZXhwb3J0QXNGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmV4cG9ydEFzWEZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6ZXhwb3J0QXNYRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAvL01hcHMgYSBmaWVsZCBvYmplY3QgaW4gUERGIGRvY3VtZW50IHRvIGEgSmF2YVNjcmlwdCB2YXJpYWJsZQogLy9jb21tZW50OgogLy9ub3RlOiB0aGUgcGFyZW10ZXIgY05hbWUsIHRoaXMgaXMgY2x1ZSBob3cgdG8gdHJlYXQgaWYgdGhlIGNOYW1lIGlzIG5vdCBhIHZhbGlhYmxlIGZpbGVkIG5hbWUgaW4gdGhpcyBkb2N1bWVudAogCi1GWF9CT09MIERvY3VtZW50OjpnZXRGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Z2V0RmllbGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogICAgIGlmIChwYXJhbXMuc2l6ZSgpIDwgMSkgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBDRlhfV2lkZVN0cmluZyB3aWRlTmFtZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKQEAgLTMzNCw3ICszMzQsNyBAQAogICAgIGlmIChwUERGRm9ybS0+Q291bnRGaWVsZHMod2lkZU5hbWUpIDw9IDApCiAgICAgewogICAgICAgICB2UmV0LlNldE51bGwoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKQEAgLTM0Niw2NiArMzQ2LDY2IEBACiAgICAgcEZpZWxkLT5BdHRhY2hGaWVsZCh0aGlzLCB3aWRlTmFtZSk7CiAKICAgICB2UmV0ID0gcEpTRmllbGQ7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8vR2V0cyB0aGUgbmFtZSBvZiB0aGUgbnRoIGZpZWxkIGluIHRoZSBkb2N1bWVudAotRlhfQk9PTCBEb2N1bWVudDo6Z2V0TnRoRmllbGROYW1lKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpnZXROdGhGaWVsZE5hbWUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgaW50IG5JbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwogICAgIGlmIChuSW5kZXggPCAwKSB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVkFMVUVFUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwogICAgIENQREZfSW50ZXJGb3JtKiBwUERGRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwogICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBwUERGRm9ybS0+R2V0RmllbGQobkluZGV4KTsKICAgICBpZiAoIXBGaWVsZCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICB2UmV0ID0gcEZpZWxkLT5HZXRGdWxsTmFtZSgpLmNfc3RyKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmltcG9ydEFuRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjppbXBvcnRBbkZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6aW1wb3J0QW5YRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjppbXBvcnRBblhGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmltcG9ydFRleHREYXRhKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjppbXBvcnRUZXh0RGF0YShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLy9leHBvcnRzIHRoZSBmb3JtIGRhdGEgYW5kIG1haWxzIHRoZSByZXN1bHRpbmcgZmRmIGZpbGUgYXMgYW4gYXR0YWNobWVudCB0byBhbGwgcmVjaXBpZW50cy4KIC8vY29tbWVudDogbmVlZCByZWFkZXIgc3VwcG9ydHMKIC8vbm90ZToKLS8vaW50IENQREZTREtfRG9jdW1lbnQ6Om1haWxGb3JtKEZYX0JPT0wgYlVJLFN0cmluZyBjdG8sc3RyaW5nIGNjYyxzdHJpbmcgY2JjYyxzdHJpbmcgY1N1YmplY3Qsc3RyaW5nIGNtcyk7CisvL2ludCBDUERGU0RLX0RvY3VtZW50OjptYWlsRm9ybShib29sIGJVSSxTdHJpbmcgY3RvLHN0cmluZyBjY2Msc3RyaW5nIGNiY2Msc3RyaW5nIGNTdWJqZWN0LHN0cmluZyBjbXMpOwogCi1GWF9CT09MIERvY3VtZW50OjptYWlsRm9ybShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6bWFpbEZvcm0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKLSAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUykpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUykpIHJldHVybiBmYWxzZTsKIAogICAgIGludCBpTGVuZ3RoID0gcGFyYW1zLnNpemUoKTsKIAotICAgIEZYX0JPT0wgYlVJID0gaUxlbmd0aCA+IDAgPyBwYXJhbXNbMF0uVG9Cb29sKCkgOiBUUlVFOworICAgIGJvb2wgYlVJID0gaUxlbmd0aCA+IDAgPyBwYXJhbXNbMF0uVG9Cb29sKCkgOiB0cnVlOwogICAgIENGWF9XaWRlU3RyaW5nIGNUbyA9IGlMZW5ndGggPiAxID8gcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpIDogTCIiOwogICAgIENGWF9XaWRlU3RyaW5nIGNDYyA9IGlMZW5ndGggPiAyID8gcGFyYW1zWzJdLlRvQ0ZYV2lkZVN0cmluZygpIDogTCIiOwogICAgIENGWF9XaWRlU3RyaW5nIGNCY2MgPSBpTGVuZ3RoID4gMyA/IHBhcmFtc1szXS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKQEAgLTQxNyw3ICs0MTcsNyBAQAogCiAgICAgQ0ZYX0J5dGVUZXh0QnVmIHRleHRCdWY7CiAgICAgaWYgKCFwSW50ZXJGb3JtLT5FeHBvcnRGb3JtVG9GREZUZXh0QnVmKHRleHRCdWYpKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtNDI5LDI0ICs0MjksMjQgQEAKICAgICBwUnVudGltZS0+QmVnaW5CbG9jaygpOwogICAgIHBFbnYtPkpTX2RvY21haWxGb3JtKHRleHRCdWYuR2V0QnVmZmVyKCksIHRleHRCdWYuR2V0TGVuZ3RoKCksIGJVSSwgY1RvLmNfc3RyKCksIGNTdWJqZWN0LmNfc3RyKCksIGNDYy5jX3N0cigpLCBjQmNjLmNfc3RyKCksIGNNc2cuY19zdHIoKSk7CiAgICAgcFJ1bnRpbWUtPkVuZEJsb2NrKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OnByaW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpwcmludChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogICAgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKICAgICBBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7CiAKLSAgICBGWF9CT09MIGJVSSA9IFRSVUU7CisgICAgYm9vbCBiVUkgPSB0cnVlOwogICAgIGludCBuU3RhcnQgPSAwOwogICAgIGludCBuRW5kID0gMDsKLSAgICBGWF9CT09MIGJTaWxlbnQgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJTaHJpbmtUb0ZpdCA9IEZBTFNFOwotICAgIEZYX0JPT0wgYlByaW50QXNJbWFnZSA9IEZBTFNFOwotICAgIEZYX0JPT0wgYlJldmVyc2UgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJBbm5vdGF0aW9ucyA9IEZBTFNFOworICAgIGJvb2wgYlNpbGVudCA9IGZhbHNlOworICAgIGJvb2wgYlNocmlua1RvRml0ID0gZmFsc2U7CisgICAgYm9vbCBiUHJpbnRBc0ltYWdlID0gZmFsc2U7CisgICAgYm9vbCBiUmV2ZXJzZSA9IGZhbHNlOworICAgIGJvb2wgYkFubm90YXRpb25zID0gZmFsc2U7CiAKICAgICBpbnQgbmxlbmd0aCA9IHBhcmFtcy5zaXplKCk7CiAgICAgaWYobmxlbmd0aCA9PTkpCkBAIC01MDAsMjYgKzUwMCwyNiBAQAogICAgIGlmIChDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpKQogICAgIHsKICAgICAgICAgcEVudi0+SlNfZG9jcHJpbnQoYlVJLCBuU3RhcnQsIG5FbmQsIGJTaWxlbnQsIGJTaHJpbmtUb0ZpdCwgYlByaW50QXNJbWFnZSwgYlJldmVyc2UsIGJBbm5vdGF0aW9ucyk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogLy9yZW1vdmVzIHRoZSBzcGVjaWZpZWQgZmllbGQgZnJvbSB0aGUgZG9jdW1lbnQuCiAvL2NvbW1lbnQ6CiAvL25vdGU6IGlmIHRoZSBmaWxlZCBuYW1lIGlzIG5vdCByZXRpb25hbCwgYWRvYmUgaXMgZHVtYiBmb3IgaXQuCiAKLUZYX0JPT0wgRG9jdW1lbnQ6OnJlbW92ZUZpZWxkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpyZW1vdmVGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICghKG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpIHx8Ci0gICAgICAgIG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9BTk5PVF9GT1JNKSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0FOTk9UX0ZPUk0pKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIENGWF9XaWRlU3RyaW5nIHNGaWVsZE5hbWUgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CkBAIC01NTgsMjAgKzU1OCwyMCBAQAogICAgICAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAvL3Jlc2V0IGZpbGVkIHZhbHVlcyB3aXRoaW4gYSBkb2N1bWVudC4KIC8vY29tbWVudDoKIC8vbm90ZTogaWYgdGhlIGZpZWxkcyBuYW1lcyByIG5vdCByYXRpb25hbCwgYW9kYmUgaXMgZHVtYiBmb3IgaXQuCiAKLUZYX0JPT0wgRG9jdW1lbnQ6OnJlc2V0Rm9ybShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6cmVzZXRGb3JtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKCEobV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkgfHwKICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0FOTk9UX0ZPUk0pIHx8Ci0gICAgICAgIG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9GSUxMX0ZPUk0pKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRklMTF9GT1JNKSkpIHJldHVybiBmYWxzZTsKIAogICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CiAgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CkBAIC02MTAsNDIgKzYxMCw0MiBAQAogCiAgICAgICAgIGlmIChhRmllbGRzLkdldFNpemUoKSA+IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIHBQREZGb3JtLT5SZXNldEZvcm0oYUZpZWxkcywgVFJVRSwgVFJVRSk7CisgICAgICAgICAgICBwUERGRm9ybS0+UmVzZXRGb3JtKGFGaWVsZHMsIHRydWUsIHRydWUpOwogICAgICAgICAgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKIAogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIHBQREZGb3JtLT5SZXNldEZvcm0oVFJVRSk7CisgICAgICAgIHBQREZGb3JtLT5SZXNldEZvcm0odHJ1ZSk7CiAgICAgICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CiAKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogCi1GWF9CT09MIERvY3VtZW50OjpzYXZlQXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OnNhdmVBcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiBUUlVFOworICByZXR1cm4gdHJ1ZTsKIH0KIAogCi1GWF9CT09MIERvY3VtZW50OjpzdWJtaXRGb3JtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpzdWJtaXRGb3JtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgaW50IG5TaXplID0gcGFyYW1zLnNpemUoKTsKICAgICBpZiAoblNpemUgPCAxKSB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIENGWF9XaWRlU3RyaW5nIHN0clVSTDsKLSAgICBGWF9CT09MIGJGREYgPSBUUlVFOwotICAgIEZYX0JPT0wgYkVtcHR5ID0gRkFMU0U7CisgICAgYm9vbCBiRkRGID0gdHJ1ZTsKKyAgICBib29sIGJFbXB0eSA9IGZhbHNlOwogICAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7CiAgICAgQ0pTX0FycmF5IGFGaWVsZHMoaXNvbGF0ZSk7CiAKQEAgLTY3NywxNiArNjc3LDE2IEBACiAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwogICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CiAgICAgQ1BERl9JbnRlckZvcm0qIHBQREZJbnRlckZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKLSAgICBGWF9CT09MIGJBbGwgPSAoYUZpZWxkcy5HZXRMZW5ndGgoKSA9PSAwKTsKKyAgICBib29sIGJBbGwgPSAoYUZpZWxkcy5HZXRMZW5ndGgoKSA9PSAwKTsKICAgICBpZiAoYkFsbCAmJiBiRW1wdHkpCiAgICAgewogICAgICAgICBpZiAocFBERkludGVyRm9ybS0+Q2hlY2tSZXF1aXJlZEZpZWxkcygpKQogICAgICAgICB7CiAgICAgICAgICAgICBwUnVudGltZS0+QmVnaW5CbG9jaygpOwotICAgICAgICAgICAgcEludGVyRm9ybS0+U3VibWl0Rm9ybShzdHJVUkwsIEZBTFNFKTsKKyAgICAgICAgICAgIHBJbnRlckZvcm0tPlN1Ym1pdEZvcm0oc3RyVVJMLCBmYWxzZSk7CiAgICAgICAgICAgICBwUnVudGltZS0+RW5kQmxvY2soKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgQ0ZYX1B0ckFycmF5IGZpZWxkT2JqZWN0czsKQEAgLTcwNywxMyArNzA3LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAocFBERkludGVyRm9ybS0+Q2hlY2tSZXF1aXJlZEZpZWxkcygmZmllbGRPYmplY3RzLCBUUlVFKSkKKyAgICBpZiAocFBERkludGVyRm9ybS0+Q2hlY2tSZXF1aXJlZEZpZWxkcygmZmllbGRPYmplY3RzLCB0cnVlKSkKICAgICB7CiAgICAgICAgIHBSdW50aW1lLT5CZWdpbkJsb2NrKCk7Ci0gICAgICAgIHBJbnRlckZvcm0tPlN1Ym1pdEZpZWxkcyhzdHJVUkwsIGZpZWxkT2JqZWN0cywgVFJVRSwgIWJGREYpOworICAgICAgICBwSW50ZXJGb3JtLT5TdWJtaXRGaWVsZHMoc3RyVVJMLCBmaWVsZE9iamVjdHMsIHRydWUsICFiRkRGKTsKICAgICAgICAgcFJ1bnRpbWUtPkVuZEJsb2NrKCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC03MjgsMjYgKzcyOCwyNiBAQAogICAgIHJldHVybiBtX3BEb2N1bWVudDsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6RXh0cmFjdEZpbGVOYW1lKENQREZTREtfRG9jdW1lbnQgKnBEb2MsQ0ZYX0J5dGVTdHJpbmcgJnN0ckZpbGVOYW1lKQorYm9vbCBEb2N1bWVudDo6RXh0cmFjdEZpbGVOYW1lKENQREZTREtfRG9jdW1lbnQgKnBEb2MsQ0ZYX0J5dGVTdHJpbmcgJnN0ckZpbGVOYW1lKQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OkV4dHJhY3RGb2xkZXJOYW1lKENQREZTREtfRG9jdW1lbnQgKnBEb2MsQ0ZYX0J5dGVTdHJpbmcgJnN0ckZvbGRlck5hbWUpCitib29sIERvY3VtZW50OjpFeHRyYWN0Rm9sZGVyTmFtZShDUERGU0RLX0RvY3VtZW50ICpwRG9jLENGWF9CeXRlU3RyaW5nICZzdHJGb2xkZXJOYW1lKQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmJvb2ttYXJrUm9vdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50Ojpib29rbWFya1Jvb3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjptYWlsRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjptYWlsRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgRlhfQk9PTCBiVUkgPSBUUlVFOworICAgIGJvb2wgYlVJID0gdHJ1ZTsKICAgICBDRlhfV2lkZVN0cmluZyBjVG8gPSBMIiI7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgY0NjID0gTCIiOwogICAgIENGWF9XaWRlU3RyaW5nIGNCY2MgPSBMIiI7CkBAIC04MDMsNDAgKzgwMyw0MCBAQAogICAgIHBFbnYtPkpTX2RvY21haWxGb3JtKE5VTEwsIDAsIGJVSSwgY1RvLmNfc3RyKCksIGNTdWJqZWN0LmNfc3RyKCksIGNDYy5jX3N0cigpLCBjQmNjLmNfc3RyKCksIGNNc2cuY19zdHIoKSk7CiAgICAgcFJ1bnRpbWUtPkVuZEJsb2NrKCk7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6YXV0aG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmF1dGhvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7Ci0gICAgaWYgKCFwRGljdGlvbmFyeSlyZXR1cm4gRkFMU0U7CisgICAgaWYgKCFwRGljdGlvbmFyeSlyZXR1cm4gZmFsc2U7CiAKICAgICBpZiAodnAuSXNHZXR0aW5nKCkpCiAgICAgewogICAgICAgICB2cCA8PCBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIkF1dGhvciIpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzQXV0aG9yOwogICAgICAgICB2cCA+PiBjc0F1dGhvcjsKICAgICAgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJBdXRob3IiLCBQREZfRW5jb2RlVGV4dChjc0F1dGhvcikpOwogICAgICAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogfQogCi1GWF9CT09MIERvY3VtZW50OjppbmZvKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmluZm8oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIENQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0SW5mbygpOwogICAgIGlmICghcERpY3Rpb25hcnkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQ0ZYX1dpZGVTdHJpbmcgY3dBdXRob3IgICAgICAgICA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiQXV0aG9yIik7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgY3dUaXRsZSAgICAgICAgICA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiVGl0bGUiKTsKQEAgLTg4MCwxNCArODgwLDE0IEBACiAgICAgICAgIH0KICAgICAgICAgdnAgPDwgcE9iajsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmNyZWF0aW9uRGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpjcmVhdGlvbkRhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0SW5mbygpOwogICAgIGlmICghcERpY3Rpb25hcnkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKHZwLklzR2V0dGluZygpKQogICAgIHsKQEAgLTg5NiwyMSArODk2LDIxIEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0NyZWF0aW9uRGF0ZTsKICAgICAgICAgdnAgPj4gY3NDcmVhdGlvbkRhdGU7CiAgICAgICAgIHBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiQ3JlYXRpb25EYXRlIiwgUERGX0VuY29kZVRleHQoY3NDcmVhdGlvbkRhdGUpKTsKICAgICAgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmNyZWF0b3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Y3JlYXRvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7CiAgICAgaWYgKCFwRGljdGlvbmFyeSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBpZiAodnAuSXNHZXR0aW5nKCkpCiAgICAgewpAQCAtOTE5LDE3ICs5MTksMTcgQEAKICAgICBlbHNlCiAgICAgewogICAgICAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzQ3JlYXRvcjsKICAgICAgICAgdnAgPj4gY3NDcmVhdG9yOwogICAgICAgICBwRGljdGlvbmFyeS0+U2V0QXRTdHJpbmcoIkNyZWF0b3IiLCBQREZfRW5jb2RlVGV4dChjc0NyZWF0b3IpKTsKICAgICAgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmRlbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmRlbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAodnAuSXNHZXR0aW5nKCkpCiAgICAgewpAQCAtOTM4LDcgKzkzOCw3IEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICB2cCA+PiBtX2JEZWxheTsKICAgICAgICAgaWYgKG1fYkRlbGF5KQpAQCAtOTY5LDE0ICs5NjksMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6a2V5d29yZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6a2V5d29yZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0SW5mbygpOwogICAgIGlmICghcERpY3Rpb25hcnkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKHZwLklzR2V0dGluZygpKQogICAgIHsKQEAgLTk4NSwyMSArOTg1LDIxIEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0tleXdvcmRzOwogICAgICAgICB2cCA+PiBjc0tleXdvcmRzOwogICAgICAgICBwRGljdGlvbmFyeS0+U2V0QXRTdHJpbmcoIktleXdvcmRzIiwgUERGX0VuY29kZVRleHQoY3NLZXl3b3JkcykpOwogICAgICAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6bW9kRGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50Ojptb2REYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldEluZm8oKTsKICAgICBpZiAoIXBEaWN0aW9uYXJ5KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGlmICh2cC5Jc0dldHRpbmcoKSkKICAgICB7CkBAIC0xMDA4LDIxICsxMDA4LDIxIEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDRlhfV2lkZVN0cmluZyBjc21vZERhdGU7CiAgICAgICAgIHZwID4+IGNzbW9kRGF0ZTsKICAgICAgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJNb2REYXRlIiwgUERGX0VuY29kZVRleHQoY3Ntb2REYXRlKSk7CiAgICAgICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50Ojpwcm9kdWNlcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50Ojpwcm9kdWNlcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7CiAgICAgaWYgKCFwRGljdGlvbmFyeSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBpZiAodnAuSXNHZXR0aW5nKCkpCiAgICAgewpAQCAtMTAzMSwyMSArMTAzMSwyMSBAQAogICAgIGVsc2UKICAgICB7CiAgICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3Nwcm9kdWNlcjsKICAgICAgICAgdnAgPj4gY3Nwcm9kdWNlcjsKICAgICAgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJQcm9kdWNlciIsIFBERl9FbmNvZGVUZXh0KGNzcHJvZHVjZXIpKTsKICAgICAgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OnN1YmplY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6c3ViamVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7CiAgICAgaWYgKCFwRGljdGlvbmFyeSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBpZiAodnAuSXNHZXR0aW5nKCkpCiAgICAgewpAQCAtMTA1NCwyNCArMTA1NCwyNCBAQAogICAgIGVsc2UKICAgICB7CiAgICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NzdWJqZWN0OwogICAgICAgICB2cCA+PiBjc3N1YmplY3Q7CiAgICAgICAgIHBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiU3ViamVjdCIsIFBERl9FbmNvZGVUZXh0KGNzc3ViamVjdCkpOwogICAgICAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6dGl0bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6dGl0bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGlmIChtX3BEb2N1bWVudCA9PSBOVUxMIHx8IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpID09IE5VTEwpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7CiAgICAgaWYgKCFwRGljdGlvbmFyeSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBpZiAodnAuSXNHZXR0aW5nKCkpCiAgICAgewpAQCAtMTA4MCw1OCArMTA4MCw1OCBAQAogICAgIGVsc2UKICAgICB7CiAgICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3N0aXRsZTsKICAgICAgICAgdnAgPj4gY3N0aXRsZTsKICAgICAgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJUaXRsZSIsIFBERl9FbmNvZGVUZXh0KGNzdGl0bGUpKTsKICAgICAgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6Om51bVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6Om51bVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKICAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgdnAgPDwgbV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpleHRlcm5hbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpleHRlcm5hbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgLy9JbiBDaHJvbWUgY2FzZSxzaG91bGQgYWx3YXlzIHJldHVybiB0cnVlLgogICAgIGlmICh2cC5Jc0dldHRpbmcoKSkgewogICAgICAgICB2cCA8PCB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6ZmlsZXNpemUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6ZmlsZXNpemUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkgewogICAgICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDSlNfQ29udGV4dCo+KGNjKTsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSRUFET05MWSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICB2cCA8PCAwOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50Ojptb3VzZVgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6bW91c2VYKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6bW91c2VZKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6Om1vdXNlWShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmJhc2VVUkwoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6YmFzZVVSTChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgaWYgKHZwLklzR2V0dGluZygpKQogICAgIHsKQEAgLTExNDEsMTAgKzExNDEsMTAgQEAKICAgICB7CiAgICAgICAgIHZwID4+IG1fY3dCYXNlVVJMOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Y2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmNhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC0xMTY2LDE1ICsxMTY2LDE1IEBACiAgICAgICAgIHBJbnRlckZvcm0tPkVuYWJsZUNhbGN1bGF0ZShiQ2FsY3VsYXRlKTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6ZG9jdW1lbnRGaWxlTmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50Ojpkb2N1bWVudEZpbGVOYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKICAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWxlUGF0aCA9IG1fcERvY3VtZW50LT5HZXRQYXRoKCk7CiAgICAgaW50MzJfdCBpID0gd3NGaWxlUGF0aC5HZXRMZW5ndGgoKSAtIDE7CkBAIC0xMTg5LDcgKzExODksNyBAQAogICAgIH1lbHNlewogICAgICAgICB2cCA8PCBMIiI7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiBDRlhfV2lkZVN0cmluZyBEb2N1bWVudDo6UmV2ZXJzYWxTdHIoQ0ZYX1dpZGVTdHJpbmcgY2JGcm9tKQpAQCAtMTIzOSw3NCArMTIzOSw3NCBAQAogICAgIHJldHVybiBjYlJldDsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6cGF0aChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpwYXRoKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKICAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgdnAgPDwgYXBwOjpTeXNQYXRoVG9QREZQYXRoKG1fcERvY3VtZW50LT5HZXRQYXRoKCkpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpwYWdlV2luZG93UmVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpwYWdlV2luZG93UmVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmxheW91dChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpsYXlvdXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjphZGRMaW5rKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjphZGRMaW5rKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmNsb3NlRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpjbG9zZURvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Z2V0UGFnZUJveChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Z2V0UGFnZUJveChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpnZXRBbm5vdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Z2V0QW5ub3QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Z2V0QW5ub3RzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpnZXRBbm5vdHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2UmV0LlNldE51bGwoKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Z2V0QW5ub3QzRChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Z2V0QW5ub3QzRChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIHZSZXQuU2V0TnVsbCgpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpnZXRBbm5vdHMzRChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Z2V0QW5ub3RzM0QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2UmV0ID0gVlRfdW5kZWZpbmVkOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpnZXRPQ0dzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpnZXRPQ0dzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmdldExpbmtzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpnZXRMaW5rcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiBib29sIERvY3VtZW50OjpJc0VuY2xvc2VkSW5SZWN0KENGWF9GbG9hdFJlY3QgcmVjdCwgQ0ZYX0Zsb2F0UmVjdCBMaW5rUmVjdCkKQEAgLTEzNzAsMTIgKzEzNzAsMTIgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6YWRkSWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6YWRkSWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBDRlhfV2lkZVN0cmluZyBzd0ljb25OYW1lID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwpAQCAtMTM4NCwxMyArMTM4NCwxMyBAQAogICAgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKICAgICBpZiAoSlNfR2V0T2JqRGVmbklEKHBKU0ljb24pICE9IEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiSWNvbiIpKSB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVFlQRUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgQ0pTX0VtYmVkT2JqKiBwRW1iZWRPYmogPSBwYXJhbXNbMV0uVG9DSlNPYmplY3QoKS0+R2V0RW1iZWRPYmplY3QoKTsKICAgICBpZiAoIXBFbWJlZE9iaikgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1RZUEVFUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIEljb24qIHBJY29uID0gKEljb24qKXBFbWJlZE9iajsKQEAgLTE0MDIsMjEgKzE0MDIsMjEgQEAKICAgICBwTmV3SWNvbi0+TmV4dEljb24gPSBOVUxMOwogICAgIHBOZXdJY29uLT5JY29uU3RyZWFtID0gcEljb247CiAgICAgbV9wSWNvblRyZWUtPkluc2VydEljb25FbGVtZW50KHBOZXdJY29uKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6aWNvbnMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6aWNvbnMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkgewogICAgICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDSlNfQ29udGV4dCo+KGNjKTsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSRUFET05MWSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGlmICghbV9wSWNvblRyZWUpCiAgICAgewogICAgICAgICB2cC5TZXROdWxsKCk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBDSlNfQXJyYXkgSWNvbnMobV9pc29sYXRlKTsKQEAgLTE0MzEsMTMgKzE0MzEsMTMgQEAKICAgICAgICAgcEljb25FbGVtZW50ID0gKCptX3BJY29uVHJlZSlbaV07CiAKICAgICAgICAgSlNGWE9iamVjdCAgcE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIHBDb250ZXh0LCBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkljb24iKSk7Ci0gICAgICAgIGlmIChwT2JqLklzRW1wdHkoKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAocE9iai5Jc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDSlNfSWNvbiAqIHBKU19JY29uID0gKENKU19JY29uICopSlNfR2V0UHJpdmF0ZShwT2JqKTsKLSAgICAgICAgaWYgKCFwSlNfSWNvbikgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBKU19JY29uKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgSWNvbiogcEljb24gPSAoSWNvbiopcEpTX0ljb24tPkdldEVtYmVkT2JqZWN0KCk7Ci0gICAgICAgIGlmICghcEljb24pcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBJY29uKXJldHVybiBmYWxzZTsKIAogICAgICAgICBwSWNvbi0+U2V0U3RyZWFtKHBJY29uRWxlbWVudC0+SWNvblN0cmVhbS0+R2V0U3RyZWFtKCkpOwogICAgICAgICBwSWNvbi0+U2V0SWNvbk5hbWUocEljb25FbGVtZW50LT5JY29uTmFtZSk7CkBAIC0xNDQ1LDE5ICsxNDQ1LDE5IEBACiAgICAgfQogCiAgICAgdnAgPDwgSWNvbnM7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmdldEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmdldEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKICAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGlmKCFtX3BJY29uVHJlZSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dJY29uTmFtZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKICAgICBpbnQgaUljb25Db3VudHMgPSBtX3BJY29uVHJlZS0+R2V0TGVuZ3RoKCk7CiAKQEAgLTE0NzAsODIgKzE0NzAsODIgQEAKICAgICAgICAgICAgIEljb24qIHBSZXRJY29uID0gKCptX3BJY29uVHJlZSlbaV0tPkljb25TdHJlYW07CiAKICAgICAgICAgICAgIEpTRlhPYmplY3QgIHBPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBwQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJJY29uIikpOwotICAgICAgICAgICAgaWYgKHBPYmouSXNFbXB0eSgpKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBpZiAocE9iai5Jc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKIAogICAgICAgICAgICAgQ0pTX0ljb24gKiBwSlNfSWNvbiA9IChDSlNfSWNvbiAqKUpTX0dldFByaXZhdGUocE9iaik7Ci0gICAgICAgICAgICBpZiAoIXBKU19JY29uKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBpZiAoIXBKU19JY29uKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgICAgIEljb24qIHBJY29uID0gKEljb24qKXBKU19JY29uLT5HZXRFbWJlZE9iamVjdCgpOwotICAgICAgICAgICAgaWYgKCFwSWNvbilyZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBpZiAoIXBJY29uKXJldHVybiBmYWxzZTsKIAogICAgICAgICAgICAgcEljb24tPlNldEljb25OYW1lKHN3SWNvbk5hbWUpOwogICAgICAgICAgICAgcEljb24tPlNldFN0cmVhbShwUmV0SWNvbi0+R2V0U3RyZWFtKCkpOwogICAgICAgICAgICAgdlJldCA9IHBKU19JY29uOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OnJlbW92ZUljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OnJlbW92ZUljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgLy8gVW5zYWZlLCBubyBzdXBwb3J0ZWQuCi0gIHJldHVybiBUUlVFOworICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Y3JlYXRlRGF0YU9iamVjdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Y3JlYXRlRGF0YU9iamVjdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAvLyBVbnNhZmUsIG5vdCBpbXBsZW1lbnRlZC4KLSAgcmV0dXJuIFRSVUU7CisgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjptZWRpYShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjptZWRpYShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmNhbGN1bGF0ZU5vdyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Y2FsY3VsYXRlTm93KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKCEobV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkgfHwKICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0FOTk9UX0ZPUk0pIHx8Ci0gICAgICAgIG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9GSUxMX0ZPUk0pKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRklMTF9GT1JNKSkpIHJldHVybiBmYWxzZTsKIAogICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CiAgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CiAgICAgcEludGVyRm9ybS0+T25DYWxjdWxhdGUoKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Q29sbGFiKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OkNvbGxhYihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmdldFBhZ2VOdGhXb3JkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpnZXRQYWdlTnRoV29yZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAotICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgaW50IG5QYWdlTm8gPSBwYXJhbXMuR2V0U2l6ZSgpID4gMCA/IHBhcmFtc1swXS5Ub0ludCgpIDogMDsKICAgICBpbnQgbldvcmRObyA9IHBhcmFtcy5HZXRTaXplKCkgPiAxID8gcGFyYW1zWzFdLlRvSW50KCkgOiAwOwogICAgIGJvb2wgYlN0cmlwID0gcGFyYW1zLkdldFNpemUoKSA+IDIgPyBwYXJhbXNbMl0uVG9Cb29sKCkgOiB0cnVlOwogCiAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCk7Ci0gICAgaWYgKCFwRG9jdW1lbnQpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIXBEb2N1bWVudCkgcmV0dXJuIGZhbHNlOwogCiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CiAgICAgaWYgKG5QYWdlTm8gPCAwIHx8IG5QYWdlTm8gPj0gcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSkKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVkFMVUVFUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcERvY3VtZW50LT5HZXRQYWdlKG5QYWdlTm8pOwotICAgIGlmICghcFBhZ2VEaWN0KSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFwUGFnZURpY3QpIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfUGFnZSBwYWdlOwogICAgIHBhZ2UuTG9hZChwRG9jdW1lbnQsIHBQYWdlRGljdCk7CkBAIC0xNTg0LDIzICsxNTg0LDIzIEBACiAgICAgfQogCiAgICAgdlJldCA9IHN3UmV0LmNfc3RyKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmdldFBhZ2VOdGhXb3JkUXVhZHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmdldFBhZ2VOdGhXb3JkUXVhZHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKLSAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUykpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUykpIHJldHVybiBmYWxzZTsKIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmdldFBhZ2VOdW1Xb3JkcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Z2V0UGFnZU51bVdvcmRzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRVhUUkFDVF9BQ0NFU1MpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRVhUUkFDVF9BQ0NFU1MpKSByZXR1cm4gZmFsc2U7CiAKICAgICBpbnQgblBhZ2VObyA9IHBhcmFtcy5HZXRTaXplKCkgPiAwID8gcGFyYW1zWzBdLlRvSW50KCkgOiAwOwogCkBAIC0xNjExLDExICsxNjExLDExIEBACiAgICAgaWYgKG5QYWdlTm8gPCAwIHx8IG5QYWdlTm8gPj0gcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSkKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVkFMVUVFUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcERvY3VtZW50LT5HZXRQYWdlKG5QYWdlTm8pOwotICAgIGlmICghcFBhZ2VEaWN0KSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFwUGFnZURpY3QpIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfUGFnZSBwYWdlOwogICAgIHBhZ2UuTG9hZChwRG9jdW1lbnQsIHBQYWdlRGljdCk7CkBAIC0xNjQwLDEwICsxNjQwLDEwIEBACiAKICAgICB2UmV0ID0gbldvcmRzOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmdldFByaW50UGFyYW1zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpnZXRQcmludFBhcmFtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwpAQCAtMTY1Miw3ICsxNjUyLDcgQEAKICAgICAvLyBOb3QgaW1wbGVtZW50ZWQgeWV0LgogCiAgICAgdlJldCA9IHBSZXRPYmo7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKICNkZWZpbmUgSVNMQVRJTldPUkQodSkgICh1ICE9IDB4MjAgJiYgdSA8PSAweDI4RkYpCkBAIC0xNjY2LDcgKzE2NjYsNyBAQAogICAgIENQREZfRm9udCogcEZvbnQgPSBwVGV4dE9iai0+R2V0Rm9udCgpOwogICAgIGlmICghcEZvbnQpIHJldHVybiAwOwogCi0gICAgRlhfQk9PTCBiSXNMYXRpbiA9IEZBTFNFOworICAgIGJvb2wgYklzTGF0aW4gPSBmYWxzZTsKIAogICAgIGZvciAoaW50IGk9MCwgc3o9cFRleHRPYmotPkNvdW50Q2hhcnMoKTsgaTxzejsgaSsrKQogICAgIHsKQEAgLTE3MDEsNyArMTcwMSw3IEBACiAgICAgaWYgKCFwRm9udCkgcmV0dXJuIEwiIjsKIAogICAgIGludCBuV29yZHMgPSAwOwotICAgIEZYX0JPT0wgYklzTGF0aW4gPSBGQUxTRTsKKyAgICBib29sIGJJc0xhdGluID0gZmFsc2U7CiAKICAgICBmb3IgKGludCBpPTAsIHN6PXBUZXh0T2JqLT5Db3VudENoYXJzKCk7IGk8c3o7IGkrKykKICAgICB7CkBAIC0xNzMyLDEwICsxNzMyLDEwIEBACiAgICAgcmV0dXJuIHN3UmV0OwogfQogCi1GWF9CT09MIERvY3VtZW50Ojp6b29tKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6Onpvb20oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8qKgpAQCAtMTc0OCwzOSArMTc0OCwzOSBAQAogKHJlZlcsICBSZWZsb3dXaWR0aCkKICovCiAKLUZYX0JPT0wgRG9jdW1lbnQ6Onpvb21UeXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6Onpvb21UeXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6ZGVsZXRlUGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmRlbGV0ZVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgIC8vIFVuc2FmZSwgbm8gc3VwcG9ydGVkLgotICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmV4dHJhY3RQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6ZXh0cmFjdFBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIFRSVUU7CisgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjppbnNlcnRQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6aW5zZXJ0UGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OnJlcGxhY2VQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6cmVwbGFjZVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIFRSVUU7CisgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpnZXRVUkwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmdldFVSTChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiBUUlVFOworICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBEb2N1bWVudDo6QWRkRGVsYXlEYXRhKENKU19EZWxheURhdGEqIHBEYXRhKQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9GaWVsZC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ZpZWxkLmNwcAppbmRleCA2MTQ4NDM0Li5jYTE2YzkwIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ZpZWxkLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ZpZWxkLmNwcApAQCAtMTEwLDcgKzExMCw3IEBACiAKIElNUExFTUVOVF9KU19DTEFTUyhDSlNfRmllbGQsIEZpZWxkKQogCi1GWF9CT09MIENKU19GaWVsZDo6SW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKQorYm9vbCBDSlNfRmllbGQ6OkluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYykKIHsKICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTEyMCwxNSArMTIwLDE1IEBACiAKICAgICBwRmllbGQtPlNldElzb2xhdGUocENvbnRleHQtPkdldEpTUnVudGltZSgpLT5HZXRJc29sYXRlKCkpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9OwogCiBGaWVsZDo6RmllbGQoQ0pTX09iamVjdCogcEpTT2JqZWN0KTogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCksCiAgICAgbV9wSlNEb2MoTlVMTCksCiAgICAgbV9wRG9jdW1lbnQoTlVMTCksCiAgICAgbV9uRm9ybUNvbnRyb2xJbmRleCgtMSksCi0gICAgbV9iQ2FuU2V0KEZBTFNFKSwKLSAgICBtX2JEZWxheShGQUxTRSksCisgICAgbV9iQ2FuU2V0KGZhbHNlKSwKKyAgICBtX2JEZWxheShmYWxzZSksCiAgICAgbV9pc29sYXRlKE5VTEwpCiB7CiB9CkBAIC0xNjgsNyArMTY4LDcgQEAKICAgICBzdHJGaWVsZE5hbWUgPSBzdHJGaWVsZE5hbWVQYXJzZWQuc3Vic3RyKDAsaVN0YXJ0KTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6QXR0YWNoRmllbGQoRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKQorYm9vbCBGaWVsZDo6QXR0YWNoRmllbGQoRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKQogewogICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAgICAgbV9wSlNEb2MgPSBwRG9jdW1lbnQ7CkBAIC0xOTQsMTcgKzE5NCwxNyBAQAogICAgICAgICBzdGQ6OndzdHJpbmcgc3RyRmllbGROYW1lOwogICAgICAgICBpbnQgaUNvbnRyb2xObyA9IC0xOwogICAgICAgICBQYXJzZUZpZWxkTmFtZShzd0ZpZWxkTmFtZVRlbXAuY19zdHIoKSwgc3RyRmllbGROYW1lLCBpQ29udHJvbE5vKTsKLSAgICAgICAgaWYgKGlDb250cm9sTm8gPT0gLTEpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKGlDb250cm9sTm8gPT0gLTEpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBtX0ZpZWxkTmFtZSA9IHN0ckZpZWxkTmFtZS5jX3N0cigpOwogICAgICAgICBtX25Gb3JtQ29udHJvbEluZGV4ID0gaUNvbnRyb2xObzsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIG1fRmllbGROYW1lID0gc3dGaWVsZE5hbWVUZW1wOwogICAgIG1fbkZvcm1Db250cm9sSW5kZXggPSAtMTsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpHZXRGb3JtRmllbGRzKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lLCBDRlhfUHRyQXJyYXkmIEZpZWxkQXJyYXkpCkBAIC0yMzQsNyArMjM0LDcgQEAKIH0KIAogdm9pZCBGaWVsZDo6VXBkYXRlRm9ybUZpZWxkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhbmdlTWFyaywgRlhfQk9PTCBiUmVzZXRBUCwgRlhfQk9PTCBiUmVmcmVzaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDaGFuZ2VNYXJrLCBib29sIGJSZXNldEFQLCBib29sIGJSZWZyZXNoKQogewogICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CkBAIC0yNTUsMTIgKzI1NSwxMiBAQAogICAgICAgICAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0Kil3aWRnZXRzLkdldEF0KGkpOwogICAgICAgICAgICAgICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwogCi0gICAgICAgICAgICAgICAgRlhfQk9PTCBiRm9ybWF0ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBib29sIGJGb3JtYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHBXaWRnZXQtPk9uRm9ybWF0KGJGb3JtYXRlZCk7CiAgICAgICAgICAgICAgICAgaWYgKGJGb3JtYXRlZCkKLSAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKHNWYWx1ZS5jX3N0cigpLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShzVmFsdWUuY19zdHIoKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlCkBAIC0yNzAsNyArMjcwLDcgQEAKICAgICAgICAgICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopd2lkZ2V0cy5HZXRBdChpKTsKICAgICAgICAgICAgICAgICBBU1NFUlQocFdpZGdldCAhPSBOVUxMKTsKIAotICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShOVUxMLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI5NSw3ICsyOTUsNyBAQAogfQogCiB2b2lkIEZpZWxkOjpVcGRhdGVGb3JtQ29udHJvbChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFuZ2VNYXJrLCBGWF9CT09MIGJSZXNldEFQLCBGWF9CT09MIGJSZWZyZXNoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoYW5nZU1hcmssIGJvb2wgYlJlc2V0QVAsIGJvb2wgYlJlZnJlc2gpCiB7CiAgICAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKICAgICBBU1NFUlQocEZvcm1Db250cm9sICE9IE5VTEwpOwpAQCAtMzEyLDE2ICszMTIsMTYgQEAKICAgICAgICAgICAgIGludCBuRmllbGRUeXBlID0gcFdpZGdldC0+R2V0RmllbGRUeXBlKCk7CiAgICAgICAgICAgICBpZiAobkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZvcm1hdGVkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYm9vbCBiRm9ybWF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBwV2lkZ2V0LT5PbkZvcm1hdChiRm9ybWF0ZWQpOwogICAgICAgICAgICAgICAgIGlmIChiRm9ybWF0ZWQpCi0gICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShzVmFsdWUuY19zdHIoKSwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2Uoc1ZhbHVlLmNfc3RyKCksIGZhbHNlKTsKICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShOVUxMLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShOVUxMLCBmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UoTlVMTCwgZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTM1MCwxNyArMzUwLDE3IEBACiAgICAgcmV0dXJuIHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpOwogfQogCi1GWF9CT09MIEZpZWxkOjpWYWx1ZUlzT2NjdXIoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwpCitib29sIEZpZWxkOjpWYWx1ZUlzT2NjdXIoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwpCiB7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICBmb3IgKGludCBpPTAsc3ogPSBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKTsgaSA8IHN6OyBpKyspCiAgICAgewogICAgICAgICBpZiAoY3NPcHRMYWJlbC5Db21wYXJlKHBGb3JtRmllbGQtPkdldE9wdGlvbkxhYmVsKGkpKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBDUERGX0Zvcm1Db250cm9sKiBGaWVsZDo6R2V0U21hcnRGaWVsZENvbnRyb2woQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQpCkBAIC0zNzYsMTMgKzM3NiwxMyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb3BlcnR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotRlhfQk9PTCBGaWVsZDo6YWxpZ25tZW50KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OmFsaWdubWVudChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDRlhfQnl0ZVN0cmluZyBhbGlnblN0cjsKICAgICAgICAgdnAgPj4gYWxpZ25TdHI7CkBAIC00MDAsMTYgKzQwMCwxNiBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIHN3aXRjaCAocEZvcm1Db250cm9sLT5HZXRDb250cm9sQWxpZ25tZW50KCkpCiAgICAgICAgIHsKQEAgLTQyNyw3ICs0MjcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldEFsaWdubWVudChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsCkBAIC00MzYsMTMgKzQzNiwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6Ym9yZGVyU3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6Ym9yZGVyU3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyVHlwZSA9ICIiOwogICAgICAgICB2cCA+PiBzdHJUeXBlOwpAQCAtNDYwLDEzICs0NjAsMTMgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0gICAgICAgIGlmICghcEZvcm1GaWVsZCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBGb3JtRmllbGQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IEdldFdpZGdldChtX3BEb2N1bWVudCwgR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCkpOwotICAgICAgICBpZiAoIXBXaWRnZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFwV2lkZ2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaW50IG5Cb3JkZXJzdHlsZSA9IHBXaWRnZXQtPkdldEJvcmRlclN0eWxlKCk7CiAKQEAgLTQ5Myw3ICs0OTMsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldEJvcmRlclN0eWxlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwKQEAgLTUyNSw3ICs1MjUsNyBAQAogCiAgICAgICAgIGlmIChuQ29udHJvbEluZGV4IDwgMCkKICAgICAgICAgewotICAgICAgICAgICAgRlhfQk9PTCBiU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBib29sIGJTZXQgPSBmYWxzZTsKICAgICAgICAgICAgIGZvciAoaW50IGo9MCxqc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGo8anN6OyBqKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gR2V0V2lkZ2V0KHBEb2N1bWVudCwgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChqKSkpCkBAIC01MzMsMTEgKzUzMywxMSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAocFdpZGdldC0+R2V0Qm9yZGVyU3R5bGUoKSAhPSBuQm9yZGVyU3R5bGUpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEJvcmRlclN0eWxlKG5Cb3JkZXJTdHlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJTZXQpIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIFRSVUUsIFRSVUUpOworICAgICAgICAgICAgaWYgKGJTZXQpIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIHRydWUsIHRydWUsIHRydWUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtNTQ5LDcgKzU0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRCb3JkZXJTdHlsZSgpICE9IG5Cb3JkZXJTdHlsZSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0Qm9yZGVyU3R5bGUobkJvcmRlclN0eWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKHBEb2N1bWVudCwgcEZvcm1Db250cm9sLCBUUlVFLCBUUlVFLCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKHBEb2N1bWVudCwgcEZvcm1Db250cm9sLCB0cnVlLCB0cnVlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTU1NywxMyArNTU3LDEzIEBACiAgICAgfQogfQogCi1GWF9CT09MIEZpZWxkOjpidXR0b25BbGlnblgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6YnV0dG9uQWxpZ25YKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBuVlA7CiAgICAgICAgIHZwID4+IG5WUDsKQEAgLTU4MSwxNiArNTgxLDE2IEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9JY29uRml0IEljb25GaXQgPSBwRm9ybUNvbnRyb2wtPkdldEljb25GaXQoKTsKIApAQCAtNjAwLDcgKzYwMCw3IEBACiAgICAgICAgIHZwIDw8IChpbnQzMl90KWZMZWZ0OwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRCdXR0b25BbGlnblgoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQpAQCAtNjA4LDEzICs2MDgsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OmJ1dHRvbkFsaWduWShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpidXR0b25BbGlnblkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaW50IG5WUDsKICAgICAgICAgdnAgPj4gblZQOwpAQCAtNjMyLDE2ICs2MzIsMTYgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0ljb25GaXQgSWNvbkZpdCA9IHBGb3JtQ29udHJvbC0+R2V0SWNvbkZpdCgpOwogCkBAIC02NTEsNyArNjUxLDcgQEAKICAgICAgICAgdnAgPDwgIChpbnQzMl90KWZCb3R0b207CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldEJ1dHRvbkFsaWduWShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCkBAIC02NTksMTMgKzY1OSwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6YnV0dG9uRml0Qm91bmRzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OmJ1dHRvbkZpdEJvdW5kcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtNjgzLDIyICs2ODMsMjIgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0ljb25GaXQgSWNvbkZpdCA9IHBGb3JtQ29udHJvbC0+R2V0SWNvbkZpdCgpOwogICAgICAgICB2cCA8PCBJY29uRml0LkdldEZpdHRpbmdCb3VuZHMoKTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0QnV0dG9uRml0Qm91bmRzKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKQpAQCAtNzA2LDEzICs3MDYsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OmJ1dHRvblBvc2l0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OmJ1dHRvblBvc2l0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBuVlA7CiAgICAgICAgIHZwID4+IG5WUDsKQEAgLTczMCwyMCArNzMwLDIwIEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gZmFsc2U7CiAKICAgICAgICAgdnAgPDwgIHBGb3JtQ29udHJvbC0+R2V0VGV4dFBvc2l0aW9uKCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRCdXR0b25Qb3NpdGlvbihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCkBAIC03NTEsMTMgKzc1MSwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6YnV0dG9uU2NhbGVIb3coSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6YnV0dG9uU2NhbGVIb3coSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaW50IG5WUDsKICAgICAgICAgdnAgPj4gblZQOwpAQCAtNzc1LDE2ICs3NzUsMTYgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9JY29uRml0IEljb25GaXQgPSBwRm9ybUNvbnRyb2wtPkdldEljb25GaXQoKTsKICAgICAgICAgaWYgKEljb25GaXQuSXNQcm9wb3J0aW9uYWxTY2FsZSgpKQpAQCAtNzkzLDcgKzc5Myw3IEBACiAgICAgICAgICAgICB2cCA8PCAoaW50MzJfdCkxOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRCdXR0b25TY2FsZUhvdyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCkBAIC04MDEsMTMgKzgwMSwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6YnV0dG9uU2NhbGVXaGVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OmJ1dHRvblNjYWxlV2hlbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpbnQgblZQOwogICAgICAgICB2cCA+PiBuVlA7CkBAIC04MjUsMTYgKzgyNSwxNiBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKSBGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfSWNvbkZpdCBJY29uRml0ID0gcEZvcm1Db250cm9sLT5HZXRJY29uRml0KCk7CiAgICAgICAgIGludCBTY2FsZU0gPSBJY29uRml0LkdldFNjYWxlTWV0aG9kKCk7CkBAIC04NTUsNyArODU1LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRCdXR0b25TY2FsZVdoZW4oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQpAQCAtODYzLDEzICs4NjMsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OmNhbGNPcmRlckluZGV4KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OmNhbGNPcmRlckluZGV4KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBuVlA7CiAgICAgICAgIHZwID4+IG5WUDsKQEAgLTg4NywxMyArODg3LDEzIEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NPTUJPQk9YICYmIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERlNES19JbnRlckZvcm0qIHBSREludGVyRm9ybSA9IG1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKICAgICAgICAgQVNTRVJUKHBSREludGVyRm9ybSAhPSBOVUxMKTsKQEAgLTkwNCw3ICs5MDQsNyBAQAogICAgICAgICB2cCA8PCAoaW50MzJfdClwSW50ZXJGb3JtLT5GaW5kRmllbGRJbkNhbGN1bGF0aW9uT3JkZXIocEZvcm1GaWVsZCk7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldENhbGNPcmRlckluZGV4KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcikKQEAgLTkxMiwxMyArOTEyLDEzIEBACiAgICAgLy9Ob3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjpjaGFyTGltaXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6Y2hhckxpbWl0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBuVlA7CiAgICAgICAgIHZwID4+IG5WUDsKQEAgLTkzNiwxNyArOTM2LDE3IEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICB2cCA8PCAoaW50MzJfdClwRm9ybUZpZWxkLT5HZXRNYXhMZW4oKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldENoYXJMaW1pdChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCkBAIC05NTQsMTMgKzk1NCwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6Y29tYihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpjb21iKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGJvb2wgYlZQOwogICAgICAgICB2cCA+PiBiVlA7CkBAIC05NzgsMTMgKzk3OCwxMyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0NPTUIpCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtOTkyLDcgKzk5Miw3IEBACiAgICAgICAgICAgICB2cCA8PCBmYWxzZTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0Q29tYihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYikKQEAgLTEwMDAsMTMgKzEwMDAsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OmNvbW1pdE9uU2VsQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OmNvbW1pdE9uU2VsQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGJvb2wgYlZQOwogICAgICAgICB2cCA+PiBiVlA7CkBAIC0xMDI0LDEzICsxMDI0LDEzIEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1ggJiYgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0xJU1RCT1gpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19DT01NSVRPTlNFTENIQU5HRSkKICAgICAgICAgICAgIHZwIDw8IHRydWU7CkBAIC0xMDM4LDcgKzEwMzgsNyBAQAogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldENvbW1pdE9uU2VsQ2hhbmdlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKQpAQCAtMTA0NiwxMyArMTA0NiwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6Y3VycmVudFZhbHVlSW5kaWNlcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpjdXJyZW50VmFsdWVJbmRpY2VzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENGWF9EV29yZEFycmF5IGFycmF5OwogCkBAIC0xMDg5LDEzICsxMDg5LDEzIEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1ggJiYgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0xJU1RCT1gpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID09IDEpCiAgICAgICAgICAgICB2cCA8PCBwRm9ybUZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KDApOwpAQCAtMTExMiw3ICsxMTEyLDcgQEAKICAgICAgICAgICAgIHZwIDw8IC0xOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRDdXJyZW50VmFsdWVJbmRpY2VzKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwKQEAgLTExMzIsNyArMTEzMiw3IEBACiAgICAgICAgIGlmIChuRmllbGRUeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCB8fCBuRmllbGRUeXBlID09IEZJRUxEVFlQRV9MSVNUQk9YKQogICAgICAgICB7CiAgICAgICAgICAgICBGWF9EV09SRCBkd0ZpZWxkRmxhZ3MgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCk7Ci0gICAgICAgICAgICBwRm9ybUZpZWxkLT5DbGVhclNlbGVjdGlvbihUUlVFKTsKKyAgICAgICAgICAgIHBGb3JtRmllbGQtPkNsZWFyU2VsZWN0aW9uKHRydWUpOwogCiAgICAgICAgICAgICBmb3IgKGludCBpPTAsc3o9YXJyYXkuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCiAgICAgICAgICAgICB7CkBAIC0xMTQzLDIyICsxMTQzLDIyIEBACiAKICAgICAgICAgICAgICAgICBpbnQgaVNlbGVjdGluZyA9IChpbnQzMl90KWFycmF5LkdldEF0KGkpOwogICAgICAgICAgICAgICAgIGlmIChpU2VsZWN0aW5nIDwgcEZvcm1GaWVsZC0+Q291bnRPcHRpb25zKCkgJiYgIXBGb3JtRmllbGQtPklzSXRlbVNlbGVjdGVkKGlTZWxlY3RpbmcpKQotICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGlTZWxlY3RpbmcsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGlTZWxlY3RpbmcsIHRydWUpOwogCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBUUlVFLCBUUlVFKTsKKyAgICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIHRydWUsIHRydWUsIHRydWUpOwogICAgICAgICB9CiAgICAgfQogfQogCi1GWF9CT09MIEZpZWxkOjpkZWZhdWx0U3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6ZGVmYXVsdFN0eWxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICAvLyBNUUcgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19OT1RTVVBQT1JUKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICA7CiAgICAgfQpAQCAtMTE2Niw3ICsxMTY2LDcgQEAKICAgICB7CiAgICAgICAgIDsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldERlZmF1bHRTdHlsZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgpCkBAIC0xMTc0LDEzICsxMTc0LDEzIEBACiAgICAgLy9Ob3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjpkZWZhdWx0VmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6ZGVmYXVsdFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENGWF9XaWRlU3RyaW5nIFdpZGVTdHI7CiAgICAgICAgIHZwID4+IFdpZGVTdHI7CkBAIC0xMTk4LDE4ICsxMTk4LDE4IEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUFVTSEJVVFRPTiB8fAogICAgICAgICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1NJR05BVFVSRSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICB2cCA8PCBwRm9ybUZpZWxkLT5HZXREZWZhdWx0VmFsdWUoKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldERlZmF1bHRWYWx1ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsCkBAIC0xMjE4LDEzICsxMjE4LDEzIEBACiAgICAgLy9Ob3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjpkb05vdFNjcm9sbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpkb05vdFNjcm9sbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtMTI0MiwxMyArMTI0MiwxMyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0RPTk9UU0NST0xMKQogICAgICAgICAgICAgdnAgPDwgdHJ1ZTsKQEAgLTEyNTYsNyArMTI1Niw3IEBACiAgICAgICAgICAgICB2cCA8PCBmYWxzZTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0RG9Ob3RTY3JvbGwoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpCkBAIC0xMjY0LDEzICsxMjY0LDEzIEBACiAgICAgLy9Ob3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjpkb05vdFNwZWxsQ2hlY2soSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6ZG9Ob3RTcGVsbENoZWNrKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGJvb2wgYlZQOwogICAgICAgICB2cCA+PiBiVlA7CkBAIC0xMjc5LDE0ICsxMjc5LDE0IEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEICYmCiAgICAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1gpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19ET05PVFNQRUxMQ0hFQ0spCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtMTI5NCwxMCArMTI5NCwxMCBAQAogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgRmllbGQ6OlNldERlbGF5KEZYX0JPT0wgYkRlbGF5KQordm9pZCBGaWVsZDo6U2V0RGVsYXkoYm9vbCBiRGVsYXkpCiB7CiAgICAgbV9iRGVsYXkgPSBiRGVsYXk7CiAKQEAgLTEzMDgsMTEgKzEzMDgsMTEgQEAKICAgICB9CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmRlbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OmRlbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGJvb2wgYlZQOwogICAgICAgICB2cCA+PiBiVlA7CkBAIC0xMzIzLDE2ICsxMzIzLDE2IEBACiAgICAgewogICAgICAgICB2cCA8PCBtX2JEZWxheTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmRpc3BsYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6ZGlzcGxheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpbnQgblZQOwogICAgICAgICB2cCA+PiBuVlA7CkBAIC0xMzUwLDcgKzEzNTAsNyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKQEAgLTEzNTksNyArMTM1OSw3IEBACiAgICAgICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwogCiAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKLSAgICAgICAgaWYgKCFwV2lkZ2V0KXJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFwV2lkZ2V0KXJldHVybiBmYWxzZTsKIAogICAgICAgICBGWF9EV09SRCBkd0ZsYWcgPSBwV2lkZ2V0LT5HZXRGbGFncygpOwogCkBAIC0xMzg3LDcgKzEzODcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldERpc3BsYXkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQpAQCAtMTQwNyw3ICsxNDA3LDcgQEAKIAogICAgICAgICBpZiAobkNvbnRyb2xJbmRleCA8IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOworICAgICAgICAgICAgYm9vbCBiU2V0ID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKGludCBqPTAsanN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBqPGpzejsgaisrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaik7CkBAIC0xNDQ1LDEyICsxNDQ1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChkd0ZsYWcgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChiU2V0KSBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBGQUxTRSwgVFJVRSk7CisgICAgICAgICAgICBpZiAoYlNldCkgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtMTQ4OSw3ICsxNDg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGR3RmxhZyAhPSBwV2lkZ2V0LT5HZXRGbGFncygpKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0LT5TZXRGbGFncyhkd0ZsYWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIEZBTFNFLCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKHBEb2N1bWVudCwgcEZvcm1Db250cm9sLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNDk3LDIxICsxNDk3LDIxIEBACiAgICAgfQogfQogCi1GWF9CT09MIEZpZWxkOjpkb2MoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6ZG9jKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAoIXZwLklzR2V0dGluZygpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICB2cCA8PCBtX3BKU0RvYy0+R2V0Q0pTRG9jKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmVkaXRhYmxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OmVkaXRhYmxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtMTUyMCwxMyArMTUyMCwxMyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DT01CT0JPWCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0VESVQpCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtMTUzNCwzMCArMTUzNCwzMCBAQAogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmV4cG9ydFZhbHVlcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpleHBvcnRWYWx1ZXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7CiAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ0hFQ0tCT1ggJiYKICAgICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7CiAgICAgICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGlmICghdnAuSXNBcnJheU9iamVjdCgpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBlbHNlCiAgICAgewpAQCAtMTU3MywzNiArMTU3MywzNiBAQAogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChtX25Gb3JtQ29udHJvbEluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG1fbkZvcm1Db250cm9sSW5kZXgpOwogICAgICAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICAgICAgRXhwb3J0VmFsdXNBcnJheS5TZXRFbGVtZW50KDAsIENKU19WYWx1ZShtX2lzb2xhdGUscEZvcm1Db250cm9sLT5HZXRFeHBvcnRWYWx1ZSgpLmNfc3RyKCkpKTsKICAgICAgICAgfQogICAgICAgICB2cCA8PCBFeHBvcnRWYWx1c0FycmF5OwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6ZmlsZVNlbGVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpmaWxlU2VsZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKICAgICAgICAgaWYgKCFtX2JDYW5TZXQpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgYm9vbCBiVlA7CiAgICAgICAgIHZwID4+IGJWUDsKQEAgLTE2MTQsMTAgKzE2MTQsMTAgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIEZpZWxkOjpmaWxsQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6ZmlsbENvbG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKQEAgLTE2MjYsMTUgKzE2MjYsMTUgQEAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewogICAgICAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpZiAoIXZwLklzQXJyYXlPYmplY3QoKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICB2cCA+PiBjckFycmF5OwogCkBAIC0xNjU2LDcgKzE2NTYsNyBAQAogCiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwogICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpbnQgaUNvbG9yVHlwZTsKICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRCYWNrZ3JvdW5kQ29sb3IoaUNvbG9yVHlwZSk7CkBAIC0xNjg0LDEzICsxNjg0LDEzIEBACiAgICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigzKSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGNvbG9yOjpDb252ZXJ0UFdMQ29sb3JUb0FycmF5KGNvbG9yLCBjckFycmF5KTsKICAgICAgICAgdnAgIDw8ICBjckFycmF5OwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRGaWxsQ29sb3IoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikKQEAgLTE2OTgsMTMgKzE2OTgsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OmhpZGRlbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpoaWRkZW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgYm9vbCBiVlA7CiAgICAgICAgIHZwID4+IGJWUDsKQEAgLTE3MjIsNyArMTcyMiw3IEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwpAQCAtMTczMSw3ICsxNzMxLDcgQEAKICAgICAgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQoR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCkpOwotICAgICAgICBpZiAoIXBXaWRnZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFwV2lkZ2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyA9IHBXaWRnZXQtPkdldEZsYWdzKCk7CiAKQEAgLTE3NDMsNyArMTc0Myw3IEBACiAgICAgICAgICAgICB2cCA8PCBmYWxzZTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0SGlkZGVuKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKQpAQCAtMTc2Myw3ICsxNzYzLDcgQEAKIAogICAgICAgICBpZiAobkNvbnRyb2xJbmRleCA8IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOworICAgICAgICAgICAgYm9vbCBiU2V0ID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKGludCBqPTAsanN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBqPGpzejsgaisrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUZpZWxkLT5HZXRDb250cm9sKGopKSkKQEAgLTE3ODcsMTMgKzE3ODcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGR3RmxhZ3MgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoYlNldCkKLSAgICAgICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBGQUxTRSwgVFJVRSk7CisgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtMTgyMSw3ICsxODIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGR3RmxhZ3MgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtQ29udHJvbChwRG9jdW1lbnQsIHBGb3JtQ29udHJvbCwgVFJVRSwgRkFMU0UsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIHRydWUsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTE4MjksMTMgKzE4MjksMTMgQEAKICAgICB9CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmhpZ2hsaWdodChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpoaWdobGlnaHQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyTW9kZTsKICAgICAgICAgdnAgPj4gc3RyTW9kZTsKQEAgLTE4NTMsMTYgKzE4NTMsMTYgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBlSE0gPSBwRm9ybUNvbnRyb2wtPkdldEhpZ2hsaWdodGluZ01vZGUoKTsKICAgICAgICAgc3dpdGNoIChlSE0pCkBAIC0xODg1LDcgKzE4ODUsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldEhpZ2hsaWdodChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpCkBAIC0xODkzLDEzICsxODkzLDEzIEBACiAgICAgLy9Ob3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjpsaW5lV2lkdGgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6bGluZVdpZHRoKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBpV2lkdGg7CiAgICAgICAgIHZwID4+IGlXaWR0aDsKQEAgLTE5MTcsMjYgKzE5MTcsMjYgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghcEZvcm1Db250cm9sKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKW1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKICAgICAgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CiAKLSAgICAgICAgaWYoIXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZighcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1GaWVsZC0+R2V0Q29udHJvbCgwKSk7Ci0gICAgICAgIGlmICghcFdpZGdldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBXaWRnZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICB2cCA8PCAoaW50MzJfdClwV2lkZ2V0LT5HZXRCb3JkZXJXaWR0aCgpOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRMaW5lV2lkdGgoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQpAQCAtMTk1Niw3ICsxOTU2LDcgQEAKIAogICAgICAgICBpZiAobkNvbnRyb2xJbmRleCA8IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOworICAgICAgICAgICAgYm9vbCBiU2V0ID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKGludCBqPTAsanN6PXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgajxqc3o7IGorKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGopOwpAQCAtMTk2NywxMSArMTk2NywxMSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyICE9IHBXaWRnZXQtPkdldEJvcmRlcldpZHRoKCkpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEJvcmRlcldpZHRoKG51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJTZXQpIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIFRSVUUsIFRSVUUpOworICAgICAgICAgICAgaWYgKGJTZXQpIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIHRydWUsIHRydWUsIHRydWUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtMTk4Myw3ICsxOTgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlciAhPSBwV2lkZ2V0LT5HZXRCb3JkZXJXaWR0aCgpKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0LT5TZXRCb3JkZXJXaWR0aChudW1iZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIFRSVUUsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIHRydWUsIHRydWUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTk5MSwxMyArMTk5MSwxMyBAQAogICAgIH0KIH0KIAotRlhfQk9PTCBGaWVsZDo6bXVsdGlsaW5lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6Om11bHRpbGluZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtMjAxNSwxMyArMjAxNSwxMyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19NVUxUSUxJTkUpCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtMjAyOSw3ICsyMDI5LDcgQEAKICAgICAgICAgICAgIHZwIDw8IGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRNdWx0aWxpbmUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpCkBAIC0yMDM3LDEzICsyMDM3LDEzIEBACiAgICAgLy9Ob3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjptdWx0aXBsZVNlbGVjdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjptdWx0aXBsZVNlbGVjdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtMjA2MSwxMyArMjA2MSwxMyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0xJU1RCT1gpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19NVUxUSVNFTEVDVCkKICAgICAgICAgICAgIHZwIDw8IHRydWU7CkBAIC0yMDc1LDcgKzIwNzUsNyBAQAogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldE11bHRpcGxlU2VsZWN0aW9uKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKQpAQCAtMjA4Myw0OSArMjA4Myw0OSBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6bmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpuYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICBpZiAoIXZwLklzR2V0dGluZygpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCF2cC5Jc0dldHRpbmcoKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgdnAgPDwgbV9GaWVsZE5hbWU7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6bnVtSXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6bnVtSXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1ggJiYKICAgICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0xJU1RCT1gpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgaWYgKCF2cC5Jc0dldHRpbmcoKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghdnAuSXNHZXR0aW5nKCkpIHJldHVybiBmYWxzZTsKIAogICAgIHZwIDw8IChpbnQzMl90KXBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnBhZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6cGFnZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgaWYgKCF2cC5Jc0dldHRpbmcoKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghdnAuSXNHZXR0aW5nKCkpIHJldHVybiBmYWxzZTsKIAogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICBpZiAoIXBGb3JtRmllbGQpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIXBGb3JtRmllbGQpIHJldHVybiBmYWxzZTsKIAogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIApAQCAtMjE0Niw3ICsyMTQ2LDcgQEAKIAogICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcFdpZGdldC0+R2V0UGFnZVZpZXcoKTsKICAgICAgICAgICAgIGlmKCFwUGFnZVZpZXcpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICAgICAgUGFnZUFycmF5LlNldEVsZW1lbnQoaSwgQ0pTX1ZhbHVlKG1faXNvbGF0ZSwoaW50MzJfdClwUGFnZVZpZXctPkdldFBhZ2VJbmRleCgpKSk7CiAgICAgICAgIH0KQEAgLTIxNTgsMTYgKzIxNTgsMTYgQEAKICAgICAgICAgdnAgPDwgKGludDMyX3QpIC0xOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIEZpZWxkOjpwYXNzd29yZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpwYXNzd29yZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtMjE4NSwxMyArMjE4NSwxMyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX1BBU1NXT1JEKQogICAgICAgICAgICAgdnAgPDwgdHJ1ZTsKQEAgLTIxOTksNyArMjE5OSw3IEBACiAgICAgICAgICAgICB2cCA8PCBmYWxzZTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0UGFzc3dvcmQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpCkBAIC0yMjA3LDcgKzIyMDcsNyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6cHJpbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6cHJpbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIApAQCAtMjIxNiwxMSArMjIxNiwxMSBAQAogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtMjIzMiw3ICsyMjMyLDcgQEAKIAogICAgICAgICAgICAgaWYgKG1fbkZvcm1Db250cm9sSW5kZXggPCAwKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJvb2wgYlNldCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MCxqc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGo8anN6OyBqKyspCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1GaWVsZC0+R2V0Q29udHJvbChqKSkpCkBAIC0yMjQ2LDE3ICsyMjQ2LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHdGbGFncyAhPSBwV2lkZ2V0LT5HZXRGbGFncygpKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEZsYWdzKGR3RmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGJTZXQpCi0gICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChtX3BEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgRkFMU0UsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQobV9wRG9jdW1lbnQsIHBGb3JtRmllbGQsIHRydWUsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihtX25Gb3JtQ29udHJvbEluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIGlmKG1fbkZvcm1Db250cm9sSW5kZXggPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2wobV9uRm9ybUNvbnRyb2xJbmRleCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKSkKQEAgLTIyNzAsNyArMjI3MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHdGbGFncyAhPSBwV2lkZ2V0LT5HZXRGbGFncygpKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEZsYWdzKGR3RmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKG1fcERvY3VtZW50LCBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG1fbkZvcm1Db250cm9sSW5kZXgpLCBUUlVFLCBGQUxTRSwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wobV9wRG9jdW1lbnQsIHBGb3JtRmllbGQtPkdldENvbnRyb2wobV9uRm9ybUNvbnRyb2xJbmRleCksIHRydWUsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTIyODMsNyArMjI4Myw3IEBACiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKLSAgICAgICAgaWYgKCFwV2lkZ2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghcFdpZGdldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRGbGFncygpICYgQU5OT1RGTEFHX1BSSU5UKQogICAgICAgICAgICAgdnAgPDwgdHJ1ZTsKQEAgLTIyOTEsMjAgKzIyOTEsMjAgQEAKICAgICAgICAgICAgIHZwIDw8IGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIEZpZWxkOjpyYWRpb3NJblVuaXNvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpyYWRpb3NJblVuaXNvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGJvb2wgYlZQOwogICAgICAgICB2cCA+PiBiVlA7CkBAIC0yMzE2LDcgKzIzMTYsNyBAQAogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUkFESU9TSU5VTklTT04pCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtMjMyNCwyMCArMjMyNCwyMCBAQAogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnJlYWRvbmx5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnJlYWRvbmx5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgYm9vbCBiVlA7CiAgICAgICAgIHZwID4+IGJWUDsKQEAgLTIzNTQsMTcgKzIzNTQsMTcgQEAKICAgICAgICAgICAgIHZwIDw8IGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIEZpZWxkOjpyZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnJlY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghdnAuSXNBcnJheU9iamVjdCgpKXJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCF2cC5Jc0FycmF5T2JqZWN0KCkpcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENKU19BcnJheSByY0FycmF5KG1faXNvbGF0ZSk7CiAgICAgICAgIHZwID4+IHJjQXJyYXk7CkBAIC0yMzk1LDcgKzIzOTUsNyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKQEAgLTI0MDQsNyArMjQwNCw3IEBACiAgICAgICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwogCiAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKLSAgICAgICAgaWYgKCFwV2lkZ2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghcFdpZGdldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENGWF9GbG9hdFJlY3QgY3JSZWN0ID0gcFdpZGdldC0+R2V0UmVjdCgpOwogICAgICAgICBDSlNfVmFsdWUgVXBwZXJfTGVmdHgobV9pc29sYXRlKSxVcHBlcl9MZWZ0eShtX2lzb2xhdGUpLExvd2VyX1JpZ2h0eChtX2lzb2xhdGUpLExvd2VyX1JpZ2h0eShtX2lzb2xhdGUpOwpAQCAtMjQyMiw3ICsyNDIyLDcgQEAKICAgICAgICAgdnAgIDw8ICByY0FycmF5OwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRSZWN0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ1BERl9SZWN0JiByZWN0KQpAQCAtMjQ0Miw3ICsyNDQyLDcgQEAKIAogICAgICAgICBpZiAobkNvbnRyb2xJbmRleCA8IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOworICAgICAgICAgICAgYm9vbCBiU2V0ID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKGludCBpPTAsIHN6PXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaTxzejsgaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaSk7CkBAIC0yNDY5LDEzICsyNDY5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JSZWN0LmJvdHRvbSAhPSByY09sZC5ib3R0b20pCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0UmVjdChjclJlY3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoYlNldCkgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgVFJVRSwgVFJVRSk7CisgICAgICAgICAgICBpZiAoYlNldCkgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC0yNTAzLDcgKzI1MDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyUmVjdC5ib3R0b20gIT0gcmNPbGQuYm90dG9tKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldFJlY3QoY3JSZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtQ29udHJvbChwRG9jdW1lbnQsIHBGb3JtQ29udHJvbCwgVFJVRSwgVFJVRSwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIHRydWUsIHRydWUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMjUxMiwxNyArMjUxMiwxNyBAQAogICAgIH0KIH0KIAotRlhfQk9PTCBGaWVsZDo6cmVxdWlyZWQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6cmVxdWlyZWQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogCiAgICAgICAgIGJvb2wgYlZQOwpAQCAtMjUzNSw3ICsyNTM1LDcgQEAKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUkVRVUlSRUQpCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtMjU0MywxNiArMjU0MywxNiBAQAogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnJpY2hUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnJpY2hUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGJvb2wgYlZQOwogICAgICAgICB2cCA+PiBiVlA7CkBAIC0yNTcwLDEzICsyNTcwLDEzIEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUklDSFRFWFQpCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtMjU4NCw3ICsyNTg0LDcgQEAKICAgICAgICAgICAgIHZwIDw8IGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRSaWNoVGV4dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYikKQEAgLTI1OTIsMTkgKzI1OTIsMTkgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OnJpY2hWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpyaWNoVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAgICAgICAgIDsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0UmljaFZhbHVlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCkKQEAgLTI2MTIsMTMgKzI2MTIsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OnJvdGF0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnJvdGF0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBuVlA7CiAgICAgICAgIHZwID4+IG5WUDsKQEAgLTI2MzYsMTggKzI2MzYsMTggQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIHZwIDw8IChpbnQzMl90KXBGb3JtQ29udHJvbC0+R2V0Um90YXRpb24oKTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0Um90YXRpb24oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQpAQCAtMjY1NSwxNSArMjY1NSwxNSBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6c3Ryb2tlQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6c3Ryb2tlQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgaWYgKCF2cC5Jc0FycmF5T2JqZWN0KCkpcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXZwLklzQXJyYXlPYmplY3QoKSlyZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0pTX0FycmF5IGNyQXJyYXkobV9pc29sYXRlKTsKICAgICAgICAgdnAgPj4gY3JBcnJheTsKQEAgLTI2ODQsMTMgKzI2ODQsMTMgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBpQ29sb3JUeXBlOwogICAgICAgICBwRm9ybUNvbnRyb2wtPkdldEJvcmRlckNvbG9yKGlDb2xvclR5cGUpOwpAQCAtMjcxOSwxNCArMjcxOSwxNCBAQAogICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigzKSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENKU19BcnJheSBjckFycmF5KG1faXNvbGF0ZSk7CiAgICAgICAgIGNvbG9yOjpDb252ZXJ0UFdMQ29sb3JUb0FycmF5KGNvbG9yLCBjckFycmF5KTsKICAgICAgICAgdnAgIDw8ICBjckFycmF5OwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRTdHJva2VDb2xvcihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKQpAQCAtMjczNCwxMyArMjczNCwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6c3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6c3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCQ2FwdGlvbjsKICAgICAgICAgdnAgPj4gY3NCQ2FwdGlvbjsKQEAgLTI3NTgsMTcgKzI3NTgsMTcgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9SQURJT0JVVFRPTiAmJgogICAgICAgICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NIRUNLQk9YKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzV0NhcHRpb24gPSBwRm9ybUNvbnRyb2wtPkdldE5vcm1hbENhcHRpb24oKTsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCQ2FwdGlvbjsKQEAgLTI3OTcsNyArMjc5Nyw3IEBACiAgICAgICAgIHZwIDw8IGNzQkNhcHRpb247CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldFN0eWxlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwKQEAgLTI4MDYsMjEgKzI4MDYsMjEgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OnN1Ym1pdE5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6c3VibWl0TmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnRleHRDb2xvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjp0ZXh0Q29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0pTX0FycmF5IGNyQXJyYXkobV9pc29sYXRlKTsKLSAgICAgICAgaWYgKCF2cC5Jc0FycmF5T2JqZWN0KCkpcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXZwLklzQXJyYXlPYmplY3QoKSlyZXR1cm4gZmFsc2U7CiAgICAgICAgIHZwID4+IGNyQXJyYXk7CiAKICAgICAgICAgQ1BXTF9Db2xvciBjb2xvcjsKQEAgLTI4MzksMTMgKzI4MzksMTMgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBpQ29sb3JUeXBlOwogICAgICAgICBGWF9BUkdCIGNvbG9yOwpAQCAtMjg2Niw3ICsyODY2LDcgQEAKICAgICAgICAgdnAgIDw8ICBjckFycmF5OwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRUZXh0Q29sb3IoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikKQEAgLTI4NzQsMTcgKzI4NzQsMTcgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OnRleHRGb250KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnRleHRGb250KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWU7CiAgICAgICAgIHZwID4+IGNzRm9udE5hbWU7Ci0gICAgICAgIGlmIChjc0ZvbnROYW1lLklzRW1wdHkoKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoY3NGb250TmFtZS5Jc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpZiAobV9iRGVsYXkpCiAgICAgICAgIHsKQEAgLTI4OTksMTMgKzI4OTksMTMgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBuRmllbGRUeXBlID0gcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCk7CiAKQEAgLTI5MTUsMTUgKzI5MTUsMTUgQEAKICAgICAgICAgICAgIG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkKICAgICAgICAgewogICAgICAgICAgICAgQ1BERl9Gb250ICogcEZvbnQgPSBwRm9ybUNvbnRyb2wtPkdldERlZmF1bHRDb250cm9sRm9udCgpOwotICAgICAgICAgICAgaWYgKCFwRm9udCkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgaWYgKCFwRm9udCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgICAgICB2cCA8PCBwRm9udC0+R2V0QmFzZUZvbnQoKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldFRleHRGb250KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZykKQEAgLTI5MzEsMTMgKzI5MzEsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OnRleHRTaXplKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnRleHRTaXplKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBuVlA7CiAgICAgICAgIHZwID4+IG5WUDsKQEAgLTI5NTUsMTMgKzI5NTUsMTMgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgRmllbGRBcHBlYXJhbmNlID0gcEZvcm1Db250cm9sLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOwogCkBAIC0yOTcyLDcgKzI5NzIsNyBAQAogICAgICAgICB2cCA8PCAoaW50KWZGb250U2l6ZTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0VGV4dFNpemUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQpAQCAtMjk4MCwxNSArMjk4MCwxNSBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6dHlwZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjp0eXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKLSAgICBpZiAoIXZwLklzR2V0dGluZygpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCF2cC5Jc0dldHRpbmcoKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CkBAIC0zMDI0LDE2ICszMDI0LDE2IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6dXNlck5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6dXNlck5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dOYW1lOwogICAgICAgICB2cCA+PiBzd05hbWU7CkBAIC0zMDUxLDcgKzMwNTEsNyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKQEAgLTMwNTksNyArMzA1OSw3IEBACiAgICAgICAgIHZwIDw8IChDRlhfV2lkZVN0cmluZylwRm9ybUZpZWxkLT5HZXRBbHRlcm5hdGVOYW1lKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldFVzZXJOYW1lKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZykKQEAgLTMwNjcsMTMgKzMwNjcsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OnZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENKU19XaWRlU3RyaW5nQXJyYXkgc3RyQXJyYXk7CiAKQEAgLTMxMDksNyArMzEwOSw3IEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwpAQCAtMzExOSwxNCArMzExOSwxNCBAQAogICAgICAgICBzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKQogICAgICAgICB7CiAgICAgICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOgogICAgICAgICBjYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dWYWx1ZSA9IHBGb3JtRmllbGQtPkdldFZhbHVlKCk7CiAKICAgICAgICAgICAgICAgICBkb3VibGUgZFJldDsKLSAgICAgICAgICAgICAgICBGWF9CT09MIGJEb3Q7CisgICAgICAgICAgICAgICAgYm9vbCBiRG90OwogICAgICAgICAgICAgICAgIGlmIChDSlNfUHVibGljTWV0aG9kczo6Q29udmVydFN0cmluZ1RvTnVtYmVyKHN3VmFsdWUuY19zdHIoKSwgZFJldCwgYkRvdCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoYkRvdCkKQEAgLTMxNjAsNyArMzE2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN3VmFsdWUgPSBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpOwogCiAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkUmV0OwotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEb3Q7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgYkRvdDsKICAgICAgICAgICAgICAgICAgICAgaWYgKENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoc3dWYWx1ZS5jX3N0cigpLCBkUmV0LCBiRG90KSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJEb3QpCkBAIC0zMTc2LDE0ICszMTc2LDE0IEBACiAgICAgICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgogICAgICAgICBjYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGWF9CT09MIGJGaW5kID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYm9vbCBiRmluZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwICwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgaSsrKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldENvbnRyb2woaSktPklzQ2hlY2tlZCgpKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKS0+R2V0RXhwb3J0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkUmV0OwotICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRG90OworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRG90OwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoc3dWYWx1ZS5jX3N0cigpLCBkUmV0LCBiRG90KSkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYkRvdCkKQEAgLTMxOTQsNyArMzE5NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnAgPDwgc3dWYWx1ZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYkZpbmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMzIxMCw3ICszMjEwLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRWYWx1ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKQEAgLTMyMzgsOCArMzIzOCw4IEBACiAgICAgICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0VmFsdWUoKSAhPSBzdHJBcnJheS5HZXRBdCgwKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBXaWRlU3RyaW5nID0gc3RyQXJyYXkuR2V0QXQoMCk7Ci0gICAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+U2V0VmFsdWUoc3RyQXJyYXkuR2V0QXQoMCksIFRSVUUpOwotICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIEZBTFNFLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRWYWx1ZShzdHJBcnJheS5HZXRBdCgwKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOiAvL21hbnRpczogMDAwNDQ5MwpAQCAtMzI0NywxNCArMzI0NywxNCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpICE9IHN0ckFycmF5LkdldEF0KDApKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+U2V0VmFsdWUoc3RyQXJyYXkuR2V0QXQoMCksIFRSVUUpOwotICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBGQUxTRSwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIHBGb3JtRmllbGQtPlNldFZhbHVlKHN0ckFycmF5LkdldEF0KDApLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEZJRUxEVFlQRV9MSVNUQk9YOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYm9vbCBiTW9kaWZpZWQgPSBmYWxzZTsKIAogICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MCxzej1zdHJBcnJheS5HZXRTaXplKCk7IGk8c3o7IGkrKykKICAgICAgICAgICAgICAgICB7CkBAIC0zMjYyLDIxICszMjYyLDIxIEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRm9ybUZpZWxkLT5Jc0l0ZW1TZWxlY3RlZChpSW5kZXgpKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiTW9kaWZpZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYk1vZGlmaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGJNb2RpZmllZCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBGb3JtRmllbGQtPkNsZWFyU2VsZWN0aW9uKFRSVUUpOworICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5DbGVhclNlbGVjdGlvbih0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wLHN6PXN0ckFycmF5LkdldFNpemUoKTsgaTxzejsgaSsrKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaUluZGV4ID0gcEZvcm1GaWVsZC0+RmluZE9wdGlvbihzdHJBcnJheS5HZXRBdChpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgVFJVRSwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBGQUxTRSwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIHRydWUsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTMyODYsMjUgKzMyODYsMjUgQEAKICAgICB9CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnZhbHVlQXNTdHJpbmcoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6dmFsdWVBc1N0cmluZyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgaWYgKCF2cC5Jc0dldHRpbmcoKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghdnAuSXNHZXR0aW5nKCkpIHJldHVybiBmYWxzZTsKIAogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1gpCiAgICAgewotICAgICAgICBpZighcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmKCFwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0Q29udHJvbCgwKS0+SXNDaGVja2VkKCkpCiAgICAgICAgICAgICB2cCA8PCBMIlllcyI7CkBAIC0zMzMxLDE4ICszMzMxLDE4IEBACiAgICAgZWxzZQogICAgICAgICB2cCA8PCBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCk7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUZYX0JPT0wgRmllbGQ6OmJyb3dzZUZvckZpbGVUb1N1Ym1pdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6YnJvd3NlRm9yRmlsZVRvU3VibWl0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwpAQCAtMzM1NywxNyArMzM1NywxNyBAQAogICAgICAgICBpZighd3NGaWxlTmFtZS5Jc0VtcHR5KCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHBGb3JtRmllbGQtPlNldFZhbHVlKHdzRmlsZU5hbWUpOwotICAgICAgICAgICAgVXBkYXRlRm9ybUZpZWxkKG1fcERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBUUlVFLCBUUlVFKTsKKyAgICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChtX3BEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICB9CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogCi1GWF9CT09MIEZpZWxkOjpidXR0b25HZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpidXR0b25HZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC0zMzc4LDE2ICszMzc4LDE2IEBACiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7CisgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKG5mYWNlID09IDApCiAgICAgICAgIHZSZXQgPSBwRm9ybUNvbnRyb2wtPkdldE5vcm1hbENhcHRpb24oKS5jX3N0cigpOwpAQCAtMzM5NiwxNCArMzM5NiwxNCBAQAogICAgIGVsc2UgaWYgKG5mYWNlID09IDIpCiAgICAgICAgIHZSZXQgPSBwRm9ybUNvbnRyb2wtPkdldFJvbGxvdmVyQ2FwdGlvbigpLmNfc3RyKCk7CiAgICAgZWxzZQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAvLyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0ODAwKQogCi1GWF9CT09MIEZpZWxkOjpidXR0b25HZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpidXR0b25HZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC0zNDE0LDE2ICszNDE0LDE2IEBACiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7CisgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOwogCiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0zNDMyLDcgKzM0MzIsNyBAQAogICAgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKIAogICAgIEpTRlhPYmplY3QgcE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIHBDb250ZXh0LCBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkljb24iKSk7Ci0gICAgQVNTRVJUKHBPYmouSXNFbXB0eSgpID09IEZBTFNFKTsKKyAgICBBU1NFUlQocE9iai5Jc0VtcHR5KCkgPT0gZmFsc2UpOwogCiAgICAgQ0pTX0ljb24qIHBKU19JY29uID0gKENKU19JY29uKilKU19HZXRQcml2YXRlKHBPYmopOwogICAgIEFTU0VSVChwSlNfSWNvbiAhPSBOVUxMKTsKQEAgLTM0NDgsMjcgKzM0NDgsMjcgQEAKICAgICBlbHNlIGlmIChuZmFjZSA9PSAyKQogICAgICAgICBwSWNvblN0cmVhbSA9IHBGb3JtQ29udHJvbC0+R2V0Um9sbG92ZXJJY29uKCk7CiAgICAgZWxzZQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIHBJY29uLT5TZXRTdHJlYW0ocEljb25TdHJlYW0pOwogICAgIHZSZXQgPSBwSlNfSWNvbjsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAvLyNwcmFnbWEgd2FybmluZyhkZWZhdWx0OiA0ODAwKQogCi1GWF9CT09MIEZpZWxkOjpidXR0b25JbXBvcnRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpidXR0b25JbXBvcnRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAjaWYgMAogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotICAgIGlmICghcEZvcm1GaWVsZClyZXR1cm4gRkFMU0U7CisgICAgaWYgKCFwRm9ybUZpZWxkKXJldHVybiBmYWxzZTsKIAogICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7CiAgICAgQVNTRVJUKHBFbnYpOwpAQCAtMzQ3Nyw3ICszNDc3LDcgQEAKICAgICBpZiAoc0ljb25GaWxlTmFtZS5Jc0VtcHR5KCkpCiAgICAgewogICAgICAgICB2UmV0ID0gMTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CkBAIC0zNDg3LDExMCArMzQ4NywxMTAgQEAKICAgICBpZiAoIXBTdHJlYW0pCiAgICAgewogICAgICAgICB2UmV0ID0gLTE7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7CisgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOwogCiAgICAgcEZvcm1Db250cm9sLT5TZXROb3JtYWxJY29uKHBTdHJlYW0pOwotICAgIFVwZGF0ZUZvcm1Db250cm9sKG1fcERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIFRSVUUsIFRSVUUpOworICAgIFVwZGF0ZUZvcm1Db250cm9sKG1fcERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIHRydWUsIHRydWUsIHRydWUpOwogCiAgICAgdlJldCA9IDA7CiAjZW5kaWYgLy8gMAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIEZpZWxkOjpidXR0b25TZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpidXR0b25TZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6YnV0dG9uU2V0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6YnV0dG9uU2V0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmNoZWNrVGhpc0JveChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6Y2hlY2tUaGlzQm94KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKICAgICBpZiAoaVNpemUgPCAxKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGludCBuV2lkZ2V0ID0gcGFyYW1zWzBdLlRvSW50KCk7CiAKLSAgICBGWF9CT09MIGJDaGVja2l0ID0gVFJVRTsKKyAgICBib29sIGJDaGVja2l0ID0gdHJ1ZTsKICAgICBpZiAoaVNpemUgPj0gMikKICAgICAgICAgYkNoZWNraXQgPSBwYXJhbXNbMV0uVG9Cb29sKCk7CiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ0hFQ0tCT1ggJiYgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBpZihuV2lkZ2V0IDwwIHx8IG5XaWRnZXQgPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQotICAgICAgICBwRm9ybUZpZWxkLT5DaGVja0NvbnRyb2wobldpZGdldCwgYkNoZWNraXQsIFRSVUUpOworICAgICAgICBwRm9ybUZpZWxkLT5DaGVja0NvbnRyb2wobldpZGdldCwgYkNoZWNraXQsIHRydWUpOwogICAgIGVsc2UKLSAgICAgICAgcEZvcm1GaWVsZC0+Q2hlY2tDb250cm9sKG5XaWRnZXQsIGJDaGVja2l0LCBUUlVFKTsKKyAgICAgICAgcEZvcm1GaWVsZC0+Q2hlY2tDb250cm9sKG5XaWRnZXQsIGJDaGVja2l0LCB0cnVlKTsKIAotICAgIFVwZGF0ZUZvcm1GaWVsZChtX3BEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgVFJVRSwgVFJVRSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgVXBkYXRlRm9ybUZpZWxkKG1fcERvY3VtZW50LCBwRm9ybUZpZWxkLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6Y2xlYXJJdGVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6Y2xlYXJJdGVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIEZpZWxkOjpkZWZhdWx0SXNDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpkZWZhdWx0SXNDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKICAgICBpZiAoaVNpemUgPCAxKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGludCBuV2lkZ2V0ID0gcGFyYW1zWzBdLlRvSW50KCk7CiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmKG5XaWRnZXQgPDAgfHwgbldpZGdldCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCiAgICAgewotICAgICAgICB2UmV0ID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgdlJldCA9IGZhbHNlOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0NIRUNLQk9YKQogICAgICAgICB8fCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSkKICAgICB7CiAKLSAgICAgICAgdlJldCA9IFRSVUU7CisgICAgICAgIHZSZXQgPSB0cnVlOwogICAgIH0KICAgICBlbHNlCi0gICAgICAgIHZSZXQgPSBGQUxTRTsKKyAgICAgICAgdlJldCA9IGZhbHNlOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmRlbGV0ZUl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6ZGVsZXRlSXRlbUF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIGludCBKU19DT01QQVJFU1RSSU5HKENGWF9XaWRlU3RyaW5nKiBwczEsIENGWF9XaWRlU3RyaW5nKiBwczIpCkBAIC0zNjAyLDEzICszNjAyLDEzIEBACiB9CiAKIAotRlhfQk9PTCBGaWVsZDo6Z2V0QXJyYXkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OmdldEFycmF5KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICBDR1dfQXJyYXlUZW1wbGF0ZTxDRlhfV2lkZVN0cmluZyo+IHN3U29ydDsKIApAQCAtMzYzMyw3ICszNjMzLDcgQEAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIHBTdHIgPSBzd1NvcnQuR2V0QXQoaik7CiAKICAgICAgICAgSlNGWE9iamVjdCBwT2JqID0gSlNfTmV3RnhEeW5hbWljT2JqKCpwUnVudGltZSwgcENvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRmllbGQiKSk7Ci0gICAgICAgIEFTU0VSVChwT2JqLklzRW1wdHkoKSA9PSBGQUxTRSk7CisgICAgICAgIEFTU0VSVChwT2JqLklzRW1wdHkoKSA9PSBmYWxzZSk7CiAKICAgICAgICAgQ0pTX0ZpZWxkKiBwSlNGaWVsZCA9IChDSlNfRmllbGQqKUpTX0dldFByaXZhdGUocE9iaik7CiAgICAgICAgIEFTU0VSVChwSlNGaWVsZCAhPSBOVUxMKTsKQEAgLTM2NTIsMTAgKzM2NTIsMTAgQEAKIAogICAgIHZSZXQgPSBGb3JtRmllbGRBcnJheTsKICAgICBzd1NvcnQuUmVtb3ZlQWxsKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmdldEl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6Z2V0SXRlbUF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogICAgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CkBAIC0zNjY0LDEzICszNjY0LDEzIEBACiAgICAgaWYgKGlTaXplID49IDEpCiAgICAgICAgIG5JZHggPSBwYXJhbXNbMF0uVG9JbnQoKTsKIAotICAgIEZYX0JPT0wgYkV4cG9ydCA9IFRSVUU7CisgICAgYm9vbCBiRXhwb3J0ID0gdHJ1ZTsKICAgICBpZiAoaVNpemUgPj0gMikKICAgICAgICAgYkV4cG9ydCA9IHBhcmFtc1sxXS5Ub0Jvb2woKTsKIAogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwpAQCAtMzY5MiwyMiArMzY5MiwyMiBAQAogICAgICAgICAgICAgdlJldCA9IHBGb3JtRmllbGQtPkdldE9wdGlvbkxhYmVsKG5JZHgpLmNfc3RyKCk7CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6Z2V0TG9jayhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6Z2V0TG9jayhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgRmllbGQ6Omluc2VydEl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6aW5zZXJ0SXRlbUF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmlzQm94Q2hlY2tlZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6aXNCb3hDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC0zNzE3LDMyICszNzE3LDMyIEBACiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmKG5JbmRleCA8MCB8fCBuSW5kZXggPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQogICAgIHsKLSAgICAgICAgdlJldCA9IEZBTFNFOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHZSZXQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0NIRUNLQk9YKQogICAgICAgICB8fCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSkKICAgICB7CiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5JbmRleCktPklzQ2hlY2tlZCgpICE9MCApCi0gICAgICAgICAgICB2UmV0ID0gVFJVRTsKKyAgICAgICAgICAgIHZSZXQgPSB0cnVlOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICB2UmV0ID0gRkFMU0U7CisgICAgICAgICAgICB2UmV0ID0gZmFsc2U7CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgdlJldCA9IEZBTFNFOworICAgICAgICB2UmV0ID0gZmFsc2U7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6aXNEZWZhdWx0Q2hlY2tlZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6aXNEZWZhdWx0Q2hlY2tlZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIApAQCAtMzc1Miw0OSArMzc1Miw0OSBAQAogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICBpZihuSW5kZXggPDAgfHwgbkluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKICAgICB7Ci0gICAgICAgIHZSZXQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB2UmV0ID0gZmFsc2U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1gpCiAgICAgICAgIHx8IChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pKQogICAgIHsKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldENvbnRyb2wobkluZGV4KS0+SXNEZWZhdWx0Q2hlY2tlZCgpICE9IDApCi0gICAgICAgICAgICB2UmV0ID0gVFJVRTsKKyAgICAgICAgICAgIHZSZXQgPSB0cnVlOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICB2UmV0ID0gRkFMU0U7CisgICAgICAgICAgICB2UmV0ID0gZmFsc2U7CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgdlJldCA9IEZBTFNFOworICAgICAgICB2UmV0ID0gZmFsc2U7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2V0QWN0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpzZXRBY3Rpb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2V0Rm9jdXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnNldEZvY3VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICBpbnQzMl90IG5Db3VudCA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsKIAotICAgIGlmIChuQ291bnQgPCAxKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKG5Db3VudCA8IDEpIHJldHVybiBmYWxzZTsKIAogICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CiAgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CkBAIC0zODEwLDcgKzM4MTAsNyBAQAogICAgICAgICBBU1NFUlQocEVudik7CiAgICAgICAgIENQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwRW52LT5GRklfR2V0Q3VycmVudFBhZ2UobV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCkpOwogICAgICAgICBpZighcFBhZ2UpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGlmIChDUERGU0RLX1BhZ2VWaWV3KiBwQ3VyUGFnZVZpZXcgPSBtX3BEb2N1bWVudC0+R2V0UGFnZVZpZXcocFBhZ2UpKQogICAgICAgICB7CiAgICAgICAgICAgICBmb3IgKGludDMyX3QgaT0wOyBpPG5Db3VudDsgaSsrKQpAQCAtMzgzMiw1NyArMzgzMiw1NyBAQAogICAgICAgICBtX3BEb2N1bWVudC0+U2V0Rm9jdXNBbm5vdChwV2lkZ2V0KTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2V0SXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnNldEl0ZW1zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnNldExvY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnNldExvY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIEZpZWxkOjpzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlR2V0U2VlZFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpzaWduYXR1cmVHZXRTZWVkVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIEZpZWxkOjpzaWduYXR1cmVJbmZvKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpzaWduYXR1cmVJbmZvKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlU2V0U2VlZFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpzaWduYXR1cmVTZXRTZWVkVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIEZpZWxkOjpzaWduYXR1cmVTaWduKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpzaWduYXR1cmVTaWduKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlVmFsaWRhdGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnNpZ25hdHVyZVZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c291cmNlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnNvdXJjZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgaWYgKHZwLklzR2V0dGluZygpKQogICAgIHsKICAgICAgICAgdnAgPDwgKENKU19PYmplY3QqKU5VTEw7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZGVsYXkgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ljb24uY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9JY29uLmNwcAppbmRleCA2YjNlMDJlLi4yN2E5NzczIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ljb24uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSWNvbi5jcHAKQEAgLTU3LDExICs1NywxMSBAQAogCXJldHVybiBtX3N3SWNvbk5hbWU7CiB9CiAKLUZYX0JPT0wgSWNvbjo6bmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEljb246Om5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCWlmKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CisJaWYoIXZwLklzR2V0dGluZygpKXJldHVybiBmYWxzZTsKIAogCXZwIDw8IG1fc3dJY29uTmFtZTsKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19Db250ZXh0LmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfQ29udGV4dC5jcHAKaW5kZXggNzJiZTM0ZC4uMGVkYmYwZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19Db250ZXh0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0NvbnRleHQuY3BwCkBAIC0xNiw4ICsxNiw4IEBACiAKIENKU19Db250ZXh0OjpDSlNfQ29udGV4dChDSlNfUnVudGltZSogcFJ1bnRpbWUpIDoKIAltX3BSdW50aW1lKHBSdW50aW1lKSwKLQltX2JCdXN5KEZBTFNFKSwKLQltX2JNc2dCb3hFbmFibGUoVFJVRSkKKwltX2JCdXN5KGZhbHNlKSwKKwltX2JNc2dCb3hFbmFibGUodHJ1ZSkKIHsKIAltX3BFdmVudEhhbmRsZXIgPSBuZXcgQ0pTX0V2ZW50SGFuZGxlcih0aGlzKTsKIH0KQEAgLTQxLDE1ICs0MSwxNSBAQAogCXJldHVybiBtX3BSdW50aW1lLT5HZXRSZWFkZXJBcHAoKTsKIH0KIAotRlhfQk9PTCBDSlNfQ29udGV4dDo6RG9Kb2IoaW50IG5Nb2RlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgaW5mbykKK2Jvb2wgQ0pTX0NvbnRleHQ6OkRvSm9iKGludCBuTW9kZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pCiB7CiAJaWYgKG1fYkJ1c3kpCiAJewogCQlpbmZvID0gSlNHZXRTdHJpbmdGcm9tSUQodGhpcywgSURTX1NUUklOR19KU0JVU1kpOwotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAl9CiAKLQltX2JCdXN5ID0gVFJVRTsKKwltX2JCdXN5ID0gdHJ1ZTsKIAogCUFTU0VSVChtX3BSdW50aW1lICE9IE5VTEwpOwogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CkBAIC01OCw3ICs1OCw3IEBACiAJaWYgKCFtX3BSdW50aW1lLT5BZGRFdmVudFRvTG9vcChtX3BFdmVudEhhbmRsZXItPlRhcmdldE5hbWUoKSwgbV9wRXZlbnRIYW5kbGVyLT5FdmVudFR5cGUoKSkpCiAJewogCQlpbmZvID0gSlNHZXRTdHJpbmdGcm9tSUQodGhpcywgSURTX1NUUklOR19KU0VWRU5UKTsKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJRlhKU0VyciBlcnJvciA9e05VTEwsTlVMTCwgMH07CkBAIC05NSwxMiArOTUsMTIgQEAKIAltX3BSdW50aW1lLT5SZW1vdmVFdmVudEluTG9vcChtX3BFdmVudEhhbmRsZXItPlRhcmdldE5hbWUoKSwgbV9wRXZlbnRIYW5kbGVyLT5FdmVudFR5cGUoKSk7CiAKIAltX3BFdmVudEhhbmRsZXItPkRlc3Ryb3koKTsKLQltX2JCdXN5ID0gRkFMU0U7CisJbV9iQnVzeSA9IGZhbHNlOwogCiAJcmV0dXJuIG5SZXQgPj0gMDsKIH0KIAotRlhfQk9PTCBDSlNfQ29udGV4dDo6UnVuU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKQorYm9vbCBDSlNfQ29udGV4dDo6UnVuU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKQogewogCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKG1fcFJ1bnRpbWUtPkdldElzb2xhdGUoKSk7CiAJdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShtX3BSdW50aW1lLT5HZXRJc29sYXRlKCkpOwpAQCAtMTEwLDcgKzExMCw3IEBACiAJcmV0dXJuIERvSm9iKDAsIHNjcmlwdCwgaW5mbyk7CiB9CiAKLUZYX0JPT0wgQ0pTX0NvbnRleHQ6OkNvbXBpbGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pCitib29sIENKU19Db250ZXh0OjpDb21waWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKQogewogCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKG1fcFJ1bnRpbWUtPkdldElzb2xhdGUoKSk7CiAJdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShtX3BSdW50aW1lLT5HZXRJc29sYXRlKCkpOwpAQCAtMTg2LDU4ICsxODYsNTggQEAKIAltX3BFdmVudEhhbmRsZXItPk9uUGFnZV9PdXRWaWV3KHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KQordm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCkKIHsKIAlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwogCW1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9Nb3VzZURvd24oYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCkKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfTW91c2VFbnRlcihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX01vdXNlRW50ZXIoYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KQordm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9Nb3VzZUV4aXQoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCkKIHsKIAlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwogCW1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9Nb3VzZUV4aXQoYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCkKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfTW91c2VVcChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX01vdXNlVXAoYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfRm9jdXMoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX0ZvY3VzKGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0LCBWYWx1ZSk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpCit2b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX0JsdXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX0JsdXIoYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQsIFZhbHVlKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYykKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBib29sJiBiUmMpCiB7CiAJQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKIAltX3BFdmVudEhhbmRsZXItPk9uRmllbGRfQ2FsY3VsYXRlKHBTb3VyY2UsIHBUYXJnZXQsIFZhbHVlLCBiUmMpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX0Zvcm1hdChDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MIGJXaWxsQ29tbWl0KQordm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCBiV2lsbENvbW1pdCkKIHsKICAgICBtX3BFdmVudEhhbmRsZXItPk9uRmllbGRfRm9ybWF0KHBUYXJnZXQsIFZhbHVlLCBiV2lsbENvbW1pdCk7CiB9CiAKIAogdm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9LZXlzdHJva2UoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotCQkJCQkJCQkJRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsIGludCAmblNlbEVuZCxpbnQgJm5TZWxTdGFydCwKLQkJCQkJCQkJCUZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAotCQkJCQkJCQkJRlhfQk9PTCBiV2lsbENvbW1pdCwgRlhfQk9PTCBiRmllbGRGdWxsLCBGWF9CT09MJiBiUmMpCisJCQkJCQkJCQlib29sIGJLZXlEb3duLCBib29sIGJNb2RpZmllciwgaW50ICZuU2VsRW5kLGludCAmblNlbFN0YXJ0LAorCQkJCQkJCQkJYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCisJCQkJCQkJCQlib29sIGJXaWxsQ29tbWl0LCBib29sIGJGaWVsZEZ1bGwsIGJvb2wmIGJSYykKIHsKICAgICBtX3BFdmVudEhhbmRsZXItPk9uRmllbGRfS2V5c3Ryb2tlKAogICAgICAgICBzdHJDaGFuZ2UsIHN0ckNoYW5nZUV4LCBiS2V5RG93biwgYk1vZGlmaWVyLCBuU2VsRW5kLCBuU2VsU3RhcnQsCkBAIC0yNDUsNjggKzI0NSw2OCBAQAogfQogCiB2b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX1ZhbGlkYXRlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotCQkJCQkJCQkgICBGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotCQkJCQkJCQkgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYykKKwkJCQkJCQkJICAgYm9vbCBiS2V5RG93biwgYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKwkJCQkJCQkJICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBib29sJiBiUmMpCiB7CiAJQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKIAltX3BFdmVudEhhbmRsZXItPk9uRmllbGRfVmFsaWRhdGUoc3RyQ2hhbmdlLCBzdHJDaGFuZ2VFeCwgYktleURvd24sIGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0LCBWYWx1ZSwgYlJjKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fRm9jdXMoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Gb2N1cyhiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fQmx1cihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCiB7CiAJQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKIAltX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX0JsdXIoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9PcGVuKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX09wZW4oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9PcGVuKGJNb2RpZmllciwgYlNoaWZ0LCBwU2NyZWVuKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fQ2xvc2UoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fQ2xvc2UoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9DbG9zZShiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Nb3VzZURvd24oYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX01vdXNlVXAoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Nb3VzZVVwKGJNb2RpZmllciwgYlNoaWZ0LCBwU2NyZWVuKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZUVudGVyKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKIAlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwogCW1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fTW91c2VFbnRlcihiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZUV4aXQoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Nb3VzZUV4aXQoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9JblZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fSW5WaWV3KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKIAlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwogCW1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fSW5WaWV3KGJNb2RpZmllciwgYlNoaWZ0LCBwU2NyZWVuKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fT3V0VmlldyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9PdXRWaWV3KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKIAlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwogCW1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fT3V0VmlldyhiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5jcHAKaW5kZXggMTc2OWUzMC4uMTA1NmM0NCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmNwcApAQCAtMjAsMjEgKzIwLDIxIEBACiBDSlNfRXZlbnRIYW5kbGVyOjpDSlNfRXZlbnRIYW5kbGVyKENKU19Db250ZXh0ICogcENvbnRleHQpICAgOgogICAgIG1fcEpTQ29udGV4dChwQ29udGV4dCksCiAgICAgbV9lRXZlbnRUeXBlKEpFVF9VTktOT1dOKSwKLSAgICBtX2JWYWxpZChGQUxTRSksCisgICAgbV9iVmFsaWQoZmFsc2UpLAogICAgIG1fcFdpZGVTdHJDaGFuZ2UoTlVMTCksCiAgICAgbV9uQ29tbWl0S2V5KC0xKSwKLSAgICBtX2JLZXlEb3duKEZBTFNFKSwKLSAgICBtX2JNb2RpZmllcihGQUxTRSksCi0gICAgbV9iU2hpZnQoRkFMU0UpLAorICAgIG1fYktleURvd24oZmFsc2UpLAorICAgIG1fYk1vZGlmaWVyKGZhbHNlKSwKKyAgICBtX2JTaGlmdChmYWxzZSksCiAgICAgbV9wSVNlbEVuZChOVUxMKSwKICAgICBtX25TZWxFbmREdSgwKSwKICAgICBtX3BJU2VsU3RhcnQoTlVMTCksCiAgICAgbV9uU2VsU3RhcnREdSgwKSwKLSAgICBtX2JXaWxsQ29tbWl0KEZBTFNFKSwKKyAgICBtX2JXaWxsQ29tbWl0KGZhbHNlKSwKICAgICBtX3BWYWx1ZShOVUxMKSwKLSAgICBtX2JGaWVsZEZ1bGwoRkFMU0UpLAorICAgIG1fYkZpZWxkRnVsbChmYWxzZSksCiAgICAgbV9wYlJjKE5VTEwpLAotICAgIG1fYlJjRHUoRkFMU0UpLAorICAgIG1fYlJjRHUoZmFsc2UpLAogICAgIG1fcFNvdXJjZURvYyhOVUxMKSwKICAgICBtX3BUYXJnZXRCb29rTWFyayhOVUxMKSwKICAgICBtX3BUYXJnZXREb2MoTlVMTCksCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICBtX3BUYXJnZXREb2MgPSBwRG9jOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlRW50ZXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkKIHsKICAgICBJbml0aWFsKEpFVF9GSUVMRF9NT1VTRUVOVEVSKTsKIApAQCAtMTMyLDcgKzEzMiw3IEBACiAgICAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlRXhpdChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KQogewogICAgIEluaXRpYWwoSkVUX0ZJRUxEX01PVVNFRVhJVCk7CiAKQEAgLTE0Miw3ICsxNDIsNyBAQAogICAgIG1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkKIHsKICAgICBJbml0aWFsKEpFVF9GSUVMRF9NT1VTRURPV04pOwogICAgIG1fZUV2ZW50VHlwZSA9IEpFVF9GSUVMRF9NT1VTRURPV047CkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICBtX3N0clRhcmdldE5hbWUgPSBwVGFyZ2V0LT5HZXRGdWxsTmFtZSgpOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlVXAoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkKIHsKICAgICBJbml0aWFsKEpFVF9GSUVMRF9NT1VTRVVQKTsKIApAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfRm9jdXMoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpCiB7CiAgICAgSW5pdGlhbChKRVRfRklFTERfRk9DVVMpOwpAQCAtMTc1LDcgKzE3NSw3IEBACiAgICAgbV9wVmFsdWUgPSAoQ0ZYX1dpZGVTdHJpbmcqKSZWYWx1ZTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9CbHVyKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpCiB7CiAgICAgSW5pdGlhbChKRVRfRklFTERfQkxVUik7CkBAIC0xODgsMTEgKzE4OCwxMSBAQAogfQogCiB2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfS2V5c3Ryb2tlKENGWF9XaWRlU3RyaW5nICZzdHJDaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgRlhfQk9PTCBLZXlEb3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNb2RpZmllciwgaW50JiBuU2VsRW5kLCBpbnQmIG5TZWxTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wgYldpbGxDb21taXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGaWVsZEZ1bGwsIEZYX0JPT0wmIGJSYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBib29sIEtleURvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk1vZGlmaWVyLCBpbnQmIG5TZWxFbmQsIGludCYgblNlbFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCBiV2lsbENvbW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZpZWxkRnVsbCwgYm9vbCYgYlJjKQogewogICAgIEluaXRpYWwoSkVUX0ZJRUxEX0tFWVNUUk9LRSk7CiAKQEAgLTIxMyw4ICsyMTMsOCBAQAogfQogCiB2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfVmFsaWRhdGUoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MJiBiUmMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiS2V5RG93biwgYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIGJvb2wmIGJSYykKIHsKICAgICBJbml0aWFsKEpFVF9GSUVMRF9WQUxJREFURSk7CiAKQEAgLTIzMCw3ICsyMzAsNyBAQAogfQogCiB2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MJiBiUmMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCYgYlJjKQogewogICAgIEluaXRpYWwoSkVUX0ZJRUxEX0NBTENVTEFURSk7CiAKQEAgLTI0NCw3ICsyNDQsNyBAQAogCiB2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldpbGxDb21taXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYldpbGxDb21taXQpCiB7CiAgICAgSW5pdGlhbChKRVRfRklFTERfRk9STUFUKTsKIApAQCAtMjU1LDcgKzI1NSw3IEBACiAgICAgbV9iV2lsbENvbW1pdCA9IGJXaWxsQ29tbWl0OwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fRm9jdXMoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogICAgIEluaXRpYWwoSkVUX1NDUkVFTl9GT0NVUyk7CiAKQEAgLTI2NCw3ICsyNjQsNyBAQAogICAgIG1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fQmx1cihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCiB7CiAgICAgSW5pdGlhbChKRVRfU0NSRUVOX0JMVVIpOwogCkBAIC0yNzMsNyArMjczLDcgQEAKICAgICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fT3BlbihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX09wZW4oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogICAgIEluaXRpYWwoSkVUX1NDUkVFTl9PUEVOKTsKIApAQCAtMjgyLDcgKzI4Miw3IEBACiAgICAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX0Nsb3NlKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fQ2xvc2UoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogICAgIEluaXRpYWwoSkVUX1NDUkVFTl9DTE9TRSk7CiAKQEAgLTI5MSw3ICsyOTEsNyBAQAogICAgIG1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogICAgIEluaXRpYWwoSkVUX1NDUkVFTl9NT1VTRURPV04pOwogCkBAIC0zMDAsNyArMzAwLDcgQEAKICAgICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlVXAoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogICAgIEluaXRpYWwoSkVUX1NDUkVFTl9NT1VTRVVQKTsKIApAQCAtMzA5LDcgKzMwOSw3IEBACiAgICAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZUVudGVyKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKICAgICBJbml0aWFsKEpFVF9TQ1JFRU5fTU9VU0VFTlRFUik7CiAKQEAgLTMxOCw3ICszMTgsNyBAQAogICAgIG1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZUV4aXQoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogICAgIEluaXRpYWwoSkVUX1NDUkVFTl9NT1VTRUVYSVQpOwogCkBAIC0zMjcsNyArMzI3LDcgQEAKICAgICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fSW5WaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fSW5WaWV3KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKICAgICBJbml0aWFsKEpFVF9TQ1JFRU5fSU5WSUVXKTsKIApAQCAtMzM2LDcgKzMzNiw3IEBACiAgICAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX091dFZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9PdXRWaWV3KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKICAgICBJbml0aWFsKEpFVF9TQ1JFRU5fT1VUVklFVyk7CiAKQEAgLTM5NSwzMyArMzk1LDMzIEBACiAgICAgbV9XaWRlU3RyQ2hhbmdlRHUgPSBMIiI7CiAgICAgbV9XaWRlU3RyQ2hhbmdlRXggPSBMIiI7CiAgICAgbV9uQ29tbWl0S2V5ID0gLTE7Ci0gICAgbV9iS2V5RG93biA9IEZBTFNFOwotICAgIG1fYk1vZGlmaWVyID0gRkFMU0U7Ci0gICAgbV9iU2hpZnQgPSBGQUxTRTsKKyAgICBtX2JLZXlEb3duID0gZmFsc2U7CisgICAgbV9iTW9kaWZpZXIgPSBmYWxzZTsKKyAgICBtX2JTaGlmdCA9IGZhbHNlOwogICAgIG1fcElTZWxFbmQgPSBOVUxMOwogICAgIG1fblNlbEVuZER1ID0gMDsKICAgICBtX3BJU2VsU3RhcnQgPSBOVUxMOwogICAgIG1fblNlbFN0YXJ0RHUgPSAwOwotICAgIG1fYldpbGxDb21taXQgPSBGQUxTRTsKKyAgICBtX2JXaWxsQ29tbWl0ID0gZmFsc2U7CiAgICAgbV9wVmFsdWUgPSBOVUxMOwotICAgIG1fYkZpZWxkRnVsbCA9IEZBTFNFOworICAgIG1fYkZpZWxkRnVsbCA9IGZhbHNlOwogICAgIG1fcGJSYyA9IE5VTEw7Ci0gICAgbV9iUmNEdSA9IEZBTFNFOworICAgIG1fYlJjRHUgPSBmYWxzZTsKIAogICAgIG1fcFNvdXJjZURvYyA9IE5VTEw7CiAgICAgbV9wVGFyZ2V0Qm9va01hcmsgPSBOVUxMOwogICAgIG1fcFRhcmdldERvYyA9IE5VTEw7CiAgICAgbV9wVGFyZ2V0QW5ub3QgPSBOVUxMOwogCi0gICAgbV9iVmFsaWQgPSBUUlVFOworICAgIG1fYlZhbGlkID0gdHJ1ZTsKIH0KIAogdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpEZXN0cm95KCkKIHsKLSAgICBtX2JWYWxpZCA9IEZBTFNFOworICAgIG1fYlZhbGlkID0gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6SXNWYWxpZCgpCitib29sIENKU19FdmVudEhhbmRsZXI6OklzVmFsaWQoKQogewogICAgIHJldHVybiBtX2JWYWxpZDsKIH0KQEAgLTQ0NCwxNyArNDQ0LDE3IEBACiAgICAgcmV0dXJuIG1fbkNvbW1pdEtleTsKIH0KIAotRlhfQk9PTCBDSlNfRXZlbnRIYW5kbGVyOjpGaWVsZEZ1bGwoKQorYm9vbCBDSlNfRXZlbnRIYW5kbGVyOjpGaWVsZEZ1bGwoKQogewogICAgIHJldHVybiBtX2JGaWVsZEZ1bGw7CiB9CiAKLUZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6S2V5RG93bigpCitib29sIENKU19FdmVudEhhbmRsZXI6OktleURvd24oKQogewogICAgIHJldHVybiBtX2JLZXlEb3duOwogfQogCi1GWF9CT09MIENKU19FdmVudEhhbmRsZXI6Ok1vZGlmaWVyKCkKK2Jvb2wgQ0pTX0V2ZW50SGFuZGxlcjo6TW9kaWZpZXIoKQogewogICAgIHJldHVybiBtX2JNb2RpZmllcjsKIH0KQEAgLTU1NSw3ICs1NTUsNyBAQAogICAgIHJldHVybiBMIiI7CiB9CiAKLUZYX0JPT0wmIENKU19FdmVudEhhbmRsZXI6OlJjKCkKK2Jvb2wmIENKU19FdmVudEhhbmRsZXI6OlJjKCkKIHsKICAgICBpZiAobV9wYlJjKSB7CiAgICAgICAgIHJldHVybiAqbV9wYlJjOwpAQCAtNTc5LDcgKzU3OSw3IEBACiAgICAgcmV0dXJuIG1fblNlbFN0YXJ0RHU7CiB9CiAKLUZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6U2hpZnQoKQorYm9vbCBDSlNfRXZlbnRIYW5kbGVyOjpTaGlmdCgpCiB7CiAgICAgcmV0dXJuIG1fYlNoaWZ0OwogfQpAQCAtNTkxLDkgKzU5MSw5IEBACiAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gbV9wSlNDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKIAogICAgIEpTRlhPYmplY3QgIHBEb2NPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBtX3BKU0NvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRG9jdW1lbnQiKSk7Ci0gICAgQVNTRVJUKHBEb2NPYmouSXNFbXB0eSgpID09IEZBTFNFKTsKKyAgICBBU1NFUlQocERvY09iai5Jc0VtcHR5KCkgPT0gZmFsc2UpOwogICAgIEpTRlhPYmplY3QgIHBGaWVsZE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIG1fcEpTQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJGaWVsZCIpKTsKLSAgICBBU1NFUlQocEZpZWxkT2JqLklzRW1wdHkoKSA9PSBGQUxTRSk7CisgICAgQVNTRVJUKHBGaWVsZE9iai5Jc0VtcHR5KCkgPT0gZmFsc2UpOwogCiAgICAgQ0pTX0RvY3VtZW50KiBwSlNEb2N1bWVudCA9IChDSlNfRG9jdW1lbnQqKUpTX0dldFByaXZhdGUocERvY09iaik7CiAgICAgQVNTRVJUKHBKU0RvY3VtZW50ICE9IE5VTEwpOwpAQCAtNjI1LDkgKzYyNSw5IEBACiAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gbV9wSlNDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKIAogICAgIEpTRlhPYmplY3QgcERvY09iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIG1fcEpTQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJEb2N1bWVudCIpKTsKLSAgICBBU1NFUlQocERvY09iai5Jc0VtcHR5KCkgPT0gRkFMU0UpOworICAgIEFTU0VSVChwRG9jT2JqLklzRW1wdHkoKSA9PSBmYWxzZSk7CiAgICAgSlNGWE9iamVjdCBwRmllbGRPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBtX3BKU0NvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRmllbGQiKSk7Ci0gICAgQVNTRVJUKHBGaWVsZE9iai5Jc0VtcHR5KCkgPT0gRkFMU0UpOworICAgIEFTU0VSVChwRmllbGRPYmouSXNFbXB0eSgpID09IGZhbHNlKTsKIAogICAgIENKU19Eb2N1bWVudCogcEpTRG9jdW1lbnQgPSAoQ0pTX0RvY3VtZW50KilKU19HZXRQcml2YXRlKHBEb2NPYmopOwogICAgIEFTU0VSVChwSlNEb2N1bWVudCAhPSBOVUxMKTsKQEAgLTY1Myw3ICs2NTMsNyBAQAogICAgIHJldHVybiAqbV9wVmFsdWU7CiB9CiAKLUZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6V2lsbENvbW1pdCgpCitib29sIENKU19FdmVudEhhbmRsZXI6OldpbGxDb21taXQoKQogewogICAgIHJldHVybiBtX2JXaWxsQ29tbWl0OwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5jcHAKaW5kZXggOGM3YmQ3MS4uNzFlM2E1MCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuY3BwCkBAIC0yOTYsNyArMjk2LDcgQEAKICAgICB9CiB9CiAKLUZYX0JPT0wgQ0pTX0dsb2JhbERhdGE6OlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwgRlhfQk9PTCBiUGVyc2lzdGVudCkKK2Jvb2wgQ0pTX0dsb2JhbERhdGE6OlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwgYm9vbCBiUGVyc2lzdGVudCkKIHsKICAgICBBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7CkBAIC0zMDQsMTggKzMwNCwxOCBAQAogICAgIHNQcm9wTmFtZS5UcmltTGVmdCgpOwogICAgIHNQcm9wTmFtZS5UcmltUmlnaHQoKTsKIAotICAgIGlmIChzUHJvcE5hbWUuR2V0TGVuZ3RoKCkgPT0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChzUHJvcE5hbWUuR2V0TGVuZ3RoKCkgPT0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBEYXRhID0gR2V0R2xvYmFsVmFyaWFibGUoc1Byb3BOYW1lKSkKICAgICB7CiAgICAgICAgIHBEYXRhLT5iUGVyc2lzdGVudCA9IGJQZXJzaXN0ZW50OwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDSlNfR2xvYmFsRGF0YTo6RGVsZXRlR2xvYmFsVmFyaWFibGUoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUpCitib29sIENKU19HbG9iYWxEYXRhOjpEZWxldGVHbG9iYWxWYXJpYWJsZShjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSkKIHsKICAgICBBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7CkBAIC0zMjMsNyArMzIzLDcgQEAKICAgICBzUHJvcE5hbWUuVHJpbUxlZnQoKTsKICAgICBzUHJvcE5hbWUuVHJpbVJpZ2h0KCk7CiAKLSAgICBpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApIHJldHVybiBmYWxzZTsKIAogICAgIGludCBuRmluZCA9IEZpbmRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpOwogCkBAIC0zMzEsMTAgKzMzMSwxMCBAQAogICAgIHsKICAgICAgICAgZGVsZXRlIG1fYXJyYXlHbG9iYWxEYXRhLkdldEF0KG5GaW5kKTsKICAgICAgICAgbV9hcnJheUdsb2JhbERhdGEuUmVtb3ZlQXQobkZpbmQpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogaW50MzJfdCBDSlNfR2xvYmFsRGF0YTo6R2V0U2l6ZSgpIGNvbnN0CkBAIC00MTcsNyArNDE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlTnVtYmVyKHNFbnRyeSwgZERhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChzRW50cnksIFRSVUUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChzRW50cnksIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46CkBAIC00MjUsNyArNDI1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdEYXRhID0gKigoRlhfV09SRCopcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCArPSBzaXplb2YoRlhfV09SRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVCb29sZWFuKHNFbnRyeSwgKGJvb2wpKHdEYXRhID09IDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoc0VudHJ5LCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoc0VudHJ5LCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc6CkBAIC00MzcsMTQgKzQzNywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlU3RyaW5nKHNFbnRyeSwgQ0ZYX0J5dGVTdHJpbmcocCwgZHdMZW5ndGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoc0VudHJ5LCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoc0VudHJ5LCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICs9IHNpemVvZihjaGFyKSAqIGR3TGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTEw6CiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVOdWxsKHNFbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KHNFbnRyeSwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KHNFbnRyeSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19SdW50aW1lLmNwcAppbmRleCA0ODVjZDI3Li43MzMzZTg4IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfUnVudGltZS5jcHAKQEAgLTQwLDcgKzQwLDcgQEAKICAgICAgICAgICAgIGVtYmVkZGVyRGF0YVNsb3QgPSBwQXBwLT5HZXRGb3JtRmlsbEluZm8oKS0+bV9wSnNQbGF0Zm9ybS0+bV92OEVtYmVkZGVyU2xvdDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgIEpTX0luaXRpYWwoZW1iZWRkZXJEYXRhU2xvdCk7Ci0gICAgICAgIG1fYkluaXQgPSBUUlVFOworICAgICAgICBtX2JJbml0ID0gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIG5ldyBDSlNfUnVudGltZShwQXBwKTsKIH0KQEAgLTU4LDcgKzU4LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgSlNfUmVsZWFzZSgpOwogICAgICAgICAgICAgUmVsZWFzZUdsb2JhbERhdGEoKTsKLSAgICAgICAgICAgIG1fYkluaXQgPSBGQUxTRTsKKyAgICAgICAgICAgIG1fYkluaXQgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTEwOCw3ICsxMDgsNyBAQAogQ0pTX1J1bnRpbWU6OkNKU19SdW50aW1lKENQREZEb2NfRW52aXJvbm1lbnQgKiBwQXBwKSA6CiAJbV9wQXBwKHBBcHApLAogCW1fcERvY3VtZW50KE5VTEwpLAotCW1fYkJsb2NraW5nKEZBTFNFKSwKKwltX2JCbG9ja2luZyhmYWxzZSksCiAJbV9wRmllbGRFdmVudFBhdGgoTlVMTCksCiAgICAgbV9pc29sYXRlKE5VTEwpCiB7CkBAIC0xNTAsNDYgKzE1MCw0NiBAQAogICAgIG1faXNvbGF0ZS0+RGlzcG9zZSgpOwogfQogCi1GWF9CT09MIENKU19SdW50aW1lOjpJbml0SlNPYmplY3RzKCkKK2Jvb2wgQ0pTX1J1bnRpbWU6OkluaXRKU09iamVjdHMoKQogewogICAgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKEdldElzb2xhdGUoKSk7CiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShHZXRJc29sYXRlKCkpOwogICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHY4OjpDb250ZXh0OjpOZXcoR2V0SXNvbGF0ZSgpKTsKICAgICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZShjb250ZXh0KTsKICAgICAvLzAgLSA4Ci0gICAgaWYgKENKU19Cb3JkZXI6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKENKU19EaXNwbGF5OjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOwotICAgIGlmIChDSlNfRm9udDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLSAgICBpZiAoQ0pTX0hpZ2hsaWdodDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLSAgICBpZiAoQ0pTX1Bvc2l0aW9uOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOwotICAgIGlmIChDSlNfU2NhbGVIb3c6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKENKU19TY2FsZVdoZW46OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKENKU19TdHlsZTo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLSAgICBpZiAoQ0pTX1pvb210eXBlOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChDSlNfQm9yZGVyOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChDSlNfRGlzcGxheTo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoQ0pTX0ZvbnQ6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKENKU19IaWdobGlnaHQ6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKENKU19Qb3NpdGlvbjo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoQ0pTX1NjYWxlSG93OjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChDSlNfU2NhbGVXaGVuOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChDSlNfU3R5bGU6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKENKU19ab29tdHlwZTo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBmYWxzZTsKIAogICAgIC8vOSAtIDExCi0gICAgaWYgKENKU19BcHA6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKENKU19Db2xvcjo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLSAgICBpZiAoQ0pTX0NvbnNvbGU6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKENKU19BcHA6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKENKU19Db2xvcjo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoQ0pTX0NvbnNvbGU6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAvLzEyIC0gMTQKLSAgICBpZiAoQ0pTX0RvY3VtZW50OjpJbml0KCp0aGlzLCBKU19EWU5BTUlDKSA8IDApIHJldHVybiBGQUxTRTsKLSAgICBpZiAoQ0pTX0V2ZW50OjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOwotICAgIGlmIChDSlNfRmllbGQ6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChDSlNfRG9jdW1lbnQ6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChDSlNfRXZlbnQ6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKENKU19GaWVsZDo6SW5pdCgqdGhpcywgSlNfRFlOQU1JQykgPCAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAvLzE1IC0gMTcKLSAgICBpZiAoQ0pTX0dsb2JhbDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLSAgICBpZiAoQ0pTX0ljb246OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIEZBTFNFOwotICAgIGlmIChDSlNfVXRpbDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoQ0pTX0dsb2JhbDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoQ0pTX0ljb246OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChDSlNfVXRpbDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBmYWxzZTsKIAotICAgIGlmIChDSlNfUHVibGljTWV0aG9kczo6SW5pdCgqdGhpcykgPCAwKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKENKU19HbG9iYWxDb25zdHM6OkluaXQoKnRoaXMpIDwgMCkgcmV0dXJuIEZBTFNFOwotICAgIGlmIChDSlNfR2xvYmFsQXJyYXlzOjpJbml0KCp0aGlzKSA8IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoQ0pTX1B1YmxpY01ldGhvZHM6OkluaXQoKnRoaXMpIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChDSlNfR2xvYmFsQ29uc3RzOjpJbml0KCp0aGlzKSA8IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoQ0pTX0dsb2JhbEFycmF5czo6SW5pdCgqdGhpcykgPCAwKSByZXR1cm4gZmFsc2U7CiAKLSAgICBpZiAoQ0pTX1RpbWVyT2JqOjpJbml0KCp0aGlzLCBKU19EWU5BTUlDKSA8IDApIHJldHVybiBGQUxTRTsKLSAgICBpZiAoQ0pTX1ByaW50UGFyYW1zT2JqOjpJbml0KCp0aGlzLCBKU19EWU5BTUlDKSA8MCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChDSlNfVGltZXJPYmo6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChDSlNfUHJpbnRQYXJhbXNPYmo6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwwKSByZXR1cm4gZmFsc2U7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogSUZYSlNfQ29udGV4dCogQ0pTX1J1bnRpbWU6Ok5ld0NvbnRleHQoKQpAQCAtMjU1LDcgKzI1NSw3IEBACiAgICAgfQogfQogCi1GWF9CT09MIENKU19SdW50aW1lOjpBZGRFdmVudFRvTG9vcChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RhcmdldE5hbWUsIEpTX0VWRU5UX1QgZUV2ZW50VHlwZSkKK2Jvb2wgQ0pTX1J1bnRpbWU6OkFkZEV2ZW50VG9Mb29wKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGFyZ2V0TmFtZSwgSlNfRVZFTlRfVCBlRXZlbnRUeXBlKQogewogICAgIGlmIChtX3BGaWVsZEV2ZW50UGF0aCA9PSBOVUxMKQogICAgIHsKQEAgLTI2NCw3ICsyNjQsNyBAQAogICAgICAgICBtX3BGaWVsZEV2ZW50UGF0aC0+ZUV2ZW50VHlwZSA9IGVFdmVudFR5cGU7CiAgICAgICAgIG1fcEZpZWxkRXZlbnRQYXRoLT5wTmV4dCA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIC8vdG8gc2VhcmNoCkBAIC0yNzMsNyArMjczLDcgQEAKICAgICB3aGlsZSAocCkKICAgICB7CiAgICAgICAgIGlmIChwLT5lRXZlbnRUeXBlID09IGVFdmVudFR5cGUgJiYgcC0+c1RhcmdldE5hbWUgPT0gc1RhcmdldE5hbWUpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgcExhc3QgPSBwOwogICAgICAgICBwID0gcC0+cE5leHQ7CkBAIC0yODcsMTIgKzI4NywxMiBAQAogCiAgICAgcExhc3QtPnBOZXh0ID0gcE5ldzsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIENKU19SdW50aW1lOjpSZW1vdmVFdmVudEluTG9vcChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RhcmdldE5hbWUsIEpTX0VWRU5UX1QgZUV2ZW50VHlwZSkKIHsKLSAgICBGWF9CT09MIGJGaW5kID0gRkFMU0U7CisgICAgYm9vbCBiRmluZCA9IGZhbHNlOwogCiAgICAgQ0pTX0ZpZWxkRXZlbnQqIHAgPSBtX3BGaWVsZEV2ZW50UGF0aDsKICAgICBDSlNfRmllbGRFdmVudCogcExhc3QgPSBOVUxMOwpAQCAtMzAwLDcgKzMwMCw3IEBACiAgICAgewogICAgICAgICBpZiAocC0+ZUV2ZW50VHlwZSA9PSBlRXZlbnRUeXBlICYmIHAtPnNUYXJnZXROYW1lID09IHNUYXJnZXROYW1lKQogICAgICAgICB7Ci0gICAgICAgICAgICBiRmluZCA9IFRSVUU7CisgICAgICAgICAgICBiRmluZCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1ZhbHVlLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfVmFsdWUuY3BwCmluZGV4IDA1OGYyZWEuLjYxMWIxMTEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfVmFsdWUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfVmFsdWUuY3BwCkBAIC0yNTYsNDUgKzI1Niw0NSBAQAogCXJldHVybiBWVF91bmtub3duOwogfQogCi1GWF9CT09MIENKU19WYWx1ZTo6SXNBcnJheU9iamVjdCgpIGNvbnN0Citib29sIENKU19WYWx1ZTo6SXNBcnJheU9iamVjdCgpIGNvbnN0CiB7Ci0JaWYobV9wVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gRkFMU0U7CisJaWYobV9wVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7CiAJcmV0dXJuIG1fcFZhbHVlLT5Jc0FycmF5KCk7CiB9CiAKLUZYX0JPT0wgQ0pTX1ZhbHVlOjpJc0RhdGVPYmplY3QoKSBjb25zdAorYm9vbCBDSlNfVmFsdWU6OklzRGF0ZU9iamVjdCgpIGNvbnN0CiB7Ci0JaWYobV9wVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gRkFMU0U7CisJaWYobV9wVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7CiAJcmV0dXJuIG1fcFZhbHVlLT5Jc0RhdGUoKTsKIH0KIAogLy9DSlNfVmFsdWU6Om9wZXJhdG9yIENKU19BcnJheSgpCi1GWF9CT09MIENKU19WYWx1ZTo6Q29udmVydFRvQXJyYXkoQ0pTX0FycmF5ICZhcnJheSkgY29uc3QKK2Jvb2wgQ0pTX1ZhbHVlOjpDb252ZXJ0VG9BcnJheShDSlNfQXJyYXkgJmFycmF5KSBjb25zdAogewogCWlmIChJc0FycmF5T2JqZWN0KCkpCiAJewogCQlhcnJheS5BdHRhY2goSlNfVG9BcnJheShtX2lzb2xhdGUsIG1fcFZhbHVlKSk7Ci0JCXJldHVybiBUUlVFOworCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENKU19WYWx1ZTo6Q29udmVydFRvRGF0ZShDSlNfRGF0ZSAmZGF0ZSkgY29uc3QKK2Jvb2wgQ0pTX1ZhbHVlOjpDb252ZXJ0VG9EYXRlKENKU19EYXRlICZkYXRlKSBjb25zdAogewogLy8gCWlmIChHZXRUeXBlKCkgPT0gVlRfZGF0ZSkKIC8vIAl7CiAvLyAJCWRhdGUgPSAoZG91YmxlKSgqdGhpcyk7Ci0vLyAJCXJldHVybiBUUlVFOworLy8gCQlyZXR1cm4gdHJ1ZTsKIC8vIAl9CiAKIAlpZiAoSXNEYXRlT2JqZWN0KCkpCiAJewogCQlkYXRlLkF0dGFjaChtX3BWYWx1ZSk7Ci0JCXJldHVybiBUUlVFOworCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENKU19Qcm9wVmFsdWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzE0LDEyICszMTQsMTIgQEAKIHsKIH0KIAotRlhfQk9PTCBDSlNfUHJvcFZhbHVlOjpJc1NldHRpbmcoKQorYm9vbCBDSlNfUHJvcFZhbHVlOjpJc1NldHRpbmcoKQogewogCXJldHVybiBtX2JJc1NldHRpbmc7CiB9CiAKLUZYX0JPT0wgQ0pTX1Byb3BWYWx1ZTo6SXNHZXR0aW5nKCkKK2Jvb2wgQ0pTX1Byb3BWYWx1ZTo6SXNHZXR0aW5nKCkKIHsKIAlyZXR1cm4gIW1fYklzU2V0dGluZzsKIH0KQEAgLTQ4MCw5ICs0ODAsOSBAQAogCW1fcEFycmF5ID0gcEFycmF5OwogfQogCi1GWF9CT09MIENKU19BcnJheTo6SXNBdHRhY2hlZCgpCitib29sIENKU19BcnJheTo6SXNBdHRhY2hlZCgpCiB7Ci0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBDSlNfQXJyYXk6OkdldEVsZW1lbnQodW5zaWduZWQgaW5kZXgsQ0pTX1ZhbHVlICZ2YWx1ZSkKQEAgLTU0Myw5ICs1NDMsOSBAQAogewogfQogCi1GWF9CT09MCUNKU19EYXRlOjpJc1ZhbGlkRGF0ZSgpCitib29sCUNKU19EYXRlOjpJc1ZhbGlkRGF0ZSgpCiB7Ci0JaWYobV9wRGF0ZS5Jc0VtcHR5KCkpIHJldHVybiBGQUxTRTsKKwlpZihtX3BEYXRlLklzRW1wdHkoKSkgcmV0dXJuIGZhbHNlOwogCXJldHVybiAhSlNfUG9ydElzTmFuKEpTX1RvTnVtYmVyKG1faXNvbGF0ZSwgbV9wRGF0ZSkpOwogfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmNwcAppbmRleCBkYWVjZGJlLi4wYWEyM2QxIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5jcHAKQEAgLTcyLDc2ICs3Miw3NiBAQAogICAgIEwiSmFudWFyeSIsIEwiRmVicnVhcnkiLCBMIk1hcmNoIiwgTCJBcHJpbCIsIEwiTWF5IiwgTCJKdW5lIiwgTCJKdWx5IiwgTCJBdWd1c3QiLCBMIlNlcHRlbWJlciIsIEwiT2N0b2JlciIsIEwiTm92ZW1iZXIiLCBMIkRlY2VtYmVyIgogfTsKIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNOdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN0cmluZykKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OklzTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpCiB7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgc1RyaW0gPSBTdHJUcmltKHN0cmluZyk7CiAgICAgY29uc3QgRlhfV0NIQVIqIHBUcmltID0gc1RyaW0uY19zdHIoKTsKICAgICBjb25zdCBGWF9XQ0hBUiogcCA9IHBUcmltOwogCiAKLSAgICBGWF9CT09MIGJEb3QgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJLWEpTID0gRkFMU0U7CisgICAgYm9vbCBiRG90ID0gZmFsc2U7CisgICAgYm9vbCBiS1hKUyA9IGZhbHNlOwogCiAgICAgd2NoYXJfdCBjOwogICAgIHdoaWxlICgoYyA9ICpwKSkKICAgICB7CiAgICAgICAgIGlmIChjID09ICcuJyB8fCBjID09ICcsJykKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGJEb3QpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIGJEb3QgPSBUUlVFOworICAgICAgICAgICAgaWYgKGJEb3QpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGJEb3QgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKGMgPT0gJy0nIHx8IGMgPT0gJysnKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAocCAhPSBwVHJpbSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ2UnIHx8IGMgPT0gJ0UnKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoYktYSlMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICAgICAgcCsrOwogICAgICAgICAgICAgYyA9ICpwOwogICAgICAgICAgICAgaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJLWEpTID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiS1hKUyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlIGlmICghSXNEaWdpdChjKSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHArKzsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdCh3Y2hhcl90IGNoKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdCh3Y2hhcl90IGNoKQogewogICAgIHJldHVybiAoY2ggPj0gTCcwJyAmJiBjaCA8PSBMJzknKTsKIH0KIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdChjaGFyIGNoKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdChjaGFyIGNoKQogewogICAgIHJldHVybiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jyk7CiB9CiAKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFiZXRpYyh3Y2hhcl90IGNoKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6SXNBbHBoYWJldGljKHdjaGFyX3QgY2gpCiB7CiAgICAgcmV0dXJuICgoY2ggPj0gTCdhJyAmJiBjaCA8PSBMJ3onKSB8fCAoY2ggPj0gTCdBJyAmJiBjaCA8PSBMJ1onKSk7CiB9CiAKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFOdW1lcmljKHdjaGFyX3QgY2gpCitib29sIENKU19QdWJsaWNNZXRob2RzOjpJc0FscGhhTnVtZXJpYyh3Y2hhcl90IGNoKQogewogICAgIHJldHVybiAoSXNEaWdpdChjaCkgfHwgSXNBbHBoYWJldGljKGNoKSk7CiB9CiAKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6Om1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSx3Y2hhcl90IGNfTWFzaykKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6Om1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSx3Y2hhcl90IGNfTWFzaykKIHsKICAgICBzd2l0Y2ggKGNfTWFzaykKICAgICB7CkBAIC0xNTIsMTMgKzE1MiwxMyBAQAogICAgIGNhc2UgTCdPJzoKICAgICAgICAgcmV0dXJuIElzQWxwaGFOdW1lcmljKGNfQ2hhbmdlKTsKICAgICBjYXNlIEwnWCc6Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gKGNfQ2hhbmdlID09IGNfTWFzayk7CiAgICAgfQogfQogCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjppc1Jlc2VydmVkTWFza0NoYXIod2NoYXJfdCBjaCkKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OmlzUmVzZXJ2ZWRNYXNrQ2hhcih3Y2hhcl90IGNoKQogewogICAgIHJldHVybiBjaCA9PSBMJzknIHx8IGNoID09IEwnQScgfHwgY2ggPT0gTCdPJyB8fCBjaCA9PSBMJ1gnOwogfQpAQCAtMjI2LDEzICsyMjYsMTMgQEAKICAgICByZXR1cm4gU3RyUlRyaW0oU3RyTFRyaW0ocFN0cikpOwogfQogCi1kb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzd1NvdXJjZSwgRlhfQk9PTCYgYkFsbERpZ2l0cywgRlhfQk9PTCYgYkRvdCwgRlhfQk9PTCYgYlNpZ24sIEZYX0JPT0wmIGJLWEpTKQorZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZU51bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsIGJvb2wmIGJBbGxEaWdpdHMsIGJvb2wmIGJEb3QsIGJvb2wmIGJTaWduLCBib29sJiBiS1hKUykKIHsKLSAgICBiRG90ID0gRkFMU0U7Ci0gICAgYlNpZ24gPSBGQUxTRTsKLSAgICBiS1hKUyA9IEZBTFNFOworICAgIGJEb3QgPSBmYWxzZTsKKyAgICBiU2lnbiA9IGZhbHNlOworICAgIGJLWEpTID0gZmFsc2U7CiAKLSAgICBGWF9CT09MIGJEaWdpdEV4aXN0ID0gRkFMU0U7CisgICAgYm9vbCBiRGlnaXRFeGlzdCA9IGZhbHNlOwogCiAgICAgY29uc3QgRlhfV0NIQVIqIHAgPSBzd1NvdXJjZTsKICAgICB3Y2hhcl90IGM7CkBAIC0yNTMsNyArMjUzLDcgQEAKIAogICAgIGlmICghcFN0YXJ0KQogICAgIHsKLSAgICAgICAgYkFsbERpZ2l0cyA9IEZBTFNFOworICAgICAgICBiQWxsRGlnaXRzID0gZmFsc2U7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtMjY3LDcgKzI2Nyw3IEBACiAKICAgICBkb3VibGUgZFJldCA9IDA7CiAgICAgcCA9IHBTdGFydDsKLSAgICBiQWxsRGlnaXRzID0gVFJVRTsKKyAgICBiQWxsRGlnaXRzID0gdHJ1ZTsKICAgICBDRlhfV2lkZVN0cmluZyBzd0RpZ2l0czsKIAogICAgIHdoaWxlIChwIDw9IHBFbmQpCkBAIC0yNzcsMTQgKzI3NywxNCBAQAogICAgICAgICBpZiAoSXNEaWdpdChjKSkKICAgICAgICAgewogICAgICAgICAgICAgc3dEaWdpdHMgKz0gYzsKLSAgICAgICAgICAgIGJEaWdpdEV4aXN0ID0gVFJVRTsKKyAgICAgICAgICAgIGJEaWdpdEV4aXN0ID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIHN3aXRjaCAoYykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgTCcgJzoKLSAgICAgICAgICAgICAgICBiQWxsRGlnaXRzID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYkFsbERpZ2l0cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBMJy4nOgogICAgICAgICAgICAgY2FzZSBMJywnOgpAQCAtMjk4LDEwICsyOTgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gTCcwJzsKICAgICAgICAgICAgICAgICAgICAgICAgIHN3RGlnaXRzICs9IEwnLic7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiRGlnaXRFeGlzdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBiRGlnaXRFeGlzdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBiRG90ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYkRvdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgJ2UnOgpAQCAtMzEyLDcgKzMxMiw3IEBACiAgICAgICAgICAgICAgICAgICAgIGMgPSAqcDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiS1hKUyA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBiS1hKUyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBzd0RpZ2l0cyArPSAnZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBjOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0zMjIsMjEgKzMyMiwyMSBAQAogICAgICAgICAgICAgICAgIGlmICghYkRpZ2l0RXhpc3QgJiYgIWJTaWduKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gYzsKLSAgICAgICAgICAgICAgICAgICAgYlNpZ24gPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBiU2lnbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYkFsbERpZ2l0cyA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJBbGxEaWdpdHMgPSBmYWxzZTsKIAogICAgICAgICAgICAgICAgIGlmIChwICE9IHBTdGFydCAmJiAhYkRvdCAmJiBiRGlnaXRFeGlzdCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHN3RGlnaXRzICs9IEwnLic7Ci0gICAgICAgICAgICAgICAgICAgIGJEb3QgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBiRG90ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYkRvdCA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICBiRGlnaXRFeGlzdCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBiRG90ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJEaWdpdEV4aXN0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIHN3RGlnaXRzID0gTCIiOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTM3NCwxOSArMzc0LDE5IEBACiAKIGRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UpCiB7Ci0gICAgRlhfQk9PTCBiQWxsRGlnaXRzID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBiRG90ID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBiU2lnbiA9IEZBTFNFOwotICAgIEZYX0JPT0wgYktYSlMgPSBGQUxTRTsKKyAgICBib29sIGJBbGxEaWdpdHMgPSBmYWxzZTsKKyAgICBib29sIGJEb3QgPSBmYWxzZTsKKyAgICBib29sIGJTaWduID0gZmFsc2U7CisgICAgYm9vbCBiS1hKUyA9IGZhbHNlOwogCiAgICAgcmV0dXJuIFBhcnNlTnVtYmVyKHN3U291cmNlLCBiQWxsRGlnaXRzLCBiRG90LCBiU2lnbiwgYktYSlMpOwogfQogCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlLCBkb3VibGUgJiBkUmV0LCBGWF9CT09MICYgYkRvdCkKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkNvbnZlcnRTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsIGRvdWJsZSAmIGRSZXQsIGJvb2wgJiBiRG90KQogewotICAgIEZYX0JPT0wgYkFsbERpZ2l0cyA9IEZBTFNFOwotICAgIEZYX0JPT0wgYlNpZ24gPSBGQUxTRTsKLSAgICBGWF9CT09MIGJLWEpTID0gRkFMU0U7CisgICAgYm9vbCBiQWxsRGlnaXRzID0gZmFsc2U7CisgICAgYm9vbCBiU2lnbiA9IGZhbHNlOworICAgIGJvb2wgYktYSlMgPSBmYWxzZTsKIAogICAgIGRSZXQgPSBQYXJzZU51bWJlcihzd1NvdXJjZSwgYkFsbERpZ2l0cywgYkRvdCwgYlNpZ24sIGJLWEpTKTsKIApAQCAtNDc3LDcgKzQ3Nyw3IEBACiAgICAgcmV0dXJuIHN3UmV0OwogfQogCi1kb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTm9ybWFsRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLCBGWF9CT09MJiBiV3JvbmdGb3JtYXQpCitkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTm9ybWFsRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLCBib29sJiBiV3JvbmdGb3JtYXQpCiB7CiAgICAgZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsKIApAQCAtNTI1LDcgKzUyNSw3IEBACiAgICAgICAgICAgICBuTW9udGggPSBudW1iZXJbMV07CiAgICAgICAgIH0KIAotICAgICAgICBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKKyAgICAgICAgYldyb25nRm9ybWF0ID0gZmFsc2U7CiAgICAgfQogICAgIGVsc2UgaWYgKG5JbmRleCA9PSAzKQogICAgIHsKQEAgLTU1MiwxMSArNTUyLDExIEBACiAgICAgICAgICAgICBuWWVhciA9IG51bWJlclsyXTsKICAgICAgICAgfQogCi0gICAgICAgIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOworICAgICAgICBiV3JvbmdGb3JtYXQgPSBmYWxzZTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKKyAgICAgICAgYldyb25nRm9ybWF0ID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIGR0OwogICAgIH0KIApAQCAtNTY1LDcgKzU2NSw3IEBACiAgICAgcmV0dXJuIEpTX0RhdGVQYXJzZShzd1RlbXAuY19zdHIoKSk7CiB9CiAKLWRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdmFsdWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICYgZm9ybWF0LCBGWF9CT09MJiBiV3JvbmdGb3JtYXQpCitkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmIGZvcm1hdCwgYm9vbCYgYldyb25nRm9ybWF0KQogewogICAgIGRvdWJsZSBkdCA9IEpTX0dldERhdGVUaW1lKCk7CiAKQEAgLTU4MSw5ICs1ODEsOSBAQAogCiAgICAgaW50IG5ZZWFyU3ViID0gOTk7IC8vblllYXIgLSAyMDAwOwogCi0gICAgRlhfQk9PTCBiUG0gPSBGQUxTRTsKLSAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7Ci0gICAgYldyb25nRm9ybWF0ID0gRkFMU0U7CisgICAgYm9vbCBiUG0gPSBmYWxzZTsKKyAgICBib29sIGJFeGl0ID0gZmFsc2U7CisgICAgYldyb25nRm9ybWF0ID0gZmFsc2U7CiAKICAgICBpbnQgaT0wOwogICAgIGludCBqPTA7CkBAIC03MTUsNyArNzE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc01vbnRoID0gUGFyc2VTdHJpbmdTdHJpbmcodmFsdWUsIGosIG5Ta2lwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZpbmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgMTI7IG0rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc01vbnRoLkNvbXBhcmVOb0Nhc2UobW9udGhzW21dKSA9PSAwKQpAQCAtNzIzLDcgKzcyMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Nb250aCA9IG0gKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKz0zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKz1uU2tpcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRmluZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTc1Nyw3ICs3NTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmluZCA9IGZhbHNlOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzTW9udGggPSBQYXJzZVN0cmluZ1N0cmluZyh2YWx1ZSwgaiwgblNraXApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc01vbnRoLk1ha2VMb3dlcigpOwpAQCAtNzcyLDcgKzc3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Nb250aCA9IG0gKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZpbmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC03OTUsOCArNzk1LDggQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPj0gdmFsdWUuR2V0TGVuZ3RoKCkgfHwgZm9ybWF0LkdldEF0KGkpICE9IHZhbHVlLkdldEF0KGopKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgaisrOwpAQCAtODA0LDggKzgwNCw4IEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZGogPT0gaikKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJFeGl0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBiRXhpdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTgxMywxMiArODEzLDEyIEBACiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5HZXRMZW5ndGgoKSA8PSBqKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBiRXhpdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvcm1hdC5HZXRBdChpKSAhPSB2YWx1ZS5HZXRBdChqKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJFeGl0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYldyb25nRm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGkrKzsKQEAgLTgzMywxOSArODMzLDE5IEBACiAgICAgICAgIG5ZZWFyICs9IDIwMDA7CiAKICAgICBpZiAobk1vbnRoIDwgMSB8fCBuTW9udGggPiAxMikKLSAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKKyAgICAgICAgYldyb25nRm9ybWF0ID0gdHJ1ZTsKIAogICAgIGlmIChuRGF5IDwgMSB8fCBuRGF5ID4gMzEpCi0gICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CisgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IHRydWU7CiAKICAgICBpZiAobkhvdXIgPCAwIHx8IG5Ib3VyID4gMjQpCi0gICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CisgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IHRydWU7CiAKICAgICBpZiAobk1pbiA8IDAgfHwgbk1pbiA+IDYwKQotICAgICAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOworICAgICAgICBiV3JvbmdGb3JtYXQgPSB0cnVlOwogCiAgICAgaWYgKG5TZWMgPCAwIHx8IG5TZWMgPiA2MCkKLSAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKKyAgICAgICAgYldyb25nRm9ybWF0ID0gdHJ1ZTsKIAogICAgIGRvdWJsZSBkUmV0ID0gMDsKIApAQCAtMTAyMSw3ICsxMDIxLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8vZnVuY3Rpb24gQUZOdW1iZXJfRm9ybWF0KG5EZWMsIHNlcFN0eWxlLCBuZWdTdHlsZSwgY3VyclN0eWxlLCBzdHJDdXJyZW5jeSwgYkN1cnJlbmN5UHJlcGVuZCkKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTnVtYmVyX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZOdW1iZXJfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAjaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8KICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CkBAIC0xMDMzLDIxICsxMDMzLDIxIEBACiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gNikKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgIENGWF9CeXRlU3RyaW5nIHN0clZhbHVlID0gU3RyVHJpbShDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpKTsKIAotICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHJldHVybiBUUlVFOworICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHJldHVybiB0cnVlOwogCiAgICAgaW50IGlEZWMgPSBwYXJhbXNbMF0uVG9JbnQoKTsKICAgICBpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdLlRvSW50KCk7CiAgICAgaW50IGlOZWdTdHlsZSA9IHBhcmFtc1syXS5Ub0ludCgpOwogICAgIC8vIHBhcmFtc1szXSBpcyBpQ3VyclN0eWxlLCBpdCdzIG5vdCB1c2VkLgogICAgIHN0ZDo6d3N0cmluZyB3c3RyQ3VycmVuY3kocGFyYW1zWzRdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOwotICAgIEZYX0JPT0wgYkN1cnJlbmN5UHJlcGVuZCA9IHBhcmFtc1s1XS5Ub0Jvb2woKTsKKyAgICBib29sIGJDdXJyZW5jeVByZXBlbmQgPSBwYXJhbXNbNV0uVG9Cb29sKCk7CiAKICAgICBpZiAoaURlYyA8IDApIGlEZWMgPSAtaURlYzsKIApAQCAtMTIyNCwxMSArMTIyNCwxMSBAQAogICAgIH0KICAgICBWYWx1ZSA9IHN0clZhbHVlMi5jX3N0cigpOwogI2VuZGlmCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8vZnVuY3Rpb24gQUZOdW1iZXJfS2V5c3Ryb2tlKG5EZWMsIHNlcFN0eWxlLCBuZWdTdHlsZSwgY3VyclN0eWxlLCBzdHJDdXJyZW5jeSwgYkN1cnJlbmN5UHJlcGVuZCkKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTnVtYmVyX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZOdW1iZXJfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMTIzNiwxMyArMTIzNiwxMyBAQAogICAgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKICAgICBpZihwYXJhbXMuc2l6ZSgpIDwgMikKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgaW50IGlTZXBTdHlsZSA9IHBhcmFtc1sxXS5Ub0ludCgpOwogCiAgICAgaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKICAgICAgICAgaVNlcFN0eWxlID0gMDsKICAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgJiB3X3N0ckNoYW5nZSA9IHBFdmVudC0+Q2hhbmdlKCk7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgd19zdHJWYWx1ZSA9IHZhbDsKQEAgLTEyNTIsMTggKzEyNTIsMTggQEAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ckNoYW5nZSA9IHdfc3RyQ2hhbmdlOwogICAgICAgICBDRlhfV2lkZVN0cmluZyB3c3RyVmFsdWUgPSBTdHJMVHJpbSh3X3N0clZhbHVlLmNfc3RyKCkpOwogICAgICAgICBpZiAod3N0clZhbHVlLklzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dUZW1wID0gd3N0clZhbHVlOwogICAgICAgICBzd1RlbXAuUmVwbGFjZShMIiwiLCBMIi4iKTsKICAgICAgICAgaWYgKCFJc051bWJlcihzd1RlbXAuY19zdHIoKSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOworICAgICAgICAgICAgcEV2ZW50LT5SYygpID0gZmFsc2U7CiAgICAgICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU0FGTlVNQkVSX0tFWVNUUk9LRSk7CiAgICAgICAgICAgICBBbGVydChwQ29udGV4dCwgc0Vycm9yLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsgLy8gaXQgaGFwcGVucyBhZnRlciB0aGUgbGFzdCBrZXlzdHJva2UgYW5kIGJlZm9yZSB2YWxpZGF0aW5nLAorICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gaXQgaGFwcGVucyBhZnRlciB0aGUgbGFzdCBrZXlzdHJva2UgYW5kIGJlZm9yZSB2YWxpZGF0aW5nLAogICAgIH0KIAogICAgIHN0ZDo6d3N0cmluZyB3X3N0clZhbHVlMiA9IHdfc3RyVmFsdWUuY19zdHIoKTsKQEAgLTEyNzEsMTUgKzEyNzEsMTUgQEAKICAgICBzdGQ6OndzdHJpbmcgd19zdHJTZWxlY3RlZDsKICAgICBpZigtMSAhPSBwRXZlbnQtPlNlbFN0YXJ0KCkpCiAgICAgICAgIHdfc3RyU2VsZWN0ZWQgPSB3X3N0clZhbHVlMi5zdWJzdHIocEV2ZW50LT5TZWxTdGFydCgpLChwRXZlbnQtPlNlbEVuZCgpIC0gcEV2ZW50LT5TZWxTdGFydCgpKSk7Ci0gICAgRlhfQk9PTCBiSGFzU2lnbiA9ICh3X3N0clZhbHVlMi5maW5kKCctJykgIT0gLTEpICYmICh3X3N0clNlbGVjdGVkLmZpbmQoJy0nKSA9PSAtMSk7CisgICAgYm9vbCBiSGFzU2lnbiA9ICh3X3N0clZhbHVlMi5maW5kKCctJykgIT0gLTEpICYmICh3X3N0clNlbGVjdGVkLmZpbmQoJy0nKSA9PSAtMSk7CiAgICAgaWYgKGJIYXNTaWduKQogICAgIHsKICAgICAgICAgLy9jYW4ndCBpbnNlcnQgImNoYW5nZSIgaW4gZnJvbnQgdG8gc2lnbiBwb3N0aW9uLgogICAgICAgICBpZiAocEV2ZW50LT5TZWxTdGFydCgpID09IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKLSAgICAgICAgICAgIGJSYyA9IEZBTFNFOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICBib29sICZiUmMgPSBwRXZlbnQtPlJjKCk7CisgICAgICAgICAgICBiUmMgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjk3LDQ5ICsxMjk3LDQ5IEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIEZYX0JPT0wgYkhhc1NlcCA9ICh3X3N0clZhbHVlMi5maW5kKGNTZXApICE9IC0xKTsKKyAgICBib29sIGJIYXNTZXAgPSAod19zdHJWYWx1ZTIuZmluZChjU2VwKSAhPSAtMSk7CiAgICAgZm9yIChzdGQ6OndzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gd19zdHJDaGFuZ2UyLmJlZ2luKCk7IGl0ICE9IHdfc3RyQ2hhbmdlMi5lbmQoKTsgaXQrKykKICAgICB7CiAgICAgICAgIGlmICgqaXQgPT0gY1NlcCkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGJIYXNTZXApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwotICAgICAgICAgICAgICAgIGJSYyA9IEZBTFNFOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIGJvb2wgJmJSYyA9IHBFdmVudC0+UmMoKTsKKyAgICAgICAgICAgICAgICBiUmMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJIYXNTZXAgPSBUUlVFOworICAgICAgICAgICAgYkhhc1NlcCA9IHRydWU7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoKml0ID09IEwnLScpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChiSGFzU2lnbikKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7Ci0gICAgICAgICAgICAgICAgYlJjID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgYm9vbCAmYlJjID0gcEV2ZW50LT5SYygpOworICAgICAgICAgICAgICAgIGJSYyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGl0ICE9IHdfc3RyQ2hhbmdlMi5iZWdpbigpKSAvL3NpZ24ncyBwb3NpdGlvbiBpcyBub3QgY29ycmVjdAogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKLSAgICAgICAgICAgICAgICBiUmMgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICBib29sICZiUmMgPSBwRXZlbnQtPlJjKCk7CisgICAgICAgICAgICAgICAgYlJjID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocEV2ZW50LT5TZWxTdGFydCgpICE9IDApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwotICAgICAgICAgICAgICAgIGJSYyA9IEZBTFNFOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIGJvb2wgJmJSYyA9IHBFdmVudC0+UmMoKTsKKyAgICAgICAgICAgICAgICBiUmMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJIYXNTaWduID0gVFJVRTsKKyAgICAgICAgICAgIGJIYXNTaWduID0gdHJ1ZTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFJc0RpZ2l0KCppdCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKLSAgICAgICAgICAgIGJSYyA9IEZBTFNFOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICBib29sICZiUmMgPSBwRXZlbnQtPlJjKCk7CisgICAgICAgICAgICBiUmMgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzUxLDEyICsxMzUxLDEyIEBACiAgICAgd19zdHJWYWx1ZTIgPSB3X3ByZWZpeCArIHdfc3RyQ2hhbmdlMiArIHdfcG9zdGZpeDsKICAgICB3X3N0clZhbHVlID0gd19zdHJWYWx1ZTIuY19zdHIoKTsKICAgICB2YWwgPSB3X3N0clZhbHVlOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogCiB9CiAKIC8vZnVuY3Rpb24gQUZQZXJjZW50X0Zvcm1hdChuRGVjLCBzZXBTdHlsZSkKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGVyY2VudF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGVyY2VudF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXwogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwpAQCAtMTM2NywxNSArMTM2NywxNSBAQAogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpCiAgICAgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYoIXBFdmVudC0+bV9wVmFsdWUpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgIENGWF9CeXRlU3RyaW5nIHN0clZhbHVlID0gU3RyVHJpbShDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpKTsKICAgICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICBpbnQgaURlYyA9IHBhcmFtc1swXS5Ub0ludCgpOwogICAgIGlmIChpRGVjIDwgMCkKQEAgLTE0NjEsMTYgKzE0NjEsMTYgQEAKICAgICBzdHJWYWx1ZSArPSAiJSI7CiAgICAgVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0clZhbHVlKTsKICNlbmRpZgotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogLy9BRlBlcmNlbnRfS2V5c3Ryb2tlKG5EZWMsIHNlcFN0eWxlKQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQZXJjZW50X0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZQZXJjZW50X0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIHJldHVybiBBRk51bWJlcl9LZXlzdHJva2UoY2MscGFyYW1zLHZSZXQsc0Vycm9yKTsKIH0KIAogLy9mdW5jdGlvbiBBRkRhdGVfRm9ybWF0RXgoY0Zvcm1hdCkKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9Gb3JtYXRFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0Zvcm1hdEV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMTQ4MCwxOCArMTQ4MCwxOCBAQAogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICAgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYoIXBFdmVudC0+bV9wVmFsdWUpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKICAgICBDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSA9IHZhbDsKICAgICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICBDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwotICAgIEZYX0JPT0wgYldyb25nRm9ybWF0ID0gRkFMU0U7CisgICAgYm9vbCBiV3JvbmdGb3JtYXQgPSBmYWxzZTsKICAgICBkb3VibGUgZERhdGUgPSAwLjBmOwogCiAgICAgaWYoc3RyVmFsdWUuRmluZChMIkdNVCIpICE9IC0xKQpAQCAtMTUxMCwxMSArMTUxMCwxMSBAQAogICAgICAgICBDRlhfV2lkZVN0cmluZyBzd01zZzsKICAgICAgICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKS5jX3N0cigpLCBzRm9ybWF0LmNfc3RyKCkpOwogICAgICAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHZhbCA9ICBNYWtlRm9ybWF0RGF0ZShkRGF0ZSxzRm9ybWF0KTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpNYWtlSW50ZXJEYXRlKENGWF9XaWRlU3RyaW5nIHN0clZhbHVlKQpAQCAtMTU3OCw3ICsxNTc4LDcgQEAKIH0KIAogLy9BRkRhdGVfS2V5c3Ryb2tlRXgoY0Zvcm1hdCkKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMTU4OCwzMyArMTU4OCwzMyBAQAogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICAgewogICAgICAgICBzRXJyb3IgPSBMIkFGRGF0ZV9LZXlzdHJva2VFeCdzIHBhcmFtZXRlcnMnIHNpemUgciBub3QgY29ycmVjdCI7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGlmIChwRXZlbnQtPldpbGxDb21taXQoKSkKICAgICB7CiAgICAgICAgIGlmKCFwRXZlbnQtPm1fcFZhbHVlKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICBDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsKICAgICAgICAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLSAgICAgICAgRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiV3JvbmdGb3JtYXQgPSBmYWxzZTsKICAgICAgICAgZG91YmxlIGRSZXQgPSBNYWtlUmVndWxhckRhdGUoc3RyVmFsdWUsc0Zvcm1hdCxiV3JvbmdGb3JtYXQpOwogICAgICAgICBpZiAoYldyb25nRm9ybWF0IHx8IEpTX1BvcnRJc05hbihkUmV0KSkKICAgICAgICAgewogICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CiAgICAgICAgICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJTRURBVEUpLmNfc3RyKCksIHNGb3JtYXQuY19zdHIoKSk7CiAgICAgICAgICAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7Ci0gICAgICAgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcEV2ZW50LT5SYygpID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKIApAQCAtMTYyNCw3ICsxNjI0LDcgQEAKICAgICAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogCiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKQEAgLTE2NDUsNyArMTY0NSw3IEBACiB9CiAKIC8vQUZEYXRlX0tleXN0cm9rZUV4KGNGb3JtYXQpCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwogCkBAIC0xNjU1LDcgKzE2NTUsNyBAQAogICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwpAQCAtMTY3Niw3ICsxNjc2LDcgQEAKIH0KIAogLy9mdW5jdGlvbiBBRlRpbWVfRm9ybWF0KHB0ZikKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAKQEAgLTE2ODUsNyArMTY4NSw3IEBACiAgICAgICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwpAQCAtMTcwMyw3ICsxNzAzLDcgQEAKICAgICByZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KGNjLG5ld1BhcmFtcyx2UmV0LHNFcnJvcik7CiB9CiAKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKQEAgLTE3MTEsNyArMTcxMSw3IEBACiAgICAgICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwpAQCAtMTcyOSwxOCArMTcyOSwxOCBAQAogICAgIHJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MsbmV3UGFyYW1zLHZSZXQsc0Vycm9yKTsKIH0KIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0Zvcm1hdEV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfRm9ybWF0RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICByZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7CiB9CiAKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgcmV0dXJuIEFGRGF0ZV9LZXlzdHJva2VFeChjYyxwYXJhbXMsdlJldCxzRXJyb3IpOwogfQogCiAvL2Z1bmN0aW9uIEFGU3BlY2lhbF9Gb3JtYXQocHNmKQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTE3NDgsNyArMTc0OCw3IEBACiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHN0ZDo6c3RyaW5nIGNGb3JtYXQ7CkBAIC0xNzU4LDcgKzE3NTgsNyBAQAogICAgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKICAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgIHN0ZDo6c3RyaW5nIHN0clNyYyA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShWYWx1ZSkuY19zdHIoKTsKIApAQCAtMTc4OCwxMiArMTc4OCwxMiBAQAogICAgIHN0ZDo6c3RyaW5nIHN0ckRlczsKICAgICB1dGlsOjpwcmludHgoY0Zvcm1hdCxzdHJTcmMsc3RyRGVzKTsKICAgICBWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyRGVzLmNfc3RyKCkpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAKIC8vZnVuY3Rpb24gQUZTcGVjaWFsX0tleXN0cm9rZUV4KG1hc2spCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlRXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTE4MDQsMjMgKzE4MDQsMjMgQEAKICAgICBpZiAocGFyYW1zLnNpemUoKSA8IDEpCiAgICAgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcmIHZhbEV2ZW50ID0gcEV2ZW50LT5WYWx1ZSgpOwogCiAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ck1hc2sgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CiAgICAgaWYgKHdzdHJNYXNrLklzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgc3RkOjp3c3RyaW5nIHdzdHJWYWx1ZSA9IHZhbEV2ZW50LmNfc3RyKCk7CiAKICAgICBpZiAocEV2ZW50LT5XaWxsQ29tbWl0KCkpCiAgICAgewogICAgICAgICBpZiAod3N0clZhbHVlLmVtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBpbnQgaUluZGV4TWFzayA9IDA7CiAgICAgICAgIGZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdzdHJWYWx1ZS5iZWdpbigpOyBpdCAhPSB3c3RyVmFsdWUuZW5kKCk7IGl0KyspCiAgICAgICAgIHsKQEAgLTE4MzMsMzAgKzE4MzMsMzAgQEAKICAgICAgICAgaWYgKGlJbmRleE1hc2sgIT0gd3N0ck1hc2suR2V0TGVuZ3RoKCkgfHwgKGlJbmRleE1hc2sgIT0gd3N0clZhbHVlLnNpemUoKSAmJiB3c3RyTWFzay5HZXRMZW5ndGgoKSAhPSAwKSkKICAgICAgICAgewogICAgICAgICAgICAgQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOworICAgICAgICAgICAgcEV2ZW50LT5SYygpID0gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIENGWF9XaWRlU3RyaW5nICZ3aWRlQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKICAgICBzdGQ6OndzdHJpbmcgd0NoYW5nZSA9IHdpZGVDaGFuZ2UuY19zdHIoKTsKICAgICBpZiAod0NoYW5nZS5lbXB0eSgpKQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICBpbnQgaUluZGV4TWFzayA9IHBFdmVudC0+U2VsU3RhcnQoKTsKIAogICAgIGlmICh3c3RyVmFsdWUubGVuZ3RoKCkgLSAocEV2ZW50LT5TZWxFbmQoKS1wRXZlbnQtPlNlbFN0YXJ0KCkpICsgd0NoYW5nZS5sZW5ndGgoKSA+IChGWF9EV09SRCl3c3RyTWFzay5HZXRMZW5ndGgoKSkKICAgICB7CiAgICAgICAgIEFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwotICAgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHBFdmVudC0+UmMoKSA9IGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBpZiAoaUluZGV4TWFzayA+PSB3c3RyTWFzay5HZXRMZW5ndGgoKSAmJiAoIXdDaGFuZ2UuZW1wdHkoKSkpCiAgICAgewogICAgICAgICBBbGVydChwQ29udGV4dCwgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTV9UT09MT05HKS5jX3N0cigpKTsKLSAgICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICBwRXZlbnQtPlJjKCkgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgZm9yIChzdGQ6OndzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gd0NoYW5nZS5iZWdpbigpOyBpdCAhPSB3Q2hhbmdlLmVuZCgpOyBpdCsrKQpAQCAtMTg2NCw4ICsxODY0LDggQEAKICAgICAgICAgaWYgKGlJbmRleE1hc2sgPj0gd3N0ck1hc2suR2V0TGVuZ3RoKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIEFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwotICAgICAgICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHBFdmVudC0+UmMoKSA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgd2NoYXJfdCB3X01hc2sgPSB3c3RyTWFza1tpSW5kZXhNYXNrXTsKICAgICAgICAgaWYgKCFpc1Jlc2VydmVkTWFza0NoYXIod19NYXNrKSkKQEAgLTE4NzUsMTkgKzE4NzUsMTkgQEAKICAgICAgICAgd2NoYXJfdCB3X0NoYW5nZSA9ICppdDsKICAgICAgICAgaWYgKCFtYXNrU2F0aXNmaWVkKHdfQ2hhbmdlLHdfTWFzaykpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICBwRXZlbnQtPlJjKCkgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlJbmRleE1hc2srKzsKICAgICB9CiAKICAgICB3aWRlQ2hhbmdlID0gd0NoYW5nZS5jX3N0cigpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAKIC8vZnVuY3Rpb24gQUZTcGVjaWFsX0tleXN0cm9rZShwc2YpCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwogCkBAIC0xODk5LDE0ICsxODk5LDE0IEBACiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHN0ZDo6c3RyaW5nIGNGb3JtYXQ7CiAgICAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwogCiAgICAgaWYoIXBFdmVudC0+bV9wVmFsdWUpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIC8vQ0pTX1ZhbHVlIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKICAgICBDRlhfV2lkZVN0cmluZyYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgIHN0ZDo6c3RyaW5nIHN0clNyYyA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh2YWwpLmNfc3RyKCk7CkBAIC0xOTQ2LDcgKzE5NDYsNyBAQAogICAgIHJldHVybiBBRlNwZWNpYWxfS2V5c3Ryb2tlRXgoY2MscGFyYW1zMix2UmV0LHNFcnJvcik7CiB9CiAKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWVyZ2VDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWVyZ2VDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0xOTU2LDcgKzE5NTYsNyBAQAogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICAgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlOwpAQCAtMTk2Niw3ICsxOTY2LDcgQEAKICAgICBpZiAocEV2ZW50SGFuZGxlci0+V2lsbENvbW1pdCgpKQogICAgIHsKICAgICAgICAgdlJldCA9IHN3VmFsdWUuY19zdHIoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIENGWF9XaWRlU3RyaW5nIHByZWZpeCxwb3N0Zml4OwpAQCAtMTk4MywxMCArMTk4MywxMCBAQAogCiAgICAgdlJldCA9IChwcmVmaXggKyBwRXZlbnRIYW5kbGVyLT5DaGFuZ2UoKSArIHBvc3RmaXgpLmNfc3RyKCk7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQYXJzZURhdGVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZQYXJzZURhdGVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTE5OTQsMTMgKzE5OTQsMTMgQEAKICAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAyKQogICAgIHsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwogICAgIENGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCk7CiAKLSAgICBGWF9CT09MIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOworICAgIGJvb2wgYldyb25nRm9ybWF0ID0gZmFsc2U7CiAgICAgZG91YmxlIGREYXRlID0gTWFrZVJlZ3VsYXJEYXRlKHNWYWx1ZSxzRm9ybWF0LGJXcm9uZ0Zvcm1hdCk7CiAKICAgICBpZiAoSlNfUG9ydElzTmFuKGREYXRlKSkKQEAgLTIwMDgsMTQgKzIwMDgsMTQgQEAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CiAgICAgICAgIHN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSkuY19zdHIoKSwgc0Zvcm1hdC5jX3N0cigpKTsKICAgICAgICAgQWxlcnQoKENKU19Db250ZXh0ICopY2MsIHN3TXNnLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICB2UmV0ID0gZERhdGU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU2ltcGxlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIENKU19QdWJsaWNNZXRob2RzOjpBRlNpbXBsZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDMpCiAgICAgewpAQCAtMjAyMywxNCArMjAyMywxNCBAQAogICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgdlJldCA9IChkb3VibGUpQUZfU2ltcGxlKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpLCBwYXJhbXNbMV0uVG9Eb3VibGUoKSwgcGFyYW1zWzJdLlRvRG91YmxlKCkpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk1ha2VOdW1iZXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWFrZU51bWJlcihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICAgewpAQCAtMjAzOCwxMyArMjAzOCwxMyBAQAogICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHZSZXQgPSBQYXJzZVN0cmluZ1RvTnVtYmVyKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTaW1wbGVfQ2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIENKU19QdWJsaWNNZXRob2RzOjpBRlNpbXBsZV9DYWxjdWxhdGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAKQEAgLTIwNTQsNyArMjA1NCw3IEBACiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIENKU19WYWx1ZSBwYXJhbXMxID0gcGFyYW1zWzFdOwpAQCAtMjA2Miw3ICsyMDYyLDcgQEAKICAgICBpZiAoIXBhcmFtczEuSXNBcnJheU9iamVjdCgpICYmIHBhcmFtczEuR2V0VHlwZSgpICE9IFZUX3N0cmluZykKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIENQREZTREtfRG9jdW1lbnQqIHBSZWFkZXJEb2MgPSBwQ29udGV4dC0+R2V0UmVhZGVyRG9jdW1lbnQoKTsKQEAgLTIxNjIsMTMgKzIxNjIsMTMgQEAKICAgICBpZigoQ0pTX0V2ZW50SGFuZGxlciopcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpLT5tX3BWYWx1ZSkKICAgICAgICAgKChDSlNfRXZlbnRIYW5kbGVyKilwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCkpLT5WYWx1ZSgpID0ganNWYWx1ZS5Ub0NGWFdpZGVTdHJpbmcoKTsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyB0aGUgY3VycmVudCBldmVudCB0byBlbnN1cmUgdGhhdCBpdHMgdmFsdWUgaXMKICoqIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiAqLwogCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlJhbmdlX1ZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIENKU19QdWJsaWNNZXRob2RzOjpBRlJhbmdlX1ZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMjE3OCwxNyArMjE3OCwxNyBAQAogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDQpCiAgICAgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgaWYgKHBFdmVudC0+VmFsdWUoKS5Jc0VtcHR5KCkgKQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgZG91YmxlIGRFZW50VmFsdWUgPSBhdG9mKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwRXZlbnQtPlZhbHVlKCkpKTsKLSAgICBGWF9CT09MIGJHcmVhdGVyVGhhbiA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKKyAgICBib29sIGJHcmVhdGVyVGhhbiA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKICAgICBkb3VibGUgZEdyZWF0ZXJUaGFuID0gcGFyYW1zWzFdLlRvRG91YmxlKCk7Ci0gICAgRlhfQk9PTCBiTGVzc1RoYW4gPSBwYXJhbXNbMl0uVG9Cb29sKCk7CisgICAgYm9vbCBiTGVzc1RoYW4gPSBwYXJhbXNbMl0uVG9Cb29sKCk7CiAgICAgZG91YmxlIGRMZXNzVGhhbiA9IHBhcmFtc1szXS5Ub0RvdWJsZSgpOwogICAgIENGWF9XaWRlU3RyaW5nIHN3TXNnOwogCkBAIC0yMjE1LDEyICsyMjE1LDEyIEBACiAgICAgaWYgKCFzd01zZy5Jc0VtcHR5KCkpCiAgICAgewogICAgICAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7Ci0gICAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOworICAgICAgICBwRXZlbnQtPlJjKCkgPSBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRXh0cmFjdE51bXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRXh0cmFjdE51bXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKQEAgLTIyMjksNyArMjIyOSw3IEBACiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIENKU19BcnJheSBudW1zKGlzb2xhdGUpOwpAQCAtMjI2OSw1ICsyMjY5LDUgQEAKICAgICBlbHNlCiAgICAgICAgIHZSZXQuU2V0TnVsbCgpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2FwcC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2FwcC5jcHAKaW5kZXggYWYzMjk2NS4uMGYzNTI5NyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9hcHAuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvYXBwLmNwcApAQCAtMTM0LDEwICsxMzQsMTAgQEAKIAltX2FUaW1lci5SZW1vdmVBbGwoKTsKIH0KIAotRlhfQk9PTCBhcHA6OmFjdGl2ZURvY3MoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBhcHA6OmFjdGl2ZURvY3MoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGlmICghdnAuSXNHZXR0aW5nKCkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCA9IHBDb250ZXh0LT5HZXRSZWFkZXJBcHAoKTsKQEAgLTE2NiwxMjAgKzE2NiwxMjAgQEAKICAgICBlbHNlCiAgICAgICAgIHZwLlNldE51bGwoKTsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGFwcDo6Y2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpjYWxjdWxhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCWlmICh2cC5Jc1NldHRpbmcoKSkKIAl7CiAJCWJvb2wgYlZQOwogCQl2cCA+PiBiVlA7Ci0JCW1fYkNhbGN1bGF0ZSA9IChGWF9CT09MKWJWUDsKKwkJbV9iQ2FsY3VsYXRlID0gKGJvb2wpYlZQOwogCiAJCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJCUNQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBwQ29udGV4dC0+R2V0UmVhZGVyQXBwKCk7CiAJCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKIAkJQ0pTX0FycmF5IGFEb2NzKHBSdW50aW1lLT5HZXRJc29sYXRlKCkpOwogCQlpZiAoQ1BERlNES19Eb2N1bWVudCogcERvYyA9IHBBcHAtPkdldFNES0RvY3VtZW50KCkpCi0JCQlwRG9jLT5HZXRJbnRlckZvcm0oKS0+RW5hYmxlQ2FsY3VsYXRlKChGWF9CT09MKW1fYkNhbGN1bGF0ZSk7CisJCQlwRG9jLT5HZXRJbnRlckZvcm0oKS0+RW5hYmxlQ2FsY3VsYXRlKChib29sKW1fYkNhbGN1bGF0ZSk7CiAJfQogCWVsc2UKIAl7CiAJCXZwIDw8IChib29sKW1fYkNhbGN1bGF0ZTsKIAl9Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgYXBwOjpmb3Jtc1ZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBhcHA6OmZvcm1zVmVyc2lvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJaWYgKHZwLklzR2V0dGluZygpKQogCXsKIAkJdnAgPDwgSlNfTlVNX0ZPUk1TVkVSU0lPTjsKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCX0KIAotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgYXBwOjp2aWV3ZXJUeXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjp2aWV3ZXJUeXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKIAlpZiAodnAuSXNHZXR0aW5nKCkpCiAJewogCQl2cCA8PCBMInVua25vd24iOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCi0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBhcHA6OnZpZXdlclZhcmlhdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6dmlld2VyVmFyaWF0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKIAlpZiAodnAuSXNHZXR0aW5nKCkpCiAJewogCQl2cCA8PCBKU19TVFJfVklFV0VSVkFSSUFUSU9OOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCi0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBhcHA6OnZpZXdlclZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBhcHA6OnZpZXdlclZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCWlmICh2cC5Jc0dldHRpbmcoKSkKIAl7CiAJCXZwIDw8IEpTX1NUUl9WSUVXRVJWRVJTSU9OOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCi0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBhcHA6OnBsYXRmb3JtKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpwbGF0Zm9ybShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJaWYgKHZwLklzR2V0dGluZygpKQogCXsKIAkJdnAgPDwgSlNfU1RSX1BMQVRGT1JNOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCi0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBhcHA6Omxhbmd1YWdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpsYW5ndWFnZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJaWYgKHZwLklzR2V0dGluZygpKQogCXsKIAkJdnAgPDwgSlNfU1RSX0xBTkdVQU5HRTsKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCX0KIAotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIC8vY3JlYXRlcyBhIG5ldyBmZGYgb2JqZWN0IHRoYXQgY29udGFpbnMgbm8gZGF0YQogLy9jb21tZW50OiBuZWVkIHJlYWRlciBzdXBwb3J0CiAvL25vdGU6CiAvL0NGREZfRG9jdW1lbnQgKiBDUERGRG9jX0Vudmlyb25tZW50OjpOZXdGREYoKTsKLUZYX0JPT0wgYXBwOjpuZXdGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpuZXdGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIC8vb3BlbnMgYSBzcGVjaWZpZWQgcGRmIGRvY3VtZW50IGFuZCByZXR1cm5zIGl0cyBkb2N1bWVudCBvYmplY3QKIC8vY29tbWVudDpuZWVkIHJlYWRlciBzdXBwb3J0CiAvL25vdGU6IGFzIGRlZmluZWQgaW4ganMgcmVmZXJlbmNlLCB0aGUgcHJvdG8gb2YgdGhpcyBmdW5jdGlvbidzIGZvdXJ0aCBwYXJtZXRlcnMsIGhvdyBvbGQgYW4gZmRmIGRvY3VtZW50IHdoaWxlIGRvIG5vdCBzaG93IGl0LgogLy9DRkRGX0RvY3VtZW50ICogQ1BERkRvY19FbnZpcm9ubWVudDo6T3BlbkZERihzdHJpbmcgc3RyUGF0aCxib29sIGJVc2VyQ29udik7CiAKLUZYX0JPT0wgYXBwOjpvcGVuRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6b3BlbkZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGFwcDo6YWxlcnQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjphbGVydChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCWludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CiAJaWYgKGlTaXplIDwgMSkKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAKIAlDRlhfV2lkZVN0cmluZyBzd01zZyA9IEwiIjsKIAlDRlhfV2lkZVN0cmluZyBzd1RpdGxlID0gTCIiOwpAQCAtMzM2LDcgKzMzNiw3IEBACiAJCX0KIAkJZWxzZSBpZiAocGFyYW1zWzBdLkdldFR5cGUoKSA9PSBWVF9ib29sZWFuKQogCQl7Ci0JCQlGWF9CT09MIGJHZXQgPSBwYXJhbXNbMF0uVG9Cb29sKCk7CisJCQlib29sIGJHZXQgPSBwYXJhbXNbMF0uVG9Cb29sKCk7CiAJCQlpZiAoYkdldCkKIAkJCQlzd01zZyA9IEwidHJ1ZSI7CiAJCQllbHNlCkBAIC0zNTQsNyArMzU0LDcgQEAKIAl7CiAJCWlmIChwYXJhbXNbMF0uR2V0VHlwZSgpID09IFZUX2Jvb2xlYW4pCiAJCXsKLQkJCUZYX0JPT0wgYkdldCA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKKwkJCWJvb2wgYkdldCA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKIAkJCWlmIChiR2V0KQogCQkJCXN3TXNnID0gTCJ0cnVlIjsKIAkJCWVsc2UKQEAgLTM4NiwxMSArMzg2LDExIEBACiAJdlJldCA9IE1zZ0JveChwUnVudGltZS0+R2V0UmVhZGVyQXBwKCksIEpTR2V0UGFnZVZpZXcoY2MpLCBzd01zZy5jX3N0cigpLCBzd1RpdGxlLmNfc3RyKCksIGlUeXBlLCBpSWNvbik7CiAJcFJ1bnRpbWUtPkVuZEJsb2NrKCk7CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogCi1GWF9CT09MIGFwcDo6YmVlcChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBhcHA6OmJlZXAoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKIAlpZiAocGFyYW1zLnNpemUoKSA9PSAxKQogCXsKQEAgLTM5OCw0MiArMzk4LDQyIEBACiAJCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKIAkJQ1BERkRvY19FbnZpcm9ubWVudCAqIHBFbnYgPSBwUnVudGltZS0+R2V0UmVhZGVyQXBwKCk7CiAJCXBFbnYtPkpTX2FwcEJlZXAocGFyYW1zWzBdLlRvSW50KCkpOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCiAJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgYXBwOjpmaW5kQ29tcG9uZW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6ZmluZENvbXBvbmVudChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGFwcDo6cG9wVXBNZW51RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpwb3BVcE1lbnVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgYXBwOjpmcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6ZnMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgYXBwOjpzZXRJbnRlcnZhbChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBhcHA6OnNldEludGVydmFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlpZiAocGFyYW1zLnNpemUoKSA+IDIgfHwgcGFyYW1zLnNpemUoKSA9PSAwKQogCXsKIAkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJQ0ZYX1dpZGVTdHJpbmcgc2NyaXB0ID0gcGFyYW1zLnNpemUoKSA+IDAgPyAgcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpIDogTCIiOwogCWlmIChzY3JpcHQuSXNFbXB0eSgpKQogCXsKIAkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCiAJQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwpAQCAtNDYzLDE1ICs0NjMsMTUgQEAKIAogCXZSZXQgPSBwUmV0T2JqOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgYXBwOjpzZXRUaW1lT3V0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6c2V0VGltZU91dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCWlmIChwYXJhbXMuc2l6ZSgpID4gMiB8fCBwYXJhbXMuc2l6ZSgpID09IDApCiAJewogCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRCgoQ0pTX0NvbnRleHQqKWNjLCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CkBAIC00ODMsNyArNDgzLDcgQEAKIAlpZiAoc2NyaXB0LklzRW1wdHkoKSkKIAl7CiAJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCiAJRlhfRFdPUkQgZHdUaW1lT3V0ID0gcGFyYW1zLnNpemUoKSA+IDEgPyBwYXJhbXNbMV0uVG9JbnQoKSA6IDEwMDA7CkBAIC01MTIsMTAgKzUxMiwxMCBAQAogCiAJdlJldCA9IHBSZXRPYmo7CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBhcHA6OmNsZWFyVGltZU91dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBhcHA6OmNsZWFyVGltZU91dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtNTI1LDcgKzUyNSw3IEBACiAJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKIAl7CiAJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJaWYgKHBhcmFtc1swXS5HZXRUeXBlKCkgPT0gVlRfZnhvYmplY3QpCkBAIC01NjAsMTAgKzU2MCwxMCBAQAogCQl9CiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgYXBwOjpjbGVhckludGVydmFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6Y2xlYXJJbnRlcnZhbChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtNTczLDcgKzU3Myw3IEBACiAJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKIAl7CiAJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJaWYgKHBhcmFtc1swXS5HZXRUeXBlKCkgPT0gVlRfZnhvYmplY3QpCkBAIC02MDgsMTIgKzYwOCwxMiBAQAogCQl9CiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgYXBwOjpleGVjTWVudUl0ZW0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpleGVjTWVudUl0ZW0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIGFwcDo6VGltZXJQcm9jKENKU19UaW1lciogcFRpbWVyKQpAQCAtNjUxLDI0ICs2NTEsMjQgQEAKIAl9CiB9CiAKLUZYX0JPT0wgYXBwOjpnb0JhY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpnb0JhY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgLy8gTm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIFRSVUU7CisgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGFwcDo6Z29Gb3J3YXJkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6Z29Gb3J3YXJkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgIC8vIE5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiBUUlVFOworICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBhcHA6Om1haWxNc2coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjptYWlsTXNnKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOwogCi0JRlhfQk9PTCBiVUkgPSBUUlVFOworCWJvb2wgYlVJID0gdHJ1ZTsKIAlDRlhfV2lkZVN0cmluZyBjVG8gPSBMIiI7CiAJQ0ZYX1dpZGVTdHJpbmcgY0NjID0gTCIiOwogCUNGWF9XaWRlU3RyaW5nIGNCY2MgPSBMIiI7CkBAIC02NzYsNyArNjc2LDcgQEAKIAlDRlhfV2lkZVN0cmluZyBjTXNnID0gTCIiOwogCiAJaWYgKHBhcmFtcy5zaXplKCkgPCAxKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAogCWlmIChwYXJhbXNbMF0uR2V0VHlwZSgpID09IFZUX29iamVjdCkKIAl7CkBAIC03MDEsNyArNzAxLDcgQEAKIAkJY01zZyA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOwogCX0gZWxzZSB7CiAJCWlmIChwYXJhbXMuc2l6ZSgpIDwgMikKLQkJCXJldHVybiBGQUxTRTsKKwkJCXJldHVybiBmYWxzZTsKIAogCQliVUkgPSBwYXJhbXNbMF0uVG9Cb29sKCk7CiAJCWNUbyA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKTsKQEAgLTcyNiwxNiArNzI2LDE2IEBACiAJcEFwcC0+SlNfZG9jbWFpbEZvcm0oTlVMTCwgMCwgYlVJLCBjVG8uY19zdHIoKSwgY1N1YmplY3QuY19zdHIoKSwgY0NjLmNfc3RyKCksIGNCY2MuY19zdHIoKSwgY01zZy5jX3N0cigpKTsKIAlwUnVudGltZS0+RW5kQmxvY2soKTsKIAotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgYXBwOjpsYXVuY2hVUkwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpsYXVuY2hVUkwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgYXBwOjpydW50aW1lSGlnaGxpZ2h0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpydW50aW1lSGlnaGxpZ2h0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKIAlpZiAodnAuSXNTZXR0aW5nKCkpCiAJewpAQCAtNzQ2LDI0ICs3NDYsMjQgQEAKIAkJdnA8PG1fYlJ1bnRpbWVIaWdoTGlnaHQ7CiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgYXBwOjpmdWxsc2NyZWVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpmdWxsc2NyZWVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIGFwcDo6cG9wVXBNZW51KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6cG9wVXBNZW51KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAogCi1GWF9CT09MIGFwcDo6YnJvd3NlRm9yRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6YnJvd3NlRm9yRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIFRSVUU7CisgIHJldHVybiB0cnVlOwogfQogCiBDRlhfV2lkZVN0cmluZyBhcHA6OlN5c1BhdGhUb1BERlBhdGgoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNPbGRQYXRoKQpAQCAtNzkyLDE3ICs3OTIsMTcgQEAKIAlyZXR1cm4gc1JldDsKIH0KIAotRlhfQk9PTCBhcHA6Om5ld0RvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBhcHA6Om5ld0RvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgYXBwOjpvcGVuRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6b3BlbkRvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgYXBwOjpyZXNwb25zZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBhcHA6OnJlc3BvbnNlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJQ0ZYX1dpZGVTdHJpbmcgc3dRdWVzdGlvbiA9IEwiIjsKIAlDRlhfV2lkZVN0cmluZyBzd0xhYmVsID0gTCIiOwpAQCAtODczLDcgKzg3Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTlBVVF9CWVRFUyk7CiAgICAgaWYgKG5MZW5ndGhCeXRlcyA8PSAwKSB7CiAgICAgICAgIHZSZXQuU2V0TnVsbCgpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbkxlbmd0aEJ5dGVzID0gc3RkOjptaW4obkxlbmd0aEJ5dGVzLCBNQVhfSU5QVVRfQllURVMpOwogCkBAIC04ODEsMTUgKzg4MSwxNSBAQAogICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoKHVuc2lnbmVkIHNob3J0KilwQnVmZi5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5MZW5ndGhCeXRlcyAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOwogICAgIHZSZXQgPSByZXRfc3RyaW5nLmNfc3RyKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgYXBwOjptZWRpYShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6bWVkaWEoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgYXBwOjpleGVjRGlhbG9nKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6ZXhlY0RpYWxvZyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9jb2xvci5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbG9yLmNwcAppbmRleCBhMmJiYWRjLi43YzNjMTM3IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbG9yLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbG9yLmNwcApAQCAtMTU1LDcgKzE1NSw3IEBACiB9CiAKICNkZWZpbmUgSlNfSU1QTEVNRU5UX0NPTE9SUFJPUChwcm9wLCB2YXIpXAotRlhfQk9PTCBjb2xvcjo6cHJvcChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpXAorYm9vbCBjb2xvcjo6cHJvcChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpXAoge1wKIAlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjO1wKIAl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKS0+R2V0SXNvbGF0ZSgpO1wKQEAgLTE2OCwxMCArMTY4LDEwIEBACiAJZWxzZVwKIAl7XAogCQlDSlNfQXJyYXkgYXJyYXkoaXNvbGF0ZSk7XAotCQlpZiAoIXZwLkNvbnZlcnRUb0FycmF5KGFycmF5KSkgcmV0dXJuIEZBTFNFO1wKKwkJaWYgKCF2cC5Db252ZXJ0VG9BcnJheShhcnJheSkpIHJldHVybiBmYWxzZTtcCiAJCUNvbnZlcnRBcnJheVRvUFdMQ29sb3IoYXJyYXksIHZhcik7XAogCX1cCi0JcmV0dXJuIFRSVUU7XAorCXJldHVybiB0cnVlO1wKIH0KIAogSlNfSU1QTEVNRU5UX0NPTE9SUFJPUCh0cmFuc3BhcmVudCwgbV9jclRyYW5zcGFyZW50KQpAQCAtMTg3LDEzICsxODcsMTMgQEAKIEpTX0lNUExFTUVOVF9DT0xPUlBST1AoZ3JheSwgbV9jckdyYXkpCiBKU19JTVBMRU1FTlRfQ09MT1JQUk9QKGx0R3JheSwgbV9jckxUR3JheSkKIAotRlhfQk9PTCBjb2xvcjo6Y29udmVydChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBjb2xvcjo6Y29udmVydChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCXY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7CiAJaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLQlpZiAoaVNpemUgPCAyKSByZXR1cm4gRkFMU0U7CisJaWYgKGlTaXplIDwgMikgcmV0dXJuIGZhbHNlOwogCUNKU19BcnJheSBhU291cmNlKGlzb2xhdGUpOwotCWlmICghcGFyYW1zWzBdLkNvbnZlcnRUb0FycmF5KGFTb3VyY2UpKSByZXR1cm4gRkFMU0U7CisJaWYgKCFwYXJhbXNbMF0uQ29udmVydFRvQXJyYXkoYVNvdXJjZSkpIHJldHVybiBmYWxzZTsKIAogCUNQV0xfQ29sb3IgY3JTb3VyY2U7CiAJQ29udmVydEFycmF5VG9QV0xDb2xvcihhU291cmNlLCBjclNvdXJjZSk7CkBAIC0yMjQsMTggKzIyNCwxOCBAQAogCUNvbnZlcnRQV0xDb2xvclRvQXJyYXkoY3JEZXN0LCBhRGVzdCk7CiAJdlJldCA9IGFEZXN0OwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgY29sb3I6OmVxdWFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGNvbG9yOjplcXVhbChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCXY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7Ci0JaWYgKHBhcmFtcy5zaXplKCkgPCAyKSByZXR1cm4gRkFMU0U7CisJaWYgKHBhcmFtcy5zaXplKCkgPCAyKSByZXR1cm4gZmFsc2U7CiAKIAlDSlNfQXJyYXkgYXJyYXkxKGlzb2xhdGUpLCBhcnJheTIoaXNvbGF0ZSk7CiAKLQlpZiAoIXBhcmFtc1swXS5Db252ZXJ0VG9BcnJheShhcnJheTEpKSByZXR1cm4gRkFMU0U7Ci0JaWYgKCFwYXJhbXNbMV0uQ29udmVydFRvQXJyYXkoYXJyYXkyKSkgcmV0dXJuIEZBTFNFOworCWlmICghcGFyYW1zWzBdLkNvbnZlcnRUb0FycmF5KGFycmF5MSkpIHJldHVybiBmYWxzZTsKKwlpZiAoIXBhcmFtc1sxXS5Db252ZXJ0VG9BcnJheShhcnJheTIpKSByZXR1cm4gZmFsc2U7CiAKIAlDUFdMX0NvbG9yIGNvbG9yMTsKIAlDUFdMX0NvbG9yIGNvbG9yMjsKQEAgLTI0Niw2ICsyNDYsNiBAQAogCWNvbG9yMS5Db252ZXJ0Q29sb3JUeXBlKGNvbG9yMi5uQ29sb3JUeXBlKTsKIAogCXZSZXQgPSBjb2xvcjEgPT0gY29sb3IyOwotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbnNvbGUuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9jb25zb2xlLmNwcAppbmRleCBlZDliMWZiLi40ZDgwNjcxIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbnNvbGUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvY29uc29sZS5jcHAKQEAgLTM4LDI4ICszOCwyOCBAQAogewogfQogCi1GWF9CT09MIGNvbnNvbGU6OmNsZWFyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGNvbnNvbGU6OmNsZWFyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgY29uc29sZTo6aGlkZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBjb25zb2xlOjpoaWRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgY29uc29sZTo6cHJpbnRsbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBjb25zb2xlOjpwcmludGxuKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJaWYgKHBhcmFtcy5zaXplKCkgPCAxKQogCXsKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJfQotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGNvbnNvbGU6OnNob3coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgY29uc29sZTo6c2hvdyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZXZlbnQuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9ldmVudC5jcHAKaW5kZXggZjU3YjFmYi4uZWU3M2U0MiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9ldmVudC5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9ldmVudC5jcHAKQEAgLTU2LDcgKzU2LDcgQEAKIHsKIH0KIAotRlhfQk9PTCBldmVudDo6Y2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgZXZlbnQ6OmNoYW5nZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC03MywxMiArNzMsMTIgQEAKIAl7CiAJCXZwIDw8IHdDaGFuZ2U7CiAJfQotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGV2ZW50OjpjaGFuZ2VFeChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGV2ZW50OjpjaGFuZ2VFeChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CisJaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gZmFsc2U7CiAKIAlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTg2LDEyICs4NiwxMiBAQAogCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKIAl2cCA8PCBwRXZlbnQtPkNoYW5nZUV4KCk7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6OmNvbW1pdEtleShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGV2ZW50Ojpjb21taXRLZXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOworCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIGZhbHNlOwogCiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC05OSwxMCArOTksMTAgQEAKIAlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCiAJdnAgPDwgcEV2ZW50LT5Db21taXRLZXkoKTsKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBldmVudDo6ZmllbGRGdWxsKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgZXZlbnQ6OmZpZWxkRnVsbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0xMTAsMTggKzExMCwxOCBAQAogCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKIAlpZiAoIXZwLklzR2V0dGluZygpICYmIHdjc2NtcCgoY29uc3Qgd2NoYXJfdCopcEV2ZW50LT5OYW1lKCksTCJLZXlzdHJva2UiKSAhPSAwKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAogCWlmIChwRXZlbnQtPkZpZWxkRnVsbCgpKQotCQl2cCA8PCBUUlVFOworCQl2cCA8PCB0cnVlOwogCWVsc2UKLQkJdnAgPDwgRkFMU0U7Ci0JcmV0dXJuIFRSVUU7CisJCXZwIDw8IGZhbHNlOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGV2ZW50OjprZXlEb3duKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgZXZlbnQ6OmtleURvd24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOworCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIGZhbHNlOwogCiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0xMjksMTUgKzEyOSwxNSBAQAogCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKIAlpZiAocEV2ZW50LT5LZXlEb3duKCkpCi0JCXZwIDw8IFRSVUU7CisJCXZwIDw8IHRydWU7CiAJZWxzZQotCQl2cCA8PCBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKKwkJdnAgPDwgZmFsc2U7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6Om1vZGlmaWVyKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgZXZlbnQ6Om1vZGlmaWVyKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBGQUxTRTsKKwlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBmYWxzZTsKIAogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMTQ1LDE1ICsxNDUsMTUgQEAKIAlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCiAJaWYgKHBFdmVudC0+TW9kaWZpZXIoKSkKLQkJdnAgPDwgVFJVRTsKKwkJdnAgPDwgdHJ1ZTsKIAllbHNlCi0JCXZwIDw8IEZBTFNFOwotCXJldHVybiBUUlVFOworCQl2cCA8PCBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBldmVudDo6bmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGV2ZW50OjpuYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBGQUxTRTsKKwlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBmYWxzZTsKIAogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMTYxLDE3ICsxNjEsMTcgQEAKIAlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCiAJdnAgPDwgcEV2ZW50LT5OYW1lKCk7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6OnJjKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgZXZlbnQ6OnJjKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKIAlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKIAlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CiAJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAotICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKKyAgICBib29sICZiUmMgPSBwRXZlbnQtPlJjKCk7CiAJaWYgKHZwLklzU2V0dGluZygpKQogCXsKIAkJdnA+PmJSYzsKQEAgLTE4MCwxMiArMTgwLDEyIEBACiAJewogCQl2cDw8YlJjOwogCX0KLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBldmVudDo6cmljaENoYW5nZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGV2ZW50OjpyaWNoQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIAlpZiAodnAuSXNTZXR0aW5nKCkpCiAJewogCX0KQEAgLTE5MywxMiArMTkzLDEyIEBACiAJewogCQk7CiAJfQotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGV2ZW50OjpyaWNoQ2hhbmdlRXgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBldmVudDo6cmljaENoYW5nZUV4KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIAlpZiAodnAuSXNTZXR0aW5nKCkpCiAJewogCX0KQEAgLTIwNiwxMyArMjA2LDEzIEBACiAJewogCQk7CiAJfQotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCiAKLUZYX0JPT0wgZXZlbnQ6OnJpY2hWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGV2ZW50OjpyaWNoVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogCWlmICh2cC5Jc1NldHRpbmcoKSkKIAl7CiAJfQpAQCAtMjIwLDEwICsyMjAsMTAgQEAKIAl7CiAJCTsKIAl9Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6OnNlbEVuZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGV2ZW50OjpzZWxFbmQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMjMyLDcgKzIzMiw3IEBACiAKIAlpZiAod2NzY21wKChjb25zdCB3Y2hhcl90KilwRXZlbnQtPk5hbWUoKSxMIktleXN0cm9rZSIpICE9IDApCiAJewotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCiAJaW50ICZpU2VsRW5kID0gcEV2ZW50LT5TZWxFbmQoKTsKQEAgLTI0NCwxMCArMjQ0LDEwIEBACiAJewogCQl2cCA8PCBpU2VsRW5kOwogCX0KLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBldmVudDo6c2VsU3RhcnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBldmVudDo6c2VsU3RhcnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMjU2LDcgKzI1Niw3IEBACiAKIAlpZiAod2NzY21wKChjb25zdCB3Y2hhcl90KilwRXZlbnQtPk5hbWUoKSxMIktleXN0cm9rZSIpICE9IDApCiAJewotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCWludCAmaVNlbFN0YXJ0ID0gcEV2ZW50LT5TZWxTdGFydCgpOwogCWlmICh2cC5Jc1NldHRpbmcoKSkKQEAgLTI2NywxMiArMjY3LDEyIEBACiAJewogCQl2cCA8PCBpU2VsU3RhcnQ7CiAJfQotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGV2ZW50OjpzaGlmdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGV2ZW50OjpzaGlmdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CisJaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gZmFsc2U7CiAKIAlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTI4MCwxNSArMjgwLDE1IEBACiAJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAogCWlmIChwRXZlbnQtPlNoaWZ0KCkpCi0JCXZwIDw8IFRSVUU7CisJCXZwIDw8IHRydWU7CiAJZWxzZQotCQl2cCA8PCBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKKwkJdnAgPDwgZmFsc2U7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6OnNvdXJjZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGV2ZW50Ojpzb3VyY2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOworCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIGZhbHNlOwogCiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0yOTYsMTIgKzI5NiwxMiBAQAogCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKIAl2cCA8PCBwRXZlbnQtPlNvdXJjZSgpLT5HZXRKU09iamVjdCgpOwotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGV2ZW50Ojp0YXJnZXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBldmVudDo6dGFyZ2V0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBGQUxTRTsKKwlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBmYWxzZTsKIAogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMzA5LDEyICszMDksMTIgQEAKIAlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCiAJdnA8PHBFdmVudC0+VGFyZ2V0X0ZpZWxkKCktPkdldEpTT2JqZWN0KCk7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6OnRhcmdldE5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBldmVudDo6dGFyZ2V0TmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CisJaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gZmFsc2U7CiAKIAlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTMyMiwxMiArMzIyLDEyIEBACiAJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAogCXZwIDw8IHBFdmVudC0+VGFyZ2V0TmFtZSgpOwotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGV2ZW50Ojp0eXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgZXZlbnQ6OnR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOworCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIGZhbHNlOwogCiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0zMzUsMTAgKzMzNSwxMCBAQAogCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKIAl2cCA8PCBwRXZlbnQtPlR5cGUoKTsKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBldmVudDo6dmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBldmVudDo6dmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMzQ2LDkgKzM0Niw5IEBACiAJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAogCWlmICh3Y3NjbXAoKGNvbnN0IHdjaGFyX3QqKXBFdmVudC0+VHlwZSgpLEwiRmllbGQiKSAhPSAwKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAlpZighcEV2ZW50LT5tX3BWYWx1ZSkKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJQ0ZYX1dpZGVTdHJpbmcgJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CiAJaWYgKHZwLklzU2V0dGluZygpKQogCXsKQEAgLTM1OCwxMiArMzU4LDEyIEBACiAJewogCQl2cCA8PCB2YWw7CiAJfQotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGV2ZW50Ojp3aWxsQ29tbWl0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgZXZlbnQ6OndpbGxDb21taXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOworCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIGZhbHNlOwogCiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0zNzEsOSArMzcxLDkgQEAKIAlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCiAJaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQotCQl2cCA8PCBUUlVFOworCQl2cCA8PCB0cnVlOwogCWVsc2UKLQkJdnAgPDwgRkFMU0U7Ci0JcmV0dXJuIFRSVUU7CisJCXZwIDw8IGZhbHNlOworCXJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2dsb2JhbC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2dsb2JhbC5jcHAKaW5kZXggNjk2NWM4Yy4uOThhM2NkNiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9nbG9iYWwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZ2xvYmFsLmNwcApAQCAtOTYsNyArOTYsNyBAQAogCiBJTVBMRU1FTlRfU1BFQ0lBTF9KU19DTEFTUyhDSlNfR2xvYmFsLCBnbG9iYWxfYWx0ZXJuYXRlLCBnbG9iYWwpOwogCi1GWF9CT09MIENKU19HbG9iYWw6OkluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYykKK2Jvb2wgQ0pTX0dsb2JhbDo6SW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMTA2LDcgKzEwNiw3IEBACiAKICAgICBwR2xvYmFsLT5Jbml0aWFsKHBDb250ZXh0LT5HZXRSZWFkZXJBcHAoKSk7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH07CiAKIGdsb2JhbF9hbHRlcm5hdGU6Omdsb2JhbF9hbHRlcm5hdGUoQ0pTX09iamVjdCogcEpTT2JqZWN0KQpAQCAtMTI4LDI2ICsxMjgsMjYgQEAKICAgICBVcGRhdGVHbG9iYWxQZXJzaXN0ZW50VmFyaWFibGVzKCk7CiB9CiAKLUZYX0JPT0wgZ2xvYmFsX2FsdGVybmF0ZTo6UXVlcnlQcm9wZXJ0eShjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUpCitib29sIGdsb2JhbF9hbHRlcm5hdGU6OlF1ZXJ5UHJvcGVydHkoY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lKQogewogICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhwcm9wbmFtZSkgIT0gTCJzZXRQZXJzaXN0ZW50IjsKIH0KIAotRlhfQk9PTCBnbG9iYWxfYWx0ZXJuYXRlOjpEZWxQcm9wZXJ0eShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBnbG9iYWxfYWx0ZXJuYXRlOjpEZWxQcm9wZXJ0eShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGpzX2dsb2JhbF9kYXRhKiBwRGF0YSA9IE5VTEw7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHByb3BuYW1lKTsKIAogICAgIGlmIChtX21hcEdsb2JhbC5Mb29rdXAoc1Byb3BOYW1lLCAodm9pZComKXBEYXRhKSkKICAgICB7Ci0gICAgICAgIHBEYXRhLT5iRGVsZXRlZCA9IFRSVUU7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICBwRGF0YS0+YkRlbGV0ZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIGdsb2JhbF9hbHRlcm5hdGU6OkRvUHJvcGVydHkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IEZYX1dDSEFSKiBwcm9wbmFtZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGdsb2JhbF9hbHRlcm5hdGU6OkRvUHJvcGVydHkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IEZYX1dDSEFSKiBwcm9wbmFtZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKQEAgLTE1OCwzNCArMTU4LDM0IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZG91YmxlIGREYXRhOwogICAgICAgICAgICAgICAgIHZwID4+IGREYXRhOwotICAgICAgICAgICAgICAgIHJldHVybiBTZXRHbG9iYWxWYXJpYWJsZXMoc1Byb3BOYW1lLCBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSLCBkRGF0YSwgZmFsc2UsICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgRkFMU0UpOworICAgICAgICAgICAgICAgIHJldHVybiBTZXRHbG9iYWxWYXJpYWJsZXMoc1Byb3BOYW1lLCBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSLCBkRGF0YSwgZmFsc2UsICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICBjYXNlIFZUX2Jvb2xlYW46CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYm9vbCBiRGF0YTsKICAgICAgICAgICAgICAgICB2cCA+PiBiRGF0YTsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU4sIDAsIGJEYXRhLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIEZBTFNFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU4sIDAsIGJEYXRhLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgY2FzZSBWVF9zdHJpbmc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0RhdGE7CiAgICAgICAgICAgICAgICAgdnAgPj4gc0RhdGE7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNldEdsb2JhbFZhcmlhYmxlcyhzUHJvcE5hbWUsIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBzRGF0YSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIEZBTFNFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORywgMCwgZmFsc2UsIHNEYXRhLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICBjYXNlIFZUX29iamVjdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBKU09iamVjdCBwRGF0YTsKICAgICAgICAgICAgICAgICB2cCA+PiBwRGF0YTsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVCwgMCwgZmFsc2UsICIiLCBwRGF0YSwgRkFMU0UpOworICAgICAgICAgICAgICAgIHJldHVybiBTZXRHbG9iYWxWYXJpYWJsZXMoc1Byb3BOYW1lLCBKU19HTE9CQUxEQVRBX1RZUEVfT0JKRUNULCAwLCBmYWxzZSwgIiIsIHBEYXRhLCBmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIGNhc2UgVlRfbnVsbDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX05VTEwsIDAsIGZhbHNlLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIEZBTFNFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX05VTEwsIDAsIGZhbHNlLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgY2FzZSBWVF91bmRlZmluZWQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgRGVsUHJvcGVydHkoY2MsIHByb3BuYW1lLCBzRXJyb3IpOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CkBAIC0xOTcsNTEgKzE5Nyw1MSBAQAogICAgICAgICBpZiAoIW1fbWFwR2xvYmFsLkxvb2t1cChDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocHJvcG5hbWUpLCBwVm9pZCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHZwLlNldE51bGwoKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFwVm9pZCkKICAgICAgICAgewogICAgICAgICAgICAgdnAuU2V0TnVsbCgpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBqc19nbG9iYWxfZGF0YSogcERhdGEgPSAoanNfZ2xvYmFsX2RhdGEqKXBWb2lkOwogICAgICAgICBpZiAocERhdGEtPmJEZWxldGVkKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgICAgICBzd2l0Y2ggKHBEYXRhLT5uVHlwZSkKICAgICAgICAgewogICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOgogICAgICAgICAgICAgICAgIHZwIDw8IHBEYXRhLT5kRGF0YTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46CiAgICAgICAgICAgICAgICAgdnAgPDwgcERhdGEtPmJEYXRhOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOgogICAgICAgICAgICAgICAgIHZwIDw8IHBEYXRhLT5zRGF0YTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmogPSB2ODo6TG9jYWw8djg6Ok9iamVjdD46Ok5ldyh2cC5HZXRJc29sYXRlKCkscERhdGEtPnBEYXRhKTsKICAgICAgICAgICAgICAgICAgICAgdnAgPDwgb2JqOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDoKICAgICAgICAgICAgICAgICB2cC5TZXROdWxsKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgZ2xvYmFsX2FsdGVybmF0ZTo6c2V0UGVyc2lzdGVudChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBnbG9iYWxfYWx0ZXJuYXRlOjpzZXRQZXJzaXN0ZW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIENGWF9CeXRlU3RyaW5nIHNOYW1lID0gcGFyYW1zWzBdLlRvQ0ZYQnl0ZVN0cmluZygpOwpAQCAtMjUyLDEyICsyNTIsMTIgQEAKICAgICAgICAgaWYgKHBEYXRhICYmICFwRGF0YS0+YkRlbGV0ZWQpCiAgICAgICAgIHsKICAgICAgICAgICAgIHBEYXRhLT5iUGVyc2lzdGVudCA9IHBhcmFtc1sxXS5Ub0Jvb2woKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU05PR0xPQkFMKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIGdsb2JhbF9hbHRlcm5hdGU6OlVwZGF0ZUdsb2JhbFBlcnNpc3RlbnRWYXJpYWJsZXMoKQpAQCAtNDgwLDEwICs0ODAsMTAgQEAKIH0KIAogCi1GWF9CT09MIGdsb2JhbF9hbHRlcm5hdGU6OlNldEdsb2JhbFZhcmlhYmxlcyhjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwgaW50IG5UeXBlLAorYm9vbCBnbG9iYWxfYWx0ZXJuYXRlOjpTZXRHbG9iYWxWYXJpYWJsZXMoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsIGludCBuVHlwZSwKICAgICAgICAgICAgICAgICBkb3VibGUgZERhdGEsIGJvb2wgYkRhdGEsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRGF0YSwgSlNPYmplY3QgcERhdGEsIGJvb2wgYkRlZmF1bHRQZXJzaXN0ZW50KQogewotICAgIGlmIChwcm9wbmFtZSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKHByb3BuYW1lID09IE5VTEwpIHJldHVybiBmYWxzZTsKIAogICAgIGpzX2dsb2JhbF9kYXRhKiBwVGVtcCA9IE5VTEw7CiAgICAgbV9tYXBHbG9iYWwuTG9va3VwKHByb3BuYW1lLCAodm9pZComKXBUZW1wKTsKQEAgLTQ5OCw3ICs0OTgsNyBAQAogICAgICAgICAgICAgcFRlbXAtPm5UeXBlID0gblR5cGU7CiAgICAgICAgIH0KIAotICAgICAgICBwVGVtcC0+YkRlbGV0ZWQgPSBGQUxTRTsKKyAgICAgICAgcFRlbXAtPmJEZWxldGVkID0gZmFsc2U7CiAKICAgICAgICAgc3dpdGNoIChuVHlwZSkKICAgICAgICAgewpAQCAtNTI1LDEwICs1MjUsMTAgQEAKICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDoKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIGpzX2dsb2JhbF9kYXRhKiBwTmV3RGF0YSA9IE5VTEw7CkBAIC01NzUsMTIgKzU3NSwxMiBAQAogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIG1fbWFwR2xvYmFsLlNldEF0KHByb3BuYW1lLCAodm9pZCopcE5ld0RhdGEpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIEZYSlNWQUxVRVRZUEUgR0VUX1ZBTFVFX1RZUEUodjg6OkxvY2FsPHY4OjpWYWx1ZT4gcCkKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVwb3J0LmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVwb3J0LmNwcAppbmRleCAxNDc4ZmViLi44MjBlNzMwIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3JlcG9ydC5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9yZXBvcnQuY3BwCkBAIC0zNiwxNCArMzYsMTQgQEAKIAogfQogCi1GWF9CT09MIFJlcG9ydDo6d3JpdGVUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIFJlcG9ydDo6d3JpdGVUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIFRSVUU7CisgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIFJlcG9ydDo6c2F2ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBSZXBvcnQ6OnNhdmUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3V0aWwuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC91dGlsLmNwcAppbmRleCA0MDgzZWQ1Li4yMWE3Y2I4IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3V0aWwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvdXRpbC5jcHAKQEAgLTk4LDcgKzk4LDcgQEAKIAogaW50IHV0aWw6OlBhcnN0RGF0YVR5cGUoc3RkOjp3c3RyaW5nKiBzRm9ybWF0KQogewotICAgIGJvb2wgYlBlcmNlbnQgPSBGQUxTRTsKKyAgICBib29sIGJQZXJjZW50ID0gZmFsc2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzRm9ybWF0LT5sZW5ndGgoKTsgKytpKQogICAgIHsKICAgICAgICAgd2NoYXJfdCBjID0gKCpzRm9ybWF0KVtpXTsKQEAgLTEzNiwxMSArMTM2LDExIEBACiAgICAgcmV0dXJuIC0xOwogfQogCi1GWF9CT09MIHV0aWw6OnByaW50ZihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCB1dGlsOjpwcmludGYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOwogICAgIGlmIChpU2l6ZSA8IDEpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIHN0ZDo6d3N0cmluZyBjX0NvbnZDaGFyKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OndzdHJpbmc+IGNfc3RyQ29udmVyczsKICAgICBpbnQgaU9mZnNldCA9IDA7CkBAIC0xOTgsMTYgKzE5OCwxNiBAQAogCiAgICAgY19zdHJSZXN1bHQuZXJhc2UoY19zdHJSZXN1bHQuYmVnaW4oKSk7CiAgICAgdlJldCA9IGNfc3RyUmVzdWx0LmNfc3RyKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgdXRpbDo6cHJpbnRkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIHV0aWw6OnByaW50ZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7CiAKICAgICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOwogICAgIGlmIChpU2l6ZSA8IDIpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQ0pTX1ZhbHVlIHAxKGlzb2xhdGUpOwogICAgIHAxID0gcGFyYW1zWzBdOwpAQCAtMjE3LDEzICsyMTcsMTMgQEAKICAgICBpZiAoIXAyLkNvbnZlcnRUb0RhdGUoanNEYXRlKSkKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNQUklOVDEpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBpZiAoIWpzRGF0ZS5Jc1ZhbGlkRGF0ZSgpKQogICAgIHsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU1BSSU5UMik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGlmIChwMS5HZXRUeXBlKCkgPT0gVlRfbnVtYmVyKQpAQCAtMjYxLDExICsyNjEsMTEgQEAKICAgICAgICAgICAgICAgICBqc0RhdGUuR2V0U2Vjb25kcygpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgdlJldCA9IHN3UmVzdWx0LmNfc3RyKCk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKHAxLkdldFR5cGUoKSA9PSBWVF9zdHJpbmcpCiAgICAgewpAQCAtMjc5LDcgKzI3OSw3IEBACiAKICAgICAgICAgaWYgKGJYRkFQaWN0dXJlKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7IC8vY3VycmVudGx5LCBpdCBkb2Vzbid0IHN1cHBvcnQgWEZBUGljdHVyZS4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy9jdXJyZW50bHksIGl0IGRvZXNuJ3Qgc3VwcG9ydCBYRkFQaWN0dXJlLgogICAgICAgICB9CiAKICAgICAgICAgaW50IGlJbmRleDsKQEAgLTM1NSw5ICszNTUsOSBAQAogICAgICAgICBzdHJGb3JtYXQgPSB3Y3NmdGltZShidWYsIDY0LCBjRm9ybWF0LmNfc3RyKCksICZ0aW1lKTsKICAgICAgICAgY0Zvcm1hdCA9IGJ1ZjsKICAgICAgICAgdlJldCA9IGNGb3JtYXQuY19zdHIoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIHV0aWw6OnByaW50ZChjb25zdCBzdGQ6OndzdHJpbmcgJmNGb3JtYXQyLCBDSlNfRGF0ZSBqc0RhdGUsIGJvb2wgYlhGQVBpY3R1cmUsIHN0ZDo6d3N0cmluZyAmY1B1cnBvc2UpCkBAIC00NTAsMTEgKzQ1MCwxMSBAQAogICAgIGNQdXJwb3NlID0gY0Zvcm1hdDsKIH0KIAotRlhfQk9PTCB1dGlsOjpwcmludHgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgdXRpbDo6cHJpbnR4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKICAgICBpZiAoaVNpemU8MikKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKICAgICBDRlhfV2lkZVN0cmluZyBzU291cmNlID0gcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpOwogICAgIHN0ZDo6c3RyaW5nIGNGb3JtYXQgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoc0Zvcm1hdCkuY19zdHIoKTsKQEAgLTQ2Miw3ICs0NjIsNyBAQAogICAgIHN0ZDo6c3RyaW5nIGNEZXN0OwogICAgIHByaW50eChjRm9ybWF0LGNTb3VyY2UsY0Rlc3QpOwogICAgIHZSZXQgPSBjRGVzdC5jX3N0cigpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIHV0aWw6OnByaW50eChjb25zdCBzdGQ6OnN0cmluZyAmY0Zvcm1hdCxjb25zdCBzdGQ6OnN0cmluZyAmY1NvdXJjZTIsc3RkOjpzdHJpbmcgJmNQdXJwb3NlKQpAQCAtNTY0LDE5ICs1NjQsMTkgQEAKICAgICB9CiB9CiAKLUZYX0JPT0wgdXRpbDo6c2NhbmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgdXRpbDo6c2NhbmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOwogICAgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CiAgICAgaWYgKGlTaXplIDwgMikKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwogICAgIENGWF9XaWRlU3RyaW5nIHNEYXRlID0gcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpOwogICAgIGRvdWJsZSBkRGF0ZSA9IEpTX0dldERhdGVUaW1lKCk7CiAgICAgaWYgKHNEYXRlLkdldExlbmd0aCgpID4gMCkKICAgICB7Ci0gICAgICAgIEZYX0JPT0wgYldyb25nRm9ybWF0ID0gRkFMU0U7CisgICAgICAgIGJvb2wgYldyb25nRm9ybWF0ID0gZmFsc2U7CiAgICAgICAgIGREYXRlID0gQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShzRGF0ZSxzRm9ybWF0LGJXcm9uZ0Zvcm1hdCk7CiAgICAgfQogCkBAIC01OTAsNyArNTkwLDcgQEAKICAgICAgICAgdlJldC5TZXROdWxsKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIGludDY0X3QgRlhfYXRvaTY0KGNvbnN0IGNoYXIgKm5wdHIpCkBAIC02MTgsMTUgKzYxOCwxNSBAQAogICAgICAgICByZXR1cm4gc2lnbiA9PSAnLScgPyAtdG90YWwgOiB0b3RhbDsKIH0KIAotRlhfQk9PTCB1dGlsOjpieXRlVG9DaGFyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIHV0aWw6OmJ5dGVUb0NoYXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOwogICAgIGlmIChpU2l6ZSA9PSAwKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBpbnQgbkJ5dGUgPSBwYXJhbXNbMF0uVG9JbnQoKTsKICAgICB1bnNpZ25lZCBjaGFyIGNCeXRlID0gKHVuc2lnbmVkIGNoYXIpbkJ5dGU7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZTsKICAgICBjc1ZhbHVlLkZvcm1hdChMIiVjIiwgY0J5dGUpOwogICAgIHZSZXQgPSBjc1ZhbHVlLmNfc3RyKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qc2FwaS9meGpzX3Y4LmNwcCBiL2ZwZGZzZGsvc3JjL2pzYXBpL2Z4anNfdjguY3BwCmluZGV4IGM0ODExYmYuLmUxMjMyODAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2pzYXBpL2Z4anNfdjguY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2pzYXBpL2Z4anNfdjguY3BwCkBAIC00Miw3ICs0Miw3IEBACiB7CiBwdWJsaWM6CiAJQ0pTX09iakRlZmludGlvbih2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgY29uc3Qgd2NoYXJfdCogc09iak5hbWUsIEZYSlNPQkpUWVBFIGVPYmpUeXBlLCBMUF9DT05TVFJVQ1RPUiBwQ29uc3RydWN0b3IsIExQX0RFU1RSVUNUT1IgcERlc3RydWN0b3IpOgotCSAgb2JqTmFtZShzT2JqTmFtZSksIG9ialR5cGUoZU9ialR5cGUpLCBtX3BDb25zdHJ1Y3RvcihwQ29uc3RydWN0b3IpLCBtX3BEZXN0cnVjdG9yKHBEZXN0cnVjdG9yKSxtX2JTZXRBc0dsb2JhbE9iamVjdChGQUxTRSkKKwkgIG9iak5hbWUoc09iak5hbWUpLCBvYmpUeXBlKGVPYmpUeXBlKSwgbV9wQ29uc3RydWN0b3IocENvbnN0cnVjdG9yKSwgbV9wRGVzdHJ1Y3RvcihwRGVzdHJ1Y3RvciksbV9iU2V0QXNHbG9iYWxPYmplY3QoZmFsc2UpCiAJICB7CiAJCSAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7CiAJCSAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKTsKQEAgLTU0LDcgKzU0LDcgQEAKIAkJIC8vRG9jdW1lbnQgYXMgdGhlIGdsb2JhbCBvYmplY3QuCiAJCSAgaWYoRlhTWVNfd2NzY21wKHNPYmpOYW1lLCBMIkRvY3VtZW50IikgPT0gMCkKIAkJICB7Ci0JCQkgbV9iU2V0QXNHbG9iYWxPYmplY3QgPSBUUlVFOworCQkJIG1fYlNldEFzR2xvYmFsT2JqZWN0ID0gdHJ1ZTsKIAkJICB9CiAKIAkgIH0KQEAgLTY4LDcgKzY4LDcgQEAKIAlGWEpTT0JKVFlQRSBvYmpUeXBlOwogCUxQX0NPTlNUUlVDVE9SIG1fcENvbnN0cnVjdG9yOwogCUxQX0RFU1RSVUNUT1IgbV9wRGVzdHJ1Y3RvcjsKLQlGWF9CT09MCW1fYlNldEFzR2xvYmFsT2JqZWN0OworCWJvb2wJbV9iU2V0QXNHbG9iYWxPYmplY3Q7CiAKIAl2ODo6R2xvYmFsPHY4OjpPYmplY3RUZW1wbGF0ZT4gbV9vYmpUZW1wbGF0ZTsKIAl2ODo6R2xvYmFsPHY4OjpPYmplY3Q+IG1fU3RhdGljT2JqOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9CdXR0b24uY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9CdXR0b24uY3BwCmluZGV4IDg0OTYyMjguLjE3MTJiZDIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQnV0dG9uLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0J1dHRvbi5jcHAKQEAgLTEyLDcgKzEyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9CdXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBDUFdMX0J1dHRvbjo6Q1BXTF9CdXR0b24oKSA6Ci0JbV9iTW91c2VEb3duKEZBTFNFKQorCW1fYk1vdXNlRG93bihmYWxzZSkKIHsKIH0KIApAQCAtMzEsMjMgKzMxLDIzIEBACiAJY3AuZUN1cnNvclR5cGUgPSBGWENUX0hBTkQ7CiB9CiAKLUZYX0JPT0wgQ1BXTF9CdXR0b246Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9CdXR0b246Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCwgbkZsYWcpOwogCi0JbV9iTW91c2VEb3duID0gVFJVRTsKKwltX2JNb3VzZURvd24gPSB0cnVlOwogCVNldENhcHR1cmUoKTsKIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENQV0xfQnV0dG9uOjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCBDUFdMX0J1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKIAogCVJlbGVhc2VDYXB0dXJlKCk7Ci0JbV9iTW91c2VEb3duID0gRkFMU0U7CisJbV9iTW91c2VEb3duID0gZmFsc2U7CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9DYXJldC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NhcmV0LmNwcAppbmRleCA4NGE4YjNkLi5kZWNjZjA2IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NhcmV0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NhcmV0LmNwcApAQCAtMTYsNyArMTYsNyBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBDUFdMX0NhcmV0OjpDUFdMX0NhcmV0KCkgOgotCW1fYkZsYXNoKEZBTFNFKSwKKwltX2JGbGFzaChmYWxzZSksCiAJbV9wdEhlYWQoMCwwKSwKIAltX3B0Rm9vdCgwLDApLAogCW1fZldpZHRoKDAuNGYpLApAQCAtMTM1LDcgKzEzNSw3IEBACiAJCQltX3B0SGVhZC55KTsKIH0KIAotdm9pZCBDUFdMX0NhcmV0OjpTZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290KQordm9pZCBDUFdMX0NhcmV0OjpTZXRDYXJldChib29sIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290KQogewogCWlmIChiVmlzaWJsZSkKIAl7CkBAIC0xNDcsOSArMTQ3LDkgQEAKIAkJCQltX3B0SGVhZCA9IHB0SGVhZDsKIAkJCQltX3B0Rm9vdCA9IHB0Rm9vdDsKIAotCQkJCW1fYkZsYXNoID0gVFJVRTsKLQkJCQkvL01vdmUoR2V0Q2FyZXRSZWN0KCksRkFMU0UsVFJVRSk7Ci0JCQkJTW92ZShtX3JjSW52YWxpZCwgRkFMU0UsIFRSVUUpOworCQkJCW1fYkZsYXNoID0gdHJ1ZTsKKwkJCQkvL01vdmUoR2V0Q2FyZXRSZWN0KCksZmFsc2UsdHJ1ZSk7CisJCQkJTW92ZShtX3JjSW52YWxpZCwgZmFsc2UsIHRydWUpOwogCQkJfQogCQl9CiAJCWVsc2UKQEAgLTE2MCwxMSArMTYwLDExIEBACiAJCQlFbmRUaW1lcigpOwogCQkJQmVnaW5UaW1lcihQV0xfQ0FSRVRfRkxBU0hJTlRFUlZBTCk7CiAKLQkJCUNQV0xfV25kOjpTZXRWaXNpYmxlKFRSVUUpOwotCQkJbV9iRmxhc2ggPSBUUlVFOworCQkJQ1BXTF9XbmQ6OlNldFZpc2libGUodHJ1ZSk7CisJCQltX2JGbGFzaCA9IHRydWU7CiAKLQkJCS8vTW92ZShHZXRDYXJldFJlY3QoKSxGQUxTRSxUUlVFKTsKLQkJCU1vdmUobV9yY0ludmFsaWQsIEZBTFNFLCBUUlVFKTsKKwkJCS8vTW92ZShHZXRDYXJldFJlY3QoKSxmYWxzZSx0cnVlKTsKKwkJCU1vdmUobV9yY0ludmFsaWQsIGZhbHNlLCB0cnVlKTsKIAkJfQogCX0KIAllbHNlCkBAIC0xNzIsMTEgKzE3MiwxMSBAQAogCQltX3B0SGVhZCA9IENQREZfUG9pbnQoMCwgMCk7CiAJCW1fcHRGb290ID0gQ1BERl9Qb2ludCgwLCAwKTsKIAotCQltX2JGbGFzaCA9IEZBTFNFOworCQltX2JGbGFzaCA9IGZhbHNlOwogCQlpZiAoSXNWaXNpYmxlKCkpCiAJCXsKIAkJCUVuZFRpbWVyKCk7Ci0JCQlDUFdMX1duZDo6U2V0VmlzaWJsZShGQUxTRSk7CisJCQlDUFdMX1duZDo6U2V0VmlzaWJsZShmYWxzZSk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guY3BwCmluZGV4IGY1YzhhODEuLjZjNWRkNTUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guY3BwCkBAIC0yMiwxNCArMjIsMTQgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0NCTGlzdEJveCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUZYX0JPT0wgQ1BXTF9DQkxpc3RCb3g6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfQ0JMaXN0Qm94OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewogICAgIENQV0xfV25kOjpPbkxCdXR0b25VcChwb2ludCxuRmxhZyk7CiAKICAgICBpZiAobV9iTW91c2VEb3duKQogICAgIHsKICAgICAgICAgUmVsZWFzZUNhcHR1cmUoKTsKLSAgICAgICAgbV9iTW91c2VEb3duID0gRkFMU0U7CisgICAgICAgIG1fYk1vdXNlRG93biA9IGZhbHNlOwogCiAgICAgICAgIGlmIChDbGllbnRIaXRUZXN0KHBvaW50KSkKICAgICAgICAgewpAQCAtMzgsMjMgKzM4LDIzIEBACiAgICAgICAgICAgICAgICAgcFBhcmVudC0+T25Ob3RpZnkodGhpcyxQTk1fTEJVVFRPTlVQLDAsUFdMX01BS0VEV09SRChwb2ludC54LHBvaW50LnkpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwotICAgICAgICAgICAgT25Ob3RpZnlTZWxDaGFuZ2VkKEZBTFNFLGJFeGl0LCBuRmxhZyk7Ci0gICAgICAgICAgICBpZiAoYkV4aXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIGJvb2wgYkV4aXQgPSBmYWxzZTsKKyAgICAgICAgICAgIE9uTm90aWZ5U2VsQ2hhbmdlZChmYWxzZSxiRXhpdCwgbkZsYWcpOworICAgICAgICAgICAgaWYgKGJFeGl0KSByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDUFdMX0NCTGlzdEJveDo6T25LZXlEb3duV2l0aEV4aXQoRlhfV09SRCBuQ2hhciwgRlhfQk9PTCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9DQkxpc3RCb3g6Ok9uS2V5RG93bldpdGhFeGl0KEZYX1dPUkQgbkNoYXIsIGJvb2wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCiB7Ci0gICAgaWYgKCFtX3BMaXN0KSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFtX3BMaXN0KSByZXR1cm4gZmFsc2U7CiAKICAgICBzd2l0Y2ggKG5DaGFyKQogICAgIHsKICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBjYXNlIEZXTF9WS0VZX1VwOgogICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKICAgICBjYXNlIEZXTF9WS0VZX0hvbWU6CkBAIC04OCwyNSArODgsMjUgQEAKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgT25Ob3RpZnlTZWxDaGFuZ2VkKFRSVUUsYkV4aXQsIG5GbGFnKTsKKyAgICBPbk5vdGlmeVNlbENoYW5nZWQodHJ1ZSxiRXhpdCwgbkZsYWcpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ1BXTF9DQkxpc3RCb3g6Ok9uQ2hhcldpdGhFeGl0KEZYX1dPUkQgbkNoYXIsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfQ0JMaXN0Qm94OjpPbkNoYXJXaXRoRXhpdChGWF9XT1JEIG5DaGFyLCBib29sICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQogewotICAgIGlmICghbV9wTGlzdCkgcmV0dXJuIEZBTFNFOworICAgIGlmICghbV9wTGlzdCkgcmV0dXJuIGZhbHNlOwogCi0gICAgaWYgKCFtX3BMaXN0LT5PbkNoYXIobkNoYXIsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghbV9wTGlzdC0+T25DaGFyKG5DaGFyLElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSkpIHJldHVybiBmYWxzZTsKIAogICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UGFyZW50V2luZG93KCkpCiAgICAgewogICAgICAgICBwQ29tYm9Cb3gtPlNldFNlbGVjdFRleHQoKTsKICAgICB9CiAKLSAgICBPbk5vdGlmeVNlbENoYW5nZWQoVFJVRSxiRXhpdCxuRmxhZyk7CisgICAgT25Ob3RpZnlTZWxDaGFuZ2VkKHRydWUsYkV4aXQsbkZsYWcpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9DQkJ1dHRvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNzcsNyArMTc3LDcgQEAKICAgICB9CiB9CiAKLUZYX0JPT0wgQ1BXTF9DQkJ1dHRvbjo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCBDUFdMX0NCQnV0dG9uOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwogCkBAIC0xODgsMTYgKzE4OCwxNiBAQAogICAgICAgICBwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLFBOTV9MQlVUVE9ORE9XTiwwLFBXTF9NQUtFRFdPUkQocG9pbnQueCxwb2ludC55KSk7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ1BXTF9DQkJ1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9DQkJ1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKICAgICBDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKIAogICAgIFJlbGVhc2VDYXB0dXJlKCk7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0NvbWJvQm94IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTIwNSw3ICsyMDUsNyBAQAogQ1BXTF9Db21ib0JveDo6Q1BXTF9Db21ib0JveCgpIDogbV9wRWRpdChOVUxMKSwKICAgICBtX3BCdXR0b24oTlVMTCksCiAgICAgbV9wTGlzdChOVUxMKSwKLSAgICBtX2JQb3B1cChGQUxTRSksCisgICAgbV9iUG9wdXAoZmFsc2UpLAogICAgIG1fblBvcHVwV2hlcmUoMCksCiAgICAgbV9uU2VsZWN0SXRlbSgtMSksCiAgICAgbV9wRmlsbGVyTm90aWZ5KE5VTEwpCkBAIC0yMzEsNyArMjMxLDcgQEAKIAogdm9pZCBDUFdMX0NvbWJvQm94OjpLaWxsRm9jdXMoKQogewotICAgIFNldFBvcHVwKEZBTFNFKTsKKyAgICBTZXRQb3B1cChmYWxzZSk7CiAgICAgQ1BXTF9XbmQ6OktpbGxGb2N1cygpOwogfQogCkBAIC00MzksMTUgKzQzOSwxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1fcEJ1dHRvbikKLSAgICAgICAgICAgIG1fcEJ1dHRvbi0+TW92ZShyY0J1dHRvbixUUlVFLEZBTFNFKTsKKyAgICAgICAgICAgIG1fcEJ1dHRvbi0+TW92ZShyY0J1dHRvbix0cnVlLGZhbHNlKTsKIAogICAgICAgICBpZiAobV9wRWRpdCkKLSAgICAgICAgICAgIG1fcEVkaXQtPk1vdmUocmNFZGl0LFRSVUUsRkFMU0UpOworICAgICAgICAgICAgbV9wRWRpdC0+TW92ZShyY0VkaXQsdHJ1ZSxmYWxzZSk7CiAKICAgICAgICAgaWYgKG1fcExpc3QpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fcExpc3QtPlNldFZpc2libGUoVFJVRSk7Ci0gICAgICAgICAgICBtX3BMaXN0LT5Nb3ZlKHJjTGlzdCxUUlVFLEZBTFNFKTsKKyAgICAgICAgICAgIG1fcExpc3QtPlNldFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICBtX3BMaXN0LT5Nb3ZlKHJjTGlzdCx0cnVlLGZhbHNlKTsKICAgICAgICAgICAgIG1fcExpc3QtPlNjcm9sbFRvTGlzdEl0ZW0obV9uU2VsZWN0SXRlbSk7CiAgICAgICAgIH0KICAgICB9CkBAIC00NjEsNyArNDYxLDcgQEAKICAgICAgICAgICAgIHJjQnV0dG9uLmxlZnQgPSByY0NsaWVudC5sZWZ0OwogCiAgICAgICAgIGlmIChtX3BCdXR0b24pCi0gICAgICAgICAgICBtX3BCdXR0b24tPk1vdmUocmNCdXR0b24sVFJVRSxGQUxTRSk7CisgICAgICAgICAgICBtX3BCdXR0b24tPk1vdmUocmNCdXR0b24sdHJ1ZSxmYWxzZSk7CiAKICAgICAgICAgQ1BERl9SZWN0IHJjRWRpdCA9IHJjQ2xpZW50OwogICAgICAgICByY0VkaXQucmlnaHQgPSByY0J1dHRvbi5sZWZ0IC0gMS4wZjsKQEAgLTQ3MywxMCArNDczLDEwIEBACiAgICAgICAgICAgICByY0VkaXQucmlnaHQgPSByY0VkaXQubGVmdDsKIAogICAgICAgICBpZiAobV9wRWRpdCkKLSAgICAgICAgICAgIG1fcEVkaXQtPk1vdmUocmNFZGl0LFRSVUUsRkFMU0UpOworICAgICAgICAgICAgbV9wRWRpdC0+TW92ZShyY0VkaXQsdHJ1ZSxmYWxzZSk7CiAKICAgICAgICAgaWYgKG1fcExpc3QpCi0gICAgICAgICAgICBtX3BMaXN0LT5TZXRWaXNpYmxlKEZBTFNFKTsKKyAgICAgICAgICAgIG1fcExpc3QtPlNldFZpc2libGUoZmFsc2UpOwogICAgIH0KIH0KIApAQCAtNDkxLDcgKzQ5MSw3IEBACiAgICAgcmV0dXJuIENQREZfUmVjdCgpOwogfQogCi12b2lkIENQV0xfQ29tYm9Cb3g6OlNldFBvcHVwKEZYX0JPT0wgYlBvcHVwKQordm9pZCBDUFdMX0NvbWJvQm94OjpTZXRQb3B1cChib29sIGJQb3B1cCkKIHsKICAgICBpZiAoIW1fcExpc3QpIHJldHVybjsKICAgICBpZiAoYlBvcHVwID09IG1fYlBvcHVwKSByZXR1cm47CkBAIC01MjgsMjEgKzUyOCwyMSBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG1fblBvcHVwV2hlcmUgPSBuV2hlcmU7Ci0gICAgICAgICAgICAgICAgTW92ZShyY1dpbmRvdywgVFJVRSwgVFJVRSk7CisgICAgICAgICAgICAgICAgTW92ZShyY1dpbmRvdywgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgbV9iUG9wdXAgPSBiUG9wdXA7Ci0gICAgICAgIE1vdmUobV9yY09sZFdpbmRvdywgVFJVRSwgVFJVRSk7CisgICAgICAgIE1vdmUobV9yY09sZFdpbmRvdywgdHJ1ZSwgdHJ1ZSk7CiAgICAgfQogfQogCi1GWF9CT09MIENQV0xfQ29tYm9Cb3g6Ok9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9Db21ib0JveDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewotICAgIGlmICghbV9wTGlzdCkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghbV9wRWRpdCkgcmV0dXJuIEZBTFNFOworICAgIGlmICghbV9wTGlzdCkgcmV0dXJuIGZhbHNlOworICAgIGlmICghbV9wRWRpdCkgcmV0dXJuIGZhbHNlOwogCiAgICAgbV9uU2VsZWN0SXRlbSA9IC0xOwogCkBAIC01NTEsNDcgKzU1MSw0NyBAQAogICAgIGNhc2UgRldMX1ZLRVlfVXA6CiAgICAgICAgIGlmIChtX3BMaXN0LT5HZXRDdXJTZWwoKSA+IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGJvb2wgYkV4aXQgPSBmYWxzZTsKICAgICAgICAgICAgIGlmIChtX3BMaXN0LT5PbktleURvd25XaXRoRXhpdChuQ2hhcixiRXhpdCxuRmxhZykpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGJFeGl0KSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgaWYgKGJFeGl0KSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgU2V0U2VsZWN0VGV4dCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICBjYXNlIEZXTF9WS0VZX0Rvd246CiAgICAgICAgIGlmIChtX3BMaXN0LT5HZXRDdXJTZWwoKSA8IG1fcExpc3QtPkdldENvdW50KCkgLSAxKQogICAgICAgICB7Ci0gICAgICAgICAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisgICAgICAgICAgICBib29sIGJFeGl0ID0gZmFsc2U7CiAgICAgICAgICAgICBpZiAobV9wTGlzdC0+T25LZXlEb3duV2l0aEV4aXQobkNoYXIsYkV4aXQsbkZsYWcpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChiRXhpdCkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIGlmIChiRXhpdCkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIFNldFNlbGVjdFRleHQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgaWYgKEhhc0ZsYWcoUENCU19BTExPV0NVU1RPTVRFWFQpKQogICAgICAgICByZXR1cm4gbV9wRWRpdC0+T25LZXlEb3duKG5DaGFyLG5GbGFnKTsKIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ1BXTF9Db21ib0JveDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCBDUFdMX0NvbWJvQm94OjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgaWYgKCFtX3BMaXN0KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGlmICghbV9wRWRpdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBtX25TZWxlY3RJdGVtID0gLTE7CiAgICAgaWYgKEhhc0ZsYWcoUENCU19BTExPV0NVU1RPTVRFWFQpKQogICAgICAgICByZXR1cm4gbV9wRWRpdC0+T25DaGFyKG5DaGFyLG5GbGFnKTsKIAotICAgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLSAgICByZXR1cm4gbV9wTGlzdC0+T25DaGFyV2l0aEV4aXQobkNoYXIsYkV4aXQsbkZsYWcpID8gYkV4aXQgOiBGQUxTRTsKKyAgICBib29sIGJFeGl0ID0gZmFsc2U7CisgICAgcmV0dXJuIG1fcExpc3QtPk9uQ2hhcldpdGhFeGl0KG5DaGFyLGJFeGl0LG5GbGFnKSA/IGJFeGl0IDogZmFsc2U7CiB9CiAKIHZvaWQgQ1BXTF9Db21ib0JveDo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtLCBpbnRwdHJfdCBsUGFyYW0pCkBAIC02MTMsNyArNjEzLDcgQEAKICAgICAgICAgICAgICAgICBTZXRTZWxlY3RUZXh0KCk7CiAgICAgICAgICAgICAgICAgU2VsZWN0QWxsKCk7CiAgICAgICAgICAgICAgICAgbV9wRWRpdC0+U2V0Rm9jdXMoKTsKLSAgICAgICAgICAgICAgICBTZXRQb3B1cChGQUxTRSk7CisgICAgICAgICAgICAgICAgU2V0UG9wdXAoZmFsc2UpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjIyLDcgKzYyMiw3IEBACiAgICAgQ1BXTF9XbmQ6Ok9uTm90aWZ5KHBXbmQsbXNnLHdQYXJhbSxsUGFyYW0pOwogfQogCi1GWF9CT09MIENQV0xfQ29tYm9Cb3g6OklzUG9wdXAoKSBjb25zdAorYm9vbCBDUFdMX0NvbWJvQm94OjpJc1BvcHVwKCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9iUG9wdXA7CiB9CkBAIC02MzcsNyArNjM3LDcgQEAKICAgICBtX25TZWxlY3RJdGVtID0gbV9wTGlzdC0+R2V0Q3VyU2VsKCk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9Db21ib0JveDo6SXNNb2RpZmllZCgpIGNvbnN0Citib29sIENQV0xfQ29tYm9Cb3g6OklzTW9kaWZpZWQoKSBjb25zdAogewogICAgIHJldHVybiBtX3BFZGl0LT5Jc01vZGlmaWVkKCk7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXQuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9FZGl0LmNwcAppbmRleCA1OGQ4YTc5Li4zMDNhZTk2IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXQuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfRWRpdC5jcHAKQEAgLTE5LDE0ICsxOSwxNCBAQAogCiBDUFdMX0VkaXQ6OkNQV0xfRWRpdCgpIDogbV9wRmlsbGVyTm90aWZ5KE5VTEwpLAogCW1fcFNwZWxsQ2hlY2soTlVMTCksCi0JbV9iRm9jdXMoRkFMU0UpCisJbV9iRm9jdXMoZmFsc2UpCiB7CiAJbV9wRm9ybUZpbGxlciA9IE5VTEw7CiB9CiAKIENQV0xfRWRpdDo6fkNQV0xfRWRpdCgpCiB7Ci0JQVNTRVJUKG1fYkZvY3VzID09IEZBTFNFKTsKKwlBU1NFUlQobV9iRm9jdXMgPT0gZmFsc2UpOwogfQogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX0VkaXQ6OkdldENsYXNzTmFtZSgpIGNvbnN0CkBAIC00OSw3ICs0OSw3IEBACiAJCWlmIChDWE1MX0VsZW1lbnQgKiBwWE1MID0gQ1hNTF9FbGVtZW50OjpQYXJzZShzVmFsdWUuY19zdHIoKSwgc1ZhbHVlLkdldExlbmd0aCgpKSkKIAkJewogCQkJaW50MzJfdCBuQ291bnQgPSBwWE1MLT5Db3VudENoaWxkcmVuKCk7Ci0JCQlGWF9CT09MIGJGaXJzdCA9IFRSVUU7CisJCQlib29sIGJGaXJzdCA9IHRydWU7CiAKIAkJCXN3VGV4dC5FbXB0eSgpOwogCkBAIC02Nyw3ICs2Nyw3IEBACiAJCQkJCQkJc3dTZWN0aW9uICs9IHBTdWJFbGVtZW50LT5HZXRDb250ZW50KGopOwogCQkJCQkJfQogCi0JCQkJCQlpZiAoYkZpcnN0KWJGaXJzdCA9IEZBTFNFOworCQkJCQkJaWYgKGJGaXJzdCliRmlyc3QgPSBmYWxzZTsKIAkJCQkJCWVsc2UKIAkJCQkJCQlzd1RleHQgKz0gRldMX1ZLRVlfUmV0dXJuOwogCQkJCQkJc3dUZXh0ICs9IHN3U2VjdGlvbjsKQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY1dpbmRvdy5ib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNXaW5kb3cucmlnaHQgKyBQV0xfU0NST0xMQkFSX1dJRFRILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjV2luZG93LnRvcCk7Ci0gICAgICAgIHBWU0ItPk1vdmUocmNWU2Nyb2xsLCBUUlVFLCBGQUxTRSk7CisgICAgICAgIHBWU0ItPk1vdmUocmNWU2Nyb2xsLCB0cnVlLCBmYWxzZSk7CiAgICAgfQogCiAJaWYgKG1fcEVkaXRDYXJldCAmJiAhSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSkKQEAgLTExNCwzOSArMTE0LDM5IEBACiAJcmV0dXJuIHJjQ2xpZW50OwogfQogCi12b2lkIENQV0xfRWRpdDo6U2V0QWxpZ25Gb3JtYXRIKFBXTF9FRElUX0FMSUdORk9STUFUX0ggbkZvcm1hdCwgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKK3ZvaWQgQ1BXTF9FZGl0OjpTZXRBbGlnbkZvcm1hdEgoUFdMX0VESVRfQUxJR05GT1JNQVRfSCBuRm9ybWF0LCBib29sIGJQYWludC8qID0gdHJ1ZSovKQogewogCW1fcEVkaXQtPlNldEFsaWdubWVudEgoKGludDMyX3QpbkZvcm1hdCwgYlBhaW50KTsKIH0KIAotdm9pZCBDUFdMX0VkaXQ6OlNldEFsaWduRm9ybWF0VihQV0xfRURJVF9BTElHTkZPUk1BVF9WIG5Gb3JtYXQsIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCit2b2lkIENQV0xfRWRpdDo6U2V0QWxpZ25Gb3JtYXRWKFBXTF9FRElUX0FMSUdORk9STUFUX1YgbkZvcm1hdCwgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKIHsKIAltX3BFZGl0LT5TZXRBbGlnbm1lbnRWKChpbnQzMl90KW5Gb3JtYXQsIGJQYWludCk7CiB9CiAKLUZYX0JPT0wJQ1BXTF9FZGl0OjpDYW5TZWxlY3RBbGwoKSBjb25zdAorYm9vbAlDUFdMX0VkaXQ6OkNhblNlbGVjdEFsbCgpIGNvbnN0CiB7CiAJcmV0dXJuICBHZXRTZWxlY3RXb3JkUmFuZ2UoKSAhPSBtX3BFZGl0LT5HZXRXaG9sZVdvcmRSYW5nZSgpOwogfQogCi1GWF9CT09MCUNQV0xfRWRpdDo6Q2FuQ2xlYXIoKSBjb25zdAorYm9vbAlDUFdMX0VkaXQ6OkNhbkNsZWFyKCkgY29uc3QKIHsKIAlyZXR1cm4gIUlzUmVhZE9ubHkoKSAmJiBtX3BFZGl0LT5Jc1NlbGVjdGVkKCk7CiB9CiAKLUZYX0JPT0wJQ1BXTF9FZGl0OjpDYW5Db3B5KCkgY29uc3QKK2Jvb2wJQ1BXTF9FZGl0OjpDYW5Db3B5KCkgY29uc3QKIHsKIAlyZXR1cm4gCSFIYXNGbGFnKFBFU19QQVNTV09SRCkgJiYgIUhhc0ZsYWcoUEVTX05PUkVBRCkgJiYgbV9wRWRpdC0+SXNTZWxlY3RlZCgpOwogfQogCi1GWF9CT09MCUNQV0xfRWRpdDo6Q2FuQ3V0KCkgY29uc3QKK2Jvb2wJQ1BXTF9FZGl0OjpDYW5DdXQoKSBjb25zdAogewogCXJldHVybiAJQ2FuQ29weSgpICYmICFJc1JlYWRPbmx5KCk7CiB9CiAKLUZYX0JPT0wJQ1BXTF9FZGl0OjpDYW5QYXN0ZSgpIGNvbnN0Citib29sCUNQV0xfRWRpdDo6Q2FuUGFzdGUoKSBjb25zdAogewotCWlmIChJc1JlYWRPbmx5KCkpIHJldHVybiBGQUxTRTsKKwlpZiAoSXNSZWFkT25seSgpKSByZXR1cm4gZmFsc2U7CiAKIAlDRlhfV2lkZVN0cmluZyBzd0NsaXBib2FyZDsKIAlpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkKQEAgLTE3NSwxMyArMTc1LDEzIEBACiAKIAlpZiAobV9wRmlsbGVyTm90aWZ5KQogCXsKLQkJRlhfQk9PTCBiUkMgPSBUUlVFOwotCQlGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisJCWJvb2wgYlJDID0gdHJ1ZTsKKwkJYm9vbCBiRXhpdCA9IGZhbHNlOwogCQlDRlhfV2lkZVN0cmluZyBzdHJDaGFuZ2VFeDsKIAkJaW50IG5TZWxTdGFydCA9IDA7CiAJCWludCBuU2VsRW5kID0gMDsKIAkJR2V0U2VsKG5TZWxTdGFydCwgblNlbEVuZCk7Ci0JCW1fcEZpbGxlck5vdGlmeS0+T25CZWZvcmVLZXlTdHJva2UoVFJVRSwgR2V0QXR0YWNoZWREYXRhKCksIDAgLCBzd0NsaXBib2FyZCwgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgVFJVRSwgYlJDLCBiRXhpdCwgMCk7CisJCW1fcEZpbGxlck5vdGlmeS0+T25CZWZvcmVLZXlTdHJva2UodHJ1ZSwgR2V0QXR0YWNoZWREYXRhKCksIDAgLCBzd0NsaXBib2FyZCwgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgdHJ1ZSwgYlJDLCBiRXhpdCwgMCk7CiAJCWlmICghYlJDKSByZXR1cm47CiAJCWlmIChiRXhpdCkgcmV0dXJuOwogCX0KQEAgLTE5NCw4ICsxOTQsOCBAQAogCiAJaWYgKG1fcEZpbGxlck5vdGlmeSkKIAl7Ci0JCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLQkJbV9wRmlsbGVyTm90aWZ5LT5PbkFmdGVyS2V5U3Ryb2tlKFRSVUUsIEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCwwKTsKKwkJYm9vbCBiRXhpdCA9IGZhbHNlOworCQltX3BGaWxsZXJOb3RpZnktPk9uQWZ0ZXJLZXlTdHJva2UodHJ1ZSwgR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LDApOwogCQlpZiAoYkV4aXQpIHJldHVybjsKIAl9CiB9CkBAIC0yMjcsNTIgKzIyNyw1MiBAQAogCW1fcmNPbGRXaW5kb3cgPSBHZXRXaW5kb3dSZWN0KCk7CiAKIAltX3BFZGl0LT5TZXRPcHJOb3RpZnkodGhpcyk7Ci0JbV9wRWRpdC0+RW5hYmxlT3ByTm90aWZ5KFRSVUUpOworCW1fcEVkaXQtPkVuYWJsZU9wck5vdGlmeSh0cnVlKTsKIH0KIAogdm9pZCBDUFdMX0VkaXQ6OlNldFBhcmFtQnlGbGFnKCkKIHsKIAlpZiAoSGFzRmxhZyhQRVNfUklHSFQpKQogCXsKLQkJbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgyLCBGQUxTRSk7CisJCW1fcEVkaXQtPlNldEFsaWdubWVudEgoMiwgZmFsc2UpOwogCX0KIAllbHNlIGlmIChIYXNGbGFnKFBFU19NSURETEUpKQogCXsKLQkJbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgxLCBGQUxTRSk7CisJCW1fcEVkaXQtPlNldEFsaWdubWVudEgoMSwgZmFsc2UpOwogCX0KIAllbHNlCiAJewotCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRIKDAsIEZBTFNFKTsKKwkJbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgwLCBmYWxzZSk7CiAJfQogCiAJaWYgKEhhc0ZsYWcoUEVTX0JPVFRPTSkpCiAJewotCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDIsIEZBTFNFKTsKKwkJbV9wRWRpdC0+U2V0QWxpZ25tZW50VigyLCBmYWxzZSk7CiAJfQogCWVsc2UgaWYgKEhhc0ZsYWcoUEVTX0NFTlRFUikpCiAJewotCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDEsIEZBTFNFKTsKKwkJbV9wRWRpdC0+U2V0QWxpZ25tZW50VigxLCBmYWxzZSk7CiAJfQogCWVsc2UKIAl7Ci0JCW1fcEVkaXQtPlNldEFsaWdubWVudFYoMCwgRkFMU0UpOworCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDAsIGZhbHNlKTsKIAl9CiAKIAlpZiAoSGFzRmxhZyhQRVNfUEFTU1dPUkQpKQogCXsKLQkJbV9wRWRpdC0+U2V0UGFzc3dvcmRDaGFyKCcqJywgRkFMU0UpOworCQltX3BFZGl0LT5TZXRQYXNzd29yZENoYXIoJyonLCBmYWxzZSk7CiAJfQogCi0JbV9wRWRpdC0+U2V0TXVsdGlMaW5lKEhhc0ZsYWcoUEVTX01VTFRJTElORSksIEZBTFNFKTsKLQltX3BFZGl0LT5TZXRBdXRvUmV0dXJuKEhhc0ZsYWcoUEVTX0FVVE9SRVRVUk4pLCBGQUxTRSk7Ci0JbV9wRWRpdC0+U2V0QXV0b0ZvbnRTaXplKEhhc0ZsYWcoUFdTX0FVVE9GT05UU0laRSksIEZBTFNFKTsKLQltX3BFZGl0LT5TZXRBdXRvU2Nyb2xsKEhhc0ZsYWcoUEVTX0FVVE9TQ1JPTEwpLCBGQUxTRSk7CisJbV9wRWRpdC0+U2V0TXVsdGlMaW5lKEhhc0ZsYWcoUEVTX01VTFRJTElORSksIGZhbHNlKTsKKwltX3BFZGl0LT5TZXRBdXRvUmV0dXJuKEhhc0ZsYWcoUEVTX0FVVE9SRVRVUk4pLCBmYWxzZSk7CisJbV9wRWRpdC0+U2V0QXV0b0ZvbnRTaXplKEhhc0ZsYWcoUFdTX0FVVE9GT05UU0laRSksIGZhbHNlKTsKKwltX3BFZGl0LT5TZXRBdXRvU2Nyb2xsKEhhc0ZsYWcoUEVTX0FVVE9TQ1JPTEwpLCBmYWxzZSk7CiAJbV9wRWRpdC0+RW5hYmxlVW5kbyhIYXNGbGFnKFBFU19VTkRPKSk7CiAKIAlpZiAoSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSkKIAl7CiAJCVNldENsaXBSZWN0KENQREZfUmVjdCgwLjBmLDAuMGYsMC4wZiwwLjBmKSk7Ci0JCW1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyhUUlVFLCBGQUxTRSk7CisJCW1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyh0cnVlLCBmYWxzZSk7CiAJfQogCWVsc2UKIAl7CkBAIC0zMDQsNyArMzA0LDcgQEAKIAkJY2FzZSBQQlNfU09MSUQ6CiAJCQl7CiAJCQkJc0xpbmUgPDwgInFcbiIgPDwgR2V0Qm9yZGVyV2lkdGgoKSA8PCAiIHdcbiIKLQkJCQkJPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyQ29sb3IoKSxGQUxTRSkgPDwgIiAyIEogMCBqXG4iOworCQkJCQk8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJDb2xvcigpLGZhbHNlKSA8PCAiIDIgSiAwIGpcbiI7CiAKIAkJCQlmb3IgKGludDMyX3QgaT0xO2k8bkNoYXJBcnJheTtpKyspCiAJCQkJewpAQCAtMzIwLDcgKzMyMCw3IEBACiAJCWNhc2UgUEJTX0RBU0g6CiAJCQl7CiAJCQkJc0xpbmUgPDwgInFcbiIgPDwgR2V0Qm9yZGVyV2lkdGgoKSA8PCAiIHdcbiIKLQkJCQkJPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyQ29sb3IoKSxGQUxTRSkgPDwgIiAyIEogMCBqXG4iCisJCQkJCTw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlckNvbG9yKCksZmFsc2UpIDw8ICIgMiBKIDAgalxuIgogCQkJCQk8PCAiWyIgPDwgR2V0Qm9yZGVyRGFzaCgpLm5EYXNoIDw8ICIgIgogCQkJCQk8PCBHZXRCb3JkZXJEYXNoKCkubkdhcCA8PCAiXSAiCiAJCQkJCTw8IEdldEJvcmRlckRhc2goKS5uUGhhc2UgPDwgIiBkXG4iOwpAQCAtMzgzLDcgKzM4Myw3IEBACiAJewogCQlDRlhfQnl0ZVN0cmluZyBzU3BlbGxDaGVjayA9IENQV0xfVXRpbHM6OkdldFNwZWxsQ2hlY2tBcHBTdHJlYW0obV9wRWRpdCwgbV9wU3BlbGxDaGVjaywgcHRPZmZzZXQsICZ3clZpc2libGUpOwogCQlpZiAoc1NwZWxsQ2hlY2suR2V0TGVuZ3RoKCkgPiAwKQotCQkJc1RleHQgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLDEsMCwwKSxGQUxTRSkgPDwgc1NwZWxsQ2hlY2s7CisJCQlzVGV4dCA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsMSwwLDApLGZhbHNlKSA8PCBzU3BlbGxDaGVjazsKIAl9CiAKIAlpZiAoc1RleHQuR2V0TGVuZ3RoKCkgPiAwKQpAQCAtNDg3LDcgKzQ4Nyw3IEBACiAJfQogfQogCi1GWF9CT09MIENQV0xfRWRpdDo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCBDUFdMX0VkaXQ6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZyk7CiAKQEAgLTQ5NiwxNiArNDk2LDE2IEBACiAJCWlmIChtX2JNb3VzZURvd24pCiAJCQlJbnZhbGlkYXRlUmVjdCgpOwogCi0JCW1fYk1vdXNlRG93biA9IFRSVUU7CisJCW1fYk1vdXNlRG93biA9IHRydWU7CiAJCVNldENhcHR1cmUoKTsKIAogCQltX3BFZGl0LT5Pbk1vdXNlRG93bihwb2ludCxJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwogCX0KIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MCUNQV0xfRWRpdDo6T25MQnV0dG9uRGJsQ2xrKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sCUNQV0xfRWRpdDo6T25MQnV0dG9uRGJsQ2xrKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRibENsayhwb2ludCwgbkZsYWcpOwogCkBAIC01MTQsNyArNTE0LDcgQEAKIAkJbV9wRWRpdC0+U2VsZWN0QWxsKCk7CiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKICNkZWZpbmUgV01fUFdMRURJVF9VTkRPCQkJCQkweDAxCkBAIC01MjYsMTYgKzUyNiwxNiBAQAogI2RlZmluZSBXTV9QV0xFRElUX1NFTEVDVEFMTAkJCTB4MDcKICNkZWZpbmUgV01fUFdMRURJVF9TVUdHRVNUCQkJCTB4MDgKIAotRlhfQk9PTCBDUFdMX0VkaXQ6Ok9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfRWRpdDo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKLQlpZiAobV9iTW91c2VEb3duKSByZXR1cm4gRkFMU0U7CisJaWYgKG1fYk1vdXNlRG93bikgcmV0dXJuIGZhbHNlOwogCiAJQ1BXTF9XbmQ6Ok9uUkJ1dHRvblVwKHBvaW50LCBuRmxhZyk7CiAKLQlpZiAoIUhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykgJiYgIUNsaWVudEhpdFRlc3QocG9pbnQpKSByZXR1cm4gVFJVRTsKKwlpZiAoIUhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykgJiYgIUNsaWVudEhpdFRlc3QocG9pbnQpKSByZXR1cm4gdHJ1ZTsKIAogCUlGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCk7Ci0JaWYgKCFwU0gpIHJldHVybiBGQUxTRTsKKwlpZiAoIXBTSCkgcmV0dXJuIGZhbHNlOwogCiAJU2V0Rm9jdXMoKTsKIApAQCAtNTQzLDcgKzU0Myw3IEBACiAJQ0ZYX1dpZGVTdHJpbmcgc3dMYXRpbiA9IG1fcEVkaXQtPkdldFJhbmdlVGV4dCh3ckxhdGluKTsKIAogCUZYX0hNRU5VIGhQb3B1cCA9IHBTSC0+Q3JlYXRlUG9wdXBNZW51KCk7Ci0JaWYgKCFoUG9wdXApIHJldHVybiBGQUxTRTsKKwlpZiAoIWhQb3B1cCkgcmV0dXJuIGZhbHNlOwogCiAJQ0ZYX0J5dGVTdHJpbmdBcnJheSBzU3VnZ2VzdFdvcmRzOwogCUNQREZfUG9pbnQgcHRQb3B1cCA9IHBvaW50OwpAQCAtNTg3LDkgKzU4Nyw5IEBACiAJCXBTSC0+QXBwZW5kTWVudUl0ZW0oaFBvcHVwLCAwLCBMIiIpOwogCiAJCWlmICghbV9wRWRpdC0+Q2FuVW5kbygpKQotCQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfVU5ETywgRkFMU0UpOworCQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfVU5ETywgZmFsc2UpOwogCQlpZiAoIW1fcEVkaXQtPkNhblJlZG8oKSkKLQkJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1JFRE8sIEZBTFNFKTsKKwkJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1JFRE8sIGZhbHNlKTsKIAl9CiAKIAlwU0gtPkFwcGVuZE1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DVVQsCkBAIC02MDMsMzIgKzYwMywzMiBAQAogCiAJQ0ZYX1dpZGVTdHJpbmcgc3dUZXh0ID0gcFNILT5HZXRDbGlwYm9hcmRUZXh0KEdldEF0dGFjaGVkSFduZCgpKTsKIAlpZiAoc3dUZXh0LklzRW1wdHkoKSkKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfUEFTVEUsIEZBTFNFKTsKKwkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfUEFTVEUsIGZhbHNlKTsKIAogCWlmICghbV9wRWRpdC0+SXNTZWxlY3RlZCgpKQogCXsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ1VULCBGQUxTRSk7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NPUFksIEZBTFNFKTsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfREVMRVRFLCBGQUxTRSk7CisJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NVVCwgZmFsc2UpOworCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DT1BZLCBmYWxzZSk7CisJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0RFTEVURSwgZmFsc2UpOwogCX0KIAogCWlmIChJc1JlYWRPbmx5KCkpCiAJewotCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DVVQsIEZBTFNFKTsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfREVMRVRFLCBGQUxTRSk7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1BBU1RFLCBGQUxTRSk7CisJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NVVCwgZmFsc2UpOworCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9ERUxFVEUsIGZhbHNlKTsKKwkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfUEFTVEUsIGZhbHNlKTsKIAl9CiAKIAlpZiAoSGFzRmxhZyhQRVNfUEFTU1dPUkQpKQogCXsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ1VULCBGQUxTRSk7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NPUFksIEZBTFNFKTsKKwkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ1VULCBmYWxzZSk7CisJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NPUFksIGZhbHNlKTsKIAl9CiAKIAlpZiAoSGFzRmxhZyhQRVNfTk9SRUFEKSkKIAl7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NVVCwgRkFMU0UpOwotCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DT1BZLCBGQUxTRSk7CisJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NVVCwgZmFsc2UpOworCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DT1BZLCBmYWxzZSk7CiAJfQogCiAJcFNILT5BcHBlbmRNZW51SXRlbShoUG9wdXAsIDAsIEwiIik7CkBAIC02MzcsNyArNjM3LDcgQEAKIAogCWlmIChtX3BFZGl0LT5HZXRUb3RhbFdvcmRzKCkgPT0gMCkKIAl7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1NFTEVDVEFMTCwgRkFMU0UpOworCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9TRUxFQ1RBTEwsIGZhbHNlKTsKIAl9CiAKIAlpbnQzMl90IHgsIHk7CkBAIC02OTksMTIgKzY5OSwxMiBAQAogCiAJcFNILT5EZXN0cm95TWVudShoUG9wdXApOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQ1BXTF9FZGl0OjpPblNldEZvY3VzKCkKIHsKLQlTZXRFZGl0Q2FyZXQoVFJVRSk7CisJU2V0RWRpdENhcmV0KHRydWUpOwogCiAJaWYgKCFJc1JlYWRPbmx5KCkpCiAJewpAQCAtNzEyLDE1ICs3MTIsMTUgQEAKIAkJCXBGb2N1c0hhbmRsZXItPk9uU2V0Rm9jdXModGhpcyk7CiAJfQogCi0JbV9iRm9jdXMgPSBUUlVFOworCW1fYkZvY3VzID0gdHJ1ZTsKIH0KIAogdm9pZCBDUFdMX0VkaXQ6Ok9uS2lsbEZvY3VzKCkKIHsKLQlTaG93VlNjcm9sbEJhcihGQUxTRSk7CisJU2hvd1ZTY3JvbGxCYXIoZmFsc2UpOwogCiAJbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotCVNldENhcmV0KEZBTFNFLCBDUERGX1BvaW50KDAuMGYsMC4wZiksIENQREZfUG9pbnQoMC4wZiwwLjBmKSk7CisJU2V0Q2FyZXQoZmFsc2UsIENQREZfUG9pbnQoMC4wZiwwLjBmKSwgQ1BERl9Qb2ludCgwLjBmLDAuMGYpKTsKIAogCVNldENoYXJTZXQoMCk7CiAKQEAgLTczMCwyMCArNzMwLDIwIEBACiAJCQlwRm9jdXNIYW5kbGVyLT5PbktpbGxGb2N1cyh0aGlzKTsKIAl9CiAKLQltX2JGb2N1cyA9IEZBTFNFOworCW1fYkZvY3VzID0gZmFsc2U7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0OjpTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQordm9pZCBDUFdMX0VkaXQ6OlNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUsIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCiB7CiAJbV9wRWRpdC0+U2V0SG9yelNjYWxlKG5Ib3J6U2NhbGUsIGJQYWludCk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0OjpTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSwgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKK3ZvaWQgQ1BXTF9FZGl0OjpTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSwgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKIHsKIAltX3BFZGl0LT5TZXRDaGFyU3BhY2UoZkNoYXJTcGFjZSwgYlBhaW50KTsKIH0KIAotdm9pZCBDUFdMX0VkaXQ6OlNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKK3ZvaWQgQ1BXTF9FZGl0OjpTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcsIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCiB7CiAJbV9wRWRpdC0+U2V0TGluZUxlYWRpbmcoZkxpbmVMZWFkaW5nLCBiUGFpbnQpOwogfQpAQCAtODEzLDcgKzgxMyw3IEBACiAJcmV0dXJuIHB0OwogfQogCi1GWF9CT09MCUNQV0xfRWRpdDo6SXNUZXh0RnVsbCgpIGNvbnN0Citib29sCUNQV0xfRWRpdDo6SXNUZXh0RnVsbCgpIGNvbnN0CiB7CiAJcmV0dXJuIG1fcEVkaXQtPklzVGV4dEZ1bGwoKTsKIH0KQEAgLTg0MCw3ICs4NDAsNyBAQAogCWlmIChIYXNGbGFnKFBFU19DSEFSQVJSQVkpICYmIG5DaGFyQXJyYXkgPiAwKQogCXsKIAkJbV9wRWRpdC0+U2V0Q2hhckFycmF5KG5DaGFyQXJyYXkpOwotCQltX3BFZGl0LT5TZXRUZXh0T3ZlcmZsb3coVFJVRSk7CisJCW1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyh0cnVlKTsKIAogCQlpZiAoSGFzRmxhZyhQV1NfQVVUT0ZPTlRTSVpFKSkKIAkJewpAQCAtODQ5LDcgKzg0OSw3IEBACiAJCQkJRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Q2hhckFycmF5QXV0b0ZvbnRTaXplKHBGb250TWFwLT5HZXRQREZGb250KDApLCBHZXRDbGllbnRSZWN0KCksIG5DaGFyQXJyYXkpOwogCQkJCWlmIChmRm9udFNpemUgPiAwLjBmKQogCQkJCXsKLQkJCQkJbV9wRWRpdC0+U2V0QXV0b0ZvbnRTaXplKEZBTFNFKTsKKwkJCQkJbV9wRWRpdC0+U2V0QXV0b0ZvbnRTaXplKGZhbHNlKTsKIAkJCQkJbV9wRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKIAkJCQl9CiAJCQl9CkBAIC04NzMsNyArODczLDcgQEAKIAlyZXR1cm4gQ1BERl9SZWN0KCk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0OjpTaG93VlNjcm9sbEJhcihGWF9CT09MIGJTaG93KQordm9pZCBDUFdMX0VkaXQ6OlNob3dWU2Nyb2xsQmFyKGJvb2wgYlNob3cpCiB7CiAJaWYgKENQV0xfU2Nyb2xsQmFyICogcFNjcm9sbCA9IEdldFZTY3JvbGxCYXIoKSkKIAl7CkBAIC04ODEsMzUgKzg4MSwzNSBAQAogCQl7CiAJCQlpZiAoIXBTY3JvbGwtPklzVmlzaWJsZSgpKQogCQkJewotCQkJCXBTY3JvbGwtPlNldFZpc2libGUoVFJVRSk7CisJCQkJcFNjcm9sbC0+U2V0VmlzaWJsZSh0cnVlKTsKIAkJCQlDUERGX1JlY3QgcmNXaW5kb3cgPSBHZXRXaW5kb3dSZWN0KCk7CiAJCQkJbV9yY09sZFdpbmRvdyA9IHJjV2luZG93OwogCQkJCXJjV2luZG93LnJpZ2h0ICs9IFBXTF9TQ1JPTExCQVJfV0lEVEg7Ci0JCQkJTW92ZShyY1dpbmRvdywgVFJVRSwgVFJVRSk7CisJCQkJTW92ZShyY1dpbmRvdywgdHJ1ZSwgdHJ1ZSk7CiAJCQl9CiAJCX0KIAkJZWxzZQogCQl7CiAJCQlpZiAocFNjcm9sbC0+SXNWaXNpYmxlKCkpCiAJCQl7Ci0JCQkJcFNjcm9sbC0+U2V0VmlzaWJsZShGQUxTRSk7Ci0JCQkJTW92ZShtX3JjT2xkV2luZG93LCBUUlVFLCBUUlVFKTsKKwkJCQlwU2Nyb2xsLT5TZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQlNb3ZlKG1fcmNPbGRXaW5kb3csIHRydWUsIHRydWUpOwogCQkJfQogCQl9CiAJfQogfQogCi1GWF9CT09MCUNQV0xfRWRpdDo6SXNWU2Nyb2xsQmFyVmlzaWJsZSgpIGNvbnN0Citib29sCUNQV0xfRWRpdDo6SXNWU2Nyb2xsQmFyVmlzaWJsZSgpIGNvbnN0CiB7CiAJaWYgKENQV0xfU2Nyb2xsQmFyICogcFNjcm9sbCA9IEdldFZTY3JvbGxCYXIoKSkKIAl7CiAJCXJldHVybiBwU2Nyb2xsLT5Jc1Zpc2libGUoKTsKIAl9CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIENQV0xfRWRpdDo6RW5hYmxlU3BlbGxDaGVjayhGWF9CT09MIGJFbmFibGVkKQordm9pZCBDUFdMX0VkaXQ6OkVuYWJsZVNwZWxsQ2hlY2soYm9vbCBiRW5hYmxlZCkKIHsKIAlpZiAoYkVuYWJsZWQpCiAJCUFkZEZsYWcoUEVTX1NQRUxMQ0hFQ0spOwpAQCAtOTE3LDE2ICs5MTcsMTYgQEAKIAkJUmVtb3ZlRmxhZyhQRVNfU1BFTExDSEVDSyk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9FZGl0OjpPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfRWRpdDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewotCWlmIChtX2JNb3VzZURvd24pIHJldHVybiBUUlVFOworCWlmIChtX2JNb3VzZURvd24pIHJldHVybiB0cnVlOwogCiAJaWYgKG5DaGFyID09IEZXTF9WS0VZX0RlbGV0ZSkKIAl7CiAJCWlmIChtX3BGaWxsZXJOb3RpZnkpCiAJCXsKLQkJCUZYX0JPT0wgYlJDID0gVFJVRTsKLQkJCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKwkJCWJvb2wgYlJDID0gdHJ1ZTsKKwkJCWJvb2wgYkV4aXQgPSBmYWxzZTsKIAkJCUNGWF9XaWRlU3RyaW5nIHN0ckNoYW5nZTsKIAkJCUNGWF9XaWRlU3RyaW5nIHN0ckNoYW5nZUV4OwogCkBAIC05MzYsMjcgKzkzNiwyNyBAQAogCiAJCQlpZiAoblNlbFN0YXJ0ID09IG5TZWxFbmQpCiAJCQkJblNlbEVuZCA9IG5TZWxTdGFydCArIDE7Ci0JCQltX3BGaWxsZXJOb3RpZnktPk9uQmVmb3JlS2V5U3Ryb2tlKFRSVUUsIEdldEF0dGFjaGVkRGF0YSgpLCBGV0xfVktFWV9EZWxldGUsIHN0ckNoYW5nZSwgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgVFJVRSwgYlJDLCBiRXhpdCwgbkZsYWcpOwotCQkJaWYgKCFiUkMpIHJldHVybiBGQUxTRTsKLQkJCWlmIChiRXhpdCkgcmV0dXJuIEZBTFNFOworCQkJbV9wRmlsbGVyTm90aWZ5LT5PbkJlZm9yZUtleVN0cm9rZSh0cnVlLCBHZXRBdHRhY2hlZERhdGEoKSwgRldMX1ZLRVlfRGVsZXRlLCBzdHJDaGFuZ2UsIHN0ckNoYW5nZUV4LCBuU2VsU3RhcnQsIG5TZWxFbmQsIHRydWUsIGJSQywgYkV4aXQsIG5GbGFnKTsKKwkJCWlmICghYlJDKSByZXR1cm4gZmFsc2U7CisJCQlpZiAoYkV4aXQpIHJldHVybiBmYWxzZTsKIAkJfQogCX0KIAotCUZYX0JPT0wgYlJldCA9IENQV0xfRWRpdEN0cmw6Ok9uS2V5RG93bihuQ2hhciwgIG5GbGFnKTsKKwlib29sIGJSZXQgPSBDUFdMX0VkaXRDdHJsOjpPbktleURvd24obkNoYXIsICBuRmxhZyk7CiAKIAlpZiAobkNoYXIgPT0gRldMX1ZLRVlfRGVsZXRlKQogCXsKIAkJaWYgKG1fcEZpbGxlck5vdGlmeSkKIAkJewotCQkJRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwotCQkJbV9wRmlsbGVyTm90aWZ5LT5PbkFmdGVyS2V5U3Ryb2tlKFRSVUUsIEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCxuRmxhZyk7Ci0JCQlpZiAoYkV4aXQpIHJldHVybiBGQUxTRTsKKwkJCWJvb2wgYkV4aXQgPSBmYWxzZTsKKwkJCW1fcEZpbGxlck5vdGlmeS0+T25BZnRlcktleVN0cm9rZSh0cnVlLCBHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsbkZsYWcpOworCQkJaWYgKGJFeGl0KSByZXR1cm4gZmFsc2U7CiAJCX0KIAl9CiAKIAkvL0luIGNhc2Ugb2YgaW1wbGVtZW50YXRpb24gc3dhbGxvdyB0aGUgT25LZXlEb3duIGV2ZW50LgogCWlmKElzUHJvY2VlZHRvT25DaGFyKG5DaGFyLCBuRmxhZykpCi0JCQlyZXR1cm4gVFJVRTsKKwkJCXJldHVybiB0cnVlOwogCiAJcmV0dXJuIGJSZXQ7CiB9CkBAIC05NjUsMTEgKzk2NSwxMSBAQAogKkluIGNhc2Ugb2YgaW1wbGVtZW50YXRpb24gc3dhbGxvdyB0aGUgT25LZXlEb3duIGV2ZW50LgogKklmIHRoZSBldmVudCBpcyBzd2FsbG93ZWQsIGltcGxlbWVudGF0aW9uIG1heSBkbyBvdGhlciB1bmV4cGVjdGVkIHRoaW5ncywgd2hpY2ggaXMgbm90IHRoZSBjb250cm9sIG1lYW5zIHRvIGRvLgogKi8KLUZYX0JPT0wgQ1BXTF9FZGl0OjpJc1Byb2NlZWR0b09uQ2hhcihGWF9XT1JEIG5LZXlDb2RlLCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9FZGl0OjpJc1Byb2NlZWR0b09uQ2hhcihGWF9XT1JEIG5LZXlDb2RlLCBGWF9EV09SRCBuRmxhZykKIHsKIAotCUZYX0JPT0wgYkN0cmwgPSBJc0NUUkxwcmVzc2VkKG5GbGFnKTsKLQlGWF9CT09MIGJBbHQgPSBJc0FMVHByZXNzZWQobkZsYWcpOworCWJvb2wgYkN0cmwgPSBJc0NUUkxwcmVzc2VkKG5GbGFnKTsKKwlib29sIGJBbHQgPSBJc0FMVHByZXNzZWQobkZsYWcpOwogCWlmKGJDdHJsICYmICFiQWx0KQogCXsKIAkvL2hvdCBrZXlzIGZvciBlZGl0IGNvbnRyb2wuCkBAIC05ODAsNyArOTgwLDcgQEAKIAkJY2FzZSAnWCc6CiAJCWNhc2UgJ0EnOgogCQljYXNlICdaJzoKLQkJCXJldHVybiBUUlVFOworCQkJcmV0dXJuIHRydWU7CiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQpAQCAtOTkyLDIyICs5OTIsMjIgQEAKIAljYXNlIEZXTF9WS0VZX0JhY2s6CiAJY2FzZSBGV0xfVktFWV9SZXR1cm46CiAJY2FzZSBGV0xfVktFWV9TcGFjZToKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogCiB9CiAKLUZYX0JPT0wgQ1BXTF9FZGl0OjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfRWRpdDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewotCWlmIChtX2JNb3VzZURvd24pIHJldHVybiBUUlVFOworCWlmIChtX2JNb3VzZURvd24pIHJldHVybiB0cnVlOwogCi0JRlhfQk9PTCBiUkMgPSBUUlVFOwotCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKwlib29sIGJSQyA9IHRydWU7CisJYm9vbCBiRXhpdCA9IGZhbHNlOwogCi0JRlhfQk9PTCBiQ3RybCA9IElzQ1RSTHByZXNzZWQobkZsYWcpOworCWJvb2wgYkN0cmwgPSBJc0NUUkxwcmVzc2VkKG5GbGFnKTsKIAlpZiAoIWJDdHJsKQogCXsKIAkJaWYgKG1fcEZpbGxlck5vdGlmeSkKQEAgLTEwMzYsMTIgKzEwMzYsMTIgQEAKIAkJCX0KIAogCQkJQ0ZYX1dpZGVTdHJpbmcgc3RyQ2hhbmdlRXg7Ci0JCQltX3BGaWxsZXJOb3RpZnktPk9uQmVmb3JlS2V5U3Ryb2tlKFRSVUUsIEdldEF0dGFjaGVkRGF0YSgpLCBuS2V5Q29kZSwgc3dDaGFuZ2UsIHN0ckNoYW5nZUV4LCBuU2VsU3RhcnQsIG5TZWxFbmQsIFRSVUUsIGJSQywgYkV4aXQsIG5GbGFnKTsKKwkJCW1fcEZpbGxlck5vdGlmeS0+T25CZWZvcmVLZXlTdHJva2UodHJ1ZSwgR2V0QXR0YWNoZWREYXRhKCksIG5LZXlDb2RlLCBzd0NoYW5nZSwgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgdHJ1ZSwgYlJDLCBiRXhpdCwgbkZsYWcpOwogCQl9CiAJfQogCi0JaWYgKCFiUkMpIHJldHVybiBUUlVFOwotCWlmIChiRXhpdCkgcmV0dXJuIEZBTFNFOworCWlmICghYlJDKSByZXR1cm4gdHJ1ZTsKKwlpZiAoYkV4aXQpIHJldHVybiBmYWxzZTsKIAogCWlmIChJRlhfRWRpdF9Gb250TWFwICogcEZvbnRNYXAgPSBHZXRGb250TWFwKCkpCiAJewpAQCAtMTA1MiwyMSArMTA1MiwyMSBAQAogCQkJU2V0Q2hhclNldChuTmV3Q2hhclNldCk7CiAJCX0KIAl9Ci0JRlhfQk9PTCBiUmV0ID0gQ1BXTF9FZGl0Q3RybDo6T25DaGFyKG5DaGFyLG5GbGFnKTsKKwlib29sIGJSZXQgPSBDUFdMX0VkaXRDdHJsOjpPbkNoYXIobkNoYXIsbkZsYWcpOwogCiAJaWYgKCFiQ3RybCkKIAl7CiAJCWlmIChtX3BGaWxsZXJOb3RpZnkpCiAJCXsKLQkJCW1fcEZpbGxlck5vdGlmeS0+T25BZnRlcktleVN0cm9rZShUUlVFLCBHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsbkZsYWcpOwotCQkJaWYgKGJFeGl0KSByZXR1cm4gRkFMU0U7CisJCQltX3BGaWxsZXJOb3RpZnktPk9uQWZ0ZXJLZXlTdHJva2UodHJ1ZSwgR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LG5GbGFnKTsKKwkJCWlmIChiRXhpdCkgcmV0dXJuIGZhbHNlOwogCQl9CiAJfQogCiAJcmV0dXJuIGJSZXQ7CiB9CiAKLUZYX0JPT0wJQ1BXTF9FZGl0OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbAlDUFdMX0VkaXQ6Ok9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJaWYgKEhhc0ZsYWcoUEVTX01VTFRJTElORSkpCiAJewpAQCAtMTA4MiwxMCArMTA4MiwxMCBAQAogCQl9CiAJCVNldFNjcm9sbFBvcyhwdFNjcm9sbCk7CiAKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCX0KIAotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ1BXTF9FZGl0OjpPbkluc2VydFJldHVybihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkKQEAgLTEyMDUsMjIgKzEyMDUsMjIgQEAKIAogQ1BWVF9Xb3JkUmFuZ2UgQ1BXTF9FZGl0OjpHZXRMYXRpbldvcmRzUmFuZ2UoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0CiB7Ci0JcmV0dXJuIEdldFNhbWVXb3Jkc1JhbmdlKG1fcEVkaXQtPlNlYXJjaFdvcmRQbGFjZShwb2ludCksIFRSVUUsIEZBTFNFKTsKKwlyZXR1cm4gR2V0U2FtZVdvcmRzUmFuZ2UobV9wRWRpdC0+U2VhcmNoV29yZFBsYWNlKHBvaW50KSwgdHJ1ZSwgZmFsc2UpOwogfQogCiBDUFZUX1dvcmRSYW5nZSBDUFdMX0VkaXQ6OkdldExhdGluV29yZHNSYW5nZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAogewotCXJldHVybiBHZXRTYW1lV29yZHNSYW5nZShwbGFjZSwgVFJVRSwgRkFMU0UpOworCXJldHVybiBHZXRTYW1lV29yZHNSYW5nZShwbGFjZSwgdHJ1ZSwgZmFsc2UpOwogfQogCiBDUFZUX1dvcmRSYW5nZSBDUFdMX0VkaXQ6OkdldEFyYWJpY1dvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QKIHsKLQlyZXR1cm4gR2V0U2FtZVdvcmRzUmFuZ2UocGxhY2UsIEZBTFNFLCBUUlVFKTsKKwlyZXR1cm4gR2V0U2FtZVdvcmRzUmFuZ2UocGxhY2UsIGZhbHNlLCB0cnVlKTsKIH0KIAogI2RlZmluZSBQV0xfSVNBUkFCSUNXT1JEKHdvcmQpICgod29yZCA+PSAweDA2MDAgJiYgd29yZCA8PSAweDA2RkYpIHx8ICh3b3JkID49IDB4RkI1MCAmJiB3b3JkIDw9IDB4RkVGQykpCiAKLUNQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0U2FtZVdvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRlhfQk9PTCBiTGF0aW4sIEZYX0JPT0wgYkFyYWJpYykgY29uc3QKK0NQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0U2FtZVdvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgYm9vbCBiTGF0aW4sIGJvb2wgYkFyYWJpYykgY29uc3QKIHsKIAlDUFZUX1dvcmRSYW5nZSByYW5nZTsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmNwcAppbmRleCAwZDE0NTg3Li4xMWUxZmU3IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmNwcApAQCAtMjIsNyArMjIsNyBAQAogQ1BXTF9FZGl0Q3RybDo6Q1BXTF9FZGl0Q3RybCgpIDoKICAgICBtX3BFZGl0KE5VTEwpLAogICAgIG1fcEVkaXRDYXJldChOVUxMKSwKLSAgICBtX2JNb3VzZURvd24oRkFMU0UpLAorICAgIG1fYk1vdXNlRG93bihmYWxzZSksCiAgICAgbV9wRWRpdE5vdGlmeShOVUxMKSwKICAgICBtX25DaGFyU2V0KERFRkFVTFRfQ0hBUlNFVCksCiAgICAgbV9uQ29kZVBhZ2UoMCkKQEAgLTUwLDcgKzUwLDcgQEAKICAgICBtX3BFZGl0LT5Jbml0aWFsaXplKCk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9FZGl0Q3RybDo6SXNXbmRIb3JWKCkKK2Jvb2wgQ1BXTF9FZGl0Q3RybDo6SXNXbmRIb3JWKCkKIHsKICAgICBDUERGX01hdHJpeCBtdCA9IEdldFdpbmRvd01hdHJpeCgpOwogICAgIENQREZfUG9pbnQgcG9pbnQxKDAsMSk7CkBAIC0xNjcsMTcgKzE2NywxNyBAQAogICAgIHJldHVybiBtX3BFZGl0LT5HZXRGb250U2l6ZSgpOwogfQogCi1GWF9CT09MIENQV0xfRWRpdEN0cmw6Ok9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9FZGl0Q3RybDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewotICAgIGlmIChtX2JNb3VzZURvd24pIHJldHVybiBUUlVFOworICAgIGlmIChtX2JNb3VzZURvd24pIHJldHVybiB0cnVlOwogCi0gICAgRlhfQk9PTCBiUmV0ID0gQ1BXTF9XbmQ6Ok9uS2V5RG93bihuQ2hhcixuRmxhZyk7CisgICAgYm9vbCBiUmV0ID0gQ1BXTF9XbmQ6Ok9uS2V5RG93bihuQ2hhcixuRmxhZyk7CiAKICAgICAvL0ZJTFRFUgogICAgIHN3aXRjaCAobkNoYXIpCiAgICAgewogICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGNhc2UgRldMX1ZLRVlfRGVsZXRlOgogICAgIGNhc2UgRldMX1ZLRVlfVXA6CiAgICAgY2FzZSBGV0xfVktFWV9Eb3duOgpAQCAtMjA5LDM1ICsyMDksMzUgQEAKICAgICB7CiAgICAgICAgIGNhc2UgRldMX1ZLRVlfRGVsZXRlOgogICAgICAgICAgICAgRGVsZXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBjYXNlIEZXTF9WS0VZX0luc2VydDoKICAgICAgICAgICAgIGlmIChJc1NISUZUcHJlc3NlZChuRmxhZykpCiAgICAgICAgICAgICAgICAgUGFzdGVUZXh0KCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBjYXNlIEZXTF9WS0VZX1VwOgotICAgICAgICAgICAgbV9wRWRpdC0+T25WS19VUChJc1NISUZUcHJlc3NlZChuRmxhZyksRkFMU0UpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICBtX3BFZGl0LT5PblZLX1VQKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgY2FzZSBGV0xfVktFWV9Eb3duOgotICAgICAgICAgICAgbV9wRWRpdC0+T25WS19ET1dOKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxGQUxTRSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIG1fcEVkaXQtPk9uVktfRE9XTihJc1NISUZUcHJlc3NlZChuRmxhZyksZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGNhc2UgRldMX1ZLRVlfTGVmdDoKLSAgICAgICAgICAgIG1fcEVkaXQtPk9uVktfTEVGVChJc1NISUZUcHJlc3NlZChuRmxhZyksRkFMU0UpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICBtX3BFZGl0LT5PblZLX0xFRlQoSXNTSElGVHByZXNzZWQobkZsYWcpLGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBjYXNlIEZXTF9WS0VZX1JpZ2h0OgotICAgICAgICAgICAgbV9wRWRpdC0+T25WS19SSUdIVChJc1NISUZUcHJlc3NlZChuRmxhZyksRkFMU0UpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICBtX3BFZGl0LT5PblZLX1JJR0hUKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgY2FzZSBGV0xfVktFWV9Ib21lOgogICAgICAgICAgICAgbV9wRWRpdC0+T25WS19IT01FKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBjYXNlIEZXTF9WS0VZX0VuZDoKICAgICAgICAgICAgIG1fcEVkaXQtPk9uVktfRU5EKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBjYXNlIEZXTF9WS0VZX1Vua25vd246CiAgICAgICAgICAgICBpZiAoIUlzU0hJRlRwcmVzc2VkKG5GbGFnKSkKICAgICAgICAgICAgICAgICBDbGVhcigpOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIEN1dFRleHQoKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICB9CkBAIC0yNDUsOSArMjQ1LDkgQEAKICAgICByZXR1cm4gYlJldDsKIH0KIAotRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfRWRpdEN0cmw6Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKIHsKLSAgICBpZiAobV9iTW91c2VEb3duKSByZXR1cm4gVFJVRTsKKyAgICBpZiAobV9iTW91c2VEb3duKSByZXR1cm4gdHJ1ZTsKIAogICAgIENQV0xfV25kOjpPbkNoYXIobkNoYXIsbkZsYWcpOwogCkBAIC0yNTYsMTQgKzI1NiwxNCBAQAogICAgIHsKICAgICAgICAgY2FzZSAweDBBOgogICAgICAgICBjYXNlIDB4MUI6Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBGWF9CT09MIGJDdHJsID0gSXNDVFJMcHJlc3NlZChuRmxhZyk7Ci0gICAgRlhfQk9PTCBiQWx0ID0gSXNBTFRwcmVzc2VkKG5GbGFnKTsKLSAgICBGWF9CT09MIGJTaGlmdCA9IElzU0hJRlRwcmVzc2VkKG5GbGFnKTsKKyAgICBib29sIGJDdHJsID0gSXNDVFJMcHJlc3NlZChuRmxhZyk7CisgICAgYm9vbCBiQWx0ID0gSXNBTFRwcmVzc2VkKG5GbGFnKTsKKyAgICBib29sIGJTaGlmdCA9IElzU0hJRlRwcmVzc2VkKG5GbGFnKTsKIAogICAgIEZYX1dPUkQgd29yZCA9IG5DaGFyOwogCkBAIC0yNzMsMjkgKzI3MywyOSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBjYXNlICdDJyAtICdBJyArIDE6CiAgICAgICAgICAgICAgICAgQ29weVRleHQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIGNhc2UgJ1YnIC0gJ0EnICsgMToKICAgICAgICAgICAgICAgICBQYXN0ZVRleHQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIGNhc2UgJ1gnIC0gJ0EnICsgMToKICAgICAgICAgICAgICAgICBDdXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICBjYXNlICdBJyAtICdBJyArIDE6CiAgICAgICAgICAgICAgICAgU2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICBjYXNlICdaJyAtICdBJyArIDE6CiAgICAgICAgICAgICAgICAgaWYgKGJTaGlmdCkKICAgICAgICAgICAgICAgICAgICAgUmVkbygpOwogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgVW5kbygpOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBpZiAobkNoYXIgPCAzMikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoSXNSZWFkT25seSgpKSByZXR1cm4gVFJVRTsKKyAgICBpZiAoSXNSZWFkT25seSgpKSByZXR1cm4gdHJ1ZTsKIAogICAgIGlmIChtX3BFZGl0LT5Jc1NlbGVjdGVkKCkgJiYgd29yZCA9PSAgRldMX1ZLRVlfQmFjaykKICAgICAgICAgd29yZCA9IEZXTF9WS0VZX1Vua25vd247CkBAIC0zMTksMTAgKzMxOSwxMCBAQAogICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfRWRpdEN0cmw6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKICAgICBDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZyk7CiAKQEAgLTMzMSwxNiArMzMxLDE2IEBACiAgICAgICAgIGlmIChtX2JNb3VzZURvd24pCiAgICAgICAgICAgICBJbnZhbGlkYXRlUmVjdCgpOwogCi0gICAgICAgIG1fYk1vdXNlRG93biA9IFRSVUU7CisgICAgICAgIG1fYk1vdXNlRG93biA9IHRydWU7CiAgICAgICAgIFNldENhcHR1cmUoKTsKIAogICAgICAgICBtX3BFZGl0LT5Pbk1vdXNlRG93bihwb2ludCxJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENQV0xfRWRpdEN0cmw6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfRWRpdEN0cmw6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LG5GbGFnKTsKIApAQCAtMzUxLDIwICszNTEsMjAgQEAKICAgICAgICAgICAgIFNldEZvY3VzKCk7CiAKICAgICAgICAgUmVsZWFzZUNhcHR1cmUoKTsKLSAgICAgICAgbV9iTW91c2VEb3duID0gRkFMU0U7CisgICAgICAgIG1fYk1vdXNlRG93biA9IGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENQV0xfRWRpdEN0cmw6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfRWRpdEN0cmw6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgQ1BXTF9XbmQ6Ok9uTW91c2VNb3ZlKHBvaW50LG5GbGFnKTsKIAogICAgIGlmIChtX2JNb3VzZURvd24pCi0gICAgICAgIG1fcEVkaXQtPk9uTW91c2VNb3ZlKHBvaW50LEZBTFNFLEZBTFNFKTsKKyAgICAgICAgbV9wRWRpdC0+T25Nb3VzZU1vdmUocG9pbnQsZmFsc2UsZmFsc2UpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIENQREZfUmVjdCBDUFdMX0VkaXRDdHJsOjpHZXRDb250ZW50UmVjdCgpIGNvbnN0CkBAIC0zNzIsNyArMzcyLDcgQEAKICAgICByZXR1cm4gbV9wRWRpdC0+R2V0Q29udGVudFJlY3QoKTsKIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRFZGl0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSkKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0RWRpdENhcmV0KGJvb2wgYlZpc2libGUpCiB7CiAgICAgQ1BERl9Qb2ludCBwdEhlYWQoMCwwKSxwdEZvb3QoMCwwKTsKIApAQCAtNDE4LDE4ICs0MTgsMTggQEAKICAgICBQV0x0b1duZChwdEhlYWQsIHgsIHkpOwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OlNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsIGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsIGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QpCit2b2lkIENQV0xfRWRpdEN0cmw6OlNldENhcmV0KGJvb2wgYlZpc2libGUsIGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsIGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QpCiB7CiAgICAgaWYgKG1fcEVkaXRDYXJldCkKICAgICB7CiAgICAgICAgIGlmICghSXNGb2N1c2VkKCkgfHwgbV9wRWRpdC0+SXNTZWxlY3RlZCgpKQotICAgICAgICAgICAgYlZpc2libGUgPSBGQUxTRTsKKyAgICAgICAgICAgIGJWaXNpYmxlID0gZmFsc2U7CiAKICAgICAgICAgbV9wRWRpdENhcmV0LT5TZXRDYXJldChiVmlzaWJsZSwgcHRIZWFkLCBwdEZvb3QpOwogICAgIH0KIH0KIAotRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpJc01vZGlmaWVkKCkgY29uc3QKK2Jvb2wgQ1BXTF9FZGl0Q3RybDo6SXNNb2RpZmllZCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fcEVkaXQtPklzTW9kaWZpZWQoKTsKIH0KQEAgLTQ2Niw3ICs0NjYsNyBAQAogICAgICAgICBtX3BFZGl0LT5QYWludCgpOwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OkVuYWJsZVJlZnJlc2goRlhfQk9PTCBiUmVmcmVzaCkKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6RW5hYmxlUmVmcmVzaChib29sIGJSZWZyZXNoKQogewogICAgIGlmIChtX3BFZGl0KQogICAgICAgICBtX3BFZGl0LT5FbmFibGVSZWZyZXNoKGJSZWZyZXNoKTsKQEAgLTU3OCw3ICs1NzgsNyBAQAogewogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OlNob3dWU2Nyb2xsQmFyKEZYX0JPT0wgYlNob3cpCit2b2lkIENQV0xfRWRpdEN0cmw6OlNob3dWU2Nyb2xsQmFyKGJvb2wgYlNob3cpCiB7CiB9CiAKQEAgLTYxMiwxMiArNjEyLDEyIEBACiAgICAgICAgIG1fcEVkaXQtPkJhY2tzcGFjZSgpOwogfQogCi1GWF9CT09MIENQV0xfRWRpdEN0cmw6OkNhblVuZG8oKSBjb25zdAorYm9vbCBDUFdMX0VkaXRDdHJsOjpDYW5VbmRvKCkgY29uc3QKIHsKICAgICByZXR1cm4gIUlzUmVhZE9ubHkoKSAmJiBtX3BFZGl0LT5DYW5VbmRvKCk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9FZGl0Q3RybDo6Q2FuUmVkbygpIGNvbnN0Citib29sIENQV0xfRWRpdEN0cmw6OkNhblJlZG8oKSBjb25zdAogewogICAgIHJldHVybiAhSXNSZWFkT25seSgpICYmIG1fcEVkaXQtPkNhblJlZG8oKTsKIH0KQEAgLTY1MSwxMSArNjUxLDExIEBACiAgICAgaWYgKElzRmxvYXRCaWdnZXIoSW5mby5mUGxhdGVXaWR0aCxJbmZvLmZDb250ZW50TWF4LUluZm8uZkNvbnRlbnRNaW4pCiAgICAgICAgIHx8IElzRmxvYXRFcXVhbChJbmZvLmZQbGF0ZVdpZHRoLEluZm8uZkNvbnRlbnRNYXgtSW5mby5mQ29udGVudE1pbikpCiAgICAgewotICAgICAgICBTaG93VlNjcm9sbEJhcihGQUxTRSk7CisgICAgICAgIFNob3dWU2Nyb2xsQmFyKGZhbHNlKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgU2hvd1ZTY3JvbGxCYXIoVFJVRSk7CisgICAgICAgIFNob3dWU2Nyb2xsQmFyKHRydWUpOwogICAgIH0KIH0KIApAQCAtNjY0LDcgKzY2NCw3IEBACiAgICAgT25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTFBPUyxTQlRfVlNDUk9MTCwgKGludHB0cl90KSZmeSk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0Q3RybDo6SU9uU2V0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSwgY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0Rm9vdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKQordm9pZCBDUFdMX0VkaXRDdHJsOjpJT25TZXRDYXJldChib29sIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290LCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpCiB7CiAgICAgUFdMX0NBUkVUX0lORk8gY0luZm87CiAgICAgY0luZm8uYlZpc2libGUgPSBiVmlzaWJsZTsKQEAgLTcxNyw2ICs3MTcsNiBAQAogICAgIGlmIChtX2JNb3VzZURvd24pCiAgICAgewogICAgICAgICBSZWxlYXNlQ2FwdHVyZSgpOwotICAgICAgICBtX2JNb3VzZURvd24gPSBGQUxTRTsKKyAgICAgICAgbV9iTW91c2VEb3duID0gZmFsc2U7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Gb250TWFwLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfRm9udE1hcC5jcHAKaW5kZXggNTBiMzIxZC4uMmYwMjk3MyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Gb250TWFwLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuY3BwCkBAIC03Miw3ICs3Miw3IEBACiAgICAgcmV0dXJuICIiOwogfQogCi1GWF9CT09MIENQV0xfRm9udE1hcDo6S25vd1dvcmQoaW50MzJfdCBuRm9udEluZGV4LCBGWF9XT1JEIHdvcmQpCitib29sIENQV0xfRm9udE1hcDo6S25vd1dvcmQoaW50MzJfdCBuRm9udEluZGV4LCBGWF9XT1JEIHdvcmQpCiB7CiAgICAgaWYgKG5Gb250SW5kZXggPj0wICYmIG5Gb250SW5kZXggPCBtX2FEYXRhLkdldFNpemUoKSkKICAgICB7CkBAIC04Miw3ICs4Miw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBpbnQzMl90IENQV0xfRm9udE1hcDo6R2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIGludDMyX3QgbkNoYXJzZXQsIGludDMyX3QgbkZvbnRJbmRleCkKQEAgLTEwNiwxMyArMTA2LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpbnQzMl90IG5OZXdGb250SW5kZXggPSBHZXRGb250SW5kZXgoR2V0TmF0aXZlRm9udE5hbWUobkNoYXJzZXQpLCBuQ2hhcnNldCwgVFJVRSk7CisgICAgaW50MzJfdCBuTmV3Rm9udEluZGV4ID0gR2V0Rm9udEluZGV4KEdldE5hdGl2ZUZvbnROYW1lKG5DaGFyc2V0KSwgbkNoYXJzZXQsIHRydWUpOwogICAgIGlmIChuTmV3Rm9udEluZGV4ID49IDApCiAgICAgewogICAgICAgICBpZiAoS25vd1dvcmQobk5ld0ZvbnRJbmRleCwgd29yZCkpCiAgICAgICAgICAgICByZXR1cm4gbk5ld0ZvbnRJbmRleDsKICAgICB9Ci0gICAgbk5ld0ZvbnRJbmRleCA9IEdldEZvbnRJbmRleCgiQXJpYWwgVW5pY29kZSBNUyIsIERFRkFVTFRfQ0hBUlNFVCwgRkFMU0UpOworICAgIG5OZXdGb250SW5kZXggPSBHZXRGb250SW5kZXgoIkFyaWFsIFVuaWNvZGUgTVMiLCBERUZBVUxUX0NIQVJTRVQsIGZhbHNlKTsKICAgICBpZiAobk5ld0ZvbnRJbmRleCA+PSAwKQogICAgIHsKICAgICAgICAgaWYgKEtub3dXb3JkKG5OZXdGb250SW5kZXgsIHdvcmQpKQpAQCAtMTg5LDcgKzE4OSw3IEBACiAgICAgaWYgKHNGb250TmFtZS5Jc0VtcHR5KCkpCiAgICAgICAgIHNGb250TmFtZSA9IERFRkFVTFRfRk9OVF9OQU1FOwogCi0gICAgR2V0Rm9udEluZGV4KHNGb250TmFtZSwgQU5TSV9DSEFSU0VULCBGQUxTRSk7CisgICAgR2V0Rm9udEluZGV4KHNGb250TmFtZSwgQU5TSV9DSEFSU0VULCBmYWxzZSk7CiB9CiAKIApAQCAtMjA2LDE1ICsyMDYsMTUgQEAKICAgICAiVGltZXMtUm9tYW4iLCAiVGltZXMtQm9sZCIsICJUaW1lcy1JdGFsaWMiLCAiVGltZXMtQm9sZEl0YWxpYyIsCiAgICAgIlN5bWJvbCIsICJaYXBmRGluZ2JhdHMifTsKIAotRlhfQk9PTCBDUFdMX0ZvbnRNYXA6OklzU3RhbmRhcmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpCitib29sIENQV0xfRm9udE1hcDo6SXNTdGFuZGFyZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSkKIHsKICAgICBmb3IgKGludDMyX3QgaT0wOyBpPDE0OyBpKyspCiAgICAgewogICAgICAgICBpZiAoc0ZvbnROYW1lID09IGdfc0RFU3RhbmRhcmRGb250TmFtZVtpXSkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogaW50MzJfdCBDUFdMX0ZvbnRNYXA6OkZpbmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsIGludDMyX3QgbkNoYXJzZXQpCkBAIC0yMzQsNyArMjM0LDcgQEAKICAgICByZXR1cm4gLTE7CiB9CiAKLWludDMyX3QgQ1BXTF9Gb250TWFwOjpHZXRGb250SW5kZXgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgaW50MzJfdCBuQ2hhcnNldCwgRlhfQk9PTCBiRmluZCkKK2ludDMyX3QgQ1BXTF9Gb250TWFwOjpHZXRGb250SW5kZXgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgaW50MzJfdCBuQ2hhcnNldCwgYm9vbCBiRmluZCkKIHsKICAgICBpbnQzMl90IG5Gb250SW5kZXggPSBGaW5kRm9udChFbmNvZGVGb250QWxpYXMoc0ZvbnROYW1lLCBuQ2hhcnNldCksIG5DaGFyc2V0KTsKICAgICBpZiAobkZvbnRJbmRleCA+PSAwKQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfSWNvbi5jcHAKaW5kZXggNzExNzRkZi4uODVjNGJjMCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0ljb24uY3BwCkBAIC0xNDUsMTIgKzE0NSwxMiBAQAogCXJldHVybiAwOwogfQogCi1GWF9CT09MCUNQV0xfSWNvbjo6SXNQcm9wb3J0aW9uYWxTY2FsZSgpCitib29sCUNQV0xfSWNvbjo6SXNQcm9wb3J0aW9uYWxTY2FsZSgpCiB7CiAJaWYgKG1fcEljb25GaXQpCiAJCXJldHVybiBtX3BJY29uRml0LT5Jc1Byb3BvcnRpb25hbFNjYWxlKCk7CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENQV0xfSWNvbjo6R2V0SWNvblBvc2l0aW9uKEZYX0ZMT0FUICYgZkxlZnQsIEZYX0ZMT0FUICYgZkJvdHRvbSkKQEAgLTE3NSwxMiArMTc1LDEyIEBACiAJfQogfQogCi1GWF9CT09MIENQV0xfSWNvbjo6R2V0Rml0dGluZ0JvdW5kcygpCitib29sIENQV0xfSWNvbjo6R2V0Rml0dGluZ0JvdW5kcygpCiB7CiAJaWYgKG1fcEljb25GaXQpCiAJCXJldHVybiBtX3BJY29uRml0LT5HZXRGaXR0aW5nQm91bmRzKCk7CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENQV0xfSWNvbjo6R2V0U2NhbGUoRlhfRkxPQVQgJiBmSFNjYWxlLEZYX0ZMT0FUICYgZlZTY2FsZSkKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfSWNvbkxpc3QuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uTGlzdC5jcHAKaW5kZXggMTU3ZWJhNi4uZWNiYjBmZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uTGlzdC5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uTGlzdC5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKIENQV0xfSWNvbkxpc3RfSXRlbTo6Q1BXTF9JY29uTGlzdF9JdGVtKCkgOgogCW1fbkljb25JbmRleCgtMSksCiAJbV9wRGF0YShOVUxMKSwKLQltX2JTZWxlY3RlZChGQUxTRSksCisJbV9iU2VsZWN0ZWQoZmFsc2UpLAogCW1fcFRleHQoTlVMTCkKIHsKIH0KQEAgLTY3LDcgKzY3LDcgQEAKIAkJbV9jckljb24sIG1fcFRleHQtPkdldFRleHRDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSk7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpTZXRTZWxlY3QoRlhfQk9PTCBiU2VsZWN0ZWQpCit2b2lkIENQV0xfSWNvbkxpc3RfSXRlbTo6U2V0U2VsZWN0KGJvb2wgYlNlbGVjdGVkKQogewogCW1fYlNlbGVjdGVkID0gYlNlbGVjdGVkOwogCkBAIC03OCw3ICs3OCw3IEBACiAKIH0KIAotRlhfQk9PTAlDUFdMX0ljb25MaXN0X0l0ZW06OklzU2VsZWN0ZWQoKSBjb25zdAorYm9vbAlDUFdMX0ljb25MaXN0X0l0ZW06OklzU2VsZWN0ZWQoKSBjb25zdAogewogCXJldHVybiBtX2JTZWxlY3RlZDsKIH0KQEAgLTEyMSw3ICsxMjEsNyBAQAogCiAJcmNDbGllbnQubGVmdCArPSAoUFdMX0ljb25MaXN0X0lURU1fSUNPTl9MRUZUTUFSR0lOICsgUFdMX0ljb25MaXN0X0lURU1fV0lEVEggKyBQV0xfSWNvbkxpc3RfSVRFTV9JQ09OX0xFRlRNQVJHSU4pOwogCi0JbV9wVGV4dC0+TW92ZShyY0NsaWVudCwgVFJVRSwgRkFMU0UpOworCW1fcFRleHQtPk1vdmUocmNDbGllbnQsIHRydWUsIGZhbHNlKTsKIH0KIAogdm9pZCBDUFdMX0ljb25MaXN0X0l0ZW06OlNldEljb25GaWxsQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpCkBAIC0xNTEsOCArMTUxLDggQEAKIENQV0xfSWNvbkxpc3RfQ29udGVudDo6Q1BXTF9JY29uTGlzdF9Db250ZW50KGludDMyX3Qgbkxpc3RDb3VudCkgOgogCW1fblNlbGVjdEluZGV4KC0xKSwKIAltX3BOb3RpZnkoTlVMTCksCi0JbV9iRW5hYmxlTm90aWZ5KFRSVUUpLAotCW1fYk1vdXNlRG93bihGQUxTRSksCisJbV9iRW5hYmxlTm90aWZ5KHRydWUpLAorCW1fYk1vdXNlRG93bihmYWxzZSksCiAJbV9uTGlzdENvdW50KG5MaXN0Q291bnQpCiB7CiB9CkBAIC0xOTIsMjkgKzE5MiwyOSBAQAogCX0KIH0KIAotRlhfQk9PTAlDUFdMX0ljb25MaXN0X0NvbnRlbnQ6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wJQ1BXTF9JY29uTGlzdF9Db250ZW50OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJU2V0Rm9jdXMoKTsKIAogCVNldENhcHR1cmUoKTsKLQltX2JNb3VzZURvd24gPSBUUlVFOworCW1fYk1vdXNlRG93biA9IHRydWU7CiAKIAlpbnQzMl90IG5JdGVtSW5kZXggPSBGaW5kSXRlbUluZGV4KHBvaW50KTsKIAlTZXRTZWxlY3Qobkl0ZW1JbmRleCk7CiAJU2Nyb2xsVG9JdGVtKG5JdGVtSW5kZXgpOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wJQ1BXTF9JY29uTGlzdF9Db250ZW50OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbAlDUFdMX0ljb25MaXN0X0NvbnRlbnQ6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7Ci0JbV9iTW91c2VEb3duID0gRkFMU0U7CisJbV9iTW91c2VEb3duID0gZmFsc2U7CiAJUmVsZWFzZUNhcHR1cmUoKTsKIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENQV0xfSWNvbkxpc3RfQ29udGVudDo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewogCWlmIChtX2JNb3VzZURvd24pCiAJewpAQCAtMjIzLDEwICsyMjMsMTAgQEAKIAkJU2Nyb2xsVG9JdGVtKG5JdGVtSW5kZXgpOwogCX0KIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MCUNQV0xfSWNvbkxpc3RfQ29udGVudDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQorYm9vbAlDUFdMX0ljb25MaXN0X0NvbnRlbnQ6Ok9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKIHsKIAlzd2l0Y2ggKG5DaGFyKQogCXsKQEAgLTIzNyw3ICsyMzcsNyBAQAogCQkJU2V0U2VsZWN0KG5JdGVtSW5kZXgpOwogCQkJU2Nyb2xsVG9JdGVtKG5JdGVtSW5kZXgpOwogCQl9Ci0JCXJldHVybiBUUlVFOworCQlyZXR1cm4gdHJ1ZTsKIAljYXNlIEZXTF9WS0VZX0Rvd246CiAJCWlmIChtX25TZWxlY3RJbmRleCA8IG1fbkxpc3RDb3VudC0xKQogCQl7CkBAIC0yNDUsMTAgKzI0NSwxMCBAQAogCQkJU2V0U2VsZWN0KG5JdGVtSW5kZXgpOwogCQkJU2Nyb2xsVG9JdGVtKG5JdGVtSW5kZXgpOwogCQl9Ci0JCXJldHVybiBUUlVFOworCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCiBpbnQzMl90IENQV0xfSWNvbkxpc3RfQ29udGVudDo6RmluZEl0ZW1JbmRleChjb25zdCBDUERGX1BvaW50JiBwb2ludCkKQEAgLTMwNyw4ICszMDcsOCBAQAogewogCWlmIChtX25TZWxlY3RJbmRleCAhPSBuSW5kZXgpCiAJewotCQlTZWxlY3RJdGVtKG1fblNlbGVjdEluZGV4LCBGQUxTRSk7Ci0JCVNlbGVjdEl0ZW0obkluZGV4LCBUUlVFKTsKKwkJU2VsZWN0SXRlbShtX25TZWxlY3RJbmRleCwgZmFsc2UpOworCQlTZWxlY3RJdGVtKG5JbmRleCwgdHJ1ZSk7CiAJCW1fblNlbGVjdEluZGV4ID0gbkluZGV4OwogCiAJCWlmIChJUFdMX0ljb25MaXN0X05vdGlmeSogcE5vdGlmeSA9IEdldE5vdGlmeSgpKQpAQCAtMzMzLDEyICszMzMsMTIgQEAKIAltX3BOb3RpZnkgPSBwTm90aWZ5OwogfQogCi12b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6RW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSkKK3ZvaWQgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpFbmFibGVOb3RpZnkoYm9vbCBiTm90aWZ5KQogewogCW1fYkVuYWJsZU5vdGlmeSA9IGJOb3RpZnk7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpTZWxlY3RJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiU2VsZWN0KQordm9pZCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OlNlbGVjdEl0ZW0oaW50MzJfdCBuSXRlbUluZGV4LCBib29sIGJTZWxlY3QpCiB7CiAJaWYgKENQV0xfSWNvbkxpc3RfSXRlbSogcEl0ZW0gPSBHZXRMaXN0SXRlbShuSXRlbUluZGV4KSkKIAl7CkBAIC00MjMsNyArNDIzLDcgQEAKIAlDUFdMX1duZDo6UmVQb3NDaGlsZFduZCgpOwogCiAJaWYgKG1fcExpc3RDb250ZW50KQotCQltX3BMaXN0Q29udGVudC0+TW92ZShHZXRDbGllbnRSZWN0KCksIFRSVUUsIEZBTFNFKTsKKwkJbV9wTGlzdENvbnRlbnQtPk1vdmUoR2V0Q2xpZW50UmVjdCgpLCB0cnVlLCBmYWxzZSk7CiB9CiAKIHZvaWQgQ1BXTF9JY29uTGlzdDo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApCkBAIC00NDIsNyArNDQyLDcgQEAKIAl7CiAJCXBTY3JvbGxCYXItPlJlbW92ZUZsYWcoUFdTX0FVVE9UUkFOU1BBUkVOVCk7CiAJCXBTY3JvbGxCYXItPlNldFRyYW5zcGFyZW5jeSgyNTUpOwotCQlwU2Nyb2xsQmFyLT5TZXROb3RpZnlGb3JldmVyKFRSVUUpOworCQlwU2Nyb2xsQmFyLT5TZXROb3RpZnlGb3JldmVyKHRydWUpOwogCX0KIH0KIApAQCAtNDYzLDcgKzQ2Myw3IEBACiAJCQkJCXsKIAkJCQkJCWlmICghcFNjcm9sbEJhci0+SXNWaXNpYmxlKCkpCiAJCQkJCQl7Ci0JCQkJCQkJcFNjcm9sbEJhci0+U2V0VmlzaWJsZShUUlVFKTsKKwkJCQkJCQlwU2Nyb2xsQmFyLT5TZXRWaXNpYmxlKHRydWUpOwogCQkJCQkJCVJlUG9zQ2hpbGRXbmQoKTsKIAkJCQkJCX0KIAkJCQkJCWVsc2UKQEAgLTQ3NCw3ICs0NzQsNyBAQAogCQkJCQl7CiAJCQkJCQlpZiAocFNjcm9sbEJhci0+SXNWaXNpYmxlKCkpCiAJCQkJCQl7Ci0JCQkJCQkJcFNjcm9sbEJhci0+U2V0VmlzaWJsZShGQUxTRSk7CisJCQkJCQkJcFNjcm9sbEJhci0+U2V0VmlzaWJsZShmYWxzZSk7CiAJCQkJCQkJUmVQb3NDaGlsZFduZCgpOwogCQkJCQkJfQogCkBAIC01MjIsNyArNTIyLDcgQEAKIAltX3BMaXN0Q29udGVudC0+U2V0Tm90aWZ5KHBOb3RpZnkpOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3Q6OkVuYWJsZU5vdGlmeShGWF9CT09MIGJOb3RpZnkpCit2b2lkIENQV0xfSWNvbkxpc3Q6OkVuYWJsZU5vdGlmeShib29sIGJOb3RpZnkpCiB7CiAJbV9wTGlzdENvbnRlbnQtPkVuYWJsZU5vdGlmeShiTm90aWZ5KTsKIH0KQEAgLTU1Miw3ICs1NTIsNyBAQAogCW1fcExpc3RDb250ZW50LT5TZXRJY29uRmlsbENvbG9yKGNvbG9yKTsKIH0KIAotRlhfQk9PTAlDUFdMX0ljb25MaXN0OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbAlDUFdMX0ljb25MaXN0OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewogCUNQREZfUG9pbnQgcHRTY3JvbGwgPSBtX3BMaXN0Q29udGVudC0+R2V0U2Nyb2xsUG9zKCk7CiAJQ1BERl9SZWN0IHJjU2Nyb2xsID0gbV9wTGlzdENvbnRlbnQtPkdldFNjcm9sbEFyZWEoKTsKQEAgLTU4MywxMCArNTgzLDEwIEBACiAJCQlpZiAoQ1BXTF9TY3JvbGxCYXIqIHBTY3JvbGxCYXIgPSBHZXRWU2Nyb2xsQmFyKCkpCiAJCQkJcFNjcm9sbEJhci0+T25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTFBPUywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmcHROZXcueSk7CiAKLQkJCXJldHVybiBUUlVFOworCQkJcmV0dXJuIHRydWU7CiAJCX0KIAl9CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xhYmVsLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGFiZWwuY3BwCmluZGV4IGUxNzgwYzYuLjNlMjMxZDUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGFiZWwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGFiZWwuY3BwCkBAIC0zOSw3ICszOSw3IEBACiAJaWYgKEhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykpCiAJewogCQlTZXRDbGlwUmVjdChDUERGX1JlY3QoMC4wZiwwLjBmLDAuMGYsMC4wZikpOwotCQltX3BFZGl0LT5TZXRUZXh0T3ZlcmZsb3coVFJVRSk7CisJCW1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyh0cnVlKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGlzdEJveC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guY3BwCmluZGV4IDQ4ZmI0MDkuLmQwZTljYzYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGlzdEJveC5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MaXN0Qm94LmNwcApAQCAtNDksNyArNDksNyBAQAogCQl7CiAJCQlpZiAocFNjcm9sbC0+SXNWaXNpYmxlKCkpCiAJCQl7Ci0JCQkJcFNjcm9sbC0+U2V0VmlzaWJsZShGQUxTRSk7CisJCQkJcFNjcm9sbC0+U2V0VmlzaWJsZShmYWxzZSk7CiAJCQkJbV9wTGlzdC0+UmVQb3NDaGlsZFduZCgpOwogCQkJfQogCQl9CkBAIC01Nyw3ICs1Nyw3IEBACiAJCXsKIAkJCWlmICghcFNjcm9sbC0+SXNWaXNpYmxlKCkpCiAJCQl7Ci0JCQkJcFNjcm9sbC0+U2V0VmlzaWJsZShUUlVFKTsKKwkJCQlwU2Nyb2xsLT5TZXRWaXNpYmxlKHRydWUpOwogCQkJCW1fcExpc3QtPlJlUG9zQ2hpbGRXbmQoKTsKIAkJCX0KIAkJfQpAQCAtNzksOCArNzksOCBAQAogQ1BXTF9MaXN0Qm94OjpDUFdMX0xpc3RCb3goKSA6CiAJbV9wTGlzdChOVUxMKSwKIAltX3BMaXN0Tm90aWZ5KE5VTEwpLAotCW1fYk1vdXNlRG93bihGQUxTRSksCi0JbV9iSG92ZXJTZWwoRkFMU0UpLAorCW1fYk1vdXNlRG93bihmYWxzZSksCisJbV9iSG92ZXJTZWwoZmFsc2UpLAogCW1fcEZpbGxlck5vdGlmeShOVUxMKQogewogCW1fcExpc3QgPSBJRlhfTGlzdDo6TmV3TGlzdCgpOwpAQCAtMjI5LDE2ICsyMjksMTYgQEAKIAl9CiB9CiAKLUZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfTGlzdEJveDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewogCUNQV0xfV25kOjpPbktleURvd24obkNoYXIsIG5GbGFnKTsKIAotCWlmICghbV9wTGlzdCkgcmV0dXJuIEZBTFNFOworCWlmICghbV9wTGlzdCkgcmV0dXJuIGZhbHNlOwogCiAJc3dpdGNoIChuQ2hhcikKIAl7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJY2FzZSBGV0xfVktFWV9VcDoKIAljYXNlIEZXTF9WS0VZX0Rvd246CiAJY2FzZSBGV0xfVktFWV9Ib21lOgpAQCAtMjcyLDMzICsyNzIsMzMgQEAKIAkJYnJlYWs7CiAJfQogCi0JRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwotCU9uTm90aWZ5U2VsQ2hhbmdlZChUUlVFLGJFeGl0LG5GbGFnKTsKKwlib29sIGJFeGl0ID0gZmFsc2U7CisJT25Ob3RpZnlTZWxDaGFuZ2VkKHRydWUsYkV4aXQsbkZsYWcpOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfTGlzdEJveDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewogCUNQV0xfV25kOjpPbkNoYXIobkNoYXIsbkZsYWcpOwogCi0JaWYgKCFtX3BMaXN0KSByZXR1cm4gRkFMU0U7CisJaWYgKCFtX3BMaXN0KSByZXR1cm4gZmFsc2U7CiAKLQlpZiAoIW1fcExpc3QtPk9uQ2hhcihuQ2hhcixJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpKSByZXR1cm4gRkFMU0U7CisJaWYgKCFtX3BMaXN0LT5PbkNoYXIobkNoYXIsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKSkgcmV0dXJuIGZhbHNlOwogCi0JRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwotCU9uTm90aWZ5U2VsQ2hhbmdlZChUUlVFLGJFeGl0LCBuRmxhZyk7CisJYm9vbCBiRXhpdCA9IGZhbHNlOworCU9uTm90aWZ5U2VsQ2hhbmdlZCh0cnVlLGJFeGl0LCBuRmxhZyk7CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDUFdMX0xpc3RCb3g6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9MaXN0Qm94OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwogCiAJaWYgKENsaWVudEhpdFRlc3QocG9pbnQpKQogCXsKLQkJbV9iTW91c2VEb3duID0gVFJVRTsKKwkJbV9iTW91c2VEb3duID0gdHJ1ZTsKIAkJU2V0Rm9jdXMoKTsKIAkJU2V0Q2FwdHVyZSgpOwogCkBAIC0zMDYsMzEgKzMwNiwzMSBAQAogCQkJbV9wTGlzdC0+T25Nb3VzZURvd24ocG9pbnQsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKIAl9CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDUFdMX0xpc3RCb3g6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfTGlzdEJveDo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsbkZsYWcpOwogCiAJaWYgKG1fYk1vdXNlRG93bikKIAl7CiAJCVJlbGVhc2VDYXB0dXJlKCk7Ci0JCW1fYk1vdXNlRG93biA9IEZBTFNFOworCQltX2JNb3VzZURvd24gPSBmYWxzZTsKIAl9CiAKLQlGWF9CT09MIGJFeGl0ID0gRkFMU0U7Ci0JT25Ob3RpZnlTZWxDaGFuZ2VkKEZBTFNFLGJFeGl0LG5GbGFnKTsKKwlib29sIGJFeGl0ID0gZmFsc2U7CisJT25Ob3RpZnlTZWxDaGFuZ2VkKGZhbHNlLGJFeGl0LG5GbGFnKTsKIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi12b2lkIENQV0xfTGlzdEJveDo6U2V0SG92ZXJTZWwoRlhfQk9PTCBiSG92ZXJTZWwpCit2b2lkIENQV0xfTGlzdEJveDo6U2V0SG92ZXJTZWwoYm9vbCBiSG92ZXJTZWwpCiB7CiAJbV9iSG92ZXJTZWwgPSBiSG92ZXJTZWw7CiB9CiAKLUZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCBDUFdMX0xpc3RCb3g6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQ1BXTF9XbmQ6Ok9uTW91c2VNb3ZlKHBvaW50LCBuRmxhZyk7CiAKQEAgLTM0Niw3ICszNDYsNyBAQAogCQkJbV9wTGlzdC0+T25Nb3VzZU1vdmUocG9pbnQsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKIAl9CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBDUFdMX0xpc3RCb3g6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIGludHB0cl90IHdQYXJhbSwgaW50cHRyX3QgbFBhcmFtKQpAQCAtNDA1LDE5ICs0MDUsMTkgQEAKIAkJbV9wTGlzdC0+U2V0UGxhdGVSZWN0KEdldExpc3RSZWN0KCkpOwogfQogCi12b2lkIENQV0xfTGlzdEJveDo6T25Ob3RpZnlTZWxDaGFuZ2VkKEZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgJiBiRXhpdCwgIEZYX0RXT1JEIG5GbGFnKQordm9pZCBDUFdMX0xpc3RCb3g6Ok9uTm90aWZ5U2VsQ2hhbmdlZChib29sIGJLZXlEb3duLCBib29sICYgYkV4aXQsICBGWF9EV09SRCBuRmxhZykKIHsKIAlpZiAobV9wRmlsbGVyTm90aWZ5KQogCXsKLQkJRlhfQk9PTCBiUkMgPSBUUlVFOworCQlib29sIGJSQyA9IHRydWU7CiAJCUNGWF9XaWRlU3RyaW5nIHN3Q2hhbmdlID0gR2V0VGV4dCgpOwogCQlDRlhfV2lkZVN0cmluZyBzdHJDaGFuZ2VFeDsKIAkJaW50IG5TZWxTdGFydCA9IDA7CiAJCWludCBuU2VsRW5kID0gc3dDaGFuZ2UuR2V0TGVuZ3RoKCk7Ci0JCW1fcEZpbGxlck5vdGlmeS0+T25CZWZvcmVLZXlTdHJva2UoRkFMU0UsIEdldEF0dGFjaGVkRGF0YSgpLCAwLCBzd0NoYW5nZSwgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgYktleURvd24sIGJSQywgYkV4aXQsIG5GbGFnKTsKKwkJbV9wRmlsbGVyTm90aWZ5LT5PbkJlZm9yZUtleVN0cm9rZShmYWxzZSwgR2V0QXR0YWNoZWREYXRhKCksIDAsIHN3Q2hhbmdlLCBzdHJDaGFuZ2VFeCwgblNlbFN0YXJ0LCBuU2VsRW5kLCBiS2V5RG93biwgYlJDLCBiRXhpdCwgbkZsYWcpOwogCQlpZiAoYkV4aXQpIHJldHVybjsKIAotCQltX3BGaWxsZXJOb3RpZnktPk9uQWZ0ZXJLZXlTdHJva2UoRkFMU0UsIEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCxuRmxhZyk7CisJCW1fcEZpbGxlck5vdGlmeS0+T25BZnRlcktleVN0cm9rZShmYWxzZSwgR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LG5GbGFnKTsKIAl9CiB9CiAKQEAgLTQ5OCwxMiArNDk4LDEyIEBACiAJCW1fcExpc3QtPkNhbmNlbCgpOwogfQogCi1GWF9CT09MIENQV0xfTGlzdEJveDo6SXNNdWx0aXBsZVNlbCgpIGNvbnN0Citib29sIENQV0xfTGlzdEJveDo6SXNNdWx0aXBsZVNlbCgpIGNvbnN0CiB7CiAJaWYgKG1fcExpc3QpCiAJCXJldHVybiBtX3BMaXN0LT5Jc011bHRpcGxlU2VsKCk7CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCiBpbnQzMl90IENQV0xfTGlzdEJveDo6R2V0Q2FyZXRJbmRleCgpIGNvbnN0CkBAIC01MjIsMTIgKzUyMiwxMiBAQAogCXJldHVybiAtMTsKIH0KIAotRlhfQk9PTCBDUFdMX0xpc3RCb3g6OklzSXRlbVNlbGVjdGVkKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3QKK2Jvb2wgQ1BXTF9MaXN0Qm94OjpJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0CiB7CiAJaWYgKG1fcExpc3QpCiAJCXJldHVybiBtX3BMaXN0LT5Jc0l0ZW1TZWxlY3RlZChuSXRlbUluZGV4KTsKIAotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIGludDMyX3QgQ1BXTF9MaXN0Qm94OjpHZXRUb3BWaXNpYmxlSW5kZXgoKSBjb25zdApAQCAtNTc4LDkgKzU3OCw5IEBACiAJcmV0dXJuIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KEdldFdpbmRvd1JlY3QoKSwoRlhfRkxPQVQpKEdldEJvcmRlcldpZHRoKCkrR2V0SW5uZXJCb3JkZXJXaWR0aCgpKSk7CiB9CiAKLUZYX0JPT0wJQ1BXTF9MaXN0Qm94OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbAlDUFdMX0xpc3RCb3g6Ok9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7Ci0JaWYgKCFtX3BMaXN0KSByZXR1cm4gRkFMU0U7CisJaWYgKCFtX3BMaXN0KSByZXR1cm4gZmFsc2U7CiAKIAlpZiAoekRlbHRhIDwgMCkKIAl7CkBAIC01OTEsOCArNTkxLDggQEAKIAkJbV9wTGlzdC0+T25WS19VUChJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwogCX0KIAotCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLQlPbk5vdGlmeVNlbENoYW5nZWQoRkFMU0UsYkV4aXQsIG5GbGFnKTsKLQlyZXR1cm4gVFJVRTsKKwlib29sIGJFeGl0ID0gZmFsc2U7CisJT25Ob3RpZnlTZWxDaGFuZ2VkKGZhbHNlLGJFeGl0LCBuRmxhZyk7CisJcmV0dXJuIHRydWU7CiB9CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGlzdEN0cmwuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5jcHAKaW5kZXggMzA3N2U2Mi4uZDJkZWFjYiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5jcHAKQEAgLTUyLDcgKzUyLDcgQEAKIAogdm9pZCBDUFdMX0xpc3RDdHJsOjpSZXNldEZhY2UoKQogewotCVJlc2V0QWxsKEZBTFNFLCAwKTsKKwlSZXNldEFsbChmYWxzZSwgMCk7CiB9CiAKIHZvaWQgQ1BXTF9MaXN0Q3RybDo6UmVzZXRDb250ZW50KGludDMyX3QgblN0YXJ0KQpAQCAtNjAsNyArNjAsNyBAQAogCWlmIChuU3RhcnQgPCAwKQogCQluU3RhcnQgPSAwOwogCWlmIChuU3RhcnQgPj0gMCAmJiBuU3RhcnQgPCBtX2FDaGlsZHJlbi5HZXRTaXplKCkpCi0JCVJlc2V0QWxsKFRSVUUsIG5TdGFydCk7CisJCVJlc2V0QWxsKHRydWUsIG5TdGFydCk7CiB9CiAKIEZYX0ZMT0FUIENQV0xfTGlzdEN0cmw6OkdldENvbnRlbnRzSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKQpAQCAtOTEsNyArOTEsNyBAQAogCXJldHVybiBmUmV0OwogfQogCi12b2lkIENQV0xfTGlzdEN0cmw6OlJlc2V0QWxsKEZYX0JPT0wgYk1vdmUsIGludDMyX3QgblN0YXJ0KQordm9pZCBDUFdMX0xpc3RDdHJsOjpSZXNldEFsbChib29sIGJNb3ZlLCBpbnQzMl90IG5TdGFydCkKIHsKIAlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CiAKQEAgLTExOSw3ICsxMTksNyBAQAogCQkJaWYgKGJNb3ZlKQogCQkJewogCQkJCUZYX0ZMT0FUIGZJdGVtSGVpZ2h0ID0gcENoaWxkLT5HZXRJdGVtSGVpZ2h0KGZXaWR0aCAtIGZMZWZ0IC0gZlJpZ2h0KTsKLQkJCQlwQ2hpbGQtPk1vdmUoQ1BERl9SZWN0KGZMZWZ0LCBmeS1mSXRlbUhlaWdodCwgZldpZHRoIC0gZlJpZ2h0LCBmeSksIFRSVUUsIEZBTFNFKTsKKwkJCQlwQ2hpbGQtPk1vdmUoQ1BERl9SZWN0KGZMZWZ0LCBmeS1mSXRlbUhlaWdodCwgZldpZHRoIC0gZlJpZ2h0LCBmeSksIHRydWUsIGZhbHNlKTsKIAkJCQlmeSAtPSBmSXRlbUhlaWdodDsKIAkJCQlmeSAtPSBtX2ZJdGVtU3BhY2U7CiAJCQl9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX05vdGUuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Ob3RlLmNwcAppbmRleCA3ZWQxMTE1Li5mM2M1ODE2IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX05vdGUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTm90ZS5jcHAKQEAgLTYwLDEzICs2MCwxMyBAQAogCQlpZiAocmNDbGllbnQuV2lkdGgoKSA+IDE1LjBmKQogCQl7CiAJCQlyY0NsaWVudC5yaWdodCAtPSAxNS4wZjsKLQkJCW1fcFRleHQtPk1vdmUocmNDbGllbnQsIFRSVUUsIEZBTFNFKTsKLQkJCW1fcFRleHQtPlNldFZpc2libGUoVFJVRSk7CisJCQltX3BUZXh0LT5Nb3ZlKHJjQ2xpZW50LCB0cnVlLCBmYWxzZSk7CisJCQltX3BUZXh0LT5TZXRWaXNpYmxlKHRydWUpOwogCQl9CiAJCWVsc2UKIAkJewotCQkJbV9wVGV4dC0+TW92ZShDUERGX1JlY3QoMCwwLDAsMCksIFRSVUUsIEZBTFNFKTsKLQkJCW1fcFRleHQtPlNldFZpc2libGUoRkFMU0UpOworCQkJbV9wVGV4dC0+TW92ZShDUERGX1JlY3QoMCwwLDAsMCksIHRydWUsIGZhbHNlKTsKKwkJCW1fcFRleHQtPlNldFZpc2libGUoZmFsc2UpOwogCQl9CiAJfQogfQpAQCAtMTIyLDkgKzEyMiw5IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Ob3RlX0VkaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNQV0xfTm90ZV9FZGl0OjpDUFdMX05vdGVfRWRpdCgpIDogbV9iRW5hYmxlTm90aWZ5KFRSVUUpLAorQ1BXTF9Ob3RlX0VkaXQ6OkNQV0xfTm90ZV9FZGl0KCkgOiBtX2JFbmFibGVOb3RpZnkodHJ1ZSksCiAJbV9mT2xkSXRlbUhlaWdodCgwLjBmKSwKLQltX2JTaXplQ2hhbmdlZChGQUxTRSksCisJbV9iU2l6ZUNoYW5nZWQoZmFsc2UpLAogCW1fZk9sZE1pbigwLjBmKSwKIAltX2ZPbGRNYXgoMC4wZikKIHsKQEAgLTEzNiwzMyArMTM2LDMzIEBACiAKIHZvaWQgQ1BXTF9Ob3RlX0VkaXQ6OlJlUG9zQ2hpbGRXbmQoKQogewotCW1fYkVuYWJsZU5vdGlmeSA9IEZBTFNFOworCW1fYkVuYWJsZU5vdGlmeSA9IGZhbHNlOwogCUNQV0xfRWRpdDo6UmVQb3NDaGlsZFduZCgpOwotCW1fYkVuYWJsZU5vdGlmeSA9IFRSVUU7CisJbV9iRW5hYmxlTm90aWZ5ID0gdHJ1ZTsKIAogCW1fZk9sZEl0ZW1IZWlnaHQgPSBHZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOwogfQogCiB2b2lkIENQV0xfTm90ZV9FZGl0OjpTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiBjc1RleHQpCiB7Ci0JbV9iRW5hYmxlTm90aWZ5ID0gRkFMU0U7CisJbV9iRW5hYmxlTm90aWZ5ID0gZmFsc2U7CiAJQ1BXTF9FZGl0OjpTZXRUZXh0KGNzVGV4dCk7Ci0JbV9iRW5hYmxlTm90aWZ5ID0gVFJVRTsKKwltX2JFbmFibGVOb3RpZnkgPSB0cnVlOwogCW1fZk9sZEl0ZW1IZWlnaHQgPSBHZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOwogfQogCiB2b2lkIENQV0xfTm90ZV9FZGl0OjpPblNldEZvY3VzKCkKIHsKLQltX2JFbmFibGVOb3RpZnkgPSBGQUxTRTsKKwltX2JFbmFibGVOb3RpZnkgPSBmYWxzZTsKIAlDUFdMX0VkaXQ6Ok9uU2V0Rm9jdXMoKTsKLQltX2JFbmFibGVOb3RpZnkgPSBUUlVFOworCW1fYkVuYWJsZU5vdGlmeSA9IHRydWU7CiAKLQlFbmFibGVTcGVsbENoZWNrKFRSVUUpOworCUVuYWJsZVNwZWxsQ2hlY2sodHJ1ZSk7CiB9CiAKIHZvaWQgQ1BXTF9Ob3RlX0VkaXQ6Ok9uS2lsbEZvY3VzKCkKIHsKLQlFbmFibGVTcGVsbENoZWNrKEZBTFNFKTsKKwlFbmFibGVTcGVsbENoZWNrKGZhbHNlKTsKIAogCWlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQogCXsKQEAgLTE5Myw3ICsxOTMsNyBAQAogCQkJCQlpZiAoIUlzRmxvYXRFcXVhbChwSW5mby0+ZkNvbnRlbnRNYXgsIG1fZk9sZE1heCkgfHwKIAkJCQkJCSFJc0Zsb2F0RXF1YWwocEluZm8tPmZDb250ZW50TWluLCBtX2ZPbGRNaW4pKQogCQkJCQl7Ci0JCQkJCQltX2JTaXplQ2hhbmdlZCA9IFRSVUU7CisJCQkJCQltX2JTaXplQ2hhbmdlZCA9IHRydWU7CiAJCQkJCQlpZiAoQ1BXTF9XbmQgKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpCiAJCQkJCQl7CiAJCQkJCQkJcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgMCk7CkBAIC0yMTgsNyArMjE4LDcgQEAKIAkJCWlmIChQV0xfQ0FSRVRfSU5GTyAqIHBJbmZvID0gKFBXTF9DQVJFVF9JTkZPKil3UGFyYW0pCiAJCQl7CiAJCQkJUFdMX0NBUkVUX0lORk8gbmV3SW5mbyA9ICpwSW5mbzsKLQkJCQluZXdJbmZvLmJWaXNpYmxlID0gVFJVRTsKKwkJCQluZXdJbmZvLmJWaXNpYmxlID0gdHJ1ZTsKIAkJCQluZXdJbmZvLnB0SGVhZCA9IENoaWxkVG9QYXJlbnQocEluZm8tPnB0SGVhZCk7CiAJCQkJbmV3SW5mby5wdEZvb3QgPSBDaGlsZFRvUGFyZW50KHBJbmZvLT5wdEZvb3QpOwogCkBAIC0yMzksMTggKzIzOSwxOCBAQAogCQlpZiAoIW1fYlNpemVDaGFuZ2VkKQogCQkJcmV0dXJuIG1fZk9sZEl0ZW1IZWlnaHQ7CiAKLQkJbV9iU2l6ZUNoYW5nZWQgPSBGQUxTRTsKKwkJbV9iU2l6ZUNoYW5nZWQgPSBmYWxzZTsKIAotCQlFbmFibGVOb3RpZnkoRkFMU0UpOwotCQlFbmFibGVSZWZyZXNoKEZBTFNFKTsKLQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KEZBTFNFKTsKKwkJRW5hYmxlTm90aWZ5KGZhbHNlKTsKKwkJRW5hYmxlUmVmcmVzaChmYWxzZSk7CisJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShmYWxzZSk7CiAKLQkJTW92ZShDUERGX1JlY3QoMCwwLGZMaW1pdFdpZHRoLDApLCBUUlVFLCBGQUxTRSk7CisJCU1vdmUoQ1BERl9SZWN0KDAsMCxmTGltaXRXaWR0aCwwKSwgdHJ1ZSwgZmFsc2UpOwogCQlGWF9GTE9BVCBmUmV0ID0gR2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAotCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoVFJVRSk7Ci0JCUVuYWJsZU5vdGlmeShUUlVFKTsKLQkJRW5hYmxlUmVmcmVzaChUUlVFKTsKKwkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KHRydWUpOworCQlFbmFibGVOb3RpZnkodHJ1ZSk7CisJCUVuYWJsZVJlZnJlc2godHJ1ZSk7CiAKIAkJcmV0dXJuIGZSZXQ7CiAJfQpAQCAtMzQ5LDcgKzM0OSw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX05vdGVfQ2xvc2VCb3ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DUFdMX05vdGVfQ2xvc2VCb3g6OkNQV0xfTm90ZV9DbG9zZUJveCgpIDogbV9iTW91c2VEb3duKEZBTFNFKQorQ1BXTF9Ob3RlX0Nsb3NlQm94OjpDUFdMX05vdGVfQ2xvc2VCb3goKSA6IG1fYk1vdXNlRG93bihmYWxzZSkKIHsKIH0KIApAQCAtMzg3LDE5ICszODcsMTkgQEAKIAkJMCwgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKSwgRlhGSUxMX0FMVEVSTkFURSk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9Ob3RlX0Nsb3NlQm94OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfTm90ZV9DbG9zZUJveDo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewogCVNldEJvcmRlclN0eWxlKFBCU19JTlNFVCk7CiAJSW52YWxpZGF0ZVJlY3QoTlVMTCk7CiAKLQltX2JNb3VzZURvd24gPSBUUlVFOworCW1fYk1vdXNlRG93biA9IHRydWU7CiAKIAlyZXR1cm4gQ1BXTF9CdXR0b246Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwogfQogCi1GWF9CT09MCUNQV0xfTm90ZV9DbG9zZUJveDo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wJQ1BXTF9Ob3RlX0Nsb3NlQm94OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewotCW1fYk1vdXNlRG93biA9IEZBTFNFOworCW1fYk1vdXNlRG93biA9IGZhbHNlOwogCiAJU2V0Qm9yZGVyU3R5bGUoUEJTX0JFVkVMRUQpOwogCUludmFsaWRhdGVSZWN0KE5VTEwpOwpAQCAtNDI5LDE4ICs0MjksMTggQEAKIAllY3AucFBhcmVudFduZCA9IHRoaXM7CiAJZWNwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRCB8IFBFU19NVUxUSUxJTkUgfCBQRVNfQVVUT1JFVFVSTiB8IFBFU19URVhUT1ZFUkZMT1cgfCBQRVNfVU5ETyB8IFBFU19TUEVMTENIRUNLOwogCi0JbV9wRWRpdC0+RW5hYmxlTm90aWZ5KEZBTFNFKTsKKwltX3BFZGl0LT5FbmFibGVOb3RpZnkoZmFsc2UpOwogCW1fcEVkaXQtPkNyZWF0ZShlY3ApOwotCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShUUlVFKTsKKwltX3BFZGl0LT5FbmFibGVOb3RpZnkodHJ1ZSk7CiB9CiAKIHZvaWQgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGV4dCkKIHsKIAlpZiAobV9wRWRpdCkKIAl7Ci0JCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShGQUxTRSk7CisJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShmYWxzZSk7CiAJCW1fcEVkaXQtPlNldFRleHQoc1RleHQuY19zdHIoKSk7Ci0JCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShUUlVFKTsKKwkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KHRydWUpOwogCQlPbk5vdGlmeShtX3BFZGl0LCBQTk1fTk9URUVESVRDSEFOR0VELCAwLCAwKTsKIAl9CiB9CkBAIC01NTEsOSArNTUxLDkgQEAKIAkJCWludDMyX3QgbkluZGV4ID0gR2V0SXRlbUluZGV4KHBXbmQpOwogCQkJaWYgKG5JbmRleCA8IDApIG5JbmRleCA9IDA7CiAKLQkJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShGQUxTRSk7CisJCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoZmFsc2UpOwogCQkJUmVzZXRDb250ZW50KG5JbmRleCk7Ci0JCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoVFJVRSk7CisJCQltX3BFZGl0LT5FbmFibGVOb3RpZnkodHJ1ZSk7CiAKIAkJCWZvciAoaW50MzJfdCBpPW5JbmRleCsxLCBzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKIAkJCXsKQEAgLTU3Niw3ICs1NzYsNyBAQAogCQlpZiAoUFdMX0NBUkVUX0lORk8gKiBwSW5mbyA9IChQV0xfQ0FSRVRfSU5GTyopd1BhcmFtKQogCQl7CiAJCQlQV0xfQ0FSRVRfSU5GTyBuZXdJbmZvID0gKnBJbmZvOwotCQkJbmV3SW5mby5iVmlzaWJsZSA9IFRSVUU7CisJCQluZXdJbmZvLmJWaXNpYmxlID0gdHJ1ZTsKIAkJCW5ld0luZm8ucHRIZWFkID0gQ2hpbGRUb1BhcmVudChwSW5mby0+cHRIZWFkKTsKIAkJCW5ld0luZm8ucHRGb290ID0gQ2hpbGRUb1BhcmVudChwSW5mby0+cHRGb290KTsKIApAQCAtNTg4LDkgKzU4OCw5IEBACiAJCXJldHVybjsKIAljYXNlIFBOTV9OT1RFUkVTRVQ6CiAJCXsKLQkJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShGQUxTRSk7CisJCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoZmFsc2UpOwogCQkJUmVzZXRDb250ZW50KDApOwotCQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KFRSVUUpOworCQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KHRydWUpOwogCiAJCQlmb3IgKGludDMyX3QgaT0xLCBzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKIAkJCXsKQEAgLTU5OCw5ICs1OTgsOSBAQAogCQkJCQlwQ2hpbGQtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFUkVTRVQsIDAsIDApOwogCQkJfQogCi0JCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoRkFMU0UpOworCQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KGZhbHNlKTsKIAkJCVJlc2V0Q29udGVudCgwKTsKLQkJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShUUlVFKTsKKwkJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeSh0cnVlKTsKIAkJfQogCQlyZXR1cm47CiAJfQpAQCAtNjA4LDE5ICs2MDgsMTkgQEAKIAlDUFdMX1duZDo6T25Ob3RpZnkocFduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CiB9CiAKLUZYX0JPT0wJQ1BXTF9Ob3RlX0NvbnRlbnRzOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sCUNQV0xfTm90ZV9Db250ZW50czo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewotCWlmIChDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZykpIHJldHVybiBUUlVFOworCWlmIChDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZykpIHJldHVybiB0cnVlOwogCiAJaWYgKCFtX3BFZGl0LT5Jc0ZvY3VzZWQoKSkKIAl7CiAJCW1fcEVkaXQtPlNldEZvY3VzKCk7CiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpTZXRFZGl0Rm9jdXMoRlhfQk9PTCBiTGFzdCkKK3ZvaWQgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpTZXRFZGl0Rm9jdXMoYm9vbCBiTGFzdCkKIHsKIAlpZiAoIW1fcEVkaXQtPklzRm9jdXNlZCgpKQogCXsKQEAgLTYzNCw3ICs2MzQsNyBAQAogCXJldHVybiBtX3BFZGl0OwogfQogCi12b2lkIENQV0xfTm90ZV9Db250ZW50czo6RW5hYmxlTW9kaWZ5KEZYX0JPT0wgYkVuYWJsZWQpCit2b2lkIENQV0xfTm90ZV9Db250ZW50czo6RW5hYmxlTW9kaWZ5KGJvb2wgYkVuYWJsZWQpCiB7CiAJaWYgKCFiRW5hYmxlZCkKIAkJbV9wRWRpdC0+QWRkRmxhZyhQV1NfUkVBRE9OTFkpOwpAQCAtNjU0LDcgKzY1NCw3IEBACiAJfQogfQogCi12b2lkIENQV0xfTm90ZV9Db250ZW50czo6RW5hYmxlUmVhZChGWF9CT09MIGJFbmFibGVkKQordm9pZCBDUFdMX05vdGVfQ29udGVudHM6OkVuYWJsZVJlYWQoYm9vbCBiRW5hYmxlZCkKIHsKIAlpZiAoIWJFbmFibGVkKQogCQltX3BFZGl0LT5BZGRGbGFnKFBFU19OT1JFQUQpOwpAQCAtNjgzLDggKzY4Myw4IEBACiAJbV9wUHJpdmF0ZURhdGEoTlVMTCksCiAJbV9zQXV0aG9yKEwiIiksCiAJbV9mT2xkSXRlbUhlaWdodCgwLjBmKSwKLQltX2JTaXplQ2hhbmdlZChGQUxTRSksCi0JbV9iQWxsb3dNb2RpZnkoVFJVRSkKKwltX2JTaXplQ2hhbmdlZChmYWxzZSksCisJbV9iQWxsb3dNb2RpZnkodHJ1ZSkKIHsKIH0KIApAQCAtNzQ4LDcgKzc0OCw3IEBACiAJCXJjU3ViamVjdC5yaWdodCA9IFBXTF9NSU4ocmNTdWJqZWN0LmxlZnQgKyBtX3BTdWJqZWN0LT5HZXRDb250ZW50UmVjdCgpLldpZHRoKCkgKyAxLjBmLCByY0NsaWVudC5yaWdodCk7CiAJCXJjU3ViamVjdC5ib3R0b20gPSByY1N1YmplY3QudG9wIC0gbV9wU3ViamVjdC0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAkJcmNTdWJqZWN0Lk5vcm1hbGl6ZSgpOwotCQltX3BTdWJqZWN0LT5Nb3ZlKHJjU3ViamVjdCwgVFJVRSwgRkFMU0UpOworCQltX3BTdWJqZWN0LT5Nb3ZlKHJjU3ViamVjdCwgdHJ1ZSwgZmFsc2UpOwogCQltX3BTdWJqZWN0LT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNTdWJqZWN0KSk7CiAKIAkJQ1BERl9SZWN0IHJjRGF0ZSA9IHJjQ2xpZW50OwpAQCAtNzU2LDcgKzc1Niw3IEBACiAJCXJjRGF0ZS5sZWZ0ID0gUFdMX01BWChyY0RhdGUucmlnaHQgLSBtX3BEYXRlVGltZS0+R2V0Q29udGVudFJlY3QoKS5XaWR0aCgpIC0gMS4wZiwgcmNTdWJqZWN0LnJpZ2h0KTsKIAkJcmNEYXRlLmJvdHRvbSA9IHJjRGF0ZS50b3AgLSBtX3BEYXRlVGltZS0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAkJcmNEYXRlLk5vcm1hbGl6ZSgpOwotCQltX3BEYXRlVGltZS0+TW92ZShyY0RhdGUsIFRSVUUsIEZBTFNFKTsKKwkJbV9wRGF0ZVRpbWUtPk1vdmUocmNEYXRlLCB0cnVlLCBmYWxzZSk7CiAJCW1fcERhdGVUaW1lLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNEYXRlKSk7CiAKIAkJQ1BERl9SZWN0IHJjQ29udGVudHMgPSByY0NsaWVudDsKQEAgLTc2NSw3ICs3NjUsNyBAQAogCQlyY0NvbnRlbnRzLnRvcCA9IHJjRGF0ZS5ib3R0b20gLSBQT1BVUF9JVEVNX0hFQURfQk9UVE9NOwogCQlyY0NvbnRlbnRzLmJvdHRvbSArPSBQT1BVUF9JVEVNX0JPVFRPTVdJRFRIOwogCQlyY0NvbnRlbnRzLk5vcm1hbGl6ZSgpOwotCQltX3BDb250ZW50cy0+TW92ZShyY0NvbnRlbnRzLCBUUlVFLCBGQUxTRSk7CisJCW1fcENvbnRlbnRzLT5Nb3ZlKHJjQ29udGVudHMsIHRydWUsIGZhbHNlKTsKIAkJbV9wQ29udGVudHMtPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY0NvbnRlbnRzKSk7CiAJfQogCkBAIC0xMDM4LDcgKzEwMzgsNyBAQAogCQlpZiAoIW1fYlNpemVDaGFuZ2VkKQogCQkJcmV0dXJuIG1fZk9sZEl0ZW1IZWlnaHQ7CiAKLQkJbV9iU2l6ZUNoYW5nZWQgPSBGQUxTRTsKKwkJbV9iU2l6ZUNoYW5nZWQgPSBmYWxzZTsKIAogCQlBU1NFUlQobV9wU3ViamVjdCAhPSBOVUxMKTsKIAkJQVNTRVJUKG1fcERhdGVUaW1lICE9IE5VTEwpOwpAQCAtMTA2NiwyNiArMTA2NiwyNiBAQAogCXJldHVybiBQT1BVUF9JVEVNX1NJREVNQVJHSU47CiB9CiAKLUZYX0JPT0wJQ1BXTF9Ob3RlSXRlbTo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sCUNQV0xfTm90ZUl0ZW06Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewogCWlmICghbV9wQ29udGVudHMtPlduZEhpdFRlc3QobV9wQ29udGVudHMtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkKIAl7Ci0JCVNldE5vdGVGb2N1cyhGQUxTRSk7CisJCVNldE5vdGVGb2N1cyhmYWxzZSk7CiAJfQogCiAJQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wJQ1BXTF9Ob3RlSXRlbTo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wJQ1BXTF9Ob3RlSXRlbTo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlpZiAoIW1fcENvbnRlbnRzLT5XbmRIaXRUZXN0KG1fcENvbnRlbnRzLT5QYXJlbnRUb0NoaWxkKHBvaW50KSkpCiAJewotCQlTZXROb3RlRm9jdXMoRkFMU0UpOworCQlTZXROb3RlRm9jdXMoZmFsc2UpOwogCQlQb3B1cE5vdGVJdGVtTWVudShwb2ludCk7CiAKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCX0KIAogCXJldHVybiBDUFdMX1duZDo6T25SQnV0dG9uVXAocG9pbnQsbkZsYWcpOwpAQCAtMTA5Niw3ICsxMDk2LDcgQEAKIAlzd2l0Y2ggKG1zZykKIAl7CiAJY2FzZSBQTk1fTk9URUVESVRDSEFOR0VEOgotCQltX2JTaXplQ2hhbmdlZCA9IFRSVUU7CisJCW1fYlNpemVDaGFuZ2VkID0gdHJ1ZTsKIAogCQlpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKIAkJewpAQCAtMTEwNyw3ICsxMTA3LDcgQEAKIAkJaWYgKFBXTF9DQVJFVF9JTkZPICogcEluZm8gPSAoUFdMX0NBUkVUX0lORk8qKXdQYXJhbSkKIAkJewogCQkJUFdMX0NBUkVUX0lORk8gbmV3SW5mbyA9ICpwSW5mbzsKLQkJCW5ld0luZm8uYlZpc2libGUgPSBUUlVFOworCQkJbmV3SW5mby5iVmlzaWJsZSA9IHRydWU7CiAJCQluZXdJbmZvLnB0SGVhZCA9IENoaWxkVG9QYXJlbnQocEluZm8tPnB0SGVhZCk7CiAJCQluZXdJbmZvLnB0Rm9vdCA9IENoaWxkVG9QYXJlbnQocEluZm8tPnB0Rm9vdCk7CiAKQEAgLTExMTgsNyArMTExOCw3IEBACiAJCX0KIAkJcmV0dXJuOwogCWNhc2UgUE5NX05PVEVSRVNFVDoKLQkJbV9iU2l6ZUNoYW5nZWQgPSBUUlVFOworCQltX2JTaXplQ2hhbmdlZCA9IHRydWU7CiAJCW1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URVJFU0VULCAwLCAwKTsKIAogCQlyZXR1cm47CkBAIC0xMTc4LDE4ICsxMTc4LDE4IEBACiAJfQogfQogCi12b2lkIENQV0xfTm90ZUl0ZW06OlNldE5vdGVGb2N1cyhGWF9CT09MIGJMYXN0KQordm9pZCBDUFdMX05vdGVJdGVtOjpTZXROb3RlRm9jdXMoYm9vbCBiTGFzdCkKIHsKIAltX3BDb250ZW50cy0+U2V0RWRpdEZvY3VzKGJMYXN0KTsKIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpFbmFibGVNb2RpZnkoRlhfQk9PTCBiRW5hYmxlZCkKK3ZvaWQgQ1BXTF9Ob3RlSXRlbTo6RW5hYmxlTW9kaWZ5KGJvb2wgYkVuYWJsZWQpCiB7CiAJbV9wQ29udGVudHMtPkVuYWJsZU1vZGlmeShiRW5hYmxlZCk7CiAJbV9iQWxsb3dNb2RpZnkgPSBiRW5hYmxlZDsKIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpCit2b2lkIENQV0xfTm90ZUl0ZW06OkVuYWJsZVJlYWQoYm9vbCBiRW5hYmxlZCkKIHsKIAltX3BDb250ZW50cy0+RW5hYmxlUmVhZChiRW5hYmxlZCk7CiB9CkBAIC0xMjA1LDkgKzEyMDUsOSBAQAogCW1fcENvbnRlbnRzQmFyKE5VTEwpLAogCW1fcE9wdGlvbnMoTlVMTCksCiAJbV9wTm90ZU5vdGlmeShwTm90ZU5vdGlmeSksCi0JbV9iUmVzaXppbmcoRkFMU0UpLAorCW1fYlJlc2l6aW5nKGZhbHNlKSwKIAltX3JjQ2FwdGlvbigwLDAsMCwwKSwKLQltX2JFbmFsYmxlTm90aWZ5KFRSVUUpLAorCW1fYkVuYWxibGVOb3RpZnkodHJ1ZSksCiAJbV9wUG9wdXBOb3RlKHBQb3B1cE5vdGUpCiB7CiB9CkBAIC0xMjIxLDcgKzEyMjEsNyBAQAogCXJldHVybiBDcmVhdGVOb3RlSXRlbSgpOwogfQogCi12b2lkIENQV0xfTm90ZTo6RW5hYmxlTm90aWZ5KEZYX0JPT0wgYkVuYWJsZWQpCit2b2lkIENQV0xfTm90ZTo6RW5hYmxlTm90aWZ5KGJvb2wgYkVuYWJsZWQpCiB7CiAJbV9iRW5hbGJsZU5vdGlmeSA9IGJFbmFibGVkOwogfQpAQCAtMTI0MywxOSArMTI0MywxOSBAQAogCX0KIH0KIAotRlhfQk9PTCBDUFdMX05vdGU6OlJlc2V0U2Nyb2xsQmFyKCkKK2Jvb2wgQ1BXTF9Ob3RlOjpSZXNldFNjcm9sbEJhcigpCiB7Ci0JRlhfQk9PTCBiU2Nyb2xsQ2hhbmdlZCA9IEZBTFNFOworCWJvb2wgYlNjcm9sbENoYW5nZWQgPSBmYWxzZTsKIAogCWlmIChTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCkpCiAJewogCQlpZiAoIW1fcENvbnRlbnRzQmFyLT5Jc1Zpc2libGUoKSkKIAkJewotCQkJbV9wQ29udGVudHNCYXItPlNldFZpc2libGUoVFJVRSk7CisJCQltX3BDb250ZW50c0Jhci0+U2V0VmlzaWJsZSh0cnVlKTsKIAkJCWlmIChtX3BDb250ZW50c0Jhci0+SXNWaXNpYmxlKCkpCiAJCQl7CiAJCQkJbV9wQ29udGVudHNCYXItPkludmFsaWRhdGVSZWN0KE5VTEwpOwotCQkJCWJTY3JvbGxDaGFuZ2VkID0gVFJVRTsKKwkJCQliU2Nyb2xsQ2hhbmdlZCA9IHRydWU7CiAJCQl9CiAJCX0KIAl9CkBAIC0xMjYzLDEwICsxMjYzLDEwIEBACiAJewogCQlpZiAobV9wQ29udGVudHNCYXItPklzVmlzaWJsZSgpKQogCQl7Ci0JCQltX3BDb250ZW50c0Jhci0+U2V0VmlzaWJsZShGQUxTRSk7CisJCQltX3BDb250ZW50c0Jhci0+U2V0VmlzaWJsZShmYWxzZSk7CiAJCQltX3BDb250ZW50c0Jhci0+SW52YWxpZGF0ZVJlY3QoTlVMTCk7CiAKLQkJCWJTY3JvbGxDaGFuZ2VkID0gVFJVRTsKKwkJCWJTY3JvbGxDaGFuZ2VkID0gdHJ1ZTsKIAkJfQogCX0KIApAQCAtMTI3Nyw3ICsxMjc3LDcgQEAKIAkJcmNDb250ZW50cy5yaWdodCA9IHJjTm90ZS5yaWdodCAtIDMuMGY7CiAJCWlmIChtX3BDb250ZW50c0Jhci0+SXNWaXNpYmxlKCkpCiAJCQlyY0NvbnRlbnRzLnJpZ2h0IC09IFBXTF9TQ1JPTExCQVJfV0lEVEg7Ci0JCW1fcENvbnRlbnRzLT5Nb3ZlKHJjQ29udGVudHMsIFRSVUUsIFRSVUUpOworCQltX3BDb250ZW50cy0+TW92ZShyY0NvbnRlbnRzLCB0cnVlLCB0cnVlKTsKIAkJbV9wQ29udGVudHMtPlNldFNjcm9sbFBvcyhDUERGX1BvaW50KDAuMGYsMC4wZikpOwogCQltX3BDb250ZW50cy0+SW52YWxpZGF0ZVJlY3QoTlVMTCk7CiAJfQpAQCAtMTI4NSw3ICsxMjg1LDcgQEAKIAlyZXR1cm4gYlNjcm9sbENoYW5nZWQ7CiB9CiAKLUZYX0JPT0wgQ1BXTF9Ob3RlOjpTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCkKK2Jvb2wgQ1BXTF9Ob3RlOjpTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCkKIHsKIAlDUERGX1JlY3QgcmNDb250ZW50c0ZhY3QgPSBtX3BDb250ZW50cy0+R2V0U2Nyb2xsQXJlYSgpOwogCUNQREZfUmVjdCByY0NvbnRlbnRzQ2xpZW50ID0gbV9wQ29udGVudHMtPkdldENsaWVudFJlY3QoKTsKQEAgLTEzMDUsNyArMTMwNSw3IEBACiB7CiAJaWYgKG1fYlJlc2l6aW5nKSByZXR1cm47CiAKLQltX2JSZXNpemluZyA9IFRSVUU7CisJbV9iUmVzaXppbmcgPSB0cnVlOwogCiAJaWYgKElzVmFsaWQoKSkKIAl7CkBAIC0xMzI3LDcgKzEzMjcsNyBAQAogCQlyY0ljb24ucmlnaHQgPSByY0ljb24ubGVmdCArIDE0LjBmOwogCQlyY0ljb24uYm90dG9tID0gcmNJY29uLnRvcCAtIDE0LjBmOwogCQlyY0ljb24uTm9ybWFsaXplKCk7Ci0JCW1fcEljb24tPk1vdmUocmNJY29uLCBUUlVFLCBGQUxTRSk7CisJCW1fcEljb24tPk1vdmUocmNJY29uLCB0cnVlLCBmYWxzZSk7CiAJCW1fcEljb24tPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY0ljb24pKTsKIAogCQlDUERGX1JlY3QgcmNDbG9zZUJveCA9IHJjQ2xpZW50OwpAQCAtMTMzNiw3ICsxMzM2LDcgQEAKIAkJcmNDbG9zZUJveC5sZWZ0ID0gcmNDbG9zZUJveC5yaWdodCAtIDE0LjBmOwogCQlyY0Nsb3NlQm94LmJvdHRvbSA9IHJjQ2xvc2VCb3gudG9wIC0gMTQuMGY7CiAJCXJjQ2xvc2VCb3guTm9ybWFsaXplKCk7Ci0JCW1fcENsb3NlQm94LT5Nb3ZlKHJjQ2xvc2VCb3gsIFRSVUUsIEZBTFNFKTsKKwkJbV9wQ2xvc2VCb3gtPk1vdmUocmNDbG9zZUJveCwgdHJ1ZSwgZmFsc2UpOwogCQltX3BDbG9zZUJveC0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjQ2xvc2VCb3gpKTsKIAogCQlDUERGX1JlY3QgcmNEYXRlID0gcmNDbGllbnQ7CkBAIC0xMzQ1LDcgKzEzNDUsNyBAQAogCQlyY0RhdGUudG9wID0gcmNDbGllbnQudG9wIC0gMi4wZjsKIAkJcmNEYXRlLmJvdHRvbSA9IHJjRGF0ZS50b3AgLSBtX3BEYXRlVGltZS0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAkJcmNEYXRlLk5vcm1hbGl6ZSgpOwotCQltX3BEYXRlVGltZS0+TW92ZShyY0RhdGUsIFRSVUUsIEZBTFNFKTsKKwkJbV9wRGF0ZVRpbWUtPk1vdmUocmNEYXRlLCB0cnVlLCBmYWxzZSk7CiAJCW1fcERhdGVUaW1lLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNEYXRlKSk7CiAKIAkJQ1BERl9SZWN0IHJjU3ViamVjdCA9IHJjQ2xpZW50OwpAQCAtMTM1NCw3ICsxMzU0LDcgQEAKIAkJcmNTdWJqZWN0LnJpZ2h0ID0gUFdMX01JTihyY1N1YmplY3QubGVmdCArIG1fcFN1YmplY3QtPkdldENvbnRlbnRSZWN0KCkuV2lkdGgoKSArIDEuMGYsIHJjRGF0ZS5sZWZ0IC0gMS4wZik7CiAJCXJjU3ViamVjdC5ib3R0b20gPSByY1N1YmplY3QudG9wIC0gbV9wU3ViamVjdC0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAkJcmNTdWJqZWN0Lk5vcm1hbGl6ZSgpOwotCQltX3BTdWJqZWN0LT5Nb3ZlKHJjU3ViamVjdCwgVFJVRSwgRkFMU0UpOworCQltX3BTdWJqZWN0LT5Nb3ZlKHJjU3ViamVjdCwgdHJ1ZSwgZmFsc2UpOwogCQltX3BTdWJqZWN0LT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNTdWJqZWN0KSk7CiAKIAkJQ1BERl9SZWN0IHJjT3B0aW9ucyA9IHJjQ2xpZW50OwpAQCAtMTM2Miw3ICsxMzYyLDcgQEAKIAkJcmNPcHRpb25zLnRvcCA9IHJjU3ViamVjdC5ib3R0b20gLSA0LjBmOwogCQlyY09wdGlvbnMuYm90dG9tID0gcmNPcHRpb25zLnRvcCAtIG1fcE9wdGlvbnMtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CiAJCXJjT3B0aW9ucy5Ob3JtYWxpemUoKTsKLQkJbV9wT3B0aW9ucy0+TW92ZShyY09wdGlvbnMsIFRSVUUsIEZBTFNFKTsKKwkJbV9wT3B0aW9ucy0+TW92ZShyY09wdGlvbnMsIHRydWUsIGZhbHNlKTsKIAkJbV9wT3B0aW9ucy0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjT3B0aW9ucykpOwogCiAJCUNQREZfUmVjdCByY0F1dGhvciA9IHJjQ2xpZW50OwpAQCAtMTM3MSwyMSArMTM3MSwyMSBAQAogCQlyY0F1dGhvci5yaWdodCA9IFBXTF9NSU4ocmNTdWJqZWN0LmxlZnQgKyBtX3BBdXRob3ItPkdldENvbnRlbnRSZWN0KCkuV2lkdGgoKSArIDEuMGYsIHJjT3B0aW9ucy5sZWZ0IC0gMS4wZik7CiAJCXJjQXV0aG9yLmJvdHRvbSA9IHJjQXV0aG9yLnRvcCAtIG1fcEF1dGhvci0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAkJcmNBdXRob3IuTm9ybWFsaXplKCk7Ci0JCW1fcEF1dGhvci0+TW92ZShyY0F1dGhvciwgVFJVRSwgRkFMU0UpOworCQltX3BBdXRob3ItPk1vdmUocmNBdXRob3IsIHRydWUsIGZhbHNlKTsKIAkJbV9wQXV0aG9yLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNBdXRob3IpKTsKIAogCQlDUERGX1JlY3QgcmNMQkJveCA9IHJjQ2xpZW50OwogCQlyY0xCQm94LnRvcCA9IHJjTEJCb3guYm90dG9tICsgNy4wZjsKIAkJcmNMQkJveC5yaWdodCA9IHJjTEJCb3gubGVmdCArIDcuMGY7CiAJCXJjTEJCb3guTm9ybWFsaXplKCk7Ci0JCW1fcExCQm94LT5Nb3ZlKHJjTEJCb3gsIFRSVUUsIEZBTFNFKTsKKwkJbV9wTEJCb3gtPk1vdmUocmNMQkJveCwgdHJ1ZSwgZmFsc2UpOwogCQltX3BMQkJveC0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjTEJCb3gpKTsKIAogCQlDUERGX1JlY3QgcmNSQkJveCA9IHJjQ2xpZW50OwogCQlyY1JCQm94LnRvcCA9IHJjUkJCb3guYm90dG9tICsgNy4wZjsKIAkJcmNSQkJveC5sZWZ0ID0gcmNSQkJveC5yaWdodCAtIDcuMGY7CiAJCXJjUkJCb3guTm9ybWFsaXplKCk7Ci0JCW1fcFJCQm94LT5Nb3ZlKHJjUkJCb3gsIFRSVUUsIEZBTFNFKTsKKwkJbV9wUkJCb3gtPk1vdmUocmNSQkJveCwgdHJ1ZSwgZmFsc2UpOwogCQltX3BSQkJveC0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjUkJCb3gpKTsKIAogCQlDUERGX1JlY3QgcmNDb250ZW50cyA9IHJjQ2xpZW50OwpAQCAtMTM5NiwyMCArMTM5NiwyMCBAQAogCQkJcmNDb250ZW50cy5yaWdodCAtPSBQV0xfU0NST0xMQkFSX1dJRFRIOwogCQlyY0NvbnRlbnRzLmJvdHRvbSArPSAxNC4wZjsKIAkJcmNDb250ZW50cy5Ob3JtYWxpemUoKTsKLQkJbV9wQ29udGVudHMtPk1vdmUocmNDb250ZW50cywgRkFMU0UsIEZBTFNFKTsKKwkJbV9wQ29udGVudHMtPk1vdmUocmNDb250ZW50cywgZmFsc2UsIGZhbHNlKTsKIAkJbV9wQ29udGVudHMtPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY0NvbnRlbnRzKSk7CiAKIAkJQ1BERl9SZWN0IHJjQ29udGVudHNCYXIgPSByY0NvbnRlbnRzOwogCQlyY0NvbnRlbnRzQmFyLnJpZ2h0ID0gcmNDbGllbnQucmlnaHQgLSAzLjBmOwogCQlyY0NvbnRlbnRzQmFyLmxlZnQgPSByY0NvbnRlbnRzQmFyLnJpZ2h0IC0gUFdMX1NDUk9MTEJBUl9XSURUSDsKIAkJcmNDb250ZW50c0Jhci5Ob3JtYWxpemUoKTsKLQkJbV9wQ29udGVudHNCYXItPk1vdmUocmNDb250ZW50c0JhciwgVFJVRSwgRkFMU0UpOworCQltX3BDb250ZW50c0Jhci0+TW92ZShyY0NvbnRlbnRzQmFyLCB0cnVlLCBmYWxzZSk7CiAKIAkJbV9yY0NhcHRpb24gPSByY0NsaWVudDsKIAkJbV9yY0NhcHRpb24uYm90dG9tID0gcmNDb250ZW50cy50b3A7CiAJfQogCi0JbV9iUmVzaXppbmcgPSBGQUxTRTsKKwltX2JSZXNpemluZyA9IGZhbHNlOwogfQogCiAvLzAtbm9ybWFsIC8gMS1jYXB0aW9uIC8gMi1sZWZ0Ym90dG9tIGNvcm5lciAvIDMtcmlnaHRib3R0b20gY29ybmVyIC8gNC1jbG9zZSAvIDUtb3B0aW9ucwpAQCAtMTUwNyw3ICsxNTA3LDcgQEAKIAlzY3Auc0JhY2tncm91bmRDb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgMjQwLzI1NS4wZiwgMjQwLzI1NS4wZiwgMjQwLzI1NS4wZik7CiAJc2NwLmR3RmxhZ3MgPSBQV1NfQ0hJTEQgfCBQV1NfVklTSUJMRSB8IFBXU19CQUNLR1JPVU5EOwogCW1fcENvbnRlbnRzQmFyLT5DcmVhdGUoc2NwKTsKLQltX3BDb250ZW50c0Jhci0+U2V0Tm90aWZ5Rm9yZXZlcihUUlVFKTsKKwltX3BDb250ZW50c0Jhci0+U2V0Tm90aWZ5Rm9yZXZlcih0cnVlKTsKIH0KIAogdm9pZCBDUFdMX05vdGU6OlNldFN1YmplY3ROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSkKQEAgLTE1MzgsNyArMTUzOCw3IEBACiAJcmV0dXJuIEwiIjsKIH0KIAotRlhfQk9PTCBDUFdMX05vdGU6Ok9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfTm90ZTo6T25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUERGX1BvaW50IHB0U2Nyb2xsID0gbV9wQ29udGVudHMtPkdldFNjcm9sbFBvcygpOwogCUNQREZfUmVjdCByY1Njcm9sbCA9IG1fcENvbnRlbnRzLT5HZXRTY3JvbGxBcmVhKCk7CkBAIC0xNTY2LDExICsxNTY2LDExIEBACiAJCQltX3BDb250ZW50cy0+T25Ob3RpZnkodGhpcywgUE5NX1NDUk9MTFdJTkRPVywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmcHROZXcueSk7CiAJCQltX3BDb250ZW50c0Jhci0+T25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTFBPUywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmcHROZXcueSk7CiAKLQkJCXJldHVybiBUUlVFOworCQkJcmV0dXJuIHRydWU7CiAJCX0KIAl9CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENQV0xfTm90ZTo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtLCBpbnRwdHJfdCBsUGFyYW0pCkBAIC0xNTkxLDcgKzE1OTEsNyBAQAogCiAJCQlpZiAoRlhTWVNfbWVtY21wKCZtX09sZFNjcm9sbEluZm8sICZzSW5mbywgc2l6ZW9mKFBXTF9TQ1JPTExfSU5GTykpICE9IDApCiAJCQl7Ci0JCQkJRlhfQk9PTCBiU2Nyb2xsQ2hhbmdlZCA9IEZBTFNFOworCQkJCWJvb2wgYlNjcm9sbENoYW5nZWQgPSBmYWxzZTsKIAogCQkJCWlmIChsUGFyYW0gPCAzKSAvL7fA1rnLwNGtu7cgbWFudGlzOjE1NzU5CiAJCQkJewpAQCAtMTcwNCw3ICsxNzA0LDcgQEAKIAkJbV9wUkJCb3gtPlNldFRleHRDb2xvcihzVGV4dENvbG9yKTsKIH0KIAotRlhfQk9PTAlDUFdMX05vdGU6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbAlDUFdMX05vdGU6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewogCWlmIChtX3BPcHRpb25zLT5XbmRIaXRUZXN0KG1fcE9wdGlvbnMtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkKIAl7CkBAIC0xNzE3LDE0ICsxNzE3LDE0IEBACiAJCQlLaWxsRm9jdXMoKTsKIAkJCXBOb3RpZnktPk9uUG9wdXBNZW51KHgsIHkpOwogCi0JCQlyZXR1cm4gVFJVRTsKKwkJCXJldHVybiB0cnVlOwogCQl9CiAJfQogCiAJcmV0dXJuIENQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LG5GbGFnKTsKIH0KIAotRlhfQk9PTAlDUFdMX05vdGU6Ok9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sCUNQV0xfTm90ZTo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlyZXR1cm4gQ1BXTF9XbmQ6Ok9uUkJ1dHRvblVwKHBvaW50LG5GbGFnKTsKIH0KQEAgLTE3NDgsMTIgKzE3NDgsMTIgQEAKIAkJbV9wSWNvbi0+U2V0SWNvblR5cGUoblR5cGUpOwogfQogCi12b2lkIENQV0xfTm90ZTo6RW5hYmxlTW9kaWZ5KEZYX0JPT0wgYkVuYWJsZWQpCit2b2lkIENQV0xfTm90ZTo6RW5hYmxlTW9kaWZ5KGJvb2wgYkVuYWJsZWQpCiB7CiAJbV9wQ29udGVudHMtPkVuYWJsZU1vZGlmeShiRW5hYmxlZCk7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlOjpFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpCit2b2lkIENQV0xfTm90ZTo6RW5hYmxlUmVhZChib29sIGJFbmFibGVkKQogewogCW1fcENvbnRlbnRzLT5FbmFibGVSZWFkKGJFbmFibGVkKTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmNwcAppbmRleCA2ZDYxNzA1Li40Mjg3YmMyIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuY3BwCkBAIC00Nyw3ICs0Nyw3IEBACiAJfQogfQogCi1GWF9CT09MCVBXTF9GTE9BVFJBTkdFOjpJbihGWF9GTE9BVCB4KSBjb25zdAorYm9vbAlQV0xfRkxPQVRSQU5HRTo6SW4oRlhfRkxPQVQgeCkgY29uc3QKIHsKIAlyZXR1cm4gKElzRmxvYXRCaWdnZXIoeCxmTWluKSB8fCBJc0Zsb2F0RXF1YWwoeCwgZk1pbikpICYmCiAJCShJc0Zsb2F0U21hbGxlcih4LCBmTWF4KSB8fCBJc0Zsb2F0RXF1YWwoeCwgZk1heCkpOwpAQCAtOTksMTQgKzk5LDE0IEBACiAJZkJpZ1N0ZXAgPSBzdGVwOwogfQogCi1GWF9CT09MIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlNldFBvcyhGWF9GTE9BVCBwb3MpCitib29sIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlNldFBvcyhGWF9GTE9BVCBwb3MpCiB7CiAJaWYgKFNjcm9sbFJhbmdlLkluKHBvcykpCiAJewogCQlmU2Nyb2xsUG9zID0gcG9zOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6QWRkU21hbGwoKQpAQCAtMTQwLDcgKzE0MCw3IEBACiAJbV9lU2Nyb2xsQmFyVHlwZSA9IGVTY3JvbGxCYXJUeXBlOwogCW1fZVNCQnV0dG9uVHlwZSA9IGVCdXR0b25UeXBlOwogCi0JbV9iTW91c2VEb3duID0gRkFMU0U7CisJbV9iTW91c2VEb3duID0gZmFsc2U7CiB9CiAKIENQV0xfU0JCdXR0b246On5DUFdMX1NCQnV0dG9uKCkKQEAgLTM1OSw3ICszNTksNyBAQAogCQkJCXJjRHJhdyA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3RXbmQsMS4wZik7CiAKIAkJCQlpZiAoSXNFbmFibGVkKCkpCi0JCQkJCUNQV0xfVXRpbHM6OkRyYXdTaGFkb3cocERldmljZSwgcFVzZXIyRGV2aWNlLCBUUlVFLCBGQUxTRSwgcmNEcmF3LCBuVHJhbnNwYXJhbmN5LCA4MCwgMjIwKTsKKwkJCQkJQ1BXTF9VdGlsczo6RHJhd1NoYWRvdyhwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHRydWUsIGZhbHNlLCByY0RyYXcsIG5UcmFuc3BhcmFuY3ksIDgwLCAyMjApOwogCQkJCWVsc2UKIAkJCQkJQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LCBBcmdiRW5jb2RlKDI1NSwyNTUsMjU1LDI1NSkpOwogCkBAIC00MDIsNyArNDAyLDcgQEAKIAkJCQkvL2RyYXcgYmFja2dyb3VuZAogCQkJCXJjRHJhdyA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3RXbmQsMS4wZik7CiAJCQkJaWYgKElzRW5hYmxlZCgpKQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U2hhZG93KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgVFJVRSwgRkFMU0UsIHJjRHJhdywgblRyYW5zcGFyYW5jeSwgODAsIDIyMCk7CisJCQkJCUNQV0xfVXRpbHM6OkRyYXdTaGFkb3cocERldmljZSwgcFVzZXIyRGV2aWNlLCB0cnVlLCBmYWxzZSwgcmNEcmF3LCBuVHJhbnNwYXJhbmN5LCA4MCwgMjIwKTsKIAkJCQllbHNlCiAJCQkJCUNQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywgQXJnYkVuY29kZSgyNTUsMjU1LDI1NSwyNTUpKTsKIApAQCAtNTY1LDMzICs1NjUsMzMgQEAKIAl9CiB9CiAKLUZYX0JPT0wgQ1BXTF9TQkJ1dHRvbjo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCBDUFdMX1NCQnV0dG9uOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwogCiAJaWYgKENQV0xfV25kICogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQogCQlwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLFBOTV9MQlVUVE9ORE9XTiwwLChpbnRwdHJfdCkmcG9pbnQpOwogCi0JbV9iTW91c2VEb3duID0gVFJVRTsKKwltX2JNb3VzZURvd24gPSB0cnVlOwogCVNldENhcHR1cmUoKTsKIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENQV0xfU0JCdXR0b246Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfU0JCdXR0b246Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LG5GbGFnKTsKIAogCWlmIChDUFdMX1duZCAqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKIAkJcFBhcmVudC0+T25Ob3RpZnkodGhpcyxQTk1fTEJVVFRPTlVQLDAsKGludHB0cl90KSZwb2ludCk7CiAKLQltX2JNb3VzZURvd24gPSBGQUxTRTsKKwltX2JNb3VzZURvd24gPSBmYWxzZTsKIAlSZWxlYXNlQ2FwdHVyZSgpOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ1BXTF9TQkJ1dHRvbjo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9TQkJ1dHRvbjo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUFdMX1duZDo6T25Nb3VzZU1vdmUocG9pbnQsbkZsYWcpOwogCkBAIC02MDMsMTIgKzYwMywxMiBAQAogCQlpZiAobV9iTW91c2VEb3duICYmIChtX2VTQkJ1dHRvblR5cGUgPT0gUFNCVF9NSU4gfHwgbV9lU0JCdXR0b25UeXBlID09IFBTQlRfTUFYKSkKIAkJewogCQkJaWYgKCFwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLFBOTV9MQlVUVE9ORE9XTixuRmxhZ3MsKGludHB0cl90KSZwb2ludCkpCi0JCQkJcmV0dXJuIEZBTFNFOworCQkJCXJldHVybiBmYWxzZTsKIAkJfQogCQkqLwogCX0KIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfU2Nyb2xsQmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTYxOCw5ICs2MTgsOSBAQAogCW1fcE1pbkJ1dHRvbihOVUxMKSwKIAltX3BNYXhCdXR0b24oTlVMTCksCiAJbV9wUG9zQnV0dG9uKE5VTEwpLAotCW1fYk1vdXNlRG93bihGQUxTRSksCi0JbV9iTWluT3JNYXgoRkFMU0UpLAotCW1fYk5vdGlmeUZvcmV2ZXIoVFJVRSkKKwltX2JNb3VzZURvd24oZmFsc2UpLAorCW1fYk1pbk9yTWF4KGZhbHNlKSwKKwltX2JOb3RpZnlGb3JldmVyKHRydWUpCiB7CiB9CiAKQEAgLTY2NSw3ICs2NjUsNyBAQAogCQkJCXJjTWF4QnV0dG9uID0gQ1BERl9SZWN0KHJjQ2xpZW50LnJpZ2h0IC0gZkJXaWR0aCxyY0NsaWVudC5ib3R0b20sCiAJCQkJCXJjQ2xpZW50LnJpZ2h0LHJjQ2xpZW50LnRvcCk7CiAJCQl9Ci0JCQllbHNlIFNldFZpc2libGUoRkFMU0UpOworCQkJZWxzZSBTZXRWaXNpYmxlKGZhbHNlKTsKIAkJfQogCQlicmVhazsKIAljYXNlIFNCVF9WU0NST0xMOgpAQCAtNjg3LDE2ICs2ODcsMTYgQEAKIAkJCQlyY01heEJ1dHRvbiA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0LHJjQ2xpZW50LmJvdHRvbSwKIAkJCQkJcmNDbGllbnQucmlnaHQscmNDbGllbnQuYm90dG9tICsgZkJXaWR0aCk7CiAJCQl9Ci0JCQllbHNlIFNldFZpc2libGUoRkFMU0UpOworCQkJZWxzZSBTZXRWaXNpYmxlKGZhbHNlKTsKIAkJfQogCQlicmVhazsKIAl9CiAKICAgICBpZiAobV9wTWluQnV0dG9uKQotICAgICAgICBtX3BNaW5CdXR0b24tPk1vdmUocmNNaW5CdXR0b24sIFRSVUUsIEZBTFNFKTsKKyAgICAgICAgbV9wTWluQnV0dG9uLT5Nb3ZlKHJjTWluQnV0dG9uLCB0cnVlLCBmYWxzZSk7CiAgICAgaWYgKG1fcE1heEJ1dHRvbikKLSAgICAgICAgbV9wTWF4QnV0dG9uLT5Nb3ZlKHJjTWF4QnV0dG9uLCBUUlVFLCBGQUxTRSk7Ci0gICAgTW92ZVBvc0J1dHRvbihGQUxTRSk7CisgICAgICAgIG1fcE1heEJ1dHRvbi0+TW92ZShyY01heEJ1dHRvbiwgdHJ1ZSwgZmFsc2UpOworICAgIE1vdmVQb3NCdXR0b24oZmFsc2UpOwogfQogCiB2b2lkIENQV0xfU2Nyb2xsQmFyOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKQpAQCAtNzA4LDcgKzcwOCw3IEBACiAJCUNGWF9CeXRlVGV4dEJ1ZiBzQnV0dG9uOwogCiAJCXNCdXR0b24gPDwgInFcbiI7Ci0JCXNCdXR0b24gPDwgIjAgd1xuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCYWNrZ3JvdW5kQ29sb3IoKSxUUlVFKTsKKwkJc0J1dHRvbiA8PCAiMCB3XG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJhY2tncm91bmRDb2xvcigpLHRydWUpOwogCQlzQnV0dG9uIDw8IHJlY3RXbmQubGVmdCA8PCAiICIgPDwgcmVjdFduZC5ib3R0b20gPDwgIiAiCiAJCQkJPDwgcmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCA8PCAiICIgPDwgcmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA8PCAiIHJlIGIgUVxuIjsKIApAQCAtNzM0LDcgKzczNCw3IEBACiAJfQogfQogCi1GWF9CT09MIENQV0xfU2Nyb2xsQmFyOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfU2Nyb2xsQmFyOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwogCkBAIC03NzcsMjIgKzc3NywyMiBAQAogCQlpZiAocmNNaW5BcmVhLkNvbnRhaW5zKHBvaW50LngscG9pbnQueSkpCiAJCXsKIAkJCW1fc0RhdGEuU3ViQmlnKCk7Ci0JCQlNb3ZlUG9zQnV0dG9uKFRSVUUpOworCQkJTW92ZVBvc0J1dHRvbih0cnVlKTsKIAkJCU5vdGlmeVNjcm9sbFdpbmRvdygpOwogCQl9CiAKIAkJaWYgKHJjTWF4QXJlYS5Db250YWlucyhwb2ludC54LHBvaW50LnkpKQogCQl7CiAJCQltX3NEYXRhLkFkZEJpZygpOwotCQkJTW92ZVBvc0J1dHRvbihUUlVFKTsKKwkJCU1vdmVQb3NCdXR0b24odHJ1ZSk7CiAJCQlOb3RpZnlTY3JvbGxXaW5kb3coKTsKIAkJfQogCX0KIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENQV0xfU2Nyb2xsQmFyOjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCBDUFdMX1Njcm9sbEJhcjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsbkZsYWcpOwogCkBAIC04MDYsOSArODA2LDkgQEAKIAl9CiAKIAlFbmRUaW1lcigpOwotCW1fYk1vdXNlRG93biA9IEZBTFNFOworCW1fYk1vdXNlRG93biA9IGZhbHNlOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIGludHB0cl90IHdQYXJhbSwgaW50cHRyX3QgbFBhcmFtKQpAQCAtOTIyLDcgKzkyMiw3IEBACiAJaWYgKCFtX3BQb3NCdXR0b24pCiAJewogCQltX3BQb3NCdXR0b24gPSBuZXcgQ1BXTF9TQkJ1dHRvbihtX3NiVHlwZSxQU0JUX1BPUyk7Ci0JCW1fcFBvc0J1dHRvbi0+U2V0VmlzaWJsZShGQUxTRSk7CisJCW1fcFBvc0J1dHRvbi0+U2V0VmlzaWJsZShmYWxzZSk7CiAJCW1fcFBvc0J1dHRvbi0+Q3JlYXRlKHNjcCk7CiAJfQogfQpAQCAtOTQzLDEyICs5NDMsMTIgQEAKIAogCQlpZiAoSXNGbG9hdFNtYWxsZXIobV9zRGF0YS5TY3JvbGxSYW5nZS5HZXRXaWR0aCgpLCAwLjBmKSkKIAkJewotCQkJbV9wUG9zQnV0dG9uLT5TZXRWaXNpYmxlKEZBTFNFKTsKKwkJCW1fcFBvc0J1dHRvbi0+U2V0VmlzaWJsZShmYWxzZSk7CiAJCX0KIAkJZWxzZQogCQl7Ci0JCQltX3BQb3NCdXR0b24tPlNldFZpc2libGUoVFJVRSk7Ci0JCQlNb3ZlUG9zQnV0dG9uKFRSVUUpOworCQkJbV9wUG9zQnV0dG9uLT5TZXRWaXNpYmxlKHRydWUpOworCQkJTW92ZVBvc0J1dHRvbih0cnVlKTsKIAkJfQogCX0KIH0KQEAgLTk2MCw3ICs5NjAsNyBAQAogCW1fc0RhdGEuU2V0UG9zKGZQb3MpOwogCiAJaWYgKCFJc0Zsb2F0RXF1YWwobV9zRGF0YS5mU2Nyb2xsUG9zLCBmT2xkUG9zKSkKLQkJTW92ZVBvc0J1dHRvbihUUlVFKTsKKwkJTW92ZVBvc0J1dHRvbih0cnVlKTsKIH0KIAogdm9pZCBDUFdMX1Njcm9sbEJhcjo6U2V0U2Nyb2xsU3RlcChGWF9GTE9BVCBmQmlnU3RlcCxGWF9GTE9BVCBmU21hbGxTdGVwKQpAQCAtOTY5LDcgKzk2OSw3IEBACiAJbV9zRGF0YS5TZXRTbWFsbFN0ZXAoZlNtYWxsU3RlcCk7CiB9CiAKLXZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok1vdmVQb3NCdXR0b24oRlhfQk9PTCBiUmVmcmVzaCkKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok1vdmVQb3NCdXR0b24oYm9vbCBiUmVmcmVzaCkKIHsKIAlBU1NFUlQgKG1fcFBvc0J1dHRvbiAhPSBOVUxMKTsKIAlBU1NFUlQgKG1fcE1pbkJ1dHRvbiAhPSBOVUxMKTsKQEAgLTEwMzEsMTcgKzEwMzEsMTcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJbV9wUG9zQnV0dG9uLT5Nb3ZlKHJjUG9zQnV0dG9uLFRSVUUsYlJlZnJlc2gpOworCQltX3BQb3NCdXR0b24tPk1vdmUocmNQb3NCdXR0b24sdHJ1ZSxiUmVmcmVzaCk7CiAJfQogfQogCiB2b2lkIENQV0xfU2Nyb2xsQmFyOjpPbk1pbkJ1dHRvbkxCRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpCiB7CiAJbV9zRGF0YS5TdWJTbWFsbCgpOwotCU1vdmVQb3NCdXR0b24oVFJVRSk7CisJTW92ZVBvc0J1dHRvbih0cnVlKTsKIAlOb3RpZnlTY3JvbGxXaW5kb3coKTsKIAotCW1fYk1pbk9yTWF4ID0gVFJVRTsKKwltX2JNaW5Pck1heCA9IHRydWU7CiAKIAlFbmRUaW1lcigpOwogCUJlZ2luVGltZXIoMTAwKTsKQEAgLTEwNTgsMTAgKzEwNTgsMTAgQEAKIHZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uTWF4QnV0dG9uTEJEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkKIHsKIAltX3NEYXRhLkFkZFNtYWxsKCk7Ci0JTW92ZVBvc0J1dHRvbihUUlVFKTsKKwlNb3ZlUG9zQnV0dG9uKHRydWUpOwogCU5vdGlmeVNjcm9sbFdpbmRvdygpOwogCi0JbV9iTWluT3JNYXggPSBGQUxTRTsKKwltX2JNaW5Pck1heCA9IGZhbHNlOwogCiAJRW5kVGltZXIoKTsKIAlCZWdpblRpbWVyKDEwMCk7CkBAIC0xMDc3LDcgKzEwNzcsNyBAQAogCiB2b2lkIENQV0xfU2Nyb2xsQmFyOjpPblBvc0J1dHRvbkxCRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpCiB7Ci0JbV9iTW91c2VEb3duID0gVFJVRTsKKwltX2JNb3VzZURvd24gPSB0cnVlOwogCiAJaWYgKG1fcFBvc0J1dHRvbikKIAl7CkBAIC0xMTA0LDcgKzExMDQsNyBAQAogCQlpZiAoIW1fYk5vdGlmeUZvcmV2ZXIpCiAJCQlOb3RpZnlTY3JvbGxXaW5kb3coKTsKIAl9Ci0JbV9iTW91c2VEb3duID0gRkFMU0U7CisJbV9iTW91c2VEb3duID0gZmFsc2U7CiB9CiAKIHZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uUG9zQnV0dG9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkKQEAgLTExNjMsNyArMTE2Myw3IEBACiAKIAkJaWYgKCFJc0Zsb2F0RXF1YWwoZk9sZFNjcm9sbFBvcywgbV9zRGF0YS5mU2Nyb2xsUG9zKSkKIAkJewotCQkJTW92ZVBvc0J1dHRvbihUUlVFKTsKKwkJCU1vdmVQb3NCdXR0b24odHJ1ZSk7CiAKIAkJCWlmIChtX2JOb3RpZnlGb3JldmVyKQogCQkJCU5vdGlmeVNjcm9sbFdpbmRvdygpOwpAQCAtMTI5Nyw3ICsxMjk3LDcgQEAKIAogCWlmIChGWFNZU19tZW1jbXAoJm1fc0RhdGEsICZzVGVtcCwgc2l6ZW9mKFBXTF9TQ1JPTExfUFJJVkFURURBVEEpKSAhPSAwKQogCXsKLQkJTW92ZVBvc0J1dHRvbihUUlVFKTsKKwkJTW92ZVBvc0J1dHRvbih0cnVlKTsKIAkJTm90aWZ5U2Nyb2xsV2luZG93KCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TaWduYXR1cmUuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TaWduYXR1cmUuY3BwCmluZGV4IDc2YjJiZDMuLjIzYmU3MWEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU2lnbmF0dXJlLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1NpZ25hdHVyZS5jcHAKQEAgLTcwLDkgKzcwLDkgQEAKIAltX3BUZXh0KE5VTEwpLAogCW1fcERlc2NyaXB0aW9uKE5VTEwpLAogCW1fcEltYWdlKE5VTEwpLAotCW1fYlRleHRFeGlzdChUUlVFKSwKLQltX2JJbWFnZUV4aXN0KEZBTFNFKSwKLQltX2JGbGFnRXhpc3QoVFJVRSkKKwltX2JUZXh0RXhpc3QodHJ1ZSksCisJbV9iSW1hZ2VFeGlzdChmYWxzZSksCisJbV9iRmxhZ0V4aXN0KHRydWUpCiB7CiB9CiAKQEAgLTgwLDIxICs4MCwyMSBAQAogewogfQogCi12b2lkIENQV0xfU2lnbmF0dXJlOjpTZXRUZXh0RmxhZyhGWF9CT09MIGJUZXh0RXhpc3QpCit2b2lkIENQV0xfU2lnbmF0dXJlOjpTZXRUZXh0RmxhZyhib29sIGJUZXh0RXhpc3QpCiB7CiAJbV9iVGV4dEV4aXN0ID0gYlRleHRFeGlzdDsKIAogCVJlUG9zQ2hpbGRXbmQoKTsKIH0KIAotdm9pZCBDUFdMX1NpZ25hdHVyZTo6U2V0SW1hZ2VGbGFnKEZYX0JPT0wgYkltYWdlRXhpc3QpCit2b2lkIENQV0xfU2lnbmF0dXJlOjpTZXRJbWFnZUZsYWcoYm9vbCBiSW1hZ2VFeGlzdCkKIHsKIAltX2JJbWFnZUV4aXN0ID0gYkltYWdlRXhpc3Q7CiAKIAlSZVBvc0NoaWxkV25kKCk7CiB9CiAKLXZvaWQgQ1BXTF9TaWduYXR1cmU6OlNldEZveGl0RmxhZyhGWF9CT09MIGJGbGFnRXhpc3QpCit2b2lkIENQV0xfU2lnbmF0dXJlOjpTZXRGb3hpdEZsYWcoYm9vbCBiRmxhZ0V4aXN0KQogewogCW1fYkZsYWdFeGlzdCA9IGJGbGFnRXhpc3Q7CiB9CkBAIC0xMzUsNyArMTM1LDcgQEAKIAlDUERGX1JlY3QgcmNUZXh0ID0gcmNDbGllbnQ7CiAJQ1BERl9SZWN0IHJjRGVzY3JpcHRpb24gPSByY0NsaWVudDsKIAotCUZYX0JPT0wgYlRleHRWaXNpYmxlID0gbV9iVGV4dEV4aXN0ICYmIG1fcFRleHQtPkdldFRleHQoKS5HZXRMZW5ndGgoKSA+IDA7CisJYm9vbCBiVGV4dFZpc2libGUgPSBtX2JUZXh0RXhpc3QgJiYgbV9wVGV4dC0+R2V0VGV4dCgpLkdldExlbmd0aCgpID4gMDsKIAogCWlmICgoYlRleHRWaXNpYmxlIHx8IG1fYkltYWdlRXhpc3QpICYmCiAJCW1fcERlc2NyaXB0aW9uLT5HZXRUZXh0KCkuR2V0TGVuZ3RoKCkgPiAwKQpAQCAtMTU1LDkgKzE1NSw5IEBACiAJbV9wVGV4dC0+U2V0VmlzaWJsZShiVGV4dFZpc2libGUpOwogCW1fcEltYWdlLT5TZXRWaXNpYmxlKG1fYkltYWdlRXhpc3QpOwogCi0JbV9wVGV4dC0+TW92ZShyY1RleHQsIFRSVUUsIEZBTFNFKTsKLQltX3BJbWFnZS0+TW92ZShyY1RleHQsIFRSVUUsIEZBTFNFKTsKLQltX3BEZXNjcmlwdGlvbi0+TW92ZShyY0Rlc2NyaXB0aW9uLCBUUlVFLCBGQUxTRSk7CisJbV9wVGV4dC0+TW92ZShyY1RleHQsIHRydWUsIGZhbHNlKTsKKwltX3BJbWFnZS0+TW92ZShyY1RleHQsIHRydWUsIGZhbHNlKTsKKwltX3BEZXNjcmlwdGlvbi0+TW92ZShyY0Rlc2NyaXB0aW9uLCB0cnVlLCBmYWxzZSk7CiB9CiAKIHZvaWQgQ1BXTF9TaWduYXR1cmU6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5jcHAKaW5kZXggOTBmYThmOC4uN2JiMzhjNCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1NwZWNpYWxCdXR0b24uY3BwCkBAIC0zMiw3ICszMiw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0NoZWNrQm94IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BXTF9DaGVja0JveDo6Q1BXTF9DaGVja0JveCgpIDogbV9iQ2hlY2tlZChGQUxTRSkKK0NQV0xfQ2hlY2tCb3g6OkNQV0xfQ2hlY2tCb3goKSA6IG1fYkNoZWNrZWQoZmFsc2UpCiB7CiB9CiAKQEAgLTQ1LDMzICs0NSwzMyBAQAogCXJldHVybiAiQ1BXTF9DaGVja0JveCI7CiB9CiAKLXZvaWQgQ1BXTF9DaGVja0JveDo6U2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2spCit2b2lkIENQV0xfQ2hlY2tCb3g6OlNldENoZWNrKGJvb2wgYkNoZWNrKQogewogCW1fYkNoZWNrZWQgPSBiQ2hlY2s7CiB9CiAKLUZYX0JPT0wgQ1BXTF9DaGVja0JveDo6SXNDaGVja2VkKCkgY29uc3QKK2Jvb2wgQ1BXTF9DaGVja0JveDo6SXNDaGVja2VkKCkgY29uc3QKIHsKIAlyZXR1cm4gbV9iQ2hlY2tlZDsKIH0KIAotRlhfQk9PTCBDUFdMX0NoZWNrQm94OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCBDUFdMX0NoZWNrQm94OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewotCWlmIChJc1JlYWRPbmx5KCkpIHJldHVybiBGQUxTRTsKKwlpZiAoSXNSZWFkT25seSgpKSByZXR1cm4gZmFsc2U7CiAKIAlTZXRDaGVjayghSXNDaGVja2VkKCkpOwotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENQV0xfQ2hlY2tCb3g6Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9DaGVja0JveDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewogCVNldENoZWNrKCFJc0NoZWNrZWQoKSk7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX1JhZGlvQnV0dG9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BXTF9SYWRpb0J1dHRvbjo6Q1BXTF9SYWRpb0J1dHRvbigpIDogbV9iQ2hlY2tlZChGQUxTRSkKK0NQV0xfUmFkaW9CdXR0b246OkNQV0xfUmFkaW9CdXR0b24oKSA6IG1fYkNoZWNrZWQoZmFsc2UpCiB7CiB9CiAKQEAgLTg0LDI3ICs4NCwyNyBAQAogCXJldHVybiAiQ1BXTF9SYWRpb0J1dHRvbiI7CiB9CiAKLUZYX0JPT0wJQ1BXTF9SYWRpb0J1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wJQ1BXTF9SYWRpb0J1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKLQlpZiAoSXNSZWFkT25seSgpKSByZXR1cm4gRkFMU0U7CisJaWYgKElzUmVhZE9ubHkoKSkgcmV0dXJuIGZhbHNlOwogCi0JU2V0Q2hlY2soVFJVRSk7Ci0JcmV0dXJuIFRSVUU7CisJU2V0Q2hlY2sodHJ1ZSk7CisJcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgQ1BXTF9SYWRpb0J1dHRvbjo6U2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2spCit2b2lkIENQV0xfUmFkaW9CdXR0b246OlNldENoZWNrKGJvb2wgYkNoZWNrKQogewogCW1fYkNoZWNrZWQgPSBiQ2hlY2s7CiB9CiAKLUZYX0JPT0wgQ1BXTF9SYWRpb0J1dHRvbjo6SXNDaGVja2VkKCkgY29uc3QKK2Jvb2wgQ1BXTF9SYWRpb0J1dHRvbjo6SXNDaGVja2VkKCkgY29uc3QKIHsKIAlyZXR1cm4gbV9iQ2hlY2tlZDsKIH0KIAotRlhfQk9PTCBDUFdMX1JhZGlvQnV0dG9uOjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfUmFkaW9CdXR0b246Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKIHsKLQlTZXRDaGVjayhUUlVFKTsKLQlyZXR1cm4gVFJVRTsKKwlTZXRDaGVjayh0cnVlKTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9VdGlscy5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1V0aWxzLmNwcAppbmRleCBiOWJhNzY2Li40ZTRhYzk0IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1V0aWxzLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1V0aWxzLmNwcApAQCAtODcsMTMgKzg3LDEzIEBACiAJCXJlY3QucmlnaHQgKyB4LHJlY3QudG9wICsgeSk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KGNvbnN0IENQREZfUmVjdCYgcmNQYXJlbnQsIGNvbnN0IENQREZfUmVjdCYgcmNDaGlsZCkKK2Jvb2wgQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KGNvbnN0IENQREZfUmVjdCYgcmNQYXJlbnQsIGNvbnN0IENQREZfUmVjdCYgcmNDaGlsZCkKIHsKIAlyZXR1cm4gcmNDaGlsZC5sZWZ0ID49IHJjUGFyZW50LmxlZnQgJiYgcmNDaGlsZC5ib3R0b20gPj0gcmNQYXJlbnQuYm90dG9tICYmCiAJCQlyY0NoaWxkLnJpZ2h0IDw9IHJjUGFyZW50LnJpZ2h0ICYmIHJjQ2hpbGQudG9wIDw9IHJjUGFyZW50LnRvcDsKIH0KIAotRlhfQk9PTCBDUFdMX1V0aWxzOjpJbnRlcnNlY3RSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdDEsIGNvbnN0IENQREZfUmVjdCYgcmVjdDIpCitib29sIENQV0xfVXRpbHM6OkludGVyc2VjdFJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0MSwgY29uc3QgQ1BERl9SZWN0JiByZWN0MikKIHsKIAlGWF9GTE9BVCBsZWZ0ID0gcmVjdDEubGVmdCA+IHJlY3QyLmxlZnQgPyByZWN0MS5sZWZ0IDogcmVjdDIubGVmdDsKIAlGWF9GTE9BVCByaWdodCA9IHJlY3QxLnJpZ2h0IDwgcmVjdDIucmlnaHQgPyByZWN0MS5yaWdodCA6IHJlY3QyLnJpZ2h0OwpAQCAtNDIwLDcgKzQyMCw3IEBACiB7CiAJQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CiAKLQlDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvcixUUlVFKTsKKwlDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvcix0cnVlKTsKIAlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAl7CiAJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgc0NvbG9yOwpAQCAtNDM1LDcgKzQzNSw3IEBACiB7CiAJQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CiAKLQlDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvcixUUlVFKTsKKwlDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvcix0cnVlKTsKIAlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAl7CiAJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgc0NvbG9yIDw8IENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZShyZWN0KSA8PCAiZlxuUVxuIjsKQEAgLTQ1OCw3ICs0NTgsNyBAQAogfQogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKElGWF9FZGl0KiBwRWRpdCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0LCBjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZSwKLQkJCQkJCQkJCQkJCQkJRlhfQk9PTCBiQ29udGludW91cywgRlhfV09SRCBTdWJXb3JkKQorCQkJCQkJCQkJCQkJCQlib29sIGJDb250aW51b3VzLCBGWF9XT1JEIFN1YldvcmQpCiB7CiAJcmV0dXJuIElGWF9FZGl0OjpHZXRFZGl0QXBwZWFyYW5jZVN0cmVhbShwRWRpdCxwdE9mZnNldCxwUmFuZ2UsYkNvbnRpbnVvdXMsU3ViV29yZCk7CiB9CkBAIC00OTgsNyArNDk4LDcgQEAKIAlGWF9GTE9BVCBmWSA9IDAuMGY7CiAJRlhfRkxPQVQgZlN0ZXAgPSAwLjBmOwogCi0JRlhfQk9PTCBiQnJlYWsgPSBGQUxTRTsKKwlib29sIGJCcmVhayA9IGZhbHNlOwogCiAJaWYgKHBJdGVyYXRvcikKIAl7CkBAIC01MzgsNyArNTM4LDcgQEAKIAkJCQkJZkVuZFggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7CiAJCQkJfQogCi0JCQkJYkJyZWFrID0gVFJVRTsKKwkJCQliQnJlYWsgPSB0cnVlOwogCQkJfQogCQkJZWxzZQogCQkJewpAQCAtNTY5LDcgKzU2OSw3IEBACiAJCXsKIAkJCXBJdGVyYXRvci0+U2V0QXQocFJhbmdlLT5CZWdpblBvcyk7CiAKLQkJCUZYX0JPT0wgYkxhdGluV29yZCA9IEZBTFNFOworCQkJYm9vbCBiTGF0aW5Xb3JkID0gZmFsc2U7CiAJCQlDUFZUX1dvcmRQbGFjZSB3cFdvcmRTdGFydDsKIAkJCUNGWF9CeXRlU3RyaW5nIHNXb3JkOwogCkBAIC01ODcsNyArNTg3LDcgQEAKIAkJCQkJCWlmICghYkxhdGluV29yZCkKIAkJCQkJCXsKIAkJCQkJCQl3cFdvcmRTdGFydCA9IHBsYWNlOwotCQkJCQkJCWJMYXRpbldvcmQgPSBUUlVFOworCQkJCQkJCWJMYXRpbldvcmQgPSB0cnVlOwogCQkJCQkJfQogCiAJCQkJCQlzV29yZCArPSAoY2hhcil3b3JkLldvcmQ7CkBAIC02MDIsNyArNjAyLDcgQEAKIAkJCQkJCQkJc1JldCA8PCBHZXRXb3JkU3BlbGxDaGVja0FwcGVhcmFuY2VTdHJlYW0ocEl0ZXJhdG9yLHB0T2Zmc2V0LENQVlRfV29yZFJhbmdlKHdwV29yZFN0YXJ0LG9sZHBsYWNlKSk7CiAJCQkJCQkJCXBJdGVyYXRvci0+U2V0QXQocGxhY2UpOwogCQkJCQkJCX0KLQkJCQkJCQliTGF0aW5Xb3JkID0gRkFMU0U7CisJCQkJCQkJYkxhdGluV29yZCA9IGZhbHNlOwogCQkJCQkJfQogCiAJCQkJCQlzV29yZC5FbXB0eSgpOwpAQCAtNjE0LDcgKzYxNCw3IEBACiAJCQkJCXsKIAkJCQkJCWlmICghcFNwZWxsQ2hlY2stPkNoZWNrV29yZChzV29yZCkpCiAJCQkJCQkJc1JldCA8PCBHZXRXb3JkU3BlbGxDaGVja0FwcGVhcmFuY2VTdHJlYW0ocEl0ZXJhdG9yLHB0T2Zmc2V0LENQVlRfV29yZFJhbmdlKHdwV29yZFN0YXJ0LG9sZHBsYWNlKSk7Ci0JCQkJCQliTGF0aW5Xb3JkID0gRkFMU0U7CisJCQkJCQliTGF0aW5Xb3JkID0gZmFsc2U7CiAJCQkJCQlzV29yZC5FbXB0eSgpOwogCQkJCQl9CiAJCQkJfQpAQCAtNjI1LDcgKzYyNSw3IEBACiAJCQkJaWYgKCFwU3BlbGxDaGVjay0+Q2hlY2tXb3JkKHNXb3JkKSkKIAkJCQkJc1JldCA8PCBHZXRXb3JkU3BlbGxDaGVja0FwcGVhcmFuY2VTdHJlYW0ocEl0ZXJhdG9yLHB0T2Zmc2V0LENQVlRfV29yZFJhbmdlKHdwV29yZFN0YXJ0LG9sZHBsYWNlKSk7CiAKLQkJCQliTGF0aW5Xb3JkID0gRkFMU0U7CisJCQkJYkxhdGluV29yZCA9IGZhbHNlOwogCQkJCXNXb3JkLkVtcHR5KCk7CiAJCQl9CiAJCX0KQEAgLTYzNiw3ICs2MzYsNyBAQAogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRUZXh0QXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCxJRlhfRWRpdF9Gb250TWFwICogcEZvbnRNYXAsCiAJCQkJCQkJCQkJCQkJCWNvbnN0IENGWF9XaWRlU3RyaW5nICYgc1RleHQsIGludDMyX3QgbkFsaWdubWVudEgsIGludDMyX3QgbkFsaWdubWVudFYsCi0JCQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZGb250U2l6ZSwgRlhfQk9PTCBiTXVsdGlMaW5lLCBGWF9CT09MIGJBdXRvUmV0dXJuLCBjb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KQorCQkJCQkJCQkJCQkJCQlGWF9GTE9BVCBmRm9udFNpemUsIGJvb2wgYk11bHRpTGluZSwgYm9vbCBiQXV0b1JldHVybiwgY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCkKIHsKIAlDRlhfQnl0ZVRleHRCdWYgc1JldDsKIApAQCAtNjQ5LDcgKzY0OSw3IEBACiAJCXBFZGl0LT5TZXRNdWx0aUxpbmUoYk11bHRpTGluZSk7CiAJCXBFZGl0LT5TZXRBdXRvUmV0dXJuKGJBdXRvUmV0dXJuKTsKIAkJaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCi0JCQlwRWRpdC0+U2V0QXV0b0ZvbnRTaXplKFRSVUUpOworCQkJcEVkaXQtPlNldEF1dG9Gb250U2l6ZSh0cnVlKTsKIAkJZWxzZQogCQkJcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7CiAKQEAgLTY4MywxMCArNjgzLDEwIEBACiAJCXBFZGl0LT5TZXRGb250TWFwKHBGb250TWFwKTsKIAkJcEVkaXQtPlNldEFsaWdubWVudEgoMSk7CiAJCXBFZGl0LT5TZXRBbGlnbm1lbnRWKDEpOwotCQlwRWRpdC0+U2V0TXVsdGlMaW5lKEZBTFNFKTsKLQkJcEVkaXQtPlNldEF1dG9SZXR1cm4oRkFMU0UpOworCQlwRWRpdC0+U2V0TXVsdGlMaW5lKGZhbHNlKTsKKwkJcEVkaXQtPlNldEF1dG9SZXR1cm4oZmFsc2UpOwogCQlpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkKLQkJCXBFZGl0LT5TZXRBdXRvRm9udFNpemUoVFJVRSk7CisJCQlwRWRpdC0+U2V0QXV0b0ZvbnRTaXplKHRydWUpOwogCQllbHNlCiAJCQlwRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKIApAQCAtODkyLDcgKzg5Miw3IEBACiAKIAkJaWYgKCFyY0ljb24uSXNFbXB0eSgpKQogCQl7Ci0JCQlJY29uLk1vdmUocmNJY29uLCBGQUxTRSwgRkFMU0UpOworCQkJSWNvbi5Nb3ZlKHJjSWNvbiwgZmFsc2UsIGZhbHNlKTsKIAkJCXNUZW1wIDw8IEljb24uR2V0SW1hZ2VBcHBTdHJlYW0oKTsKIAkJfQogCkBAIC05MjMsNyArOTIzLDcgQEAKIAlyZXR1cm4gIiI7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbnN0IENQV0xfQ29sb3IgJiBjb2xvcixjb25zdCBGWF9CT09MICYgYkZpbGxPclN0cm9rZSkKK0NGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbnN0IENQV0xfQ29sb3IgJiBjb2xvcixjb25zdCBib29sICYgYkZpbGxPclN0cm9rZSkKIHsKIAlDRlhfQnl0ZVRleHRCdWYgc0NvbG9yU3RyZWFtOwogCkBAIC05NjcsNyArOTY3LDcgQEAKIAkJewogCQlkZWZhdWx0OgogCQljYXNlIFBCU19TT0xJRDoKLQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLFRSVUUpOworCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsdHJ1ZSk7CiAJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAkJCXsKIAkJCQlzQXBwU3RyZWFtIDw8IHNDb2xvcjsKQEAgLTk3OCw3ICs5NzgsNyBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgUEJTX0RBU0g6Ci0JCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvcixGQUxTRSk7CisJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvcixmYWxzZSk7CiAJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAkJCXsKIAkJCQlzQXBwU3RyZWFtIDw8IHNDb2xvcjsKQEAgLTk5Miw3ICs5OTIsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgUEJTX0JFVkVMRUQ6CiAJCWNhc2UgUEJTX0lOU0VUOgotCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JMZWZ0VG9wLFRSVUUpOworCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JMZWZ0VG9wLHRydWUpOwogCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCiAJCQl7CiAJCQkJc0FwcFN0cmVhbSA8PCBzQ29sb3I7CkBAIC0xMDA0LDcgKzEwMDQsNyBAQAogCQkJCXNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyIDw8ICIgbCBmXG4iOwogCQkJfQogCi0JCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclJpZ2h0Qm90dG9tLFRSVUUpOworCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JSaWdodEJvdHRvbSx0cnVlKTsKIAkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogCQkJewogCQkJCXNBcHBTdHJlYW0gPDwgc0NvbG9yOwpAQCAtMTAxNiw3ICsxMDE2LDcgQEAKIAkJCQlzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aCAqIDIgPDwgIiBsIGZcbiI7CiAJCQl9CiAKLQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLFRSVUUpOworCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsdHJ1ZSk7CiAJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAkJCXsKIAkJCQlzQXBwU3RyZWFtIDw8IHNDb2xvcjsKQEAgLTEwMjYsNyArMTAyNiw3IEBACiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBQQlNfVU5ERVJMSU5FRDoKLQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLEZBTFNFKTsKKwkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLGZhbHNlKTsKIAkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogCQkJewogCQkJCXNBcHBTdHJlYW0gPDwgc0NvbG9yOwpAQCAtMTA2NSw3ICsxMDY1LDcgQEAKIAkJY2FzZSBQQlNfU09MSUQ6CiAJCWNhc2UgUEJTX1VOREVSTElORUQ6CiAJCQl7Ci0JCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsRkFMU0UpOworCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLGZhbHNlKTsKIAkJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAkJCQl7CiAJCQkJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZldpZHRoIDw8ICIgd1xuIiA8PCBzQ29sb3IKQEAgLTEwNzYsNyArMTA3Niw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBQQlNfREFTSDoKIAkJCXsKLQkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvcixGQUxTRSk7CisJCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsZmFsc2UpOwogCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogCQkJCXsKIAkJCQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmV2lkdGggPDwgIiB3XG4iCkBAIC0xMDkwLDcgKzEwOTAsNyBAQAogCQkJewogCQkJCUZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmV2lkdGggLyAyLjBmOwogCi0JCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsRkFMU0UpOworCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLGZhbHNlKTsKIAkJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAkJCQl7CiAJCQkJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZkhhbGZXaWR0aCA8PCAiIHdcbiIKQEAgLTEwOTgsNyArMTA5OCw3IEBACiAJCQkJCQk8PCAiIFNcblFcbiI7CiAJCQkJfQogCi0JCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JMZWZ0VG9wLEZBTFNFKTsKKwkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjckxlZnRUb3AsZmFsc2UpOwogCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogCQkJCXsKIAkJCQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIgpAQCAtMTEwNiw3ICsxMTA2LDcgQEAKIAkJCQkJCTw8ICIgU1xuUVxuIjsKIAkJCQl9CiAKLQkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclJpZ2h0Qm90dG9tLEZBTFNFKTsKKwkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclJpZ2h0Qm90dG9tLGZhbHNlKTsKIAkJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAkJCQl7CiAJCQkJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZkhhbGZXaWR0aCA8PCAiIHdcbiIKQEAgLTExMTksNyArMTExOSw3IEBACiAJCQl7CiAJCQkJRlhfRkxPQVQgZkhhbGZXaWR0aCA9IGZXaWR0aCAvIDIuMGY7CiAKLQkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvcixGQUxTRSk7CisJCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsZmFsc2UpOwogCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogCQkJCXsKIAkJCQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIgpAQCAtMTEyNyw3ICsxMTI3LDcgQEAKIAkJCQkJCTw8ICIgU1xuUVxuIjsKIAkJCQl9CiAKLQkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjckxlZnRUb3AsRkFMU0UpOworCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyTGVmdFRvcCxmYWxzZSk7CiAJCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCiAJCQkJewogCQkJCQlzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZIYWxmV2lkdGggPDwgIiB3XG4iCkBAIC0xMTM1LDcgKzExMzUsNyBAQAogCQkJCQkJPDwgIiBTXG5RXG4iOwogCQkJCX0KIAotCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyUmlnaHRCb3R0b20sRkFMU0UpOworCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyUmlnaHRCb3R0b20sZmFsc2UpOwogCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogCQkJCXsKIAkJCQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIgpAQCAtMTIwOCw0MiArMTIwOCw0MiBAQAogQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QXBwU3RyZWFtX0NoZWNrKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCwgY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCkKIHsKIAlDRlhfQnl0ZVRleHRCdWYgc0FQOwotCXNBUCA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsVFJVRSkgPDwgQ1BXTF9VdGlsczo6R2V0QVBfQ2hlY2socmNCQm94KSA8PCAiZlxuUVxuIjsKKwlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LHRydWUpIDw8IENQV0xfVXRpbHM6OkdldEFQX0NoZWNrKHJjQkJveCkgPDwgImZcblFcbiI7CiAJcmV0dXJuIHNBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKIENGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFwcFN0cmVhbV9DaXJjbGUoY29uc3QgQ1BERl9SZWN0ICYgcmNCQm94LCBjb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KQogewogCUNGWF9CeXRlVGV4dEJ1ZiBzQVA7Ci0Jc0FQIDw8ICJxXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCxUUlVFKSA8PCBDUFdMX1V0aWxzOjpHZXRBUF9DaXJjbGUocmNCQm94KSA8PCAiZlxuUVxuIjsKKwlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LHRydWUpIDw8IENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZShyY0JCb3gpIDw8ICJmXG5RXG4iOwogCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOwogfQogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBcHBTdHJlYW1fQ3Jvc3MoY29uc3QgQ1BERl9SZWN0ICYgcmNCQm94LCBjb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KQogewogCUNGWF9CeXRlVGV4dEJ1ZiBzQVA7Ci0Jc0FQIDw8ICJxXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCxGQUxTRSkgPDwgQ1BXTF9VdGlsczo6R2V0QVBfQ3Jvc3MocmNCQm94KSA8PCAiU1xuUVxuIjsKKwlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LGZhbHNlKSA8PCBDUFdMX1V0aWxzOjpHZXRBUF9Dcm9zcyhyY0JCb3gpIDw8ICJTXG5RXG4iOwogCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOwogfQogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBcHBTdHJlYW1fRGlhbW9uZChjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpCiB7CiAJQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLQlzQVAgPDwgInFcbjEgd1xuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsVFJVRSkgPDwgQ1BXTF9VdGlsczo6R2V0QVBfRGlhbW9uZChyY0JCb3gpIDw8ICJmXG5RXG4iOworCXNBUCA8PCAicVxuMSB3XG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCx0cnVlKSA8PCBDUFdMX1V0aWxzOjpHZXRBUF9EaWFtb25kKHJjQkJveCkgPDwgImZcblFcbiI7CiAJcmV0dXJuIHNBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKIENGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFwcFN0cmVhbV9TcXVhcmUoY29uc3QgQ1BERl9SZWN0ICYgcmNCQm94LCBjb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KQogewogCUNGWF9CeXRlVGV4dEJ1ZiBzQVA7Ci0Jc0FQIDw8ICJxXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCxUUlVFKSA8PCBDUFdMX1V0aWxzOjpHZXRBUF9TcXVhcmUocmNCQm94KSA8PCAiZlxuUVxuIjsKKwlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LHRydWUpIDw8IENQV0xfVXRpbHM6OkdldEFQX1NxdWFyZShyY0JCb3gpIDw8ICJmXG5RXG4iOwogCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOwogfQogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBcHBTdHJlYW1fU3Rhcihjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpCiB7CiAJQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLQlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LFRSVUUpIDw8IENQV0xfVXRpbHM6OkdldEFQX1N0YXIocmNCQm94KSA8PCAiZlxuUVxuIjsKKwlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LHRydWUpIDw8IENQV0xfVXRpbHM6OkdldEFQX1N0YXIocmNCQm94KSA8PCAiZlxuUVxuIjsKIAlyZXR1cm4gc0FQLkdldEJ5dGVTdHJpbmcoKTsKIH0KIApAQCAtMTI5OSw3ICsxMjk5LDcgQEAKIAogCWlmICghcmNCQm94LklzRW1wdHkoKSkKIAl7Ci0JCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLDIyMC4wZi8yNTUuMGYsMjIwLjBmLzI1NS4wZiwyMjAuMGYvMjU1LjBmKSxUUlVFKTsKKwkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsMjIwLjBmLzI1NS4wZiwyMjAuMGYvMjU1LjBmLDIyMC4wZi8yNTUuMGYpLHRydWUpOwogCQlzQXBwU3RyZWFtIDw8IHJjQkJveC5sZWZ0IDw8ICIgIiA8PCByY0JCb3guYm90dG9tIDw8ICIgIgogCQkJCTw8IHJjQkJveC5yaWdodCAtIHJjQkJveC5sZWZ0IDw8ICIgIiA8PCByY0JCb3gudG9wIC0gcmNCQm94LmJvdHRvbSA8PCAiIHJlIGZcbiI7CiAJCXNBcHBTdHJlYW0gPDwgIlFcbiI7CkBAIC0xNDc0LDcgKzE0NzQsNyBAQAogfQogCiB2b2lkIENQV0xfVXRpbHM6OkRyYXdTaGFkb3coQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJCQkJCQkJCQkJCQkJRlhfQk9PTCBiVmVydGljYWwsIEZYX0JPT0wgYkhvcml6b250YWwsIENQREZfUmVjdCByZWN0LAorCQkJCQkJCQkJCQkJCQlib29sIGJWZXJ0aWNhbCwgYm9vbCBiSG9yaXpvbnRhbCwgQ1BERl9SZWN0IHJlY3QsCiAJCQkJCQkJCQkJCQkJCWludDMyX3QgblRyYW5zcGFyYW5jeSwgaW50MzJfdCBuU3RhcnRHcmF5LCBpbnQzMl90IG5FbmRHcmF5KQogewogCUZYX0ZMT0FUIGZTdGVwR3JheSA9IDEuMGY7CkBAIC0xNjM4LDcgKzE2MzgsNyBAQAogCUZYX0ZMT0FUIGZZID0gMC4wZjsKIAlGWF9GTE9BVCBmU3RlcCA9IDAuMGY7CiAKLQlGWF9CT09MIGJCcmVhayA9IEZBTFNFOworCWJvb2wgYkJyZWFrID0gZmFsc2U7CiAKIAlpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpKQogCXsKQEAgLTE2NzgsNyArMTY3OCw3IEBACiAJCQkJCWZFbmRYID0gd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoOwogCQkJCX0KIAotCQkJCWJCcmVhayA9IFRSVUU7CisJCQkJYkJyZWFrID0gdHJ1ZTsKIAkJCX0KIAkJCWVsc2UKIAkJCXsKQEAgLTE3MDAsNyArMTcwMCw3IEBACiAJY29uc3QgRlhfQ09MT1JSRUYgY3JTcGVsbCA9IEFyZ2JFbmNvZGUoMjU1LDI1NSwwLDApOwogCiAJLy9mb3Igc3BlbGxjaGVjawotCUZYX0JPT0wgYkxhdGluV29yZCA9IEZBTFNFOworCWJvb2wgYkxhdGluV29yZCA9IGZhbHNlOwogCUNQVlRfV29yZFBsYWNlIHdwV29yZFN0YXJ0OwogCUNGWF9CeXRlU3RyaW5nIHNMYXRpbldvcmQ7CiAKQEAgLTE3NDQsNyArMTc0NCw3IEBACiAJCQkJCQlpZiAoIWJMYXRpbldvcmQpCiAJCQkJCQl7CiAJCQkJCQkJd3BXb3JkU3RhcnQgPSBwbGFjZTsKLQkJCQkJCQliTGF0aW5Xb3JkID0gVFJVRTsKKwkJCQkJCQliTGF0aW5Xb3JkID0gdHJ1ZTsKIAkJCQkJCX0KIAogCQkJCQkJc0xhdGluV29yZCArPSAoY2hhcil3b3JkLldvcmQ7CkBAIC0xNzYxLDcgKzE3NjEsNyBAQAogCQkJCQkJCQkJcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7CiAJCQkJCQkJCX0KIAkJCQkJCQl9Ci0JCQkJCQkJYkxhdGluV29yZCA9IEZBTFNFOworCQkJCQkJCWJMYXRpbldvcmQgPSBmYWxzZTsKIAkJCQkJCX0KIAogCQkJCQkJc0xhdGluV29yZC5FbXB0eSgpOwpAQCAtMTc4MSw3ICsxNzgxLDcgQEAKIAkJCQkJCQkJcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7CiAJCQkJCQkJfQogCQkJCQkJfQotCQkJCQkJYkxhdGluV29yZCA9IEZBTFNFOworCQkJCQkJYkxhdGluV29yZCA9IGZhbHNlOwogCQkJCQl9CiAKIAkJCQkJc0xhdGluV29yZC5FbXB0eSgpOwpAQCAtMTgwNiwxMiArMTgwNiwxMiBAQAogCXBEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwogfQogCi1GWF9CT09MIENQV0xfVXRpbHM6OklzQmxhY2tPcldoaXRlKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKQorYm9vbCBDUFdMX1V0aWxzOjpJc0JsYWNrT3JXaGl0ZShjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikKIHsKIAlzd2l0Y2ggKGNvbG9yLm5Db2xvclR5cGUpCiAJewogCWNhc2UgQ09MT1JUWVBFX1RSQU5TUEFSRU5UOgotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAljYXNlIENPTE9SVFlQRV9HUkFZOgogCQlyZXR1cm4gY29sb3IuZkNvbG9yMSA8IDAuNWY7CiAJY2FzZSBDT0xPUlRZUEVfUkdCOgpAQCAtMTgyMCw3ICsxODIwLDcgQEAKIAkJcmV0dXJuIGNvbG9yLmZDb2xvcjEgKyBjb2xvci5mQ29sb3IyICsgY29sb3IuZkNvbG9yMyArIGNvbG9yLmZDb2xvcjQgPiAyLjBmOwogCX0KIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCiBDUFdMX0NvbG9yIENQV0xfVXRpbHM6OkdldFJldmVyc2VDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikKQEAgLTE4NTEsOCArMTg1MSw4IEBACiBDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRJY29uQXBwU3RyZWFtKGludDMyX3QgblR5cGUsIGNvbnN0IENQREZfUmVjdCYgcmVjdCwgY29uc3QgQ1BXTF9Db2xvciYgY3JGaWxsLAogCQkJCQkJCQkJCQkJY29uc3QgQ1BXTF9Db2xvciYgY3JTdHJva2UpCiB7Ci0JQ0ZYX0J5dGVTdHJpbmcgc0FwcFN0cmVhbSA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyU3Ryb2tlLCBGQUxTRSk7Ci0Jc0FwcFN0cmVhbSArPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjckZpbGwsIFRSVUUpOworCUNGWF9CeXRlU3RyaW5nIHNBcHBTdHJlYW0gPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclN0cm9rZSwgZmFsc2UpOworCXNBcHBTdHJlYW0gKz0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JGaWxsLCB0cnVlKTsKIAogCUNGWF9CeXRlU3RyaW5nIHNQYXRoOwogCUNGWF9QYXRoRGF0YSBwYXRoOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9XbmQuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9XbmQuY3BwCmluZGV4IDQzM2IzYzYuLmYyMTRmYjMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfV25kLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1duZC5jcHAKQEAgLTEyMyw0MCArMTIzLDQwIEBACiAgICAgICAgIG1fcE1haW5LZXlib2FyZFduZCA9IE5VTEw7CiAgICAgfQogCi0gICAgRlhfQk9PTCBJc1duZENyZWF0ZWQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAorICAgIGJvb2wgSXNXbmRDcmVhdGVkKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BDcmVhdGVkV25kID09IHBXbmQ7CiAgICAgfQogCi0gICAgRlhfQk9PTCBJc01haW5DYXB0dXJlTW91c2UoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAorICAgIGJvb2wgSXNNYWluQ2FwdHVyZU1vdXNlKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBwV25kID09IG1fcE1haW5Nb3VzZVduZDsKICAgICB9CiAKLSAgICBGWF9CT09MIElzV25kQ2FwdHVyZU1vdXNlKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKKyAgICBib29sIElzV25kQ2FwdHVyZU1vdXNlKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKICAgICB7CiAgICAgICAgIGlmIChwV25kKQogICAgICAgICAgICAgZm9yKCBpbnQzMl90IGk9MCxzej1tX2FNb3VzZVBhdGguR2V0U2l6ZSgpOyBpPHN6OyBpKyspCiAgICAgICAgICAgICAgICAgaWYgKG1fYU1vdXNlUGF0aC5HZXRBdChpKSA9PSBwV25kKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgRlhfQk9PTCBJc01haW5DYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAorICAgIGJvb2wgSXNNYWluQ2FwdHVyZUtleWJvYXJkKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBwV25kID09IG1fcE1haW5LZXlib2FyZFduZDsKICAgICB9CiAKIAotICAgIEZYX0JPT0wgSXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAorICAgIGJvb2wgSXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAogICAgIHsKICAgICAgICAgaWYgKHBXbmQpCiAgICAgICAgICAgICBmb3IoIGludDMyX3QgaT0wLHN6PW1fYUtleWJvYXJkUGF0aC5HZXRTaXplKCk7IGk8c3o7IGkrKykKICAgICAgICAgICAgICAgICBpZiAobV9hS2V5Ym9hcmRQYXRoLkdldEF0KGkpID09IHBXbmQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKIAotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICB2b2lkIFNldEZvY3VzKENQV0xfV25kICogcFduZCkKQEAgLTIyNSwxNiArMjI1LDE2IEBACiAgICAgbV9wVlNjcm9sbEJhcihOVUxMKSwKICAgICBtX3JjV2luZG93KCksCiAgICAgbV9yY0NsaXAoKSwKLSAgICBtX2JDcmVhdGVkKEZBTFNFKSwKLSAgICBtX2JWaXNpYmxlKEZBTFNFKSwKLSAgICBtX2JOb3RpZnlpbmcoRkFMU0UpLAotICAgIG1fYkVuYWJsZWQoVFJVRSkKKyAgICBtX2JDcmVhdGVkKGZhbHNlKSwKKyAgICBtX2JWaXNpYmxlKGZhbHNlKSwKKyAgICBtX2JOb3RpZnlpbmcoZmFsc2UpLAorICAgIG1fYkVuYWJsZWQodHJ1ZSkKIHsKIH0KIAogQ1BXTF9XbmQ6On5DUFdMX1duZCgpCiB7Ci0gICAgQVNTRVJUKG1fYkNyZWF0ZWQgPT0gRkFMU0UpOworICAgIEFTU0VSVChtX2JDcmVhdGVkID09IGZhbHNlKTsKIH0KIAogQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9XbmQ6OkdldENsYXNzTmFtZSgpIGNvbnN0CkBAIC0yNzIsNyArMjcyLDcgQEAKICAgICAgICAgT25DcmVhdGVkKCk7CiAKICAgICAgICAgUmVQb3NDaGlsZFduZCgpOwotICAgICAgICBtX2JDcmVhdGVkID0gVFJVRTsKKyAgICAgICAgbV9iQ3JlYXRlZCA9IHRydWU7CiAgICAgfQogfQogCkBAIC0zMDgsNyArMzA4LDcgQEAKIAogICAgICAgICBpZiAobV9zUHJpdmF0ZVBhcmFtLnBQYXJlbnRXbmQpCiAgICAgICAgICAgICBtX3NQcml2YXRlUGFyYW0ucFBhcmVudFduZC0+T25Ob3RpZnkodGhpcywgUE5NX1JFTU9WRUNISUxEKTsKLSAgICAgICAgbV9iQ3JlYXRlZCA9IEZBTFNFOworICAgICAgICBtX2JDcmVhdGVkID0gZmFsc2U7CiAgICAgfQogCiAgICAgRGVzdHJveU1zZ0NvbnRyb2woKTsKQEAgLTMxOCw3ICszMTgsNyBAQAogICAgIG1fcFZTY3JvbGxCYXIgPSBOVUxMOwogfQogCi12b2lkIENQV0xfV25kOjpNb3ZlKGNvbnN0IENQREZfUmVjdCAmIHJjTmV3LCBGWF9CT09MIGJSZXNldCxGWF9CT09MIGJSZWZyZXNoKQordm9pZCBDUFdMX1duZDo6TW92ZShjb25zdCBDUERGX1JlY3QgJiByY05ldywgYm9vbCBiUmVzZXQsYm9vbCBiUmVmcmVzaCkKIHsKICAgICBpZiAoSXNWYWxpZCgpKQogICAgIHsKQEAgLTQ5NCw3ICs0OTQsNyBAQAogfQogCiAjZGVmaW5lIFBXTF9JTVBMRU1FTlRfS0VZX01FVEhPRChrZXlfbWV0aG9kX25hbWUpXAotRlhfQk9PTCBDUFdMX1duZDo6a2V5X21ldGhvZF9uYW1lKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKVwKK2Jvb2wgQ1BXTF9XbmQ6OmtleV9tZXRob2RfbmFtZShGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZylcCiB7XAogICAgIGlmIChJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkgJiYgSXNFbmFibGVkKCkpXAogICAgIHtcCkBAIC01MTIsMTEgKzUxMiwxMSBAQAogICAgICAgICAgICAgfVwKICAgICAgICAgfVwKICAgICB9XAotICAgIHJldHVybiBGQUxTRTtcCisgICAgcmV0dXJuIGZhbHNlO1wKIH0KIAogI2RlZmluZSBQV0xfSU1QTEVNRU5UX01PVVNFX01FVEhPRChtb3VzZV9tZXRob2RfbmFtZSlcCi1GWF9CT09MIENQV0xfV25kOjptb3VzZV9tZXRob2RfbmFtZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKVwKK2Jvb2wgQ1BXTF9XbmQ6Om1vdXNlX21ldGhvZF9uYW1lKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpXAoge1wKICAgICBpZiAoSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpICYmIElzRW5hYmxlZCgpKVwKICAgICB7XApAQCAtNTUwLDcgKzU1MCw3IEBACiAgICAgICAgICAgICAgICAgU2V0Q3Vyc29yKCk7XAogICAgICAgICB9XAogICAgIH1cCi0gICAgcmV0dXJuIEZBTFNFO1wKKyAgICByZXR1cm4gZmFsc2U7XAogfQogCiBQV0xfSU1QTEVNRU5UX0tFWV9NRVRIT0QoT25LZXlEb3duKQpAQCAtNTY3LDcgKzU2Nyw3IEBACiBQV0xfSU1QTEVNRU5UX01PVVNFX01FVEhPRChPblJCdXR0b25VcCkKIFBXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKE9uTW91c2VNb3ZlKQogCi1GWF9CT09MIENQV0xfV25kOjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCBDUFdMX1duZDo6T25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKICAgICBpZiAoSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpICYmIElzRW5hYmxlZCgpKQogICAgIHsKQEAgLTU4Niw3ICs1ODYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ1BXTF9XbmQ6OkFkZENoaWxkKENQV0xfV25kICogcFduZCkKQEAgLTYyNCw3ICs2MjQsNyBAQAogICAgIH0KIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6SXNWYWxpZCgpIGNvbnN0Citib29sIENQV0xfV25kOjpJc1ZhbGlkKCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9iQ3JlYXRlZDsKIH0KQEAgLTY3Nyw3ICs2NzcsNyBAQAogICAgIHJldHVybiBDUFdMX1V0aWxzOjpHZXRDZW50ZXJTcXVhcmUoQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoR2V0V2luZG93UmVjdCgpLDAuMWYpKTsKIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6SGFzRmxhZyhGWF9EV09SRCBkd0ZsYWdzKSBjb25zdAorYm9vbCBDUFdMX1duZDo6SGFzRmxhZyhGWF9EV09SRCBkd0ZsYWdzKSBjb25zdAogewogICAgIHJldHVybiAobV9zUHJpdmF0ZVBhcmFtLmR3RmxhZ3MgJiBkd0ZsYWdzKSAhPSAwOwogfQpAQCAtODY1LDEyICs4NjUsMTIgQEAKIHsKIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6V25kSGl0VGVzdChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0Citib29sIENQV0xfV25kOjpXbmRIaXRUZXN0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKIHsKICAgICByZXR1cm4gSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpICYmIEdldFdpbmRvd1JlY3QoKS5Db250YWlucyhwb2ludC54LHBvaW50LnkpOwogfQogCi1GWF9CT09MIENQV0xfV25kOjpDbGllbnRIaXRUZXN0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKK2Jvb2wgQ1BXTF9XbmQ6OkNsaWVudEhpdFRlc3QoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdAogewogICAgIHJldHVybiBJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkgJiYgR2V0Q2xpZW50UmVjdCgpLkNvbnRhaW5zKHBvaW50LngscG9pbnQueSk7CiB9CkBAIC04ODMsNyArODgzLDcgQEAKICAgICByZXR1cm4gdGhpczsKIH0KIAotdm9pZCBDUFdMX1duZDo6U2V0VmlzaWJsZShGWF9CT09MIGJWaXNpYmxlKQordm9pZCBDUFdMX1duZDo6U2V0VmlzaWJsZShib29sIGJWaXNpYmxlKQogewogICAgIGlmIChJc1ZhbGlkKCkpCiAgICAgewpAQCAtOTE1LDcgKzkxNSw3IEBACiAgICAgcmV0dXJuIG1fcmNDbGlwOwogfQogCi1GWF9CT09MIENQV0xfV25kOjpJc1JlYWRPbmx5KCkgY29uc3QKK2Jvb2wgQ1BXTF9XbmQ6OklzUmVhZE9ubHkoKSBjb25zdAogewogICAgIHJldHVybiBIYXNGbGFnKFBXU19SRUFET05MWSk7CiB9CkBAIC05MzEsNyArOTMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQucmlnaHQtMS4wZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQudG9wKTsKIAotICAgIGlmIChwVlNCKSBwVlNCLT5Nb3ZlKHJjVlNjcm9sbCxUUlVFLEZBTFNFKTsKKyAgICBpZiAocFZTQikgcFZTQi0+TW92ZShyY1ZTY3JvbGwsdHJ1ZSxmYWxzZSk7CiB9CiAKIHZvaWQgQ1BXTF9XbmQ6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQpAQCAtOTY4LDMzICs5NjgsMzMgQEAKICAgICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnBNc2dDb250cm9sOwogfQogCi1GWF9CT09MIENQV0xfV25kOjpJc0NhcHR1cmVNb3VzZSgpIGNvbnN0Citib29sIENQV0xfV25kOjpJc0NhcHR1cmVNb3VzZSgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIElzV25kQ2FwdHVyZU1vdXNlKHRoaXMpOwogfQogCi1GWF9CT09MIENQV0xfV25kOjpJc1duZENhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCAqIHBXbmQpIGNvbnN0Citib29sIENQV0xfV25kOjpJc1duZENhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCAqIHBXbmQpIGNvbnN0CiB7CiAgICAgaWYgKENQV0xfTXNnQ29udHJvbCAqIHBDdHJsID0gR2V0TXNnQ29udHJvbCgpKQogICAgICAgICByZXR1cm4gcEN0cmwtPklzV25kQ2FwdHVyZU1vdXNlKHBXbmQpOwogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6SXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAorYm9vbCBDUFdMX1duZDo6SXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAogewogICAgIGlmIChDUFdMX01zZ0NvbnRyb2wgKiBwQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkKICAgICAgICAgcmV0dXJuIHBDdHJsLT5Jc1duZENhcHR1cmVLZXlib2FyZChwV25kKTsKIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ1BXTF9XbmQ6OklzRm9jdXNlZCgpIGNvbnN0Citib29sIENQV0xfV25kOjpJc0ZvY3VzZWQoKSBjb25zdAogewogICAgIGlmIChDUFdMX01zZ0NvbnRyb2wgKiBwQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkKICAgICAgICAgcmV0dXJuIHBDdHJsLT5Jc01haW5DYXB0dXJlS2V5Ym9hcmQodGhpcyk7CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBDUERGX1JlY3QgQ1BXTF9XbmQ6OkdldEZvY3VzUmVjdCgpIGNvbnN0CkBAIC0xMjE3LDcgKzEyMTcsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi12b2lkIENQV0xfV25kOjpFbmFibGVXaW5kb3coRlhfQk9PTCBiRW5hYmxlKQordm9pZCBDUFdMX1duZDo6RW5hYmxlV2luZG93KGJvb2wgYkVuYWJsZSkKIHsKICAgICBpZiAobV9iRW5hYmxlZCAhPSBiRW5hYmxlKQogICAgIHsKQEAgLTEyMzgsNyArMTIzOCw3IEBACiAgICAgfQogfQogCi1GWF9CT09MIENQV0xfV25kOjpJc0VuYWJsZWQoKQorYm9vbCBDUFdMX1duZDo6SXNFbmFibGVkKCkKIHsKICAgICByZXR1cm4gbV9iRW5hYmxlZDsKIH0KQEAgLTEyNTEsNDIgKzEyNTEsNDIgQEAKIHsKIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6SXNDVFJMcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3QKK2Jvb2wgQ1BXTF9XbmQ6OklzQ1RSTHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0CiB7CiAgICAgaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKSkKICAgICB7CiAgICAgICAgIHJldHVybiBwU3lzdGVtSGFuZGxlci0+SXNDVFJMS2V5RG93bihuRmxhZyk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6SXNTSElGVHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0Citib29sIENQV0xfV25kOjpJc1NISUZUcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3QKIHsKICAgICBpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyID0gR2V0U3lzdGVtSGFuZGxlcigpKQogICAgIHsKICAgICAgICAgcmV0dXJuIHBTeXN0ZW1IYW5kbGVyLT5Jc1NISUZUS2V5RG93bihuRmxhZyk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6SXNBTFRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdAorYm9vbCBDUFdMX1duZDo6SXNBTFRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdAogewogICAgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCiAgICAgewogICAgICAgICByZXR1cm4gcFN5c3RlbUhhbmRsZXItPklzQUxUS2V5RG93bihuRmxhZyk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6SXNJTlNFUlRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdAorYm9vbCBDUFdMX1duZDo6SXNJTlNFUlRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdAogewogICAgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCiAgICAgewogICAgICAgICByZXR1cm4gcFN5c3RlbUhhbmRsZXItPklzSU5TRVJUS2V5RG93bihuRmxhZyk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0K