ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJzb2Z0YXAvbmV0b3RoZXJhcGkuYyBiL2FwL2xpYi9saWJzb2Z0YXAvbmV0b3RoZXJhcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZmIzN2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvYXAvbGliL2xpYnNvZnRhcC9uZXRvdGhlcmFwaS5jCkBAIC0wLDAgKzEsMTc4OCBAQAorLyoqCisqIEBmaWxlIG5ldG90aGVyYXBpLmMKKyogQGJyaWVmIFB1YmxpYyBBUElzIG9mIFNhbmVjaGlwcworKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgU2FuZWNoaXBzIFRlY2hub2xvZ3kgQ28uLCBMdGQuCisqIEBhdXRob3IgIExpbnh1IEdlYmluCisqIEBkZWZncm91cCBzaV9pZCBTYW5lY2hpcHMKKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCQkJIEluY2x1ZGUgaGVhZGVyIGZpbGVzCQkJCQkJCSAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8c3lzL2tsb2cuaD4KKyNpbmNsdWRlIDxzeXMvbXNnLmg+CisjaW5jbHVkZSAibWVzc2FnZS5oIgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9ldGhlci5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgInNvZnRhcF9hcGkuaCIKKyNpbmNsdWRlIDxuZXRvdGhlcmFwaS5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyogQGJyaWVmIHJvdXRlIGluZm9ybWF0aW9uCisqIEBwYXJhbSBkc3RBZGRyIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyogQHBhcmFtIHNyY0FkZHIgc291cmNlIGFkZHJlc3MKKyogQHBhcmFtIGdhdGVXYXkgZ2F0ZVdheQorKiBAcGFyYW0gaWZOYW1lIE5JQyBuYW1lCisqLworc3RydWN0IHJvdXRlX2luZm8geworCXVfaW50IGRzdEFkZHI7CisJdV9pbnQgc3JjQWRkcjsKKwl1X2ludCBnYXRlV2F5OworCWNoYXIgaWZOYW1lW0lGX05BTUVTSVpFXTsKK307CisKKyNkZWZpbmUgQlVGU0laRSA4MTkyCisKKyNkZWZpbmUgU1BJTkxPQ0tfSU9DX01BR0lDCSdTJworCisjZGVmaW5lIFNQSU5MT0NLX0dFVF9TVEFUVVMgIF9JT1dSKFNQSU5MT0NLX0lPQ19NQUdJQywxLGNoYXIgKikKKworI2RlZmluZSBSRUFEX0JVRl9TSVpFIDU2CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgSW5saW5lIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbmxpbmUgY2hhciAqc3RyaXBfc3BhY2UoY2hhciAqc3RyKQoreworCXdoaWxlICgqc3RyID09ICcgJykKKwkJc3RyKys7CisJcmV0dXJuIHN0cjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICBMb2NhbCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qINC0zsS8/rLZ1/e6r8r9ICovCitpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlcGF0aCwgaW50IGZsYWdzLCBjb25zdCBjaGFyICpidWYsIGludCBzaXplKQoreworCWludCBmZCA9IDA7CisJaW50IHJldCA9IDA7CisKKwlmZCA9IG9wZW4oZmlsZXBhdGgsIGZsYWdzLCAwNjQ0KTsKKwlpZiAoZmQgPCAwKSB7CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsICJ3cml0ZV90b19maWxlIG9wZW4gJXMgZmFpbCwgZXJyb3I6JXMhIFxuIiwgZmlsZXBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKyAgICByZXQgPSBURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGUoZmQsIGJ1Ziwgc2l6ZSkpOworCWlmIChyZXQgIT0gc2l6ZSkgeworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCAid3JpdGVfdG9fZmlsZSB3cml0ZSAlcyBmYWlsLCBlcnJvcjolcyEgXG4iLCBmaWxlcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKwlpZihmc3luYyhmZCkgPCAwKQorICAgIHsKKyAgICAgICAgLy8gdG9kbzogY292IG0KKyAgICB9ICAKKyAgICAKKwlyZXQgPSAwOworCitvdXQ6CisJaWYgKGZkID49IDApCisJCWNsb3NlKGZkKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiDQtM7EvP46ILiyuMfQtCAqLworaW50IHdyaXRlX3RvX2ZpbGUoY29uc3QgY2hhciAqZmlsZXBhdGgsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJcmV0dXJuIHdyaXRlX2ZpbGUoZmlsZXBhdGgsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIGJ1Ziwgc2l6ZSk7Cit9CisKKy8qINC0zsS8/jogzrKyv9e3vNPQtCAgKi8KK2ludCBhcHBlbmRfdG9fZmlsZShjb25zdCBjaGFyICpmaWxlcGF0aCwgY29uc3QgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlyZXR1cm4gd3JpdGVfZmlsZShmaWxlcGF0aCwgT19XUk9OTFkgfCBPX0FQUEVORCB8IE9fQ1JFQVQsIGJ1Ziwgc2l6ZSk7Cit9CisKKy8vv+K907/aY3RpbWWhomFzY3RpbWW74bu70NCjrNTss8nDv8z1bG9nsbu31tDQz9TKvqOssru3vbHjv7SjrMv50tS9q2N0aW1l1LTC68nUzqK4xNTsz8IKK3N0YXRpYyBjaGFyICpzdHJfY3RpbWUoY29uc3Qgc3RydWN0IHRtICp0aW1lcHRyKQoreworCS8qc3RhdGljIGNvbnN0IGNoYXIgd2RheV9uYW1lW11bNF0gPSB7CisJICAiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IgorCX07Ki8KKworCXN0YXRpYyBjb25zdCBjaGFyIG1vbl9uYW1lW11bNF0gPSB7CisJCSJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCisJCSJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyIKKwl9OworCisJc3RhdGljIGNoYXIgcmVzdWx0WzI2XTsKKworCS8qc3ByaW50ZihyZXN1bHQsICIlLjNzICUuM3MlM2QgJS4yZDolLjJkOiUuMmQgJWQiLAorCSAgd2RheV9uYW1lW3RpbWVwdHItPnRtX3dkYXldLAorCSAgbW9uX25hbWVbdGltZXB0ci0+dG1fbW9uXSwKKwkgIHRpbWVwdHItPnRtX21kYXksIHRpbWVwdHItPnRtX2hvdXIsCisJICB0aW1lcHRyLT50bV9taW4sIHRpbWVwdHItPnRtX3NlYywKKwkgIDE5MDAgKyB0aW1lcHRyLT50bV95ZWFyKTsqLworCXNucHJpbnRmKHJlc3VsdCwgc2l6ZW9mKHJlc3VsdCksICIlLjNzJTNkICUuMmQ6JS4yZDolLjJkICVkIiwKKwkgICAgICAgIG1vbl9uYW1lW3RpbWVwdHItPnRtX21vbl0sCisJICAgICAgICB0aW1lcHRyLT50bV9tZGF5LCB0aW1lcHRyLT50bV9ob3VyLAorCSAgICAgICAgdGltZXB0ci0+dG1fbWluLCB0aW1lcHRyLT50bV9zZWMsCisJICAgICAgICAxOTAwICsgdGltZXB0ci0+dG1feWVhcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vaW5wdXQ6ICBudl9zdHI6bnbE2sjd1rjV6yAgICAqIG52X3BhcmFtIL3izva687LOyv21xNa41esKKy8vb3V0cHV0OiAgIHBhcmFtX251bSAgICAgbnZfcGFyYW0KKy8vyr7A/ToKKy8vICAgaW50IG51bTsKKy8vICAgY2hhcioqIG52X3BhcmFtOworLy8gICBudW0gPSBudl9hbmFseXplKG52X3N0ciwmbnZfcGFyYW0pCisvLyAgIHN0cmNtcChudl9wYXJhbVswXSwiYWFhIikgLi4uCisvLyAgIHN0cmNtcChudl9wYXJhbVsxXSwiYmJiIikgLi4uCisvLyAgIC4uLgorLy8gICBmcmVlKG52X3BhcmFtKTsKKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IG52X2FuYWx5emUoY2hhciogbnZfc3RyLCBjaGFyKioqIG52X3BhcmFtKQoreworCWludCBwYXJhbV9udW0gPSAxOworCWludCBpID0gMDsKKwljaGFyKiBzdHJfcHRyOworCWNoYXIqKiBtZW1fcHRyOworCWNoYXIqIHRtcF9wdHI7CisJZm9yIChzdHJfcHRyID0gbnZfc3RyOyAqc3RyX3B0ciAhPSAnXDAnOyBzdHJfcHRyKyspIHsKKwkJaWYgKCpzdHJfcHRyID09ICcrJykKKwkJCXBhcmFtX251bSsrOworCX0KKwltZW1fcHRyID0gKGNoYXIqKiltYWxsb2MoKDEgKyBzaXplb2YoY2hhciopKSAqIHBhcmFtX251bSArIHN0cmxlbihudl9zdHIpKTsKKwlpZiAobWVtX3B0ciA9PSBOVUxMKSB7Ly9rbG9jd29yaworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldChtZW1fcHRyLCAwLCAoMSArIHNpemVvZihjaGFyKikpICogcGFyYW1fbnVtICsgc3RybGVuKG52X3N0cikpOworCSogbnZfcGFyYW0gPSBtZW1fcHRyOworCXN0cl9wdHIgPSBzdHJ0b2sobnZfc3RyLCAiKyIpOworCXRtcF9wdHIgPSAoY2hhciopKG1lbV9wdHIgKyBwYXJhbV9udW0pOworCXdoaWxlIChzdHJfcHRyICE9IE5VTEwpIHsKKwkJbWVtY3B5KChtZW1fcHRyICsgaSksICZ0bXBfcHRyLCBzaXplb2YoY2hhciopKTsKKwkJc3RyY3B5KHRtcF9wdHIsIHN0cl9wdHIpOworCQl0bXBfcHRyID0gKGNoYXIqKSgobG9uZyl0bXBfcHRyICsgc3RybGVuKHN0cl9wdHIpICsgMSk7CisJCWkgKys7CisJCXN0cl9wdHIgPSBzdHJ0b2soTlVMTCwgIisiKTsKKwl9CisJcmV0dXJuIHBhcmFtX251bTsKK30KKworCitjaGFyKiBnZXRGaWVsZChjaGFyICphX2xpbmUsIGNoYXIgKmRlbGltLCBpbnQgY291bnQpCit7CisJaW50IGkgPSAwOworCWNoYXIgKnRvayA9IE5VTEw7CisJY2hhciAqc2F2ZSA9IE5VTEw7CisJdG9rID0gc3RydG9rX3IoYV9saW5lLCBkZWxpbSwgJnNhdmUpOworCXdoaWxlICh0b2spIHsKKwkJaWYgKGkgPT0gY291bnQpCisJCQlicmVhazsKKwkJaSsrOworCQl0b2sgPSBzdHJ0b2tfcihOVUxMLCBkZWxpbSwgJnNhdmUpOworCX0KKwlpZiAodG9rKQorCQlyZXR1cm4gdG9rOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgIGZyZWVfZGhjcF9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmRoY3BfaW5mb19saXN0KQoreworCURIQ1BPRkZFUkFERFJfTElTVF90ICpkaGNwX2luZm9fdGVtcCAgPSBOVUxMOworCURIQ1BPRkZFUkFERFJfTElTVF90ICpkaGNwX2luZm9fdGVtcDEgPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRoY3BfaW5mb190ZW1wLCBkaGNwX2luZm9fdGVtcDEsIGRoY3BfaW5mb19saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZkaGNwX2luZm9fdGVtcC0+bGlzdCk7CisJCWZyZWUoZGhjcF9pbmZvX3RlbXApOworCX0KK30KKwordm9pZCAgZnJlZV9sYW5pbmZvX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqZmlsZV9pbmZvX2xpc3QpCit7CisJTEFOX0lORk9fTElTVF90ICpsYW5faW5mb19saXN0X3RtcCAgPSBOVUxMOworCUxBTl9JTkZPX0xJU1RfdCAqbGFuX2luZm9fbGlzdF90bXAxID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsYW5faW5mb19saXN0X3RtcCwgbGFuX2luZm9fbGlzdF90bXAxLCBmaWxlX2luZm9fbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmbGFuX2luZm9fbGlzdF90bXAtPmxpc3QpOworCQlmcmVlKGxhbl9pbmZvX2xpc3RfdG1wKTsKKwl9CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILqvyv3D+7PGo7ogZ2V0SWZTdGF0aXN0aWMKKyoguabE3MPoyvajuiC78cihzfjC58nosbi1scewwffBvworKiCyzsr9y7XD96O6IGludGVyZmFjZTogICAgIM34v9rJ6LG4w/uzxgorKiAgICAgICAgICAgIHR5cGU6ICAgICAgICAgIMH3wb/A4NDNo6zJz9DQoaLPwtDQscjM2LvysPy49sr9CisqICAgICAgICAgICAgcmVzdWx0X2RhdGE6ICAgsaO05sH3wb/WtQorKiC3tSC72CDWtaO6IMqnsNy3tbvYLTGjrLPJuaa3tbvYMAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZ2V0SWZTdGF0aXN0aWMoY2hhciAqaW50ZXJmYWNlLCBpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBsb25nICpyZXN1bHRfZGF0YSkKK3sKKwlpbnQgZm91bmRfZmxhZyA9IDA7CisJaW50IHNraXBfbGluZSA9IDI7CisJY2hhciB0ZW1wX3Jjdls2NF0gPSB7MH07CisJY2hhciBidWZbMTAyNF0sICpmaWVsZCwgKnNlbWlDb2xvbiA9IE5VTEw7CisJbG9uZyBsb25nIHJlc3VsdF9kYXRhX251bSA9IDA7CisJRklMRSAqZnAgPSBmb3BlbihQUk9DX0lGX1NUQVRJU1RJQywgInIiKTsKKwlpZiAoIWZwKSB7CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsICJubyBwcm9jP1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwl3aGlsZSAoZmdldHMoYnVmLCAxMDI0LCBmcCkpIHsKKwkJY2hhciAqaWZuYW1lOworCQlpZiAoc2tpcF9saW5lICE9IDApIHsKKwkJCXNraXBfbGluZS0tOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCEoc2VtaUNvbG9uID0gc3RyY2hyKGJ1ZiwgJzonKSkpCisJCQljb250aW51ZTsKKwkJKnNlbWlDb2xvbiA9ICdcMCc7CisJCWlmbmFtZSA9IGJ1ZjsKKwkJaWZuYW1lID0gc3RyaXBfc3BhY2UoaWZuYW1lKTsKKworCQlpZiAoIXN0cmNtcChpZm5hbWUsIGludGVyZmFjZSkpIHsKKwkJCWZvdW5kX2ZsYWcgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJZmNsb3NlKGZwKTsKKworCWlmIChmb3VuZF9mbGFnID09IDApIHsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCAiW2ZsdXhzdGF0XWdldElmU3RhdGlzdGljIG5vIGZvdW5kIGRhdGE9PT09PT1cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc2VtaUNvbG9uKys7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFRYQllURToKKwkJaWYgKChmaWVsZCA9IGdldEZpZWxkKHNlbWlDb2xvbiwgIiAiLCA4KSkpIHsKKwkJCWVycm5vID0gMDsKKwkJCXJlc3VsdF9kYXRhX251bSA9IHN0cnRvdWxsKGZpZWxkLCBOVUxMLCAxMCk7CisJCQlpZiAoZXJybm8gPT0gRVJBTkdFKS8vIGt3IEVSUk5PLk5PVF9DSEVDS0VECisJCQl7CisJCQkJcHJpbnRmKCJzdHJ0b3VsbCBlcnJubyAlZDogJXNcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworCQkJfQorCQkJaWYgKHJlc3VsdF9kYXRhX251bSA8IDAgfHwgcmVzdWx0X2RhdGFfbnVtID4gTExPTkdfTUFYLTEpCisJCQkJcmVzdWx0X2RhdGFfbnVtID0gMDsKKwkJCSpyZXN1bHRfZGF0YSA9IHJlc3VsdF9kYXRhX251bTsKKwkJCQorCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCAiW2dldElmU3RhdGlzdGljXVRYQllURSBmaWVsZDolcywgcmVzdWx0X2RhdGE6JWxsdVxuIiwgZmllbGQsICpyZXN1bHRfZGF0YSk7CisJCQlyZXR1cm4gMDsgLy9rdyAzCisJCX0KKwkJYnJlYWs7CisJY2FzZSBUWFBBQ0tFVDoKKwkJaWYgKChmaWVsZCA9IGdldEZpZWxkKHNlbWlDb2xvbiwgIiAiLCA5KSkpIHsKKwkJCWVycm5vID0gMDsKKwkJCXJlc3VsdF9kYXRhX251bSA9IHN0cnRvdWxsKGZpZWxkLCBOVUxMLCAxMCk7CisJCQlpZiAoZXJybm8gPT0gRVJBTkdFKS8vIGt3IEVSUk5PLk5PVF9DSEVDS0VECisJCQl7CisJCQkJcHJpbnRmKCJzdHJ0b3VsbCBlcnJubyAlZDogJXNcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworCQkJfQorCQkJaWYgKHJlc3VsdF9kYXRhX251bSA8IDAgfHwgcmVzdWx0X2RhdGFfbnVtID4gTExPTkdfTUFYLTEpCisJCQkJcmVzdWx0X2RhdGFfbnVtID0gMDsKKwkJCSpyZXN1bHRfZGF0YSA9IHJlc3VsdF9kYXRhX251bTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWNhc2UgVFhFUlI6CisJCWlmICgoZmllbGQgPSBnZXRGaWVsZChzZW1pQ29sb24sICIgIiwgMTApKSkgeworCQkJZXJybm8gPSAwOworCQkJcmVzdWx0X2RhdGFfbnVtID0gc3RydG91bGwoZmllbGQsIE5VTEwsIDEwKTsKKwkJCWlmIChlcnJubyA9PSBFUkFOR0UpLy8ga3cgRVJSTk8uTk9UX0NIRUNLRUQKKwkJCXsKKwkJCQlwcmludGYoInN0cnRvdWxsIGVycm5vICVkOiAlc1xuIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJCQl9CisJCQlpZiAocmVzdWx0X2RhdGFfbnVtIDwgMCB8fCByZXN1bHRfZGF0YV9udW0gPiBMTE9OR19NQVgtMSkKKwkJCQlyZXN1bHRfZGF0YV9udW0gPSAwOworCQkJKnJlc3VsdF9kYXRhID0gcmVzdWx0X2RhdGFfbnVtOworCQkJCisJCQlyZXR1cm4gMDsgLy9rdyAzCisJCX0KKwkJYnJlYWs7CisJY2FzZSBUWERST1A6CisJCWlmICgoZmllbGQgPSBnZXRGaWVsZChzZW1pQ29sb24sICIgIiwgMTEpKSkgeworCQkJZXJybm8gPSAwOworCQkJcmVzdWx0X2RhdGFfbnVtID0gc3RydG91bGwoZmllbGQsIE5VTEwsIDEwKTsKKwkJCWlmIChlcnJubyA9PSBFUkFOR0UpLy8ga3cgRVJSTk8uTk9UX0NIRUNLRUQKKwkJCXsKKwkJCQlwcmludGYoInN0cnRvdWxsIGVycm5vICVkOiAlc1xuIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJCQl9CisJCQlpZiAocmVzdWx0X2RhdGFfbnVtIDwgMCB8fCByZXN1bHRfZGF0YV9udW0gPiBMTE9OR19NQVgtMSkKKwkJCQlyZXN1bHRfZGF0YV9udW0gPSAwOworCQkJKnJlc3VsdF9kYXRhID0gcmVzdWx0X2RhdGFfbnVtOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSWEJZVEU6CisJCWlmICgoZmllbGQgPSBnZXRGaWVsZChzZW1pQ29sb24sICIgIiwgMCkpKSB7CisJCQllcnJubyA9IDA7CisJCQlyZXN1bHRfZGF0YV9udW0gPSBzdHJ0b3VsbChmaWVsZCwgTlVMTCwgMTApOworCQkJaWYgKGVycm5vID09IEVSQU5HRSkvLyBrdyBFUlJOTy5OT1RfQ0hFQ0tFRAorCQkJeworCQkJCXByaW50Zigic3RydG91bGwgZXJybm8gJWQ6ICVzXG4iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0KKwkJCWlmIChyZXN1bHRfZGF0YV9udW0gPCAwIHx8IHJlc3VsdF9kYXRhX251bSA+IExMT05HX01BWC0xKQorCQkJCXJlc3VsdF9kYXRhX251bSA9IDA7CisJCQkqcmVzdWx0X2RhdGEgPSByZXN1bHRfZGF0YV9udW07CisJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsICJbZ2V0SWZTdGF0aXN0aWNdUlhCWVRFIGZpZWxkOiVzLCByZXN1bHRfZGF0YTolbGx1XG4iLCBmaWVsZCwgKnJlc3VsdF9kYXRhKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWNhc2UgUlhQQUNLRVQ6CisJCWlmICgoZmllbGQgPSBnZXRGaWVsZChzZW1pQ29sb24sICIgIiwgMSkpKSB7CisJCQllcnJubyA9IDA7CisJCQlyZXN1bHRfZGF0YV9udW0gPSBzdHJ0b3VsbChmaWVsZCwgTlVMTCwgMTApOworCQkJaWYgKGVycm5vID09IEVSQU5HRSkvLyBrdyBFUlJOTy5OT1RfQ0hFQ0tFRAorCQkJeworCQkJCXByaW50Zigic3RydG91bGwgZXJybm8gJWQ6ICVzXG4iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0KKwkJCWlmIChyZXN1bHRfZGF0YV9udW0gPCAwIHx8IHJlc3VsdF9kYXRhX251bSA+IExMT05HX01BWC0xKQorCQkJCXJlc3VsdF9kYXRhX251bSA9IDA7CisJCQkqcmVzdWx0X2RhdGEgPSByZXN1bHRfZGF0YV9udW07CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIFJYRVJSOgorCQlpZiAoKGZpZWxkID0gZ2V0RmllbGQoc2VtaUNvbG9uLCAiICIsIDIpKSkgeworCQkJZXJybm8gPSAwOworCQkJcmVzdWx0X2RhdGFfbnVtID0gc3RydG91bGwoZmllbGQsIE5VTEwsIDEwKTsKKwkJCWlmIChlcnJubyA9PSBFUkFOR0UpLy8ga3cgRVJSTk8uTk9UX0NIRUNLRUQKKwkJCXsKKwkJCQlwcmludGYoInN0cnRvdWxsIGVycm5vICVkOiAlc1xuIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJCQl9CisJCQlpZiAocmVzdWx0X2RhdGFfbnVtIDwgMCB8fCByZXN1bHRfZGF0YV9udW0gPiBMTE9OR19NQVgtMSkKKwkJCQlyZXN1bHRfZGF0YV9udW0gPSAwOworCQkJKnJlc3VsdF9kYXRhID0gcmVzdWx0X2RhdGFfbnVtOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSWERST1A6CisJCWlmICgoZmllbGQgPSBnZXRGaWVsZChzZW1pQ29sb24sICIgIiwgMykpKSB7CisJCQllcnJubyA9IDA7CisJCQlyZXN1bHRfZGF0YV9udW0gPSBzdHJ0b3VsbChmaWVsZCwgTlVMTCwgMTApOworCQkJaWYgKGVycm5vID09IEVSQU5HRSkvLyBrdyBFUlJOTy5OT1RfQ0hFQ0tFRAorCQkJeworCQkJCXByaW50Zigic3RydG91bGwgZXJybm8gJWQ6ICVzXG4iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0KKwkJCWlmIChyZXN1bHRfZGF0YV9udW0gPCAwIHx8IHJlc3VsdF9kYXRhX251bSA+IExMT05HX01BWC0xKQorCQkJCXJlc3VsdF9kYXRhX251bSA9IDA7CisJCQkqcmVzdWx0X2RhdGEgPSByZXN1bHRfZGF0YV9udW07CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIC0xOworfQorCit2b2lkICpzYWZlX21hbGxvYyhpbnQgc2l6ZSwgQk9PTCBpc19hc3NlcnQpCit7CisJdm9pZCAqcmV0ID0gbWFsbG9jKHNpemUpOworCisJaWYgKHJldCA9PSBOVUxMKSB7CisJCWlmIChpc19hc3NlcnQgPT0gVFJVRSkgeworCQkJYXNzZXJ0KHJldCk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIlslc11bJXNdIC0tLS1jYW4gbm90IGdldCBtZW1vcnkiLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsKKwkJfQorCX0gZWxzZSB7CisJCW1lbXNldChyZXQsIDAsIHNpemUpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8vyuTI63NpemWx2NDrysdkZXN0tcSzpLbICit2b2lkIHNhZmVfc3RyY3B5KGNoYXIgKmRlc3QsIGNoYXIgKnNvdXJjZSwgaW50IHNpemUpCit7CisJaWYgKGRlc3QgPT0gTlVMTCB8fCBzb3VyY2UgPT0gTlVMTCB8fCBzaXplIDwgMSkgeworCQlyZXR1cm47CisJfQorCisJc3RybmNweShkZXN0LCBzb3VyY2UsIHNpemUgLSAxKTsKKwlkZXN0W3NpemUgLSAxXSA9ICdcMCc7Cit9CisKK2ludCBnZXRfZGV2X2xpc3Qoc3RydWN0IHBjX25vZGUqIG15cGNfbm9kZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IG5ldGlvY3RsX2hhbmRsZShOSU9DR1BDSU5GTywgbXlwY19ub2RlKTsKKwlpZiAoLTEgPT0gcmV0KSB7CisJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgIk5JT0NHUENJTkZPIGVyciIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgIHp0ZV9nZXRfbWFjX2xpc3RfZnJvbV9sZWFzZShzdHJ1Y3QgbGlzdF9oZWFkICpkaGNwX2xpc3RfaW5mbykKK3sKKwlGSUxFICpsZWFzZUZpbGUgICAgPSBOVUxMOworCWludDY0X3QgbGVhc2VGaXJzdCA9IDA7CisJY2hhciBidWZbMzJdOworCisJREhDUE9GRkVSQUREUk5FVCBkaGNwSW5mbyA9IHswfTsKKworCWNoYXIgcGF0aF9jb25mWzUwXSA9IHswfTsKKwljaGFyIHBhdGhfZmlsZVsxMDBdID0gezB9OworCisJaWYgKCFsaXN0X2VtcHR5KGRoY3BfbGlzdF9pbmZvKSkKKwkJcmV0dXJuIC0xOworCisJc2NfY2ZnX2dldCgicGF0aF9jb25mIiwgcGF0aF9jb25mLCBzaXplb2YocGF0aF9jb25mKSk7CisJc3ByaW50ZihwYXRoX2ZpbGUsICIlcy91ZGhjcGQubGVhc2VzIiwgcGF0aF9jb25mKTsKKworCWxlYXNlRmlsZSA9IGZvcGVuKHBhdGhfZmlsZSwgInIiKTsKKwlpZiAobGVhc2VGaWxlID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJjYW4gbm90IG9wZW4gZmlsZSB1ZGhjcGQubGVhc2VzLiIpOworCQlyZXR1cm4gLTEgOworCX0KKworCWlmIChmcmVhZCgmbGVhc2VGaXJzdCwgMSwgc2l6ZW9mKGxlYXNlRmlyc3QpLCBsZWFzZUZpbGUpICE9IHNpemVvZihsZWFzZUZpcnN0KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgInJlYWQgdGhlIGZpcnN0IHBhcnQgb2YgdWRoY3BkLmxlYXNlcyBmYWlsISIpOworCQlmY2xvc2UobGVhc2VGaWxlKTsKKwkJcmV0dXJuIC0xIDsKKwl9CisKKwltZW1zZXQoYnVmLCAweDAwLCBzaXplb2YoYnVmKSk7CisJc2NfY2ZnX2dldCgiZGhjcEVuYWJsZWQiLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAoc3RyY21wKGJ1ZiwgIjAiKSA9PSAwKSB7CisJCWZjbG9zZShsZWFzZUZpbGUpOworCQlyZXR1cm4gLTEgOworCX0KKworCXdoaWxlICgoZnJlYWQoJmRoY3BJbmZvLCAxLCBzaXplb2YoZGhjcEluZm8pLCBsZWFzZUZpbGUpID09IHNpemVvZihkaGNwSW5mbykpKSB7CisJCURIQ1BPRkZFUkFERFJfTElTVF90ICpkaGNwSW5mb19wdHIgPSAoREhDUE9GRkVSQUREUl9MSVNUX3QgKilzYWZlX21hbGxvYyhzaXplb2YoREhDUE9GRkVSQUREUl9MSVNUX3QpLCBUUlVFKTsKKwkJaWYgKCFkaGNwSW5mb19wdHIpIHsKKwkJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgImdldF9sYW5faW5mb19saXN0IHNhZmVfbWFsbG9jIGRoY3BJbmZvX3B0ciBmYWlsIFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWVtY3B5KCYoZGhjcEluZm9fcHRyLT5kaGNwX2luZm8pLCAmZGhjcEluZm8sIHNpemVvZihESENQT0ZGRVJBRERSTkVUKSk7CisJCWxpc3RfYWRkX3RhaWwoJmRoY3BJbmZvX3B0ci0+bGlzdCwgZGhjcF9saXN0X2luZm8pOworCX0KKworCWZjbG9zZShsZWFzZUZpbGUpOworCXJldHVybiAwOworfQorCit2b2lkIGZsYXNoX2ZpbGUoY2hhciAqZmlsZSwgY2hhciAqZmlsZV9udW0pCit7CisJY2hhciBuZXdGaWxlWzEyOF0gPSB7MH07CisJY2hhciBvbGRGaWxlWzEyOF0gPSB7MH07CisJaW50IGkgPSAwOy8va2xvY3dvcmsKKwlpbnQgaV9maWxlX251bSA9IGF0b2koZmlsZV9udW0pOworCisgICAgaWYoaV9maWxlX251bSA8IDAgfHwgaV9maWxlX251bSA+IElOVF9NQVgtMSkKKyAgICB7CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIAorCWZvciAoaSA9IGlfZmlsZV9udW0gLSAyOyBpID4gMCAmJiBpIDwgMTAwMDsgaS0tKSB7CisJCXNwcmludGYobmV3RmlsZSwgIiVzX2JrJWQiLCBmaWxlLCBpKTsKKwkJc3ByaW50ZihvbGRGaWxlLCAiJXNfYmslZCIsIGZpbGUsIGkgKyAxKTsKKwkJaWYgKChhY2Nlc3MobmV3RmlsZSwgRl9PSykpID09IDApIHsKKwkJCWlmKHJlbmFtZShuZXdGaWxlLCBvbGRGaWxlKSA8IDApeworICAgICAgICAgICAgICAgIC8vIGNvdiBNIAorICAgICAgICAgICAgfQorCQl9CisJfQorCXNwcmludGYobmV3RmlsZSwgIiVzX2JrMSIsIGZpbGUpOworCisgICAgaWYocmVuYW1lKGZpbGUsIG5ld0ZpbGUpIDwgMCkKKyAgICB7CisgICAgICAgIC8vIGNvdiBNCisgICAgfQorfQorCit2b2lkIGZpbGVfd3JpdGUoY2hhciAqZmlsZW5hbWUsIGNoYXIgKmluZm8pCit7CisJRklMRSAqZnA7CisJY2hhciBsb2dwYXRoWzEyOF0gID0gezB9OworCWNoYXIgbG9nbmFtZVsxMjhdID0gezB9OworCWNoYXIgZmlsZXNpemVbMzJdCT0gezB9OworCWNoYXIgdGVtcFs2NF0JPSB7MH07CisJaW50IGZsYWcgPSAwOworCXRpbWVfdCBub3c7CisJc3RydWN0IHRtICp0aW1lbm93OworCisJdGltZSgmbm93KTsKKwl0aW1lbm93ID0gbG9jYWx0aW1lKCZub3cpOworCWlmICghdGltZW5vdykgey8va2xvY3dvcmsKKwkJcHJpbnRmKCJsb2NhbHRpbWUgZ2V0IGVyci5cbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFmaWxlbmFtZSB8fCAwID09IHN0cmNtcChmaWxlbmFtZSwgIiIpKSB7CisJCXByaW50ZigiZmlsZW5hbWUgaXMgZXJyLlxuIik7CisJCXJldHVybjsKKwl9CisKKwkvL9a4tqhsb2fOxLz+tPPQoaOsyOe5+8601ri2qL7N08PErMjPY29tbV9sb2dzaXplCisJc3ByaW50Zih0ZW1wLCAiJXNfbG9nc2l6ZSIsIGZpbGVuYW1lKTsKKwlzY19jZmdfZ2V0KHRlbXAsIGZpbGVzaXplLCBzaXplb2YoZmlsZXNpemUpKTsKKwlpZiAoMCA9PSBzdHJjbXAoZmlsZXNpemUsICIwIikpIHsKKwkJcmV0dXJuIDsKKwl9IGVsc2UgaWYgKDAgPT0gc3RyY21wKGZpbGVzaXplLCAiIikpIHsKKwkJc2NfY2ZnX2dldCgiY29tbV9sb2dzaXplIiwgZmlsZXNpemUsIHNpemVvZihmaWxlc2l6ZSkpOworCQlpZiAoMCA9PSBzdHJjbXAoZmlsZXNpemUsICIwIikgfHwgMCA9PSBzdHJjbXAoZmlsZXNpemUsICIiKSkgeworCQkJcHJpbnRmKCJmaWxlc2l6ZSBpcyBub3Qgc2V0LlxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlzY19jZmdfZ2V0KCJwYXRoX2xvZyIsIGxvZ3BhdGgsIHNpemVvZihsb2dwYXRoKSk7CisJc25wcmludGYobG9nbmFtZSwgc2l6ZW9mKGxvZ25hbWUpLCAiJXMlcy5sb2ciLCBsb2dwYXRoLCBmaWxlbmFtZSk7CisKKwlmcCA9IGZvcGVuKGxvZ25hbWUsICJhIik7CisJaWYgKCFmcCkgeworCQlwcmludGYoImZvcGVuICVzIGZhaWxlZCBcbiIsIGxvZ25hbWUpOworCQlyZXR1cm47CisJfQorCS8vZmxvY2u7+tbGsqKyu8Tc1ea1xMbwtb1sb2Nr1/fTw6Ost7W72Lvh1OyzyXVubG9ja7K7tfQKKwkvKgorCWVsc2UgaWYgKGZsb2NrKGZpbGVubyhmcCksIExPQ0tfRVgpICE9IDApCisJeworCSAgICBwZXJyb3IoImZsb2NrIik7CisJCWZjbG9zZShmcCk7CisJICAgIHJldHVybjsKKwl9Ki8KKworCWZwcmludGYoZnAsICIlczolc1xuIiwgc3RyX2N0aW1lKHRpbWVub3cpLCBpbmZvKTsKKwkvL2ZwcmludGYoZnAsICIlcyAlcyAlc1slZF06ICVzIiwgY3RpbWUodGltZW5vdyksIGFzY3RpbWUodGltZW5vdyksIGZpbGVuYW1lLCBnZXRwaWQoKSwgaW5mbyk7CisJZmZsdXNoKGZwKTsKKwlmc2VlayhmcCwgMEwsIFNFRUtfRU5EKTsKKworCWlmIChmdGVsbChmcCkgPiBhdG9pKGZpbGVzaXplKSkKKwkJZmxhZyA9IDE7CisKKwkvL2Zsb2NrKGZpbGVubyhmcCksIExPQ0tfVU4pOworCWZjbG9zZShmcCk7CisKKwlpZiAoZmxhZyA9PSAxKSB7CisJCWZsYXNoX2ZpbGUobG9nbmFtZSwgIjIiKTsKKwl9Cit9CisKK2ludCBlY2hvX2ZpbGUoY2hhciAqZmlsZW5hbWUsIGNoYXIqaW5mbykKK3sKKwlpbnQgbGVuOworCWludCByZXQ7CisJaW50IGZkOworCWlmICghZmlsZW5hbWUgfHwgMCA9PSBzdHJjbXAoZmlsZW5hbWUsICIiKSB8fCAhaW5mbykgeworCQlwcmludGYoImVjaG8gZmlsZW5hbWUgaXMgZXJyLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fUkRXUiwgNzc3KTsKKwlpZiAoZmQgPCAwKSB7CisJCXByaW50ZigiJXMgb3BlbiBmYWlsZWQhXG4iLCBmaWxlbmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJbGVuID0gc3RybGVuKGluZm8pOworCXJldCA9IHdyaXRlKGZkLCBpbmZvLCBsZW4pOworCisJY2xvc2UoZmQpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBzYXZlX2ZpbGUoY2hhciAqZmlsZW5hbWUsIGNoYXIqIGluZm8pCit7CisJRklMRSogZnA7CisJY2hhciBmaWxlcGF0aFsxMjhdICA9IHswfTsKKwljaGFyIGZpbGVzaXplWzMyXQk9IHswfTsKKwljaGFyIGZpbGVudW1bMzJdCT0gezB9OworCWNoYXIgdGVtcFs2NF0JPSB7MH07CisJaW50IGZsYWcgPSAwOworCXRpbWVfdCBub3c7CisJc3RydWN0IHRtICp0aW1lbm93OworCXRpbWUoJm5vdyk7CisJdGltZW5vdyA9IGxvY2FsdGltZSgmbm93KTsKKwlpZiAoIXRpbWVub3cpIHsvL2tsb2N3b3JrCisJCXByaW50ZigibG9jYWx0aW1lIGdldCBlcnIuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghZmlsZW5hbWUgfHwgMCA9PSBzdHJjbXAoZmlsZW5hbWUsICIiKSkgeworCQlwcmludGYoImZpbGVuYW1lIGlzIGVyci5cbiIpOworCQlyZXR1cm47CisJfQorCXNwcmludGYodGVtcCwgIiVzZmlsZSIsIGZpbGVuYW1lKTsKKwlzY19jZmdfZ2V0KHRlbXAsIGZpbGVwYXRoLCBzaXplb2YoZmlsZXBhdGgpKTsKKwlzcHJpbnRmKHRlbXAsICIlc2ZpbGVTaXplIiwgZmlsZW5hbWUpOworCXNjX2NmZ19nZXQodGVtcCwgZmlsZXNpemUsIHNpemVvZihmaWxlc2l6ZSkpOworCWlmICgwID09IHN0cmNtcChmaWxlc2l6ZSwgIjAiKSB8fCAwID09IHN0cmNtcChmaWxlc2l6ZSwgIiIpKSB7CisJCXByaW50ZigiZmlsZXNpemUgaXMgbm90IHNldC5cbiIpOworCQlyZXR1cm47CisJfQorCisJc3ByaW50Zih0ZW1wLCAiJXNOdW0iLCBmaWxlbmFtZSk7CisJc2NfY2ZnX2dldCh0ZW1wLCBmaWxlbnVtLCBzaXplb2YoZmlsZW51bSkpOworCWZwID0gZm9wZW4oZmlsZXBhdGgsICJhIik7CisJaWYgKCFmcCkgeworCQlwcmludGYoImZvcGVuICVzIGZhaWxlZCBcbiIsIGZpbGVwYXRoKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoZmxvY2soZmlsZW5vKGZwKSwgTE9DS19FWCkgIT0gMCkgeworCQlwZXJyb3IoImZsb2NrIik7CisJCWZjbG9zZShmcCk7CisJCXJldHVybjsKKwl9CisKKwlmcHJpbnRmKGZwLCAiJXMgJXNcbiIsIHN0cl9jdGltZSh0aW1lbm93KSwgaW5mbyk7CisJZmZsdXNoKGZwKTsKKwlmc2VlayhmcCwgMEwsIFNFRUtfRU5EKTsKKwlpZiAoZnRlbGwoZnApID4gYXRvaShmaWxlc2l6ZSkpCisJCWZsYWcgPSAxOworCisJZmxvY2soZmlsZW5vKGZwKSwgTE9DS19VTik7CisJZmNsb3NlKGZwKTsKKworCWlmIChmbGFnID09IDEpIHsKKwkJZmxhc2hfZmlsZShmaWxlcGF0aCwgIjIiKTsKKwl9Cit9CisKK3N0cnVjdCB0aW1ldmFsIHRpbWVnZXQodm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisJdW5zaWduZWQgY2hhciAgdGltZXN0cls2MF0gPSB7MH07CisJdW5zaWduZWQgY2hhciAgdXB0aW1lc3RyWzMwXSA9IHswfTsKKwl1bnNpZ25lZCBjaGFyICogZG90YWRkciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBzZWNvbmQ7CisJY2hhciBlcnJvciA9IDA7CisJRklMRSAqIHRpbWVmaWxlID0gTlVMTDsKKyAgICBpbnQgcmVhZF9sZW4gPSAwOworCisJdGltZWZpbGUgPSBmb3BlbigiL3Byb2MvdXB0aW1lIiwgInIiKTsKKwlpZiAoIXRpbWVmaWxlKSB7CisJCXByaW50ZigiWyVzOmxpbmU6JWRdIGVycm9yIG9wZW5pbmcgJy9wcm9jL3VwdGltZSciLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQllcnJvciA9IDE7CisJCWdvdG8gb3V0OworCX0KKwkvL2tsb2N3b3JrICBjb3YgTQorCXJlYWRfbGVuID0gZnJlYWQodGltZXN0ciwgc2l6ZW9mKGNoYXIpLCBzaXplb2YodGltZXN0ciktMSwgdGltZWZpbGUpOworCWlmIChyZWFkX2xlbiA9PSAwICkgeworCQlwcmludGYoIlslczpsaW5lOiVkXSByZWFkICcvcHJvYy91cHRpbWUnIGVycm9yIiwgX19GSUxFX18sIF9fTElORV9fKTsKKwkJZXJyb3IgPSAxOworCQlnb3RvIG91dDsKKwl9CisJdGltZXN0cltzaXplb2YodGltZXN0ciktMV0gPSAnXDAnOy8vY292CisJZG90YWRkciA9IHN0cmNocih0aW1lc3RyLCAnLicpOworCWlmIChkb3RhZGRyICE9IE5VTEwgJiYgKGRvdGFkZHIgLSB0aW1lc3RyKSA8ICgzMCAtIDIpKS8vY292CisJCW1lbWNweSh1cHRpbWVzdHIsIHRpbWVzdHIsIGRvdGFkZHIgLSB0aW1lc3RyICsgMik7CisJZWxzZSB7CisJCXByaW50ZigiWyVzOmxpbmU6JWRdIHVwdGltZSBzdHJpbmcgaXMgdG9vIGxvbmciLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQllcnJvciA9IDE7CisJCWdvdG8gb3V0OworCX0KKwl1cHRpbWVzdHJbZG90YWRkciAtIHRpbWVzdHIgKyAyXSA9ICdcMCc7CisKK291dDoKKwlpZiAoZXJyb3IpIHsKKwkJbm93LnR2X3NlYyAgPSAwOworCQlub3cudHZfdXNlYyA9IDA7CisJfSBlbHNlIHsKKwkJbm93LnR2X3NlYyAgPSBhdG9sKHVwdGltZXN0cik7CisJCW5vdy50dl91c2VjID0gMDsKKwl9CisJaWYgKHRpbWVmaWxlKSB7Ly9rbG9jd29yaworCQlmY2xvc2UodGltZWZpbGUpOworCX0KKwlyZXR1cm4gbm93OworfQorCit1bnNpZ25lZCBsb25nIHRpbWVfc2VjKCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB1cHRpbWU7CisKKwl1cHRpbWUgPSB0aW1lZ2V0KCk7CisJLy9wcmludGYoInVwdGltZSA9ICVsdSBcbiIsKHVuc2lnbmVkIGxvbmcpdXB0aW1lLnR2X3NlYyk7CisJcmV0dXJuIHVwdGltZS50dl9zZWM7Cit9CisKK2ludCBnZXRfbGFuX2luZm9fbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpmaWxlX2xpc3RfaW5mbykKK3sKKwlGSUxFICpsYW5GaWxlICAgID0gTlVMTDsKKwljaGFyIGJ1ZlszMl07CisKKwlMQU5fSU5GT190IGxhbkluZm8gPSB7MH07CisJY2hhciBwYXRoX2NvbmZbNTBdID0gezB9OworCWNoYXIgcGF0aF9maWxlWzEwMF0gPSB7MH07CisKKwlpZiAoIWxpc3RfZW1wdHkoZmlsZV9saXN0X2luZm8pKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlzY19jZmdfZ2V0KCJwYXRoX2NvbmYiLCBwYXRoX2NvbmYsIHNpemVvZihwYXRoX2NvbmYpKTsKKwlzcHJpbnRmKHBhdGhfZmlsZSwgIiVzL2xhbmluZm8udG1wIiwgcGF0aF9jb25mKTsKKworCWxhbkZpbGUgPSBmb3BlbihwYXRoX2ZpbGUsICJyIik7CisJaWYgKGxhbkZpbGUgPT0gTlVMTCkgeworCQlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJmb3BlbiBsYW5pbmZvLnRtcCBmYWlsIFxuIik7CisJCXJldHVybiAwOworCX0KKworCXdoaWxlIChmcmVhZCgmbGFuSW5mbywgc2l6ZW9mKExBTl9JTkZPX3QpLCAxLCBsYW5GaWxlKSA9PSAxKSB7CisJCUxBTl9JTkZPX0xJU1RfdCAqbGFuSW5mb19wdHIgPSAoTEFOX0lORk9fTElTVF90ICopc2FmZV9tYWxsb2Moc2l6ZW9mKExBTl9JTkZPX0xJU1RfdCksIFRSVUUpOworCQlpZiAoIWxhbkluZm9fcHRyKSB7CisJCQlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJnZXRfbGFuX2luZm9fbGlzdCBzYWZlX21hbGxvYyBsYW5JbmZvX3B0ciBmYWlsIFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWVtY3B5KCYobGFuSW5mb19wdHItPmxhbl9pbmZvKSwgJmxhbkluZm8sIHNpemVvZihMQU5fSU5GT190KSk7CisJCWxpc3RfYWRkX3RhaWwoJmxhbkluZm9fcHRyLT5saXN0LCBmaWxlX2xpc3RfaW5mbyk7CisJfQorCisJZmNsb3NlKGxhbkZpbGUpOworCXJldHVybiAwOworCit9CisKKy8qIMno1sOzrMqxy/ijrCCzrMqxMLHtyr7TwL7Dy/ggLSDU3bK7ttTN4qOs0OjSqm1zvLax8Mqxv6q3xSAqLworaW50IHNldF93YWtlX2xvY2tfdGltZW91dF9tcyhjb25zdCBjaGFyICpsb2NraWQsIHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWxfbXMpCit7CisJY2hhciAqcCA9IE5VTEw7CisJaW50IHJldCA9IC0xOworCisJaWYgKChsb2NraWQgPT0gTlVMTCkgfHwgKCpsb2NraWQgPT0gJ1wwJykpIAorCQlyZXR1cm4gLTE7CisKKwlpZiAoaW50ZXJ2YWxfbXMgPT0gMCkgeworCQlyZXQgPSBhc3ByaW50ZigmcCwgIiVzIiwgbG9ja2lkKTsKKwl9IGVsc2UgeworCQlyZXQgPSBhc3ByaW50ZigmcCwgIiVzICVsdTAwMDAwMCIsIGxvY2tpZCwgaW50ZXJ2YWxfbXMpOworCX0KKwlpZiAocmV0IDwgMCkgeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCXJldCA9IHdyaXRlX3RvX2ZpbGUoV0FLRV9MT0NLX1BBVEgsIHAsIHN0cmxlbihwKSk7CisJCitvdXQ6CisJc2FmZV9mcmVlKHApOworCXJldHVybiByZXQ7Cit9CisKKy8qILvxyKF3YWtlbG9ja8v4ICovCitpbnQgc2V0X3dha2VfbG9jayhjb25zdCBjaGFyICpsb2NrSWQpCit7CisJcmV0dXJuIHNldF93YWtlX2xvY2tfdGltZW91dF9tcyhsb2NrSWQsIDApOworfQorCisvKiDJ6NbDs6zKscv4ICovCitpbnQgc2V0X3dha2VfbG9ja190aW1lb3V0KGNvbnN0IGNoYXIgKmxvY2tJZCwgdW5zaWduZWQgbG9uZyBzZWNvbmRzKQoreworCXJldHVybiBzZXRfd2FrZV9sb2NrX3RpbWVvdXRfbXMobG9ja0lkLCBzZWNvbmRzICogMTAwMCk7Cit9CisKKy8qIMrNt8V3YWtlbG9ja8v4ICovCitpbnQgc2V0X3dha2VfdW5sb2NrKGNvbnN0IGNoYXIgKmxvY2tJZCkKK3sKKwlpZiAoKGxvY2tJZCA9PSBOVUxMKSB8fCAoKmxvY2tJZCA9PSAnXDAnKSkKKwkJcmV0dXJuIC0xOworCQorCXJldHVybiB3cml0ZV90b19maWxlKFdBS0VfVU5MT0NLX1BBVEgsIGxvY2tJZCwgc3RybGVuKGxvY2tJZCkpOworfQorCitpbnQgcmVhZE5sU29jayhpbnQgc29ja0ZkLCBjaGFyICpidWZQdHIsIGludCBzZXFOdW0sIGludCBwSWQpCit7CisJc3RydWN0IG5sbXNnaGRyICpubEhkcjsKKwlpbnQgcmVhZExlbiA9IDAsIG1zZ0xlbiA9IDA7CisJZG8geworCQkvL8rVtb3E2rrLtcTTprTwCisJCWlmICgocmVhZExlbiA9IHJlY3Yoc29ja0ZkLCBidWZQdHIsIEJVRlNJWkUgLSBtc2dMZW4sIDApKSA8IDApIHsKKwkJCXBlcnJvcigiU09DSyBSRUFEOiAiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisKKwkJbmxIZHIgPSAoc3RydWN0IG5sbXNnaGRyICopYnVmUHRyOworCQkvL7zssuloZWFkZXLKx7fx09DQpworCQlpZiAoKE5MTVNHX09LKG5sSGRyLCByZWFkTGVuKSA9PSAwKSB8fCAobmxIZHItPm5sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpKSB7CisJCQlwZXJyb3IoIkVycm9yIGluIHJlY2lldmVkIHBhY2tldCIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKworCisKKwkJaWYgKG5sSGRyLT5ubG1zZ190eXBlID09IE5MTVNHX0RPTkUpIHsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJYnVmUHRyICs9IHJlYWRMZW47CisJCQltc2dMZW4gKz0gcmVhZExlbjsKKwkJfQorCisJCWlmICgobmxIZHItPm5sbXNnX2ZsYWdzICYgTkxNX0ZfTVVMVEkpID09IDApIHsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoKG5sSGRyLT5ubG1zZ19zZXEgIT0gc2VxTnVtKSB8fCAobmxIZHItPm5sbXNnX3BpZCAhPSBwSWQpKTsKKwlyZXR1cm4gbXNnTGVuOworfQorCisvL2NvdmVyaXR5CitzdGF0aWMgaW50IG5ldF9SVEFfT0soc3RydWN0IHJ0YXR0ciAqcnRhLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXJldHVybiBSVEFfT0socnRhLCBsZW4pOworfQorCisvL7fWzva3tbvYtcTCt9PJ0MXPogordm9pZCBwYXJzZVJvdXRlcyhzdHJ1Y3Qgbmxtc2doZHIgKm5sSGRyLCBzdHJ1Y3Qgcm91dGVfaW5mbyAqcnRJbmZvKQoreworCXN0cnVjdCBydG1zZyAqcnRNc2c7CisJc3RydWN0IHJ0YXR0ciAqcnRBdHRyOworCWludCBydExlbiwgZHN0TGVuOworCS8vY2hhciAqdGVtcEJ1ZiA9IE5VTEw7CisJc3RydWN0IGluX2FkZHIgZHN0OworCXN0cnVjdCBpbl9hZGRyIGdhdGU7CisJY2hhciBjbWRbMTI4XTsKKwljaGFyIGRzdGFkZHJbMzJdLCBzcmNhZGRyWzMyXTsKKworCisJLy90ZW1wQnVmID0gKGNoYXIgKiltYWxsb2MoMTAwKTsKKwlydE1zZyA9IChzdHJ1Y3QgcnRtc2cgKilOTE1TR19EQVRBKG5sSGRyKTsKKwkvLyBJZiB0aGUgcm91dGUgaXMgbm90IGZvciBBRl9JTkVUIG9yIGRvZXMgbm90IGJlbG9uZyB0byBtYWluIHJvdXRpbmcgdGFibGUKKwkvL3RoZW4gcmV0dXJuLgorCWlmICgocnRNc2ctPnJ0bV9mYW1pbHkgIT0gQUZfSU5FVCkgfHwgKHJ0TXNnLT5ydG1fdGFibGUgIT0gUlRfVEFCTEVfTUFJTikpCisJCXJldHVybjsKKwkvL3ByaW50ZigicnRtc2cgc3JjbGVuOiVkLGRzdGxlbjolZFxuIixydE1zZy0+cnRtX3NyY19sZW4scnRNc2ctPnJ0bV9kc3RfbGVuKTsKKwlkc3RMZW4gPSBydE1zZy0+cnRtX2RzdF9sZW47IC8vwrfTybHt1tDEv7XEtdjWt7XE0drC67OktsgKKworCisJcnRBdHRyID0gKHN0cnVjdCBydGF0dHIgKilSVE1fUlRBKHJ0TXNnKTsKKwlydExlbiA9IFJUTV9QQVlMT0FEKG5sSGRyKTsKKwlmb3IgKDsgbmV0X1JUQV9PSyhydEF0dHIsIHJ0TGVuKTsgcnRBdHRyID0gUlRBX05FWFQocnRBdHRyLCBydExlbikpIHsKKwkJc3dpdGNoIChydEF0dHItPnJ0YV90eXBlKSB7CisJCWNhc2UgUlRBX09JRjoKKwkJCWlmX2luZGV4dG9uYW1lKCooaW50ICopUlRBX0RBVEEocnRBdHRyKSwgcnRJbmZvLT5pZk5hbWUpOyAgICAgICAvL834v6jD+7PGCisJCQlicmVhazsKKwkJY2FzZSBSVEFfR0FURVdBWToKKwkJCXJ0SW5mby0+Z2F0ZVdheSA9ICoodV9pbnQgKilSVEFfREFUQShydEF0dHIpOyAgICAgICAgICAgICAgICAgICAgICAgLy+0y8z1wrfTyc/utcTN+LnYCisJCQlicmVhazsKKwkJY2FzZSBSVEFfUFJFRlNSQzoKKwkJCXJ0SW5mby0+c3JjQWRkciA9ICoodV9pbnQgKilSVEFfREFUQShydEF0dHIpOyAgICAgICAgICAgICAgICAgICAgICAgLy/Ct9PJz+61xNS0tdjWtworCQkJYnJlYWs7CisJCWNhc2UgUlRBX0RTVDoKKwkJCXJ0SW5mby0+ZHN0QWRkciA9ICoodV9pbnQgKilSVEFfREFUQShydEF0dHIpOyAgICAgICAgICAgICAgICAgICAgICAgLy/Ct9PJz+7W0LXExL+1xLXY1rcKKwkJCWJyZWFrOworCQl9CisJfQorCWRzdC5zX2FkZHIgPSBydEluZm8tPmRzdEFkZHI7CisKKwlwcmludGYoIm9pZjolc1x0IiwgcnRJbmZvLT5pZk5hbWUpOworCWdhdGUuc19hZGRyID0gcnRJbmZvLT5nYXRlV2F5OworCXByaW50ZigiJXNcbiIsIChjaGFyICopaW5ldF9udG9hKGdhdGUpKTsKKworCXByaW50Zigic3JjOiVzXG4iLCAoY2hhciAqKWluZXRfbnRvYShnYXRlKSk7CisJc25wcmludGYoc3JjYWRkciwgc2l6ZW9mKHNyY2FkZHIpLCAiJXMiLCAoY2hhciAqKWluZXRfbnRvYShnYXRlKSk7Ly9rbG9jd29yaworCWdhdGUuc19hZGRyID0gcnRJbmZvLT5kc3RBZGRyOworCXByaW50ZigiZHN0OiVzXG4iLCAoY2hhciAqKWluZXRfbnRvYShnYXRlKSk7CisKKwkvL2ZyZWUodGVtcEJ1Zik7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vvdO/2rmmxNyjuiC87LLiyse38cXk1sPBy8ixyqHCt9PJo6zQ6NKqwazN4s34tcTTptPDv8nS1LX308Oxvr3Tv9rF0LbPzfjC58rHt/G+zdD3CisvL3JldHVybjoKKy8vICAgIC0xOiBlcnJvcjsKKy8vICAgICAwOiDN+MLnzrS+zdD3CisvLyAgICAgMTogzfjC59LRvs3Q9worLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZGVmYXVsdF9yb3V0ZV9jaGVjaygpCit7CisJc3RydWN0IG5sbXNnaGRyICpubE1zZzsKKwlzdHJ1Y3QgcnRtc2cgKnJ0TXNnOworCXN0cnVjdCByb3V0ZV9pbmZvICpydEluZm87CisJY2hhciAqbXNnQnVmID0gbWFsbG9jKEJVRlNJWkUpOworCisKKwlpbnQgc29jaywgbGVuLCBtc2dTZXEgPSAwOworCisgICAgaWYoTlVMTCA9PSBtc2dCdWYpIHsKKyAgICAgICAgc29mdGFwX2Fzc2VydCgiIik7CisJCXJldHVybiAtMTsvL2tsb2N3b3JrCisgICAgfQorCisJaWYgKChzb2NrID0gc29ja2V0KFBGX05FVExJTkssIFNPQ0tfREdSQU0sIE5FVExJTktfUk9VVEUpKSA8IDApIHsKKwkJcGVycm9yKCJTb2NrZXQgQ3JlYXRpb246ICIpOworCQlmcmVlKG1zZ0J1Zik7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQobXNnQnVmLCAwLCBCVUZTSVpFKTsKKworCW5sTXNnID0gKHN0cnVjdCBubG1zZ2hkciAqKW1zZ0J1ZjsKKwlydE1zZyA9IChzdHJ1Y3QgcnRtc2cgKilOTE1TR19EQVRBKG5sTXNnKTsKKwlubE1zZy0+bmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgcnRtc2cpKTsgLy8gTGVuZ3RoIG9mIG1lc3NhZ2UuCisJbmxNc2ctPm5sbXNnX3R5cGUgPSBSVE1fR0VUUk9VVEU7IC8vIEdldCB0aGUgcm91dGVzIGZyb20ga2VybmVsIHJvdXRpbmcgdGFibGUgLgorCW5sTXNnLT5ubG1zZ19mbGFncyA9IE5MTV9GX0RVTVAgfCBOTE1fRl9SRVFVRVNUOyAvLyBUaGUgbWVzc2FnZSBpcyBhIHJlcXVlc3QgZm9yIGR1bXAuCisJbmxNc2ctPm5sbXNnX3NlcSA9IG1zZ1NlcSsrOyAvLyBTZXF1ZW5jZSBvZiB0aGUgbWVzc2FnZSBwYWNrZXQuCisJbmxNc2ctPm5sbXNnX3BpZCA9IGdldHBpZCgpOyAvLyBQSUQgb2YgcHJvY2VzcyBzZW5kaW5nIHRoZSByZXF1ZXN0LgorCisJaWYgKHNlbmQoc29jaywgbmxNc2csIG5sTXNnLT5ubG1zZ19sZW4sIDApIDwgMCkgeworCQlwcmludGYoIldyaXRlIFRvIFNvY2tldCBGYWlsZWShrVxuIik7CisJCWZyZWUobXNnQnVmKTsKKwkJY2xvc2Uoc29jayk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKGxlbiA9IHJlYWRObFNvY2soc29jaywgbXNnQnVmLCBtc2dTZXEsIGdldHBpZCgpKSkgPCAwKSB7CisJCXByaW50ZigiUmVhZCBGcm9tIFNvY2tldCBGYWlsZWShrVxuIik7CisJCWZyZWUobXNnQnVmKTsKKwkJY2xvc2Uoc29jayk7CisJCXJldHVybiAtMTsKKwl9CisKKworCXJ0SW5mbyA9IChzdHJ1Y3Qgcm91dGVfaW5mbyAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHJvdXRlX2luZm8pKTsKKwlpZiAoTlVMTCA9PSBydEluZm8pIHsgLy9rbG9jd29yaworCQlwcmludGYoIk1hbGxvYyByb3V0ZV9pbmZvIEZhaWxlZKGtXG4iKTsKKwkJZnJlZShtc2dCdWYpOworCQljbG9zZShzb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKwlmb3IgKDsgTkxNU0dfT0sobmxNc2csIGxlbik7IG5sTXNnID0gTkxNU0dfTkVYVChubE1zZywgbGVuKSkgeworCQltZW1zZXQocnRJbmZvLCAwLCBzaXplb2Yoc3RydWN0IHJvdXRlX2luZm8pKTsKKwkJcGFyc2VSb3V0ZXMobmxNc2csIHJ0SW5mbyk7CisJCWlmIChydEluZm8tPmRzdEFkZHIgPT0gMCAmJiBzdHJsZW4ocnRJbmZvLT5pZk5hbWUpKSB7CisJCQlwcmludGYoImRlZmF1bHQgd2FuIDolcyBcbiIsIHJ0SW5mby0+aWZOYW1lKTsKKwkJCWZyZWUocnRJbmZvKTsKKwkJCWNsb3NlKHNvY2spOworCQkJZnJlZShtc2dCdWYpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJZnJlZShydEluZm8pOworCWNsb3NlKHNvY2spOworCWZyZWUobXNnQnVmKTsKKwlyZXR1cm4gMDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vvdO/2rmmxNw6ICAgvOyy4mZsYXNoyse38bG7xuTL+7rL1bzTwworLy9yZXR1cm46CisvLyAgICAgICAgICAgICAwICAgLS0tLS0gIGZsYXNow7vT0LG71bzTwworLy8JCSAgIDEgICAtLS0tLSAgZmxhc2jV/bG7xuTL+7rL1bzTwworLy8JCSAgLTEgIC0tLS0tICBvcGVuvdq148qnsNwKKy8vCQkgIC0yICAtLS0tLSAgaW9jdGzKp7DcCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBmbGFzaF9tdXRleF9jaGVjaygpCit7CisJaW50IGZkLCByZXQ7CisJY2hhciBhcmcgPSAzOworCWZkID0gb3BlbigiL2Rldi9zb2Z0c3BpbmxvY2siLCBPX1JEV1IpOworCS8vcHJpbnRmKCJmZCA9ICVkIFxuIixmZCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0ID0gaW9jdGwoZmQsIFNQSU5MT0NLX0dFVF9TVEFUVVMsICZhcmcpOworCS8vcHJpbnRmKCJyZXQgPSAlZCAgYXJnID0gJWQgXG4iLHJldCxhcmcpOworCWlmIChyZXQgPCAwKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIC0yOworCX0KKwljbG9zZShmZCk7CisJcmV0dXJuIGFyZzsKKworfQorCisvL7vxyKHWuLaoz9+zzMP7tcRwaWS6xaOs16LS4qO6tffTw7jDuq/K/bvxyKG3tbvY1rWjrMq508O689K7tqjSqsrNt8W4w8TatOa/1bzkCitwaWRfdCogZmluZF9waWRfYnlfbmFtZShjaGFyICpwaWROYW1lKQoreworCURJUiAqZGlyOworCXN0cnVjdCBkaXJlbnQgKm5leHQ7CisJcGlkX3QqIHBpZExpc3QgPSBOVUxMOworCXBpZF90KiB0bXBMaXN0ID0gTlVMTDsKKwlpbnQgaSA9IDA7CisJCisJLy9wcm9j1tCw/MCotbHHsLXEvfizzNDFz6KjrLbByKG4w8S/wrwKKwlkaXIgPSBvcGVuZGlyKCIvcHJvYyIpOworCWlmKCFkaXIpCisJeworCQlwZXJyb3IoIkNhbm5vdCBvcGVuIC9wcm9jIik7CisJCXJldHVybiBwaWRMaXN0OworCX0KKwkvL7HpwPovcHJvY8/CxL/CvAorCXdoaWxlKChuZXh0ID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKQorCXsKKwkJRklMRSAqc3RhdHVzOworCQljaGFyIGZpbGVuYW1lW1JFQURfQlVGX1NJWkVdID0gezB9Oy8va2xvY3dvcmsKKwkJY2hhciBmaWxlbmFtZTFbUkVBRF9CVUZfU0laRV0gPSB7MH07Ly9rbG9jd29yaworCQljaGFyIG5hbWVbUkVBRF9CVUZfU0laRV0gPSB7MH07CisJCS8vc2tpcCAiLi4iIHNpbmNlIHRoYXQgaXMgb3V0c2lkZSAvcHJvYworCQlpZigwID09IHN0cmNtcChuZXh0LT5kX25hbWUsIi4uIikpCisJCQljb250aW51ZTsKKwkJLy9pZiBpdCBpc24ndCBhIG51bWJlcix3ZSBza2lwIGl0CisJCWlmKCFpc2RpZ2l0KCpuZXh0LT5kX25hbWUpKQorCQkJY29udGludWU7CisJCQorCQlzbnByaW50ZihmaWxlbmFtZSxzaXplb2YoZmlsZW5hbWUpLCIvcHJvYy8lcy9zdGF0dXMiLG5leHQtPmRfbmFtZSk7CisKKwkJaWYoIShzdGF0dXMgPSBmb3BlbihmaWxlbmFtZSwiciIpKSkKKwkJeworCQkJY29udGludWU7CisJCX0KKwkJaWYoTlVMTCA9PSBmZ2V0cyhmaWxlbmFtZTEsUkVBRF9CVUZfU0laRS0xLHN0YXR1cykpCisJCXsKKwkJCWZjbG9zZShzdGF0dXMpOworCQkJY29udGludWU7CisJCX0KKwkJZmNsb3NlKHN0YXR1cyk7CisJCQorCQkvL7vxyKG9+LPMcGlko6zNrMqx0rK74dPQtuC49s/gzay9+LPMw/u1xMfpv/YKKwkJc3NjYW5mKGZpbGVuYW1lMSwgIiUqcyAlcyIsIG5hbWUpOworCQlpZigwID09IHN0cmNtcChuYW1lLHBpZE5hbWUpKQorCQl7CisJCQkvL3BpZExpc3QgPSByZWFsbG9jKHBpZExpc3Qsc2l6ZW9mKHBpZF90KSooaSsyKSk7CisJCQkvL2tsb2N3b3JrCisJCQl0bXBMaXN0ID0gcmVhbGxvYyhwaWRMaXN0LHNpemVvZihwaWRfdCkqKGkrMikpOworCQkJaWYgKE5VTEwgPT0gdG1wTGlzdCkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcGlkTGlzdCA9IHRtcExpc3Q7CisJCQllcnJubyA9IDA7CisJCQlwaWRMaXN0W2krK10gPSBzdHJ0b2wobmV4dC0+ZF9uYW1lLE5VTEwsMCk7CisJCQlpZiAoZXJybm8gPT0gRVJBTkdFKS8vIGt3IEVSUk5PLk5PVF9DSEVDS0VECisJCQl7CisJCQkJcHJpbnRmKCJzdHJ0b2wgZXJybm8gJWQ6ICVzXG4iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0KKwkJfQorCX0KKwlpZihwaWRMaXN0KQorCXsKKwkJcGlkTGlzdFtpXSA9IDA7CisJfQorCWNsb3NlZGlyKGRpcik7CisJcmV0dXJuIHBpZExpc3Q7Cit9CisKK3ZvaWQgaGFuZGxlX3F1aXQoaW50IHNpZ25vKQoreworICAgIHB0aHJlYWRfZXhpdChOVUxMKTsKK30KKworLyogZ2V0aG9zdGJ5bmFtZbmmxNzW0LaoyrHG97OsyrG0psDtuq/K/SAqLwordm9pZCBnZXRob3N0YnluYW1lX3RpbWVvdXQoaW50IG1zZ19pZCkKK3sKKwlzbG9nKE5FVF9QUklOVCwgU0xPR19ERUJVRywgImdldGhvc3RieW5hbWVfdGltZW91dCBiZWdpbixtc2dfaWQ9JWRcbiIsbXNnX2lkKTsKKwlpZihpcGNfc2VuZF9tZXNzYWdlKG1zZ19pZCwgbXNnX2lkLCBNU0dfR0VUX0hPU1RfQllfTkFNRV9USU1FT1VULDAsIDAsIDApIDwgMCkKKyAgICB7CisgICAgICAgIC8vIHRvZG86IGZvciBjb3YgTQorICAgIH0gICAgICAgIAorfQorCisvKioKKyogZ2V0aG9zdGJ5bmFtZbmmxNzW0LS0vai2qMqxxvcKKyogc2Vjb25kX3RpbWU6ILOsyrHKsbOkCisqIG1zZ19pZDogICAgICAgICDP37PMaWQKKyovCit2b2lkIGdldGhvc3RieW5hbWVfY3JlYXR0aW1lcihpbnQgc2Vjb25kX3RpbWUsIGludCBtc2dfaWQpCit7CisJc2xvZyhORVRfUFJJTlQsIFNMT0dfREVCVUcsICJnZXRob3N0YnluYW1lX2NyZWF0dGltZXIgYmVnaW5cbiIpOworCXNjX3RpbWVyX2RlbGV0ZShUSU1FUl9HRVRIT1NUQllOQU1FX0lEKTsKKwlzY190aW1lcl9jcmVhdGUoVElNRVJfR0VUSE9TVEJZTkFNRV9JRCwgVElNRVJfRkxBR19PTkNFLCBzZWNvbmRfdGltZSoxMDAwLCBnZXRob3N0YnluYW1lX3RpbWVvdXQsICh2b2lkICopbXNnX2lkKTsKK30KKworLyogZ2V0aG9zdGJ5bmFtZbmmxNzW0Mm+s/22qMqxxvcgKi8KK3ZvaWQgZ2V0aG9zdGJ5bmFtZV9kZWxldGV0aW1lcigpCit7CisJc2xvZyhORVRfUFJJTlQsIFNMT0dfREVCVUcsICJnZXRob3N0YnluYW1lX2RlbGV0ZXRpbWVyIGJlZ2luXG4iKTsKKwlzY190aW1lcl9kZWxldGUoVElNRVJfR0VUSE9TVEJZTkFNRV9JRCk7Cit9CisKK3ZvaWQgKmdldGhvc3RieW5hbWVfdGltZXIodm9pZCAqYXJnKQoreworCWludCB0aW1lID0gMDsKKwljaGFyICpuYW1lID0gTlVMTDsKKwlpbnQgbXNnX2lkOworCXN0cnVjdCBob3N0ZW50KiBocHRyID0gTlVMTDsKKwkKKwl0aW1lID0oKHN0cnVjdCBnZXRob3N0YnluYW1lX2luZm8gKilhcmcpLT50aW1lOworCW5hbWUgPSAoKHN0cnVjdCBnZXRob3N0YnluYW1lX2luZm8gKilhcmcpLT5uYW1lOworCW1zZ19pZCA9ICgoc3RydWN0IGdldGhvc3RieW5hbWVfaW5mbyAqKWFyZyktPm1zZ19pZDsKKworCXNsb2coTkVUX1BSSU5ULCBTTE9HX0RFQlVHLCAiZ2V0aG9zdGJ5bmFtZV90aW1lciB0aW1lPSVkLG5hbWU9JXMsbXNnX2lkPSVkXG4iLCB0aW1lLCBuYW1lLCBtc2dfaWQpOworCQorCXNpZ25hbChTSUdRVUlULCBoYW5kbGVfcXVpdCk7CisJCisJZ2V0aG9zdGJ5bmFtZV9jcmVhdHRpbWVyKHRpbWUsIG1zZ19pZCk7IC8vxvC2qMqxxvcKKwkKKwlocHRyID0gZ2V0aG9zdGJ5bmFtZShuYW1lKTsKKwlpZihOVUxMICE9IGhwdHIpIC8vu/HIobW9aG9zdNDFz6IKKwl7CisJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0RFQlVHLCAiZ2V0aG9zdGJ5bmFtZV90aW1lciBnZXQgaW5mb1xuIik7CisJCWdldGhvc3RieW5hbWVfZGVsZXRldGltZXIoKTsgLy/JvrP9tqjKscb3CisJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0RFQlVHLCAiZ2V0aG9zdGJ5bmFtZV90aW1lciByZXN1bHQgaG9zdG5hbWU9JXNcbiIsaHB0ci0+aF9uYW1lKTsKKwkJLy+4+Nb3vfizzLeiz/vPogorCQlpZihpcGNfc2VuZF9tZXNzYWdlKG1zZ19pZCwgbXNnX2lkLCBNU0dfR0VUX0hPU1RfQllfTkFNRV9TVUNDRVNTLCBzaXplb2Yodm9pZCAqKSwgKFVDSEFSICopJmhwdHIsIDApIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdG9kbzogZm9yIGNvdiBNCisgICAgICAgIH0gICAgICAKKwkJcHRocmVhZF9leGl0KE5VTEwpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLy+34tewZ2V0aG9zdGJ5bmFtZbqvyv2jrNT2vNPSu7j2s6zKscqxvOS1xMjrss6jrHRpbWW1pc67zqrD6worLy/I57n7s6y5/bOsyrHKsbzkyNTIu7vxyKGyu7W9aG9zdNDFz6KjrNTyuq/K/be1u9iyu7zM0PjX6Mj7CisvL7aoyrHG90lEz9+zzMTaubLP7aOs0ru49r34s8yyu9KqzazKsbX308O4w73Tv9oKK3N0cnVjdCBob3N0ZW50ICpnZXRob3N0YnluYW1lX3QoY29uc3QgY2hhciAqbmFtZSwgaW50IHRpbWUpCit7CisJc2xvZyhORVRfUFJJTlQsIFNMT0dfREVCVUcsICJnZXRob3N0YnluYW1lX3QgYmVnaW5cbiIpOworCXB0aHJlYWRfdCBwdGhyZWFkOworCWludCBteV9oYW5kbGUgPSAwOworCWludCBtb2R1bGVfaWQgPSBNT0RVTEVfSURfQVBfR0VUSE9TVEJZTkFNRV9CQVNFOworCWludCByZXQgPSAwOworCWludCBtc2dfcmV0ID0gMDsKKwlzdHJ1Y3QgaG9zdGVudCogaG9zdHJlc3VsdGluZm8gPSBOVUxMOworCXN0cnVjdCBnZXRob3N0YnluYW1lX2luZm8gbXlob3N0aW5mbyA9IHswfTsKKwlNU0dfQlVGIHJzcF9tc2cgPSB7MH07CisJTE9ORyBtc2dTaXplID0gIHNpemVvZihNU0dfQlVGKSAtIHNpemVvZihMT05HKTsKKwlpZigwID09IHRpbWUpCisJeworCQlzbG9nKE5FVF9QUklOVCwgU0xPR19ERUJVRywgImdldGhvc3RieW5hbWVfdCB0aW1lID0wXG4iKTsKKwkJcmV0dXJuIGdldGhvc3RieW5hbWUobmFtZSk7CisJfQorCWVsc2UKKwl7CisJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0RFQlVHLCAiZ2V0aG9zdGJ5bmFtZV90IHRpbWUgPSAlZFxuIix0aW1lKTsKKworICAgICAgICAvL7avzKy0tL2owdnKsbXEz/vPorbTwdC53LXACisgICAgICAgIC8vbXNnZ2V0yrnTw7LOyv1JUENfQ1JFQVQgfCBJUENfRVhDTHwgMDYwMKOsxdC2z7Wxx7Btb2R1bGVfaWS1xM/7z6K208HQyse38QorICAgICAgICAvL7Tm1NqjrMjnufuyu7Tm1NqjrNaxvdO0tL2o0MK1xM/7z6K208HQo7vI57n7tObU2qOst7W72Na1zrQtMaOsyLu6821vZHVsZV9pZAorICAgICAgICAvL9a1vNMxo6yyu7bP0a27t9axtb3V0rW9w7vT0Mq508O1xG1vZHVsZV9pZNa1CisJCXdoaWxlKChteV9oYW5kbGUgPSBtc2dnZXQobW9kdWxlX2lkLElQQ19DUkVBVCB8IElQQ19FWENMfCAwNjAwKSkgPT0gLTEpIAorCQl7CisgICAgICAgIAltb2R1bGVfaWQrKzsKKwkJCS8vtbFtb2R1bGVfaWS089PaTU9EVUxFX0lEX0FURFlOQU1JQ19FTkTWtcqxo6zW97avts/R1AorCQkJaWYgKG1vZHVsZV9pZCA+IE1PRFVMRV9JRF9BUF9HRVRIT1NUQllOQU1FX0VORCkgCisJCQl7CisJCQkJc29mdGFwX2Fzc2VydCgiTU9EVUxFX0lEX0FQX0dFVEhPU1RCWU5BTUVfRU5EISEhISEhISEhISFcbiIpOworCQkJfQorCQl9CisJCW15aG9zdGluZm8udGltZSA9IHRpbWU7CisJCXN0cm5jcHkobXlob3N0aW5mby5uYW1lLCBuYW1lLCBzaXplb2YobXlob3N0aW5mby5uYW1lKS0xKTsKKwkJbXlob3N0aW5mby5tc2dfaWQgPSBtb2R1bGVfaWQ7CisJCS8vxvDX08/fs8yjrNTa19PP37PMwO+0tL2otqjKscb3CisJCXJldCA9IHB0aHJlYWRfY3JlYXRlKCZwdGhyZWFkLCBOVUxMLCAodm9pZCAqKWdldGhvc3RieW5hbWVfdGltZXIsICh2b2lkICopJm15aG9zdGluZm8pOworCQlpZiAocmV0IDwgMCB8fCBwdGhyZWFkID09IE5VTEwpIHsKKwkJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0RFQlVHLCAiY3JlYXQgdGhyZWFkIGZhaWxcbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJd2hpbGUoMSkKKwkJeworCQkJbXNnX3JldCA9IDA7CisJCQltZW1zZXQoJnJzcF9tc2csIDB4MDAsIHNpemVvZihNU0dfQlVGKSk7CisJCQltc2dfcmV0ID0gbXNncmN2KG15X2hhbmRsZSwgJnJzcF9tc2csIG1zZ1NpemUsIDAsIDApOworCQkJaWYgKG1zZ19yZXQgPCAwKQorICAgICAgICAJeworICAgICAgICAJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZihyc3BfbXNnLnVzTXNnQ21kID09IE1TR19HRVRfSE9TVF9CWV9OQU1FX1NVQ0NFU1MpCisJCQl7CisJCQkJc2xvZyhORVRfUFJJTlQsIFNMT0dfREVCVUcsICJnZXRob3N0YnluYW1lX3Qgc3VjY2Vzc1xuIik7CisJCQkJaG9zdHJlc3VsdGluZm8gPSAoc3RydWN0IGhvc3RlbnQqKSgqKGludCAqKXJzcF9tc2cuYXVjRGF0YUJ1Zik7CisJCQkJc2xvZyhORVRfUFJJTlQsIFNMT0dfREVCVUcsICJnZXRob3N0YnluYW1lX3QgcmVzdWx0Om5hbWU9JXNcbiIsaG9zdHJlc3VsdGluZm8tPmhfbmFtZSk7CisJCQkJcmV0dXJuIGhvc3RyZXN1bHRpbmZvOworCQkJfQorCQkJZWxzZSBpZihyc3BfbXNnLnVzTXNnQ21kID09IE1TR19HRVRfSE9TVF9CWV9OQU1FX1RJTUVPVVQpCisJCQl7CisJCQkJc2xvZyhORVRfUFJJTlQsIFNMT0dfREVCVUcsICJnZXRob3N0YnluYW1lX3QgZmFpbFxuIik7CisJCQkJcHRocmVhZF9raWxsKHB0aHJlYWQsIFNJR1FVSVQpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgImdldGhvc3RieW5hbWVfdCBmYWlsXG4iKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBETlNfU0VSVkVSX05VTSAyCisKKyNkZWZpbmUgVF9BIDEgLy9JcHY0IGFkZHJlc3MKKyNkZWZpbmUgVF9BQUFBIDI4IC8vSXB2NiBhZGRyZXNzCisjZGVmaW5lIFRfTlMgMiAvL05hbWVzZXJ2ZXIKKyNkZWZpbmUgVF9DTkFNRSA1IC8vIGNhbm9uaWNhbCBuYW1lCisjZGVmaW5lIFRfU09BIDYgLyogc3RhcnQgb2YgYXV0aG9yaXR5IHpvbmUgKi8KKyNkZWZpbmUgVF9QVFIgMTIgLyogZG9tYWluIG5hbWUgcG9pbnRlciAqLworI2RlZmluZSBUX01YIDE1IC8vTWFpbCBzZXJ2ZXIKKworCisKKy8vRE5TIGhlYWRlciBzdHJ1Y3R1cmUKK3N0cnVjdCBETlNfSEVBREVSIHsKKwl1bnNpZ25lZCBzaG9ydCBpZDsgLy8gaWRlbnRpZmljYXRpb24gbnVtYmVyCisKKwl1bnNpZ25lZCBjaGFyIHJkIDoxOyAvLyByZWN1cnNpb24gZGVzaXJlZAorCXVuc2lnbmVkIGNoYXIgdGMgOjE7IC8vIHRydW5jYXRlZCBtZXNzYWdlCisJdW5zaWduZWQgY2hhciBhYSA6MTsgLy8gYXV0aG9yaXRpdmUgYW5zd2VyCisJdW5zaWduZWQgY2hhciBvcGNvZGUgOjQ7IC8vIHB1cnBvc2Ugb2YgbWVzc2FnZQorCXVuc2lnbmVkIGNoYXIgcXIgOjE7IC8vIHF1ZXJ5L3Jlc3BvbnNlIGZsYWcKKworCXVuc2lnbmVkIGNoYXIgcmNvZGUgOjQ7IC8vIHJlc3BvbnNlIGNvZGUKKwl1bnNpZ25lZCBjaGFyIGNkIDoxOyAvLyBjaGVja2luZyBkaXNhYmxlZAorCXVuc2lnbmVkIGNoYXIgYWQgOjE7IC8vIGF1dGhlbnRpY2F0ZWQgZGF0YQorCXVuc2lnbmVkIGNoYXIgeiA6MTsgLy8gaXRzIHohIHJlc2VydmVkCisJdW5zaWduZWQgY2hhciByYSA6MTsgLy8gcmVjdXJzaW9uIGF2YWlsYWJsZQorCisJdW5zaWduZWQgc2hvcnQgcV9jb3VudDsgLy8gbnVtYmVyIG9mIHF1ZXN0aW9uIGVudHJpZXMKKwl1bnNpZ25lZCBzaG9ydCBhbnNfY291bnQ7IC8vIG51bWJlciBvZiBhbnN3ZXIgZW50cmllcworCXVuc2lnbmVkIHNob3J0IGF1dGhfY291bnQ7IC8vIG51bWJlciBvZiBhdXRob3JpdHkgZW50cmllcworCXVuc2lnbmVkIHNob3J0IGFkZF9jb3VudDsgLy8gbnVtYmVyIG9mIHJlc291cmNlIGVudHJpZXMKK307CisKKy8vQ29uc3RhbnQgc2l6ZWQgZmllbGRzIG9mIHF1ZXJ5IHN0cnVjdHVyZQorc3RydWN0IFFVRVNUSU9OIHsKKwl1bnNpZ25lZCBzaG9ydCBxdHlwZTsKKwl1bnNpZ25lZCBzaG9ydCBxY2xhc3M7Cit9OworCisvL0NvbnN0YW50IHNpemVkIGZpZWxkcyBvZiB0aGUgcmVzb3VyY2UgcmVjb3JkIHN0cnVjdHVyZQorI3ByYWdtYSBwYWNrKHB1c2gsIDEpCitzdHJ1Y3QgUl9EQVRBIHsKKwl1bnNpZ25lZCBzaG9ydCB0eXBlOworCXVuc2lnbmVkIHNob3J0IF9jbGFzczsKKwl1bnNpZ25lZCBpbnQgdHRsOworCXVuc2lnbmVkIHNob3J0IGRhdGFfbGVuOworfTsKKyNwcmFnbWEgcGFjayhwb3ApCisKKy8vUG9pbnRlcnMgdG8gcmVzb3VyY2UgcmVjb3JkIGNvbnRlbnRzCitzdHJ1Y3QgUkVTX1JFQ09SRCB7CisJdW5zaWduZWQgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgUl9EQVRBICpyZXNvdXJjZTsKKwl1bnNpZ25lZCBjaGFyICpyZGF0YTsKK307CisKKy8vU3RydWN0dXJlIG9mIGEgUXVlcnkKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyICpuYW1lOworCXN0cnVjdCBRVUVTVElPTiAqcXVlczsKK30gUVVFUlk7CisKKwordm9pZCBDaGFuZ2V0b0Ruc05hbWVGb3JtYXQodW5zaWduZWQgY2hhciogZG5zLCB1bnNpZ25lZCBjaGFyKiBob3N0KSB7CisJaW50IGxvY2sgPSAwLCBpOworCXN0cmNhdCgoY2hhciopIGhvc3QsICIuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3RybGVuKChjaGFyKikgaG9zdCk7IGkrKykgeworCQlpZiAoaG9zdFtpXSA9PSAnLicpIHsKKwkJCSpkbnMrKyA9IGkgLSBsb2NrOworCQkJZm9yICg7IGxvY2sgPCBpOyBsb2NrKyspIHsKKwkJCQkqZG5zKysgPSBob3N0W2xvY2tdOworCQkJfQorCQkJbG9jaysrOyAvL29yIGxvY2s9aSsxOworCQl9CisJfQorCSpkbnMrKyA9ICdcMCc7Cit9CisKK3VfY2hhciogUmVhZE5hbWUodW5zaWduZWQgY2hhciogcmVhZGVyLCB1bnNpZ25lZCBjaGFyKiBidWZmZXIsIGludCogY291bnQpIHsKKwl1bnNpZ25lZCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBwID0gMCwganVtcGVkID0gMCwgb2Zmc2V0OworCWludCBpLCBqOworCisJKmNvdW50ID0gMTsKKwluYW1lID0gKHVuc2lnbmVkIGNoYXIqKSBtYWxsb2MoMjU2KTsKKwlpZiAoIW5hbWUpCisJCXJldHVybiBOVUxMOy8va2xvY3dvcmsKKworCW5hbWVbMF0gPSAnXDAnOworCisJLy9yZWFkIHRoZSBuYW1lcyBpbiAzd3d3Nmdvb2dsZTNjb20gZm9ybWF0CisJd2hpbGUgKCpyZWFkZXIgIT0gMCkgeworCQlpZiAoKnJlYWRlciA+PSAxOTIpIHsKKwkJCW9mZnNldCA9ICgqcmVhZGVyKSAqIDI1NiArICoocmVhZGVyICsgMSkgLSA0OTE1MjsgLy80OTE1MiA9IDExMDAwMDAwIDAwMDAwMDAwIDspCisJCQlyZWFkZXIgPSBidWZmZXIgKyBvZmZzZXQgLSAxOworCQkJanVtcGVkID0gMTsgLy93ZSBoYXZlIGp1bXBlZCB0byBhbm90aGVyIGxvY2F0aW9uIHNvIGNvdW50aW5nIHdvbnQgZ28gdXAhCisJCX0gZWxzZSB7CisJCQluYW1lW3ArK10gPSAqcmVhZGVyOworCQl9CisKKwkJcmVhZGVyID0gcmVhZGVyICsgMTsKKworCQlpZiAoanVtcGVkID09IDApIHsKKwkJCSpjb3VudCA9ICpjb3VudCArIDE7IC8vaWYgd2UgaGF2ZW50IGp1bXBlZCB0byBhbm90aGVyIGxvY2F0aW9uIHRoZW4gd2UgY2FuIGNvdW50IHVwCisJCX0KKwl9CisKKwluYW1lW3BdID0gJ1wwJzsgLy9zdHJpbmcgY29tcGxldGUKKwlpZiAoanVtcGVkID09IDEpIHsKKwkJKmNvdW50ID0gKmNvdW50ICsgMTsgLy9udW1iZXIgb2Ygc3RlcHMgd2UgYWN0dWFsbHkgbW92ZWQgZm9yd2FyZCBpbiB0aGUgcGFja2V0CisJfQorCisJLy9ub3cgY29udmVydCAzd3d3Nmdvb2dsZTNjb20wIHRvIHd3dy5nb29nbGUuY29tCisJZm9yIChpID0gMDsgaSA8IChpbnQpIHN0cmxlbigoY29uc3QgY2hhciopIG5hbWUpOyBpKyspIHsKKwkJcCA9IG5hbWVbaV07CisJCWZvciAoaiA9IDA7IGogPCAoaW50KSBwOyBqKyspIHsKKwkJCW5hbWVbaV0gPSBuYW1lW2kgKyAxXTsKKwkJCWkgPSBpICsgMTsKKwkJfQorCQluYW1lW2ldID0gJy4nOworCX0KKwluYW1lW2kgLSAxXSA9ICdcMCc7IC8vcmVtb3ZlIHRoZSBsYXN0IGRvdAorCXJldHVybiBuYW1lOworfQorCit1bnNpZ25lZCBsb25nIG15X2dldGhvc3RieW5hbWUodW5zaWduZWQgY2hhciAqaG9zdCwgY2hhciAqZGV2X25hbWUsY2hhciogZG5zX3NlcnZlciwgaW50IHF1ZXJ5X3R5cGUpIHsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxMDI1XSwgKnFuYW1lLCAqcmVhZGVyOworCWludCBpLCBqLCBzdG9wLCBzLCBhbnNfbWF4OworCXN0cnVjdCB0aW1ldmFsIHR2OworCXVuc2lnbmVkIGxvbmcgcmV0ID0gMDsKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCQorCXN0cnVjdCBzb2NrYWRkcl9pbiBhOworCisJc3RydWN0IFJFU19SRUNPUkQgYW5zd2Vyc1syMF07IC8vdGhlIHJlcGxpZXMgZnJvbSB0aGUgRE5TIHNlcnZlcgorCXN0cnVjdCBzb2NrYWRkcl9pbiBkZXN0OworCisJc3RydWN0IEROU19IRUFERVIgKmRucyA9IE5VTEw7CisJc3RydWN0IFFVRVNUSU9OICpxaW5mbyA9IE5VTEw7CisKKwlwcmludGYoIlJlc29sdmluZyAlcyIsIGhvc3QpOworCisJcyA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7IC8vVURQIHBhY2tldCBmb3IgRE5TIHF1ZXJpZXMKKwlpZihzIDwgMCkKKyAgICB7CisgICAgICAgIHByaW50Zigic29ja2V0IHJldHVybiBmYWlsIFxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfSAgIAorCQorCW1lbXNldCgmaWZyLDAsc2l6ZW9mKGlmcikpOyAgICAKKwlzdHJuY3B5KGlmci5pZnJfbmFtZSwgZGV2X25hbWUsIHNpemVvZihpZnIuaWZyX25hbWUpLTEpOworCWlmKHNldHNvY2tvcHQocyxTT0xfU09DS0VULFNPX0JJTkRUT0RFVklDRSwoY2hhciopJmlmcixzaXplb2YoaWZyKSkgPCAwKXsKKwkJcHJpbnRmKCJTT19CSU5EVE9ERVZJQ0UgZmFpbCBcbiIpOworCQlnb3RvIG91dDsKKwl9CisJdHYudHZfc2VjID0gNTsKKwl0di50dl91c2VjID0gMDsKKwlpZiAoc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgJnR2LCBzaXplb2YodHYpKSA8IDApIHsKKwkJcHJpbnRmKCJzb2NrZXQgb3B0aW9uICBTT19SQ1ZUSU1FTyBub3Qgc3VwcG9ydFxuIik7CisJCWdvdG8gb3V0OworCX0KKwlkZXN0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWRlc3Quc2luX3BvcnQgPSBodG9ucyg1Myk7CisJZGVzdC5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoZG5zX3NlcnZlcik7IC8vZG5zIHNlcnZlcnMKKworCS8vU2V0IHRoZSBETlMgc3RydWN0dXJlIHRvIHN0YW5kYXJkIHF1ZXJpZXMKKwlkbnMgPSAoc3RydWN0IEROU19IRUFERVIgKikgJmJ1ZjsKKworCWRucy0+aWQgPSAodW5zaWduZWQgc2hvcnQpIGh0b25zKGdldHBpZCgpKTsKKwlkbnMtPnFyID0gMDsgLy9UaGlzIGlzIGEgcXVlcnkKKwlkbnMtPm9wY29kZSA9IDA7IC8vVGhpcyBpcyBhIHN0YW5kYXJkIHF1ZXJ5CisJZG5zLT5hYSA9IDA7IC8vTm90IEF1dGhvcml0YXRpdmUKKwlkbnMtPnRjID0gMDsgLy9UaGlzIG1lc3NhZ2UgaXMgbm90IHRydW5jYXRlZAorCWRucy0+cmQgPSAxOyAvL1JlY3Vyc2lvbiBEZXNpcmVkCisJZG5zLT5yYSA9IDA7IC8vUmVjdXJzaW9uIG5vdCBhdmFpbGFibGUhIGhleSB3ZSBkb250IGhhdmUgaXQgKGxvbCkKKwlkbnMtPnogPSAwOworCWRucy0+YWQgPSAwOworCWRucy0+Y2QgPSAwOworCWRucy0+cmNvZGUgPSAwOworCWRucy0+cV9jb3VudCA9IGh0b25zKDEpOyAvL3dlIGhhdmUgb25seSAxIHF1ZXN0aW9uCisJZG5zLT5hbnNfY291bnQgPSAwOworCWRucy0+YXV0aF9jb3VudCA9IDA7CisJZG5zLT5hZGRfY291bnQgPSAwOworCisJLy9wb2ludCB0byB0aGUgcXVlcnkgcG9ydGlvbgorCXFuYW1lID0gKHVuc2lnbmVkIGNoYXIqKSAmYnVmW3NpemVvZihzdHJ1Y3QgRE5TX0hFQURFUildOworCisJQ2hhbmdldG9EbnNOYW1lRm9ybWF0KHFuYW1lLCBob3N0KTsKKwlxaW5mbyA9IChzdHJ1Y3QgUVVFU1RJT04qKSAmYnVmW3NpemVvZihzdHJ1Y3QgRE5TX0hFQURFUikKKwkJCSsgKHN0cmxlbigoY29uc3QgY2hhciopIHFuYW1lKSArIDEpXTsgLy9maWxsIGl0CisKKwlxaW5mby0+cXR5cGUgPSBodG9ucyhxdWVyeV90eXBlKTsgLy90eXBlIG9mIHRoZSBxdWVyeSAsIEEgLCBNWCAsIENOQU1FICwgTlMgZXRjCisJcWluZm8tPnFjbGFzcyA9IGh0b25zKDEpOyAvL2l0cyBpbnRlcm5ldCAobG9sKQorCisJcHJpbnRmKCJcblNlbmRpbmcgUGFja2V0IHRvICVzLi4uIiwgZG5zX3NlcnZlcik7CisJaWYgKHNlbmR0byhzLCAoY2hhciopIGJ1ZiwKKwkJCXNpemVvZihzdHJ1Y3QgRE5TX0hFQURFUikgKyAoc3RybGVuKChjb25zdCBjaGFyKikgcW5hbWUpICsgMSkKKwkJCQkJKyBzaXplb2Yoc3RydWN0IFFVRVNUSU9OKSwgMCwgKHN0cnVjdCBzb2NrYWRkciopICZkZXN0LAorCQkJc2l6ZW9mKGRlc3QpKSA8IDApIHsKKwkJcGVycm9yKCJzZW5kdG8gZmFpbGVkIik7CisJfQorCXByaW50ZigiRG9uZSIpOworCisJLy9SZWNlaXZlIHRoZSBhbnN3ZXIKKwlpID0gc2l6ZW9mIGRlc3Q7CisJcHJpbnRmKCJcblJlY2VpdmluZyBhbnN3ZXIuLi4iKTsKKwlpZiAocmVjdmZyb20ocywgKGNoYXIqKSBidWYsIHNpemVvZihidWYpLTEsIDAsIChzdHJ1Y3Qgc29ja2FkZHIqKSAmZGVzdCwKKwkJCShzb2NrbGVuX3QqKSAmaSkgPCAwKSB7CisJCXBlcnJvcigicmVjdmZyb20gZmFpbGVkIik7CisJfQorCSooYnVmK3NpemVvZihidWYpLTEpID0gMDsKKwlwcmludGYoIkRvbmUiKTsKKworCWRucyA9IChzdHJ1Y3QgRE5TX0hFQURFUiopIGJ1ZjsKKwlpZigoc2l6ZW9mKHN0cnVjdCBETlNfSEVBREVSKSArIAorCQkoc3RybGVuKChjb25zdCBjaGFyKikgcW5hbWUpICsgMSkrIAorCQlzaXplb2Yoc3RydWN0IFFVRVNUSU9OKSkgPj0gc2l6ZW9mKGJ1ZikpCisJeworCQlwZXJyb3IoIm15X2dldGhvc3RieW5hbWUgZXJyb3IiKTsKKwkJZ290byBvdXQ7CisJfQorCQorCS8vbW92ZSBhaGVhZCBvZiB0aGUgZG5zIGhlYWRlciBhbmQgdGhlIHF1ZXJ5IGZpZWxkCisJcmVhZGVyID0gJmJ1ZltzaXplb2Yoc3RydWN0IEROU19IRUFERVIpICsgKHN0cmxlbigoY29uc3QgY2hhciopIHFuYW1lKSArIDEpCisJCQkrIHNpemVvZihzdHJ1Y3QgUVVFU1RJT04pXTsKKworCS8vcHJpbnRmKCJcblRoZSByZXNwb25zZSBjb250YWlucyA6ICIpOworCS8vcHJpbnRmKCJcbiAlZCBRdWVzdGlvbnMuIiwgbnRvaHMoZG5zLT5xX2NvdW50KSk7CisJLy9wcmludGYoIlxuICVkIEFuc3dlcnMuIiwgbnRvaHMoZG5zLT5hbnNfY291bnQpKTsKKwkvL3ByaW50ZigiXG4gJWQgQXV0aG9yaXRhdGl2ZSBTZXJ2ZXJzLiIsIG50b2hzKGRucy0+YXV0aF9jb3VudCkpOworCS8vcHJpbnRmKCJcbiAlZCBBZGRpdGlvbmFsIHJlY29yZHMuXG5cbiIsIG50b2hzKGRucy0+YWRkX2NvdW50KSk7CisKKwkvL1N0YXJ0IHJlYWRpbmcgYW5zd2VycworCXN0b3AgPSAwOworCS8va2xvY3dvcmsKKwkvL2Fuc19tYXggPSAoKG50b2hzKGRucy0+YW5zX2NvdW50KSA8PSAoc2l6ZW9mKGFuc3dlcnMpL3NpemVvZihhbnN3ZXJzWzBdKSkpID8gbnRvaHMoZG5zLT5hbnNfY291bnQpIDogKHNpemVvZihhbnN3ZXJzKS9zaXplb2YoYW5zd2Vyc1swXSkpKTsKKwlhbnNfbWF4ID0gbnRvaHMoZG5zLT5hbnNfY291bnQpOworCWlmIChhbnNfbWF4ID4gKHNpemVvZihhbnN3ZXJzKS9zaXplb2YoYW5zd2Vyc1swXSkpKQorCQlhbnNfbWF4ID0gKHNpemVvZihhbnN3ZXJzKS9zaXplb2YoYW5zd2Vyc1swXSkpOworCWZvciAoaSA9IDA7IGkgPCBhbnNfbWF4OyBpKyspIAorCXsKKwkJYW5zd2Vyc1tpXS5uYW1lID0gUmVhZE5hbWUocmVhZGVyLCBidWYsICZzdG9wKTsKKwkJcmVhZGVyID0gcmVhZGVyICsgc3RvcDsKKworCQlhbnN3ZXJzW2ldLnJlc291cmNlID0gKHN0cnVjdCBSX0RBVEEqKSAocmVhZGVyKTsKKwkJcmVhZGVyID0gcmVhZGVyICsgc2l6ZW9mKHN0cnVjdCBSX0RBVEEpOworCisJCWlmIChudG9ocyhhbnN3ZXJzW2ldLnJlc291cmNlLT50eXBlKSA9PSBUX0EpIC8vaWYgaXRzIGFuIGlwdjQgYWRkcmVzcworCQkJCXsKKwkJCWFuc3dlcnNbaV0ucmRhdGEgPSAodW5zaWduZWQgY2hhciopIG1hbGxvYygKKwkJCQkJbnRvaHMoYW5zd2Vyc1tpXS5yZXNvdXJjZS0+ZGF0YV9sZW4pKTsKKworCQkJZm9yIChqID0gMDsgaiA8IG50b2hzKGFuc3dlcnNbaV0ucmVzb3VyY2UtPmRhdGFfbGVuKTsgaisrKSB7CisJCQkJYW5zd2Vyc1tpXS5yZGF0YVtqXSA9IHJlYWRlcltqXTsKKwkJCX0KKworCQkJYW5zd2Vyc1tpXS5yZGF0YVtudG9ocyhhbnN3ZXJzW2ldLnJlc291cmNlLT5kYXRhX2xlbildID0gJ1wwJzsKKworCQkJcmVhZGVyID0gcmVhZGVyICsgbnRvaHMoYW5zd2Vyc1tpXS5yZXNvdXJjZS0+ZGF0YV9sZW4pOworCQl9IGVsc2UgeworCQkJYW5zd2Vyc1tpXS5yZGF0YSA9IFJlYWROYW1lKHJlYWRlciwgYnVmLCAmc3RvcCk7CisJCQlyZWFkZXIgPSByZWFkZXIgKyBzdG9wOworCQl9CisJfQorCisJLy9wcmludCBhbnN3ZXJzCisJcHJpbnRmKCJcbkFuc3dlciBSZWNvcmRzIDogJWQgXG4iLCBudG9ocyhkbnMtPmFuc19jb3VudCkpOworCWZvciAoaSA9IDA7IGkgPCBhbnNfbWF4OyBpKyspIHsKKwkJcHJpbnRmKCJOYW1lIDogJXMgIiwgYW5zd2Vyc1tpXS5uYW1lKTsKKworCQlpZiAobnRvaHMoYW5zd2Vyc1tpXS5yZXNvdXJjZS0+dHlwZSkgPT0gVF9BKSAvL0lQdjQgYWRkcmVzcworCQl7CisJCQlsb25nICpwOworCQkJcCA9IChsb25nKikgYW5zd2Vyc1tpXS5yZGF0YTsKKwkJCWEuc2luX2FkZHIuc19hZGRyID0gKCpwKTsgLy93b3JraW5nIHdpdGhvdXQgbnRvaGwKKyNpZiAxICAgICAgIC8vIGNvdiBNCisJCQljaGFyICogc19hZGRyID0gaW5ldF9udG9hKGEuc2luX2FkZHIpOworCQkJcHJpbnRmKCJoYXMgSVB2NCBhZGRyZXNzIDogJXMiLCBzX2FkZHIpOworI2Vsc2UKKyAgICAgICAgICAgIHByaW50ZigiaGFzIElQdjQgYWRkcmVzcyA6ICVzIiwgaW5ldF9udG9hKGEuc2luX2FkZHIpKTsKKyNlbmRpZgorCQkJcmV0ID0gKHVuc2lnbmVkIGxvbmcpYS5zaW5fYWRkci5zX2FkZHI7CisJCX0KKworCQlpZiAobnRvaHMoYW5zd2Vyc1tpXS5yZXNvdXJjZS0+dHlwZSkgPT0gNSkgeworCQkJLy9DYW5vbmljYWwgbmFtZSBmb3IgYW4gYWxpYXMKKwkJCXByaW50ZigiaGFzIGFsaWFzIG5hbWUgOiAlcyIsIGFuc3dlcnNbaV0ucmRhdGEpOworCQl9CisJCXByaW50ZigiXG4iKTsKKwkJZnJlZShhbnN3ZXJzW2ldLm5hbWUpOworCQlmcmVlKGFuc3dlcnNbaV0ucmRhdGEpOworCX0KK291dDoKKwljbG9zZShzKTsKKwlyZXR1cm4gcmV0OworfQorCit1bnNpZ25lZCBsb25nIGdldGhvc3RieW5hbWVfbChjaGFyICpob3N0bmFtZSxjaGFyKiBkZXZfbmFtZSkgCit7CisJaW50IGkgPSAwOworCXVuc2lnbmVkIGxvbmcgcmV0ID0gMDsKKwljaGFyIGRuc19zZXJ2ZXJzW0ROU19TRVJWRVJfTlVNXVszMl0gPSB7MH07CisKKwkvL0dldCB0aGUgRE5TIHNlcnZlcnMgZnJvbSB0aGUgcmVzb2x2LmNvbmYgZmlsZQorCWNoYXIgbnZfZG5zWzMyXQk9IHswfTsKKwljaGFyIGlwX2Ruc1szMl0JPSB7MH07CisJCisgICAgc25wcmludGYobnZfZG5zLCBzaXplb2YobnZfZG5zKSwgIiVzX3ByaWRucyIsIGRldl9uYW1lKTsKKwlzY19jZmdfZ2V0KG52X2RucywgaXBfZG5zLCBzaXplb2YoaXBfZG5zKSk7CisJc3RyY3B5KGRuc19zZXJ2ZXJzWzBdLCBpcF9kbnMpOworCisJbWVtc2V0KG52X2RucywwLHNpemVvZihudl9kbnMpKTsKKwltZW1zZXQoaXBfZG5zLDAsc2l6ZW9mKGlwX2RucykpOworCXNucHJpbnRmKG52X2Rucywgc2l6ZW9mKG52X2RucyksICIlc19zZWNkbnMiLCBkZXZfbmFtZSk7CisJc2NfY2ZnX2dldChudl9kbnMsIGlwX2Rucywgc2l6ZW9mKGlwX2RucykpOworCXN0cmNweShkbnNfc2VydmVyc1sxXSwgaXBfZG5zKTsKKworCQorCS8vTm93IGdldCB0aGUgaXAgb2YgdGhpcyBob3N0bmFtZSAsIEEgcmVjb3JkCisJZm9yKGk9MDtpPEROU19TRVJWRVJfTlVNO2krKykKKwl7CisJCXJldCA9IG15X2dldGhvc3RieW5hbWUoaG9zdG5hbWUsIGRldl9uYW1lICwgZG5zX3NlcnZlcnNbaV0sIFRfQSk7CisJCWlmKHJldCA+IDApCisJCQlicmVhazsKKwl9CisgCisJcmV0dXJuIHJldDsKK30KKworaW50IG15X2dldGhvc3RieW5hbWU2KHVuc2lnbmVkIGNoYXIgKmhvc3QsIGNoYXIgKmRldl9uYW1lLCBjaGFyKiBkbnNfc2VydmVyLCBpbnQgcXVlcnlfdHlwZSwgc3RydWN0IGluNl9hZGRyKiBpcDYpCit7CisJdW5zaWduZWQgY2hhciBidWZbMTAyNV0sICpxbmFtZSwgKnJlYWRlcjsKKwlpbnQgaSwgaiwgc3RvcCwgcywgYW5zX21heCwgcmV0ID0gMDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlzdHJ1Y3QgaWZyZXEgaWZyID0gezB9OworCXN0cnVjdCBSRVNfUkVDT1JEIGFuc3dlcnNbMjBdOyAvL3RoZSByZXBsaWVzIGZyb20gdGhlIEROUyBzZXJ2ZXIKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IGRlc3QgPSB7MH07CisJc3RydWN0IGluNl9hZGRyIGEgPSB7MH07CisJc3RydWN0IEROU19IRUFERVIgKmRucyA9IE5VTEw7CisJc3RydWN0IFFVRVNUSU9OICpxaW5mbyA9IE5VTEw7CisJY2hhciBudl9jbWRbNjRdID0gezB9OworCWNoYXIgaXBfc3JjWzY0XSA9IHswfTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNyYyA9IHswfTsKKworCXByaW50ZigiUmVzb2x2aW5nICVzIiwgaG9zdCk7CisKKwlzID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7IC8vVURQIHBhY2tldCBmb3IgRE5TIHF1ZXJpZXMKKwlpZihzIDwgMCkKKyAgICB7CisgICAgICAgIHByaW50Zigic29ja2V0IHJldHVybiBmYWlsIFxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfSAgIAorCQorCW1lbXNldCgmaWZyLDAsc2l6ZW9mKGlmcikpOyAgICAKKwlzdHJuY3B5KGlmci5pZnJfbmFtZSwgZGV2X25hbWUsIHNpemVvZihpZnIuaWZyX25hbWUpLTEpOworCWlmKHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fQklORFRPREVWSUNFLCAoY2hhciopJmlmciwgc2l6ZW9mKGlmcikpIDwgMCl7CisJCXByaW50ZigiU09fQklORFRPREVWSUNFIGZhaWwgXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCXR2LnR2X3NlYyA9IDU7CisJdHYudHZfdXNlYyA9IDA7CisJaWYgKHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fUkNWVElNRU8sICZ0diwgc2l6ZW9mKHR2KSkgPCAwKSB7CisJCXByaW50Zigic29ja2V0IG9wdGlvbiAgU09fUkNWVElNRU8gbm90IHN1cHBvcnRcbiIpOworCQlnb3RvIG91dDsKKwl9CisJc25wcmludGYobnZfY21kLCBzaXplb2YobnZfY21kKSwgIiVzX2lwdjZfaXAiLCBkZXZfbmFtZSk7CisJc2NfY2ZnX2dldChudl9jbWQsIGlwX3NyYywgc2l6ZW9mKGlwX3NyYykpOworCXNyYy5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCWlmKGluZXRfcHRvbihBRl9JTkVUNiwgaXBfc3JjLCAmc3JjLnNpbjZfYWRkcikgPD0gMCl7CisJCXByaW50ZigiaW5ldF9wdG9uIGZhaWwxIFxuIik7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoYmluZChzLCAoc3RydWN0IHNvY2thZGRyKikmc3JjLCBzaXplb2Yoc3JjKSkgPCAwKSB7CisJCXByaW50ZigiYmluZCBmYWlsIFxuIik7CisJCWdvdG8gb3V0OworCX0KKwlkZXN0LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJZGVzdC5zaW42X3BvcnQgPSBodG9ucyg1Myk7CisJaWYoaW5ldF9wdG9uKEFGX0lORVQ2LCBkbnNfc2VydmVyLCAmZGVzdC5zaW42X2FkZHIpIDw9IDApeworCQlwcmludGYoImluZXRfcHRvbiBmYWlsMiBcbiIpOworCQlnb3RvIG91dDsKKwl9CisJLy9TZXQgdGhlIEROUyBzdHJ1Y3R1cmUgdG8gc3RhbmRhcmQgcXVlcmllcworCWRucyA9IChzdHJ1Y3QgRE5TX0hFQURFUiAqKSAmYnVmOworCisJZG5zLT5pZCA9ICh1bnNpZ25lZCBzaG9ydCkgaHRvbnMoZ2V0cGlkKCkpOworCWRucy0+cXIgPSAwOyAvL1RoaXMgaXMgYSBxdWVyeQorCWRucy0+b3Bjb2RlID0gMDsgLy9UaGlzIGlzIGEgc3RhbmRhcmQgcXVlcnkKKwlkbnMtPmFhID0gMDsgLy9Ob3QgQXV0aG9yaXRhdGl2ZQorCWRucy0+dGMgPSAwOyAvL1RoaXMgbWVzc2FnZSBpcyBub3QgdHJ1bmNhdGVkCisJZG5zLT5yZCA9IDE7IC8vUmVjdXJzaW9uIERlc2lyZWQKKwlkbnMtPnJhID0gMDsgLy9SZWN1cnNpb24gbm90IGF2YWlsYWJsZSEgaGV5IHdlIGRvbnQgaGF2ZSBpdCAobG9sKQorCWRucy0+eiA9IDA7CisJZG5zLT5hZCA9IDA7CisJZG5zLT5jZCA9IDA7CisJZG5zLT5yY29kZSA9IDA7CisJZG5zLT5xX2NvdW50ID0gaHRvbnMoMSk7IC8vd2UgaGF2ZSBvbmx5IDEgcXVlc3Rpb24KKwlkbnMtPmFuc19jb3VudCA9IDA7CisJZG5zLT5hdXRoX2NvdW50ID0gMDsKKwlkbnMtPmFkZF9jb3VudCA9IDA7CisKKwkvL3BvaW50IHRvIHRoZSBxdWVyeSBwb3J0aW9uCisJcW5hbWUgPSAodW5zaWduZWQgY2hhciopICZidWZbc2l6ZW9mKHN0cnVjdCBETlNfSEVBREVSKV07CisKKwlDaGFuZ2V0b0Ruc05hbWVGb3JtYXQocW5hbWUsIGhvc3QpOworCXFpbmZvID0gKHN0cnVjdCBRVUVTVElPTiopICZidWZbc2l6ZW9mKHN0cnVjdCBETlNfSEVBREVSKQorCQkJKyAoc3RybGVuKChjb25zdCBjaGFyKikgcW5hbWUpICsgMSldOyAvL2ZpbGwgaXQKKworCXFpbmZvLT5xdHlwZSA9IGh0b25zKHF1ZXJ5X3R5cGUpOyAvL3R5cGUgb2YgdGhlIHF1ZXJ5ICwgQSAsIE1YICwgQ05BTUUgLCBOUyBldGMKKwlxaW5mby0+cWNsYXNzID0gaHRvbnMoMSk7IC8vaXRzIGludGVybmV0IChsb2wpCisKKwlwcmludGYoIlxuU2VuZGluZyBQYWNrZXQgdG8gJXMuLi4iLCBkbnNfc2VydmVyKTsKKwlpZiAoc2VuZHRvKHMsIChjaGFyKikgYnVmLAorCQkJc2l6ZW9mKHN0cnVjdCBETlNfSEVBREVSKSArIChzdHJsZW4oKGNvbnN0IGNoYXIqKSBxbmFtZSkgKyAxKQorCQkJCQkrIHNpemVvZihzdHJ1Y3QgUVVFU1RJT04pLCAwLCAoc3RydWN0IHNvY2thZGRyKikgJmRlc3QsCisJCQlzaXplb2YoZGVzdCkpIDwgMCkgeworCQlwZXJyb3IoInNlbmR0byBmYWlsZWQiKTsKKwl9CisJcHJpbnRmKCJEb25lIik7CisKKwkvL1JlY2VpdmUgdGhlIGFuc3dlcgorCWkgPSBzaXplb2YgZGVzdDsKKwlwcmludGYoIlxuUmVjZWl2aW5nIGFuc3dlci4uLiIpOworCWlmIChyZWN2ZnJvbShzLCAoY2hhciopIGJ1Ziwgc2l6ZW9mKGJ1ZiktMSwgMCwgKHN0cnVjdCBzb2NrYWRkciopICZkZXN0LAorCQkJKHNvY2tsZW5fdCopICZpKSA8IDApIHsKKwkJcGVycm9yKCJyZWN2ZnJvbSBmYWlsZWQiKTsKKwl9CisJKihidWYrc2l6ZW9mKGJ1ZiktMSkgPSAwOworCXByaW50ZigiRG9uZSIpOworCisJZG5zID0gKHN0cnVjdCBETlNfSEVBREVSKikgYnVmOworCWlmKChzaXplb2Yoc3RydWN0IEROU19IRUFERVIpICsgCisJCShzdHJsZW4oKGNvbnN0IGNoYXIqKSBxbmFtZSkgKyAxKSsgCisJCXNpemVvZihzdHJ1Y3QgUVVFU1RJT04pKSA+PSBzaXplb2YoYnVmKSkKKwl7CisJCXBlcnJvcigibXlfZ2V0aG9zdGJ5bmFtZSBlcnJvciIpOworCQlnb3RvIG91dDsKKwl9CisJCisJLy9tb3ZlIGFoZWFkIG9mIHRoZSBkbnMgaGVhZGVyIGFuZCB0aGUgcXVlcnkgZmllbGQKKwlyZWFkZXIgPSAmYnVmW3NpemVvZihzdHJ1Y3QgRE5TX0hFQURFUikgKyAoc3RybGVuKChjb25zdCBjaGFyKikgcW5hbWUpICsgMSkKKwkJCSsgc2l6ZW9mKHN0cnVjdCBRVUVTVElPTildOworCisJLy9wcmludGYoIlxuVGhlIHJlc3BvbnNlIGNvbnRhaW5zIDogIik7CisJLy9wcmludGYoIlxuICVkIFF1ZXN0aW9ucy4iLCBudG9ocyhkbnMtPnFfY291bnQpKTsKKwkvL3ByaW50ZigiXG4gJWQgQW5zd2Vycy4iLCBudG9ocyhkbnMtPmFuc19jb3VudCkpOworCS8vcHJpbnRmKCJcbiAlZCBBdXRob3JpdGF0aXZlIFNlcnZlcnMuIiwgbnRvaHMoZG5zLT5hdXRoX2NvdW50KSk7CisJLy9wcmludGYoIlxuICVkIEFkZGl0aW9uYWwgcmVjb3Jkcy5cblxuIiwgbnRvaHMoZG5zLT5hZGRfY291bnQpKTsKKworCS8vU3RhcnQgcmVhZGluZyBhbnN3ZXJzCisJc3RvcCA9IDA7CisJYW5zX21heCA9IG50b2hzKGRucy0+YW5zX2NvdW50KTsKKwlpZiAoYW5zX21heCA+IChzaXplb2YoYW5zd2Vycykvc2l6ZW9mKGFuc3dlcnNbMF0pKSkKKwkJYW5zX21heCA9IChzaXplb2YoYW5zd2Vycykvc2l6ZW9mKGFuc3dlcnNbMF0pKTsKKwlmb3IgKGkgPSAwOyBpIDwgYW5zX21heDsgaSsrKSAKKwl7CisJCWFuc3dlcnNbaV0ubmFtZSA9IFJlYWROYW1lKHJlYWRlciwgYnVmLCAmc3RvcCk7CisJCXJlYWRlciA9IHJlYWRlciArIHN0b3A7CisKKwkJYW5zd2Vyc1tpXS5yZXNvdXJjZSA9IChzdHJ1Y3QgUl9EQVRBKikgKHJlYWRlcik7CisJCXJlYWRlciA9IHJlYWRlciArIHNpemVvZihzdHJ1Y3QgUl9EQVRBKTsKKworCQlpZiAobnRvaHMoYW5zd2Vyc1tpXS5yZXNvdXJjZS0+dHlwZSkgPT0gVF9BQUFBKSAvL2lmIGl0cyBhbiBpcHY2IGFkZHJlc3MKKwkJCQl7CisJCQlhbnN3ZXJzW2ldLnJkYXRhID0gKHVuc2lnbmVkIGNoYXIqKSBtYWxsb2MoCisJCQkJCW50b2hzKGFuc3dlcnNbaV0ucmVzb3VyY2UtPmRhdGFfbGVuKSk7CisKKwkJCWZvciAoaiA9IDA7IGogPCBudG9ocyhhbnN3ZXJzW2ldLnJlc291cmNlLT5kYXRhX2xlbik7IGorKykgeworCQkJCWFuc3dlcnNbaV0ucmRhdGFbal0gPSByZWFkZXJbal07CisJCQl9CisKKwkJCWFuc3dlcnNbaV0ucmRhdGFbbnRvaHMoYW5zd2Vyc1tpXS5yZXNvdXJjZS0+ZGF0YV9sZW4pXSA9ICdcMCc7CisKKwkJCXJlYWRlciA9IHJlYWRlciArIG50b2hzKGFuc3dlcnNbaV0ucmVzb3VyY2UtPmRhdGFfbGVuKTsKKwkJfSBlbHNlIHsKKwkJCWFuc3dlcnNbaV0ucmRhdGEgPSBSZWFkTmFtZShyZWFkZXIsIGJ1ZiwgJnN0b3ApOworCQkJcmVhZGVyID0gcmVhZGVyICsgc3RvcDsKKwkJfQorCX0KKworCS8vcHJpbnQgYW5zd2VycworCXByaW50ZigiXG5BbnN3ZXIgUmVjb3JkcyA6ICVkIFxuIiwgbnRvaHMoZG5zLT5hbnNfY291bnQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgYW5zX21heDsgaSsrKSB7CisJCXByaW50ZigiTmFtZSA6ICVzICIsIGFuc3dlcnNbaV0ubmFtZSk7CisKKwkJaWYgKG50b2hzKGFuc3dlcnNbaV0ucmVzb3VyY2UtPnR5cGUpID09IFRfQUFBQSkgLy9JUHY2IGFkZHJlc3MKKwkJeworCQkJY2hhciBpcDZfYWRkcltJUFY2QURETEVOX01BWF0gPSB7MH07CisJCQltZW1jcHkoJmEsIGFuc3dlcnNbaV0ucmRhdGEsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJCWlmKGluZXRfbnRvcChBRl9JTkVUNiwgJmEsIGlwNl9hZGRyLCBzaXplb2YoaXA2X2FkZHIpKSl7CisJCQkJaWYoaXA2KQorCQkJCQltZW1jcHkoaXA2LCAmYSwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQkJCXByaW50ZigiJXAgaGFzIElQdjYgYWRkcmVzcyA6ICVzIiwgaXA2LCBpcDZfYWRkcik7CisJCQkJcmV0ID0gMTsKKwkJCX1lbHNlCisJCQkJcHJpbnRmKCJub2hhcyBJUHY2IGFkZHJlc3MgbGVuOiVkIiwgYW5zd2Vyc1tpXS5yZXNvdXJjZS0+ZGF0YV9sZW4pOworCQl9CisKKwkJaWYgKG50b2hzKGFuc3dlcnNbaV0ucmVzb3VyY2UtPnR5cGUpID09IDUpIHsKKwkJCS8vQ2Fub25pY2FsIG5hbWUgZm9yIGFuIGFsaWFzCisJCQlwcmludGYoImhhcyBhbGlhcyBuYW1lIDogJXMiLCBhbnN3ZXJzW2ldLnJkYXRhKTsKKwkJfQorCQlwcmludGYoIlxuIik7CisJCWZyZWUoYW5zd2Vyc1tpXS5uYW1lKTsKKwkJZnJlZShhbnN3ZXJzW2ldLnJkYXRhKTsKKwl9CitvdXQ6CisJY2xvc2Uocyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGdldGhvc3RieW5hbWU2X2woY2hhciAqaG9zdG5hbWUsY2hhciogZGV2X25hbWUsIHN0cnVjdCBpbjZfYWRkciogaXA2KSAKK3sKKwlpbnQgaSA9IDA7CisJdW5zaWduZWQgbG9uZyByZXQgPSAwOworCWNoYXIgZG5zX3NlcnZlcnNbRE5TX1NFUlZFUl9OVU1dWzY0XSA9IHswfTsKKworCS8vR2V0IHRoZSBETlMgc2VydmVycyBmcm9tIHRoZSByZXNvbHYuY29uZiBmaWxlCisJY2hhciBudl9kbnNbNjRdCT0gezB9OworCWNoYXIgaXBfZG5zWzY0XQk9IHswfTsKKwkKKyAgICBzcHJpbnRmKG52X2RucywgIiVzX2lwdjZfcHJpZG5zX2F1dG8iLCBkZXZfbmFtZSk7CisJc2NfY2ZnX2dldChudl9kbnMsIGlwX2Rucywgc2l6ZW9mKGlwX2RucykpOworCXN0cmNweShkbnNfc2VydmVyc1swXSwgaXBfZG5zKTsKKworCW1lbXNldChudl9kbnMsMCxzaXplb2YobnZfZG5zKSk7CisJbWVtc2V0KGlwX2RucywwLHNpemVvZihpcF9kbnMpKTsKKwlzcHJpbnRmKG52X2RucywgIiVzX2lwdjZfc2VjZG5zX2F1dG8iLCBkZXZfbmFtZSk7CisJc2NfY2ZnX2dldChudl9kbnMsIGlwX2Rucywgc2l6ZW9mKGlwX2RucykpOworCXN0cmNweShkbnNfc2VydmVyc1sxXSwgaXBfZG5zKTsKKworCQorCS8vTm93IGdldCB0aGUgaXAgb2YgdGhpcyBob3N0bmFtZSAsIEEgcmVjb3JkCisJZm9yKGk9MDtpPEROU19TRVJWRVJfTlVNO2krKykKKwl7CisJCWlmKG15X2dldGhvc3RieW5hbWU2KGhvc3RuYW1lLCBkZXZfbmFtZSAsIGRuc19zZXJ2ZXJzW2ldLCBUX0FBQUEsIGlwNikpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC0xOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwo=