ZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbGtrYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbGtrYmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjk0ZmYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sa2tiZC5jCkBAIC0wLDAgKzEsNzUyIEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBKYW4tQmVuZWRpY3QgR2xhdyA8amJnbGF3QGx1Zy1vd2wuZGU+CisgKi8KKworLyoKKyAqIExLIGtleWJvYXJkIGRyaXZlciBmb3IgTGludXgsIGJhc2VkIG9uIHN1bmtiZC5jIChDKSBieSBWb2p0ZWNoIFBhdmxpaworICovCisKKy8qCisgKiBERUMgTEsyMDEgYW5kIExLNDAxIGtleWJvYXJkIGRyaXZlciBmb3IgTGludXggKHByaW1hcnkgZm9yIERFQ3N0YXRpb25zCisgKiBhbmQgVkFYc3RhdGlvbnMsIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIG9uIGFueSBzdGFuZGFyZCBSUzIzMiB3aXRoIGFuCisgKiBhZGFwdG9yKS4KKyAqCisgKiBESVNDTEFJTUVSOiBUaGlzIHdvcmtzIGZvciBfbWVfLiBJZiB5b3UgYnJlYWsgYW55dGhpbmcgYnkgdXNpbmcgdGhlCisgKiBpbmZvcm1hdGlvbiBnaXZlbiBiZWxvdywgSSB3aWxsIF9ub3RfIGJlIGxpYWJsZSEKKyAqCisgKiBSSjEwIHBpbm91dDoJCVRvIERFOToJCU9yIERCMjU6CisgKiAJMSAtIFJ4RCA8LS0tLT4JUGluIDMgKFR4RCkgPC0+CVBpbiAyIChUeEQpCisgKiAJMiAtIEdORCA8LS0tLT4JUGluIDUgKEdORCkgPC0+CVBpbiA3IChHTkQpCisgKiAJNCAtIFR4RCA8LS0tLT4JUGluIDIgKFJ4RCkgPC0+CVBpbiAzIChSeEQpCisgKiAJMyAtICsxMlYgKGZyb20gSEREIGRyaXZlIGNvbm5lY3RvciksIERPTidUIGNvbm5lY3QgdG8gREU5IG9yIERCMjUhISEKKyAqCisgKiBQaW4gbnVtYmVycyBmb3IgREU5IGFuZCBEQjI1IGFyZSBub3RlZCBvbiB0aGUgcGx1ZyAocXVpdGUgc21hbGw6KS4gRm9yCisgKiBSSjEwLCBpdCdzIGxpa2UgdGhpczoKKyAqCisgKiAgICAgIF9fPV9fCUhvbGQgdGhlIHBsdWcgaW4gZnJvbnQgb2YgeW91LCBjYWJsZSBkb3dud2FyZHMsCisgKiAgICAgL19fXy98CW5vc2UgaXMgaGlkZGVuIGJlaGluZCB0aGUgcGx1Zy4gTm93LCBwaW4gMSBpcyBhdAorICogICAgfDEyMzR8fAl0aGUgbGVmdCBzaWRlLCBwaW4gNCBhdCB0aGUgcmlnaHQgYW5kIDIgYW5kIDMgYXJlCisgKiAgICB8SUlJSXx8CWluIGJldHdlZW4sIG9mIGNvdXJzZTopCisgKiAgICB8ICAgIHx8CisgKiAgICB8X19fX3wvCisgKiAgICAgIHx8CVNvIHRoZSBhZGFwdG9yIGNvbnNpc3RzIG9mIHRocmVlIGNvbm5lY3RlZCBjYWJsZXMKKyAqICAgICAgfHwJZm9yIGRhdGEgdHJhbnNtaXNzaW9uIChSeEQgYW5kIFR4RCkgYW5kIHNpZ25hbCBncm91bmQuCisgKgkJQWRkaXRpb25hbGx5LCB5b3UgaGF2ZSB0byBnZXQgKzEyViBmcm9tIHNvbWV3aGVyZS4KKyAqIE1vc3QgZWFzaWx5LCB5b3UnbGwgZ2V0IHRoYXQgZnJvbSBhIGZsb3BweSBvciBIREQgcG93ZXIgY29ubmVjdG9yLgorICogSXQncyB0aGUgeWVsbG93IGNhYmxlIHRoZXJlIChibGFjayBpcyBncm91bmQgYW5kIHJlZCBpcyArNVYpLgorICoKKyAqIFRoZSBrZXlib2FyZCBhbmQgYWxsIHRoZSBjb21tYW5kcyBpdCB1bmRlcnN0YW5kcyBhcmUgZG9jdW1lbnRlZCBpbgorICogIlZDQjAyIFZpZGVvIFN1YnN5c3RlbSAtIFRlY2huaWNhbCBNYW51YWwiLCBFSy0xMDRBQS1UTS0wMDEuIFRoaXMKKyAqIGRvY3VtZW50IGlzIExLMjAxIHNwZWNpZmljLCBidXQgTEs0MDEgaXMgbW9zdGx5IGNvbXBhdGlibGUuIEl0IGNvbWVzCisgKiB1cCBpbiBMSzIwMSBtb2RlIGFuZCBkb2Vzbid0IHJlcG9ydCBhbnkgb2YgdGhlIGFkZGl0aW9uYWwga2V5cyBpdAorICogaGFzLiBUaGVzZSBuZWVkIHRvIGJlIHN3aXRjaGVkIG9uIHdpdGggdGhlIExLX0NNRF9FTkFCTEVfTEs0MDEKKyAqIGNvbW1hbmQuIFlvdSdsbCBmaW5kIHRoaXMgZG9jdW1lbnQgKHNjYW5uZWQgLnBkZiBmaWxlKSBvbiBNQU5YLAorICogYSBzZWFyY2ggZW5naW5lIHNwZWNpZmljIHRvIERFQyBkb2N1bWVudGF0aW9uLiBUcnkKKyAqIGh0dHA6Ly93d3cudnQxMDAubmV0L21hbngvZGV0YWlscz9wbj1FSy0xMDRBQS1UTS0wMDE7aWQ9MjE7Y3A9MQorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIFNob3VsZCB5b3UgbmVlZCB0byBjb250YWN0IG1lLCB0aGUgYXV0aG9yLCB5b3UgY2FuIGRvIHNvIGVpdGhlciBieQorICogZW1haWwgb3IgYnkgcGFwZXIgbWFpbDoKKyAqIEphbi1CZW5lZGljdCBHbGF3LCBMaWxpZW5zdHJh32UgMTYsIDMzNzkwIEj2cnN0ZSAobmVhciBIYWxsZS9XZXN0Zi4pLAorICogR2VybWFueS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpby5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjZGVmaW5lIERSSVZFUl9ERVNDCSJMSyBrZXlib2FyZCBkcml2ZXIiCisKK01PRFVMRV9BVVRIT1IgKCJKYW4tQmVuZWRpY3QgR2xhdyA8amJnbGF3QGx1Zy1vd2wuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CisKKy8qCisgKiBLbm93biBwYXJhbWV0ZXJzOgorICoJYmVsbF92b2x1bWUKKyAqCWtleWNsaWNrX3ZvbHVtZQorICoJY3RybGNsaWNrX3ZvbHVtZQorICoKKyAqIFBsZWFzZSBub3RpY2UgdGhhdCB0aGVyZSdzIG5vdCB5ZXQgYW4gQVBJIHRvIHNldCB0aGVzZSBhdCBydW50aW1lLgorICovCitzdGF0aWMgaW50IGJlbGxfdm9sdW1lID0gMTAwOyAvKiAlICovCittb2R1bGVfcGFyYW0gKGJlbGxfdm9sdW1lLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyAoYmVsbF92b2x1bWUsICJCZWxsIHZvbHVtZSAoaW4gJSkuIGRlZmF1bHQgaXMgMTAwJSIpOworCitzdGF0aWMgaW50IGtleWNsaWNrX3ZvbHVtZSA9IDEwMDsgLyogJSAqLworbW9kdWxlX3BhcmFtIChrZXljbGlja192b2x1bWUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDIChrZXljbGlja192b2x1bWUsICJLZXljbGljayB2b2x1bWUgKGluICUpLCBkZWZhdWx0IGlzIDEwMCUiKTsKKworc3RhdGljIGludCBjdHJsY2xpY2tfdm9sdW1lID0gMTAwOyAvKiAlICovCittb2R1bGVfcGFyYW0gKGN0cmxjbGlja192b2x1bWUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDIChjdHJsY2xpY2tfdm9sdW1lLCAiQ3RybGNsaWNrIHZvbHVtZSAoaW4gJSksIGRlZmF1bHQgaXMgMTAwJSIpOworCitzdGF0aWMgaW50IGxrMjAxX2NvbXBvc2VfaXNfYWx0ID0gMDsKK21vZHVsZV9wYXJhbSAobGsyMDFfY29tcG9zZV9pc19hbHQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDIChsazIwMV9jb21wb3NlX2lzX2FsdCwgIklmIHNldCBub24temVybywgTEsyMDEnIENvbXBvc2Uga2V5ICIKKwkJIndpbGwgYWN0IGFzIGFuIEFsdCBrZXkiKTsKKworCisKKyN1bmRlZiBMS0tCRF9ERUJVRworI2lmZGVmIExLS0JEX0RFQlVHCisjZGVmaW5lIERCRyh4Li4uKSBwcmludGsgKHgpCisjZWxzZQorI2RlZmluZSBEQkcoeC4uLikgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworLyogTEVEIGNvbnRyb2wgKi8KKyNkZWZpbmUgTEtfTEVEX1dBSVQJCTB4ODEKKyNkZWZpbmUgTEtfTEVEX0NPTVBPU0UJCTB4ODIKKyNkZWZpbmUgTEtfTEVEX1NISUZUTE9DSwkweDg0CisjZGVmaW5lIExLX0xFRF9TQ1JPTExMT0NLCTB4ODgKKyNkZWZpbmUgTEtfQ01EX0xFRF9PTgkJMHgxMworI2RlZmluZSBMS19DTURfTEVEX09GRgkJMHgxMQorCisvKiBNb2RlIGNvbnRyb2wgKi8KKyNkZWZpbmUgTEtfTU9ERV9ET1dOCQkweDgwCisjZGVmaW5lIExLX01PREVfQVVUT0RPV04JMHg4MgorI2RlZmluZSBMS19NT0RFX1VQRE9XTgkJMHg4NgorI2RlZmluZSBMS19DTURfU0VUX01PREUobW9kZSxkaXYpCSgobW9kZSkgfCAoKGRpdikgPDwgMykpCisKKy8qIE1pc2MgY29tbWFuZHMgKi8KKyNkZWZpbmUgTEtfQ01EX0VOQUJMRV9LRVlDTElDSwkweDFiCisjZGVmaW5lIExLX0NNRF9ESVNBQkxFX0tFWUNMSUNLCTB4OTkKKyNkZWZpbmUgTEtfQ01EX0RJU0FCTEVfQkVMTAkweGExCisjZGVmaW5lIExLX0NNRF9TT1VORF9CRUxMCTB4YTcKKyNkZWZpbmUgTEtfQ01EX0VOQUJMRV9CRUxMCTB4MjMKKyNkZWZpbmUgTEtfQ01EX0RJU0FCTEVfQ1RSQ0xJQ0sJMHhiOQorI2RlZmluZSBMS19DTURfRU5BQkxFX0NUUkNMSUNLCTB4YmIKKyNkZWZpbmUgTEtfQ01EX1NFVF9ERUZBVUxUUwkweGQzCisjZGVmaW5lIExLX0NNRF9QT1dFUkNZQ0xFX1JFU0VUCTB4ZmQKKyNkZWZpbmUgTEtfQ01EX0VOQUJMRV9MSzQwMQkweGU5CisjZGVmaW5lIExLX0NNRF9SRVFVRVNUX0lECTB4YWIKKworLyogTWlzYyByZXNwb25zZXMgZnJvbSBrZXlib2FyZCAqLworI2RlZmluZSBMS19TVFVDS19LRVkJCTB4M2QKKyNkZWZpbmUgTEtfU0VMRlRFU1RfRkFJTEVECTB4M2UKKyNkZWZpbmUgTEtfQUxMX0tFWVNfVVAJCTB4YjMKKyNkZWZpbmUgTEtfTUVUUk9OT01FCQkweGI0CisjZGVmaW5lIExLX09VVFBVVF9FUlJPUgkJMHhiNQorI2RlZmluZSBMS19JTlBVVF9FUlJPUgkJMHhiNgorI2RlZmluZSBMS19LQkRfTE9DS0VECQkweGI3CisjZGVmaW5lIExLX0tCRF9URVNUX01PREVfQUNLCTB4YjgKKyNkZWZpbmUgTEtfUFJFRklYX0tFWV9ET1dOCTB4YjkKKyNkZWZpbmUgTEtfTU9ERV9DSEFOR0VfQUNLCTB4YmEKKyNkZWZpbmUgTEtfUkVTUE9OU0VfUkVTRVJWRUQJMHhiYgorCisjZGVmaW5lIExLX05VTV9LRVlDT0RFUwkJMjU2CisjZGVmaW5lIExLX05VTV9JR05PUkVfQllURVMJNgordHlwZWRlZiB1X2ludDE2X3QgbGtfa2V5Y29kZV90OworCisKKworc3RhdGljIGxrX2tleWNvZGVfdCBsa2tiZF9rZXljb2RlW0xLX05VTV9LRVlDT0RFU10gPSB7CisJWzB4NTZdID0gS0VZX0YxLAorCVsweDU3XSA9IEtFWV9GMiwKKwlbMHg1OF0gPSBLRVlfRjMsCisJWzB4NTldID0gS0VZX0Y0LAorCVsweDVhXSA9IEtFWV9GNSwKKwlbMHg2NF0gPSBLRVlfRjYsCisJWzB4NjVdID0gS0VZX0Y3LAorCVsweDY2XSA9IEtFWV9GOCwKKwlbMHg2N10gPSBLRVlfRjksCisJWzB4NjhdID0gS0VZX0YxMCwKKwlbMHg3MV0gPSBLRVlfRjExLAorCVsweDcyXSA9IEtFWV9GMTIsCisJWzB4NzNdID0gS0VZX0YxMywKKwlbMHg3NF0gPSBLRVlfRjE0LAorCVsweDdjXSA9IEtFWV9GMTUsCisJWzB4N2RdID0gS0VZX0YxNiwKKwlbMHg4MF0gPSBLRVlfRjE3LAorCVsweDgxXSA9IEtFWV9GMTgsCisJWzB4ODJdID0gS0VZX0YxOSwKKwlbMHg4M10gPSBLRVlfRjIwLAorCVsweDhhXSA9IEtFWV9GSU5ELAorCVsweDhiXSA9IEtFWV9JTlNFUlQsCisJWzB4OGNdID0gS0VZX0RFTEVURSwKKwlbMHg4ZF0gPSBLRVlfU0VMRUNULAorCVsweDhlXSA9IEtFWV9QQUdFVVAsCisJWzB4OGZdID0gS0VZX1BBR0VET1dOLAorCVsweDkyXSA9IEtFWV9LUDAsCisJWzB4OTRdID0gS0VZX0tQRE9ULAorCVsweDk1XSA9IEtFWV9LUEVOVEVSLAorCVsweDk2XSA9IEtFWV9LUDEsCisJWzB4OTddID0gS0VZX0tQMiwKKwlbMHg5OF0gPSBLRVlfS1AzLAorCVsweDk5XSA9IEtFWV9LUDQsCisJWzB4OWFdID0gS0VZX0tQNSwKKwlbMHg5Yl0gPSBLRVlfS1A2LAorCVsweDljXSA9IEtFWV9LUENPTU1BLAorCVsweDlkXSA9IEtFWV9LUDcsCisJWzB4OWVdID0gS0VZX0tQOCwKKwlbMHg5Zl0gPSBLRVlfS1A5LAorCVsweGEwXSA9IEtFWV9LUE1JTlVTLAorCVsweGExXSA9IEtFWV9QUk9HMSwKKwlbMHhhMl0gPSBLRVlfUFJPRzIsCisJWzB4YTNdID0gS0VZX1BST0czLAorCVsweGE0XSA9IEtFWV9QUk9HNCwKKwlbMHhhN10gPSBLRVlfTEVGVCwKKwlbMHhhOF0gPSBLRVlfUklHSFQsCisJWzB4YTldID0gS0VZX0RPV04sCisJWzB4YWFdID0gS0VZX1VQLAorCVsweGFiXSA9IEtFWV9SSUdIVFNISUZULAorCVsweGFjXSA9IEtFWV9MRUZUQUxULAorCVsweGFkXSA9IEtFWV9DT01QT1NFLCAvKiBSaWdodCBDb21wb3NlLCB0aGF0IGlzLiAqLworCVsweGFlXSA9IEtFWV9MRUZUU0hJRlQsIC8qIFNhbWUgYXMgS0VZX1JJR0hUU0hJRlQgb24gTEsyMDEgKi8KKwlbMHhhZl0gPSBLRVlfTEVGVENUUkwsCisJWzB4YjBdID0gS0VZX0NBUFNMT0NLLAorCVsweGIxXSA9IEtFWV9DT01QT1NFLCAvKiBMZWZ0IENvbXBvc2UsIHRoYXQgaXMuICovCisJWzB4YjJdID0gS0VZX1JJR0hUQUxULAorCVsweGJjXSA9IEtFWV9CQUNLU1BBQ0UsCisJWzB4YmRdID0gS0VZX0VOVEVSLAorCVsweGJlXSA9IEtFWV9UQUIsCisJWzB4YmZdID0gS0VZX0VTQywKKwlbMHhjMF0gPSBLRVlfMSwKKwlbMHhjMV0gPSBLRVlfUSwKKwlbMHhjMl0gPSBLRVlfQSwKKwlbMHhjM10gPSBLRVlfWiwKKwlbMHhjNV0gPSBLRVlfMiwKKwlbMHhjNl0gPSBLRVlfVywKKwlbMHhjN10gPSBLRVlfUywKKwlbMHhjOF0gPSBLRVlfWCwKKwlbMHhjOV0gPSBLRVlfMTAyTkQsCisJWzB4Y2JdID0gS0VZXzMsCisJWzB4Y2NdID0gS0VZX0UsCisJWzB4Y2RdID0gS0VZX0QsCisJWzB4Y2VdID0gS0VZX0MsCisJWzB4ZDBdID0gS0VZXzQsCisJWzB4ZDFdID0gS0VZX1IsCisJWzB4ZDJdID0gS0VZX0YsCisJWzB4ZDNdID0gS0VZX1YsCisJWzB4ZDRdID0gS0VZX1NQQUNFLAorCVsweGQ2XSA9IEtFWV81LAorCVsweGQ3XSA9IEtFWV9ULAorCVsweGQ4XSA9IEtFWV9HLAorCVsweGQ5XSA9IEtFWV9CLAorCVsweGRiXSA9IEtFWV82LAorCVsweGRjXSA9IEtFWV9ZLAorCVsweGRkXSA9IEtFWV9ILAorCVsweGRlXSA9IEtFWV9OLAorCVsweGUwXSA9IEtFWV83LAorCVsweGUxXSA9IEtFWV9VLAorCVsweGUyXSA9IEtFWV9KLAorCVsweGUzXSA9IEtFWV9NLAorCVsweGU1XSA9IEtFWV84LAorCVsweGU2XSA9IEtFWV9JLAorCVsweGU3XSA9IEtFWV9LLAorCVsweGU4XSA9IEtFWV9DT01NQSwKKwlbMHhlYV0gPSBLRVlfOSwKKwlbMHhlYl0gPSBLRVlfTywKKwlbMHhlY10gPSBLRVlfTCwKKwlbMHhlZF0gPSBLRVlfRE9ULAorCVsweGVmXSA9IEtFWV8wLAorCVsweGYwXSA9IEtFWV9QLAorCVsweGYyXSA9IEtFWV9TRU1JQ09MT04sCisJWzB4ZjNdID0gS0VZX1NMQVNILAorCVsweGY1XSA9IEtFWV9FUVVBTCwKKwlbMHhmNl0gPSBLRVlfUklHSFRCUkFDRSwKKwlbMHhmN10gPSBLRVlfQkFDS1NMQVNILAorCVsweGY5XSA9IEtFWV9NSU5VUywKKwlbMHhmYV0gPSBLRVlfTEVGVEJSQUNFLAorCVsweGZiXSA9IEtFWV9BUE9TVFJPUEhFLAorfTsKKworI2RlZmluZSBDSEVDS19MRUQoTEVELCBCSVRTKSBkbyB7CQlcCisJaWYgKHRlc3RfYml0IChMRUQsIGxrLT5kZXYubGVkKSkJXAorCQlsZWRzX29uIHw9IEJJVFM7CQlcCisJZWxzZQkJCQkJXAorCQlsZWRzX29mZiB8PSBCSVRTOwkJXAorCX0gd2hpbGUgKDApCisKKy8qCisgKiBQZXIta2V5Ym9hcmQgZGF0YQorICovCitzdHJ1Y3QgbGtrYmQgeworCWxrX2tleWNvZGVfdCBrZXljb2RlW0xLX05VTV9LRVlDT0RFU107CisJaW50IGlnbm9yZV9ieXRlczsKKwl1bnNpZ25lZCBjaGFyIGlkW0xLX05VTV9JR05PUkVfQllURVNdOworCXN0cnVjdCBpbnB1dF9kZXYgZGV2OworCXN0cnVjdCBzZXJpbyAqc2VyaW87CisJc3RydWN0IHdvcmtfc3RydWN0IHRxOworCWNoYXIgbmFtZVs2NF07CisJY2hhciBwaHlzWzMyXTsKKwljaGFyIHR5cGU7CisJaW50IGJlbGxfdm9sdW1lOworCWludCBrZXljbGlja192b2x1bWU7CisJaW50IGN0cmxjbGlja192b2x1bWU7Cit9OworCisvKgorICogQ2FsY3VsYXRlIHZvbHVtZSBwYXJhbWV0ZXIgYnl0ZSBmb3IgYSBnaXZlbiB2b2x1bWUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyCit2b2x1bWVfdG9faHcgKGludCB2b2x1bWVfcGVyY2VudCkKK3sKKwl1bnNpZ25lZCBjaGFyIHJldCA9IDA7CisKKwlpZiAodm9sdW1lX3BlcmNlbnQgPCAwKQorCQl2b2x1bWVfcGVyY2VudCA9IDA7CisJaWYgKHZvbHVtZV9wZXJjZW50ID4gMTAwKQorCQl2b2x1bWVfcGVyY2VudCA9IDEwMDsKKworCWlmICh2b2x1bWVfcGVyY2VudCA+PSAwKQorCQlyZXQgPSA3OworCWlmICh2b2x1bWVfcGVyY2VudCA+PSAxMykJLyogMTIuNSAqLworCQlyZXQgPSA2OworCWlmICh2b2x1bWVfcGVyY2VudCA+PSAyNSkKKwkJcmV0ID0gNTsKKwlpZiAodm9sdW1lX3BlcmNlbnQgPj0gMzgpCS8qIDM3LjUgKi8KKwkJcmV0ID0gNDsKKwlpZiAodm9sdW1lX3BlcmNlbnQgPj0gNTApCisJCXJldCA9IDM7CisJaWYgKHZvbHVtZV9wZXJjZW50ID49IDYzKQkvKiA2Mi41ICovCisJCXJldCA9IDI7CQkvKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHZvbHVtZSAqLworCWlmICh2b2x1bWVfcGVyY2VudCA+PSA3NSkKKwkJcmV0ID0gMTsKKwlpZiAodm9sdW1lX3BlcmNlbnQgPj0gODgpCS8qIDg3LjUgKi8KKwkJcmV0ID0gMDsKKworCXJldCB8PSAweDgwOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2xra2JkX2RldGVjdGlvbl9kb25lIChzdHJ1Y3QgbGtrYmQgKmxrKQoreworCWludCBpOworCisJLyoKKwkgKiBSZXNldCBzZXR0aW5nIGZvciBDb21wb3NlIGtleS4gTGV0IENvbXBvc2UgYmUgS0VZX0NPTVBPU0UuCisJICovCisJbGstPmtleWNvZGVbMHhiMV0gPSBLRVlfQ09NUE9TRTsKKworCS8qCisJICogUHJpbnQga2V5Ym9hcmQgbmFtZSBhbmQgbW9kaWZ5IENvbXBvc2U9QWx0IG9uIHVzZXIncyByZXF1ZXN0LgorCSAqLworCXN3aXRjaCAobGstPmlkWzRdKSB7CisJCWNhc2UgMToKKwkJCXNwcmludGYgKGxrLT5uYW1lLCAiREVDIExLMjAxIGtleWJvYXJkIik7CisKKwkJCWlmIChsazIwMV9jb21wb3NlX2lzX2FsdCkKKwkJCQlsay0+a2V5Y29kZVsweGIxXSA9IEtFWV9MRUZUQUxUOworCQkJYnJlYWs7CisKKwkJY2FzZSAyOgorCQkJc3ByaW50ZiAobGstPm5hbWUsICJERUMgTEs0MDEga2V5Ym9hcmQiKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmIChsay0+bmFtZSwgIlVua25vd24gREVDIGtleWJvYXJkIik7CisJCQlwcmludGsgKEtFUk5fRVJSICJsa2tiZDoga2V5Ym9hcmQgb24gJXMgaXMgdW5rbm93biwgIgorCQkJCQkicGxlYXNlIHJlcG9ydCB0byBKYW4tQmVuZWRpY3QgR2xhdyAiCisJCQkJCSI8amJnbGF3QGx1Zy1vd2wuZGU+XG4iLCBsay0+cGh5cyk7CisJCQlwcmludGsgKEtFUk5fRVJSICJsa2tiZDoga2V5Ym9hcmQgSUQnZWQgYXM6Iik7CisJCQlmb3IgKGkgPSAwOyBpIDwgTEtfTlVNX0lHTk9SRV9CWVRFUzsgaSsrKQorCQkJCXByaW50ayAoIiAweCUwMngiLCBsay0+aWRbaV0pOworCQkJcHJpbnRrICgiXG4iKTsKKwkJCWJyZWFrOworCX0KKwlwcmludGsgKEtFUk5fSU5GTyAibGtrYmQ6IGtleWJvYXJkIG9uICVzIGlkZW50aWZpZWQgYXM6ICVzXG4iLAorCQkJbGstPnBoeXMsIGxrLT5uYW1lKTsKKworCS8qCisJICogUmVwb3J0IGVycm9ycyBkdXJpbmcga2V5Ym9hcmQgYm9vdC11cC4KKwkgKi8KKwlzd2l0Y2ggKGxrLT5pZFsyXSkgeworCQljYXNlIDB4MDA6CisJCQkvKiBBbGwgb2theSAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBMS19TVFVDS19LRVk6CisJCQlwcmludGsgKEtFUk5fRVJSICJsa2tiZDogU3R1Y2sga2V5IG9uIGtleWJvYXJkIGF0ICIKKwkJCQkJIiVzXG4iLCBsay0+cGh5cyk7CisJCQlicmVhazsKKworCQljYXNlIExLX1NFTEZURVNUX0ZBSUxFRDoKKwkJCXByaW50ayAoS0VSTl9FUlIgImxra2JkOiBTZWxmdGVzdCBmYWlsZWQgb24ga2V5Ym9hcmQgIgorCQkJCQkiYXQgJXMsIGtleWJvYXJkIG1heSBub3Qgd29yayAiCisJCQkJCSJwcm9wZXJseVxuIiwgbGstPnBoeXMpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayAoS0VSTl9FUlIgImxra2JkOiBVbmtub3duIGVycm9yICUwMnggb24gIgorCQkJCQkia2V5Ym9hcmQgYXQgJXNcbiIsIGxrLT5pZFsyXSwKKwkJCQkJbGstPnBoeXMpOworCQkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBUcnkgdG8gaGludCB1c2VyIGlmIHRoZXJlJ3MgYSBzdHVjayBrZXkuCisJICovCisJaWYgKGxrLT5pZFsyXSA9PSBMS19TVFVDS19LRVkgJiYgbGstPmlkWzNdICE9IDApCisJCXByaW50ayAoS0VSTl9FUlIgIlNjYW5jb2RlIG9mIHN0dWNrIGtleSBpcyAweCUwMngsIGtleWNvZGUgIgorCQkJCSJpcyAweCUwNHhcbiIsIGxrLT5pZFszXSwKKwkJCQlsay0+a2V5Y29kZVtsay0+aWRbM11dKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIGxra2JkX2ludGVycnVwdCgpIGlzIGNhbGxlZCBieSB0aGUgbG93IGxldmVsIGRyaXZlciB3aGVuIGEgY2hhcmFjdGVyCisgKiBpcyByZWNlaXZlZC4KKyAqLworc3RhdGljIGlycXJldHVybl90Citsa2tiZF9pbnRlcnJ1cHQgKHN0cnVjdCBzZXJpbyAqc2VyaW8sIHVuc2lnbmVkIGNoYXIgZGF0YSwgdW5zaWduZWQgaW50IGZsYWdzLAorCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbGtrYmQgKmxrID0gc2VyaW9fZ2V0X2RydmRhdGEgKHNlcmlvKTsKKwlpbnQgaTsKKworCURCRyAoS0VSTl9JTkZPICJHb3QgYnl0ZSAweCUwMnhcbiIsIGRhdGEpOworCisJaWYgKGxrLT5pZ25vcmVfYnl0ZXMgPiAwKSB7CisJCURCRyAoS0VSTl9JTkZPICJJZ25vcmluZyBhIGJ5dGUgb24gJXNcbiIsCisJCQkJbGstPm5hbWUpOworCQlsay0+aWRbTEtfTlVNX0lHTk9SRV9CWVRFUyAtIGxrLT5pZ25vcmVfYnl0ZXMtLV0gPSBkYXRhOworCisJCWlmIChsay0+aWdub3JlX2J5dGVzID09IDApCisJCQlsa2tiZF9kZXRlY3Rpb25fZG9uZSAobGspOworCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlzd2l0Y2ggKGRhdGEpIHsKKwkJY2FzZSBMS19BTExfS0VZU19VUDoKKwkJCWlucHV0X3JlZ3MgKCZsay0+ZGV2LCByZWdzKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFIChsa2tiZF9rZXljb2RlKTsgaSsrKQorCQkJCWlmIChsay0+a2V5Y29kZVtpXSAhPSBLRVlfUkVTRVJWRUQpCisJCQkJCWlucHV0X3JlcG9ydF9rZXkgKCZsay0+ZGV2LCBsay0+a2V5Y29kZVtpXSwgMCk7CisJCQlpbnB1dF9zeW5jICgmbGstPmRldik7CisJCQlicmVhazsKKwkJY2FzZSBMS19NRVRST05PTUU6CisJCQlEQkcgKEtFUk5fSU5GTyAiR290IExLX01FVFJPTk9NRSBhbmQgZG9uJ3QgIgorCQkJCQkia25vdyBob3cgdG8gaGFuZGxlLi4uXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIExLX09VVFBVVF9FUlJPUjoKKwkJCURCRyAoS0VSTl9JTkZPICJHb3QgTEtfT1VUUFVUX0VSUk9SIGFuZCBkb24ndCAiCisJCQkJCSJrbm93IGhvdyB0byBoYW5kbGUuLi5cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgTEtfSU5QVVRfRVJST1I6CisJCQlEQkcgKEtFUk5fSU5GTyAiR290IExLX0lOUFVUX0VSUk9SIGFuZCBkb24ndCAiCisJCQkJCSJrbm93IGhvdyB0byBoYW5kbGUuLi5cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgTEtfS0JEX0xPQ0tFRDoKKwkJCURCRyAoS0VSTl9JTkZPICJHb3QgTEtfS0JEX0xPQ0tFRCBhbmQgZG9uJ3QgIgorCQkJCQkia25vdyBob3cgdG8gaGFuZGxlLi4uXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIExLX0tCRF9URVNUX01PREVfQUNLOgorCQkJREJHIChLRVJOX0lORk8gIkdvdCBMS19LQkRfVEVTVF9NT0RFX0FDSyBhbmQgZG9uJ3QgIgorCQkJCQkia25vdyBob3cgdG8gaGFuZGxlLi4uXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIExLX1BSRUZJWF9LRVlfRE9XTjoKKwkJCURCRyAoS0VSTl9JTkZPICJHb3QgTEtfUFJFRklYX0tFWV9ET1dOIGFuZCBkb24ndCAiCisJCQkJCSJrbm93IGhvdyB0byBoYW5kbGUuLi5cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgTEtfTU9ERV9DSEFOR0VfQUNLOgorCQkJREJHIChLRVJOX0lORk8gIkdvdCBMS19NT0RFX0NIQU5HRV9BQ0sgYW5kIGlnbm9yZWQgIgorCQkJCQkiaXQgcHJvcGVybHkuLi5cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgTEtfUkVTUE9OU0VfUkVTRVJWRUQ6CisJCQlEQkcgKEtFUk5fSU5GTyAiR290IExLX1JFU1BPTlNFX1JFU0VSVkVEIGFuZCBkb24ndCAiCisJCQkJCSJrbm93IGhvdyB0byBoYW5kbGUuLi5cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMToKKwkJCURCRyAoS0VSTl9JTkZPICJHb3QgMHgwMSwgc2NoZWR1bGluZyByZS1pbml0aWFsaXphdGlvblxuIik7CisJCQlsay0+aWdub3JlX2J5dGVzID0gTEtfTlVNX0lHTk9SRV9CWVRFUzsKKwkJCWxrLT5pZFtMS19OVU1fSUdOT1JFX0JZVEVTIC0gbGstPmlnbm9yZV9ieXRlcy0tXSA9IGRhdGE7CisJCQlzY2hlZHVsZV93b3JrICgmbGstPnRxKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpZiAobGstPmtleWNvZGVbZGF0YV0gIT0gS0VZX1JFU0VSVkVEKSB7CisJCQkJaW5wdXRfcmVncyAoJmxrLT5kZXYsIHJlZ3MpOworCQkJCWlmICghdGVzdF9iaXQgKGxrLT5rZXljb2RlW2RhdGFdLCBsay0+ZGV2LmtleSkpCisJCQkJCWlucHV0X3JlcG9ydF9rZXkgKCZsay0+ZGV2LCBsay0+a2V5Y29kZVtkYXRhXSwgMSk7CisJCQkJZWxzZQorCQkJCQlpbnB1dF9yZXBvcnRfa2V5ICgmbGstPmRldiwgbGstPmtleWNvZGVbZGF0YV0sIDApOworCQkJCWlucHV0X3N5bmMgKCZsay0+ZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IFVua25vd24ga2V5IHdpdGggIgorCQkJCQkJInNjYW5jb2RlIDB4JTAyeCBvbiAlcy5cbiIsCisJCQkJCQlfX0ZJTEVfXywgZGF0YSwgbGstPm5hbWUpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIGxra2JkX2V2ZW50KCkgaGFuZGxlcyBldmVudHMgZnJvbSB0aGUgaW5wdXQgbW9kdWxlLgorICovCitzdGF0aWMgaW50Citsa2tiZF9ldmVudCAoc3RydWN0IGlucHV0X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsCisJCWludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbGtrYmQgKmxrID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGNoYXIgbGVkc19vbiA9IDA7CisJdW5zaWduZWQgY2hhciBsZWRzX29mZiA9IDA7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBFVl9MRUQ6CisJCQlDSEVDS19MRUQgKExFRF9DQVBTTCwgTEtfTEVEX1NISUZUTE9DSyk7CisJCQlDSEVDS19MRUQgKExFRF9DT01QT1NFLCBMS19MRURfQ09NUE9TRSk7CisJCQlDSEVDS19MRUQgKExFRF9TQ1JPTExMLCBMS19MRURfU0NST0xMTE9DSyk7CisJCQlDSEVDS19MRUQgKExFRF9TTEVFUCwgTEtfTEVEX1dBSVQpOworCQkJaWYgKGxlZHNfb24gIT0gMCkgeworCQkJCWxrLT5zZXJpby0+d3JpdGUgKGxrLT5zZXJpbywgTEtfQ01EX0xFRF9PTik7CisJCQkJbGstPnNlcmlvLT53cml0ZSAobGstPnNlcmlvLCBsZWRzX29uKTsKKwkJCX0KKwkJCWlmIChsZWRzX29mZiAhPSAwKSB7CisJCQkJbGstPnNlcmlvLT53cml0ZSAobGstPnNlcmlvLCBMS19DTURfTEVEX09GRik7CisJCQkJbGstPnNlcmlvLT53cml0ZSAobGstPnNlcmlvLCBsZWRzX29mZik7CisJCQl9CisJCQlyZXR1cm4gMDsKKworCQljYXNlIEVWX1NORDoKKwkJCXN3aXRjaCAoY29kZSkgeworCQkJCWNhc2UgU05EX0NMSUNLOgorCQkJCQlpZiAodmFsdWUgPT0gMCkgeworCQkJCQkJREJHICgiJXM6IERlYWN0aXZhdGluZyBrZXkgY2xpY2tzXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCQkJbGstPnNlcmlvLT53cml0ZSAobGstPnNlcmlvLCBMS19DTURfRElTQUJMRV9LRVlDTElDSyk7CisJCQkJCQlsay0+c2VyaW8tPndyaXRlIChsay0+c2VyaW8sIExLX0NNRF9ESVNBQkxFX0NUUkNMSUNLKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCURCRyAoIiVzOiBBY3RpdmF0aW5nIGtleSBjbGlja3NcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCQlsay0+c2VyaW8tPndyaXRlIChsay0+c2VyaW8sIExLX0NNRF9FTkFCTEVfS0VZQ0xJQ0spOworCQkJCQkJbGstPnNlcmlvLT53cml0ZSAobGstPnNlcmlvLCB2b2x1bWVfdG9faHcgKGxrLT5rZXljbGlja192b2x1bWUpKTsKKwkJCQkJCWxrLT5zZXJpby0+d3JpdGUgKGxrLT5zZXJpbywgTEtfQ01EX0VOQUJMRV9DVFJDTElDSyk7CisJCQkJCQlsay0+c2VyaW8tPndyaXRlIChsay0+c2VyaW8sIHZvbHVtZV90b19odyAobGstPmN0cmxjbGlja192b2x1bWUpKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gMDsKKworCQkJCWNhc2UgU05EX0JFTEw6CisJCQkJCWlmICh2YWx1ZSAhPSAwKQorCQkJCQkJbGstPnNlcmlvLT53cml0ZSAobGstPnNlcmlvLCBMS19DTURfU09VTkRfQkVMTCk7CisKKwkJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRrIChLRVJOX0VSUiAiJXMgKCk6IEdvdCB1bmtub3duIHR5cGUgJWQsIGNvZGUgJWQsIHZhbHVlICVkXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIHR5cGUsIGNvZGUsIHZhbHVlKTsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBsa2tiZF9yZWluaXQoKSBzZXRzIGxlZHMgYW5kIGJlZXBzIHRvIGEgc3RhdGUgdGhlIGNvbXB1dGVyIHJlbWVtYmVycyB0aGV5CisgKiB3ZXJlIGluLgorICovCitzdGF0aWMgdm9pZAorbGtrYmRfcmVpbml0ICh2b2lkICpkYXRhKQoreworCXN0cnVjdCBsa2tiZCAqbGsgPSBkYXRhOworCWludCBkaXZpc2lvbjsKKwl1bnNpZ25lZCBjaGFyIGxlZHNfb24gPSAwOworCXVuc2lnbmVkIGNoYXIgbGVkc19vZmYgPSAwOworCisJLyogQXNrIGZvciBJRCAqLworCWxrLT5zZXJpby0+d3JpdGUgKGxrLT5zZXJpbywgTEtfQ01EX1JFUVVFU1RfSUQpOworCisJLyogUmVzZXQgcGFyYW1ldGVycyAqLworCWxrLT5zZXJpby0+d3JpdGUgKGxrLT5zZXJpbywgTEtfQ01EX1NFVF9ERUZBVUxUUyk7CisKKwkvKiBTZXQgTEVEcyAqLworCUNIRUNLX0xFRCAoTEVEX0NBUFNMLCBMS19MRURfU0hJRlRMT0NLKTsKKwlDSEVDS19MRUQgKExFRF9DT01QT1NFLCBMS19MRURfQ09NUE9TRSk7CisJQ0hFQ0tfTEVEIChMRURfU0NST0xMTCwgTEtfTEVEX1NDUk9MTExPQ0spOworCUNIRUNLX0xFRCAoTEVEX1NMRUVQLCBMS19MRURfV0FJVCk7CisJaWYgKGxlZHNfb24gIT0gMCkgeworCQlsay0+c2VyaW8tPndyaXRlIChsay0+c2VyaW8sIExLX0NNRF9MRURfT04pOworCQlsay0+c2VyaW8tPndyaXRlIChsay0+c2VyaW8sIGxlZHNfb24pOworCX0KKwlpZiAobGVkc19vZmYgIT0gMCkgeworCQlsay0+c2VyaW8tPndyaXRlIChsay0+c2VyaW8sIExLX0NNRF9MRURfT0ZGKTsKKwkJbGstPnNlcmlvLT53cml0ZSAobGstPnNlcmlvLCBsZWRzX29mZik7CisJfQorCisJLyoKKwkgKiBUcnkgdG8gYWN0aXZhdGUgZXh0ZW5kZWQgTEs0MDEgbW9kZS4gVGhpcyBjb21tYW5kIHdpbGwKKwkgKiBvbmx5IHdvcmsgd2l0aCBhIExLNDAxIGtleWJvYXJkIGFuZCBncmFudHMgYWNjZXNzIHRvCisJICogTEFsdCwgUkFsdCwgUkNvbXBvc2UgYW5kIFJTaGlmdC4KKwkgKi8KKwlsay0+c2VyaW8tPndyaXRlIChsay0+c2VyaW8sIExLX0NNRF9FTkFCTEVfTEs0MDEpOworCisJLyogU2V0IGFsbCBrZXlzIHRvIFVQRE9XTiBtb2RlICovCisJZm9yIChkaXZpc2lvbiA9IDE7IGRpdmlzaW9uIDw9IDE0OyBkaXZpc2lvbisrKQorCQlsay0+c2VyaW8tPndyaXRlIChsay0+c2VyaW8sIExLX0NNRF9TRVRfTU9ERSAoTEtfTU9ERV9VUERPV04sCisJCQkJCWRpdmlzaW9uKSk7CisKKwkvKiBFbmFibGUgYmVsbCBhbmQgc2V0IHZvbHVtZSAqLworCWxrLT5zZXJpby0+d3JpdGUgKGxrLT5zZXJpbywgTEtfQ01EX0VOQUJMRV9CRUxMKTsKKwlsay0+c2VyaW8tPndyaXRlIChsay0+c2VyaW8sIHZvbHVtZV90b19odyAobGstPmJlbGxfdm9sdW1lKSk7CisKKwkvKiBFbmFibGUvZGlzYWJsZSBrZXljbGljayAoYW5kIHBvc3NpYmx5IHNldCB2b2x1bWUpICovCisJaWYgKHRlc3RfYml0IChTTkRfQ0xJQ0ssIGxrLT5kZXYuc25kKSkgeworCQlsay0+c2VyaW8tPndyaXRlIChsay0+c2VyaW8sIExLX0NNRF9FTkFCTEVfS0VZQ0xJQ0spOworCQlsay0+c2VyaW8tPndyaXRlIChsay0+c2VyaW8sIHZvbHVtZV90b19odyAobGstPmtleWNsaWNrX3ZvbHVtZSkpOworCQlsay0+c2VyaW8tPndyaXRlIChsay0+c2VyaW8sIExLX0NNRF9FTkFCTEVfQ1RSQ0xJQ0spOworCQlsay0+c2VyaW8tPndyaXRlIChsay0+c2VyaW8sIHZvbHVtZV90b19odyAobGstPmN0cmxjbGlja192b2x1bWUpKTsKKwl9IGVsc2UgeworCQlsay0+c2VyaW8tPndyaXRlIChsay0+c2VyaW8sIExLX0NNRF9ESVNBQkxFX0tFWUNMSUNLKTsKKwkJbGstPnNlcmlvLT53cml0ZSAobGstPnNlcmlvLCBMS19DTURfRElTQUJMRV9DVFJDTElDSyk7CisJfQorCisJLyogU291bmQgdGhlIGJlbGwgaWYgbmVlZGVkICovCisJaWYgKHRlc3RfYml0IChTTkRfQkVMTCwgbGstPmRldi5zbmQpKQorCQlsay0+c2VyaW8tPndyaXRlIChsay0+c2VyaW8sIExLX0NNRF9TT1VORF9CRUxMKTsKK30KKworLyoKKyAqIGxra2JkX2Nvbm5lY3QoKSBwcm9iZXMgZm9yIGEgTEsga2V5Ym9hcmQgYW5kIGZpbGxzIHRoZSBuZWNlc3Nhcnkgc3RydWN0dXJlcy4KKyAqLworc3RhdGljIGludAorbGtrYmRfY29ubmVjdCAoc3RydWN0IHNlcmlvICpzZXJpbywgc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBsa2tiZCAqbGs7CisJaW50IGk7CisJaW50IGVycjsKKworCWlmICghKGxrID0ga21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbGtrYmQpLCBHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0IChsaywgMCwgc2l6ZW9mIChzdHJ1Y3QgbGtrYmQpKTsKKworCWluaXRfaW5wdXRfZGV2ICgmbGstPmRldik7CisJc2V0X2JpdCAoRVZfS0VZLCBsay0+ZGV2LmV2Yml0KTsKKwlzZXRfYml0IChFVl9MRUQsIGxrLT5kZXYuZXZiaXQpOworCXNldF9iaXQgKEVWX1NORCwgbGstPmRldi5ldmJpdCk7CisJc2V0X2JpdCAoRVZfUkVQLCBsay0+ZGV2LmV2Yml0KTsKKwlzZXRfYml0IChMRURfQ0FQU0wsIGxrLT5kZXYubGVkYml0KTsKKwlzZXRfYml0IChMRURfU0xFRVAsIGxrLT5kZXYubGVkYml0KTsKKwlzZXRfYml0IChMRURfQ09NUE9TRSwgbGstPmRldi5sZWRiaXQpOworCXNldF9iaXQgKExFRF9TQ1JPTExMLCBsay0+ZGV2LmxlZGJpdCk7CisJc2V0X2JpdCAoU05EX0JFTEwsIGxrLT5kZXYuc25kYml0KTsKKwlzZXRfYml0IChTTkRfQ0xJQ0ssIGxrLT5kZXYuc25kYml0KTsKKworCWxrLT5zZXJpbyA9IHNlcmlvOworCisJSU5JVF9XT1JLICgmbGstPnRxLCBsa2tiZF9yZWluaXQsIGxrKTsKKworCWxrLT5iZWxsX3ZvbHVtZSA9IGJlbGxfdm9sdW1lOworCWxrLT5rZXljbGlja192b2x1bWUgPSBrZXljbGlja192b2x1bWU7CisJbGstPmN0cmxjbGlja192b2x1bWUgPSBjdHJsY2xpY2tfdm9sdW1lOworCisJbGstPmRldi5rZXljb2RlID0gbGstPmtleWNvZGU7CisJbGstPmRldi5rZXljb2Rlc2l6ZSA9IHNpemVvZiAobGtfa2V5Y29kZV90KTsKKwlsay0+ZGV2LmtleWNvZGVtYXggPSBMS19OVU1fS0VZQ09ERVM7CisKKwlsay0+ZGV2LmV2ZW50ID0gbGtrYmRfZXZlbnQ7CisJbGstPmRldi5wcml2YXRlID0gbGs7CisKKwlzZXJpb19zZXRfZHJ2ZGF0YSAoc2VyaW8sIGxrKTsKKworCWVyciA9IHNlcmlvX29wZW4gKHNlcmlvLCBkcnYpOworCWlmIChlcnIpIHsKKwkJc2VyaW9fc2V0X2RydmRhdGEgKHNlcmlvLCBOVUxMKTsKKwkJa2ZyZWUgKGxrKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzcHJpbnRmIChsay0+bmFtZSwgIkRFQyBMSyBrZXlib2FyZCIpOworCXNwcmludGYgKGxrLT5waHlzLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOworCisJbWVtY3B5IChsay0+a2V5Y29kZSwgbGtrYmRfa2V5Y29kZSwgc2l6ZW9mIChsa19rZXljb2RlX3QpICogTEtfTlVNX0tFWUNPREVTKTsKKwlmb3IgKGkgPSAwOyBpIDwgTEtfTlVNX0tFWUNPREVTOyBpKyspCisJCXNldF9iaXQgKGxrLT5rZXljb2RlW2ldLCBsay0+ZGV2LmtleWJpdCk7CisKKwlsay0+ZGV2Lm5hbWUgPSBsay0+bmFtZTsKKwlsay0+ZGV2LnBoeXMgPSBsay0+cGh5czsKKwlsay0+ZGV2LmlkLmJ1c3R5cGUgPSBCVVNfUlMyMzI7CisJbGstPmRldi5pZC52ZW5kb3IgPSBTRVJJT19MS0tCRDsKKwlsay0+ZGV2LmlkLnByb2R1Y3QgPSAwOworCWxrLT5kZXYuaWQudmVyc2lvbiA9IDB4MDEwMDsKKwlsay0+ZGV2LmRldiA9ICZzZXJpby0+ZGV2OworCisJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlICgmbGstPmRldik7CisKKwlwcmludGsgKEtFUk5fSU5GTyAiaW5wdXQ6ICVzIG9uICVzLCBpbml0aWF0aW5nIHJlc2V0XG4iLCBsay0+bmFtZSwgc2VyaW8tPnBoeXMpOworCWxrLT5zZXJpby0+d3JpdGUgKGxrLT5zZXJpbywgTEtfQ01EX1BPV0VSQ1lDTEVfUkVTRVQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBsa2tiZF9kaXNjb25uZWN0KCkgdW5yZWdpc3RlcnMgYW5kIGNsb3NlcyBiZWhpbmQgdXMuCisgKi8KK3N0YXRpYyB2b2lkCitsa2tiZF9kaXNjb25uZWN0IChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKQoreworCXN0cnVjdCBsa2tiZCAqbGsgPSBzZXJpb19nZXRfZHJ2ZGF0YSAoc2VyaW8pOworCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UgKCZsay0+ZGV2KTsKKwlzZXJpb19jbG9zZSAoc2VyaW8pOworCXNlcmlvX3NldF9kcnZkYXRhIChzZXJpbywgTlVMTCk7CisJa2ZyZWUgKGxrKTsKK30KKworc3RhdGljIHN0cnVjdCBzZXJpb19kZXZpY2VfaWQgbGtrYmRfc2VyaW9faWRzW10gPSB7CisJeworCQkudHlwZQk9IFNFUklPX1JTMjMyLAorCQkucHJvdG8JPSBTRVJJT19MS0tCRCwKKwkJLmlkCT0gU0VSSU9fQU5ZLAorCQkuZXh0cmEJPSBTRVJJT19BTlksCisJfSwKKwl7IDAgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShzZXJpbywgbGtrYmRfc2VyaW9faWRzKTsKKworc3RhdGljIHN0cnVjdCBzZXJpb19kcml2ZXIgbGtrYmRfZHJ2ID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJsa2tiZCIsCisJfSwKKwkuZGVzY3JpcHRpb24JPSBEUklWRVJfREVTQywKKwkuaWRfdGFibGUJPSBsa2tiZF9zZXJpb19pZHMsCisJLmNvbm5lY3QJPSBsa2tiZF9jb25uZWN0LAorCS5kaXNjb25uZWN0CT0gbGtrYmRfZGlzY29ubmVjdCwKKwkuaW50ZXJydXB0CT0gbGtrYmRfaW50ZXJydXB0LAorfTsKKworLyoKKyAqIFRoZSBmdW5jdGlvbnMgZm9yIGluc2VyaW5nL3JlbW92aW5nIHVzIGFzIGEgbW9kdWxlLgorICovCitzdGF0aWMgaW50IF9faW5pdAorbGtrYmRfaW5pdCAodm9pZCkKK3sKKwlzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJmxra2JkX2Rydik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorbGtrYmRfZXhpdCAodm9pZCkKK3sKKwlzZXJpb191bnJlZ2lzdGVyX2RyaXZlcigmbGtrYmRfZHJ2KTsKK30KKworbW9kdWxlX2luaXQgKGxra2JkX2luaXQpOworbW9kdWxlX2V4aXQgKGxra2JkX2V4aXQpOworCg==