ZGlmZiAtLWdpdCBhLy50cmF2aXMueW1sIGIvLnRyYXZpcy55bWwKaW5kZXggNWIzNjdlMC4uMjRlODc3MyAxMDA2NDQKLS0tIGEvLnRyYXZpcy55bWwKKysrIGIvLnRyYXZpcy55bWwKQEAgLTcsOCArNyw4IEBACiAgIC0gcGlwIGluc3RhbGwgY3BwLWNvdmVyYWxscyAtLXVzZXIKICAgLSBleHBvcnQgTERfTElCUkFSWV9QQVRIPSRQV0QvYnVpbGQvZGlzdC9saWI6JExEX0xJQlJBUllfUEFUSAogZW52OgotICAtIFVTRV9DT05URVhUPU9OCi0gIC0gVVNFX0NPTlRFWFQ9T0ZGCisjICAtIFVTRV9DT05URVhUPU9OCisjICAtIFVTRV9DT05URVhUPU9GRgogICAtIFVTRV9DT05URVhUPU9GRiBVU0VfRU1CRURUTFM9T04KIG1hdHJpeDoKICAgZXhjbHVkZToKZGlmZiAtLWdpdCBhL3NyYy9DTWFrZUxpc3RzLnR4dCBiL3NyYy9DTWFrZUxpc3RzLnR4dAppbmRleCA0NGMwOWZlLi5hZWYwMTQzIDEwMDY0NAotLS0gYS9zcmMvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL0NNYWtlTGlzdHMudHh0CkBAIC02LDYgKzYsNyBAQAogCUNvc2UuYwogCU1hY01lc3NhZ2UuYwogICAgICAgICBNYWNNZXNzYWdlMC5jCisgICAgICAgIG1iZWR0bHMuYwogCW9wZW5zc2wuYwogCVNpZ24uYwogICAgICAgICBTaWduMC5jCkBAIC0yOSw2ICszMCw5IEBACiAKIHRhcmdldF9saW5rX2xpYnJhcmllcyAoIGNvc2UtYyBQUklWQVRFICR7T1BFTlNTTF9MSUJSQVJJRVN9ICkKIHRhcmdldF9saW5rX2xpYnJhcmllcyAoIGNvc2UtYyBQUklWQVRFIGNuLWNib3IgKQoraWYgKHVzZV9lbWJlZHRscykKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMgKCBjb3NlLWMgUFJJVkFURSBlbWJlZHRscyApCitlbmRpZigpCiAKIGluc3RhbGwgKCBUQVJHRVRTIGNvc2UtYwogCUxJQlJBUlkgREVTVElOQVRJT04gbGliCmRpZmYgLS1naXQgYS9zcmMvY29uZmlndXJlLmggYi9zcmMvY29uZmlndXJlLmgKaW5kZXggMDBjMGI4Zi4uODExZTdiNSAxMDA2NDQKLS0tIGEvc3JjL2NvbmZpZ3VyZS5oCisrKyBiL3NyYy9jb25maWd1cmUuaApAQCAtMSw3ICsxLDI0IEBACiAvLworLy8gIERldGVybWluZSB3aGljaCBjcnlwdG9ncmFwaGljIGxpYnJhcnkgd2UgYXJlIGdvaWcgdG8gYmUgdXNpZworLy8KKworI2lmIGRlZmluZWQoVVNFX01CRURfVExTKQorI2lmIGRlZmluZWQoVVNFX09QRU5fU1NMKSB8fCBkZWZpbmVkKFVTRV9CQ1JZUFQpCisjZXJyb3IgT25seSBEZWZpbmUgT25lIENyeXB0byBQYWNrYWdlCisjZW5kaWYKKyNlbGlmIGRlZmluZWQoVVNFX0JDUllQVCkKKyNpZiBkZWZpbmVkKFVTRV9PUEVOU1NMKQorI2Vycm9yIE9ubHkgRGVmaW5lIE9uZSBDcnlwdG8gUGFja2FnZQorI2VuZGlmCisjZWxpZiAhZGVmaW5lZChVU0VfT1BFTl9TU0wpCisjZGVmaW5lIFVTRV9PUEVOX1NTTAorI2VuZGlmCisKKy8vCiAvLyAgRGVmaW5lIHdoaWNoIEFFUyBHQ00gYWxnb3JpdGhtcyBhcmUgYmVpbmcgdXNlZAogLy8KIAorI2lmICFkZWZpbmVkKFVTRV9NQkVEX1RMUykKICNkZWZpbmUgVVNFX0FFU19HQ01fMTI4CiAjZGVmaW5lIFVTRV9BRVNfR0NNXzE5MgogI2RlZmluZSBVU0VfQUVTX0dDTV8yNTYKQEAgLTksNiArMjYsNyBAQAogI2lmIGRlZmluZWQoVVNFX0FFU19HQ01fMTI4KSB8fCBkZWZpbmVkKFVTRV9BRVNfR0NNXzE5MikgfHwgZGVmaW5lZChVU0VfQUVTX0dDTV8yNTYpCiAjZGVmaW5lIFVTRV9BRVNfR0NNCiAjZW5kaWYKKyNlbmRpZiAvLyAhZGVmaW5lZChVU0VfTUJFRF9UTFMpCiAKIC8vCiAvLyAgRGVmaW5lIHdoaWNoIEFFUyBDQ00gYWxnb3JpdGhtcyBhcmUgYmVpbmcgdXNlZApAQCAtNDEsNjQgKzU5LDY3IEBACiAvLyAgRGVmaW5lIHdoaWNoIEFFUyBDQkMtTUFDIGFsZ29yaXRobXMgYXJlIHRvIGJlIHVzZWQKIC8vCiAKKyNpZiAhZGVmaW5lZChVU0VfTUJFRF9UTFMpCisKICNkZWZpbmUgVVNFX0FFU19DQkNfTUFDXzEyOF82NAogI2RlZmluZSBVU0VfQUVTX0NCQ19NQUNfMTI4XzEyOAogI2RlZmluZSBVU0VfQUVTX0NCQ19NQUNfMjU2XzY0CiAjZGVmaW5lIFVTRV9BRVNfQ0JDX01BQ18yNTZfMTI4CiAKKyNlbmRpZiAvLyAhZGVmaW5lZChVU0VfTUJFRF9UTFMpCisKIC8vCiAvLyAgRGVmaW5lIHdoaWNoIEVDREggYWxnb3JpdGhtcyBhcmUgdG8gYmUgdXNlZAogLy8KIAorI2lmICFkZWZpbmVkKFVTRV9NQkVEX1RMUykKICNkZWZpbmUgVVNFX0VDREhfRVNfSEtERl8yNTYKICNkZWZpbmUgVVNFX0VDREhfRVNfSEtERl81MTIKICNkZWZpbmUgVVNFX0VDREhfU1NfSEtERl8yNTYKICNkZWZpbmUgVVNFX0VDREhfU1NfSEtERl81MTIKKyNlbmRpZiAvLyAhZGVmaW5lZChVU0VfTUJFRF9UTFMpCiAKKyNpZiAhZGVmaW5lZChVU0VfTUJFRF9UTFMpCiAjZGVmaW5lIFVTRV9FQ0RIX0VTX0ExMjhLVwogI2RlZmluZSBVU0VfRUNESF9FU19BMTkyS1cKICNkZWZpbmUgVVNFX0VDREhfRVNfQTI1NktXCiAjZGVmaW5lIFVTRV9FQ0RIX1NTX0ExMjhLVwogI2RlZmluZSBVU0VfRUNESF9TU19BMTkyS1cKICNkZWZpbmUgVVNFX0VDREhfU1NfQTI1NktXCisjZW5kaWYgLy8gIWRlZmluZWQoVVNFX01CRURfVExTKQogCiAvLwogLy8gIERlZmluZSB3aGljaCBLZXkgV3JhcCBmdW5jdGlvbnMgYXJlIHRvIGJlIHVzZWQKIC8vCiAKKyNpZiAhZGVmaW5lZChVU0VfTUJFRF9UTFMpCiAjZGVmaW5lIFVTRV9BRVNfS1dfMTI4CiAjZGVmaW5lIFVTRV9BRVNfS1dfMTkyCiAjZGVmaW5lIFVTRV9BRVNfS1dfMjU2CisjZW5kaWYgLy8gIWRlZmluZWQoVVNFX01CRURfVExTKQogCiAvLwogLy8gIERlZmluZSB3aGljaCBvZiB0aGUgRElSRUNUICsgS0RGIGFsZ29yaXRobXMgYXJlIHRvIGJlIHVzZWQKIC8vCiAKKyNpZiAhZGVmaW5lZChVU0VfTUJFRF9UTFMpCiAjZGVmaW5lIFVTRV9EaXJlY3RfSEtERl9ITUFDX1NIQV8yNTYKICNkZWZpbmUgVVNFX0RpcmVjdF9IS0RGX0hNQUNfU0hBXzUxMgogI2RlZmluZSBVU0VfRGlyZWN0X0hLREZfQUVTXzEyOAogI2RlZmluZSBVU0VfRGlyZWN0X0hLREZfQUVTXzI1NgorI2VuZGlmIC8vICFkZWZpbmVkKFVTRV9NQkVEX1RMUykKIAogCiAvLwogLy8gIERlZmluZSB3aGljaCBvZiB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobXMgYXJlIHRvIGJlIHVzZWQKIC8vCiAKKyNpZiAhZGVmaW5lZChVU0VfTUJFRF9UTFMpCiAjZGVmaW5lIFVTRV9FQ0RTQV9TSEFfMjU2CiAjZGVmaW5lIFVTRV9FQ0RTQV9TSEFfMzg0CiAjZGVmaW5lIFVTRV9FQ0RTQV9TSEFfNTEyCisjZW5kaWYgLy8gIWRlZmluZWQoVVNFX01CRURfVExTKQogCiAKLSNpZiBkZWZpbmVkKFVTRV9NQkVEX1RMUykKLSNpZiBkZWZpbmVkKFVTRV9PUEVOX1NTTCkgfHwgZGVmaW5lZChVU0VfQkNSWVBUKQotI2Vycm9yIE9ubHkgRGVmaW5lIE9uZSBDcnlwdG8gUGFja2FnZQotI2VuZGlmCi0jZWxpZiBkZWZpbmVkKFVTRV9CQ1JZUFQpCi0jaWYgZGVmaW5lZChVU0VfT1BFTlNTTCkKLSNlcnJvciBPbmx5IERlZmluZSBPbmUgQ3J5cHRvIFBhY2thZ2UKLSNlbmRpZgotI2VsaWYgIWRlZmluZWQoVVNFX09QRU5fU1NMKQotI2RlZmluZSBVU0VfT1BFTl9TU0wKLSNlbmRpZgogCiAvLyNkZWZpbmUgVVNFX0NPVU5URVJfU0lHTkFUVVJFUwpkaWZmIC0tZ2l0IGEvc3JjL21iZWR0bHMuYyBiL3NyYy9tYmVkdGxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlZTgzMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYmVkdGxzLmMKQEAgLTAsMCArMSwxMjM3IEBACisjaW5jbHVkZSAiY29zZS5oIgorI2luY2x1ZGUgImNvbmZpZ3VyZS5oIgorI2luY2x1ZGUgImNvc2VfaW50LmgiCisjaW5jbHVkZSAiY3J5cHRvLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKworI2lmZGVmIFVTRV9NQkVEX1RMUworCisjaW5jbHVkZSAiaW5jbHVkZS9tYmVkdGxzL2NjbS5oIgorI2luY2x1ZGUgImluY2x1ZGUvbWJlZHRscy9tZC5oIgorI2luY2x1ZGUgImluY2x1ZGUvbWJlZHRscy9jdHJfZHJiZy5oIgorI2luY2x1ZGUgImluY2x1ZGUvbWJlZHRscy9lbnRyb3B5LmgiCisKK2Jvb2wgRlVzZUNvbXByZXNzZWQgPSB0cnVlOworCisjZGVmaW5lIE1JTihBLCBCKSAoKEEpIDwgKEIpID8gKEEpIDogKEIpKQorCitib29sIEFFU19DQ01fRGVjcnlwdChDT1NFX0VudmVsb3BlZCAqIHBjb3NlLCBpbnQgVFNpemUsIGludCBMU2l6ZSwgY29uc3QgYnl0ZSAqIHBiS2V5LCBzaXplX3QgY2JLZXksIGNvbnN0IGJ5dGUgKiBwYkNyeXB0bywgc2l6ZV90IGNiQ3J5cHRvLCBjb25zdCBieXRlICogcGJBdXRoRGF0YSwgc2l6ZV90IGNiQXV0aERhdGEsIGNvc2VfZXJyYmFjayAqIHBlcnIpCit7CisKKwltYmVkdGxzX2NjbV9jb250ZXh0IGN0eDsKKwlpbnQgY2JPdXQ7CisJYnl0ZSAqIHJnYk91dCA9IE5VTEw7CisJaW50IE5TaXplID0gMTUgLSAoTFNpemUvOCk7CisJYnl0ZSByZ2JJVlsxNV0gPSB7IDAgfTsKKwljb25zdCBjbl9jYm9yICogcElWID0gTlVMTDsKKwltYmVkdGxzX2NpcGhlcl9pZF90IGNpcGhlcjsKKyNpZmRlZiBVU0VfQ0JPUl9DT05URVhUCisJY25fY2Jvcl9jb250ZXh0ICogY29udGV4dCA9ICZwY29zZS0+bV9tZXNzYWdlLm1fYWxsb2NDb250ZXh0OworI2VuZGlmCisKKwltYmVkdGxzX2NjbV9pbml0KCZjdHgpOworCQorICAgICAgICAvLyAgU2V0dXAgdGhlIElWL05vbmNlIGFuZCBwdXQgaXQgaW50byB0aGUgbWVzc2FnZQorCXBJViA9IF9DT1NFX21hcF9nZXRfaW50KCZwY29zZS0+bV9tZXNzYWdlLCBDT1NFX0hlYWRlcl9JViwgQ09TRV9CT1RILCBOVUxMKTsKKwlpZiAoKHBJViA9PSBOVUxMKSB8fCAocElWLT50eXBlIT0gQ05fQ0JPUl9CWVRFUykpIHsKKwkJaWYgKHBlcnIgIT0gTlVMTCkgcGVyci0+ZXJyID0gQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVI7CisKKwllcnJvclJldHVybjoKKwkJaWYgKHJnYk91dCAhPSBOVUxMKSBDT1NFX0ZSRUUocmdiT3V0LCBjb250ZXh0KTsKKwkJbWJlZHRsc19jY21fZnJlZSgmY3R4KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlDSEVDS19DT05ESVRJT04ocElWLT5sZW5ndGggPT0gTlNpemUsIENPU0VfRVJSX0lOVkFMSURfUEFSQU1FVEVSKTsKKwltZW1jcHkocmdiSVYsIHBJVi0+di5zdHIsIHBJVi0+bGVuZ3RoKTsKKworCS8vICBTZXR1cCBhbmQgcnVuIHRoZSBtYmVkVExTIGNvZGUKKwljaXBoZXIgPSBNQkVEVExTX0NJUEhFUl9JRF9BRVM7CisJCisgICAgICAgIENIRUNLX0NPTkRJVElPTighbWJlZHRsc19jY21fc2V0a2V5KCZjdHgsIGNpcGhlciwgcGJLZXksIGNiS2V5KjgpLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisJVFNpemUgLz0gODsgLy8gQ29tZXMgaW4gaW4gYml0cyBub3QgYnl0ZXMuCisKKwljYk91dCA9IChpbnQpICBjYkNyeXB0byAtIFRTaXplOworCXJnYk91dCA9IChieXRlICopQ09TRV9DQUxMT0MoY2JPdXQsIDEsIGNvbnRleHQpOworCUNIRUNLX0NPTkRJVElPTihyZ2JPdXQgIT0gTlVMTCwgQ09TRV9FUlJfT1VUX09GX01FTU9SWSk7CisgICAgICAgIAorCQkKKwlDSEVDS19DT05ESVRJT04oIW1iZWR0bHNfY2NtX2F1dGhfZGVjcnlwdCgmY3R4LCBjYk91dCwgcmdiSVYsIE5TaXplLCBwYkF1dGhEYXRhLCBjYkF1dGhEYXRhLCBwYkNyeXB0bywgcmdiT3V0LCAmcGJDcnlwdG9bY2JPdXRdLCBUU2l6ZSksIENPU0VfRVJSX0NSWVBUT19GQUlMKTsKKyAgICAgICAgCisJbWJlZHRsc19jY21fZnJlZSgmY3R4KTsKKwlwY29zZS0+cGJDb250ZW50ID0gcmdiT3V0OworCXBjb3NlLT5jYkNvbnRlbnQgPSBjYk91dDsKKworCXJldHVybiB0cnVlOworfQorCisKK2Jvb2wgQUVTX0NDTV9FbmNyeXB0KENPU0VfRW52ZWxvcGVkICogcGNvc2UsIGludCBUU2l6ZSwgaW50IExTaXplLCBjb25zdCBieXRlICogcGJLZXksIHNpemVfdCBjYktleSwgY29uc3QgYnl0ZSAqIHBiQXV0aERhdGEsIHNpemVfdCBjYkF1dGhEYXRhLCBjb3NlX2VycmJhY2sgKiBwZXJyKQoreworCW1iZWR0bHNfY2NtX2NvbnRleHQgY3R4OworCWludCBjYk91dDsKKwlieXRlICogcmdiT3V0ID0gTlVMTDsKKwlpbnQgTlNpemUgPSAxNSAtIChMU2l6ZS84KTsKKwljb25zdCBjbl9jYm9yICogY2Jvcl9pdiA9IE5VTEw7CisJY25fY2JvciAqIGNib3JfaXZfdCA9IE5VTEw7CisjaWZkZWYgVVNFX0NCT1JfQ09OVEVYVAorCWNuX2Nib3JfY29udGV4dCAqIGNvbnRleHQgPSAmcGNvc2UtPm1fbWVzc2FnZS5tX2FsbG9jQ29udGV4dDsKKyNlbmRpZgorCWNuX2Nib3IgKiBjblRtcCA9IE5VTEw7CisJbWJlZHRsc19jaXBoZXJfaWRfdCBjaXBoZXI7CisJYnl0ZSByZ2JJVlsxNl07CisJYnl0ZSAqIHBiSVYgPSBOVUxMOworCWNuX2Nib3JfZXJyYmFjayBjYm9yX2Vycm9yOworCisgICAgICAgIG1iZWR0bHNfY2NtX2luaXQoJmN0eCk7CisKKwljaXBoZXIgPSBNQkVEVExTX0NJUEhFUl9JRF9BRVM7CQkJCisJCisJLy8gIFNldHVwIHRoZSBJVi9Ob25jZSBhbmQgcHV0IGl0IGludG8gdGhlIG1lc3NhZ2UKKwljYm9yX2l2ID0gX0NPU0VfbWFwX2dldF9pbnQoJnBjb3NlLT5tX21lc3NhZ2UsIENPU0VfSGVhZGVyX0lWLCBDT1NFX0JPVEgsIHBlcnIpOworCWlmIChjYm9yX2l2ID09IE5VTEwpIHsKKwkKKyAgICAgICAgICAgICAgICBwYklWID0gQ09TRV9DQUxMT0MoTlNpemUsIDEsIGNvbnRleHQpOworCQlDSEVDS19DT05ESVRJT04ocGJJViAhPSBOVUxMLCBDT1NFX0VSUl9PVVRfT0ZfTUVNT1JZKTsKKwkJcmFuZF9ieXRlcyhwYklWLCBOU2l6ZSk7CisJCW1lbWNweShyZ2JJViwgcGJJViwgTlNpemUpOworCQljYm9yX2l2X3QgPSBjbl9jYm9yX2RhdGFfY3JlYXRlKHBiSVYsIE5TaXplLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgJmNib3JfZXJyb3IpOworCQlDSEVDS19DT05ESVRJT05fQ0JPUihjYm9yX2l2X3QgIT0gTlVMTCwgY2Jvcl9lcnJvcik7CisJCXBiSVYgPSBOVUxMOworCisJCWlmICghX0NPU0VfbWFwX3B1dCgmcGNvc2UtPm1fbWVzc2FnZSwgQ09TRV9IZWFkZXJfSVYsIGNib3JfaXZfdCwgQ09TRV9VTlBST1RFQ1RfT05MWSwgcGVycikpIGdvdG8gZXJyb3JSZXR1cm47CisJCWNib3JfaXZfdCA9IE5VTEw7CisJfQorCWVsc2UgeworCQlDSEVDS19DT05ESVRJT04oY2Jvcl9pdi0+dHlwZSA9PSBDTl9DQk9SX0JZVEVTLCBDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUik7CisJCUNIRUNLX0NPTkRJVElPTihjYm9yX2l2LT5sZW5ndGggPT0gTlNpemUsIENPU0VfRVJSX0lOVkFMSURfUEFSQU1FVEVSKTsKKwkJbWVtY3B5KHJnYklWLCBjYm9yX2l2LT52LnN0ciwgY2Jvcl9pdi0+bGVuZ3RoKTsKKwl9CisKKwkvLyAgU2V0dXAgYW5kIHJ1biB0aGUgbWJlZFRMUyBjb2RlCisJCisJLy9jYktleSBjb21lcyBpbiBieXRlcyBub3QgYml0cworIAlDSEVDS19DT05ESVRJT04oIW1iZWR0bHNfY2NtX3NldGtleSgmY3R4LCBjaXBoZXIsIHBiS2V5LCBjYktleSo4KSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCQorCVRTaXplIC89IDg7IC8vIENvbWVzIGluIGluIGJpdHMgbm90IGJ5dGVzLgorCisJcmdiT3V0ID0gKGJ5dGUgKilDT1NFX0NBTExPQyhjYk91dCtUU2l6ZSwgMSwgY29udGV4dCk7CisJQ0hFQ0tfQ09ORElUSU9OKHJnYk91dCAhPSBOVUxMLCBDT1NFX0VSUl9PVVRfT0ZfTUVNT1JZKTsKKworCUNIRUNLX0NPTkRJVElPTighbWJlZHRsc19jY21fZW5jcnlwdF9hbmRfdGFnKCZjdHgsIHBjb3NlLT5jYkNvbnRlbnQsIHJnYklWLCBOU2l6ZSwgcGJBdXRoRGF0YSwgY2JBdXRoRGF0YSwgcGNvc2UtPnBiQ29udGVudCwgcmdiT3V0LCAmcmdiT3V0W3Bjb3NlLT5jYkNvbnRlbnRdLCBUU2l6ZSksIENPU0VfRVJSX0NSWVBUT19GQUlMKTsJCisKKwljblRtcCA9IGNuX2Nib3JfZGF0YV9jcmVhdGUocmdiT3V0LCAoaW50KXBjb3NlLT5jYkNvbnRlbnQgKyBUU2l6ZSwgQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BIE5VTEwpOworCUNIRUNLX0NPTkRJVElPTihjblRtcCAhPSBOVUxMLCBDT1NFX0VSUl9DQk9SKTsKKwlyZ2JPdXQgPSBOVUxMOworCisJQ0hFQ0tfQ09ORElUSU9OKF9DT1NFX2FycmF5X3JlcGxhY2UoJnBjb3NlLT5tX21lc3NhZ2UsIGNuVG1wLCBJTkRFWF9CT0RZLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgTlVMTCksIENPU0VfRVJSX0NCT1IpOworCWNuVG1wID0gTlVMTDsKKworCW1iZWR0bHNfY2NtX2ZyZWUoJmN0eCk7CisJCisJcmV0dXJuIHRydWU7CisKK2Vycm9yUmV0dXJuOgorCWlmIChwYklWICE9IE5VTEwpIENPU0VfRlJFRShwYklWLCBjb250ZXh0KTsKKwlpZiAoY2Jvcl9pdl90ICE9IE5VTEwpIENPU0VfRlJFRShjYm9yX2l2X3QsIGNvbnRleHQpOworCWlmIChyZ2JPdXQgIT0gTlVMTCkgQ09TRV9GUkVFKHJnYk91dCwgY29udGV4dCk7CisJaWYgKGNuVG1wICE9IE5VTEwpIENPU0VfRlJFRShjblRtcCwgY29udGV4dCk7CisJcHJpbnRmKCJlcnJvclJldHVybiBmcm9tIE9QRU5TU0xcbiIpOworCW1iZWR0bHNfY2NtX2ZyZWUoJmN0eCk7CisJcmV0dXJuIGZhbHNlOworfQorLyoKK2Jvb2wgQUVTX0dDTV9EZWNyeXB0KENPU0VfRW52ZWxvcGVkICogcGNvc2UsIGNvbnN0IGJ5dGUgKiBwYktleSwgc2l6ZV90IGNiS2V5LCBjb25zdCBieXRlICogcGJDcnlwdG8sIHNpemVfdCBjYkNyeXB0bywgY29uc3QgYnl0ZSAqIHBiQXV0aERhdGEsIHNpemVfdCBjYkF1dGhEYXRhLCBjb3NlX2VycmJhY2sgKiBwZXJyKQoreworCUVWUF9DSVBIRVJfQ1RYIGN0eDsKKwlpbnQgY2JPdXQ7CisJYnl0ZSAqIHJnYk91dCA9IE5VTEw7CisJaW50IG91dGwgPSAwOworCWJ5dGUgcmdiSVZbMTVdID0geyAwIH07CisJY29uc3QgY25fY2JvciAqIHBJViA9IE5VTEw7CisJY29uc3QgRVZQX0NJUEhFUiAqIGNpcGhlcjsKKyNpZmRlZiBVU0VfQ0JPUl9DT05URVhUCisJY25fY2Jvcl9jb250ZXh0ICogY29udGV4dCA9ICZwY29zZS0+bV9tZXNzYWdlLm1fYWxsb2NDb250ZXh0OworI2VuZGlmCisJaW50IFRTaXplID0gMTI4IC8gODsKKworCUVWUF9DSVBIRVJfQ1RYX2luaXQoJmN0eCk7CisKKwkvLyAgU2V0dXAgdGhlIElWL05vbmNlIGFuZCBwdXQgaXQgaW50byB0aGUgbWVzc2FnZQorCisJcElWID0gX0NPU0VfbWFwX2dldF9pbnQoJnBjb3NlLT5tX21lc3NhZ2UsIENPU0VfSGVhZGVyX0lWLCBDT1NFX0JPVEgsIE5VTEwpOworCWlmICgocElWID09IE5VTEwpIHx8IChwSVYtPnR5cGUgIT0gQ05fQ0JPUl9CWVRFUykpIHsKKwkJaWYgKHBlcnIgIT0gTlVMTCkgcGVyci0+ZXJyID0gQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVI7CisKKwllcnJvclJldHVybjoKKwkJaWYgKHJnYk91dCAhPSBOVUxMKSBDT1NFX0ZSRUUocmdiT3V0LCBjb250ZXh0KTsKKwkJRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmY3R4KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCUNIRUNLX0NPTkRJVElPTihwSVYtPmxlbmd0aCA9PSA5Ni84LCBDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUik7CisJbWVtY3B5KHJnYklWLCBwSVYtPnYuc3RyLCBwSVYtPmxlbmd0aCk7CisKKwkvLyAgU2V0dXAgYW5kIHJ1biB0aGUgT3BlblNTTCBjb2RlCisKKwlzd2l0Y2ggKGNiS2V5KSB7CisJY2FzZSAxMjggLyA4OgorCQljaXBoZXIgPSBFVlBfYWVzXzEyOF9nY20oKTsKKwkJYnJlYWs7CisKKwljYXNlIDE5MiAvIDg6CisJCWNpcGhlciA9IEVWUF9hZXNfMTkyX2djbSgpOworCQlicmVhazsKKworCWNhc2UgMjU2IC8gODoKKwkJY2lwaGVyID0gRVZQX2Flc18yNTZfZ2NtKCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRkFJTF9DT05ESVRJT04oQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVIpOworCQlicmVhazsKKwl9CisKKwkvLyAgRG8gdGhlIHNldHVwIGZvciBPcGVuU1NMCisKKwlDSEVDS19DT05ESVRJT04oRVZQX0RlY3J5cHRJbml0X2V4KCZjdHgsIGNpcGhlciwgTlVMTCwgTlVMTCwgTlVMTCksIENPU0VfRVJSX0RFQ1JZUFRfRkFJTEVEKTsKKworCUNIRUNLX0NPTkRJVElPTihFVlBfQ0lQSEVSX0NUWF9jdHJsKCZjdHgsIEVWUF9DVFJMX0NDTV9TRVRfVEFHLCBUU2l6ZSwgKHZvaWQgKikmcGJDcnlwdG9bY2JDcnlwdG8gLSBUU2l6ZV0pLCBDT1NFX0VSUl9ERUNSWVBUX0ZBSUxFRCk7CisKKwlDSEVDS19DT05ESVRJT04oRVZQX0RlY3J5cHRJbml0KCZjdHgsIDAsIHBiS2V5LCByZ2JJViksIENPU0VfRVJSX0RFQ1JZUFRfRkFJTEVEKTsKKwkKKwkvLyAgUHVzIGluIHRoZSBBQUQKKworCUNIRUNLX0NPTkRJVElPTihFVlBfRGVjcnlwdFVwZGF0ZSgmY3R4LCBOVUxMLCAmb3V0bCwgcGJBdXRoRGF0YSwgKGludCkgY2JBdXRoRGF0YSksIENPU0VfRVJSX0RFQ1JZUFRfRkFJTEVEKTsKKworCS8vICAKKworCWNiT3V0ID0gKGludCljYkNyeXB0byAtIFRTaXplOworCXJnYk91dCA9IChieXRlICopQ09TRV9DQUxMT0MoY2JPdXQsIDEsIGNvbnRleHQpOworCUNIRUNLX0NPTkRJVElPTihyZ2JPdXQgIT0gTlVMTCwgQ09TRV9FUlJfT1VUX09GX01FTU9SWSk7CisKKwkvLyAgUHJvY2VzcyBjb250ZW50CisKKwlDSEVDS19DT05ESVRJT04oRVZQX0RlY3J5cHRVcGRhdGUoJmN0eCwgcmdiT3V0LCAmY2JPdXQsIHBiQ3J5cHRvLCAoaW50KWNiQ3J5cHRvIC0gVFNpemUpLCBDT1NFX0VSUl9ERUNSWVBUX0ZBSUxFRCk7CisKKwkvLyAgUHJvY2VzcyBUYWcKKworCUNIRUNLX0NPTkRJVElPTihFVlBfQ0lQSEVSX0NUWF9jdHJsKCZjdHgsIEVWUF9DVFJMX0dDTV9TRVRfVEFHLCBUU2l6ZSwgKGJ5dGUgKilwYkNyeXB0byArIGNiQ3J5cHRvIC0gVFNpemUpLCBDT1NFX0VSUl9ERUNSWVBUX0ZBSUxFRCk7CisKKwkvLyAgQ2hlY2sgdGhlIHJlc3VsdAorCisJQ0hFQ0tfQ09ORElUSU9OKEVWUF9EZWNyeXB0RmluYWwoJmN0eCwgcmdiT3V0ICsgY2JPdXQsICZjYk91dCksIENPU0VfRVJSX0RFQ1JZUFRfRkFJTEVEKTsKKworCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisKKwlwY29zZS0+cGJDb250ZW50ID0gcmdiT3V0OworCXBjb3NlLT5jYkNvbnRlbnQgPSBjYk91dDsKKworCXJldHVybiB0cnVlOworfQorCitib29sIEFFU19HQ01fRW5jcnlwdChDT1NFX0VudmVsb3BlZCAqIHBjb3NlLCBjb25zdCBieXRlICogcGJLZXksIHNpemVfdCBjYktleSwgY29uc3QgYnl0ZSAqIHBiQXV0aERhdGEsIHNpemVfdCBjYkF1dGhEYXRhLCBjb3NlX2VycmJhY2sgKiBwZXJyKQoreworCUVWUF9DSVBIRVJfQ1RYIGN0eDsKKwlpbnQgY2JPdXQ7CisJYnl0ZSAqIHJnYk91dCA9IE5VTEw7CisJaW50IG91dGwgPSAwOworCWJ5dGUgcmdiSVZbMTZdID0geyAwIH07CisJYnl0ZSAqIHBiSVYgPSBOVUxMOworCWNvbnN0IGNuX2Nib3IgKiBjYm9yX2l2ID0gTlVMTDsKKwljbl9jYm9yICogY2Jvcl9pdl90ID0gTlVMTDsKKwljb25zdCBFVlBfQ0lQSEVSICogY2lwaGVyOworI2lmZGVmIFVTRV9DQk9SX0NPTlRFWFQKKwljbl9jYm9yX2NvbnRleHQgKiBjb250ZXh0ID0gJnBjb3NlLT5tX21lc3NhZ2UubV9hbGxvY0NvbnRleHQ7CisjZW5kaWYKKwljbl9jYm9yX2VycmJhY2sgY2Jvcl9lcnJvcjsKKworCS8vIE1ha2UgaXQgZmlyc3Qgc28gd2UgY2FuIGNsZWFuIGl0IHVwCisJRVZQX0NJUEhFUl9DVFhfaW5pdCgmY3R4KTsKKworCS8vICBTZXR1cCB0aGUgSVYvTm9uY2UgYW5kIHB1dCBpdCBpbnRvIHRoZSBtZXNzYWdlCisKKwljYm9yX2l2ID0gX0NPU0VfbWFwX2dldF9pbnQoJnBjb3NlLT5tX21lc3NhZ2UsIENPU0VfSGVhZGVyX0lWLCBDT1NFX0JPVEgsIHBlcnIpOworCWlmIChjYm9yX2l2ID09IE5VTEwpIHsKKwkJcGJJViA9IENPU0VfQ0FMTE9DKDk2LCAxLCBjb250ZXh0KTsKKwkJQ0hFQ0tfQ09ORElUSU9OKHBiSVYgIT0gTlVMTCwgQ09TRV9FUlJfT1VUX09GX01FTU9SWSk7CisJCXJhbmRfYnl0ZXMocGJJViwgOTYgLyA4KTsKKwkJbWVtY3B5KHJnYklWLCBwYklWLCA5NiAvIDgpOworCQljYm9yX2l2X3QgPSBjbl9jYm9yX2RhdGFfY3JlYXRlKHBiSVYsIDk2IC8gOCwgQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BICZjYm9yX2Vycm9yKTsKKwkJQ0hFQ0tfQ09ORElUSU9OX0NCT1IoY2Jvcl9pdl90ICE9IE5VTEwsIGNib3JfZXJyb3IpOworCQlwYklWID0gTlVMTDsKKworCQlpZiAoIV9DT1NFX21hcF9wdXQoJnBjb3NlLT5tX21lc3NhZ2UsIENPU0VfSGVhZGVyX0lWLCBjYm9yX2l2X3QsIENPU0VfVU5QUk9URUNUX09OTFksIHBlcnIpKSBnb3RvIGVycm9yUmV0dXJuOworCQljYm9yX2l2X3QgPSBOVUxMOworCX0KKwllbHNlIHsKKwkJQ0hFQ0tfQ09ORElUSU9OKGNib3JfaXYtPnR5cGUgPT0gQ05fQ0JPUl9CWVRFUywgQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVIpOworCQlDSEVDS19DT05ESVRJT04oY2Jvcl9pdi0+bGVuZ3RoID09IDk2IC8gOCwgQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVIpOworCQltZW1jcHkocmdiSVYsIGNib3JfaXYtPnYuc3RyLCBjYm9yX2l2LT5sZW5ndGgpOworCX0KKworCisJc3dpdGNoIChjYktleSo4KSB7CisJY2FzZSAxMjg6CisJCWNpcGhlciA9IEVWUF9hZXNfMTI4X2djbSgpOworCQlicmVhazsKKworCWNhc2UgMTkyOgorCQljaXBoZXIgPSBFVlBfYWVzXzE5Ml9nY20oKTsKKwkJYnJlYWs7CisKKwljYXNlIDI1NjoKKwkJY2lwaGVyID0gRVZQX2Flc18yNTZfZ2NtKCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRkFJTF9DT05ESVRJT04oQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVIpOworCQlicmVhazsKKwl9CisKKwkvLyAgU2V0dXAgYW5kIHJ1biB0aGUgT3BlblNTTCBjb2RlCisKKwlDSEVDS19DT05ESVRJT04oRVZQX0VuY3J5cHRJbml0X2V4KCZjdHgsIGNpcGhlciwgTlVMTCwgTlVMTCwgTlVMTCksIENPU0VfRVJSX0NSWVBUT19GQUlMKTsKKworCUNIRUNLX0NPTkRJVElPTihFVlBfRW5jcnlwdEluaXQoJmN0eCwgMCwgcGJLZXksIHJnYklWKSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCisJQ0hFQ0tfQ09ORElUSU9OKEVWUF9FbmNyeXB0VXBkYXRlKCZjdHgsIE5VTEwsICZvdXRsLCBwYkF1dGhEYXRhLCAoaW50KSBjYkF1dGhEYXRhKSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCisJcmdiT3V0ID0gKGJ5dGUgKilDT1NFX0NBTExPQyhwY29zZS0+Y2JDb250ZW50ICsgMTI4LzgsIDEsIGNvbnRleHQpOworCUNIRUNLX0NPTkRJVElPTihyZ2JPdXQgIT0gTlVMTCwgQ09TRV9FUlJfT1VUX09GX01FTU9SWSk7CisKKwlDSEVDS19DT05ESVRJT04oRVZQX0VuY3J5cHRVcGRhdGUoJmN0eCwgcmdiT3V0LCAmY2JPdXQsIHBjb3NlLT5wYkNvbnRlbnQsIChpbnQpcGNvc2UtPmNiQ29udGVudCksIENPU0VfRVJSX0NSWVBUT19GQUlMKTsKKworCUNIRUNLX0NPTkRJVElPTihFVlBfRW5jcnlwdEZpbmFsX2V4KCZjdHgsICZyZ2JPdXRbY2JPdXRdLCAmY2JPdXQpLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisKKwlDSEVDS19DT05ESVRJT04oRVZQX0NJUEhFUl9DVFhfY3RybCgmY3R4LCBFVlBfQ1RSTF9HQ01fR0VUX1RBRywgMTI4LzgsICZyZ2JPdXRbcGNvc2UtPmNiQ29udGVudF0pLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisKKwljbl9jYm9yICogY25UbXAgPSBjbl9jYm9yX2RhdGFfY3JlYXRlKHJnYk91dCwgKGludClwY29zZS0+Y2JDb250ZW50ICsgMTI4LzgsIENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSBOVUxMKTsKKwlDSEVDS19DT05ESVRJT04oY25UbXAgIT0gTlVMTCwgQ09TRV9FUlJfQ0JPUik7CisJcmdiT3V0ID0gTlVMTDsKKwlDSEVDS19DT05ESVRJT04oX0NPU0VfYXJyYXlfcmVwbGFjZSgmcGNvc2UtPm1fbWVzc2FnZSwgY25UbXAsIElOREVYX0JPRFksIENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSBOVUxMKSwgQ09TRV9FUlJfQ0JPUik7CisKKwlFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjdHgpOworCXJldHVybiB0cnVlOworCitlcnJvclJldHVybjoKKwlpZiAocGJJViAhPSBOVUxMKSBDT1NFX0ZSRUUocGJJViwgY29udGV4dCk7CisJaWYgKGNib3JfaXZfdCAhPSBOVUxMKSBDT1NFX0ZSRUUoY2Jvcl9pdl90LCBjb250ZXh0KTsKKwlpZiAocmdiT3V0ICE9IE5VTEwpIENPU0VfRlJFRShyZ2JPdXQsIGNvbnRleHQpOworCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisJcmV0dXJuIGZhbHNlOworfQorCisKK2Jvb2wgQUVTX0NCQ19NQUNfQ3JlYXRlKENPU0VfTWFjTWVzc2FnZSAqIHBjb3NlLCBpbnQgVFNpemUsIGNvbnN0IGJ5dGUgKiBwYktleSwgc2l6ZV90IGNiS2V5LCBjb25zdCBieXRlICogcGJBdXRoRGF0YSwgc2l6ZV90IGNiQXV0aERhdGEsIGNvc2VfZXJyYmFjayAqIHBlcnIpCit7CisJY29uc3QgRVZQX0NJUEhFUiAqIHBjaXBoZXIgPSBOVUxMOworCUVWUF9DSVBIRVJfQ1RYIGN0eDsKKwlpbnQgY2JPdXQ7CisJYnl0ZSByZ2JJVlsxNl0gPSB7IDAgfTsKKwlieXRlICogcmdiT3V0ID0gTlVMTDsKKwlib29sIGYgPSBmYWxzZTsKKwl1bnNpZ25lZCBpbnQgaTsKKwljbl9jYm9yICogY24gPSBOVUxMOworI2lmZGVmIFVTRV9DQk9SX0NPTlRFWFQKKwljbl9jYm9yX2NvbnRleHQgKiBjb250ZXh0ID0gJnBjb3NlLT5tX21lc3NhZ2UubV9hbGxvY0NvbnRleHQ7CisjZW5kaWYKKworCUVWUF9DSVBIRVJfQ1RYX2luaXQoJmN0eCk7CisKKwlyZ2JPdXQgPSBDT1NFX0NBTExPQygxNiwgMSwgY29udGV4dCk7CisJQ0hFQ0tfQ09ORElUSU9OKHJnYk91dCAhPSBOVUxMLCBDT1NFX0VSUl9PVVRfT0ZfTUVNT1JZKTsKKworCXN3aXRjaCAoY2JLZXkqOCkgeworCWNhc2UgMTI4OgorCQlwY2lwaGVyID0gRVZQX2Flc18xMjhfY2JjKCk7CisJCWJyZWFrOworCisJY2FzZSAyNTY6CisJCXBjaXBoZXIgPSBFVlBfYWVzXzI1Nl9jYmMoKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlGQUlMX0NPTkRJVElPTihDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUik7CisJfQorCisJLy8gIFNldHVwIGFuZCBydW4gdGhlIE9wZW5TU0wgY29kZQorCisJQ0hFQ0tfQ09ORElUSU9OKEVWUF9FbmNyeXB0SW5pdF9leCgmY3R4LCBwY2lwaGVyLCBOVUxMLCBwYktleSwgcmdiSVYpLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkIGludCljYkF1dGhEYXRhIC8gMTY7IGkrKykgeworCQlDSEVDS19DT05ESVRJT04oRVZQX0VuY3J5cHRVcGRhdGUoJmN0eCwgcmdiT3V0LCAmY2JPdXQsIHBiQXV0aERhdGEgKyAoaSAqIDE2KSwgMTYpLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisJfQorCWlmIChjYkF1dGhEYXRhICUgMTYgIT0gMCkgeworCQlDSEVDS19DT05ESVRJT04oRVZQX0VuY3J5cHRVcGRhdGUoJmN0eCwgcmdiT3V0LCAmY2JPdXQsIHBiQXV0aERhdGEgKyAoaSAqIDE2KSwgY2JBdXRoRGF0YSAlIDE2KSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCQlDSEVDS19DT05ESVRJT04oRVZQX0VuY3J5cHRVcGRhdGUoJmN0eCwgcmdiT3V0LCAmY2JPdXQsIHJnYklWLCAxNiAtIChjYkF1dGhEYXRhICUgMTYpKSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCX0KKworCWNuID0gY25fY2Jvcl9kYXRhX2NyZWF0ZShyZ2JPdXQsIFRTaXplIC8gOCwgQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BIE5VTEwpOworCUNIRUNLX0NPTkRJVElPTihjbiAhPSBOVUxMLCBDT1NFX0VSUl9PVVRfT0ZfTUVNT1JZKTsKKwlyZ2JPdXQgPSBOVUxMOworCisJQ0hFQ0tfQ09ORElUSU9OKF9DT1NFX2FycmF5X3JlcGxhY2UoJnBjb3NlLT5tX21lc3NhZ2UsIGNuLCBJTkRFWF9NQUNfVEFHLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgTlVMTCksIENPU0VfRVJSX0NCT1IpOworCWNuID0gTlVMTDsKKworCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisJcmV0dXJuICFmOworCitlcnJvclJldHVybjoKKwlpZiAocmdiT3V0ICE9IE5VTEwpIENPU0VfRlJFRShyZ2JPdXQsIGNvbnRleHQpOworCWlmIChjbiAhPSBOVUxMKSBDTl9DQk9SX0ZSRUUoY24sIGNvbnRleHQpOworCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisJcmV0dXJuIGZhbHNlOworfQorCitib29sIEFFU19DQkNfTUFDX1ZhbGlkYXRlKENPU0VfTWFjTWVzc2FnZSAqIHBjb3NlLCBpbnQgVFNpemUsIGNvbnN0IGJ5dGUgKiBwYktleSwgc2l6ZV90IGNiS2V5LCBjb25zdCBieXRlICogcGJBdXRoRGF0YSwgc2l6ZV90IGNiQXV0aERhdGEsIGNvc2VfZXJyYmFjayAqIHBlcnIpCit7CisJY29uc3QgRVZQX0NJUEhFUiAqIHBjaXBoZXIgPSBOVUxMOworCUVWUF9DSVBIRVJfQ1RYIGN0eDsKKwlpbnQgY2JPdXQ7CisJYnl0ZSByZ2JJVlsxNl0gPSB7IDAgfTsKKwlieXRlIHJnYlRhZ1sxNl0gPSB7IDAgfTsKKwlib29sIGYgPSBmYWxzZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXN3aXRjaCAoY2JLZXkqOCkgeworCWNhc2UgMTI4OgorCQlwY2lwaGVyID0gRVZQX2Flc18xMjhfY2JjKCk7CisJCWJyZWFrOworCisJY2FzZSAyNTY6CisJCXBjaXBoZXIgPSBFVlBfYWVzXzI1Nl9jYmMoKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlGQUlMX0NPTkRJVElPTihDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUik7CisJfQorCisJLy8gIFNldHVwIGFuZCBydW4gdGhlIE9wZW5TU0wgY29kZQorCisJRVZQX0NJUEhFUl9DVFhfaW5pdCgmY3R4KTsKKwlDSEVDS19DT05ESVRJT04oRVZQX0VuY3J5cHRJbml0X2V4KCZjdHgsIHBjaXBoZXIsIE5VTEwsIHBiS2V5LCByZ2JJViksIENPU0VfRVJSX0NSWVBUT19GQUlMKTsKKworCVRTaXplIC89IDg7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkIGludCkgY2JBdXRoRGF0YSAvIDE2OyBpKyspIHsKKwkJQ0hFQ0tfQ09ORElUSU9OKEVWUF9FbmNyeXB0VXBkYXRlKCZjdHgsIHJnYlRhZywgJmNiT3V0LCBwYkF1dGhEYXRhKyhpKjE2KSwgMTYpLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisJfQorCWlmIChjYkF1dGhEYXRhICUgMTYgIT0gMCkgeworCQlDSEVDS19DT05ESVRJT04oRVZQX0VuY3J5cHRVcGRhdGUoJmN0eCwgcmdiVGFnLCAmY2JPdXQsIHBiQXV0aERhdGEgKyAoaSAqIDE2KSwgY2JBdXRoRGF0YSAlIDE2KSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCQlDSEVDS19DT05ESVRJT04oRVZQX0VuY3J5cHRVcGRhdGUoJmN0eCwgcmdiVGFnLCAmY2JPdXQsIHJnYklWLCAxNiAtIChjYkF1dGhEYXRhICUgMTYpKSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCX0KKworCWNuX2Nib3IgKiBjbiA9IF9DT1NFX2FycmF5Z2V0X2ludCgmcGNvc2UtPm1fbWVzc2FnZSwgSU5ERVhfTUFDX1RBRyk7CisJQ0hFQ0tfQ09ORElUSU9OKGNuICE9IE5VTEwsIENPU0VfRVJSX0NCT1IpOworCisJZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpVFNpemU7IGkrKykgZiB8PSAoY24tPnYuYnl0ZXNbaV0gIT0gcmdiVGFnW2ldKTsKKworCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisJcmV0dXJuICFmOworCitlcnJvclJldHVybjoKKwlFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjdHgpOworCXJldHVybiBmYWxzZTsKK30KKworI2lmIDAKKy8vICBXZSBhcmUgZG9pbmcgQ0JDLU1BQyBub3QgQ01BQyBhdCB0aGlzIHRpbWUKK2Jvb2wgQUVTX0NNQUNfVmFsaWRhdGUoQ09TRV9NYWNNZXNzYWdlICogcGNvc2UsIGludCBLZXlTaXplLCBpbnQgVGFnU2l6ZSwgY29uc3QgYnl0ZSAqIHBiQXV0aERhdGEsIGludCBjYkF1dGhEYXRhLCBjb3NlX2VycmJhY2sgKiBwZXJyKQoreworCUNNQUNfQ1RYICogcGN0eCA9IE5VTEw7CisJY29uc3QgRVZQX0NJUEhFUiAqIHBjaXBoZXIgPSBOVUxMOworCWJ5dGUgKiByZ2JPdXQgPSBOVUxMOworCXNpemVfdCBjYk91dDsKKwlib29sIGYgPSBmYWxzZTsKKwl1bnNpZ25lZCBpbnQgaTsKKyNpZmRlZiBVU0VfQ0JPUl9DT05URVhUCisJY25fY2Jvcl9jb250ZXh0ICogY29udGV4dCA9ICZwY29zZS0+bV9tZXNzYWdlLm1fYWxsb2NDb250ZXh0OworI2VuZGlmCisKKwlwY3R4ID0gQ01BQ19DVFhfbmV3KCk7CisKKworCXN3aXRjaCAoS2V5U2l6ZSkgeworCWNhc2UgMTI4OiBwY2lwaGVyID0gRVZQX2Flc18xMjhfY2JjKCk7IGJyZWFrOworCWNhc2UgMjU2OiBwY2lwaGVyID0gRVZQX2Flc18yNTZfY2JjKCk7IGJyZWFrOworCWRlZmF1bHQ6IEZBSUxfQ09ORElUSU9OKENPU0VfRVJSX0lOVkFMSURfUEFSQU1FVEVSKTsgYnJlYWs7CisJfQorCisJcmdiT3V0ID0gQ09TRV9DQUxMT0MoMTI4LzgsIDEsIGNvbnRleHQpOworCUNIRUNLX0NPTkRJVElPTihyZ2JPdXQgIT0gTlVMTCwgQ09TRV9FUlJfT1VUX09GX01FTU9SWSk7CisKKwlDSEVDS19DT05ESVRJT04oQ01BQ19Jbml0KHBjdHgsIHBjb3NlLT5wYktleSwgcGNvc2UtPmNiS2V5LCBwY2lwaGVyLCBOVUxMICkgPT0gMSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCUNIRUNLX0NPTkRJVElPTihDTUFDX1VwZGF0ZShwY3R4LCBwYkF1dGhEYXRhLCBjYkF1dGhEYXRhKSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCUNIRUNLX0NPTkRJVElPTihDTUFDX0ZpbmFsKHBjdHgsIHJnYk91dCwgJmNiT3V0KSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCisJY25fY2JvciAqIGNuID0gX0NPU0VfYXJyYXlnZXRfaW50KCZwY29zZS0+bV9tZXNzYWdlLCBJTkRFWF9NQUNfVEFHKTsKKwlDSEVDS19DT05ESVRJT04oY24gIT0gTlVMTCwgQ09TRV9FUlJfQ0JPUik7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkIGludClUYWdTaXplIC8gODsgaSsrKSBmIHw9IChjbi0+di5ieXRlc1tpXSAhPSByZ2JPdXRbaV0pOworCisJQ09TRV9GUkVFKHJnYk91dCwgY29udGV4dCk7CisJQ01BQ19DVFhfY2xlYW51cChwY3R4KTsKKwlDTUFDX0NUWF9mcmVlKHBjdHgpOworCXJldHVybiAhZjsKKworZXJyb3JSZXR1cm46CisJQ09TRV9GUkVFKHJnYk91dCwgY29udGV4dCk7CisJQ01BQ19DVFhfY2xlYW51cChwY3R4KTsKKwlDTUFDX0NUWF9mcmVlKHBjdHgpOworCXJldHVybiBmYWxzZTsKKworfQorI2VuZGlmCisKK2Jvb2wgSEtERl9BRVNfRXhwYW5kKENPU0UgKiBwY29zZSwgc2l6ZV90IGNiaXRLZXksIGNvbnN0IGJ5dGUgKiBwYlBSSywgc2l6ZV90IGNiUFJLLCBjb25zdCBieXRlICogcGJJbmZvLCBzaXplX3QgY2JJbmZvLCBieXRlICogcGJPdXRwdXQsIHNpemVfdCBjYk91dHB1dCwgY29zZV9lcnJiYWNrICogcGVycikKK3sKKwljb25zdCBFVlBfQ0lQSEVSICogcGNpcGhlciA9IE5VTEw7CisJRVZQX0NJUEhFUl9DVFggY3R4OworCWludCBjYk91dDsKKwlieXRlIHJnYklWWzE2XSA9IHsgMCB9OworCWJ5dGUgYkNvdW50ID0gMTsKKwlzaXplX3QgaWI7CisJYnl0ZSByZ2JEaWdlc3RbMTI4IC8gOF07CisJaW50IGNiRGlnZXN0ID0gMDsKKwlieXRlIHJnYk91dFsxNl07CisKKwlFVlBfQ0lQSEVSX0NUWF9pbml0KCZjdHgpOworCisJc3dpdGNoIChjYml0S2V5KSB7CisJY2FzZSAxMjg6CisJCXBjaXBoZXIgPSBFVlBfYWVzXzEyOF9jYmMoKTsKKwkJYnJlYWs7CisKKwljYXNlIDI1NjoKKwkJcGNpcGhlciA9IEVWUF9hZXNfMjU2X2NiYygpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUZBSUxfQ09ORElUSU9OKENPU0VfRVJSX0lOVkFMSURfUEFSQU1FVEVSKTsKKwl9CisJQ0hFQ0tfQ09ORElUSU9OKGNiUFJLID09IGNiaXRLZXkgLyA4LCBDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUik7CisKKwkvLyAgU2V0dXAgYW5kIHJ1biB0aGUgT3BlblNTTCBjb2RlCisKKworCWZvciAoaWIgPSAwOyBpYiA8IGNiT3V0cHV0OyBpYiArPSAxNiwgYkNvdW50ICs9IDEpIHsKKwkJc2l6ZV90IGliMjsKKworCQlDSEVDS19DT05ESVRJT04oRVZQX0VuY3J5cHRJbml0X2V4KCZjdHgsIHBjaXBoZXIsIE5VTEwsIHBiUFJLLCByZ2JJViksIENPU0VfRVJSX0NSWVBUT19GQUlMKTsKKworCQlDSEVDS19DT05ESVRJT04oRVZQX0VuY3J5cHRVcGRhdGUoJmN0eCwgcmdiT3V0LCAmY2JPdXQsIHJnYkRpZ2VzdCwgY2JEaWdlc3QpLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisJCWZvciAoaWIyID0gMDsgaWIyIDwgY2JJbmZvOyBpYjIrPTE2KSB7CisJCQlDSEVDS19DT05ESVRJT04oRVZQX0VuY3J5cHRVcGRhdGUoJmN0eCwgcmdiT3V0LCAmY2JPdXQsIHBiSW5mbytpYjIsIChpbnQpIE1JTigxNiwgY2JJbmZvLWliMikpLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisJCX0KKwkJQ0hFQ0tfQ09ORElUSU9OKEVWUF9FbmNyeXB0VXBkYXRlKCZjdHgsIHJnYk91dCwgJmNiT3V0LCAmYkNvdW50LCAxKSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCQlpZiAoKGNiSW5mbyArIDEpICUgMTYgIT0gMCkgeworCQkJQ0hFQ0tfQ09ORElUSU9OKEVWUF9FbmNyeXB0VXBkYXRlKCZjdHgsIHJnYk91dCwgJmNiT3V0LCByZ2JJViwgKGludCkgMTYtKGNiSW5mbysxKSUxNiksIENPU0VfRVJSX0NSWVBUT19GQUlMKTsKKwkJfQorCQltZW1jcHkocmdiRGlnZXN0LCByZ2JPdXQsIGNiT3V0KTsKKwkJY2JEaWdlc3QgPSBjYk91dDsKKwkJbWVtY3B5KHBiT3V0cHV0ICsgaWIsIHJnYkRpZ2VzdCwgTUlOKDE2LCBjYk91dHB1dCAtIGliKSk7CisJfQorCisJRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmY3R4KTsKKwlyZXR1cm4gdHJ1ZTsKKworZXJyb3JSZXR1cm46CisJRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmY3R4KTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKworYm9vbCBIS0RGX0V4dHJhY3QoQ09TRSAqIHBjb3NlLCBjb25zdCBieXRlICogcGJLZXksIHNpemVfdCBjYktleSwgc2l6ZV90IGNiaXREaWdlc3QsIGJ5dGUgKiByZ2JEaWdlc3QsIHNpemVfdCAqIHBjYkRpZ2VzdCwgQ0JPUl9DT05URVhUX0NPTU1BIGNvc2VfZXJyYmFjayAqIHBlcnIpCit7CisJYnl0ZSByZ2JTYWx0W0VWUF9NQVhfTURfU0laRV0gPSB7IDAgfTsKKwlpbnQgY2JTYWx0OworCWNuX2Nib3IgKiBjblNhbHQ7CisJSE1BQ19DVFggY3R4OworCWNvbnN0IEVWUF9NRCAqIHBtZCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGNiRGlnZXN0OworCisJSE1BQ19DVFhfaW5pdCgmY3R4KTsKKworCWlmICgwKSB7CisJZXJyb3JSZXR1cm46CisJCUhNQUNfY2xlYW51cCgmY3R4KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXN3aXRjaCAoY2JpdERpZ2VzdCkgeworCWNhc2UgMjU2OiBwbWQgPSBFVlBfc2hhMjU2KCk7IGNiU2FsdCA9IDI1NiAvIDg7ICBicmVhazsKKwljYXNlIDM4NDogcG1kID0gRVZQX3NoYTM4NCgpOyBjYlNhbHQgPSAzODQgLyA4OyBicmVhazsKKwljYXNlIDUxMjogcG1kID0gRVZQX3NoYTUxMigpOyBjYlNhbHQgPSA1MTIgLyA4OyBicmVhazsKKwlkZWZhdWx0OiBGQUlMX0NPTkRJVElPTihDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUik7IGJyZWFrOworCX0KKworCWNuU2FsdCA9IF9DT1NFX21hcF9nZXRfaW50KHBjb3NlLCBDT1NFX0hlYWRlcl9IS0RGX3NhbHQsIENPU0VfQk9USCwgcGVycik7CisKKwlpZiAoY25TYWx0ICE9IE5VTEwpIHsKKwkJQ0hFQ0tfQ09ORElUSU9OKEhNQUNfSW5pdCgmY3R4LCBjblNhbHQtPnYuYnl0ZXMsIChpbnQpIGNuU2FsdC0+bGVuZ3RoLCBwbWQpLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisJfQorCWVsc2UgeworCQlDSEVDS19DT05ESVRJT04oSE1BQ19Jbml0KCZjdHgsIHJnYlNhbHQsIGNiU2FsdCwgcG1kKSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCX0KKwlDSEVDS19DT05ESVRJT04oSE1BQ19VcGRhdGUoJmN0eCwgcGJLZXksIChpbnQpY2JLZXkpLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisJQ0hFQ0tfQ09ORElUSU9OKEhNQUNfRmluYWwoJmN0eCwgcmdiRGlnZXN0LCAmY2JEaWdlc3QpLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisJKnBjYkRpZ2VzdCA9IGNiRGlnZXN0OworCUhNQUNfY2xlYW51cCgmY3R4KTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBIS0RGX0V4cGFuZChDT1NFICogcGNvc2UsIHNpemVfdCBjYml0RGlnZXN0LCBjb25zdCBieXRlICogcGJQUkssIHNpemVfdCBjYlBSSywgY29uc3QgYnl0ZSAqIHBiSW5mbywgc2l6ZV90IGNiSW5mbywgYnl0ZSAqIHBiT3V0cHV0LCBzaXplX3QgY2JPdXRwdXQsIGNvc2VfZXJyYmFjayAqIHBlcnIpCit7CisJSE1BQ19DVFggY3R4OworCWNvbnN0IEVWUF9NRCAqIHBtZCA9IE5VTEw7CisJc2l6ZV90IGliOworCWludCBjYlNhbHQ7CisJdW5zaWduZWQgaW50IGNiRGlnZXN0ID0gMDsKKwlieXRlIHJnYkRpZ2VzdFtFVlBfTUFYX01EX1NJWkVdOworCWJ5dGUgYkNvdW50ID0gMTsKKworCUhNQUNfQ1RYX2luaXQoJmN0eCk7CisKKwlpZiAoMCkgeworCWVycm9yUmV0dXJuOgorCQlITUFDX2NsZWFudXAoJmN0eCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlzd2l0Y2ggKGNiaXREaWdlc3QpIHsKKwljYXNlIDI1NjogcG1kID0gRVZQX3NoYTI1NigpOyBjYlNhbHQgPSAyNTYgLyA4OyAgYnJlYWs7CisJY2FzZSAzODQ6IHBtZCA9IEVWUF9zaGEzODQoKTsgY2JTYWx0ID0gMzg0IC8gODsgYnJlYWs7CisJY2FzZSA1MTI6IHBtZCA9IEVWUF9zaGE1MTIoKTsgY2JTYWx0ID0gNTEyIC8gODsgYnJlYWs7CisJZGVmYXVsdDogRkFJTF9DT05ESVRJT04oQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVIpOyBicmVhazsKKwl9CisKKworCWZvciAoaWIgPSAwOyBpYiA8IGNiT3V0cHV0OyBpYiArPSBjYkRpZ2VzdCwgYkNvdW50ICs9IDEpIHsKKwkJQ0hFQ0tfQ09ORElUSU9OKEhNQUNfSW5pdF9leCgmY3R4LCBwYlBSSywgKGludCljYlBSSywgcG1kLCBOVUxMKSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCQlDSEVDS19DT05ESVRJT04oSE1BQ19VcGRhdGUoJmN0eCwgcmdiRGlnZXN0LCBjYkRpZ2VzdCksIENPU0VfRVJSX0NSWVBUT19GQUlMKTsKKwkJQ0hFQ0tfQ09ORElUSU9OKEhNQUNfVXBkYXRlKCZjdHgsIHBiSW5mbywgY2JJbmZvKSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCQlDSEVDS19DT05ESVRJT04oSE1BQ19VcGRhdGUoJmN0eCwgJmJDb3VudCwgMSksIENPU0VfRVJSX0NSWVBUT19GQUlMKTsKKwkJQ0hFQ0tfQ09ORElUSU9OKEhNQUNfRmluYWwoJmN0eCwgcmdiRGlnZXN0LCAmY2JEaWdlc3QpLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisKKwkJbWVtY3B5KHBiT3V0cHV0ICsgaWIsIHJnYkRpZ2VzdCwgTUlOKGNiRGlnZXN0LCBjYk91dHB1dCAtIGliKSk7CisJfQorCisJSE1BQ19jbGVhbnVwKCZjdHgpOworCXJldHVybiB0cnVlOworCit9CisKK3ZvaWQgZHVtcF9vdXRwdXQoYnl0ZSogYiwgc2l6ZV90IHMpeworCWZvcihpbnQgaSA9IDA7IGkgPCBzOyBpKyspeworCQlwcmludGYoIiUwMngiLCAqYik7CisJCWIrKzsKKwl9CisJcHJpbnRmKCJcbiIpOworfQorCit2b2lkIGRpZmYodW5zaWduZWQgY2hhciogYSwgc2l6ZV90IGFfbCwgdW5zaWduZWQgY2hhciogYiwgc2l6ZV90IGJfbCl7CisJc2l6ZV90IHM7CisJcyA9IChhX2wgPCBiX2wpID8gYV9sIDogYl9sOworCXVuc2lnbmVkIGNoYXIqIHRtcCA9IGE7CisJcHJpbnRmKCJzaXplID0gJWRcbiIscyApOworLy8JcHJpbnRmKCIlMDJ4XG4iLCAqdG1wKTsKKwlpbnQgaTsKKwlmb3IoaSA9IDA7IGkgPCBzOyArK2kpeworCQlwcmludGYoIiUwMngiLCAqdG1wKTsKKwkJdG1wKys7CisJfQorCXByaW50ZigiXG4iKTsKKworCXRtcCA9IGI7CisJZm9yKGkgPSAwOyBpIDwgczsgKytpKXsKKwkJcHJpbnRmKCIlMDJ4IiwgKnRtcCk7CisJCXRtcCsrOworCX0KKwlwcmludGYoIlxuIik7CisKKwlmb3IoaSA9IDA7IGkgPCBzOyArK2kpeworCisJCWlmKCphICE9ICpiKXsKKwkJCXByaW50ZigiXl4iKTsKKworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJfXyIpOworCisJCX0KKworCQlhKys7CisJCWIrKzsKKwl9CisJcHJpbnRmKCJcbiIpOworfQorKi8KKworYm9vbCBITUFDX0NyZWF0ZShDT1NFX01hY01lc3NhZ2UgKiBwY29zZSwgaW50IEhTaXplLCBpbnQgVFNpemUsIGNvbnN0IGJ5dGUgKiBwYktleSwgc2l6ZV90IGNiS2V5LCBjb25zdCBieXRlICogcGJBdXRoRGF0YSwgc2l6ZV90IGNiQXV0aERhdGEsIGNvc2VfZXJyYmFjayAqIHBlcnIpCit7CisJYnl0ZSAqIHJnYk91dCA9IE5VTEw7CisvLwl1bnNpZ25lZCBpbnQgY2JPdXQ7CisJbWJlZHRsc19tZF9jb250ZXh0X3QgY29udHg7CisJY29uc3QgY2hhciogbWRfbmFtZTsKKwljb25zdCBzdHJ1Y3QgbWJlZHRsc19tZF9pbmZvX3QgKiBpbmZvOworCisjaWZkZWYgVVNFX0NCT1JfQ09OVEVYVAorCWNuX2Nib3JfY29udGV4dCAqIGNvbnRleHQgPSAmcGNvc2UtPm1fbWVzc2FnZS5tX2FsbG9jQ29udGV4dDsKKyNlbmRpZgorCisJc3dpdGNoIChIU2l6ZSkgeworCQljYXNlIDI1NjogbWRfbmFtZSA9ICJTSEEyNTYiOyBicmVhazsKKwkJY2FzZSAzODQ6IG1kX25hbWUgPSAiU0hBMzg0IjsgYnJlYWs7CisJCWNhc2UgNTEyOiBtZF9uYW1lID0gIlNIQTUxMiI7IGJyZWFrOworCQlkZWZhdWx0OiBGQUlMX0NPTkRJVElPTihDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUik7IGJyZWFrOworCX0KKworCWlmICgwKSB7CisJZXJyb3JSZXR1cm46CisJCUNPU0VfRlJFRShyZ2JPdXQsIGNvbnRleHQpOworCQltYmVkdGxzX21kX2ZyZWUoJmNvbnR4KTsgCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwltYmVkdGxzX21kX2luaXQoJmNvbnR4KTsKKwlpbmZvID0gbWJlZHRsc19tZF9pbmZvX2Zyb21fc3RyaW5nIChtZF9uYW1lKTsKKwltYmVkdGxzX21kX3NldHVwKCAmY29udHgsIGluZm8sIDEgKTsKKworCXJnYk91dCA9IENPU0VfQ0FMTE9DKG1iZWR0bHNfbWRfZ2V0X3NpemUoaW5mbyksIDEsIGNvbnRleHQpOworCUNIRUNLX0NPTkRJVElPTihyZ2JPdXQgIT0gTlVMTCwgQ09TRV9FUlJfT1VUX09GX01FTU9SWSk7CisKKwlDSEVDS19DT05ESVRJT04oIShtYmVkdGxzX21kX2htYWNfc3RhcnRzICgmY29udHgsIChjaGFyKilwYktleSwgY2JLZXkpKSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCUNIRUNLX0NPTkRJVElPTighKG1iZWR0bHNfbWRfaG1hY191cGRhdGUgKCZjb250eCwgcGJBdXRoRGF0YSwgY2JBdXRoRGF0YSkpLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisJQ0hFQ0tfQ09ORElUSU9OKCEobWJlZHRsc19tZF9obWFjX2ZpbmlzaCAoJmNvbnR4LCByZ2JPdXQpKSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCisJQ0hFQ0tfQ09ORElUSU9OKF9DT1NFX2FycmF5X3JlcGxhY2UoJnBjb3NlLT5tX21lc3NhZ2UsIGNuX2Nib3JfZGF0YV9jcmVhdGUocmdiT3V0LCBUU2l6ZSAvIDgsIENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSBOVUxMKSwgSU5ERVhfTUFDX1RBRywgQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BIE5VTEwpLCBDT1NFX0VSUl9DQk9SKTsKKworCW1iZWR0bHNfbWRfZnJlZSgmY29udHgpOyAKKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBITUFDX1ZhbGlkYXRlKENPU0VfTWFjTWVzc2FnZSAqIHBjb3NlLCBpbnQgSFNpemUsIGludCBUU2l6ZSwgY29uc3QgYnl0ZSAqIHBiS2V5LCBzaXplX3QgY2JLZXksIGNvbnN0IGJ5dGUgKiBwYkF1dGhEYXRhLCBzaXplX3QgY2JBdXRoRGF0YSwgY29zZV9lcnJiYWNrICogcGVycikKK3sKKwltYmVkdGxzX21kX2NvbnRleHRfdCBjb250eDsKKwljb25zdCBjaGFyKiBtZF9uYW1lOworCWNvbnN0IHN0cnVjdCBtYmVkdGxzX21kX2luZm9fdCAqIGluZm87CisJYnl0ZSAqIHJnYk91dCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGNiT3V0OworCWJvb2wgZiA9IGZhbHNlOworCXVuc2lnbmVkIGludCBpOworCisjaWZkZWYgVVNFX0NCT1JfQ09OVEVYVAorCWNuX2Nib3JfY29udGV4dCAqIGNvbnRleHQgPSAmcGNvc2UtPm1fbWVzc2FnZS5tX2FsbG9jQ29udGV4dDsKKyNlbmRpZgorCisJc3dpdGNoIChIU2l6ZSkgeworCQljYXNlIDI1NjogbWRfbmFtZSA9ICJTSEEyNTYiOyBicmVhazsKKwkJY2FzZSAzODQ6IG1kX25hbWUgPSAiU0hBMzg0IjsgYnJlYWs7CisJCWNhc2UgNTEyOiBtZF9uYW1lID0gIlNIQTUxMiI7IGJyZWFrOworCQlkZWZhdWx0OiBGQUlMX0NPTkRJVElPTihDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUik7IGJyZWFrOworCX0KKworCW1iZWR0bHNfbWRfaW5pdCgmY29udHgpOworCWluZm8gPSBtYmVkdGxzX21kX2luZm9fZnJvbV9zdHJpbmcgKG1kX25hbWUpOworCW1iZWR0bHNfbWRfc2V0dXAoICZjb250eCwgaW5mbywgMSApOworCQorCWNiT3V0ID0gbWJlZHRsc19tZF9nZXRfc2l6ZShpbmZvKTsKKwlyZ2JPdXQgPSBDT1NFX0NBTExPQyhjYk91dCwgMSwgY29udGV4dCk7CisJQ0hFQ0tfQ09ORElUSU9OKHJnYk91dCAhPSBOVUxMLCBDT1NFX0VSUl9PVVRfT0ZfTUVNT1JZKTsKKworCUNIRUNLX0NPTkRJVElPTighKG1iZWR0bHNfbWRfaG1hY19zdGFydHMgKCZjb250eCwgKGNoYXIqKXBiS2V5LCBjYktleSkpLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisJQ0hFQ0tfQ09ORElUSU9OKCEobWJlZHRsc19tZF9obWFjX3VwZGF0ZSAoJmNvbnR4LCBwYkF1dGhEYXRhLCBjYkF1dGhEYXRhKSksIENPU0VfRVJSX0NSWVBUT19GQUlMKTsKKwlDSEVDS19DT05ESVRJT04oIShtYmVkdGxzX21kX2htYWNfZmluaXNoICgmY29udHgsIHJnYk91dCkpLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisKKwljbl9jYm9yICogY24gPSBfQ09TRV9hcnJheWdldF9pbnQoJnBjb3NlLT5tX21lc3NhZ2UsIElOREVYX01BQ19UQUcpOworCUNIRUNLX0NPTkRJVElPTihjbiAhPSBOVUxMLCBDT1NFX0VSUl9DQk9SKTsKKworCWlmIChjbi0+bGVuZ3RoID4gKGludCkgY2JPdXQpIHJldHVybiBmYWxzZTsKKwlmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkIGludCkgVFNpemUvODsgaSsrKSBmIHw9IChjbi0+di5ieXRlc1tpXSAhPSByZ2JPdXRbaV0pOworCisJbWJlZHRsc19tZF9mcmVlKCZjb250eCk7IAorCXJldHVybiAhZjsKKworZXJyb3JSZXR1cm46CisJQ09TRV9GUkVFKHJnYk91dCwgY29udGV4dCk7CisJbWJlZHRsc19tZF9mcmVlKCZjb250eCk7IAorCXJldHVybiBmYWxzZTsKK30KKy8qCisKKyNkZWZpbmUgQ09TRV9LZXlfRUNfQ3VydmUgLTEKKyNkZWZpbmUgQ09TRV9LZXlfRUNfWCAtMgorI2RlZmluZSBDT1NFX0tleV9FQ19ZIC0zCisjZGVmaW5lIENPU0VfS2V5X0VDX2QgLTQKKworRUNfS0VZICogRUNLZXlfRnJvbShjb25zdCBjbl9jYm9yICogcEtleSwgaW50ICogY2JHcm91cCwgY29zZV9lcnJiYWNrICogcGVycikKK3sKKwlFQ19LRVkgKiBwTmV3S2V5ID0gRUNfS0VZX25ldygpOworCWJ5dGUgIHJnYktleVs1MTIrMV07CisJaW50IGNiS2V5OworCWNvbnN0IGNuX2Nib3IgKiBwOworCWludCBuaWRHcm91cCA9IC0xOworCUVDX1BPSU5UICogcFBvaW50ID0gTlVMTDsKKworCXAgPSBjbl9jYm9yX21hcGdldF9pbnQocEtleSwgQ09TRV9LZXlfRUNfQ3VydmUpOworCUNIRUNLX0NPTkRJVElPTihwICE9IE5VTEwsIENPU0VfRVJSX0lOVkFMSURfUEFSQU1FVEVSKTsKKworCXN3aXRjaCAocC0+di5zaW50KSB7CisJY2FzZSAxOiAvLyBQLTI1NgorCQluaWRHcm91cCA9IE5JRF9YOV82Ml9wcmltZTI1NnYxOworCQkqY2JHcm91cCA9IDI1NiAvIDg7CisJCWJyZWFrOworCisJY2FzZSAyOiAvLyBQLTM4NAorCQluaWRHcm91cCA9IE5JRF9zZWNwMzg0cjE7CisJCSpjYkdyb3VwID0gMzg0IC8gODsKKwkJYnJlYWs7CisKKwljYXNlIDM6IC8vIFAtNTIxCisJCW5pZEdyb3VwID0gTklEX3NlY3A1MjFyMTsKKwkJKmNiR3JvdXAgPSAoNTIxICsgNykgLyA4OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUZBSUxfQ09ORElUSU9OKENPU0VfRVJSX0lOVkFMSURfUEFSQU1FVEVSKTsKKwl9CisKKwlFQ19HUk9VUCAqIGVjZ3JvdXAgPSBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZShuaWRHcm91cCk7CisJQ0hFQ0tfQ09ORElUSU9OKGVjZ3JvdXAgIT0gTlVMTCwgQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVIpOworCUNIRUNLX0NPTkRJVElPTihFQ19LRVlfc2V0X2dyb3VwKHBOZXdLZXksIGVjZ3JvdXApID09IDEsIENPU0VfRVJSX0NSWVBUT19GQUlMKTsKKworCXAgPSBjbl9jYm9yX21hcGdldF9pbnQocEtleSwgQ09TRV9LZXlfRUNfWCk7CisJQ0hFQ0tfQ09ORElUSU9OKChwICE9IE5VTEwpICYmIChwLT50eXBlID09IENOX0NCT1JfQllURVMpLCBDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUik7CisJQ0hFQ0tfQ09ORElUSU9OKHAtPmxlbmd0aCA9PSAqY2JHcm91cCwgQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVIpOworCW1lbWNweShyZ2JLZXkrMSwgcC0+di5zdHIsIHAtPmxlbmd0aCk7CisJCisKKwlwID0gY25fY2Jvcl9tYXBnZXRfaW50KHBLZXksIENPU0VfS2V5X0VDX1kpOworCUNIRUNLX0NPTkRJVElPTigocCAhPSBOVUxMKSwgQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVIpOworCWlmIChwLT50eXBlID09IENOX0NCT1JfQllURVMpIHsKKwkJcmdiS2V5WzBdID0gUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQ7CisJCWNiS2V5ID0gKCpjYkdyb3VwICogMikgKyAxOworCQlDSEVDS19DT05ESVRJT04ocC0+bGVuZ3RoID09ICpjYkdyb3VwLCBDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUik7CisJCW1lbWNweShyZ2JLZXkgKyBwLT5sZW5ndGggKyAxLCBwLT52LnN0ciwgcC0+bGVuZ3RoKTsKKwl9CisJZWxzZSBpZiAocC0+dHlwZSA9PSBDTl9DQk9SX1RSVUUpIHsKKwkJY2JLZXkgPSAoKmNiR3JvdXApICsgMTsKKwkJcmdiS2V5WzBdID0gUE9JTlRfQ09OVkVSU0lPTl9DT01QUkVTU0VEICsgMTsKKwl9CisJZWxzZSBpZiAocC0+dHlwZSA9PSBDTl9DQk9SX0ZBTFNFKSB7CisJCWNiS2V5ID0gKCpjYkdyb3VwKSArIDE7CisJCXJnYktleVswXSA9IFBPSU5UX0NPTlZFUlNJT05fQ09NUFJFU1NFRDsKKwl9CisJZWxzZSBGQUlMX0NPTkRJVElPTihDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUik7CisKKwlwUG9pbnQgPSBFQ19QT0lOVF9uZXcoZWNncm91cCk7CisJQ0hFQ0tfQ09ORElUSU9OKHBQb2ludCAhPSBOVUxMLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisJQ0hFQ0tfQ09ORElUSU9OKEVDX1BPSU5UX29jdDJwb2ludChlY2dyb3VwLCBwUG9pbnQsIHJnYktleSwgY2JLZXksIE5VTEwpID09IDEsIENPU0VfRVJSX0NSWVBUT19GQUlMKTsKKwlDSEVDS19DT05ESVRJT04oRUNfS0VZX3NldF9wdWJsaWNfa2V5KHBOZXdLZXksIHBQb2ludCkgPT0gMSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCisJcCA9IGNuX2Nib3JfbWFwZ2V0X2ludChwS2V5LCBDT1NFX0tleV9FQ19kKTsKKwlpZiAocCAhPSBOVUxMKSB7CisJCUJJR05VTSAqIHBibjsKKworCQlwYm4gPSBCTl9iaW4yYm4ocC0+di5ieXRlcywgKGludCkgcC0+bGVuZ3RoLCBOVUxMKTsKKwkJQ0hFQ0tfQ09ORElUSU9OKHBibiAhPSBOVUxMLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisJCUNIRUNLX0NPTkRJVElPTihFQ19LRVlfc2V0X3ByaXZhdGVfa2V5KHBOZXdLZXksIHBibikgPT0gMSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCX0KKwkKKwlyZXR1cm4gcE5ld0tleTsKKworZXJyb3JSZXR1cm46CisJaWYgKHBOZXdLZXkgIT0gTlVMTCkgRUNfS0VZX2ZyZWUocE5ld0tleSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2NuX2Nib3IgKiBFQ19Gcm9tS2V5KGNvbnN0IEVDX0tFWSAqIHBLZXksIENCT1JfQ09OVEVYVF9DT01NQSBjb3NlX2VycmJhY2sgKiBwZXJyKQoreworCWNuX2Nib3IgKiBwa2V5ID0gTlVMTDsKKwljb25zdCBFQ19HUk9VUCAqIHBncm91cDsKKwlpbnQgY29zZV9ncm91cDsKKwljbl9jYm9yICogcCA9IE5VTEw7CisJY25fY2Jvcl9lcnJiYWNrIGNib3JfZXJyb3I7CisJY29uc3QgRUNfUE9JTlQgKiBwUG9pbnQ7CisJc2l6ZV90IGNiU2l6ZTsKKwlieXRlICogcGJPdXQgPSBOVUxMOworCisJcGdyb3VwID0gRUNfS0VZX2dldDBfZ3JvdXAocEtleSk7CisJQ0hFQ0tfQ09ORElUSU9OKHBncm91cCAhPSBOVUxMLCBDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUik7CisKKwlzd2l0Y2ggKEVDX0dST1VQX2dldF9jdXJ2ZV9uYW1lKHBncm91cCkpIHsKKwljYXNlIE5JRF9YOV82Ml9wcmltZTI1NnYxOgkJY29zZV9ncm91cCA9IDE7CQlicmVhazsKKwljYXNlIE5JRF9zZWNwMzg0cjE6IGNvc2VfZ3JvdXAgPSAyOyBicmVhazsKKwljYXNlIE5JRF9zZWNwNTIxcjE6IGNvc2VfZ3JvdXAgPSAzOyBicmVhazsKKworCWRlZmF1bHQ6CisJCUZBSUxfQ09ORElUSU9OKENPU0VfRVJSX0lOVkFMSURfUEFSQU1FVEVSKTsKKwl9CisKKwlwa2V5ID0gY25fY2Jvcl9tYXBfY3JlYXRlKENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSAmY2Jvcl9lcnJvcik7CisJQ0hFQ0tfQ09ORElUSU9OX0NCT1IocGtleSAhPSBOVUxMLCBjYm9yX2Vycm9yKTsKKworCXAgPSBjbl9jYm9yX2ludF9jcmVhdGUoY29zZV9ncm91cCwgQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BICZjYm9yX2Vycm9yKTsKKwlDSEVDS19DT05ESVRJT05fQ0JPUihwICE9IE5VTEwsIGNib3JfZXJyb3IpOworCUNIRUNLX0NPTkRJVElPTl9DQk9SKGNuX2Nib3JfbWFwcHV0X2ludChwa2V5LCBDT1NFX0tleV9FQ19DdXJ2ZSwgcCwgQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BICZjYm9yX2Vycm9yKSwgY2Jvcl9lcnJvcik7CisJcCA9IE5VTEw7CisKKwlwUG9pbnQgPSBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KHBLZXkpOworCUNIRUNLX0NPTkRJVElPTihwUG9pbnQgIT0gTlVMTCwgQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVIpOworCisJaWYgKEZVc2VDb21wcmVzc2VkKSB7CisJCWNiU2l6ZSA9IEVDX1BPSU5UX3BvaW50Mm9jdChwZ3JvdXAsIHBQb2ludCwgUE9JTlRfQ09OVkVSU0lPTl9DT01QUkVTU0VELCBOVUxMLCAwLCBOVUxMKTsKKwkJQ0hFQ0tfQ09ORElUSU9OKGNiU2l6ZSA+IDAsIENPU0VfRVJSX0NSWVBUT19GQUlMKTsKKwkJcGJPdXQgPSBDT1NFX0NBTExPQyhjYlNpemUsIDEsIGNvbnRleHQpOworCQlDSEVDS19DT05ESVRJT04ocGJPdXQgIT0gTlVMTCwgQ09TRV9FUlJfT1VUX09GX01FTU9SWSk7CisJCUNIRUNLX0NPTkRJVElPTihFQ19QT0lOVF9wb2ludDJvY3QocGdyb3VwLCBwUG9pbnQsIFBPSU5UX0NPTlZFUlNJT05fQ09NUFJFU1NFRCwgcGJPdXQsIGNiU2l6ZSwgTlVMTCkgPT0gY2JTaXplLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisJfQorCWVsc2UgeworCQljYlNpemUgPSBFQ19QT0lOVF9wb2ludDJvY3QocGdyb3VwLCBwUG9pbnQsIFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VELCBOVUxMLCAwLCBOVUxMKTsKKwkJQ0hFQ0tfQ09ORElUSU9OKGNiU2l6ZSA+IDAsIENPU0VfRVJSX0NSWVBUT19GQUlMKTsKKwkJcGJPdXQgPSBDT1NFX0NBTExPQyhjYlNpemUsIDEsIGNvbnRleHQpOworCQlDSEVDS19DT05ESVRJT04ocGJPdXQgIT0gTlVMTCwgQ09TRV9FUlJfT1VUX09GX01FTU9SWSk7CisJCUNIRUNLX0NPTkRJVElPTihFQ19QT0lOVF9wb2ludDJvY3QocGdyb3VwLCBwUG9pbnQsIFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VELCBwYk91dCwgY2JTaXplLCBOVUxMKSA9PSBjYlNpemUsIENPU0VfRVJSX0NSWVBUT19GQUlMKTsKKwl9CisJcCA9IGNuX2Nib3JfZGF0YV9jcmVhdGUocGJPdXQrMSwgKGludCkgKGNiU2l6ZSAvIDIpLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgJmNib3JfZXJyb3IpOworCUNIRUNLX0NPTkRJVElPTl9DQk9SKHAgIT0gTlVMTCwgY2Jvcl9lcnJvcik7CisJQ0hFQ0tfQ09ORElUSU9OX0NCT1IoY25fY2Jvcl9tYXBwdXRfaW50KHBrZXksIENPU0VfS2V5X0VDX1gsIHAsIENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSAmY2Jvcl9lcnJvciksIGNib3JfZXJyb3IpOworCXAgPSBOVUxMOworCisJaWYgKEZVc2VDb21wcmVzc2VkKSB7CisJCXAgPSBjbl9jYm9yX2Jvb2xfY3JlYXRlKHBiT3V0WzBdICYgMSwgQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BICZjYm9yX2Vycm9yKTsKKwkJQ0hFQ0tfQ09ORElUSU9OX0NCT1IocCAhPSBOVUxMLCBjYm9yX2Vycm9yKTsKKwkJQ0hFQ0tfQ09ORElUSU9OX0NCT1IoY25fY2Jvcl9tYXBwdXRfaW50KHBrZXksIENPU0VfS2V5X0VDX1ksIHAsIENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSAmY2Jvcl9lcnJvciksIGNib3JfZXJyb3IpOworCQlwID0gTlVMTDsKKwl9CisJZWxzZSB7CisJCXAgPSBjbl9jYm9yX2RhdGFfY3JlYXRlKHBiT3V0ICsgY2JTaXplIC8gMiArIDEsIChpbnQpKGNiU2l6ZSAvIDIpLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgJmNib3JfZXJyb3IpOworCQlwYk91dCA9IE5VTEw7ICAgLy8gSXQgaXMgYWxyZWFkeSBwYXJ0IG9mIHRoZSBvdGhlciBvbmUuCisJCUNIRUNLX0NPTkRJVElPTl9DQk9SKHAgIT0gTlVMTCwgY2Jvcl9lcnJvcik7CisJCUNIRUNLX0NPTkRJVElPTl9DQk9SKGNuX2Nib3JfbWFwcHV0X2ludChwa2V5LCBDT1NFX0tleV9FQ19ZLCBwLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgJmNib3JfZXJyb3IpLCBjYm9yX2Vycm9yKTsKKwkJcCA9IE5VTEw7CisJfQorCisJcCA9IGNuX2Nib3JfaW50X2NyZWF0ZShDT1NFX0tleV9UeXBlX0VDMiwgQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BICZjYm9yX2Vycm9yKTsKKwlDSEVDS19DT05ESVRJT05fQ0JPUihwICE9IE5VTEwsIGNib3JfZXJyb3IpOworCUNIRUNLX0NPTkRJVElPTl9DQk9SKGNuX2Nib3JfbWFwcHV0X2ludChwa2V5LCBDT1NFX0tleV9UeXBlLCBwLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgJmNib3JfZXJyb3IpLCBjYm9yX2Vycm9yKTsKKwlwID0gTlVMTDsKKworcmV0dXJuSGVyZToKKwlpZiAocGJPdXQgIT0gTlVMTCkgQ09TRV9GUkVFKHBiT3V0LCBjb250ZXh0KTsKKwlpZiAocCAhPSBOVUxMKSBDTl9DQk9SX0ZSRUUocCwgY29udGV4dCk7CisJcmV0dXJuIHBrZXk7CisKK2Vycm9yUmV0dXJuOgorCUNOX0NCT1JfRlJFRShwa2V5LCBjb250ZXh0KTsKKwlwa2V5ID0gTlVMTDsKKwlnb3RvIHJldHVybkhlcmU7Cit9CisqLworLyoKK2Jvb2wgRUNEU0FfU2lnbihjb25zdCBjbl9jYm9yICogcEtleSkKK3sKKwlieXRlICogZGlnZXN0ID0gTlVMTDsKKwlpbnQgZGlnZXN0TGVuID0gMDsKKwlFQ0RTQV9TSUcgKiBzaWc7CisKKwlFQ19LRVkgKiBlY2tleSA9IEVDS2V5X0Zyb20ocEtleSk7CisKKwlzaWcgPSBFQ0RTQV9kb19zaWduKGRpZ2VzdCwgZGlnZXN0TGVuLCBlY2tleSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKyovCisvKgorYm9vbCBFQ0RTQV9TaWduKENPU0UgKiBwU2lnbmVyLCBpbnQgaW5kZXgsIGNvbnN0IGNuX2Nib3IgKiBwS2V5LCBpbnQgY2JpdERpZ2VzdCwgY29uc3QgYnl0ZSAqIHJnYlRvU2lnbiwgc2l6ZV90IGNiVG9TaWduLCBjb3NlX2VycmJhY2sgKiBwZXJyKQoreworCUVDX0tFWSAqIGVja2V5ID0gTlVMTDsKKwlieXRlIHJnYkRpZ2VzdFtFVlBfTUFYX01EX1NJWkVdOworCXVuc2lnbmVkIGludCBjYkRpZ2VzdCA9IHNpemVvZihyZ2JEaWdlc3QpOworCWJ5dGUgICogcGJTaWcgPSBOVUxMOworCWNvbnN0IEVWUF9NRCAqIGRpZ2VzdDsKKyNpZmRlZiBVU0VfQ0JPUl9DT05URVhUCisJY25fY2Jvcl9jb250ZXh0ICogY29udGV4dCA9ICZwU2lnbmVyLT5tX2FsbG9jQ29udGV4dDsKKyNlbmRpZgorCWNuX2Nib3IgKiBwID0gTlVMTDsKKwlFQ0RTQV9TSUcgKiBwc2lnID0gTlVMTDsKKwljbl9jYm9yX2VycmJhY2sgY2Jvcl9lcnJvcjsKKwlpbnQgY2JSOworCWJ5dGUgcmdiU2lnWzY2XTsKKwlpbnQgY2I7CisJCisJZWNrZXkgPSBFQ0tleV9Gcm9tKHBLZXksICZjYlIsIHBlcnIpOworCWlmIChlY2tleSA9PSBOVUxMKSB7CisJZXJyb3JSZXR1cm46CisJCWlmIChwYlNpZyAhPSBOVUxMKSBDT1NFX0ZSRUUocGJTaWcsIGNvbnRleHQpOworCQlpZiAocCAhPSBOVUxMKSBDTl9DQk9SX0ZSRUUocCwgY29udGV4dCk7CisJCWlmIChlY2tleSAhPSBOVUxMKSBFQ19LRVlfZnJlZShlY2tleSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlzd2l0Y2ggKGNiaXREaWdlc3QpIHsKKwljYXNlIDI1NjogZGlnZXN0ID0gRVZQX3NoYTI1NigpOyBicmVhazsKKwljYXNlIDUxMjogZGlnZXN0ID0gRVZQX3NoYTUxMigpOyBicmVhazsKKwljYXNlIDM4NDogZGlnZXN0ID0gRVZQX3NoYTM4NCgpOyBicmVhazsKKwlkZWZhdWx0OgorCQlGQUlMX0NPTkRJVElPTihDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUik7CisJfQorCisJRVZQX0RpZ2VzdChyZ2JUb1NpZ24sIGNiVG9TaWduLCByZ2JEaWdlc3QsICZjYkRpZ2VzdCwgZGlnZXN0LCBOVUxMKTsKKworCXBzaWcgPSBFQ0RTQV9kb19zaWduKHJnYkRpZ2VzdCwgY2JEaWdlc3QsIGVja2V5KTsKKwlDSEVDS19DT05ESVRJT04ocHNpZyAhPSBOVUxMLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisKKwlwYlNpZyA9IENPU0VfQ0FMTE9DKGNiUiwgMiwgY29udGV4dCk7CisJQ0hFQ0tfQ09ORElUSU9OKHBiU2lnICE9IE5VTEwsIENPU0VfRVJSX09VVF9PRl9NRU1PUlkpOworCisJY2IgPSBCTl9ibjJiaW4ocHNpZy0+ciwgcmdiU2lnKTsKKwlDSEVDS19DT05ESVRJT04oY2IgPD0gY2JSLCBDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUik7CisJbWVtY3B5KHBiU2lnICsgY2JSIC0gY2IsIHJnYlNpZywgY2IpOworCisJY2IgPSBCTl9ibjJiaW4ocHNpZy0+cywgcmdiU2lnKTsKKwlDSEVDS19DT05ESVRJT04oY2IgPD0gY2JSLCBDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUik7CisJbWVtY3B5KHBiU2lnICsgMipjYlIgLSBjYiwgcmdiU2lnLCBjYik7CisKKwlwID0gY25fY2Jvcl9kYXRhX2NyZWF0ZShwYlNpZywgY2JSKjIsIENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSAmY2Jvcl9lcnJvcik7CisJQ0hFQ0tfQ09ORElUSU9OX0NCT1IocCAhPSBOVUxMLCBjYm9yX2Vycm9yKTsKKworCUNIRUNLX0NPTkRJVElPTihfQ09TRV9hcnJheV9yZXBsYWNlKHBTaWduZXIsIHAsIGluZGV4LCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgTlVMTCksIENPU0VfRVJSX0NCT1IpOworCQorCXBiU2lnID0gTlVMTDsKKworCWlmIChlY2tleSAhPSBOVUxMKSBFQ19LRVlfZnJlZShlY2tleSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFQ0RTQV9WZXJpZnkoQ09TRSAqIHBTaWduZXIsIGludCBpbmRleCwgY29uc3QgY25fY2JvciAqIHBLZXksIGludCBjYml0RGlnZXN0LCBjb25zdCBieXRlICogcmdiVG9TaWduLCBzaXplX3QgY2JUb1NpZ24sIGNvc2VfZXJyYmFjayAqIHBlcnIpCit7CisJRUNfS0VZICogZWNrZXkgPSBOVUxMOworCWJ5dGUgcmdiRGlnZXN0W0VWUF9NQVhfTURfU0laRV07CisJdW5zaWduZWQgaW50IGNiRGlnZXN0ID0gc2l6ZW9mKHJnYkRpZ2VzdCk7CisJY29uc3QgRVZQX01EICogZGlnZXN0OworI2lmZGVmIFVTRV9DQk9SX0NPTlRFWFQKKwljbl9jYm9yX2NvbnRleHQgKiBjb250ZXh0ID0gJnBTaWduZXItPm1fYWxsb2NDb250ZXh0OworI2VuZGlmCisJY25fY2JvciAqIHAgPSBOVUxMOworCUVDRFNBX1NJRyBzaWcgPSB7IE5VTEwsIE5VTEwgfTsKKwlpbnQgY2JSOworCWNuX2Nib3IgKiBwU2lnOworCXNpemVfdCBjYlNpZ25hdHVyZTsKKworCWVja2V5ID0gRUNLZXlfRnJvbShwS2V5LCAmY2JSLCBwZXJyKTsKKwlpZiAoZWNrZXkgPT0gTlVMTCkgeworCWVycm9yUmV0dXJuOgorCQlpZiAoc2lnLnIgIT0gTlVMTCkgQk5fZnJlZShzaWcucik7CisJCWlmIChzaWcucyAhPSBOVUxMKSBCTl9mcmVlKHNpZy5zKTsKKwkJaWYgKHAgIT0gTlVMTCkgQ05fQ0JPUl9GUkVFKHAsIGNvbnRleHQpOworCQlpZiAoZWNrZXkgIT0gTlVMTCkgRUNfS0VZX2ZyZWUoZWNrZXkpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJc3dpdGNoIChjYml0RGlnZXN0KSB7CisJY2FzZSAyNTY6IGRpZ2VzdCA9IEVWUF9zaGEyNTYoKTsgYnJlYWs7CisJY2FzZSA1MTI6IGRpZ2VzdCA9IEVWUF9zaGE1MTIoKTsgYnJlYWs7CisJY2FzZSAzODQ6IGRpZ2VzdCA9IEVWUF9zaGEzODQoKTsgYnJlYWs7CisJZGVmYXVsdDoKKwkJRkFJTF9DT05ESVRJT04oQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVIpOworCX0KKwlFVlBfRGlnZXN0KHJnYlRvU2lnbiwgY2JUb1NpZ24sIHJnYkRpZ2VzdCwgJmNiRGlnZXN0LCBkaWdlc3QsIE5VTEwpOworCisJcFNpZyA9IF9DT1NFX2FycmF5Z2V0X2ludChwU2lnbmVyLCBpbmRleCk7CisJQ0hFQ0tfQ09ORElUSU9OKHBTaWcgIT0gTlVMTCwgQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVIpOworCWNiU2lnbmF0dXJlID0gcFNpZy0+bGVuZ3RoOworCisJQ0hFQ0tfQ09ORElUSU9OKGNiU2lnbmF0dXJlIC8gMiA9PSBjYlIsIENPU0VfRVJSX0lOVkFMSURfUEFSQU1FVEVSKTsKKwlzaWcuciA9IEJOX2JpbjJibihwU2lnLT52LmJ5dGVzLChpbnQpIGNiU2lnbmF0dXJlLzIsIE5VTEwpOworCXNpZy5zID0gQk5fYmluMmJuKHBTaWctPnYuYnl0ZXMrY2JTaWduYXR1cmUvMiwgKGludCkgY2JTaWduYXR1cmUvMiwgTlVMTCk7CisKKwlDSEVDS19DT05ESVRJT04oRUNEU0FfZG9fdmVyaWZ5KHJnYkRpZ2VzdCwgY2JEaWdlc3QsICZzaWcsIGVja2V5KSA9PSAxLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisKKwlCTl9mcmVlKHNpZy5yKTsKKwlCTl9mcmVlKHNpZy5zKTsKKwlpZiAoZWNrZXkgIT0gTlVMTCkgRUNfS0VZX2ZyZWUoZWNrZXkpOworCisJcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQUVTX0tXX0RlY3J5cHQoQ09TRV9FbnZlbG9wZWQgKiBwY29zZSwgY29uc3QgYnl0ZSAqIHBiS2V5SW4sIHNpemVfdCBjYml0S2V5LCBjb25zdCBieXRlICogcGJDaXBoZXJUZXh0LCBzaXplX3QgY2JDaXBoZXJUZXh0LCBieXRlICogcGJLZXlPdXQsIGludCAqIHBjYktleU91dCwgY29zZV9lcnJiYWNrICogcGVycikKK3sKKwlieXRlIHJnYk91dFs1MTIgLyA4XTsKKwlBRVNfS0VZIGtleTsKKworCUNIRUNLX0NPTkRJVElPTihBRVNfc2V0X2RlY3J5cHRfa2V5KHBiS2V5SW4sIChpbnQpY2JpdEtleSwgJmtleSkgPT0gMCwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCisJQ0hFQ0tfQ09ORElUSU9OKEFFU191bndyYXBfa2V5KCZrZXksIE5VTEwsIHJnYk91dCwgcGJDaXBoZXJUZXh0LCAoaW50KSBjYkNpcGhlclRleHQpLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisKKwltZW1jcHkocGJLZXlPdXQsIHJnYk91dCwgY2JDaXBoZXJUZXh0IC0gOCk7CisJKnBjYktleU91dCA9IChpbnQpIChjYkNpcGhlclRleHQgLSA4KTsKKworCXJldHVybiB0cnVlOworZXJyb3JSZXR1cm46CisJcmV0dXJuIGZhbHNlOworfQorCitib29sIEFFU19LV19FbmNyeXB0KENPU0VfUmVjaXBpZW50SW5mbyAqIHBjb3NlLCBjb25zdCBieXRlICogcGJLZXlJbiwgaW50IGNiaXRLZXksIGNvbnN0IGJ5dGUgKiAgcGJDb250ZW50LCBpbnQgIGNiQ29udGVudCwgY29zZV9lcnJiYWNrICogcGVycikKK3sKKwlieXRlICAqcGJPdXQgPSBOVUxMOworCUFFU19LRVkga2V5OworI2lmZGVmIFVTRV9DQk9SX0NPTlRFWFQKKwljbl9jYm9yX2NvbnRleHQgKiBjb250ZXh0ID0gJnBjb3NlLT5tX2VuY3J5cHQubV9tZXNzYWdlLm1fYWxsb2NDb250ZXh0OworI2VuZGlmCisJY25fY2JvciAqIGNuVG1wID0gTlVMTDsKKworCXBiT3V0ID0gQ09TRV9DQUxMT0MoY2JDb250ZW50ICsgOCwgMSwgY29udGV4dCk7CisJQ0hFQ0tfQ09ORElUSU9OKHBiT3V0ICE9IE5VTEwsIENPU0VfRVJSX09VVF9PRl9NRU1PUlkpOworCisJQ0hFQ0tfQ09ORElUSU9OKEFFU19zZXRfZW5jcnlwdF9rZXkocGJLZXlJbiwgY2JpdEtleSwgJmtleSkgPT0gMCwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCisJQ0hFQ0tfQ09ORElUSU9OKEFFU193cmFwX2tleSgma2V5LCBOVUxMLCBwYk91dCwgcGJDb250ZW50LCBjYkNvbnRlbnQpLCBDT1NFX0VSUl9DUllQVE9fRkFJTCk7CisKKwljblRtcCA9IGNuX2Nib3JfZGF0YV9jcmVhdGUocGJPdXQsIChpbnQpY2JDb250ZW50ICsgOCwgQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BIE5VTEwpOworCUNIRUNLX0NPTkRJVElPTihjblRtcCAhPSBOVUxMLCBDT1NFX0VSUl9DQk9SKTsKKwlwYk91dCA9IE5VTEw7CisJQ0hFQ0tfQ09ORElUSU9OKF9DT1NFX2FycmF5X3JlcGxhY2UoJnBjb3NlLT5tX2VuY3J5cHQubV9tZXNzYWdlLCBjblRtcCwgSU5ERVhfQk9EWSwgQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BIE5VTEwpLCBDT1NFX0VSUl9DQk9SKTsKKwljblRtcCA9IE5VTEw7CisKKwlyZXR1cm4gdHJ1ZTsKKworZXJyb3JSZXR1cm46CisJQ09TRV9GUkVFKGNuVG1wLCBjb250ZXh0KTsKKwlpZiAocGJPdXQgIT0gTlVMTCkgQ09TRV9GUkVFKHBiT3V0LCBjb250ZXh0KTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKyovCisvKgorLy8jaW5jbHVkZSA8c3RkaW8uaD4gLy9UT0RPCit2b2lkIHJhbmRfYnl0ZXMoYnl0ZSAqIHBiLCBzaXplX3QgY2IpeworLy9jdHgtPmFlc19jdHgtPnJrIGUgbnVsbC4uLiBpIGNhbGxjaGFpbmVuIGzkbmdzdCBpbi4gcHJvdmEgaXN05GxsZXQ6CisvL2tvbGxhIGh0dHBzOi8vdGxzLm1iZWQub3JnL2tiL2hvdy10by9hZGQtYS1yYW5kb20tZ2VuZXJhdG9yCisgICAgICAgIC8vaW5pdCByYW5kb20KKyAgICAgICBtYmVkdGxzX2N0cl9kcmJnX2NvbnRleHQgY3RyX2RyYmc7CisgICAgICAgICAgY2hhciAqcGVyc29uYWxpemF0aW9uID0gIm15X2FwcF9zcGVjaWZpY19zdHJpbmciOworCisgICAgICAgIHJldCA9IG1iZWR0bHNfY3RyX2RyYmdfaW5pdCggJmN0cl9kcmJnLCBtYmVkdGxzX2VudHJvcHlfZnVuYywgJmVudHJvcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyICopIHBlcnNvbmFsaXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oIHBlcnNvbmFsaXphdGlvbiApICk7IAorICAgICAgICAKKyAgICAgICAgaWYocmV0ICE9IDApIHsKKyAgICAgICAgICAgIC8vcHJpbnRmIFRPRE8KKyAgICAgICAgfSAgICAKKyAgICAKKyAgICAgICAgbWJlZHRsc19jdHJfZHJiZ19yYW5kb20oJmN0eCxwYiwgY2IpOyAJCisKKwltYmVkdGxzX2N0cl9kcmJnX2ZyZWUoJmN0eCk7CQorICAgICAgICBwcmludGYoInJhbmQgYnl1dGUgZG9uZVxuIik7Cit9Ki8KKy8vVE9ETyBIT1cgVE8gR0VORVJBVEUgR09PRCBSQU5ET00gQllURVMKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGVudHJvcHlfc291cmNlX3ByWzk2XSA9CisgICB7IDB4YzEsIDB4ODAsIDB4ODEsIDB4YTYsIDB4NWQsIDB4NDQsIDB4MDIsIDB4MTYsCisgICAgIDB4MTksIDB4YjMsIDB4ZjEsIDB4ODAsIDB4YjEsIDB4YzksIDB4MjAsIDB4MDIsCisgICAgIDB4NmEsIDB4NTQsIDB4NmYsIDB4MGMsIDB4NzAsIDB4ODEsIDB4NDksIDB4OGIsCisgICAgIDB4NmUsIDB4YTYsIDB4NjIsIDB4NTIsIDB4NmQsIDB4NTEsIDB4YjEsIDB4Y2IsCisgICAgIDB4NTgsIDB4M2IsIDB4ZmEsIDB4ZDUsIDB4MzcsIDB4NWYsIDB4ZmIsIDB4YzksCisgICAgIDB4ZmYsIDB4NDYsIDB4ZDIsIDB4MTksIDB4YzcsIDB4MjIsIDB4M2UsIDB4OTUsCisgICAgIDB4NDUsIDB4OWQsIDB4ODIsIDB4ZTEsIDB4ZTcsIDB4MjIsIDB4OWYsIDB4NjMsCisgICAgIDB4MzEsIDB4NjksIDB4ZDIsIDB4NmIsIDB4NTcsIDB4NDcsIDB4NGYsIDB4YTMsCisgICAgIDB4MzcsIDB4YzksIDB4OTgsIDB4MWMsIDB4MGIsIDB4ZmIsIDB4OTEsIDB4MzEsCisgICAgIDB4NGQsIDB4NTUsIDB4YjksIDB4ZTksIDB4MWMsIDB4NWEsIDB4NWUsIDB4ZTQsCisgICAgIDB4OTMsIDB4OTIsIDB4Y2YsIDB4YzUsIDB4MjMsIDB4MTIsIDB4ZDUsIDB4NTYsCisgICAgIDB4MmMsIDB4NGEsIDB4NmUsIDB4ZmYsIDB4ZGMsIDB4MTAsIDB4ZDAsIDB4NjggfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9uY2VfcGVyc19wclsxNl0gPQorICAgICB7IDB4ZDIsIDB4NTQsIDB4ZmMsIDB4ZmYsIDB4MDIsIDB4MWUsIDB4NjksIDB4ZDIsCisgICAgICAweDI5LCAweGM5LCAweGNmLCAweGFkLCAweDg1LCAweGZhLCAweDQ4LCAweDZjIH07CisKK3N0YXRpYyBzaXplX3QgdGVzdF9vZmZzZXQ7CitzdGF0aWMgaW50IGN0cl9kcmJnX3NlbGZfdGVzdF9lbnRyb3B5KCB2b2lkICpkYXRhLCB1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4gKSB7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IGRhdGE7CisgICAgbWVtY3B5KCBidWYsIHAgKyB0ZXN0X29mZnNldCwgbGVuICk7CisgICAgdGVzdF9vZmZzZXQgKz0gbGVuOworICAgIHJldHVybiggMCApOworIH0KKwordm9pZCByYW5kX2J5dGVzKGJ5dGUqIHBiLCBzaXplX3QgY2IpeworICAgICAKKyAgICAgbWJlZHRsc19jdHJfZHJiZ19jb250ZXh0IGN0eDsKKyAgICAvLyB1bnNpZ25lZCBjaGFyIGJ1ZlsxNl07CisgICAgIAorICAgICBtYmVkdGxzX2N0cl9kcmJnX2luaXQoICZjdHggKTsKKyAgICAgCisgICAgIG1iZWR0bHNfY3RyX2RyYmdfc2VlZF9lbnRyb3B5X2xlbiggJmN0eCwgY3RyX2RyYmdfc2VsZl90ZXN0X2VudHJvcHksICh2b2lkICopIGVudHJvcHlfc291cmNlX3ByLCBub25jZV9wZXJzX3ByLCAxNiwgMzIgKTsKKyAgICAgCisgICAgIC8vbWJlZHRsc19jdHJfZHJiZ19zZXRfcHJlZGljdGlvbl9yZXNpc3RhbmNlKCAmY3R4LCBNQkVEVExTX0NUUl9EUkJHX1BSX09OICk7CisgICAgCisgICAgIG1iZWR0bHNfY3RyX2RyYmdfcmFuZG9tKCAmY3R4LCBwYiwgY2IgKTsKKyAgICAgLy9tYmVkdGxzX2N0cl9kcmJnX3JhbmRvbSggJmN0eCwgYnVmLCBNQkVEVExTX0NUUl9EUkJHX0JMT0NLU0laRSApOworICAgICAvL21lbWNtcCggYnVmLCByZXN1bHRfcHIsIE1CRURUTFNfQ1RSX0RSQkdfQkxPQ0tTSVpFICkgKTsKKyAgICAgCisgICAgIG1iZWR0bHNfY3RyX2RyYmdfZnJlZSggJmN0eCApOworfQorLy9FTkQgT0YgVE9ETyBSQU5ET00gQllURVMKKworLyohCisqCisqIEBwYXJhbVtpbl0gcFJlY2lwZW50CVBvaW50ZXIgdG8gdGhlIG1lc3NhZ2Ugb2JqZWN0CisqIEBwYXJhbVtpbl0gcHBLZXlQcml2YXRlCUFkZHJlc3Mgb2Yga2V5IHdpdGggcHJpdmF0ZSBwb3J0aW9uCisqIEBwYXJhbVtpbl0gcEtleVB1YmxpYwlBZGRyZXNzIG9mIHRoZSBrZXkgdy9vIGEgcHJpdmF0ZSBwb3J0aW9uCisqIEBwYXJhbVtpbi9vdXRdIHBwYlNlY3JldAlwb2ludGVyIHRvIGJ1ZmZlciB0byBob2xkIHRoZSBjb21wdXRlZCBzZWNyZXQKKyogQHBhcmFtW2luL291dF0gcGNiU2VjcmV0CXNpemUgb2YgdGhlIGNvbXB1dGVkIHNlY3JldAorKiBAcGFyYW1baW5dIGNvbnRleHQJCWNib3IgYWxsb2NhdGlvbiBjb250ZXh0IHN0cnVjdHVyZQorKiBAcGFyYW1bb3V0XSBwZXJyCQkJbG9jYXRpb24gdG8gcmV0dXJuIGVycm9yIGluZm9ybWF0aW9uCisqIEByZXR1cm5zCQlzdWNjZXNzIG9mIHRoZSBmdW5jdGlvbgorKi8KKy8qCitib29sIEVDREhfQ29tcHV0ZVNlY3JldChDT1NFICogcFJlY2lwaWVudCwgY25fY2JvciAqKiBwcEtleVByaXZhdGUsIGNvbnN0IGNuX2Nib3IgKiBwS2V5UHVibGljLCBieXRlICoqIHBwYlNlY3JldCwgc2l6ZV90ICogcGNiU2VjcmV0LCBDQk9SX0NPTlRFWFRfQ09NTUEgY29zZV9lcnJiYWNrICpwZXJyKQoreworCUVDX0tFWSAqIHBlY2tleVByaXZhdGUgPSBOVUxMOworCUVDX0tFWSAqIHBlY2tleVB1YmxpYyA9IE5VTEw7CisJaW50IGNiR3JvdXA7CisJaW50IGNic2VjcmV0OworCWJ5dGUgKiBwYnNlY3JldCA9IE5VTEw7CisJYm9vbCBmUmV0ID0gZmFsc2U7CisKKwlwZWNrZXlQdWJsaWMgPSBFQ0tleV9Gcm9tKHBLZXlQdWJsaWMsICZjYkdyb3VwLCBwZXJyKTsKKwlpZiAocGVja2V5UHVibGljID09IE5VTEwpIGdvdG8gZXJyb3JSZXR1cm47CisKKwlpZiAoKnBwS2V5UHJpdmF0ZSA9PSBOVUxMKSB7CisJCXsKKwkJCWNuX2Nib3IgKiBwQ29tcHJlc3MgPSBfQ09TRV9tYXBfZ2V0X2ludChwUmVjaXBpZW50LCBDT1NFX0hlYWRlcl9Vc2VDb21wcmVzc2VkRUNESCwgQ09TRV9CT1RILCBwZXJyKTsKKwkJCWlmIChwQ29tcHJlc3MgPT0gTlVMTCkgRlVzZUNvbXByZXNzZWQgPSBmYWxzZTsKKwkJCWVsc2UgRlVzZUNvbXByZXNzZWQgPSAocENvbXByZXNzLT50eXBlID09IENOX0NCT1JfVFJVRSk7CisJCX0KKwkJcGVja2V5UHJpdmF0ZSA9IEVDX0tFWV9uZXcoKTsKKwkJRUNfS0VZX3NldF9ncm91cChwZWNrZXlQcml2YXRlLCBFQ19LRVlfZ2V0MF9ncm91cChwZWNrZXlQdWJsaWMpKTsKKwkJQ0hFQ0tfQ09ORElUSU9OKEVDX0tFWV9nZW5lcmF0ZV9rZXkocGVja2V5UHJpdmF0ZSkgPT0gMSwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCQkqcHBLZXlQcml2YXRlID0gRUNfRnJvbUtleShwZWNrZXlQcml2YXRlLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgcGVycik7CisJCWlmICgqcHBLZXlQcml2YXRlID09IE5VTEwpIGdvdG8gZXJyb3JSZXR1cm47CisJfQorCWVsc2UgeworCQlwZWNrZXlQcml2YXRlID0gRUNLZXlfRnJvbSgqcHBLZXlQcml2YXRlLCAmY2JHcm91cCwgcGVycik7CisJCWlmIChwZWNrZXlQcml2YXRlID09IE5VTEwpIGdvdG8gZXJyb3JSZXR1cm47CisJfQorCisJcGJzZWNyZXQgPSBDT1NFX0NBTExPQyhjYkdyb3VwLCAxLCBjb250ZXh0KTsKKwlDSEVDS19DT05ESVRJT04ocGJzZWNyZXQgIT0gTlVMTCwgQ09TRV9FUlJfT1VUX09GX01FTU9SWSk7CisKKwljYnNlY3JldCA9IEVDREhfY29tcHV0ZV9rZXkocGJzZWNyZXQsIGNiR3JvdXAsIEVDX0tFWV9nZXQwX3B1YmxpY19rZXkocGVja2V5UHVibGljKSwgcGVja2V5UHJpdmF0ZSwgTlVMTCk7CisJQ0hFQ0tfQ09ORElUSU9OKGNic2VjcmV0ID4gMCwgQ09TRV9FUlJfQ1JZUFRPX0ZBSUwpOworCisJKnBwYlNlY3JldCA9IHBic2VjcmV0OworCSpwY2JTZWNyZXQgPSBjYnNlY3JldDsKKwlwYnNlY3JldCA9IE5VTEw7CisKKwlmUmV0ID0gdHJ1ZTsKKworZXJyb3JSZXR1cm46CisJaWYgKHBic2VjcmV0ICE9IE5VTEwpIENPU0VfRlJFRShwYnNlY3JldCwgY29udGV4dCk7CisJaWYgKHBlY2tleVB1YmxpYyAhPSBOVUxMKSBFQ19LRVlfZnJlZShwZWNrZXlQdWJsaWMpOworCWlmIChwZWNrZXlQcml2YXRlICE9IE5VTEwpIEVDX0tFWV9mcmVlKHBlY2tleVByaXZhdGUpOworCisJcmV0dXJuIGZSZXQ7Cit9CisqLworI2VuZGlmIC8vIFVTRV9NQkVEX1RMUwpkaWZmIC0tZ2l0IGEvdGVzdC9DTWFrZUxpc3RzLnR4dCBiL3Rlc3QvQ01ha2VMaXN0cy50eHQKaW5kZXggMjE3M2Y1My4uOWRkMmNjMyAxMDA2NDQKLS0tIGEvdGVzdC9DTWFrZUxpc3RzLnR4dAorKysgYi90ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0xMSwxMSArMTEsMTUgQEAKIGFkZF9leGVjdXRhYmxlICggY29zZV90ZXN0IHRlc3QuYyBqc29uLmMgZW5jcnlwdC5jIHNpZ24uYyBjb250ZXh0LmMgbWFjX3Rlc3QuYykKIAogdGFyZ2V0X2xpbmtfbGlicmFyaWVzIChjb3NlX3Rlc3QgUFJJVkFURSBjb3NlLWMgKQoraWYgKHVzZV9lbWJlZHRscykKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMgKCBjb3NlLWMgUFJJVkFURSBlbWJlZHRscyApCitlbmRpZigpCiAKICMjIE9wZW5TU0wKIAogdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoY29zZV90ZXN0IFBSSVZBVEUgJHtPUEVOU1NMX0lOQ0xVREVfRElSfSkKIHRhcmdldF9saW5rX2xpYnJhcmllcyggY29zZV90ZXN0IFBSSVZBVEUgJHtPUEVOU1NMX0xJQlJBUklFU30gKQorCiB0YXJnZXRfbGlua19saWJyYXJpZXMoIGNvc2VfdGVzdCBQUklWQVRFIGNuLWNib3IgKQogaWYgKCBNU1ZDICkKICAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoIGNvc2VfdGVzdCBQUklWQVRFIHdzMl8zMiApCg==