ZGlmZiAtLWdpdCBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAva2VybmVsL3RyYWNrZXIuYyBiL3Vwc3RyZWFtL2xpbnV4LTUuMTAva2VybmVsL3RyYWNrZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZjdlMWFiCi0tLSAvZGV2L251bGwKKysrIGIvdXBzdHJlYW0vbGludXgtNS4xMC9rZXJuZWwvdHJhY2tlci5jCkBAIC0wLDAgKzEsNDU5IEBACisvKgorICogdHJhY2tlci5jIC0gU3lzdGVtIGFjY291bnRpbmcgb3ZlciB0YXNrc3RhdHMgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChDKSBKYXkgTGFuLAk8amxhbkBzZ2kuY29tPgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9jbG9jay5oPgorI2luY2x1ZGUgInJhbV9jb25maWcuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILrqtqjS5SAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfT1NfTElOVVggICAgICAgICAgICAgICAgICAgIDEKKworI2lmIGRlZmluZWQoX09TX1RPUykKKyMgZGVmaW5lIE9TX1NUQVRJU1RJQ19JUkFNX0JBU0UgICAgKElSQU1fQkFTRV9BRERSX09TX1NUQVRJU1RJQ19QU0NQVSkKKyMgZGVmaW5lIE9TX1NUQVRJU1RJQ19USU1FICAgICAgICAgekRydlRpbWVyX1N0YW1wKCkKKyNlbGlmIGRlZmluZWQoX09TX0xJTlVYKQorIyBkZWZpbmUgT1NfU1RBVElTVElDX0lSQU1fQkFTRSAgICBnX3p4aWNfdHJhY2VfYXBjcHVfYWRkciAvLyhJUkFNX0JBU0VfQUREUl9PU19TVEFUSVNUSUNfQVBDUFUpCisjIGRlZmluZSBPU19TVEFUSVNUSUNfVElNRSAgICAgICAgIChjcHVfY2xvY2soMCk+PjEwKQorI2Vsc2UKKyMgZXJyb3IgInVua25vd24gb3MiCisjZW5kaWYKKworCisKKyNkZWZpbmUgT1NfSVJBTV9TVEFUSVNUSUNfQ05UICAgICAgICAgKDUpCisjZGVmaW5lIE9TX0lSQU1fU1RBVElTVElDX05BTUVfTEVOICAgICgxNikKKyNkZWZpbmUgT1NfRERSX1NUQVRJU1RJQ19DTlQgICAgICAgICAgKDEwMDApCisKKyNkZWZpbmUgT1NfSVJBTV9USFJFQURfU1dBUElOICAgICAgKE9TX1NUQVRJU1RJQ19JUkFNX0JBU0UpCisjZGVmaW5lIE9TX0lSQU1fSVJRX1NUQVJUICAgICAgICAgIChPU19JUkFNX1RIUkVBRF9TV0FQSU4gKyBzaXplb2YodF9vc19pcmFtX3RocmVhZF9zdGF0aXN0aWMpKQorI2RlZmluZSBPU19JUkFNX0lSUV9FTkQgICAgICAgICAgICAoT1NfSVJBTV9JUlFfU1RBUlQgKyBzaXplb2YodF9vc19pcmFtX3N0YXRpc3RpYykpCisKKyNpZiBkZWZpbmVkKF9PU19UT1MpCisjZGVmaW5lIE9TX0lSQU1fRFNSX1NUQVJUICAgICAgICAgIChPU19JUkFNX0lSUV9FTkQgKyBzaXplb2YodF9vc19pcmFtX3N0YXRpc3RpYykpCisjZGVmaW5lIE9TX0lSQU1fRFNSX0VORCAgICAgICAgICAgIChPU19JUkFNX0RTUl9TVEFSVCArIHNpemVvZih0X29zX2lyYW1fc3RhdGlzdGljKSkKKyNlbGlmIGRlZmluZWQoX09TX0xJTlVYKQorI2RlZmluZSBPU19JUkFNX1NPRlRJUlFfU1RBUlQgICAgICAoT1NfSVJBTV9JUlFfRU5EICsgc2l6ZW9mKHRfb3NfaXJhbV9zdGF0aXN0aWMpKQorI2RlZmluZSBPU19JUkFNX1NPRlRJUlFfRU5EICAgICAgICAoT1NfSVJBTV9TT0ZUSVJRX1NUQVJUICsgc2l6ZW9mKHRfb3NfaXJhbV9zdGF0aXN0aWMpKQorI2RlZmluZSBPU19JUkFNX1RJTUVSX1NUQVJUICAgICAgICAoT1NfSVJBTV9TT0ZUSVJRX0VORCArIHNpemVvZih0X29zX2lyYW1fc3RhdGlzdGljKSkKKyNkZWZpbmUgT1NfSVJBTV9USU1FUl9FTkQgICAgICAgICAgKE9TX0lSQU1fVElNRVJfU1RBUlQgKyBzaXplb2YodF9vc19pcmFtX3N0YXRpc3RpYykpCisjZW5kaWYKKworI2RlZmluZSBvc19zdGF0aXN0aWNfY2hlY2soKSAgICAgICAqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopT1NfU1RBVElTVElDX0lSQU1fQkFTRSkKKyNkZWZpbmUgb3Nfc3RhdGlzdGljX2VuYWJsZWQoKSAgICAgZ19vc19zdGF0aXN0aWNfZW5hYmxlIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyv2+3b3hubm2qNLlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCB7CisgICAgdW5zaWduZWQgaW50IGNudDsKKyAgICB1bnNpZ25lZCBpbnQgaW5kZXg7CisgICAgc3RydWN0IHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBuYW1lW09TX0lSQU1fU1RBVElTVElDX05BTUVfTEVOXTsKKyAgICAgICAgdW5zaWduZWQgaW50IGRhdGEyOworICAgIH0gc3RhdGlzdGljc1tPU19JUkFNX1NUQVRJU1RJQ19DTlRdOworfXRfb3NfaXJhbV90aHJlYWRfc3RhdGlzdGljOworCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCB7CisgICAgdW5zaWduZWQgaW50IGNudDsKKyAgICB1bnNpZ25lZCBpbnQgaW5kZXg7CisgICAgc3RydWN0IHsKKyAgICAgICAgdW5zaWduZWQgaW50IGRhdGExOworICAgICAgICB1bnNpZ25lZCBpbnQgZGF0YTI7CisgICAgfSBzdGF0aXN0aWNzW09TX0lSQU1fU1RBVElTVElDX0NOVF07Cit9dF9vc19pcmFtX3N0YXRpc3RpYzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCBjbnQ7CisgICAgdW5zaWduZWQgaW50IGluZGV4OworICAgIHN0cnVjdCB7CisgICAgICAgIHVuc2lnbmVkIGludCBkYXRhMTsKKyAgICAgICAgdW5zaWduZWQgaW50IGRhdGEyOworICAgIH0gc3RhdGlzdGljc1tPU19ERFJfU1RBVElTVElDX0NOVF07Cit9dF9vc19kZHJfc3RhdGlzdGljOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKu+1rHkwb8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChfT1NfTElOVVgpCit2b2xhdGlsZSAgc3RhdGljIGNoYXIgKmdfenhpY190cmFjZV9hcGNwdV9hZGRyOworI2VuZGlmCisKK3ZvbGF0aWxlICBzdGF0aWMgaW50IGdfb3Nfc3RhdGlzdGljX2VuYWJsZTsKK3ZvbGF0aWxlICBzdGF0aWMgdW5zaWduZWQgaW50IGdfb3Nfc3RhdGlzdGljX2NudDsKKwordm9sYXRpbGUgIHN0YXRpYyB0X29zX2lyYW1fdGhyZWFkX3N0YXRpc3RpYyAqZ19vc19pcmFtX3N3YXBpbl9zdGF0aXN0aWM7Cit2b2xhdGlsZSAgc3RhdGljIHRfb3NfaXJhbV9zdGF0aXN0aWMgICAgICAgICpnX29zX2lyYW1faXJxX3N0YXJ0X3N0YXRpc3RpYzsKK3ZvbGF0aWxlICBzdGF0aWMgdF9vc19pcmFtX3N0YXRpc3RpYyAgICAgICAgKmdfb3NfaXJhbV9pcnFfZW5kX3N0YXRpc3RpYzsKKworI2lmIGRlZmluZWQoX09TX1RPUykKK3N0YXRpYyB0X29zX2lyYW1fc3RhdGlzdGljICpnX29zX2lyYW1fZHNyX3N0YXJ0X3N0YXRpc3RpYzsKK3N0YXRpYyB0X29zX2lyYW1fc3RhdGlzdGljICpnX29zX2lyYW1fZHNyX2VuZF9zdGF0aXN0aWM7CisjZWxpZiBkZWZpbmVkKF9PU19MSU5VWCkKK3ZvbGF0aWxlICBzdGF0aWMgdF9vc19pcmFtX3N0YXRpc3RpYyAqZ19vc19pcmFtX3NvZnRpcnFfc3RhcnRfc3RhdGlzdGljOwordm9sYXRpbGUgIHN0YXRpYyB0X29zX2lyYW1fc3RhdGlzdGljICpnX29zX2lyYW1fc29mdGlycV9lbmRfc3RhdGlzdGljOwordm9sYXRpbGUgIHN0YXRpYyB0X29zX2lyYW1fc3RhdGlzdGljICpnX29zX2lyYW1fdGltZXJfc3RhcnRfc3RhdGlzdGljOwordm9sYXRpbGUgIHN0YXRpYyB0X29zX2lyYW1fc3RhdGlzdGljICpnX29zX2lyYW1fdGltZXJfZW5kX3N0YXRpc3RpYzsKKyNlbmRpZgorCit2b2xhdGlsZSAgc3RhdGljIHRfb3NfZGRyX3N0YXRpc3RpYyAqZ19vc19kZHJfc3dhcGluX3N0YXRpc3RpYzsKK3ZvbGF0aWxlICBzdGF0aWMgdF9vc19kZHJfc3RhdGlzdGljICpnX29zX2Rkcl9pcnFfc3RhcnRfc3RhdGlzdGljOwordm9sYXRpbGUgIHN0YXRpYyB0X29zX2Rkcl9zdGF0aXN0aWMgKmdfb3NfZGRyX2lycV9lbmRfc3RhdGlzdGljOworCisjaWYgZGVmaW5lZChfT1NfVE9TKQorc3RhdGljIHRfb3NfZGRyX3N0YXRpc3RpYyAqZ19vc19kZHJfZHNyX3N0YXJ0X3N0YXRpc3RpYzsKK3N0YXRpYyB0X29zX2Rkcl9zdGF0aXN0aWMgKmdfb3NfZGRyX2Rzcl9lbmRfc3RhdGlzdGljOworI2VsaWYgZGVmaW5lZChfT1NfTElOVVgpCit2b2xhdGlsZSAgc3RhdGljIHRfb3NfZGRyX3N0YXRpc3RpYyAqZ19vc19kZHJfc29mdGlycV9zdGFydF9zdGF0aXN0aWM7Cit2b2xhdGlsZSAgc3RhdGljIHRfb3NfZGRyX3N0YXRpc3RpYyAqZ19vc19kZHJfc29mdGlycV9lbmRfc3RhdGlzdGljOwordm9sYXRpbGUgIHN0YXRpYyB0X29zX2Rkcl9zdGF0aXN0aWMgKmdfb3NfZGRyX3RpbWVyX3N0YXJ0X3N0YXRpc3RpYzsKK3ZvbGF0aWxlICBzdGF0aWMgdF9vc19kZHJfc3RhdGlzdGljICpnX29zX2Rkcl90aW1lcl9lbmRfc3RhdGlzdGljOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDIq77Wuq/K/cn5w/cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgb3Nfc3RhdGlzdGljX2VuYWJsZSh2b2lkKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICC+1rK/uq/K/SAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILmmxNzD6Mr2OiAgICAguey8o82zvMa1vUlSQU0KKyogss7K/cu1w/c6ICAgICAKKyogICAotKvI67LOyv0pICBpcmFtX2FkZHI6ILXY1rcgCisgICAgICAgICAgICAgICAgZGF0YTogICAgICDKwrz+z+4KKyAgICAgICAgICAgICAgICB0aW1lOiAgICAgIMqxvOQKKyogICAotKuz9rLOyv0pICB2b2lkCisqILe1ILvYINa1OiAgICAgdm9pZAorKiDG5Mv8y7XD9zogICAgIM7eCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkIG9zX3N0YXRpc3RpY19pbl9pcmFtKHZvbGF0aWxlIHZvaWQgKmlyYW1fYWRkciwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyB0aW1lKQoreworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgaW5kZXg7CisgICAgdF9vc19pcmFtX3N0YXRpc3RpYyAqaXJhbTsKKworICAgIGlyYW0gPSAodF9vc19pcmFtX3N0YXRpc3RpYyAqKWlyYW1fYWRkcjsKKyAgICAKKyAgICBpbmRleCA9IGlyYW0tPmluZGV4OworICAgIGlmKGluZGV4ID49IE9TX0lSQU1fU1RBVElTVElDX0NOVCkKKyAgICB7CisgICAgICAgIGluZGV4ID0gMDsKKyAgICB9CisKKyAgICBpcmFtLT5zdGF0aXN0aWNzW2luZGV4XS5kYXRhMSA9ICh1bnNpZ25lZCBpbnQpZGF0YTsKKyAgICBpcmFtLT5zdGF0aXN0aWNzW2luZGV4XS5kYXRhMiA9IHRpbWU7CisgICAgaW5kZXgrKzsKKworICAgIGlyYW0tPmluZGV4ID0gaW5kZXg7CisgICAgaXJhbS0+Y250ID0gZ19vc19zdGF0aXN0aWNfY250OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC5psTcw+jK9jogICAgIM/fs8y57LyjzbO8xrW9SVJBTQorKiCyzsr9y7XD9zogICAgIAorKiAgICi0q8jrss7K/SkgIGlyYW1fYWRkcjogtdjWtyAKKyAgICAgICAgICAgICAgICBkYXRhOiAgICAgIMrCvP7P7gorICAgICAgICAgICAgICAgIHRpbWU6ICAgICAgyrG85AorKiAgICi0q7P2ss7K/SkgIHZvaWQKKyogt7Ugu9gg1rU6ICAgICB2b2lkCisqIMbky/zLtcP3OiAgICAgzt4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgb3Nfc3RhdGlzdGljX3RocmVhZF9pbl9pcmFtKHZvbGF0aWxlIHZvaWQgKmlyYW1fYWRkciwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyB0aW1lKQoreworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgIGluZGV4OworICAgIHRfb3NfaXJhbV90aHJlYWRfc3RhdGlzdGljICppcmFtOworCisgICAgaXJhbSA9ICh0X29zX2lyYW1fdGhyZWFkX3N0YXRpc3RpYyAqKWlyYW1fYWRkcjsKKyAgICAKKyAgICBpbmRleCA9IGlyYW0tPmluZGV4OworICAgIGlmKGluZGV4ID49IE9TX0lSQU1fU1RBVElTVElDX0NOVCkKKyAgICB7CisgICAgICAgIGluZGV4ID0gMDsKKyAgICB9CisKKyNpZiBkZWZpbmVkKF9PU19UT1MpCisgICAgc3RybmNweSgoY2hhciAqKShpcmFtLT5zdGF0aXN0aWNzW2luZGV4XS5uYW1lKSwgY3lnX3RocmVhZF9nZXRfbmFtZSgoY3lnX2hhbmRsZV90KWRhdGEpLCBPU19JUkFNX1NUQVRJU1RJQ19OQU1FX0xFTiAtIDEpOworI2VsaWYgZGVmaW5lZChfT1NfTElOVVgpCisgICAgc3RybmNweSgoY2hhciAqKShpcmFtLT5zdGF0aXN0aWNzW2luZGV4XS5uYW1lKSwgKChzdHJ1Y3QgdGFza19zdHJ1Y3QgKilkYXRhKS0+Y29tbSwgT1NfSVJBTV9TVEFUSVNUSUNfTkFNRV9MRU4gLSAxKTsKKyNlbHNlCisjIGVycm9yICJ1bmtvd24gb3MiCisjZW5kaWYKKyAgICBpcmFtLT5zdGF0aXN0aWNzW2luZGV4XS5uYW1lW09TX0lSQU1fU1RBVElTVElDX05BTUVfTEVOIC0gMV0gPSAwOworICAgIGlyYW0tPnN0YXRpc3RpY3NbaW5kZXhdLmRhdGEyID0gdGltZTsKKyAgICBpbmRleCsrOworCisgICAgaXJhbS0+aW5kZXggPSBpbmRleDsKKyAgICBpcmFtLT5jbnQgPSBnX29zX3N0YXRpc3RpY19jbnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILmmxNzD6Mr2OiAgICAguey8o82zvMa1vUREUgorKiCyzsr9y7XD9zogICAgIAorKiAgICi0q8jrss7K/SkgIGlyYW1fYWRkcjogtdjWtyAKKyAgICAgICAgICAgICAgICBkYXRhOiAgICAgIMrCvP7P7gorICAgICAgICAgICAgICAgIHRpbWU6ICAgICAgyrG85AorKiAgICi0q7P2ss7K/SkgIHZvaWQKKyogt7Ugu9gg1rU6ICAgICB2b2lkCisqIMbky/zLtcP3OiAgICAgzt4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgb3Nfc3RhdGlzdGljX2luX2Rkcih2b2lkICpkZHJfYWRkciwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyB0aW1lKQoreworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgIGluZGV4OworICAgIHRfb3NfZGRyX3N0YXRpc3RpYyAgICAgICAgICpkZHI7CisKKyAgICBkZHIgID0gKHRfb3NfZGRyX3N0YXRpc3RpYyAqKWRkcl9hZGRyOworICAgIAorICAgIGluZGV4ID0gZGRyLT5pbmRleDsKKyAgICBpZiAoaW5kZXggPj0gT1NfRERSX1NUQVRJU1RJQ19DTlQpCisgICAgeworICAgICAgICBpbmRleCA9IDA7CisgICAgfQorICAgIGRkci0+c3RhdGlzdGljc1tpbmRleF0uZGF0YTEgPSAodW5zaWduZWQgaW50KWRhdGE7CisgICAgZGRyLT5zdGF0aXN0aWNzW2luZGV4XS5kYXRhMiA9IHRpbWU7CisgICAgaW5kZXgrKzsKKworICAgIGRkci0+aW5kZXggPSBpbmRleDsKKyAgICBkZHItPmNudCAgID0gZ19vc19zdGF0aXN0aWNfY250OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC5psTcw+jK9jogICAgILnsvKPNs7zGtb1ERFIKKyogss7K/cu1w/c6ICAgICAKKyogICAotKvI67LOyv0pICBpcmFtX2FkZHI6ILXY1rcgCisgICAgICAgICAgICAgICAgZGF0YTogICAgICDKwrz+z+4KKyAgICAgICAgICAgICAgICB0aW1lOiAgICAgIMqxvOQKKyogICAotKuz9rLOyv0pICB2b2lkCisqILe1ILvYINa1OiAgICAgdm9pZAorKiDG5Mv8y7XD9zogICAgIM7eCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkIG9zX3N0YXRpc3RpY19pbmZvX3VwZGF0ZSh2b2lkKQoreworICAgIGdfb3Nfc3RhdGlzdGljX2NudCsrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC5psTcw+jK9jogICAgILaoyrHG97vYtfe5s9fTCisqILLOyv3LtcP3OiAgICAgCisqICAgKLSryOuyzsr9KSAgCisqICAgKLSrs/ayzsr9KSAgdm9pZAorKiC3tSC72CDWtTogICAgIHZvaWQKKyogxuTL/Mu1w/c6ICAgICDO3gorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgb3Nfc3RhdGlzdGljX2RlbGF5ZWRfd29ya190aW1lcl9mbih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisgICAgaW50IHNlYyA9IDA7CisgICAgbXNsZWVwKDIwMDAwKTsKKyAgICB3aGlsZSghb3Nfc3RhdGlzdGljX2NoZWNrKCkpCisgICAgeworICAgICAgICAvL7Osuf00MHOjrNaxvdPNy7P2CisgICAgICAgIGlmKHNlYyA+PSA0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG1zbGVlcCgxMDAwMCk7CisgICAgICAgIHNlYysrOworICAgIH0KKyAgICBvc19zdGF0aXN0aWNfZW5hYmxlKCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKu+1rqvyv3Ktc/WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILmmxNzD6Mr2OiAgICAgyrnE3LnsvKPNs7zGuabE3AorKiCyzsr9y7XD9zogICAgIAorKiAgICi0q8jrss7K/SkgIGFkZHJlc3M6ILzHwry1vUlSQU3W0LXEtdjWtyAKKyAgICAgICAgICAgICAgICBzaXplOiAgICBJUkFNv9W85LTz0KEKKyogICAotKuz9rLOyv0pICB2b2lkCisqILe1ILvYINa1OiAgICAgdm9pZAorKiDG5Mv8y7XD9zogICAgIM7eCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBvc19zdGF0aXN0aWNfZW5hYmxlKHZvaWQpCit7CisjaWYgZGVmaW5lZChfT1NfVE9TKQorICAgIGdfb3NfaXJhbV9zd2FwaW5fc3RhdGlzdGljICAgICAgICA9ICh0X29zX2lyYW1fdGhyZWFkX3N0YXRpc3RpYyAqKU9TX0lSQU1fVEhSRUFEX1NXQVBJTjsKKyAgICBnX29zX2lyYW1faXJxX3N0YXJ0X3N0YXRpc3RpYyAgICAgPSAodF9vc19pcmFtX3N0YXRpc3RpYyAqKU9TX0lSQU1fSVJRX1NUQVJUOworICAgIGdfb3NfaXJhbV9pcnFfZW5kX3N0YXRpc3RpYyAgICAgICA9ICh0X29zX2lyYW1fc3RhdGlzdGljICopT1NfSVJBTV9JUlFfRU5EOworICAgIGdfb3NfaXJhbV9kc3Jfc3RhcnRfc3RhdGlzdGljICAgICA9ICh0X29zX2lyYW1fc3RhdGlzdGljICopT1NfSVJBTV9EU1JfU1RBUlQ7CisgICAgZ19vc19pcmFtX2Rzcl9lbmRfc3RhdGlzdGljICAgICAgID0gKHRfb3NfaXJhbV9zdGF0aXN0aWMgKilPU19JUkFNX0RTUl9FTkQ7CisKKyAgICBnX29zX2Rkcl9zd2FwaW5fc3RhdGlzdGljICAgICAgICAgPSAodF9vc19kZHJfc3RhdGlzdGljICopek9zc19NYWxsb2Moc2l6ZW9mKHRfb3NfZGRyX3N0YXRpc3RpYykpOworICAgIGdfb3NfZGRyX2lycV9zdGFydF9zdGF0aXN0aWMgICAgICA9ICh0X29zX2Rkcl9zdGF0aXN0aWMgKil6T3NzX01hbGxvYyhzaXplb2YodF9vc19kZHJfc3RhdGlzdGljKSk7CisgICAgZ19vc19kZHJfaXJxX2VuZF9zdGF0aXN0aWMgICAgICAgID0gKHRfb3NfZGRyX3N0YXRpc3RpYyAqKXpPc3NfTWFsbG9jKHNpemVvZih0X29zX2Rkcl9zdGF0aXN0aWMpKTsKKyAgICBnX29zX2Rkcl9kc3Jfc3RhcnRfc3RhdGlzdGljICAgICAgPSAodF9vc19kZHJfc3RhdGlzdGljICopek9zc19NYWxsb2Moc2l6ZW9mKHRfb3NfZGRyX3N0YXRpc3RpYykpOworICAgIGdfb3NfZGRyX2Rzcl9lbmRfc3RhdGlzdGljICAgICAgICA9ICh0X29zX2Rkcl9zdGF0aXN0aWMgKil6T3NzX01hbGxvYyhzaXplb2YodF9vc19kZHJfc3RhdGlzdGljKSk7CisjZWxpZiBkZWZpbmVkKF9PU19MSU5VWCkKKyAgICBnX29zX2lyYW1fc3dhcGluX3N0YXRpc3RpYyAgICAgICAgPSAodF9vc19pcmFtX3RocmVhZF9zdGF0aXN0aWMgKilPU19JUkFNX1RIUkVBRF9TV0FQSU47ICAgIAorICAgIGdfb3NfaXJhbV9pcnFfc3RhcnRfc3RhdGlzdGljICAgICA9ICh0X29zX2lyYW1fc3RhdGlzdGljICopT1NfSVJBTV9JUlFfU1RBUlQ7ICAgIAorICAgIGdfb3NfaXJhbV9pcnFfZW5kX3N0YXRpc3RpYyAgICAgICA9ICh0X29zX2lyYW1fc3RhdGlzdGljICopT1NfSVJBTV9JUlFfRU5EOyAgICAKKyAgICBnX29zX2lyYW1fc29mdGlycV9zdGFydF9zdGF0aXN0aWMgPSAodF9vc19pcmFtX3N0YXRpc3RpYyAqKU9TX0lSQU1fU09GVElSUV9TVEFSVDsgICAgCisgICAgZ19vc19pcmFtX3NvZnRpcnFfZW5kX3N0YXRpc3RpYyAgID0gKHRfb3NfaXJhbV9zdGF0aXN0aWMgKilPU19JUkFNX1NPRlRJUlFfRU5EOyAgICAKKyAgICBnX29zX2lyYW1fdGltZXJfc3RhcnRfc3RhdGlzdGljICAgPSAodF9vc19pcmFtX3N0YXRpc3RpYyAqKU9TX0lSQU1fVElNRVJfU1RBUlQ7ICAgIAorICAgIGdfb3NfaXJhbV90aW1lcl9lbmRfc3RhdGlzdGljICAgICA9ICh0X29zX2lyYW1fc3RhdGlzdGljICopT1NfSVJBTV9USU1FUl9FTkQ7CisKKyAgICBnX29zX2Rkcl9zd2FwaW5fc3RhdGlzdGljICAgICAgICAgPSAodF9vc19kZHJfc3RhdGlzdGljICopa21hbGxvYyhzaXplb2YodF9vc19kZHJfc3RhdGlzdGljKSwgR0ZQX0tFUk5FTCk7CisgICAgZ19vc19kZHJfaXJxX3N0YXJ0X3N0YXRpc3RpYyAgICAgID0gKHRfb3NfZGRyX3N0YXRpc3RpYyAqKWttYWxsb2Moc2l6ZW9mKHRfb3NfZGRyX3N0YXRpc3RpYyksIEdGUF9LRVJORUwpOworICAgIGdfb3NfZGRyX2lycV9lbmRfc3RhdGlzdGljICAgICAgICA9ICh0X29zX2Rkcl9zdGF0aXN0aWMgKilrbWFsbG9jKHNpemVvZih0X29zX2Rkcl9zdGF0aXN0aWMpLCBHRlBfS0VSTkVMKTsKKyAgICBnX29zX2Rkcl9zb2Z0aXJxX3N0YXJ0X3N0YXRpc3RpYyAgPSAodF9vc19kZHJfc3RhdGlzdGljICopa21hbGxvYyhzaXplb2YodF9vc19kZHJfc3RhdGlzdGljKSwgR0ZQX0tFUk5FTCk7CisgICAgZ19vc19kZHJfc29mdGlycV9lbmRfc3RhdGlzdGljICAgID0gKHRfb3NfZGRyX3N0YXRpc3RpYyAqKWttYWxsb2Moc2l6ZW9mKHRfb3NfZGRyX3N0YXRpc3RpYyksIEdGUF9LRVJORUwpOworICAgIGdfb3NfZGRyX3RpbWVyX3N0YXJ0X3N0YXRpc3RpYyAgICA9ICh0X29zX2Rkcl9zdGF0aXN0aWMgKilrbWFsbG9jKHNpemVvZih0X29zX2Rkcl9zdGF0aXN0aWMpLCBHRlBfS0VSTkVMKTsKKyAgICBnX29zX2Rkcl90aW1lcl9lbmRfc3RhdGlzdGljICAgICAgPSAodF9vc19kZHJfc3RhdGlzdGljICopa21hbGxvYyhzaXplb2YodF9vc19kZHJfc3RhdGlzdGljKSwgR0ZQX0tFUk5FTCk7CisKKyNlbHNlCisjIGVycm9yICJ1bmtvd24gb3MiCisjZW5kaWYKKyAgICBpZiAoKHVuc2lnbmVkIGludCApZ19vc19pcmFtX3RpbWVyX2VuZF9zdGF0aXN0aWMgLSAodW5zaWduZWQgaW50IClnX29zX2lyYW1fc3dhcGluX3N0YXRpc3RpYyA+ICh1bnNpZ25lZCBpbnQgKUlSQU1fQkFTRV9MRU5fT1NfU1RBVElTVElDX1BTQ1BVICkKKyAgICB7CisgICAgICAgIEJVRygpOworICAgIH0KKyAgICBnX29zX3N0YXRpc3RpY19lbmFibGUgPSAxOworfQorRVhQT1JUX1NZTUJPTChvc19zdGF0aXN0aWNfZW5hYmxlKTsKKwordm9pZCB6eGljX3RyYWNlX3Rhc2tfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWU7CisgICAgaWYgKCFnX29zX3N0YXRpc3RpY19lbmFibGUpCisgICAgICAgIHJldHVybiA7CisKKyAgICB0aW1lID0gT1NfU1RBVElTVElDX1RJTUU7CisgICAgb3Nfc3RhdGlzdGljX3RocmVhZF9pbl9pcmFtKGdfb3NfaXJhbV9zd2FwaW5fc3RhdGlzdGljLCBuZXh0LCB0aW1lKTsKKyAgICBvc19zdGF0aXN0aWNfaW5fZGRyKGdfb3NfZGRyX3N3YXBpbl9zdGF0aXN0aWMsIG5leHQsIHRpbWUpOworICAgIG9zX3N0YXRpc3RpY19pbmZvX3VwZGF0ZSgpOworfQorCit2b2lkIHp4aWNfdHJhY2VfaXJxX2VudGVyKHUzMiBpcnEpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lOworICAgIGlmICghZ19vc19zdGF0aXN0aWNfZW5hYmxlKQorICAgICAgICByZXR1cm4gOworCisgICAgdGltZSA9IE9TX1NUQVRJU1RJQ19USU1FOworICAgIG9zX3N0YXRpc3RpY19pbl9pcmFtKGdfb3NfaXJhbV9pcnFfc3RhcnRfc3RhdGlzdGljLCBpcnEsIHRpbWUpOworICAgIG9zX3N0YXRpc3RpY19pbl9kZHIoZ19vc19kZHJfaXJxX3N0YXJ0X3N0YXRpc3RpYywgaXJxLCB0aW1lKTsKKyAgICBvc19zdGF0aXN0aWNfaW5mb191cGRhdGUoKTsKK30KKwordm9pZCB6eGljX3RyYWNlX2lycV9leGl0KHUzMiBpcnEpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lOworICAgIGlmICghZ19vc19zdGF0aXN0aWNfZW5hYmxlKQorICAgICAgICByZXR1cm4gOworCisgICAgdGltZSA9IE9TX1NUQVRJU1RJQ19USU1FOworICAgIG9zX3N0YXRpc3RpY19pbl9pcmFtKGdfb3NfaXJhbV9pcnFfZW5kX3N0YXRpc3RpYywgaXJxLCB0aW1lKTsKKyAgICBvc19zdGF0aXN0aWNfaW5fZGRyKGdfb3NfZGRyX2lycV9lbmRfc3RhdGlzdGljLCBpcnEsIHRpbWUpOworICAgIG9zX3N0YXRpc3RpY19pbmZvX3VwZGF0ZSgpOworfQorCit2b2lkIHp4aWNfdHJhY2Vfc29mdGlycV9lbnRlcih1MzIgdmVjX25yKQoreworCXVuc2lnbmVkIGxvbmcgdGltZTsKKyAgICBpZiAoIWdfb3Nfc3RhdGlzdGljX2VuYWJsZSkKKyAgICAgICAgcmV0dXJuIDsKKworICAgIHRpbWUgPSBPU19TVEFUSVNUSUNfVElNRTsKKyAgICBvc19zdGF0aXN0aWNfaW5faXJhbShnX29zX2lyYW1fc29mdGlycV9zdGFydF9zdGF0aXN0aWMsIHZlY19uciwgdGltZSk7CisgICAgb3Nfc3RhdGlzdGljX2luX2RkcihnX29zX2Rkcl9zb2Z0aXJxX3N0YXJ0X3N0YXRpc3RpYywgdmVjX25yLCB0aW1lKTsKKyAgICBvc19zdGF0aXN0aWNfaW5mb191cGRhdGUoKTsKK30KKwordm9pZCB6eGljX3RyYWNlX3NvZnRpcnFfZXhpdCh1MzIgdmVjX25yKQoreworCXVuc2lnbmVkIGxvbmcgdGltZTsKKyAgICBpZiAoIWdfb3Nfc3RhdGlzdGljX2VuYWJsZSkKKyAgICAgICAgcmV0dXJuIDsKKworICAgIHRpbWUgPSBPU19TVEFUSVNUSUNfVElNRTsKKyAgICBvc19zdGF0aXN0aWNfaW5faXJhbShnX29zX2lyYW1fc29mdGlycV9lbmRfc3RhdGlzdGljLCB2ZWNfbnIsIHRpbWUpOworICAgIG9zX3N0YXRpc3RpY19pbl9kZHIoZ19vc19kZHJfc29mdGlycV9lbmRfc3RhdGlzdGljLCB2ZWNfbnIsIHRpbWUpOworICAgIG9zX3N0YXRpc3RpY19pbmZvX3VwZGF0ZSgpOworfQorCit2b2lkIHp4aWNfdHJhY2VfdGltZXJfZW50ZXIodm9pZCAqZnVuYykKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWU7CisgICAgaWYgKCFnX29zX3N0YXRpc3RpY19lbmFibGUpCisgICAgICAgIHJldHVybiA7CisKKyAgICB0aW1lID0gT1NfU1RBVElTVElDX1RJTUU7CisgICAgb3Nfc3RhdGlzdGljX2luX2lyYW0oZ19vc19pcmFtX3RpbWVyX3N0YXJ0X3N0YXRpc3RpYywgZnVuYywgdGltZSk7CisgICAgb3Nfc3RhdGlzdGljX2luX2RkcihnX29zX2Rkcl90aW1lcl9zdGFydF9zdGF0aXN0aWMsIGZ1bmMsIHRpbWUpOworICAgIG9zX3N0YXRpc3RpY19pbmZvX3VwZGF0ZSgpOworfQorCit2b2lkIHp4aWNfdHJhY2VfdGltZXJfZXhpdCh2b2lkICpmdW5jKQoreworCXVuc2lnbmVkIGxvbmcgdGltZTsKKyAgICBpZiAoIWdfb3Nfc3RhdGlzdGljX2VuYWJsZSkKKyAgICAgICAgcmV0dXJuIDsKKworICAgIHRpbWUgPSBPU19TVEFUSVNUSUNfVElNRTsKKyAgICBvc19zdGF0aXN0aWNfaW5faXJhbShnX29zX2lyYW1fdGltZXJfZW5kX3N0YXRpc3RpYywgZnVuYywgdGltZSk7CisgICAgb3Nfc3RhdGlzdGljX2luX2RkcihnX29zX2Rkcl90aW1lcl9lbmRfc3RhdGlzdGljLCBmdW5jLCB0aW1lKTsKKyAgICBvc19zdGF0aXN0aWNfaW5mb191cGRhdGUoKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC5psTcw+jK9jogICAgILnsvKPNs7zGtb1ERFIKKyogss7K/cu1w/c6ICAgICAKKyogICAotKvI67LOyv0pICBpcmFtX2FkZHI6ILXY1rcgCisgICAgICAgICAgICAgICAgZGF0YTogICAgICDKwrz+z+4KKyAgICAgICAgICAgICAgICB0aW1lOiAgICAgIMqxvOQKKyogICAotKuz9rLOyv0pICB2b2lkCisqILe1ILvYINa1OiAgICAgdm9pZAorKiDG5Mv8y7XD9zogICAgIM7eCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IF9faW5pdCB6eGljX2VuYWJsZV90cmFjZXIodm9pZCkKK3sKKyAgICBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKyAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisKKyNpZmRlZiBJUkFNX0JBU0VfQUREUl9WQQorICAgIGdfenhpY190cmFjZV9hcGNwdV9hZGRyID0gSVJBTV9CQVNFX0FERFJfT1NfU1RBVElTVElDX1BTQ1BVOworI2Vsc2UKKyAgICBnX3p4aWNfdHJhY2VfYXBjcHVfYWRkciA9IGlvcmVtYXAoSVJBTV9CQVNFX0FERFJfT1NfU1RBVElTVElDX1BTQ1BVLCBJUkFNX0JBU0VfTEVOX09TX1NUQVRJU1RJQ19QU0NQVSk7CisjZW5kaWYKKworICAgIC8qCisgICAgaW5pdF90aW1lcigmdGltZXIpOworICAgIHRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgNDAqSFo7Ly9tc2Vjc190b19qaWZmaWVzKDQwKjEwMDApOy8v0dOz2TQww+sKKyAgICB0aW1lci5kYXRhID0gMDsKKyAgICB0aW1lci5mdW5jdGlvbiA9IG9zX3N0YXRpc3RpY19kZWxheWVkX3dvcmtfdGltZXJfZm47CisgICAgc2V0dXBfdGltZXIoJnRpbWVyLCBvc19zdGF0aXN0aWNfZGVsYXllZF93b3JrX3RpbWVyX2ZuLCAwKTsKKyAgICBhZGRfdGltZXIoJnRpbWVyKTsKKyAgICAqLworICAgIC8vdGFzayA9IGt0aHJlYWRfY3JlYXRlKG9zX3N0YXRpc3RpY19kZWxheWVkX3dvcmtfdGltZXJfZm4sIDAsICJnX3p4aWNfdHJhY2Vfc3luY190aHJlYWQiLCAwKTsKKyAgICAvL3dha2VfdXBfcHJvY2Vzcyh0YXNrKTsKKyAgICBvc19zdGF0aXN0aWNfZW5hYmxlKCk7CisgICAgcmV0dXJuIDB4MDsKK30KK21vZHVsZV9pbml0KHp4aWNfZW5hYmxlX3RyYWNlcik7CisKKwo=