From mboxrd@z Thu Jan 1 00:00:00 1970 From: Robert Bragg Subject: [PATCH igt v4 01/13] igt/perf: add i915 perf stream tests for Haswell Date: Mon, 14 Nov 2016 20:51:10 +0000 Message-ID: <20161114205122.10742-2-robert@sixbynine.org> References: <20161114205122.10742-1-robert@sixbynine.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-pg0-x241.google.com (mail-pg0-x241.google.com [IPv6:2607:f8b0:400e:c05::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id 639578955D for ; Mon, 14 Nov 2016 20:51:34 +0000 (UTC) Received: by mail-pg0-x241.google.com with SMTP id p66so9815869pga.2 for ; Mon, 14 Nov 2016 12:51:34 -0800 (PST) In-Reply-To: <20161114205122.10742-1-robert@sixbynine.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org U2lnbmVkLW9mZi1ieTogUm9iZXJ0IEJyYWdnIDxyb2JlcnRAc2l4YnluaW5lLm9yZz4KUmV2aWV3 ZWQtYnk6IE1hdHRoZXcgQXVsZCA8bWF0dGhldy5hdWxkQGludGVsLmNvbT4KLS0tCiB0ZXN0cy9N YWtlZmlsZS5zb3VyY2VzIHwgICAgMSArCiB0ZXN0cy9wZXJmLmMgICAgICAgICAgIHwgMjM3MyAr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDIgZmlsZXMg Y2hhbmdlZCwgMjM3NCBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgdGVzdHMvcGVy Zi5jCgpkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuc291cmNlcyBiL3Rlc3RzL01ha2VmaWxl LnNvdXJjZXMKaW5kZXggNjVlMDc5Mi4uYTgxODk2MyAxMDA2NDQKLS0tIGEvdGVzdHMvTWFrZWZp bGUuc291cmNlcworKysgYi90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCkBAIC0yMTQsNiArMjE0LDcg QEAgVEVTVFNfcHJvZ3MgPSBcCiAJa21zX3B3cml0ZV9jcmMgXAogCWttc19zaW5rX2NyY19iYXNp YyBcCiAJcHJpbWVfdWRsIFwKKwlwZXJmIFwKIAkkKE5VTEwpCiAKICMgSU1QT1JUQU5UOiBUaGUg WlpfIHRlc3RzIG5lZWQgdG8gYmUgcnVuIGxhc3QhCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmLmMg Yi90ZXN0cy9wZXJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFhZmNh OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmYuYwpAQCAtMCwwICsxLDIzNzMgQEAKKy8q CisgKiBDb3B5cmlnaHQgwqkgMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Np b24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFp bmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRh dGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUg d2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhl IHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUs IHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQg dG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0 byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhl IGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1 ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29w aWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICog VEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5Z IEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQg VE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQ QVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxM CisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBD TEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElP TiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBP RiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIg REVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGxp Yi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8 ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5j bHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90 aW1lcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2lu Y2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisj aW5jbHVkZSAiaWd0LmgiCisjaW5jbHVkZSAiZHJtLmgiCisKK0lHVF9URVNUX0RFU0NSSVBUSU9O KCJUZXN0IHRoZSBpOTE1IHBlcmYgbWV0cmljcyBzdHJlYW1pbmcgaW50ZXJmYWNlIik7CisKKyNk ZWZpbmUgR0VONl9NSV9SRVBPUlRfUEVSRl9DT1VOVCAoKDB4MjggPDwgMjMpIHwgKDMgLSAyKSkK KworI2RlZmluZSBHRlhfT1BfUElQRV9DT05UUk9MICAgICAoKDMgPDwgMjkpIHwgKDMgPDwgMjcp IHwgKDIgPDwgMjQpKQorI2RlZmluZSBQSVBFX0NPTlRST0xfQ1NfU1RBTEwJICAgKDEgPDwgMjAp CisjZGVmaW5lIFBJUEVfQ09OVFJPTF9HTE9CQUxfU05BUFNIT1RfQ09VTlRfUkVTRVQJKDEgPDwg MTkpCisjZGVmaW5lIFBJUEVfQ09OVFJPTF9UTEJfSU5WQUxJREFURSAgICAgKDEgPDwgMTgpCisj ZGVmaW5lIFBJUEVfQ09OVFJPTF9TWU5DX0dGRFQJICAoMSA8PCAxNykKKyNkZWZpbmUgUElQRV9D T05UUk9MX01FRElBX1NUQVRFX0NMRUFSICAoMSA8PCAxNikKKyNkZWZpbmUgUElQRV9DT05UUk9M X05PX1dSSVRFCSAgICgwIDw8IDE0KQorI2RlZmluZSBQSVBFX0NPTlRST0xfV1JJVEVfSU1NRURJ QVRFICAgICgxIDw8IDE0KQorI2RlZmluZSBQSVBFX0NPTlRST0xfV1JJVEVfREVQVEhfQ09VTlQg ICgyIDw8IDE0KQorI2RlZmluZSBQSVBFX0NPTlRST0xfV1JJVEVfVElNRVNUQU1QICAgICgzIDw8 IDE0KQorI2RlZmluZSBQSVBFX0NPTlRST0xfREVQVEhfU1RBTEwJKDEgPDwgMTMpCisjZGVmaW5l IFBJUEVfQ09OVFJPTF9SRU5ERVJfVEFSR0VUX0ZMVVNIICgxIDw8IDEyKQorI2RlZmluZSBQSVBF X0NPTlRST0xfSU5TVFJVQ1RJT05fSU5WQUxJREFURSAoMSA8PCAxMSkKKyNkZWZpbmUgUElQRV9D T05UUk9MX1RFWFRVUkVfQ0FDSEVfSU5WQUxJREFURSAgICgxIDw8IDEwKSAvKiBHTTQ1KyBvbmx5 ICovCisjZGVmaW5lIFBJUEVfQ09OVFJPTF9JU1BfRElTCSAgICAoMSA8PCA5KQorI2RlZmluZSBQ SVBFX0NPTlRST0xfSU5URVJSVVBUX0VOQUJMRSAgICgxIDw8IDgpCisjZGVmaW5lIFBJUEVfQ09O VFJPTF9GTFVTSF9FTkFCTEUgICAgICAgKDEgPDwgNykgLyogR2VuNysgb25seSAqLworLyogR1Qg Ki8KKyNkZWZpbmUgUElQRV9DT05UUk9MX0RBVEFfQ0FDSEVfSU5WQUxJREFURSAgICAgICgxIDw8 IDUpCisjZGVmaW5lIFBJUEVfQ09OVFJPTF9WRl9DQUNIRV9JTlZBTElEQVRFCSgxIDw8IDQpCisj ZGVmaW5lIFBJUEVfQ09OVFJPTF9DT05TVF9DQUNIRV9JTlZBTElEQVRFICAgICAoMSA8PCAzKQor I2RlZmluZSBQSVBFX0NPTlRST0xfU1RBVEVfQ0FDSEVfSU5WQUxJREFURSAgICAgKDEgPDwgMikK KyNkZWZpbmUgUElQRV9DT05UUk9MX1NUQUxMX0FUX1NDT1JFQk9BUkQJKDEgPDwgMSkKKyNkZWZp bmUgUElQRV9DT05UUk9MX0RFUFRIX0NBQ0hFX0ZMVVNICSAgKDEgPDwgMCkKKyNkZWZpbmUgUElQ RV9DT05UUk9MX1BQR1RUX1dSSVRFCSgwIDw8IDIpCisjZGVmaW5lIFBJUEVfQ09OVFJPTF9HTE9C QUxfR1RUX1dSSVRFICAgKDEgPDwgMikKKworI2RlZmluZSBOU0VDX1BFUl9TRUMgMTAwMDAwMDAw MHVsbAorCisvKiBUZW1wb3JhcmlseSBjb3B5IGk5MTUtcGVyZiB1YXBpIGhlcmUgdG8gYXZvaWQg YSBkZXBlbmRlbmN5IG9uIGxpYmRybSdzCisgKiBpOTE1X2RybS5oIGNvcHkgYmVpbmcgdXBkYXRl ZCB3aXRoIHRoZSBpOTE1LXBlcmYgaW50ZXJmYWNlIGJlZm9yZSB0aGlzCisgKiB0ZXN0IGNhbiBs YW5kIGluIGktZy10LgorICoKKyAqIFRPRE86IHJlbW92ZSB0aGlzIG9uY2UgdGhlIGludGVyZmFj ZSBsYW5kcyBpbiBsaWJkcm0KKyAqLworI2lmbmRlZiBEUk1fSTkxNV9QRVJGX09QRU4KKyNkZWZp bmUgRFJNX0k5MTVfUEVSRl9PUEVOCQkweDM2CisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X1BFUkZf T1BFTglEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9QRVJGX09QRU4sIHN0cnVj dCBkcm1faTkxNV9wZXJmX29wZW5fcGFyYW0pCisKK2VudW0gZHJtX2k5MTVfb2FfZm9ybWF0IHsK KyAgICAgICBJOTE1X09BX0ZPUk1BVF9BMTMgPSAxLAorICAgICAgIEk5MTVfT0FfRk9STUFUX0Ey OSwKKyAgICAgICBJOTE1X09BX0ZPUk1BVF9BMTNfQjhfQzgsCisgICAgICAgSTkxNV9PQV9GT1JN QVRfQjRfQzgsCisgICAgICAgSTkxNV9PQV9GT1JNQVRfQTQ1X0I4X0M4LAorICAgICAgIEk5MTVf T0FfRk9STUFUX0I0X0M4X0ExNiwKKyAgICAgICBJOTE1X09BX0ZPUk1BVF9DNF9COCwKKworICAg ICAgIEk5MTVfT0FfRk9STUFUX01BWCAvKiBub24tQUJJICovCit9OworCitlbnVtIGRybV9pOTE1 X3BlcmZfcHJvcGVydHlfaWQgeworICAgICAgIERSTV9JOTE1X1BFUkZfUFJPUF9DVFhfSEFORExF ID0gMSwKKyAgICAgICBEUk1fSTkxNV9QRVJGX1BST1BfU0FNUExFX09BLAorICAgICAgIERSTV9J OTE1X1BFUkZfUFJPUF9PQV9NRVRSSUNTX1NFVCwKKyAgICAgICBEUk1fSTkxNV9QRVJGX1BST1Bf T0FfRk9STUFULAorICAgICAgIERSTV9JOTE1X1BFUkZfUFJPUF9PQV9FWFBPTkVOVCwKKworICAg ICAgIERSTV9JOTE1X1BFUkZfUFJPUF9NQVggLyogbm9uLUFCSSAqLworfTsKKworc3RydWN0IGRy bV9pOTE1X3BlcmZfb3Blbl9wYXJhbSB7CisgICAgICAgX191MzIgZmxhZ3M7CisjZGVmaW5lIEk5 MTVfUEVSRl9GTEFHX0ZEX0NMT0VYRUMJKDE8PDApCisjZGVmaW5lIEk5MTVfUEVSRl9GTEFHX0ZE X05PTkJMT0NLCSgxPDwxKQorI2RlZmluZSBJOTE1X1BFUkZfRkxBR19ESVNBQkxFRAkJKDE8PDIp CisKKyAgICAgICBfX3UzMiBudW1fcHJvcGVydGllczsKKyAgICAgICBfX3U2NCBwcm9wZXJ0aWVz X3B0cjsKK307CisKKyNkZWZpbmUgSTkxNV9QRVJGX0lPQ1RMX0VOQUJMRSBfSU8oJ2knLCAweDAp CisjZGVmaW5lIEk5MTVfUEVSRl9JT0NUTF9ESVNBQkxFCV9JTygnaScsIDB4MSkKKworc3RydWN0 IGRybV9pOTE1X3BlcmZfcmVjb3JkX2hlYWRlciB7CisgICAgICAgX191MzIgdHlwZTsKKyAgICAg ICBfX3UxNiBwYWQ7CisgICAgICAgX191MTYgc2l6ZTsKK307CisKK2VudW0gZHJtX2k5MTVfcGVy Zl9yZWNvcmRfdHlwZSB7CisgICAgICAgRFJNX0k5MTVfUEVSRl9SRUNPUkRfU0FNUExFID0gMSwK KyAgICAgICBEUk1fSTkxNV9QRVJGX1JFQ09SRF9PQV9SRVBPUlRfTE9TVCA9IDIsCisgICAgICAg RFJNX0k5MTVfUEVSRl9SRUNPUkRfT0FfQlVGRkVSX0xPU1QgPSAzLAorCisgICAgICAgRFJNX0k5 MTVfUEVSRl9SRUNPUkRfTUFYIC8qIG5vbi1BQkkgKi8KK307CisjZW5kaWYgLyogIURSTV9JOTE1 X1BFUkZfT1BFTiAqLworCitzdGF0aWMgc3RydWN0IHsKKwljb25zdCBjaGFyICpuYW1lOworCXNp emVfdCBzaXplOworCWludCBhX29mZjsgLyogYnl0ZXMgKi8KKwlpbnQgbl9hOworCWludCBmaXJz dF9hOworCWludCBiX29mZjsKKwlpbnQgbl9iOworCWludCBjX29mZjsKKwlpbnQgbl9jOworfSBv YV9mb3JtYXRzW0k5MTVfT0FfRk9STUFUX01BWF0gPSB7CisJW0k5MTVfT0FfRk9STUFUX0ExM10g PSB7CisJCSJBMTMiLCAuc2l6ZSA9IDY0LAorCQkuYV9vZmYgPSAxMiwgLm5fYSA9IDEzIH0sCisJ W0k5MTVfT0FfRk9STUFUX0EyOV0gPSB7CisJCSJBMjkiLCAuc2l6ZSA9IDEyOCwKKwkJLmFfb2Zm ID0gMTIsIC5uX2EgPSAyOSB9LAorCVtJOTE1X09BX0ZPUk1BVF9BMTNfQjhfQzhdID0geworCQki QTEzX0I4X0M4IiwgLnNpemUgPSAxMjgsCisJCS5hX29mZiA9IDEyLCAubl9hID0gMTMsCisJCS5i X29mZiA9IDY0LCAubl9iID0gOCwKKwkJLmNfb2ZmID0gOTYsIC5uX2MgPSA4IH0sCisJW0k5MTVf T0FfRk9STUFUX0E0NV9COF9DOF0gPSB7CisJCSJBNDVfQjhfQzgiLCAuc2l6ZSA9IDI1NiwKKwkJ LmFfb2ZmID0gMTIsICAubl9hID0gNDUsCisJCS5iX29mZiA9IDE5MiwgLm5fYiA9IDgsCisJCS5j X29mZiA9IDIyNCwgLm5fYyA9IDggfSwKKwlbSTkxNV9PQV9GT1JNQVRfQjRfQzhdID0geworCQki QjRfQzgiLCAuc2l6ZSA9IDY0LAorCQkuYl9vZmYgPSAxNiwgLm5fYiA9IDQsCisJCS5jX29mZiA9 IDMyLCAubl9jID0gOCB9LAorCVtJOTE1X09BX0ZPUk1BVF9CNF9DOF9BMTZdID0geworCQkiQjRf QzhfQTE2IiwgLnNpemUgPSAxMjgsCisJCS5iX29mZiA9IDE2LCAubl9iID0gNCwKKwkJLmNfb2Zm ID0gMzIsIC5uX2MgPSA4LAorCQkuYV9vZmYgPSA2MCwgLm5fYSA9IDE2LCAuZmlyc3RfYSA9IDI5 IH0sCisJW0k5MTVfT0FfRk9STUFUX0M0X0I4XSA9IHsKKwkJIkM0X0I4IiwgLnNpemUgPSA2NCwK KwkJLmNfb2ZmID0gMTYsIC5uX2MgPSA0LAorCQkuYl9vZmYgPSAyOCwgLm5fYiA9IDggfSwKK307 CisKK3N0YXRpYyBib29sIGhzd191bmRlZmluZWRfYV9jb3VudGVyc1s0NV0gPSB7CisJWzRdID0g dHJ1ZSwKKwlbNl0gPSB0cnVlLAorCVs5XSA9IHRydWUsCisJWzExXSA9IHRydWUsCisJWzE0XSA9 IHRydWUsCisJWzE2XSA9IHRydWUsCisJWzE5XSA9IHRydWUsCisJWzIxXSA9IHRydWUsCisJWzI0 XSA9IHRydWUsCisJWzI2XSA9IHRydWUsCisJWzI5XSA9IHRydWUsCisJWzMxXSA9IHRydWUsCisJ WzM0XSA9IHRydWUsCisJWzQzXSA9IHRydWUsCisJWzQ0XSA9IHRydWUsCit9OworCitzdGF0aWMg aW50IGRybV9mZCA9IC0xOworc3RhdGljIHVpbnQzMl90IGRldmlkOworc3RhdGljIGludCBkZXZp Y2UgPSAtMTsKKworc3RhdGljIHVpbnQ2NF90IGhzd19yZW5kZXJfYmFzaWNfaWQgPSBVSU5UNjRf TUFYOworc3RhdGljIHVpbnQ2NF90IGd0X21pbl9mcmVxX21oel9zYXZlZCA9IDA7CitzdGF0aWMg dWludDY0X3QgZ3RfbWF4X2ZyZXFfbWh6X3NhdmVkID0gMDsKK3N0YXRpYyB1aW50NjRfdCBndF9t aW5fZnJlcV9taHogPSAwOworc3RhdGljIHVpbnQ2NF90IGd0X21heF9mcmVxX21oeiA9IDA7CisK K3N0YXRpYyB1aW50NjRfdCB0aW1lc3RhbXBfZnJlcXVlbmN5ID0gMTI1MDAwMDA7CisKK3N0YXRp YyBpZ3RfcmVuZGVyX2NvcHlmdW5jX3QgcmVuZGVyX2NvcHkgPSBOVUxMOworCitzdGF0aWMgaW50 CitfX3BlcmZfb3BlbihpbnQgZmQsIHN0cnVjdCBkcm1faTkxNV9wZXJmX29wZW5fcGFyYW0gKnBh cmFtKQoreworCWludCByZXQgPSBpZ3RfaW9jdGwoZmQsIERSTV9JT0NUTF9JOTE1X1BFUkZfT1BF TiwgcGFyYW0pOworCisJaWd0X2Fzc2VydChyZXQgPj0gMCk7CisJZXJybm8gPSAwOworCisJcmV0 dXJuIHJldDsKK30KKworc3RhdGljIGludAorbG9va3VwX2Zvcm1hdChpbnQgaTkxNV9wZXJmX2Zt dF9pZCkKK3sKKwlpZ3RfYXNzZXJ0KGk5MTVfcGVyZl9mbXRfaWQgPCBJOTE1X09BX0ZPUk1BVF9N QVgpOworCWlndF9hc3NlcnQob2FfZm9ybWF0c1tpOTE1X3BlcmZfZm10X2lkXS5uYW1lKTsKKwor CXJldHVybiBpOTE1X3BlcmZfZm10X2lkOworfQorCitzdGF0aWMgYm9vbAordHJ5X3JlYWRfdTY0 X2ZpbGUoY29uc3QgY2hhciAqZmlsZSwgdWludDY0X3QgKnZhbCkKK3sKKwljaGFyIGJ1ZlszMl07 CisJaW50IGZkLCBuOworCisJZmQgPSBvcGVuKGZpbGUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAw KQorCQlyZXR1cm4gZmFsc2U7CisKKwl3aGlsZSAoKG4gPSByZWFkKGZkLCBidWYsIHNpemVvZihi dWYpIC0gMSkpIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKwkJOworCWlndF9hc3NlcnQobiA+PSAw KTsKKworCWNsb3NlKGZkKTsKKworCWJ1ZltuXSA9ICdcMCc7CisJKnZhbCA9IHN0cnRvdWxsKGJ1 ZiwgTlVMTCwgMCk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHVpbnQ2NF90CityZWFk X3U2NF9maWxlKGNvbnN0IGNoYXIgKmZpbGUpCit7CisJdWludDY0X3QgdmFsOworCisJaWd0X2Fz c2VydF9lcSh0cnlfcmVhZF91NjRfZmlsZShmaWxlLCAmdmFsKSwgdHJ1ZSk7CisKKwlyZXR1cm4g dmFsOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfdTY0X2ZpbGUoY29uc3QgY2hhciAqZmlsZSwg dWludDY0X3QgdmFsKQoreworCWNoYXIgYnVmWzMyXTsKKwlpbnQgZmQsIGxlbiwgcmV0OworCisJ ZmQgPSBvcGVuKGZpbGUsIE9fV1JPTkxZKTsKKwlpZ3RfYXNzZXJ0KGZkID49IDApOworCisJbGVu ID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUiUFJJdTY0LCB2YWwpOworCWlndF9hc3Nl cnQobGVuID4gMCk7CisKKwl3aGlsZSAoKHJldCA9IHdyaXRlKGZkLCBidWYsIGxlbikpIDwgMCAm JiBlcnJubyA9PSBFSU5UUikKKwkJOworCWlndF9hc3NlcnRfZXEocmV0LCBsZW4pOworCisJY2xv c2UoZmQpOworfQorCitzdGF0aWMgdWludDY0X3QKK3N5c2ZzX3JlYWQoY29uc3QgY2hhciAqZmls ZSkKK3sKKwljaGFyIGJ1Zls1MTJdOworCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIi9z eXMvY2xhc3MvZHJtL2NhcmQlZC8lcyIsIGRldmljZSwgZmlsZSk7CisKKwlyZXR1cm4gcmVhZF91 NjRfZmlsZShidWYpOworfQorCitzdGF0aWMgdm9pZAorc3lzZnNfd3JpdGUoY29uc3QgY2hhciAq ZmlsZSwgdWludDY0X3QgdmFsKQoreworCWNoYXIgYnVmWzUxMl07CisKKwlzbnByaW50ZihidWYs IHNpemVvZihidWYpLCAiL3N5cy9jbGFzcy9kcm0vY2FyZCVkLyVzIiwgZGV2aWNlLCBmaWxlKTsK KworCXdyaXRlX3U2NF9maWxlKGJ1ZiwgdmFsKTsKK30KKworc3RhdGljIGNoYXIgKgorcmVhZF9k ZWJ1Z2ZzX3JlY29yZChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICprZXkpCit7CisJRklM RSAqZnA7CisJY2hhciAqbGluZSA9IE5VTEw7CisJc2l6ZV90IGxpbmVfYnVmX3NpemUgPSAwOwor CWludCBsZW4gPSAwOworCWludCBrZXlfbGVuID0gc3RybGVuKGtleSk7CisJY2hhciAqdmFsdWUg PSBOVUxMOworCisJZnAgPSBpZ3RfZGVidWdmc19mb3BlbihmaWxlLCAiciIpOworCWlndF9yZXF1 aXJlKGZwKTsKKworCXdoaWxlICgobGVuID0gZ2V0bGluZSgmbGluZSwgJmxpbmVfYnVmX3NpemUs IGZwKSkgPiAwKSB7CisKKwkJaWYgKGxpbmVbbGVuIC0gMV0gPT0gJ1xuJykKKwkJCWxpbmVbbGVu IC0gMV0gPSAnXDAnOworCisJCWlmIChzdHJuY21wKGtleSwgbGluZSwga2V5X2xlbikgPT0gMCAm JgorCQkgICAgbGluZVtrZXlfbGVuXSA9PSAnOicgJiYKKwkJICAgIGxpbmVba2V5X2xlbiArIDFd ID09ICcgJykKKwkJeworCQkJdmFsdWUgPSBzdHJkdXAobGluZSArIGtleV9sZW4gKyAyKTsKKwkJ CWdvdG8gZG9uZTsKKwkJfQorCX0KKworCWlndF9hc3NlcnQoISJyZWFjaGVkIik7Citkb25lOgor CWZyZWUobGluZSk7CisJaWYgKGZwKQorCQlmY2xvc2UoZnApOworCXJldHVybiB2YWx1ZTsKK30K Kworc3RhdGljIHVpbnQ2NF90CityZWFkX2RlYnVnZnNfdTY0X3JlY29yZChjb25zdCBjaGFyICpm aWxlLCBjb25zdCBjaGFyICprZXkpCit7CisJY2hhciAqc3RyX3ZhbCA9IHJlYWRfZGVidWdmc19y ZWNvcmQoZmlsZSwga2V5KTsKKwl1aW50NjRfdCB2YWw7CisKKwlpZ3RfcmVxdWlyZShzdHJfdmFs KTsKKworCXZhbCA9IHN0cnRvdWxsKHN0cl92YWwsIE5VTEwsIDApOworCWZyZWUoc3RyX3ZhbCk7 CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgYm9vbAorbG9va3VwX2hzd19yZW5kZXJfYmFz aWNfaWQodm9pZCkKK3sKKwljaGFyIGJ1ZlsyNTZdOworCisJaWd0X2Fzc2VydF9uZXEoZGV2aWNl LCAtMSk7CisKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkgIi9zeXMvY2xhc3MvZHJt L2NhcmQlZC9tZXRyaWNzLzQwM2Q4ODMyLTFhMjctNGFhNi1hNjRlLWY1Mzg5Y2U3YjIxMi9pZCIs CisJCSBkZXZpY2UpOworCisJcmV0dXJuIHRyeV9yZWFkX3U2NF9maWxlKGJ1ZiwgJmhzd19yZW5k ZXJfYmFzaWNfaWQpOworfQorCitzdGF0aWMgdm9pZAorZ3RfZnJlcXVlbmN5X3JhbmdlX3NhdmUo dm9pZCkKK3sKKwlndF9taW5fZnJlcV9taHpfc2F2ZWQgPSBzeXNmc19yZWFkKCJndF9taW5fZnJl cV9taHoiKTsKKwlndF9tYXhfZnJlcV9taHpfc2F2ZWQgPSBzeXNmc19yZWFkKCJndF9tYXhfZnJl cV9taHoiKTsKKworCWd0X21pbl9mcmVxX21oeiA9IGd0X21pbl9mcmVxX21oel9zYXZlZDsKKwln dF9tYXhfZnJlcV9taHogPSBndF9tYXhfZnJlcV9taHpfc2F2ZWQ7Cit9CisKK3N0YXRpYyB2b2lk CitndF9mcmVxdWVuY3lfcGluKGludCBndF9mcmVxX21oeikKK3sKKwlpZ3RfZGVidWcoInJlcXVl c3RpbmcgcGlubmVkIEdUIGZyZXEgPSAlZG1oelxuIiwgZ3RfZnJlcV9taHopOworCisJaWYgKGd0 X2ZyZXFfbWh6ID4gZ3RfbWF4X2ZyZXFfbWh6KSB7CisJCXN5c2ZzX3dyaXRlKCJndF9tYXhfZnJl cV9taHoiLCBndF9mcmVxX21oeik7CisJCXN5c2ZzX3dyaXRlKCJndF9taW5fZnJlcV9taHoiLCBn dF9mcmVxX21oeik7CisJfSBlbHNlIHsKKwkJc3lzZnNfd3JpdGUoImd0X21pbl9mcmVxX21oeiIs IGd0X2ZyZXFfbWh6KTsKKwkJc3lzZnNfd3JpdGUoImd0X21heF9mcmVxX21oeiIsIGd0X2ZyZXFf bWh6KTsKKwl9CisJZ3RfbWluX2ZyZXFfbWh6ID0gZ3RfZnJlcV9taHo7CisJZ3RfbWF4X2ZyZXFf bWh6ID0gZ3RfZnJlcV9taHo7Cit9CisKK3N0YXRpYyB2b2lkCitndF9mcmVxdWVuY3lfcmFuZ2Vf cmVzdG9yZSh2b2lkKQoreworCWlndF9kZWJ1ZygicmVzdG9yaW5nIEdUIGZyZXF1ZW5jeSByYW5n ZTogbWluID0gJWRtaHosIG1heCA9JWRtaHosIGN1cnJlbnQ6IG1pbj0lZG1oeiwgbWF4PSVkbWh6 XG4iLAorCQkgIChpbnQpZ3RfbWluX2ZyZXFfbWh6X3NhdmVkLAorCQkgIChpbnQpZ3RfbWF4X2Zy ZXFfbWh6X3NhdmVkLAorCQkgIChpbnQpZ3RfbWluX2ZyZXFfbWh6LAorCQkgIChpbnQpZ3RfbWF4 X2ZyZXFfbWh6KTsKKworCS8qIEFzc3VtZSBjdXJyZW50IG1pbi9tYXggYXJlIHRoZSBzYW1lICov CisJaWYgKGd0X21pbl9mcmVxX21oel9zYXZlZCA+IGd0X21heF9mcmVxX21oeikgeworCQlzeXNm c193cml0ZSgiZ3RfbWF4X2ZyZXFfbWh6IiwgZ3RfbWF4X2ZyZXFfbWh6X3NhdmVkKTsKKwkJc3lz ZnNfd3JpdGUoImd0X21pbl9mcmVxX21oeiIsIGd0X21pbl9mcmVxX21oel9zYXZlZCk7CisJfSBl bHNlIHsKKwkJc3lzZnNfd3JpdGUoImd0X21pbl9mcmVxX21oeiIsIGd0X21pbl9mcmVxX21oel9z YXZlZCk7CisJCXN5c2ZzX3dyaXRlKCJndF9tYXhfZnJlcV9taHoiLCBndF9tYXhfZnJlcV9taHpf c2F2ZWQpOworCX0KKworCWd0X21pbl9mcmVxX21oeiA9IGd0X21pbl9mcmVxX21oel9zYXZlZDsK KwlndF9tYXhfZnJlcV9taHogPSBndF9tYXhfZnJlcV9taHpfc2F2ZWQ7Cit9CisKK3N0YXRpYyB1 aW50NjRfdAordGltZWJhc2Vfc2NhbGUodWludDMyX3QgdTMyX2RlbHRhKQoreworCXJldHVybiAo KHVpbnQ2NF90KXUzMl9kZWx0YSAqIE5TRUNfUEVSX1NFQykgLyB0aW1lc3RhbXBfZnJlcXVlbmN5 OworfQorCisvKiBDQVBfU1lTX0FETUlOIGlzIHJlcXVpcmVkIHRvIG9wZW4gc3lzdGVtIHdpZGUg bWV0cmljcywgdW5sZXNzIHRoZSBzeXN0ZW0KKyAqIGNvbnRyb2wgcGFyYW1ldGVyIGRldi5pOTE1 LnBlcmZfc3RyZWFtX3BhcmFub2lkID09IDAgKi8KK3N0YXRpYyB2b2lkCit0ZXN0X3N5c3RlbV93 aWRlX3BhcmFub2lkKHZvaWQpCit7CisJaWd0X2ZvcmsoY2hpbGQsIDEpIHsKKwkJdWludDY0X3Qg cHJvcGVydGllc1tdID0geworCQkJLyogSW5jbHVkZSBPQSByZXBvcnRzIGluIHNhbXBsZXMgKi8K KwkJCURSTV9JOTE1X1BFUkZfUFJPUF9TQU1QTEVfT0EsIHRydWUsCisKKwkJCS8qIE9BIHVuaXQg Y29uZmlndXJhdGlvbiAqLworCQkJRFJNX0k5MTVfUEVSRl9QUk9QX09BX01FVFJJQ1NfU0VULCBo c3dfcmVuZGVyX2Jhc2ljX2lkLAorCQkJRFJNX0k5MTVfUEVSRl9QUk9QX09BX0ZPUk1BVCwgSTkx NV9PQV9GT1JNQVRfQTQ1X0I4X0M4LAorCQkJRFJNX0k5MTVfUEVSRl9QUk9QX09BX0VYUE9ORU5U LCAxMywgLyogMSBtaWxsaXNlY29uZCAqLworCQl9OworCQlzdHJ1Y3QgZHJtX2k5MTVfcGVyZl9v cGVuX3BhcmFtIHBhcmFtID0geworCQkJLmZsYWdzID0gSTkxNV9QRVJGX0ZMQUdfRkRfQ0xPRVhF QyB8CisJCQkJSTkxNV9QRVJGX0ZMQUdfRkRfTk9OQkxPQ0ssCisJCQkubnVtX3Byb3BlcnRpZXMg PSBzaXplb2YocHJvcGVydGllcykgLyAxNiwKKwkJCS5wcm9wZXJ0aWVzX3B0ciA9ICh1aW50NjRf dClwcm9wZXJ0aWVzLAorCQl9OworCisJCXdyaXRlX3U2NF9maWxlKCIvcHJvYy9zeXMvZGV2L2k5 MTUvcGVyZl9zdHJlYW1fcGFyYW5vaWQiLCAxKTsKKworCQlpZ3RfZHJvcF9yb290KCk7CisKKwkJ ZG9faW9jdGxfZXJyKGRybV9mZCwgRFJNX0lPQ1RMX0k5MTVfUEVSRl9PUEVOLCAmcGFyYW0sIEVB Q0NFUyk7CisJfQorCisJaWd0X3dhaXRjaGlsZHJlbigpOworCisJaWd0X2ZvcmsoY2hpbGQsIDEp IHsKKwkJdWludDY0X3QgcHJvcGVydGllc1tdID0geworCQkJLyogSW5jbHVkZSBPQSByZXBvcnRz IGluIHNhbXBsZXMgKi8KKwkJCURSTV9JOTE1X1BFUkZfUFJPUF9TQU1QTEVfT0EsIHRydWUsCisK KwkJCS8qIE9BIHVuaXQgY29uZmlndXJhdGlvbiAqLworCQkJRFJNX0k5MTVfUEVSRl9QUk9QX09B X01FVFJJQ1NfU0VULCBoc3dfcmVuZGVyX2Jhc2ljX2lkLAorCQkJRFJNX0k5MTVfUEVSRl9QUk9Q X09BX0ZPUk1BVCwgSTkxNV9PQV9GT1JNQVRfQTQ1X0I4X0M4LAorCQkJRFJNX0k5MTVfUEVSRl9Q Uk9QX09BX0VYUE9ORU5ULCAxMywgLyogMSBtaWxsaXNlY29uZCAqLworCQl9OworCQlzdHJ1Y3Qg ZHJtX2k5MTVfcGVyZl9vcGVuX3BhcmFtIHBhcmFtID0geworCQkJLmZsYWdzID0gSTkxNV9QRVJG X0ZMQUdfRkRfQ0xPRVhFQyB8CisJCQkJSTkxNV9QRVJGX0ZMQUdfRkRfTk9OQkxPQ0ssCisJCQku bnVtX3Byb3BlcnRpZXMgPSBzaXplb2YocHJvcGVydGllcykgLyAxNiwKKwkJCS5wcm9wZXJ0aWVz X3B0ciA9ICh1aW50NjRfdClwcm9wZXJ0aWVzLAorCQl9OworCQlpbnQgc3RyZWFtX2ZkOworCisJ CXdyaXRlX3U2NF9maWxlKCIvcHJvYy9zeXMvZGV2L2k5MTUvcGVyZl9zdHJlYW1fcGFyYW5vaWQi LCAwKTsKKworCQlpZ3RfZHJvcF9yb290KCk7CisKKwkJc3RyZWFtX2ZkID0gX19wZXJmX29wZW4o ZHJtX2ZkLCAmcGFyYW0pOworCQljbG9zZShzdHJlYW1fZmQpOworCX0KKworCWlndF93YWl0Y2hp bGRyZW4oKTsKKworCS8qIGxlYXZlIGluIHBhcmFub2lkIHN0YXRlICovCisJd3JpdGVfdTY0X2Zp bGUoIi9wcm9jL3N5cy9kZXYvaTkxNS9wZXJmX3N0cmVhbV9wYXJhbm9pZCIsIDEpOworfQorCitz dGF0aWMgdm9pZAordGVzdF9pbnZhbGlkX29wZW5fZmxhZ3Modm9pZCkKK3sKKwl1aW50NjRfdCBw cm9wZXJ0aWVzW10gPSB7CisJCS8qIEluY2x1ZGUgT0EgcmVwb3J0cyBpbiBzYW1wbGVzICovCisJ CURSTV9JOTE1X1BFUkZfUFJPUF9TQU1QTEVfT0EsIHRydWUsCisKKwkJLyogT0EgdW5pdCBjb25m aWd1cmF0aW9uICovCisJCURSTV9JOTE1X1BFUkZfUFJPUF9PQV9NRVRSSUNTX1NFVCwgaHN3X3Jl bmRlcl9iYXNpY19pZCwKKwkJRFJNX0k5MTVfUEVSRl9QUk9QX09BX0ZPUk1BVCwgSTkxNV9PQV9G T1JNQVRfQTQ1X0I4X0M4LAorCQlEUk1fSTkxNV9QRVJGX1BST1BfT0FfRVhQT05FTlQsIDEzLCAv KiAxIG1pbGxpc2Vjb25kICovCisJfTsKKwlzdHJ1Y3QgZHJtX2k5MTVfcGVyZl9vcGVuX3BhcmFt IHBhcmFtID0geworCQkuZmxhZ3MgPSB+MCwgLyogVW5kZWZpbmVkIGZsYWcgYml0cyBzZXQhICov CisJCS5udW1fcHJvcGVydGllcyA9IHNpemVvZihwcm9wZXJ0aWVzKSAvIDE2LAorCQkucHJvcGVy dGllc19wdHIgPSAodWludDY0X3QpcHJvcGVydGllcywKKwl9OworCisJZG9faW9jdGxfZXJyKGRy bV9mZCwgRFJNX0lPQ1RMX0k5MTVfUEVSRl9PUEVOLCAmcGFyYW0sIEVJTlZBTCk7Cit9CisKK3N0 YXRpYyB2b2lkCit0ZXN0X2ludmFsaWRfb2FfbWV0cmljX3NldF9pZCh2b2lkKQoreworCXVpbnQ2 NF90IHByb3BlcnRpZXNbXSA9IHsKKwkJLyogSW5jbHVkZSBPQSByZXBvcnRzIGluIHNhbXBsZXMg Ki8KKwkJRFJNX0k5MTVfUEVSRl9QUk9QX1NBTVBMRV9PQSwgdHJ1ZSwKKworCQkvKiBPQSB1bml0 IGNvbmZpZ3VyYXRpb24gKi8KKwkJRFJNX0k5MTVfUEVSRl9QUk9QX09BX0ZPUk1BVCwgSTkxNV9P QV9GT1JNQVRfQTQ1X0I4X0M4LAorCQlEUk1fSTkxNV9QRVJGX1BST1BfT0FfRVhQT05FTlQsIDEz LCAvKiAxIG1pbGxpc2Vjb25kICovCisJCURSTV9JOTE1X1BFUkZfUFJPUF9PQV9NRVRSSUNTX1NF VCwgVUlOVDY0X01BWCwKKwl9OworCXN0cnVjdCBkcm1faTkxNV9wZXJmX29wZW5fcGFyYW0gcGFy YW0gPSB7CisJCS5mbGFncyA9IEk5MTVfUEVSRl9GTEFHX0ZEX0NMT0VYRUMgfAorCQkJSTkxNV9Q RVJGX0ZMQUdfRkRfTk9OQkxPQ0ssCisJCS5udW1fcHJvcGVydGllcyA9IHNpemVvZihwcm9wZXJ0 aWVzKSAvIDE2LAorCQkucHJvcGVydGllc19wdHIgPSAodWludDY0X3QpcHJvcGVydGllcywKKwl9 OworCWludCBzdHJlYW1fZmQ7CisKKwlkb19pb2N0bF9lcnIoZHJtX2ZkLCBEUk1fSU9DVExfSTkx NV9QRVJGX09QRU4sICZwYXJhbSwgRUlOVkFMKTsKKworCXByb3BlcnRpZXNbQVJSQVlfU0laRShw cm9wZXJ0aWVzKSAtIDFdID0gMDsgLyogSUQgMCBpcyBhbHNvIGJlIHJlc2VydmVkIGFzIGludmFs aWQgKi8KKwlkb19pb2N0bF9lcnIoZHJtX2ZkLCBEUk1fSU9DVExfSTkxNV9QRVJGX09QRU4sICZw YXJhbSwgRUlOVkFMKTsKKworCS8qIENoZWNrIHRoYXQgd2UgYXJlbid0IGp1c3Qgc2VlaW5nIGZh bHNlIHBvc2l0aXZlcy4uLiAqLworCXByb3BlcnRpZXNbQVJSQVlfU0laRShwcm9wZXJ0aWVzKSAt IDFdID0gaHN3X3JlbmRlcl9iYXNpY19pZDsKKwlzdHJlYW1fZmQgPSBfX3BlcmZfb3Blbihkcm1f ZmQsICZwYXJhbSk7CisJY2xvc2Uoc3RyZWFtX2ZkKTsKKworCS8qIFRoZXJlJ3Mgbm8gdmFsaWQg ZGVmYXVsdCBPQSBtZXRyaWMgc2V0IElELi4uICovCisJcGFyYW0ubnVtX3Byb3BlcnRpZXMtLTsK Kwlkb19pb2N0bF9lcnIoZHJtX2ZkLCBEUk1fSU9DVExfSTkxNV9QRVJGX09QRU4sICZwYXJhbSwg RUlOVkFMKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfaW52YWxpZF9vYV9mb3JtYXRfaWQodm9p ZCkKK3sKKwl1aW50NjRfdCBwcm9wZXJ0aWVzW10gPSB7CisJCS8qIEluY2x1ZGUgT0EgcmVwb3J0 cyBpbiBzYW1wbGVzICovCisJCURSTV9JOTE1X1BFUkZfUFJPUF9TQU1QTEVfT0EsIHRydWUsCisK KwkJLyogT0EgdW5pdCBjb25maWd1cmF0aW9uICovCisJCURSTV9JOTE1X1BFUkZfUFJPUF9PQV9N RVRSSUNTX1NFVCwgaHN3X3JlbmRlcl9iYXNpY19pZCwKKwkJRFJNX0k5MTVfUEVSRl9QUk9QX09B X0VYUE9ORU5ULCAxMywgLyogMSBtaWxsaXNlY29uZCAqLworCQlEUk1fSTkxNV9QRVJGX1BST1Bf T0FfRk9STUFULCBVSU5UNjRfTUFYLAorCX07CisJc3RydWN0IGRybV9pOTE1X3BlcmZfb3Blbl9w YXJhbSBwYXJhbSA9IHsKKwkJLmZsYWdzID0gSTkxNV9QRVJGX0ZMQUdfRkRfQ0xPRVhFQyB8CisJ CQlJOTE1X1BFUkZfRkxBR19GRF9OT05CTE9DSywKKwkJLm51bV9wcm9wZXJ0aWVzID0gc2l6ZW9m KHByb3BlcnRpZXMpIC8gMTYsCisJCS5wcm9wZXJ0aWVzX3B0ciA9ICh1aW50NjRfdClwcm9wZXJ0 aWVzLAorCX07CisJaW50IHN0cmVhbV9mZDsKKworCWRvX2lvY3RsX2Vycihkcm1fZmQsIERSTV9J T0NUTF9JOTE1X1BFUkZfT1BFTiwgJnBhcmFtLCBFSU5WQUwpOworCisJcHJvcGVydGllc1tBUlJB WV9TSVpFKHByb3BlcnRpZXMpIC0gMV0gPSAwOyAvKiBJRCAwIGlzIGFsc28gYmUgcmVzZXJ2ZWQg YXMgaW52YWxpZCAqLworCWRvX2lvY3RsX2Vycihkcm1fZmQsIERSTV9JT0NUTF9JOTE1X1BFUkZf T1BFTiwgJnBhcmFtLCBFSU5WQUwpOworCisJLyogQ2hlY2sgdGhhdCB3ZSBhcmVuJ3QganVzdCBz ZWVpbmcgZmFsc2UgcG9zaXRpdmVzLi4uICovCisJcHJvcGVydGllc1tBUlJBWV9TSVpFKHByb3Bl cnRpZXMpIC0gMV0gPSBJOTE1X09BX0ZPUk1BVF9BNDVfQjhfQzg7CisJc3RyZWFtX2ZkID0gX19w ZXJmX29wZW4oZHJtX2ZkLCAmcGFyYW0pOworCWNsb3NlKHN0cmVhbV9mZCk7CisKKwkvKiBUaGVy ZSdzIG5vIHZhbGlkIGRlZmF1bHQgT0EgZm9ybWF0Li4uICovCisJcGFyYW0ubnVtX3Byb3BlcnRp ZXMtLTsKKwlkb19pb2N0bF9lcnIoZHJtX2ZkLCBEUk1fSU9DVExfSTkxNV9QRVJGX09QRU4sICZw YXJhbSwgRUlOVkFMKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfbWlzc2luZ19zYW1wbGVfZmxh Z3Modm9pZCkKK3sKKwl1aW50NjRfdCBwcm9wZXJ0aWVzW10gPSB7CisJCS8qIE5vIF9QUk9QX1NB TVBMRV94eXogZmxhZ3MgKi8KKworCQkvKiBPQSB1bml0IGNvbmZpZ3VyYXRpb24gKi8KKwkJRFJN X0k5MTVfUEVSRl9QUk9QX09BX01FVFJJQ1NfU0VULCBoc3dfcmVuZGVyX2Jhc2ljX2lkLAorCQlE Uk1fSTkxNV9QRVJGX1BST1BfT0FfRVhQT05FTlQsIDEzLCAvKiAxIG1pbGxpc2Vjb25kICovCisJ CURSTV9JOTE1X1BFUkZfUFJPUF9PQV9GT1JNQVQsIEk5MTVfT0FfRk9STUFUX0E0NV9COF9DOCwK Kwl9OworCXN0cnVjdCBkcm1faTkxNV9wZXJmX29wZW5fcGFyYW0gcGFyYW0gPSB7CisJCS5mbGFn cyA9IEk5MTVfUEVSRl9GTEFHX0ZEX0NMT0VYRUMsCisJCS5udW1fcHJvcGVydGllcyA9IHNpemVv Zihwcm9wZXJ0aWVzKSAvIDE2LAorCQkucHJvcGVydGllc19wdHIgPSAodWludDY0X3QpcHJvcGVy dGllcywKKwl9OworCisJZG9faW9jdGxfZXJyKGRybV9mZCwgRFJNX0lPQ1RMX0k5MTVfUEVSRl9P UEVOLCAmcGFyYW0sIEVJTlZBTCk7Cit9CisKK3N0YXRpYyB2b2lkCityZWFkXzJfb2FfcmVwb3J0 cyhpbnQgc3RyZWFtX2ZkLAorCQkgIGludCBmb3JtYXRfaWQsCisJCSAgaW50IGV4cG9uZW50LAor CQkgIHVpbnQzMl90ICpvYV9yZXBvcnQwLAorCQkgIHVpbnQzMl90ICpvYV9yZXBvcnQxLAorCQkg IGJvb2wgdGltZXJfb25seSkKK3sKKwlzaXplX3QgZm9ybWF0X3NpemUgPSBvYV9mb3JtYXRzW2Zv cm1hdF9pZF0uc2l6ZTsKKwlzaXplX3Qgc2FtcGxlX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBkcm1f aTkxNV9wZXJmX3JlY29yZF9oZWFkZXIpICsKKwkJCSAgICAgIGZvcm1hdF9zaXplKTsKKwljb25z dCBzdHJ1Y3QgZHJtX2k5MTVfcGVyZl9yZWNvcmRfaGVhZGVyICpoZWFkZXI7CisJdWludDMyX3Qg ZXhwb25lbnRfbWFzayA9ICgxIDw8IChleHBvbmVudCArIDEpKSAtIDE7CisKKwkvKiBOb3RlOiB3 ZSBhbGxvY2F0ZSBhIGxhcmdlIGJ1ZmZlciBzbyB0aGF0IGVhY2ggcmVhZCgpIGl0ZXJhdGlvbgor CSAqIHNob3VsZCBzY3JhcGUgKmFsbCogcGVuZGluZyByZWNvcmRzLgorCSAqCisJICogVGhlIGxh cmdlc3QgYnVmZmVyIHRoZSBPQSB1bml0IHN1cHBvcnRzIGlzIDE2TUIgYW5kIHRoZSBzbWFsbGVz dAorCSAqIE9BIHJlcG9ydCBmb3JtYXQgaXMgNjRieXRlcyBhbGxvd2luZyB1cCB0byAyNjIxNDQg cmVwb3J0cyB0bworCSAqIGJlIGJ1ZmZlcmVkLgorCSAqCisJICogQmVpbmcgc3VyZSB3ZSBhcmUg ZmV0Y2hpbmcgYWxsIGJ1ZmZlcmVkIHJlcG9ydHMgYWxsb3dzIHVzIHRvCisJICogcG90ZW50aWFs bHkgdGhyb3cgYXdheSAvIHNraXAgYWxsIHJlcG9ydHMgd2hlbmV2ZXIgd2Ugc2VlCisJICogYSBf UkVQT1JUX0xPU1Qgbm90aWZpY2F0aW9uIGFzIGEgd2F5IG9mIGJlaW5nIHN1cmUgYXJlCisJICog bWVhc3VyZW1lbnRzIGFyZW4ndCBza2V3ZWQgYnkgYSBsb3N0IHJlcG9ydC4KKwkgKgorCSAqIE5v dGU6IHRoYXQgaXMgaXMgdXNlZnVsIGZvciBzb21lIHRlc3RzIGJ1dCBhbHNvIG5vdCBzb21ldGhp bmcKKwkgKiBhcHBsaWNhdGlvbnMgd291bGQgYmUgZXhwZWN0ZWQgdG8gcmVzb3J0IHRvLiBMb3N0 IHJlcG9ydHMgYXJlCisJICogc29tZXdoYXQgdW5wcmVkaWN0YWJsZSBidXQgdHlwaWNhbGx5IGRv bid0IHBvc2UgYSBwcm9ibGVtIC0gZXhjZXB0CisJICogdG8gaW5kaWNhdGUgdGhhdCB0aGUgT0Eg dW5pdCBtYXkgYmUgb3ZlciB0YXhlZCBpZiBsb3RzIG9mIHJlcG9ydHMKKwkgKiBhcmUgYmVpbmcg bG9zdC4KKwkgKi8KKwlpbnQgYnVmX3NpemUgPSAyNjIxNDQgKiAoNjQgKyBzaXplb2Yoc3RydWN0 IGRybV9pOTE1X3BlcmZfcmVjb3JkX2hlYWRlcikpOworCXVpbnQ4X3QgKmJ1ZiA9IG1hbGxvYyhi dWZfc2l6ZSk7CisJaW50IG4gPSAwOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKysp IHsKKwkJc3NpemVfdCBsZW47CisKKwkJd2hpbGUgKChsZW4gPSByZWFkKHN0cmVhbV9mZCwgYnVm LCBidWZfc2l6ZSkpIDwgMCAmJgorCQkgICAgICAgZXJybm8gPT0gRUlOVFIpCisJCQk7CisKKwkJ aWd0X2Fzc2VydChsZW4gPiAwKTsKKworCQlmb3IgKHNpemVfdCBvZmZzZXQgPSAwOyBvZmZzZXQg PCBsZW47IG9mZnNldCArPSBoZWFkZXItPnNpemUpIHsKKwkJCWNvbnN0IHVpbnQzMl90ICpyZXBv cnQ7CisKKwkJCWhlYWRlciA9ICh2b2lkICopKGJ1ZiArIG9mZnNldCk7CisKKwkJCWlndF9hc3Nl cnRfZXEoaGVhZGVyLT5wYWQsIDApOyAvKiBSZXNlcnZlZCAqLworCisJCQkvKiBDdXJyZW50bHkg dGhlIG9ubHkgdGVzdCB0aGF0IHNob3VsZCBldmVyIGV4cGVjdCB0bworCQkJICogc2VlIGEgX0JV RkZFUl9MT1NUIGVycm9yIGlzIHRoZSBidWZmZXJfZmlsbCB0ZXN0LAorCQkJICogb3RoZXJ3aXNl IHNvbWV0aGluZyBiYWQgaGFzIHByb2JhYmx5IGhhcHBlbmVkLi4uCisJCQkgKi8KKwkJCWlndF9h c3NlcnRfbmVxKGhlYWRlci0+dHlwZSwgRFJNX0k5MTVfUEVSRl9SRUNPUkRfT0FfQlVGRkVSX0xP U1QpOworCisJCQkvKiBBdCBoaWdoIHNhbXBsaW5nIGZyZXF1ZW5jaWVzIHRoZSBPQSBIVyBtaWdo dCBub3QgYmUKKwkJCSAqIGFibGUgdG8gY29wZSB3aXRoIGFsbCB3cml0ZSByZXF1ZXN0cyBhbmQg d2lsbCBub3RpZnkKKwkJCSAqIHVzIHRoYXQgYSByZXBvcnQgd2FzIGxvc3QuIFdlIHJlc3RhcnQg b3VyIHJlYWQgb2YKKwkJCSAqIHR3byBzZXF1ZW50aWFsIHJlcG9ydHMgZHVlIHRvIHRoZSB0aW1l bGluZSBibGlwIHRoaXMKKwkJCSAqIGltcGxpZXMKKwkJCSAqLworCQkJaWYgKGhlYWRlci0+dHlw ZSA9PSBEUk1fSTkxNV9QRVJGX1JFQ09SRF9PQV9SRVBPUlRfTE9TVCkgeworCQkJCWlndF9kZWJ1 ZygicmVhZCByZXN0YXJ0OiBPQSB0cmlnZ2VyIGNvbGxpc2lvbiAvIHJlcG9ydCBsb3N0XG4iKTsK KwkJCQluID0gMDsKKworCQkJCS8qIFhYWDogYnJlYWssIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB3 aGVyZQorCQkJCSAqIHdpdGhpbiB0aGUgc2VyaWVzIG9mIGFscmVhZHkgcmVhZCByZXBvcnRzCisJ CQkJICogdGhlcmUgY291bGQgYmUgYSBibGlwIGZyb20gdGhlIGxvc3QgcmVwb3J0LgorCQkJCSAq LworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBDdXJyZW50bHkgdGhlIG9ubHkgb3RoZXIgcmVj b3JkIHR5cGUgZXhwZWN0ZWQgaXMgYQorCQkJICogX1NBTVBMRS4gTm90YWJseSB0aGlzIHRlc3Qg d2lsbCBuZWVkIHVwZGF0aW5nIGlmCisJCQkgKiBpOTE1LXBlcmYgaXMgZXh0ZW5kZWQgaW4gdGhl IGZ1dHVyZSB3aXRoIGFkZGl0aW9uYWwKKwkJCSAqIHJlY29yZCB0eXBlcy4KKwkJCSAqLworCQkJ aWd0X2Fzc2VydF9lcShoZWFkZXItPnR5cGUsIERSTV9JOTE1X1BFUkZfUkVDT1JEX1NBTVBMRSk7 CisKKwkJCWlndF9hc3NlcnRfZXEoaGVhZGVyLT5zaXplLCBzYW1wbGVfc2l6ZSk7CisKKwkJCXJl cG9ydCA9IChjb25zdCB2b2lkICopKGhlYWRlciArIDEpOworCisJCQlpZ3RfZGVidWcoInJlYWQg cmVwb3J0OiByZWFzb24gPSAleCwgdGltZXN0YW1wID0gJXgsIGV4cG9uZW50IG1hc2s9JXhcbiIs CisJCQkJICByZXBvcnRbMF0sIHJlcG9ydFsxXSwgZXhwb25lbnRfbWFzayk7CisKKwkJCS8qIERv bid0IGV4cGVjdCB6ZXJvIGZvciB0aW1lc3RhbXBzICovCisJCQlpZ3RfYXNzZXJ0X25lcShyZXBv cnRbMV0sIDApOworCisJCQlpZiAodGltZXJfb25seSkgeworCQkJCS8qIEZvciBIYXN3ZWxsIHdl IGRvbid0IGhhdmUgYSBkb2N1bWVudGVkCisJCQkJICogcmVwb3J0IHJlYXNvbiBmaWVsZCAodGhv dWdoIGVtcGlyaWNhbGx5CisJCQkJICogcmVwb3J0WzBdIGJpdCAxMCBkb2VzIHNlZW0gdG8gY29y cmVsYXRlIHdpdGgKKwkJCQkgKiBhIHRpbWVyIHRyaWdnZXIgcmVhc29uKSBzbyB3ZSBpbnN0ZWFk IGluZmVyCisJCQkJICogd2hpY2ggcmVwb3J0cyBhcmUgdGltZXIgdHJpZ2dlcmVkIGJ5CisJCQkJ ICogY2hlY2tpbmcgaWYgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgYXJlCisJCQkJICogemVy byBhbmQgdGhlIGV4cG9uZW50IGJpdCBpcyBzZXQuCisJCQkJICovCisJCQkJaWYgKChyZXBvcnRb MV0gJiBleHBvbmVudF9tYXNrKSAhPSAoMSA8PCBleHBvbmVudCkpIHsKKwkJCQkJaWd0X2RlYnVn KCJza2lwcGluZyBub24gdGltZXIgcmVwb3J0IHJlYXNvbj0leFxuIiwKKwkJCQkJCSAgcmVwb3J0 WzBdKTsKKworCQkJCQkvKiBBbHNvIGFzc2VydCBvdXIgaHlwb3RoZXNpcyBhYm91dCB0aGUKKwkJ CQkJICogcmVhc29uIGJpdC4uLgorCQkJCQkgKi8KKwkJCQkJaWd0X2Fzc2VydF9lcShyZXBvcnRb MF0gJiAoMSA8PCAxMCksIDApOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisKKwkJCWlm IChuKysgPT0gMCkKKwkJCQltZW1jcHkob2FfcmVwb3J0MCwgcmVwb3J0LCBmb3JtYXRfc2l6ZSk7 CisJCQllbHNlIHsKKwkJCQltZW1jcHkob2FfcmVwb3J0MSwgcmVwb3J0LCBmb3JtYXRfc2l6ZSk7 CisJCQkJZnJlZShidWYpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKworCWZyZWUoYnVm KTsKKworCWlndF9hc3NlcnQoISJyZWFjaGVkIik7Cit9CisKK3N0YXRpYyB2b2lkCitvcGVuX2Fu ZF9yZWFkXzJfb2FfcmVwb3J0cyhpbnQgZm9ybWF0X2lkLAorCQkJICAgaW50IGV4cG9uZW50LAor CQkJICAgdWludDMyX3QgKm9hX3JlcG9ydDAsCisJCQkgICB1aW50MzJfdCAqb2FfcmVwb3J0MSwK KwkJCSAgIGJvb2wgdGltZXJfb25seSkKK3sKKwl1aW50NjRfdCBwcm9wZXJ0aWVzW10gPSB7CisJ CS8qIEluY2x1ZGUgT0EgcmVwb3J0cyBpbiBzYW1wbGVzICovCisJCURSTV9JOTE1X1BFUkZfUFJP UF9TQU1QTEVfT0EsIHRydWUsCisKKwkJLyogT0EgdW5pdCBjb25maWd1cmF0aW9uICovCisJCURS TV9JOTE1X1BFUkZfUFJPUF9PQV9NRVRSSUNTX1NFVCwgaHN3X3JlbmRlcl9iYXNpY19pZCwKKwkJ RFJNX0k5MTVfUEVSRl9QUk9QX09BX0ZPUk1BVCwgZm9ybWF0X2lkLAorCQlEUk1fSTkxNV9QRVJG X1BST1BfT0FfRVhQT05FTlQsIGV4cG9uZW50LAorCisJfTsKKwlzdHJ1Y3QgZHJtX2k5MTVfcGVy Zl9vcGVuX3BhcmFtIHBhcmFtID0geworCQkuZmxhZ3MgPSBJOTE1X1BFUkZfRkxBR19GRF9DTE9F WEVDLAorCQkubnVtX3Byb3BlcnRpZXMgPSBzaXplb2YocHJvcGVydGllcykgLyAxNiwKKwkJLnBy b3BlcnRpZXNfcHRyID0gKHVpbnQ2NF90KXByb3BlcnRpZXMsCisJfTsKKwlpbnQgc3RyZWFtX2Zk ID0gX19wZXJmX29wZW4oZHJtX2ZkLCAmcGFyYW0pOworCisJcmVhZF8yX29hX3JlcG9ydHMoc3Ry ZWFtX2ZkLCBmb3JtYXRfaWQsIGV4cG9uZW50LAorCQkJICBvYV9yZXBvcnQwLCBvYV9yZXBvcnQx LCB0aW1lcl9vbmx5KTsKKworCWNsb3NlKHN0cmVhbV9mZCk7Cit9CisKK3N0YXRpYyB2b2lkCitw cmludF9yZXBvcnRzKHVpbnQzMl90ICpvYV9yZXBvcnQwLCB1aW50MzJfdCAqb2FfcmVwb3J0MSwg aW50IGZtdCkKK3sKKwl1aW50MzJfdCAqYTAsICpiMCwgKmMwOworCXVpbnQzMl90ICphMSwgKmIx LCAqYzE7CisKKwkvKiBOb3QgaWRlYWwgbmFtaW5nIGhlcmUgd2l0aCBhMCBvciBhMQorCSAqIGRp ZmZlcmVudGlhdGluZyByZXBvcnQwIG9yIDEgbm90IEEgY291bnRlciAwIG9yIDEuLi4uCisJICov CisJYTAgPSAodWludDMyX3QgKikoKCh1aW50OF90ICopb2FfcmVwb3J0MCkgKyBvYV9mb3JtYXRz W2ZtdF0uYV9vZmYpOworCWIwID0gKHVpbnQzMl90ICopKCgodWludDhfdCAqKW9hX3JlcG9ydDAp ICsgb2FfZm9ybWF0c1tmbXRdLmJfb2ZmKTsKKwljMCA9ICh1aW50MzJfdCAqKSgoKHVpbnQ4X3Qg KilvYV9yZXBvcnQwKSArIG9hX2Zvcm1hdHNbZm10XS5jX29mZik7CisKKwlhMSA9ICh1aW50MzJf dCAqKSgoKHVpbnQ4X3QgKilvYV9yZXBvcnQxKSArIG9hX2Zvcm1hdHNbZm10XS5hX29mZik7CisJ YjEgPSAodWludDMyX3QgKikoKCh1aW50OF90ICopb2FfcmVwb3J0MSkgKyBvYV9mb3JtYXRzW2Zt dF0uYl9vZmYpOworCWMxID0gKHVpbnQzMl90ICopKCgodWludDhfdCAqKW9hX3JlcG9ydDEpICsg b2FfZm9ybWF0c1tmbXRdLmNfb2ZmKTsKKworCWlndF9kZWJ1ZygiVElNRVNUQU1QOiAxc3QgPSAl IlBSSXUzMiIsIDJuZCA9ICUiUFJJdTMyIiwgZGVsdGEgPSAlIlBSSXUzMiJcbiIsCisJCSAgb2Ff cmVwb3J0MFsxXSwgb2FfcmVwb3J0MVsxXSwgb2FfcmVwb3J0MVsxXSAtIG9hX3JlcG9ydDBbMV0p OworCisJaWYgKG9hX2Zvcm1hdHNbZm10XS5uX2MpIHsKKwkJaWd0X2RlYnVnKCJDTE9DSzogMXN0 ID0gJSJQUkl1MzIiLCAybmQgPSAlIlBSSXUzMiIsIGRlbHRhID0gJSJQUkl1MzIiXG4iLAorCQkJ ICBjMFsyXSwgYzFbMl0sIGMxWzJdIC0gYzBbMl0pOworCX0gZWxzZQorCQlpZ3RfZGVidWcoIkNM T0NLID0gTi9BXG4iKTsKKworCWZvciAoaW50IGogPSBvYV9mb3JtYXRzW2ZtdF0uZmlyc3RfYTsK KwkgICAgIGogPCBvYV9mb3JtYXRzW2ZtdF0ubl9hOworCSAgICAgaisrKQorCXsKKwkJdWludDMy X3QgZGVsdGEgPSBhMVtqXSAtIGEwW2pdOworCisJCWlmIChoc3dfdW5kZWZpbmVkX2FfY291bnRl cnNbal0pCisJCQljb250aW51ZTsKKworCQlpZ3RfZGVidWcoIkElZDogMXN0ID0gJSJQUkl1MzIi LCAybmQgPSAlIlBSSXUzMiIsIGRlbHRhID0gJSJQUkl1MzIiXG4iLAorCQkJICBqLCBhMFtqXSwg YTFbal0sIGRlbHRhKTsKKwl9CisKKwlmb3IgKGludCBqID0gMDsgaiA8IG9hX2Zvcm1hdHNbZm10 XS5uX2I7IGorKykgeworCQl1aW50MzJfdCBkZWx0YSA9IGIxW2pdIC0gYjBbal07CisJCWlndF9k ZWJ1ZygiQiVkOiAxc3QgPSAlIlBSSXUzMiIsIDJuZCA9ICUiUFJJdTMyIiwgZGVsdGEgPSAlIlBS SXUzMiJcbiIsCisJCQkgIGosIGIwW2pdLCBiMVtqXSwgZGVsdGEpOworCX0KKworCWZvciAoaW50 IGogPSAwOyBqIDwgb2FfZm9ybWF0c1tmbXRdLm5fYzsgaisrKSB7CisJCXVpbnQzMl90IGRlbHRh ID0gYzFbal0gLSBjMFtqXTsKKwkJaWd0X2RlYnVnKCJDJWQ6IDFzdCA9ICUiUFJJdTMyIiwgMm5k ID0gJSJQUkl1MzIiLCBkZWx0YSA9ICUiUFJJdTMyIlxuIiwKKwkJCSAgaiwgYzBbal0sIGMxW2pd LCBkZWx0YSk7CisJfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9vYV9mb3JtYXRzKHZvaWQpCit7 CisJaW50IG9hX2V4cG9uZW50ID0gMTM7CisKKwlmb3IgKGludCBpID0gMDsgaSA8IEFSUkFZX1NJ WkUob2FfZm9ybWF0cyk7IGkrKykgeworCQl1aW50MzJfdCBvYV9yZXBvcnQwWzY0XTsKKwkJdWlu dDMyX3Qgb2FfcmVwb3J0MVs2NF07CisJCXVpbnQzMl90ICphMCwgKmIwLCAqYzA7CisJCXVpbnQz Ml90ICphMSwgKmIxLCAqYzE7CisJCXVpbnQzMl90IHRpbWVfZGVsdGE7CisJCXVpbnQzMl90IGNs b2NrX2RlbHRhOworCQl1aW50MzJfdCBtYXhfZGVsdGE7CisKKwkJaWYgKCFvYV9mb3JtYXRzW2ld Lm5hbWUpIC8qIHNwYXJzZSwgaW5kZXhlZCBieSBJRCAqLworCQkJY29udGludWU7CisKKwkJaWd0 X2RlYnVnKCJDaGVja2luZyBPQSBmb3JtYXQgJXNcbiIsIG9hX2Zvcm1hdHNbaV0ubmFtZSk7CisK KwkJb3Blbl9hbmRfcmVhZF8yX29hX3JlcG9ydHMoaSwKKwkJCQkJICAgb2FfZXhwb25lbnQsCisJ CQkJCSAgIG9hX3JlcG9ydDAsCisJCQkJCSAgIG9hX3JlcG9ydDEsCisJCQkJCSAgIGZhbHNlKTsg LyogdGltZXIgcmVwb3J0cyBvbmx5ICovCisKKwkJcHJpbnRfcmVwb3J0cyhvYV9yZXBvcnQwLCBv YV9yZXBvcnQxLCBpKTsKKworCQlhMCA9ICh1aW50MzJfdCAqKSgoKHVpbnQ4X3QgKilvYV9yZXBv cnQwKSArIG9hX2Zvcm1hdHNbaV0uYV9vZmYpOworCQliMCA9ICh1aW50MzJfdCAqKSgoKHVpbnQ4 X3QgKilvYV9yZXBvcnQwKSArIG9hX2Zvcm1hdHNbaV0uYl9vZmYpOworCQljMCA9ICh1aW50MzJf dCAqKSgoKHVpbnQ4X3QgKilvYV9yZXBvcnQwKSArIG9hX2Zvcm1hdHNbaV0uY19vZmYpOworCisJ CWExID0gKHVpbnQzMl90ICopKCgodWludDhfdCAqKW9hX3JlcG9ydDEpICsgb2FfZm9ybWF0c1tp XS5hX29mZik7CisJCWIxID0gKHVpbnQzMl90ICopKCgodWludDhfdCAqKW9hX3JlcG9ydDEpICsg b2FfZm9ybWF0c1tpXS5iX29mZik7CisJCWMxID0gKHVpbnQzMl90ICopKCgodWludDhfdCAqKW9h X3JlcG9ydDEpICsgb2FfZm9ybWF0c1tpXS5jX29mZik7CisKKwkJdGltZV9kZWx0YSA9IHRpbWVi YXNlX3NjYWxlKG9hX3JlcG9ydDFbMV0gLSBvYV9yZXBvcnQwWzFdKTsKKwkJaWd0X2Fzc2VydF9u ZXEodGltZV9kZWx0YSwgMCk7CisKKwkJLyogQzIgY29ycmVzcG9uZHMgdG8gYSBjbG9jayBjb3Vu dGVyIGZvciB0aGUgSGFzd2VsbCByZW5kZXIKKwkJICogYmFzaWMgbWV0cmljIHNldCBidXQgaXQn cyBub3QgaW5jbHVkZWQgaW4gYWxsIG9mIHRoZQorCQkgKiBmb3JtYXRzLgorCQkgKi8KKwkJaWYg KG9hX2Zvcm1hdHNbaV0ubl9jKSB7CisJCQl1aW50NjRfdCBmcmVxOworCisJCQkvKiBUaGUgZmly c3QgcmVwb3J0IG1pZ2h0IGhhdmUgYSBjbG9jayBjb3VudCBvZiB6ZXJvCisJCQkgKiBidXQgd2Ug d291bGRuJ3QgZXhwZWN0IHRoYXQgaW4gdGhlIHNlY29uZCByZXBvcnQuLi4KKwkJCSAqLworCQkJ aWd0X2Fzc2VydF9uZXEoYzFbMl0sIDApOworCisJCQljbG9ja19kZWx0YSA9IGMxWzJdIC0gYzBb Ml07CisJCQlpZ3RfYXNzZXJ0X25lcShjbG9ja19kZWx0YSwgMCk7CisKKwkJCWZyZXEgPSAoKHVp bnQ2NF90KWNsb2NrX2RlbHRhICogMTAwMCkgLyB0aW1lX2RlbHRhOworCQkJaWd0X2RlYnVnKCJm cmVxID0gJSJQUkl1NjQiXG4iLCBmcmVxKTsKKworCQkJaWd0X2Fzc2VydChmcmVxIDw9IGd0X21h eF9mcmVxX21oeik7CisJCX0gZWxzZSB7CisJCQkvKiBBc3N1bWUgcnVubmluZyBhdCBtYXggZnJl cSBmb3Igc2FrZSBvZgorCQkJICogYmVsb3cgc2FuaXR5IGNoZWNrIG9uIGNvdW50ZXJzLi4uICov CisJCQljbG9ja19kZWx0YSA9IChndF9tYXhfZnJlcV9taHogKgorCQkJCSAgICAgICAodWludDY0 X3QpdGltZV9kZWx0YSkgLyAxMDAwOworCQl9CisKKwkJaWd0X2RlYnVnKCJjbG9jayBkZWx0YSA9 ICUiUFJJdTMyIlxuIiwgY2xvY2tfZGVsdGEpOworCisJCS8qIFRoZSBtYXhpbXVtIHJhdGUgZm9y IGFueSBIU1cgY291bnRlciA9CisJCSAqICAgY2xvY2tfZGVsdGEgKiA0MCBFVXMKKwkJICoKKwkJ ICogU2FuaXR5IGNoZWNrIHRoYXQgbm8gY291bnRlcnMgZXhjZWVkIHRoaXMgZGVsdGEuCisJCSAq LworCQltYXhfZGVsdGEgPSBjbG9ja19kZWx0YSAqIDQwOworCisJCWZvciAoaW50IGogPSBvYV9m b3JtYXRzW2ldLmZpcnN0X2E7CisJCSAgICAgaiA8IG9hX2Zvcm1hdHNbaV0ubl9hOworCQkgICAg IGorKykKKwkJeworCQkJdWludDMyX3QgZGVsdGEgPSBhMVtqXSAtIGEwW2pdOworCisJCQlpZiAo aHN3X3VuZGVmaW5lZF9hX2NvdW50ZXJzW2pdKQorCQkJCWNvbnRpbnVlOworCisJCQlpZ3RfZGVi dWcoIkElZDogZGVsdGEgPSAlIlBSSXUzMiJcbiIsIGosIGRlbHRhKTsKKwkJCWlndF9hc3NlcnQo ZGVsdGEgPD0gbWF4X2RlbHRhKTsKKwkJfQorCisJCWZvciAoaW50IGogPSAwOyBqIDwgb2FfZm9y bWF0c1tpXS5uX2I7IGorKykgeworCQkJdWludDMyX3QgZGVsdGEgPSBiMVtqXSAtIGIwW2pdOwor CQkJaWd0X2RlYnVnKCJCJWQ6IGRlbHRhID0gJSJQUkl1MzIiXG4iLCBqLCBkZWx0YSk7CisJCQlp Z3RfYXNzZXJ0KGRlbHRhIDw9IG1heF9kZWx0YSk7CisJCX0KKworCQlmb3IgKGludCBqID0gMDsg aiA8IG9hX2Zvcm1hdHNbaV0ubl9jOyBqKyspIHsKKwkJCXVpbnQzMl90IGRlbHRhID0gYzFbal0g LSBjMFtqXTsKKwkJCWlndF9kZWJ1ZygiQyVkOiBkZWx0YSA9ICUiUFJJdTMyIlxuIiwgaiwgZGVs dGEpOworCQkJaWd0X2Fzc2VydChkZWx0YSA8PSBtYXhfZGVsdGEpOworCQl9CisJfQorfQorCitz dGF0aWMgdm9pZAordGVzdF9vYV9leHBvbmVudHMoaW50IGd0X2ZyZXFfbWh6KQoreworCS8qIFRo aXMgdGVzdCB0cmllcyB0byB1c2UgdGhlIHN5c2ZzIGludGVyZmFjZSBmb3IgcGlubmluZyB0aGUg R1QKKwkgKiBmcmVxdWVuY3kgc28gd2UgaGF2ZSBhbm90aGVyIHBvaW50IG9mIHJlZmVyZW5jZSBm b3IgY29tcGFyaW5nIHdpdGgKKwkgKiB0aGUgY2xvY2sgZnJlcXVlbmN5IGFzIGRlcml2ZWQgZnJv bSBPQSByZXBvcnRzLgorCSAqCisJICogVGhpcyB0ZXN0IGhhcyBiZWVuIGZpbmlja3kgdG8gc3Rh YmlsaXNlIHdoaWxlIHRoZQorCSAqIGd0X21pbi9tYXhfZnJlcV9taHogZmlsZXMgaW4gc3lzZnMg ZG9uJ3Qgc2VlbSB0byBiZSBhIHJlbGlhYmxlCisJICogbWVjaGFuaXNtIGZvciBmaXhpbmcgdGhl IGdwdSBmcmVxdWVuY3kuCisJICoKKwkgKiBTaW5jZSB0aGVzZSB1bml0IHRlc3RzIGFyZSBmb2N1 c2VkIG9uIHRoZSBPQSB1bml0IG5vdCB0aGUgYWJpbGl0eSB0bworCSAqIHBpbiB0aGUgZnJlcXVl bmN5IHZpYSBzeXNmcyB3ZSBtYWtlIHRoZSB0ZXN0IGFjY291bnQgZm9yIHBpbm5pbmcgbm90CisJ ICogYmVpbmcgcmVsaWFibGUgYW5kIHJlYWQgYmFjayB0aGUgY3VycmVudCBmcmVxdWVuY3kgZm9y IGVhY2gKKwkgKiBpdGVyYXRpb24gb2YgdGhpcyB0ZXN0IHRvIHRha2UgdGhpcyBpbnRvIGFjY291 bnQuCisJICovCisJZ3RfZnJlcXVlbmN5X3BpbihndF9mcmVxX21oeik7CisKKwlpZ3RfZGVidWco IlRlc3RpbmcgT0EgdGltZXIgZXhwb25lbnRzIHdpdGggcmVxdWVzdGVkIEdUIGZyZXF1ZW5jeSA9 ICVkbWh6XG4iLAorCQkgIGd0X2ZyZXFfbWh6KTsKKworCS8qIEl0J3MgYXNraW5nIGEgbG90IHRv IHNhbXBsZSB3aXRoIGEgMTYwIG5hbm9zZWNvbmQgcGVyaW9kIGFuZCB0aGUKKwkgKiB0ZXN0IGNh biBmYWlsIGR1ZSB0byBidWZmZXIgb3ZlcmZsb3dzIGlmIGl0IHdhc24ndCBwb3NzaWJsZSB0bwor CSAqIGtlZXAgdXAsIHNvIHdlIGRvbid0IHN0YXJ0IGZyb20gYW4gZXhwb25lbnQgb2YgemVyby4u LgorCSAqLworCWZvciAoaW50IGkgPSAyOyBpIDwgMjA7IGkrKykgeworCQl1aW50MzJfdCBleHBl Y3RlZF90aW1lc3RhbXBfZGVsdGE7CisJCXVpbnQzMl90IHRpbWVzdGFtcF9kZWx0YTsKKwkJdWlu dDMyX3Qgb2FfcmVwb3J0MFs2NF07CisJCXVpbnQzMl90IG9hX3JlcG9ydDFbNjRdOworCQl1aW50 MzJfdCAqYzAsICpjMTsKKwkJdWludDMyX3QgdGltZV9kZWx0YTsKKwkJdWludDMyX3QgY2xvY2tf ZGVsdGE7CisJCXVpbnQzMl90IGZyZXE7CisJCWludCBuX3Rlc3RlZCA9IDA7CisJCWludCBuX2Zy ZXFfbWF0Y2hlcyA9IDA7CisKKwkJLyogVGhlIGV4cG9uZW50IGlzIGVmZmVjdGl2ZWx5IHNlbGVj dGluZyBhIGJpdCBpbiB0aGUgdGltZXN0YW1wCisJCSAqIHRvIHRyaWdnZXIgcmVwb3J0cyBvbiBh bmQgc28gaW4gcHJhY3RpY2Ugd2UgZXhwZWN0IHRoZSByYXcKKwkJICogdGltZXN0YW1wIGRlbHRh cyBmb3IgcGVyaW9kaWMgcmVwb3J0cyB0byBleGFjdGx5IG1hdGNoIHRoZQorCQkgKiB2YWx1ZSBv ZiBuZXh0IGJpdC4KKwkJICovCisJCWV4cGVjdGVkX3RpbWVzdGFtcF9kZWx0YSA9IDIgPDwgaTsK KworCQlmb3IgKGludCBqID0gMDsgbl90ZXN0ZWQgPCAxMCAmJiBqIDwgMTAwOyBqKyspIHsKKwkJ CWludCBndF9mcmVxX21oel8wLCBndF9mcmVxX21oel8xOworCQkJaW50IGNfb2ZmOworCisJCQln dF9mcmVxX21oel8wID0gc3lzZnNfcmVhZCgiZ3RfYWN0X2ZyZXFfbWh6Iik7CisKKwkJCWlndF9k ZWJ1ZygiSVRFUiAlZDogdGVzdGluZyBPQSBleHBvbmVudCAlZCB3aXRoIHN5c2ZzIEdUIGZyZXEg PSAlZG1oelxuIiwKKwkJCQkgIGosIGksIGd0X2ZyZXFfbWh6XzApOworCisJCQlvcGVuX2FuZF9y ZWFkXzJfb2FfcmVwb3J0cyhJOTE1X09BX0ZPUk1BVF9BNDVfQjhfQzgsCisJCQkJCQkgICBpLCAv KiBleHBvbmVudCAqLworCQkJCQkJICAgb2FfcmVwb3J0MCwKKwkJCQkJCSAgIG9hX3JlcG9ydDEs CisJCQkJCQkgICB0cnVlKTsgLyogdGltZXIgdHJpZ2dlcmVkCisJCQkJCQkJICAgICByZXBvcnRz IG9ubHkgKi8KKworCQkJZ3RfZnJlcV9taHpfMSA9IHN5c2ZzX3JlYWQoImd0X2FjdF9mcmVxX21o eiIpOworCisJCQkvKiBJZiBpdCBsb29rcyBsaWtlIHRoZSBmcmVxdWVuY3kgaGFzIGNoYW5nZWQg YWNjb3JkaW5nCisJCQkgKiB0byBzeXNmcyB0aGVuIHNraXAgbG9va2luZyBhdCB0aGlzIHBhaXIg b2YgcmVwb3J0cworCQkJICovCisJCQlpZiAoZ3RfZnJlcV9taHpfMCAhPSBndF9mcmVxX21oel8x KSB7CisJCQkJaWd0X2RlYnVnKCJza2lwcGluZyBPQSByZXBvcnRzIHBhaXIgZHVlIHRvIEdUIGZy ZXF1ZW5jeSBjaGFuZ2UgYWNjb3JkaW5nIHRvIHN5c2ZzXG4iKTsKKwkJCQljb250aW51ZTsKKwkJ CX0KKworCQkJdGltZXN0YW1wX2RlbHRhID0gb2FfcmVwb3J0MVsxXSAtIG9hX3JlcG9ydDBbMV07 CisJCQlpZ3RfYXNzZXJ0X25lcSh0aW1lc3RhbXBfZGVsdGEsIDApOworCisJCQlpZiAodGltZXN0 YW1wX2RlbHRhICE9IGV4cGVjdGVkX3RpbWVzdGFtcF9kZWx0YSkgeworCQkJCWlndF9kZWJ1Zygi dGltZXN0YW1wMCA9ICV1LzB4JXhcbiIsCisJCQkJCSAgb2FfcmVwb3J0MFsxXSwgb2FfcmVwb3J0 MFsxXSk7CisJCQkJaWd0X2RlYnVnKCJ0aW1lc3RhbXAxID0gJXUvMHgleFxuIiwKKwkJCQkJICBv YV9yZXBvcnQxWzFdLCBvYV9yZXBvcnQxWzFdKTsKKwkJCX0KKworCQkJaWd0X2Fzc2VydF9lcSh0 aW1lc3RhbXBfZGVsdGEsIGV4cGVjdGVkX3RpbWVzdGFtcF9kZWx0YSk7CisKKwkJCS8qIE5COiBm b3IgdGhlIHJlbmRlciBiYXNpYyBtZXRyaWMgc2V0IG9wZW5lZCBhYm92ZSBieQorCQkJICogb3Bl bl9hbmRfcmVhZF8yX29hX3JlcG9ydHMoKSwgdGhlIEMyIGNvdW50ZXIgaXMKKwkJCSAqIGNvbmZp Z3VyZWQgYXMgdGhlIGdwdSBjbG9jayBjb3VudGVyLi4uCisJCQkgKi8KKwkJCWNfb2ZmID0gb2Ff Zm9ybWF0c1tJOTE1X09BX0ZPUk1BVF9BNDVfQjhfQzhdLmNfb2ZmOworCQkJaWd0X2Fzc2VydChj X29mZik7CisJCQljMCA9ICh1aW50MzJfdCAqKSgoKHVpbnQ4X3QgKilvYV9yZXBvcnQwKSArIGNf b2ZmKTsKKwkJCWMxID0gKHVpbnQzMl90ICopKCgodWludDhfdCAqKW9hX3JlcG9ydDEpICsgY19v ZmYpOworCQkJY2xvY2tfZGVsdGEgPSBjMVsyXSAtIGMwWzJdOworCisJCQl0aW1lX2RlbHRhID0g dGltZWJhc2Vfc2NhbGUodGltZXN0YW1wX2RlbHRhKTsKKworCQkJZnJlcSA9ICgodWludDY0X3Qp Y2xvY2tfZGVsdGEgKiAxMDAwKSAvIHRpbWVfZGVsdGE7CisJCQlpZ3RfZGVidWcoIklURVIgJWQ6 IHRpbWUgZGVsdGEgPSAlIlBSSXUzMiIobnMpIGNsb2NrIGRlbHRhID0gJSJQUkl1MzIiIGZyZXEg PSAlIlBSSXUzMiIobWh6KVxuIiwKKwkJCQkgIGosIHRpbWVfZGVsdGEsIGNsb2NrX2RlbHRhLCBm cmVxKTsKKworCQkJaWYgKGZyZXEgPT0gZ3RfZnJlcV9taHpfMSkKKwkJCQluX2ZyZXFfbWF0Y2hl cysrOworCisJCQluX3Rlc3RlZCsrOworCQl9CisKKwkJaWYgKG5fdGVzdGVkIDwgMTApCisJCQlp Z3RfZGVidWcoInN5c2ZzIGZyZXF1ZW5jeSBwaW5uaW5nIHRvbyB1bnN0YWJsZSBmb3IgY3Jvc3Mt cmVmZXJlbmNpbmcgd2l0aCBPQSBkZXJpdmVkIGZyZXF1ZW5jeSIpOworCQlpZ3RfYXNzZXJ0X2Vx KG5fdGVzdGVkLCAxMCk7CisKKwkJaWd0X2RlYnVnKCJudW1iZXIgb2YgaXRlcmF0aW9ucyB3aXRo IGV4cGVjdGVkIGNsb2NrIGZyZXF1ZW5jeSA9ICVkXG4iLAorCQkJICBuX2ZyZXFfbWF0Y2hlcyk7 CisKKwkJLyogRG9uJ3QgYXNzZXJ0IHRoZSBjYWxjdWxhdGVkIGZyZXF1ZW5jeSBmb3IgZXh0cmVt ZWx5IHNob3J0CisJCSAqIGR1cmF0aW9ucy4KKwkJICoKKwkJICogQWxsb3cgc29tZSBtaXNtYXRj aGVzIHNpbmNlIGNhbid0IGJlIGNhbid0IGJlIHN1cmUgYWJvdXQKKwkJICogZnJlcXVlbmN5IGNo YW5nZXMgYmV0d2VlbiBzeXNmcyByZWFkcy4KKwkJICovCisJCWlmIChpID4gMykKKwkJCWlndF9h c3NlcnQobl9mcmVxX21hdGNoZXMgPj0gNyk7CisJfQorCisJZ3RfZnJlcXVlbmN5X3JhbmdlX3Jl c3RvcmUoKTsKK30KKworLyogVGhlIE9BIGV4cG9uZW50IHNlbGVjdHMgYSB0aW1lc3RhbXAgY291 bnRlciBiaXQgdG8gdHJpZ2dlciByZXBvcnRzIG9uLgorICoKKyAqIFdpdGggYSA2NGJpdCB0aW1l c3RhbXAgYW5kIGxlYXN0IHNpZ25pZmljYW50IGJpdCBhcHByb3ggPT0gODBucyB0aGVuIHRoZSBN U0IKKyAqIGVxdWF0ZXMgdG8gPiA0MCB0aG91c2FuZCB5ZWFycyBhbmQgaXNuJ3QgZXhwb3NlZCB2 aWEgdGhlIGk5MTUgcGVyZiBpbnRlcmZhY2UuCisgKgorICogVGhlIG1heCBleHBvbmVudCBleHBv c2VkIGlzIGV4cGVjdGVkIHRvIGJlIDMxLCB3aGljaCBpcyBzdGlsbCBhIGZhaXJseQorICogcmlk aWN1bG91cyBwZXJpb2QgKD41bWluKSBidXQgaXMgdGhlIG1heGltdW0gZXhwb25lbnQgd2hlcmUg aXQncyBzdGlsbAorICogcG9zc2libGUgdG8gdXNlIHBlcmlvZGljIHNhbXBsaW5nIGFzIGEgbWVh bnMgZm9yIHRyYWNraW5nIHRoZSBvdmVyZmxvdyBvZgorICogMzJiaXQgT0EgcmVwb3J0IHRpbWVz dGFtcHMuCisgKi8KK3N0YXRpYyB2b2lkCit0ZXN0X2ludmFsaWRfb2FfZXhwb25lbnQodm9pZCkK K3sKKwl1aW50NjRfdCBwcm9wZXJ0aWVzW10gPSB7CisJCS8qIEluY2x1ZGUgT0EgcmVwb3J0cyBp biBzYW1wbGVzICovCisJCURSTV9JOTE1X1BFUkZfUFJPUF9TQU1QTEVfT0EsIHRydWUsCisKKwkJ LyogT0EgdW5pdCBjb25maWd1cmF0aW9uICovCisJCURSTV9JOTE1X1BFUkZfUFJPUF9PQV9NRVRS SUNTX1NFVCwgaHN3X3JlbmRlcl9iYXNpY19pZCwKKwkJRFJNX0k5MTVfUEVSRl9QUk9QX09BX0ZP Uk1BVCwgSTkxNV9PQV9GT1JNQVRfQTQ1X0I4X0M4LAorCQlEUk1fSTkxNV9QRVJGX1BST1BfT0Ff RVhQT05FTlQsIDMxLCAvKiBtYXhpbXVtIGV4cG9uZW50IGV4cGVjdGVkCisJCQkJCQkgICAgICAg dG8gYmUgYWNjZXB0ZWQgKi8KKwl9OworCXN0cnVjdCBkcm1faTkxNV9wZXJmX29wZW5fcGFyYW0g cGFyYW0gPSB7CisJCS5mbGFncyA9IEk5MTVfUEVSRl9GTEFHX0ZEX0NMT0VYRUMsCisJCS5udW1f cHJvcGVydGllcyA9IHNpemVvZihwcm9wZXJ0aWVzKSAvIDE2LAorCQkucHJvcGVydGllc19wdHIg PSAodWludDY0X3QpcHJvcGVydGllcywKKwl9OworCWludCBzdHJlYW1fZmQgPSBfX3BlcmZfb3Bl bihkcm1fZmQsICZwYXJhbSk7CisKKwljbG9zZShzdHJlYW1fZmQpOworCisJZm9yIChpbnQgaSA9 IDMyOyBpIDwgNjU7IGkrKykgeworCQlwcm9wZXJ0aWVzWzddID0gaTsKKwkJZG9faW9jdGxfZXJy KGRybV9mZCwgRFJNX0lPQ1RMX0k5MTVfUEVSRl9PUEVOLCAmcGFyYW0sIEVJTlZBTCk7CisJfQor fQorCisvKiBSZXR1cm4gdGhlIGxhcmdlc3QgT0EgZXhwb25lbnQgdGhhdCB3aWxsIHN0aWxsIHJl c3VsdCBpbiBhIHNhbXBsaW5nCisgKiBmcmVxdWVuY3kgaGlnaGVyIHRoYW4gdGhlIGdpdmVuIGZy ZXF1ZW5jeS4KKyAqLworc3RhdGljIGludAorbWF4X29hX2V4cG9uZW50X2Zvcl9oaWdoZXJfZnJl cSh1aW50NjRfdCBmcmVxKQoreworCS8qIE5COiB0aW1lYmFzZV9zY2FsZSgpIHRha2VzIGEgdWlu dDMyX3QgYW5kIGFuIGV4cG9uZW50IG9mIDMwCisJICogd291bGQgYWxyZWFkeSByZXByZXNlbnQg YSBwZXJpb2Qgb2YgfjMgbWludXRlcyBzbyB0aGVyZSdzCisJICogcmVhbGx5IG5vIG5lZWQgdG8g Y29uc2lkZXIgaGlnaGVyIGV4cG9uZW50cy4KKwkgKi8KKwlmb3IgKGludCBpID0gMDsgaSA8IDMw OyBpKyspIHsKKwkJdWludDY0X3Qgb2FfcGVyaW9kID0gdGltZWJhc2Vfc2NhbGUoMiA8PCBpKTsK KwkJdWludDMyX3Qgb2FfZnJlcSA9IE5TRUNfUEVSX1NFQyAvIG9hX3BlcmlvZDsKKworCQlpZiAo b2FfZnJlcSA8PSBmcmVxKQorCQkJcmV0dXJuIG1heCgwLCBpIC0gMSk7CisJfQorCisJaWd0X2Fz c2VydCghInJlYWNoZWQiKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qIFRoZSBsb3dlc3QgcGVyaW9k aWMgc2FtcGxpbmcgZXhwb25lbnQgZXF1YXRlcyB0byBhIHBlcmlvZCBvZiAxNjAgbmFub3NlY29u ZHMKKyAqIG9yIGEgZnJlcXVlbmN5IG9mIDYuMjVNSHogd2hpY2ggaXMgb25seSBwb3NzaWJsZSB0 byByZXF1ZXN0IGFzIHJvb3QgYnkKKyAqIGRlZmF1bHQuIEJ5IGRlZmF1bHQgdGhlIG1heGltdW0g T0Egc2FtcGxpbmcgcmF0ZSBpcyAxMDBLSHoKKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfbG93X29h X2V4cG9uZW50X3Blcm1pc3Npb25zKHZvaWQpCit7CisJaW50IG1heF9mcmVxID0gcmVhZF91NjRf ZmlsZSgiL3Byb2Mvc3lzL2Rldi9pOTE1L29hX21heF9zYW1wbGVfcmF0ZSIpOworCWludCBiYWRf ZXhwb25lbnQgPSBtYXhfb2FfZXhwb25lbnRfZm9yX2hpZ2hlcl9mcmVxKG1heF9mcmVxKTsKKwlp bnQgb2tfZXhwb25lbnQgPSBiYWRfZXhwb25lbnQgKyAxOworCXVpbnQ2NF90IHByb3BlcnRpZXNb XSA9IHsKKwkJLyogSW5jbHVkZSBPQSByZXBvcnRzIGluIHNhbXBsZXMgKi8KKwkJRFJNX0k5MTVf UEVSRl9QUk9QX1NBTVBMRV9PQSwgdHJ1ZSwKKworCQkvKiBPQSB1bml0IGNvbmZpZ3VyYXRpb24g Ki8KKwkJRFJNX0k5MTVfUEVSRl9QUk9QX09BX01FVFJJQ1NfU0VULCBoc3dfcmVuZGVyX2Jhc2lj X2lkLAorCQlEUk1fSTkxNV9QRVJGX1BST1BfT0FfRk9STUFULCBJOTE1X09BX0ZPUk1BVF9BNDVf QjhfQzgsCisJCURSTV9JOTE1X1BFUkZfUFJPUF9PQV9FWFBPTkVOVCwgYmFkX2V4cG9uZW50LAor CX07CisJc3RydWN0IGRybV9pOTE1X3BlcmZfb3Blbl9wYXJhbSBwYXJhbSA9IHsKKwkJLmZsYWdz ID0gSTkxNV9QRVJGX0ZMQUdfRkRfQ0xPRVhFQywKKwkJLm51bV9wcm9wZXJ0aWVzID0gc2l6ZW9m KHByb3BlcnRpZXMpIC8gMTYsCisJCS5wcm9wZXJ0aWVzX3B0ciA9ICh1aW50NjRfdClwcm9wZXJ0 aWVzLAorCX07CisJdWludDY0X3Qgb2FfcGVyaW9kLCBvYV9mcmVxOworCisJaWd0X2Fzc2VydF9l cShtYXhfZnJlcSwgMTAwMDAwKTsKKworCS8qIEF2b2lkIEVBQ0NFUyBlcnJvcnMgb3BlbmluZyBh IHN0cmVhbSB3aXRob3V0IENBUF9TWVNfQURNSU4gKi8KKwl3cml0ZV91NjRfZmlsZSgiL3Byb2Mv c3lzL2Rldi9pOTE1L3BlcmZfc3RyZWFtX3BhcmFub2lkIiwgMCk7CisKKwlpZ3RfZm9yayhjaGls ZCwgMSkgeworCQlpZ3RfZHJvcF9yb290KCk7CisKKwkJZG9faW9jdGxfZXJyKGRybV9mZCwgRFJN X0lPQ1RMX0k5MTVfUEVSRl9PUEVOLCAmcGFyYW0sIEVBQ0NFUyk7CisJfQorCisJaWd0X3dhaXRj aGlsZHJlbigpOworCisJcHJvcGVydGllc1s3XSA9IG9rX2V4cG9uZW50OworCisJaWd0X2Zvcmso Y2hpbGQsIDEpIHsKKwkJaW50IHN0cmVhbV9mZDsKKworCQlpZ3RfZHJvcF9yb290KCk7CisKKwkJ c3RyZWFtX2ZkID0gX19wZXJmX29wZW4oZHJtX2ZkLCAmcGFyYW0pOworCQljbG9zZShzdHJlYW1f ZmQpOworCX0KKworCWlndF93YWl0Y2hpbGRyZW4oKTsKKworCW9hX3BlcmlvZCA9IHRpbWViYXNl X3NjYWxlKDIgPDwgb2tfZXhwb25lbnQpOworCW9hX2ZyZXEgPSBOU0VDX1BFUl9TRUMgLyBvYV9w ZXJpb2Q7CisJd3JpdGVfdTY0X2ZpbGUoIi9wcm9jL3N5cy9kZXYvaTkxNS9vYV9tYXhfc2FtcGxl X3JhdGUiLCBvYV9mcmVxIC0gMTAwKTsKKworCWlndF9mb3JrKGNoaWxkLCAxKSB7CisJCWlndF9k cm9wX3Jvb3QoKTsKKworCQlkb19pb2N0bF9lcnIoZHJtX2ZkLCBEUk1fSU9DVExfSTkxNV9QRVJG X09QRU4sICZwYXJhbSwgRUFDQ0VTKTsKKwl9CisKKwlpZ3Rfd2FpdGNoaWxkcmVuKCk7CisKKwkv KiByZXN0b3JlIHRoZSBkZWZhdWx0cyAqLworCXdyaXRlX3U2NF9maWxlKCIvcHJvYy9zeXMvZGV2 L2k5MTUvb2FfbWF4X3NhbXBsZV9yYXRlIiwgMTAwMDAwKTsKKwl3cml0ZV91NjRfZmlsZSgiL3By b2Mvc3lzL2Rldi9pOTE1L3BlcmZfc3RyZWFtX3BhcmFub2lkIiwgMSk7Cit9CisKK3N0YXRpYyB2 b2lkCit0ZXN0X3Blcl9jb250ZXh0X21vZGVfdW5wcml2aWxlZ2VkKHZvaWQpCit7CisJdWludDY0 X3QgcHJvcGVydGllc1tdID0geworCQkvKiBTaW5nbGUgY29udGV4dCBzYW1wbGluZyAqLworCQlE Uk1fSTkxNV9QRVJGX1BST1BfQ1RYX0hBTkRMRSwgVUlOVDY0X01BWCwgLyogdXBkYXRlZCBiZWxv dyAqLworCisJCS8qIEluY2x1ZGUgT0EgcmVwb3J0cyBpbiBzYW1wbGVzICovCisJCURSTV9JOTE1 X1BFUkZfUFJPUF9TQU1QTEVfT0EsIHRydWUsCisKKwkJLyogT0EgdW5pdCBjb25maWd1cmF0aW9u ICovCisJCURSTV9JOTE1X1BFUkZfUFJPUF9PQV9NRVRSSUNTX1NFVCwgaHN3X3JlbmRlcl9iYXNp Y19pZCwKKwkJRFJNX0k5MTVfUEVSRl9QUk9QX09BX0ZPUk1BVCwgSTkxNV9PQV9GT1JNQVRfQTQ1 X0I4X0M4LAorCQlEUk1fSTkxNV9QRVJGX1BST1BfT0FfRVhQT05FTlQsIDEzLCAvKiAxIG1pbGxp c2Vjb25kICovCisJfTsKKwlzdHJ1Y3QgZHJtX2k5MTVfcGVyZl9vcGVuX3BhcmFtIHBhcmFtID0g eworCQkuZmxhZ3MgPSBJOTE1X1BFUkZfRkxBR19GRF9DTE9FWEVDLAorCQkubnVtX3Byb3BlcnRp ZXMgPSBzaXplb2YocHJvcGVydGllcykgLyAxNiwKKwkJLnByb3BlcnRpZXNfcHRyID0gKHVpbnQ2 NF90KXByb3BlcnRpZXMsCisJfTsKKworCS8qIHNob3VsZCBiZSBkZWZhdWx0LCBidXQganVzdCB0 byBiZSBzdXJlLi4uICovCisJd3JpdGVfdTY0X2ZpbGUoIi9wcm9jL3N5cy9kZXYvaTkxNS9wZXJm X3N0cmVhbV9wYXJhbm9pZCIsIDEpOworCisJaWd0X2ZvcmsoY2hpbGQsIDEpIHsKKwkJZHJtX2lu dGVsX2NvbnRleHQgKmNvbnRleHQ7CisJCWRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1ncjsKKwkJaW50 IHN0cmVhbV9mZDsKKworCQlpZ3RfZHJvcF9yb290KCk7CisKKwkJYnVmbWdyID0gZHJtX2ludGVs X2J1Zm1ncl9nZW1faW5pdChkcm1fZmQsIDQwOTYpOworCQljb250ZXh0ID0gZHJtX2ludGVsX2dl bV9jb250ZXh0X2NyZWF0ZShidWZtZ3IpOworCisJCWlndF9hc3NlcnQoY29udGV4dCk7CisKKwkJ cHJvcGVydGllc1sxXSA9IGRybV9pbnRlbF9nZW1fY29udGV4dF9nZXRfY29udGV4dF9pZChjb250 ZXh0KTsKKworCQlzdHJlYW1fZmQgPSBfX3BlcmZfb3Blbihkcm1fZmQsICZwYXJhbSk7CisJCWNs b3NlKHN0cmVhbV9mZCk7CisKKwkJZHJtX2ludGVsX2dlbV9jb250ZXh0X2Rlc3Ryb3koY29udGV4 dCk7CisJCWRybV9pbnRlbF9idWZtZ3JfZGVzdHJveShidWZtZ3IpOworCX0KKworCWlndF93YWl0 Y2hpbGRyZW4oKTsKK30KKworc3RhdGljIGludDY0X3QKK2dldF90aW1lKHZvaWQpCit7CisJc3Ry dWN0IHRpbWVzcGVjIHRzOworCisJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cyk7 CisKKwlyZXR1cm4gdHMudHZfc2VjICogMTAwMDAwMDAwMCArIHRzLnR2X25zZWM7Cit9CisKKy8q IE5vdGU6IFRoZSBpbnRlcmZhY2UgZG9lc24ndCBjdXJyZW50bHkgcHJvdmlkZSBzdHJpY3QgZ3Vh cmFudGVlcyBvciBjb250cm9sCisgKiBvdmVyIHRoZSB1cHBlciBib3VuZCBmb3IgaG93IGxvbmcg aXQgbWlnaHQgdGFrZSBmb3IgYSBQT0xMSU4gZXZlbnQgYWZ0ZXIKKyAqIHNvbWUgT0EgcmVwb3J0 IGlzIHdyaXR0ZW4gYnkgdGhlIE9BIHVuaXQuCisgKgorICogVGhlIHBsYW4gaXMgdG8gYWRkIGEg cHJvcGVydHkgbGF0ZXIgdGhhdCBnaXZlcyBzb21lIGNvbnRyb2wgb3ZlciB0aGUgbWF4aW11bQor ICogbGF0ZW5jeSwgYnV0IGZvciBub3cgd2UgZXhwZWN0IGl0IGlzIHR1bmVkIGZvciBhIGZhaXJs eSBsb3cgbGF0ZW5jeQorICogc3VpdGFibGUgZm9yIGFwcGxpY2F0aW9ucyB3YW50aW5nIHRvIHBy b3ZpZGUgbGl2ZSBmZWVkYmFjayBmb3IgY2FwdHVyZWQKKyAqIG1ldHJpY3MuCisgKgorICogQXQg dGhlIHRpbWUgb2Ygd3JpdGluZyB0aGlzIHRlc3QgdGhlIGRyaXZlciB3YXMgdXNpbmcgYSBmaXhl ZCAyMDBIeiBocnRpbWVyCisgKiByZWdhcmRsZXNzIG9mIHRoZSBPQSBzYW1wbGluZyBleHBvbmVu dC4KKyAqCisgKiBUaGVyZSBpcyBubyBsb3dlciBib3VuZCBzaW5jZSBhIHN0cmVhbSBjb25maWd1 cmVkIGZvciBwZXJpb2RpYyBzYW1wbGluZyBtYXkKKyAqIHN0aWxsIGNvbnRhaW4gb3RoZXIgYXV0 b21hdGljYWxseSB0cmlnZ2VyZWQgcmVwb3J0cy4KKyAqCisgKiBXaGF0IHdlIHRyeSBhbmQgY2hl Y2sgZm9yIGhlcmUgaXMgdGhhdCBibG9ja2luZyByZWFkcyBkb24ndCByZXR1cm4gRUFHQUlOCisg KiBhbmQgdGhhdCB3ZSBhcmVuJ3Qgc3BlbmRpbmcgYW55IHNpZ25pZmljYW50IHRpbWUgYnVybmlu ZyB0aGUgY3B1IGluCisgKiBrZXJuZWxzcGFjZS4KKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfYmxv Y2tpbmcodm9pZCkKK3sKKwkvKiA0MCBtaWxsaXNlY29uZHMKKwkgKgorCSAqIEhhdmluZyBhIHBl cmlvZCBzb21ld2hhdCA+IHN5c2NvbmYoX1NDX0NMS19UQ0spIGhlbHBzIHRvIHN0b3AKKwkgKiBz Y2hlZHVsaW5nIChsaWFibGUgdG8ga2ljayBpbiB3aGVuIHdlIG1ha2UgYmxvY2tpbmcgcG9sbCgp cy9yZWFkcykKKwkgKiBmcm9tIGludGVyZmVyaW5nIHdpdGggdGhlIHRlc3QuCisJICovCisJaW50 IG9hX2V4cG9uZW50ID0gMTg7CisJdWludDY0X3QgcHJvcGVydGllc1tdID0geworCQkvKiBJbmNs dWRlIE9BIHJlcG9ydHMgaW4gc2FtcGxlcyAqLworCQlEUk1fSTkxNV9QRVJGX1BST1BfU0FNUExF X09BLCB0cnVlLAorCisJCS8qIE9BIHVuaXQgY29uZmlndXJhdGlvbiAqLworCQlEUk1fSTkxNV9Q RVJGX1BST1BfT0FfTUVUUklDU19TRVQsIGhzd19yZW5kZXJfYmFzaWNfaWQsCisJCURSTV9JOTE1 X1BFUkZfUFJPUF9PQV9GT1JNQVQsIEk5MTVfT0FfRk9STUFUX0E0NV9COF9DOCwKKwkJRFJNX0k5 MTVfUEVSRl9QUk9QX09BX0VYUE9ORU5ULCBvYV9leHBvbmVudCwKKwl9OworCXN0cnVjdCBkcm1f aTkxNV9wZXJmX29wZW5fcGFyYW0gcGFyYW0gPSB7CisJCS5mbGFncyA9IEk5MTVfUEVSRl9GTEFH X0ZEX0NMT0VYRUMsCisJCS5udW1fcHJvcGVydGllcyA9IHNpemVvZihwcm9wZXJ0aWVzKSAvIDE2 LAorCQkucHJvcGVydGllc19wdHIgPSAodWludDY0X3QpcHJvcGVydGllcywKKwl9OworCWludCBz dHJlYW1fZmQgPSBfX3BlcmZfb3Blbihkcm1fZmQsICZwYXJhbSk7CisJdWludDhfdCBidWZbMTAy NCAqIDEwMjRdOworCXN0cnVjdCB0bXMgc3RhcnRfdGltZXM7CisJc3RydWN0IHRtcyBlbmRfdGlt ZXM7CisJaW50NjRfdCB1c2VyX25zLCBrZXJuZWxfbnM7CisJaW50NjRfdCB0aWNrX25zID0gMTAw MDAwMDAwMCAvIHN5c2NvbmYoX1NDX0NMS19UQ0spOworCWludDY0X3Qgc3RhcnQ7CisJaW50IG4g PSAwOworCisJdGltZXMoJnN0YXJ0X3RpbWVzKTsKKworCS8qIExvb3AgZm9yIDYwMG1zIHBlcmZv cm1pbmcgYmxvY2tpbmcgcmVhZHMgd2hpbGUgdGhlIEhXIGlzIHNhbXBsaW5nIGF0CisJICogfjI1 SHosIHdpdGggdGhlIGV4cGVjdGF0aW9uIHRoYXQgd2Ugc3BlbmQgbW9zdCBvZiBvdXIgdGltZSBi bG9ja2VkCisJICogaW4gdGhlIGtlcm5lbCwgYW5kIHNob3VsZG4ndCBiZSBidXJuaW5nIGNwdSBj eWNsZXMgaW4gdGhlIGtlcm5lbCBpbgorCSAqIGFzc29jaWF0aW9uIHdpdGggdGhpcyBwcm9jZXNz ICh2ZXJpZmllZCBieSBsb29raW5nIGF0IHN0aW1lIGJlZm9yZQorCSAqIGFuZCBhZnRlciBsb29w KS4KKwkgKi8KKwlmb3IgKHN0YXJ0ID0gZ2V0X3RpbWUoKTsgKGdldF90aW1lKCkgLSBzdGFydCkg PCA2MDAwMDAwMDA7IC8qIG5vcCAqLykgeworCQlpbnQgcmV0OworCisJCXdoaWxlICgocmV0ID0g cmVhZChzdHJlYW1fZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSA8IDAgJiYKKwkJICAgICAgIGVycm5v ID09IEVJTlRSKQorCQkJOworCisJCWlndF9hc3NlcnQocmV0ID4gMCk7CisKKwkJbisrOworCX0K KworCXRpbWVzKCZlbmRfdGltZXMpOworCisJLyogVXNpbmcgbmFub3NlY29uZCB1bml0cyBpcyBm YWlybHkgc2lsbHkgaGVyZSwgZ2l2ZW4gdGhlIHRpY2sgaW4tCisJICogcHJlY2lzaW9uIC0gYWgg d2VsbCwgaXQncyBjb25zaXN0ZW50IHdpdGggdGhlIGdldF90aW1lKCkgdW5pdHMuCisJICovCisJ dXNlcl9ucyA9IChlbmRfdGltZXMudG1zX3V0aW1lIC0gc3RhcnRfdGltZXMudG1zX3V0aW1lKSAq IHRpY2tfbnM7CisJa2VybmVsX25zID0gKGVuZF90aW1lcy50bXNfc3RpbWUgLSBzdGFydF90aW1l cy50bXNfc3RpbWUpICogdGlja19uczsKKworCWlndF9kZWJ1ZygiJWQgYmxvY2tpbmcgcmVhZHMg aW4gNTAwIG1pbGxpc2Vjb25kcywgd2l0aCAxS0h6IE9BIHNhbXBsaW5nXG4iLCBuKTsKKwlpZ3Rf ZGVidWcoInRpbWUgaW4gdXNlcnNwYWNlID0gJSJQUkl1NjQibnMgKHN0YXJ0IHV0aW1lID0gJWQs IGVuZCA9ICVkLCBucyB0aWNrcyBwZXIgc2VjID0gJWQpXG4iLAorCQkgIHVzZXJfbnMsIChpbnQp c3RhcnRfdGltZXMudG1zX3V0aW1lLCAoaW50KWVuZF90aW1lcy50bXNfdXRpbWUsIChpbnQpdGlj a19ucyk7CisJaWd0X2RlYnVnKCJ0aW1lIGluIGtlcm5lbHNwYWNlID0gJSJQUkl1NjQibnMgKHN0 YXJ0IHN0aW1lID0gJWQsIGVuZCA9ICVkLCBucyB0aWNrcyBwZXIgc2VjID0gJWQpXG4iLAorCQkg IGtlcm5lbF9ucywgKGludClzdGFydF90aW1lcy50bXNfc3RpbWUsIChpbnQpZW5kX3RpbWVzLnRt c19zdGltZSwgKGludCl0aWNrX25zKTsKKworCS8qIFdpdGggY29tcGxldGVseSBicm9rZW4gYmxv Y2tpbmcgKGJ1dCBhbHNvIG5vdCByZXR1cm5pbmcgYW4gZXJyb3IpIHdlCisJICogY291bGQgZW5k IHVwIHdpdGggYW4gb3BlbiBsb29wLCBob3BlZnVsbHkgcmVjb2duaXNhYmxlIHdpdGggPiAxNQor CSAqICg2MDAvNDApaXRlcmF0aW9ucy4KKwkgKi8KKwlpZ3RfYXNzZXJ0KG4gPD0gMTUpOworCisJ LyogSXQncyBhIGJpdCB0cmlja3kgdG8gcHV0IGEgbG93ZXIgbGltaXQgaGVyZSwgYnV0IHdlIGV4 cGVjdCBhCisJICogcmVsYXRpdmVseSBsb3cgbGF0ZW5jeSBmb3Igc2VlaW5nIHJlcG9ydHMsIHdo aWxlIHdlIGRvbid0IGN1cnJlbnRseQorCSAqIGdpdmUgYW55IGNvbnRyb2wgb3ZlciB0aGlzIGlu IHRoZSBhcGkuCisJICoKKwkgKiBMaW1pdGVkIHRvIGEgNSBtaWxsaXNlY29uZCBsYXRlbmN5IGFu ZCA0NW1zICh3b3JzdCBjYXNlKQorCSAqIHBlci1pdGVyYXRpb24gdGhhdCBjb3VsZCBnaXZlIDEz LjMgaXRlcmF0aW9ucy4gUm91bmRpbmcgZ2l2ZXMgYSB0aW55CisJICogYml0IG1vcmUgbGF0ZW5j eSBzbGFjayAoNm1zKS4uLgorCSAqLworCWlndF9hc3NlcnQobiA+IDEzKTsKKworCS8qIEEgYml0 IHRyaWNreSB0byBwdXQgYSBudW1iZXIgb24gdGhpcywgYnV0IHdlIGRvbid0IGV4cGVjdCB0aGUg a2VybmVsCisJICogdG8gdXNlIGFueSBzaWduaWZpY2FudCBjcHUgd2hpbGUgd2FpdGluZyBhbmQg Z2l2ZW4gdGhlIGluIHByZWNpc2lvbgorCSAqIG9mIHN0aW1lIChtdWx0aXBsZSBvZiBDTEtfVENL KSB3ZSBleHBlY3QgdGhpcyB0byByb3VuZCB0byB6ZXJvLgorCSAqLworCWlndF9hc3NlcnRfZXEo a2VybmVsX25zLCAwKTsKKworCWNsb3NlKHN0cmVhbV9mZCk7Cit9CisKK3N0YXRpYyB2b2lkCit0 ZXN0X3BvbGxpbmcodm9pZCkKK3sKKwkvKiA0MCBtaWxsaXNlY29uZHMKKwkgKgorCSAqIEhhdmlu ZyBhIHBlcmlvZCBzb21ld2hhdCA+IHN5c2NvbmYoX1NDX0NMS19UQ0spIGhlbHBzIHRvIHN0b3AK KwkgKiBzY2hlZHVsaW5nIChsaWFibGUgdG8ga2ljayBpbiB3aGVuIHdlIG1ha2UgYmxvY2tpbmcg cG9sbCgpcy9yZWFkcykKKwkgKiBmcm9tIGludGVyZmVyaW5nIHdpdGggdGhlIHRlc3QuCisJICov CisJaW50IG9hX2V4cG9uZW50ID0gMTg7CisJdWludDY0X3QgcHJvcGVydGllc1tdID0geworCQkv KiBJbmNsdWRlIE9BIHJlcG9ydHMgaW4gc2FtcGxlcyAqLworCQlEUk1fSTkxNV9QRVJGX1BST1Bf U0FNUExFX09BLCB0cnVlLAorCisJCS8qIE9BIHVuaXQgY29uZmlndXJhdGlvbiAqLworCQlEUk1f STkxNV9QRVJGX1BST1BfT0FfTUVUUklDU19TRVQsIGhzd19yZW5kZXJfYmFzaWNfaWQsCisJCURS TV9JOTE1X1BFUkZfUFJPUF9PQV9GT1JNQVQsIEk5MTVfT0FfRk9STUFUX0E0NV9COF9DOCwKKwkJ RFJNX0k5MTVfUEVSRl9QUk9QX09BX0VYUE9ORU5ULCBvYV9leHBvbmVudCwKKwl9OworCXN0cnVj dCBkcm1faTkxNV9wZXJmX29wZW5fcGFyYW0gcGFyYW0gPSB7CisJCS5mbGFncyA9IEk5MTVfUEVS Rl9GTEFHX0ZEX0NMT0VYRUMgfAorCQkJSTkxNV9QRVJGX0ZMQUdfRkRfTk9OQkxPQ0ssCisJCS5u dW1fcHJvcGVydGllcyA9IHNpemVvZihwcm9wZXJ0aWVzKSAvIDE2LAorCQkucHJvcGVydGllc19w dHIgPSAodWludDY0X3QpcHJvcGVydGllcywKKwl9OworCWludCBzdHJlYW1fZmQgPSBfX3BlcmZf b3Blbihkcm1fZmQsICZwYXJhbSk7CisJdWludDhfdCBidWZbMTAyNCAqIDEwMjRdOworCXN0cnVj dCB0bXMgc3RhcnRfdGltZXM7CisJc3RydWN0IHRtcyBlbmRfdGltZXM7CisJaW50NjRfdCB1c2Vy X25zLCBrZXJuZWxfbnM7CisJaW50NjRfdCB0aWNrX25zID0gMTAwMDAwMDAwMCAvIHN5c2NvbmYo X1NDX0NMS19UQ0spOworCWludDY0X3Qgc3RhcnQ7CisJaW50IG4gPSAwOworCisJdGltZXMoJnN0 YXJ0X3RpbWVzKTsKKworCS8qIExvb3AgZm9yIDYwMG1zIHBlcmZvcm1pbmcgYmxvY2tpbmcgcG9s bHMgd2hpbGUgdGhlIEhXIGlzIHNhbXBsaW5nIGF0CisJICogfjI1SHosIHdpdGggdGhlIGV4cGVj dGF0aW9uIHRoYXQgd2Ugc3BlbmQgbW9zdCBvZiBvdXIgdGltZSBibG9ja2VkCisJICogaW4gdGhl IGtlcm5lbCwgYW5kIHNob3VsZG4ndCBiZSBidXJuaW5nIGNwdSBjeWNsZXMgaW4gdGhlIGtlcm5l bCBpbgorCSAqIGFzc29jaWF0aW9uIHdpdGggdGhpcyBwcm9jZXNzICh2ZXJpZmllZCBieSBsb29r aW5nIGF0IHN0aW1lIGJlZm9yZQorCSAqIGFuZCBhZnRlciBsb29wKS4KKwkgKi8KKwlmb3IgKHN0 YXJ0ID0gZ2V0X3RpbWUoKTsgKGdldF90aW1lKCkgLSBzdGFydCkgPCA2MDAwMDAwMDA7IC8qIG5v cCAqLykgeworCQlzdHJ1Y3QgcG9sbGZkIHBvbGxmZCA9IHsgLmZkID0gc3RyZWFtX2ZkLCAuZXZl bnRzID0gUE9MTElOIH07CisJCWludCByZXQ7CisKKwkJd2hpbGUgKChyZXQgPSBwb2xsKCZwb2xs ZmQsIDEsIC0xKSkgPCAwICYmCisJCSAgICAgICBlcnJubyA9PSBFSU5UUikKKwkJCTsKKwkJaWd0 X2Fzc2VydF9lcShyZXQsIDEpOworCQlpZ3RfYXNzZXJ0KHBvbGxmZC5yZXZlbnRzICYgUE9MTElO KTsKKworCQl3aGlsZSAoKHJldCA9IHJlYWQoc3RyZWFtX2ZkLCBidWYsIHNpemVvZihidWYpKSkg PCAwICYmCisJCSAgICAgICBlcnJubyA9PSBFSU5UUikKKwkJCTsKKworCQkvKiBEb24ndCBleHBl Y3QgdG8gc2VlIEVBR0FJTiBpZiB3ZSd2ZSBoYWQgYSBQT0xMSU4gZXZlbnQKKwkJICoKKwkJICog WFhYOiBhY3R1YWxseSB0aGlzIGlzIHRlY2huaWNhbGx5IG92ZXJseSBzdHJpY3Qgc2luY2Ugd2Ug ZG8KKwkJICoga25vd2luZ2x5IGFsbG93IGZhbHNlIHBvc2l0aXZlIFBPTExJTiBldmVudHMuIEF0 IGxlYXN0IGluCisJCSAqIHRoZSBmdXR1cmUgd2hlbiBzdXBwb3J0aW5nIGNvbnRleHQgZmlsdGVy aW5nIG9mIG1ldHJpY3MgZm9yCisJCSAqIEdlbjgrIGhhbmRsZWQgaW4gdGhlIGtlcm5lbCB0aGVu IFBPTExJTiBldmVudHMgbWF5IGJlCisJCSAqIGRlbGl2ZXJlZCB3aGVuIHdlIGtub3cgdGhlcmUg YXJlIHBlbmRpbmcgcmVwb3J0cyB0byBwcm9jZXNzCisJCSAqIGJ1dCBiZWZvcmUgd2UndmUgZG9u ZSBhbnkgZmlsdGVyaW5nIHRvIGtub3cgZm9yIGNlcnRhaW4gdGhhdAorCQkgKiBhbnkgcmVwb3J0 cyBhcmUgZGVzdGluZWQgdG8gYmUgY29waWVkIHRvIHVzZXJzcGFjZS4KKwkJICoKKwkJICogU3Rp bGwsIGZvciBub3cgaXQncyBhIHJlYXNvbmFibGUgc2FuaXR5IGNoZWNrLgorCQkgKi8KKwkJaWYg KHJldCA8IDApCisJCQlpZ3RfZGVidWcoIlVuZXhwZWN0ZWQgZXJyb3Igd2hlbiByZWFkaW5nIGFm dGVyIHBvbGwgPSAlZFxuIiwgZXJybm8pOworCQlpZ3RfYXNzZXJ0X25lcShyZXQsIC0xKTsKKwor CQkvKiBBdCB0aGlzIHBvaW50LCBhZnRlciBjb25zdW1pbmcgcGVuZGluZyByZXBvcnRzIChhbmQg aG9waW5nCisJCSAqIHRoZSBzY2hlZHVsZXIgaGFzbid0IHN0b3BwZWQgdXMgZm9yIHRvbyBsb25n IHdlIG5vdworCQkgKiBleHBlY3QgRUFHQUlOIG9uIHJlYWQuCisJCSAqLworCQl3aGlsZSAoKHJl dCA9IHJlYWQoc3RyZWFtX2ZkLCBidWYsIHNpemVvZihidWYpKSkgPCAwICYmCisJCSAgICAgICBl cnJubyA9PSBFSU5UUikKKwkJCTsKKwkJaWd0X2Fzc2VydF9lcShyZXQsIC0xKTsKKwkJaWd0X2Fz c2VydF9lcShlcnJubywgRUFHQUlOKTsKKworCQluKys7CisJfQorCisJdGltZXMoJmVuZF90aW1l cyk7CisKKwkvKiBVc2luZyBuYW5vc2Vjb25kIHVuaXRzIGlzIGZhaXJseSBzaWxseSBoZXJlLCBn aXZlbiB0aGUgdGljayBpbi0KKwkgKiBwcmVjaXNpb24gLSBhaCB3ZWxsLCBpdCdzIGNvbnNpc3Rl bnQgd2l0aCB0aGUgZ2V0X3RpbWUoKSB1bml0cy4KKwkgKi8KKwl1c2VyX25zID0gKGVuZF90aW1l cy50bXNfdXRpbWUgLSBzdGFydF90aW1lcy50bXNfdXRpbWUpICogdGlja19uczsKKwlrZXJuZWxf bnMgPSAoZW5kX3RpbWVzLnRtc19zdGltZSAtIHN0YXJ0X3RpbWVzLnRtc19zdGltZSkgKiB0aWNr X25zOworCisJaWd0X2RlYnVnKCIlZCBibG9ja2luZyBwb2xsKClzIGluIDYwMCBtaWxsaXNlY29u ZHMsIHdpdGggMjVIeiBPQSBzYW1wbGluZ1xuIiwgbik7CisJaWd0X2RlYnVnKCJ0aW1lIGluIHVz ZXJzcGFjZSA9ICUiUFJJdTY0Im5zIChzdGFydCB1dGltZSA9ICVkLCBlbmQgPSAlZCwgbnMgdGlj a3MgcGVyIHNlYyA9ICVkKVxuIiwKKwkJICB1c2VyX25zLCAoaW50KXN0YXJ0X3RpbWVzLnRtc191 dGltZSwgKGludCllbmRfdGltZXMudG1zX3V0aW1lLCAoaW50KXRpY2tfbnMpOworCWlndF9kZWJ1 ZygidGltZSBpbiBrZXJuZWxzcGFjZSA9ICUiUFJJdTY0Im5zIChzdGFydCBzdGltZSA9ICVkLCBl bmQgPSAlZCwgbnMgdGlja3MgcGVyIHNlYyA9ICVkKVxuIiwKKwkJICBrZXJuZWxfbnMsIChpbnQp c3RhcnRfdGltZXMudG1zX3N0aW1lLCAoaW50KWVuZF90aW1lcy50bXNfc3RpbWUsIChpbnQpdGlj a19ucyk7CisKKwkvKiBXaXRoIGNvbXBsZXRlbHkgYnJva2VuIGJsb2NraW5nIHdoaWxlIHBvbGxp bmcgKGJ1dCBzdGlsbCBzb21laG93CisJICogcmVwb3J0aW5nIGEgUE9MTElOIGV2ZW50KSB3ZSBj b3VsZCBlbmQgdXAgd2l0aCBhbiBvcGVuIGxvb3AsCisJICogaG9wZWZ1bGx5IHJlY29nbmlzYWJs ZSB3aXRoID4gMTUgKDYwMC80MClpdGVyYXRpb25zLgorCSAqLworCWlndF9hc3NlcnQobiA8PSAx NSk7CisKKwkvKiBJdCdzIGEgYml0IHRyaWNreSB0byBwdXQgYSBsb3dlciBsaW1pdCBoZXJlLCBi dXQgd2UgZXhwZWN0IGEKKwkgKiByZWxhdGl2ZWx5IGxvdyBsYXRlbmN5IGZvciBzZWVpbmcgcmVw b3J0cywgd2hpbGUgd2UgZG9uJ3QgY3VycmVudGx5CisJICogZ2l2ZSBhbnkgY29udHJvbCBvdmVy IHRoaXMgaW4gdGhlIGFwaS4KKwkgKgorCSAqIExpbWl0ZWQgdG8gYSA1IG1pbGxpc2Vjb25kIGxh dGVuY3kgYW5kIDQ1bXMgKHdvcnN0IGNhc2UpCisJICogcGVyLWl0ZXJhdGlvbiB0aGF0IGNvdWxk IGdpdmUgMTMuMyBpdGVyYXRpb25zLiBSb3VuZGluZyBnaXZlcyBhIHRpbnkKKwkgKiBiaXQgbW9y ZSBsYXRlbmN5IHNsYWNrICg2bXMpLi4uCisJICovCisJaWd0X2Fzc2VydChuID4gMTMpOworCisJ LyogQSBiaXQgdHJpY2t5IHRvIHB1dCBhIG51bWJlciBvbiB0aGlzLCBidXQgd2UgZG9uJ3QgZXhw ZWN0IHRoZSBrZXJuZWwKKwkgKiB0byB1c2UgYW55IHNpZ25pZmljYW50IGNwdSB3aGlsZSB3YWl0 aW5nIGFuZCBnaXZlbiB0aGUgaW4gcHJlY2lzaW9uCisJICogb2Ygc3RpbWUgKG11bHRpcGxlIG9m IENMS19UQ0spIHdlIGV4cGVjdCB0aGlzIHRvIHJvdW5kIHRvIHplcm8uCisJICovCisJaWd0X2Fz c2VydF9lcShrZXJuZWxfbnMsIDApOworCisJY2xvc2Uoc3RyZWFtX2ZkKTsKK30KKworc3RhdGlj IHZvaWQKK3Rlc3RfYnVmZmVyX2ZpbGwodm9pZCkKK3sKKwlpbnQgb2FfZXhwb25lbnQgPSA1OyAv KiA1IG1pY3JvIHNlY29uZHMgKi8KKwl1aW50NjRfdCBwcm9wZXJ0aWVzW10gPSB7CisJCS8qIElu Y2x1ZGUgT0EgcmVwb3J0cyBpbiBzYW1wbGVzICovCisJCURSTV9JOTE1X1BFUkZfUFJPUF9TQU1Q TEVfT0EsIHRydWUsCisKKwkJLyogT0EgdW5pdCBjb25maWd1cmF0aW9uICovCisJCURSTV9JOTE1 X1BFUkZfUFJPUF9PQV9NRVRSSUNTX1NFVCwgaHN3X3JlbmRlcl9iYXNpY19pZCwKKwkJRFJNX0k5 MTVfUEVSRl9QUk9QX09BX0ZPUk1BVCwgSTkxNV9PQV9GT1JNQVRfQTQ1X0I4X0M4LAorCQlEUk1f STkxNV9QRVJGX1BST1BfT0FfRVhQT05FTlQsIG9hX2V4cG9uZW50LAorCX07CisJc3RydWN0IGRy bV9pOTE1X3BlcmZfb3Blbl9wYXJhbSBwYXJhbSA9IHsKKwkJLmZsYWdzID0gSTkxNV9QRVJGX0ZM QUdfRkRfQ0xPRVhFQywKKwkJLm51bV9wcm9wZXJ0aWVzID0gc2l6ZW9mKHByb3BlcnRpZXMpIC8g MTYsCisJCS5wcm9wZXJ0aWVzX3B0ciA9ICh1aW50NjRfdClwcm9wZXJ0aWVzLAorCX07CisJaW50 IHN0cmVhbV9mZCA9IF9fcGVyZl9vcGVuKGRybV9mZCwgJnBhcmFtKTsKKwlpbnQgYnVmX3NpemUg PSA2NTUzNiAqICgyNTYgKyBzaXplb2Yoc3RydWN0IGRybV9pOTE1X3BlcmZfcmVjb3JkX2hlYWRl cikpOworCXVpbnQ4X3QgKmJ1ZiA9IG1hbGxvYyhidWZfc2l6ZSk7CisKKworCWZvciAoaW50IGkg PSAwOyBpIDwgNTsgaSsrKSB7CisJCXN0cnVjdCBkcm1faTkxNV9wZXJmX3JlY29yZF9oZWFkZXIg KmhlYWRlcjsKKwkJYm9vbCBvdmVyZmxvd19zZWVuOworCQlpbnQgb2Zmc2V0ID0gMDsKKwkJaW50 IGxlbjsKKworCQkvKiBJdCBzaG91bGQgdGFrZSB+MzMwIG1pbGxpc2Vjb25kcyB0byBmaWxsIGEg MTZNQiBPQSBidWZmZXIgd2l0aCBhCisJCSAqIDUgbWljcm9zZWNvbmQgc2FtcGxpbmcgcGVyaW9k IGFuZCAyNTYgYnl0ZSByZXBvcnRzLiAqLworCQluYW5vc2xlZXAoJihzdHJ1Y3QgdGltZXNwZWMp eyAudHZfc2VjID0gMCwgLnR2X25zZWMgPSA1MDAwMDAwMDAgfSwgTlVMTCk7CisKKwkJd2hpbGUg KChsZW4gPSByZWFkKHN0cmVhbV9mZCwgYnVmLCBidWZfc2l6ZSkpID09IC0xICYmIGVycm5vID09 IEVJTlRSKQorCQkJOworCisJCWlndF9hc3NlcnRfbmVxKGxlbiwgLTEpOworCisJCW92ZXJmbG93 X3NlZW4gPSBmYWxzZTsKKwkJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBsZW47IG9mZnNldCAr PSBoZWFkZXItPnNpemUpIHsKKwkJCWhlYWRlciA9ICh2b2lkICopKGJ1ZiArIG9mZnNldCk7CisK KwkJCWlmIChoZWFkZXItPnR5cGUgPT0gRFJNX0k5MTVfUEVSRl9SRUNPUkRfT0FfQlVGRkVSX0xP U1QpCisJCQkJb3ZlcmZsb3dfc2VlbiA9IHRydWU7CisJCX0KKworCQlpZ3RfYXNzZXJ0X2VxKG92 ZXJmbG93X3NlZW4sIHRydWUpOworCisJCW5hbm9zbGVlcCgmKHN0cnVjdCB0aW1lc3BlYyl7IC50 dl9zZWMgPSAwLCAudHZfbnNlYyA9IDEwMDAwMDAgfSwgTlVMTCk7CisKKwkJd2hpbGUgKChsZW4g PSByZWFkKHN0cmVhbV9mZCwgYnVmLCBidWZfc2l6ZSkpID09IC0xICYmIGVycm5vID09IEVJTlRS KQorCQkJOworCisJCWlndF9hc3NlcnRfbmVxKGxlbiwgLTEpOworCisJCS8qIGV4cGVjdCB+IDIw MCByZWNvcmRzIGluIDEgbWlsbGlzZWNvbmQgKi8KKwkJaWd0X2Fzc2VydChsZW4gPiAyNTYgKiAx NTApOworCisJCW92ZXJmbG93X3NlZW4gPSBmYWxzZTsKKwkJZm9yIChvZmZzZXQgPSAwOyBvZmZz ZXQgPCBsZW47IG9mZnNldCArPSBoZWFkZXItPnNpemUpIHsKKwkJCWhlYWRlciA9ICh2b2lkICop KGJ1ZiArIG9mZnNldCk7CisKKwkJCWlmIChoZWFkZXItPnR5cGUgPT0gRFJNX0k5MTVfUEVSRl9S RUNPUkRfT0FfQlVGRkVSX0xPU1QpCisJCQkJb3ZlcmZsb3dfc2VlbiA9IHRydWU7CisJCX0KKwor CQlpZ3RfYXNzZXJ0X2VxKG92ZXJmbG93X3NlZW4sIGZhbHNlKTsKKwl9CisKKwlmcmVlKGJ1Zik7 CisKKwljbG9zZShzdHJlYW1fZmQpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9lbmFibGVfZGlz YWJsZSh2b2lkKQoreworCWludCBvYV9leHBvbmVudCA9IDU7IC8qIDUgbWljcm8gc2Vjb25kcyAq LworCXVpbnQ2NF90IHByb3BlcnRpZXNbXSA9IHsKKwkJLyogSW5jbHVkZSBPQSByZXBvcnRzIGlu IHNhbXBsZXMgKi8KKwkJRFJNX0k5MTVfUEVSRl9QUk9QX1NBTVBMRV9PQSwgdHJ1ZSwKKworCQkv KiBPQSB1bml0IGNvbmZpZ3VyYXRpb24gKi8KKwkJRFJNX0k5MTVfUEVSRl9QUk9QX09BX01FVFJJ Q1NfU0VULCBoc3dfcmVuZGVyX2Jhc2ljX2lkLAorCQlEUk1fSTkxNV9QRVJGX1BST1BfT0FfRk9S TUFULCBJOTE1X09BX0ZPUk1BVF9BNDVfQjhfQzgsCisJCURSTV9JOTE1X1BFUkZfUFJPUF9PQV9F WFBPTkVOVCwgb2FfZXhwb25lbnQsCisJfTsKKwlzdHJ1Y3QgZHJtX2k5MTVfcGVyZl9vcGVuX3Bh cmFtIHBhcmFtID0geworCQkuZmxhZ3MgPSBJOTE1X1BFUkZfRkxBR19GRF9DTE9FWEVDIHwKKwkJ CSBJOTE1X1BFUkZfRkxBR19ESVNBQkxFRCwgLyogVmVyaWZ5IHdlIHN0YXJ0IGRpc2FibGVkICov CisJCS5udW1fcHJvcGVydGllcyA9IHNpemVvZihwcm9wZXJ0aWVzKSAvIDE2LAorCQkucHJvcGVy dGllc19wdHIgPSAodWludDY0X3QpcHJvcGVydGllcywKKwl9OworCWludCBzdHJlYW1fZmQgPSBf X3BlcmZfb3Blbihkcm1fZmQsICZwYXJhbSk7CisJaW50IGJ1Zl9zaXplID0gNjU1MzYgKiAoMjU2 ICsgc2l6ZW9mKHN0cnVjdCBkcm1faTkxNV9wZXJmX3JlY29yZF9oZWFkZXIpKTsKKwl1aW50OF90 ICpidWYgPSBtYWxsb2MoYnVmX3NpemUpOworCisKKwlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkr KykgeworCQlpbnQgbGVuOworCisJCS8qIElmIHRoZSBzdHJlYW0gd2VyZSBlbmFibGVkIHRoZW4g aXQgd291bGQgdGFrZSB+MzMwCisJCSAqIG1pbGxpc2Vjb25kcyB0byBmaWxsIGEgMTZNQiBPQSBi dWZmZXIgd2l0aCBhIDUgbWljcm9zZWNvbmQKKwkJICogc2FtcGxpbmcgcGVyaW9kIGFuZCAyNTYg Ynl0ZSByZXBvcnRzLgorCQkgKgorCQkgKiBHaXZpbmcgZW5vdWdoIHRpbWUgZm9yIGFuIG92ZXJm bG93IG1pZ2h0IGhlbHAgY2F0Y2ggd2hldGhlcgorCQkgKiB0aGUgT0EgdW5pdCBoYXMgYmVlbiBl bmFibGVkIGV2ZW4gaWYgdGhlIGRyaXZlciBtaWdodCBhdAorCQkgKiBsZWFzdCBhdm9pZCBjb3B5 aW5nIHJlcG9ydHMgd2hpbGUgZGlzYWJsZWQuCisJCSAqLworCQluYW5vc2xlZXAoJihzdHJ1Y3Qg dGltZXNwZWMpeyAudHZfc2VjID0gMCwgLnR2X25zZWMgPSA1MDAwMDAwMDAgfSwgTlVMTCk7CisK KwkJd2hpbGUgKChsZW4gPSByZWFkKHN0cmVhbV9mZCwgYnVmLCBidWZfc2l6ZSkpID09IC0xICYm IGVycm5vID09IEVJTlRSKQorCQkJOworCisJCWlndF9hc3NlcnRfZXEobGVuLCAtMSk7CisJCWln dF9hc3NlcnRfZXEoZXJybm8sIEVJTyk7CisKKwkJZG9faW9jdGwoc3RyZWFtX2ZkLCBJOTE1X1BF UkZfSU9DVExfRU5BQkxFLCAwKTsKKworCQluYW5vc2xlZXAoJihzdHJ1Y3QgdGltZXNwZWMpeyAu dHZfc2VjID0gMCwgLnR2X25zZWMgPSAxMDAwMDAwIH0sIE5VTEwpOworCisJCXdoaWxlICgobGVu ID0gcmVhZChzdHJlYW1fZmQsIGJ1ZiwgYnVmX3NpemUpKSA9PSAtMSAmJiBlcnJubyA9PSBFSU5U UikKKwkJCTsKKworCQlpZ3RfYXNzZXJ0X25lcShsZW4sIC0xKTsKKworCQkvKiBleHBlY3QgfiAy MDAgcmVjb3JkcyBpbiAxIG1pbGxpc2Vjb25kICovCisJCWlndF9hc3NlcnQobGVuID4gMjU2ICog MTUwICYmIGxlbiA8IDI1NiAqIDIwMDApOworCisJCWRvX2lvY3RsKHN0cmVhbV9mZCwgSTkxNV9Q RVJGX0lPQ1RMX0RJU0FCTEUsIDApOworCisJCS8qIEl0J3MgY29uc2lkZXJlZCBhbiBlcnJvciB0 byByZWFkIGEgc3RyZWFtIHdoaWxlIGl0J3MgZGlzYWJsZWQKKwkJICogc2luY2UgaXQgd291bGQg YmxvY2sgaW5kZWZpbml0ZWx5Li4uCisJCSAqLworCQlsZW4gPSByZWFkKHN0cmVhbV9mZCwgYnVm LCBidWZfc2l6ZSk7CisKKwkJaWd0X2Fzc2VydF9lcShsZW4sIC0xKTsKKwkJaWd0X2Fzc2VydF9l cShlcnJubywgRUlPKTsKKwl9CisKKwlmcmVlKGJ1Zik7CisKKwljbG9zZShzdHJlYW1fZmQpOwor fQorCitzdGF0aWMgdm9pZAordGVzdF9zaG9ydF9yZWFkcyh2b2lkKQoreworCWludCBvYV9leHBv bmVudCA9IDU7IC8qIDUgbWljcm8gc2Vjb25kcyAqLworCXVpbnQ2NF90IHByb3BlcnRpZXNbXSA9 IHsKKwkJLyogSW5jbHVkZSBPQSByZXBvcnRzIGluIHNhbXBsZXMgKi8KKwkJRFJNX0k5MTVfUEVS Rl9QUk9QX1NBTVBMRV9PQSwgdHJ1ZSwKKworCQkvKiBPQSB1bml0IGNvbmZpZ3VyYXRpb24gKi8K KwkJRFJNX0k5MTVfUEVSRl9QUk9QX09BX01FVFJJQ1NfU0VULCBoc3dfcmVuZGVyX2Jhc2ljX2lk LAorCQlEUk1fSTkxNV9QRVJGX1BST1BfT0FfRk9STUFULCBJOTE1X09BX0ZPUk1BVF9BNDVfQjhf QzgsCisJCURSTV9JOTE1X1BFUkZfUFJPUF9PQV9FWFBPTkVOVCwgb2FfZXhwb25lbnQsCisJfTsK KwlzdHJ1Y3QgZHJtX2k5MTVfcGVyZl9vcGVuX3BhcmFtIHBhcmFtID0geworCQkuZmxhZ3MgPSBJ OTE1X1BFUkZfRkxBR19GRF9DTE9FWEVDLAorCQkubnVtX3Byb3BlcnRpZXMgPSBzaXplb2YocHJv cGVydGllcykgLyAxNiwKKwkJLnByb3BlcnRpZXNfcHRyID0gKHVpbnQ2NF90KXByb3BlcnRpZXMs CisJfTsKKwlzaXplX3QgcmVjb3JkX3NpemUgPSAyNTYgKyBzaXplb2Yoc3RydWN0IGRybV9pOTE1 X3BlcmZfcmVjb3JkX2hlYWRlcik7CisJc2l6ZV90IHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BB R0VfU0laRSk7CisJaW50IHplcm9fZmQgPSBvcGVuKCIvZGV2L3plcm8iLCBPX1JEV1J8T19DTE9F WEVDKTsKKwl1aW50OF90ICpwYWdlcyA9IG1tYXAoTlVMTCwgcGFnZV9zaXplICogMiwKKwkJCSAg ICAgIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfUFJJVkFURSwgemVyb19mZCwgMCk7CisJc3Ry dWN0IGRybV9pOTE1X3BlcmZfcmVjb3JkX2hlYWRlciAqaGVhZGVyOworCWludCBzdHJlYW1fZmQ7 CisJaW50IHJldDsKKworCWlndF9hc3NlcnRfbmVxKHplcm9fZmQsIC0xKTsKKwljbG9zZSh6ZXJv X2ZkKTsKKwl6ZXJvX2ZkID0gLTE7CisKKwlpZ3RfYXNzZXJ0KHBhZ2VzKTsKKworCXJldCA9IG1w cm90ZWN0KHBhZ2VzICsgcGFnZV9zaXplLCBwYWdlX3NpemUsIFBST1RfTk9ORSk7CisJaWd0X2Fz c2VydF9lcShyZXQsIDApOworCisJc3RyZWFtX2ZkID0gX19wZXJmX29wZW4oZHJtX2ZkLCAmcGFy YW0pOworCisJbmFub3NsZWVwKCYoc3RydWN0IHRpbWVzcGVjKXsgLnR2X3NlYyA9IDAsIC50dl9u c2VjID0gNTAwMDAwMCB9LCBOVUxMKTsKKworCS8qIEF0IHRoaXMgcG9pbnQgdGhlcmUgc2hvdWxk IGJlIGxvdHMgb2YgcGVuZGluZyByZXBvcnRzIHRvIHJlYWQgKi8KKworCS8qIEEgcmVhZCB0aGF0 IGNhbiByZXR1cm4gYXQgbGVhc3Qgb25lIHJlY29yZCBzaG91bGQgcmVzdWx0IGluIGEgc2hvcnQK KwkgKiByZWFkIG5vdCBhbiBFRkFVTFQgaWYgdGhlIGJ1ZmZlciBpcyBzbWFsbGVyIHRoYW4gdGhl IHJlcXVlc3RlZCByZWFkCisJICogc2l6ZS4uLgorCSAqCisJICogRXhwZWN0IHRvIHNlZSBhIHNh bXBsZSByZWNvcmQgaGVyZSwgYnV0IGF0IGxlYXN0IHNraXAgb3ZlciBhbnkKKwkgKiBfUkVDT1JE X0xPU1Qgbm90aWZpY2F0aW9ucy4KKwkgKi8KKwlkbyB7CisJCWhlYWRlciA9ICh2b2lkICopKHBh Z2VzICsgcGFnZV9zaXplIC0gcmVjb3JkX3NpemUpOworCQlyZXQgPSByZWFkKHN0cmVhbV9mZCwK KwkJCSAgIGhlYWRlciwKKwkJCSAgIHBhZ2Vfc2l6ZSk7CisJCWlndF9hc3NlcnQocmV0ID4gMCk7 CisJfSB3aGlsZSAoaGVhZGVyLT50eXBlID09IERSTV9JOTE1X1BFUkZfUkVDT1JEX09BX1JFUE9S VF9MT1NUKTsKKworCWlndF9hc3NlcnRfZXEocmV0LCByZWNvcmRfc2l6ZSk7CisKKwkvKiBBIHJl YWQgdGhhdCBjYW4ndCByZXR1cm4gYSBzaW5nbGUgcmVjb3JkIGJlY2F1c2UgaXQgd291bGQgcmVz dWx0CisJICogaW4gYSBmYXVsdCBvbiBidWZmZXIgb3ZlcnJ1biBzaG91bGQgcmVzdWx0IGluIGFu IEVGQVVMVCBlcnJvci4uLgorCSAqLworCXJldCA9IHJlYWQoc3RyZWFtX2ZkLCBwYWdlcyArIHBh Z2Vfc2l6ZSAtIDE2LCBwYWdlX3NpemUpOworCWlndF9hc3NlcnRfZXEocmV0LCAtMSk7CisJaWd0 X2Fzc2VydF9lcShlcnJubywgRUZBVUxUKTsKKworCS8qIEEgcmVhZCB0aGF0IGNhbid0IHJldHVy biBhIHNpbmdsZSByZWNvcmQgYmVjYXVzZSB0aGUgYnVmZmVyIGlzIHRvbworCSAqIHNtYWxsIHNo b3VsZCByZXN1bHQgaW4gYW4gRU5PU1BDIGVycm9yLi4KKwkgKgorCSAqIEFnYWluLCBza2lwIG92 ZXIgX1JFQ09SRF9MT1NUIHJlY29yZHMgKHNtYWxsZXIgdGhhbiByZWNvcmRfc2l6ZS8yKQorCSAq LworCWRvIHsKKwkJaGVhZGVyID0gKHZvaWQgKikocGFnZXMgKyBwYWdlX3NpemUgLSByZWNvcmRf c2l6ZSAvIDIpOworCQlyZXQgPSByZWFkKHN0cmVhbV9mZCwKKwkJCSAgIGhlYWRlciwKKwkJCSAg IHJlY29yZF9zaXplIC8gMik7CisJfSB3aGlsZSAocmV0ID4gMCAmJiBoZWFkZXItPnR5cGUgPT0g RFJNX0k5MTVfUEVSRl9SRUNPUkRfT0FfUkVQT1JUX0xPU1QpOworCisJaWd0X2Fzc2VydF9lcShy ZXQsIC0xKTsKKwlpZ3RfYXNzZXJ0X2VxKGVycm5vLCBFTk9TUEMpOworCisJY2xvc2Uoc3RyZWFt X2ZkKTsKKworCW11bm1hcChwYWdlcywgcGFnZV9zaXplICogMik7Cit9CisKK3N0YXRpYyB2b2lk Cit0ZXN0X25vbl9zYW1wbGluZ19yZWFkX2Vycm9yKHZvaWQpCit7CisJdWludDY0X3QgcHJvcGVy dGllc1tdID0geworCQkvKiBYWFg6IGV2ZW4gd2l0aG91dCBwZXJpb2RpYyBzYW1wbGluZyB3ZSBo YXZlIHRvCisJCSAqIHNwZWNpZnkgYXQgbGVhc3Qgb25lIHNhbXBsZSBsYXlvdXQgcHJvcGVydHku Li4KKwkJICovCisJCURSTV9JOTE1X1BFUkZfUFJPUF9TQU1QTEVfT0EsIHRydWUsCisKKwkJLyog T0EgdW5pdCBjb25maWd1cmF0aW9uICovCisJCURSTV9JOTE1X1BFUkZfUFJPUF9PQV9NRVRSSUNT X1NFVCwgaHN3X3JlbmRlcl9iYXNpY19pZCwKKwkJRFJNX0k5MTVfUEVSRl9QUk9QX09BX0ZPUk1B VCwgSTkxNV9PQV9GT1JNQVRfQTQ1X0I4X0M4LAorCisJCS8qIFhYWDogbm8gc2FtcGxpbmcgZXhw b25lbnQgKi8KKwl9OworCXN0cnVjdCBkcm1faTkxNV9wZXJmX29wZW5fcGFyYW0gcGFyYW0gPSB7 CisJCS5mbGFncyA9IEk5MTVfUEVSRl9GTEFHX0ZEX0NMT0VYRUMsCisJCS5udW1fcHJvcGVydGll cyA9IHNpemVvZihwcm9wZXJ0aWVzKSAvIDE2LAorCQkucHJvcGVydGllc19wdHIgPSAodWludDY0 X3QpcHJvcGVydGllcywKKwl9OworCWludCBzdHJlYW1fZmQgPSBfX3BlcmZfb3Blbihkcm1fZmQs ICZwYXJhbSk7CisJdWludDhfdCBidWZbMTAyNF07CisKKwlpbnQgcmV0ID0gcmVhZChzdHJlYW1f ZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWlndF9hc3NlcnRfZXEocmV0LCAtMSk7CisJaWd0X2Fz c2VydF9lcShlcnJubywgRUlPKTsKKworCWNsb3NlKHN0cmVhbV9mZCk7Cit9CisKKy8qIENoZWNr IHRoYXQgYXR0ZW1wdHMgdG8gcmVhZCBmcm9tIGEgc3RyZWFtIHdoaWxlIGl0IGlzIGRpc2FibGUg d2lsbCByZXR1cm4KKyAqIEVJTyBpbnN0ZWFkIG9mIGJsb2NraW5nIGluZGVmaW5pdGVseS4KKyAq Lworc3RhdGljIHZvaWQKK3Rlc3RfZGlzYWJsZWRfcmVhZF9lcnJvcih2b2lkKQoreworCWludCBv YV9leHBvbmVudCA9IDU7IC8qIDUgbWljcm8gc2Vjb25kcyAqLworCXVpbnQ2NF90IHByb3BlcnRp ZXNbXSA9IHsKKwkJLyogWFhYOiBldmVuIHdpdGhvdXQgcGVyaW9kaWMgc2FtcGxpbmcgd2UgaGF2 ZSB0bworCQkgKiBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBzYW1wbGUgbGF5b3V0IHByb3BlcnR5Li4u CisJCSAqLworCQlEUk1fSTkxNV9QRVJGX1BST1BfU0FNUExFX09BLCB0cnVlLAorCisJCS8qIE9B IHVuaXQgY29uZmlndXJhdGlvbiAqLworCQlEUk1fSTkxNV9QRVJGX1BST1BfT0FfTUVUUklDU19T RVQsIGhzd19yZW5kZXJfYmFzaWNfaWQsCisJCURSTV9JOTE1X1BFUkZfUFJPUF9PQV9GT1JNQVQs IEk5MTVfT0FfRk9STUFUX0E0NV9COF9DOCwKKwkJRFJNX0k5MTVfUEVSRl9QUk9QX09BX0VYUE9O RU5ULCBvYV9leHBvbmVudCwKKwl9OworCXN0cnVjdCBkcm1faTkxNV9wZXJmX29wZW5fcGFyYW0g cGFyYW0gPSB7CisJCS5mbGFncyA9IEk5MTVfUEVSRl9GTEFHX0ZEX0NMT0VYRUMgfAorCQkJIEk5 MTVfUEVSRl9GTEFHX0RJU0FCTEVELCAvKiBYWFg6IG9wZW4gZGlzYWJsZWQgKi8KKwkJLm51bV9w cm9wZXJ0aWVzID0gc2l6ZW9mKHByb3BlcnRpZXMpIC8gMTYsCisJCS5wcm9wZXJ0aWVzX3B0ciA9 ICh1aW50NjRfdClwcm9wZXJ0aWVzLAorCX07CisJaW50IHN0cmVhbV9mZCA9IF9fcGVyZl9vcGVu KGRybV9mZCwgJnBhcmFtKTsKKwl1aW50MzJfdCBvYV9yZXBvcnQwWzY0XTsKKwl1aW50MzJfdCBv YV9yZXBvcnQxWzY0XTsKKwl1aW50MzJfdCBidWZbMTI4XSA9IHsgMCB9OworCWludCByZXQ7CisK KworCXJldCA9IHJlYWQoc3RyZWFtX2ZkLCBidWYsIHNpemVvZihidWYpKTsKKwlpZ3RfYXNzZXJ0 X2VxKHJldCwgLTEpOworCWlndF9hc3NlcnRfZXEoZXJybm8sIEVJTyk7CisKKwljbG9zZShzdHJl YW1fZmQpOworCisKKwlwYXJhbS5mbGFncyAmPSB+STkxNV9QRVJGX0ZMQUdfRElTQUJMRUQ7CisJ c3RyZWFtX2ZkID0gX19wZXJmX29wZW4oZHJtX2ZkLCAmcGFyYW0pOworCisJcmVhZF8yX29hX3Jl cG9ydHMoc3RyZWFtX2ZkLAorCQkJICBJOTE1X09BX0ZPUk1BVF9BNDVfQjhfQzgsCisJCQkgIG9h X2V4cG9uZW50LAorCQkJICBvYV9yZXBvcnQwLAorCQkJICBvYV9yZXBvcnQxLAorCQkJICBmYWxz ZSk7IC8qIG5vdCBqdXN0IHRpbWVyIHJlcG9ydHMgKi8KKworCWRvX2lvY3RsKHN0cmVhbV9mZCwg STkxNV9QRVJGX0lPQ1RMX0RJU0FCTEUsIDApOworCisJcmV0ID0gcmVhZChzdHJlYW1fZmQsIGJ1 Ziwgc2l6ZW9mKGJ1ZikpOworCWlndF9hc3NlcnRfZXEocmV0LCAtMSk7CisJaWd0X2Fzc2VydF9l cShlcnJubywgRUlPKTsKKworCWRvX2lvY3RsKHN0cmVhbV9mZCwgSTkxNV9QRVJGX0lPQ1RMX0VO QUJMRSwgMCk7CisKKwlyZWFkXzJfb2FfcmVwb3J0cyhzdHJlYW1fZmQsCisJCQkgIEk5MTVfT0Ff Rk9STUFUX0E0NV9COF9DOCwKKwkJCSAgb2FfZXhwb25lbnQsCisJCQkgIG9hX3JlcG9ydDAsCisJ CQkgIG9hX3JlcG9ydDEsCisJCQkgIGZhbHNlKTsgLyogbm90IGp1c3QgdGltZXIgcmVwb3J0cyAq LworCisJY2xvc2Uoc3RyZWFtX2ZkKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfbWlfcnBjKHZv aWQpCit7CisJdWludDY0X3QgcHJvcGVydGllc1tdID0geworCQkvKiBOb3RlOiB3ZSBoYXZlIHRv IHNwZWNpZnkgYXQgbGVhc3Qgb25lIHNhbXBsZSBwcm9wZXJ0eSBldmVuCisJCSAqIHRob3VnaCB3 ZSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiBzYW1wbGVzIGluIHRoaXMgY2FzZS4KKwkJICovCisJCURS TV9JOTE1X1BFUkZfUFJPUF9TQU1QTEVfT0EsIHRydWUsCisKKwkJLyogT0EgdW5pdCBjb25maWd1 cmF0aW9uICovCisJCURSTV9JOTE1X1BFUkZfUFJPUF9PQV9NRVRSSUNTX1NFVCwgaHN3X3JlbmRl cl9iYXNpY19pZCwKKwkJRFJNX0k5MTVfUEVSRl9QUk9QX09BX0ZPUk1BVCwgSTkxNV9PQV9GT1JN QVRfQTQ1X0I4X0M4LAorCisJCS8qIE5vdGU6IG5vIE9BIGV4cG9uZW50IHNwZWNpZmllZCBpbiB0 aGlzIGNhc2UgKi8KKwl9OworCXN0cnVjdCBkcm1faTkxNV9wZXJmX29wZW5fcGFyYW0gcGFyYW0g PSB7CisJCS5mbGFncyA9IEk5MTVfUEVSRl9GTEFHX0ZEX0NMT0VYRUMsCisJCS5udW1fcHJvcGVy dGllcyA9IHNpemVvZihwcm9wZXJ0aWVzKSAvIDE2LAorCQkucHJvcGVydGllc19wdHIgPSAodWlu dDY0X3QpcHJvcGVydGllcywKKwl9OworCWludCBzdHJlYW1fZmQgPSBfX3BlcmZfb3Blbihkcm1f ZmQsICZwYXJhbSk7CisJZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyID0gZHJtX2ludGVsX2J1Zm1n cl9nZW1faW5pdChkcm1fZmQsIDQwOTYpOworCWRybV9pbnRlbF9jb250ZXh0ICpjb250ZXh0Owor CXN0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlciAqYmF0Y2g7CisJZHJtX2ludGVsX2JvICpibzsKKwl1 aW50MzJfdCAqcmVwb3J0MzI7CisJaW50IHJldDsKKworCWRybV9pbnRlbF9idWZtZ3JfZ2VtX2Vu YWJsZV9yZXVzZShidWZtZ3IpOworCisJY29udGV4dCA9IGRybV9pbnRlbF9nZW1fY29udGV4dF9j cmVhdGUoYnVmbWdyKTsKKwlpZ3RfYXNzZXJ0KGNvbnRleHQpOworCisJYmF0Y2ggPSBpbnRlbF9i YXRjaGJ1ZmZlcl9hbGxvYyhidWZtZ3IsIGRldmlkKTsKKworCWJvID0gZHJtX2ludGVsX2JvX2Fs bG9jKGJ1Zm1nciwgIm1pX3JwYyBkZXN0IGJvIiwgNDA5NiwgNjQpOworCisJcmV0ID0gZHJtX2lu dGVsX2JvX21hcChibywgdHJ1ZSk7CisJaWd0X2Fzc2VydF9lcShyZXQsIDApOworCisJbWVtc2V0 KGJvLT52aXJ0dWFsLCAweDgwLCA0MDk2KTsKKwlkcm1faW50ZWxfYm9fdW5tYXAoYm8pOworCisJ QkVHSU5fQkFUQ0goMywgMSk7CisJT1VUX0JBVENIKEdFTjZfTUlfUkVQT1JUX1BFUkZfQ09VTlQp OworCU9VVF9SRUxPQyhibywgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OLCBJOTE1X0dFTV9E T01BSU5fSU5TVFJVQ1RJT04sCisJCSAgMCk7IC8qIG9mZnNldCBpbiBieXRlcyAqLworCU9VVF9C QVRDSCgweGRlYWRiZWVmKTsgLyogcmVwb3J0IElEICovCisJQURWQU5DRV9CQVRDSCgpOworCisJ aW50ZWxfYmF0Y2hidWZmZXJfZmx1c2hfd2l0aF9jb250ZXh0KGJhdGNoLCBjb250ZXh0KTsKKwor CXJldCA9IGRybV9pbnRlbF9ib19tYXAoYm8sIGZhbHNlIC8qIHdyaXRlIGVuYWJsZSAqLyk7CisJ aWd0X2Fzc2VydF9lcShyZXQsIDApOworCisJcmVwb3J0MzIgPSBiby0+dmlydHVhbDsKKwlpZ3Rf YXNzZXJ0X2VxKHJlcG9ydDMyWzBdLCAweGRlYWRiZWVmKTsgLyogcmVwb3J0IElEICovCisJaWd0 X2Fzc2VydF9uZXEocmVwb3J0MzJbMV0sIDApOyAvKiB0aW1lc3RhbXAgKi8KKworCWlndF9hc3Nl cnRfbmVxKHJlcG9ydDMyWzYzXSwgMHg4MDgwODA4MCk7IC8qIGVuZCBvZiByZXBvcnQgKi8KKwlp Z3RfYXNzZXJ0X2VxKHJlcG9ydDMyWzY0XSwgMHg4MDgwODA4MCk7IC8qIGFmdGVyIDI1NiBieXRl IHJlcG9ydCAqLworCisJZHJtX2ludGVsX2JvX3VubWFwKGJvKTsKKwlkcm1faW50ZWxfYm9fdW5y ZWZlcmVuY2UoYm8pOworCWludGVsX2JhdGNoYnVmZmVyX2ZyZWUoYmF0Y2gpOworCWRybV9pbnRl bF9nZW1fY29udGV4dF9kZXN0cm95KGNvbnRleHQpOworCWRybV9pbnRlbF9idWZtZ3JfZGVzdHJv eShidWZtZ3IpOworCWNsb3NlKHN0cmVhbV9mZCk7Cit9CisKK3N0YXRpYyB2b2lkCitzY3JhdGNo X2J1Zl9pbml0KGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKKwkJIHN0cnVjdCBpZ3RfYnVmICpi dWYsCisJCSBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJCSB1aW50MzJfdCBjb2xvcikKK3sKKwlz aXplX3Qgc3RyaWRlID0gd2lkdGggKiA0OworCXNpemVfdCBzaXplID0gc3RyaWRlICogaGVpZ2h0 OworCWRybV9pbnRlbF9ibyAqYm8gPSBkcm1faW50ZWxfYm9fYWxsb2MoYnVmbWdyLCAiIiwgc2l6 ZSwgNDA5Nik7CisJaW50IHJldDsKKworCXJldCA9IGRybV9pbnRlbF9ib19tYXAoYm8sIHRydWUg Lyogd3JpdGFibGUgKi8pOworCWlndF9hc3NlcnRfZXEocmV0LCAwKTsKKworCWZvciAoaW50IGkg PSAwOyBpIDwgd2lkdGggKiBoZWlnaHQ7IGkrKykKKwkJKCh1aW50MzJfdCAqKWJvLT52aXJ0dWFs KVtpXSA9IGNvbG9yOworCisJZHJtX2ludGVsX2JvX3VubWFwKGJvKTsKKworCWJ1Zi0+Ym8gPSBi bzsKKwlidWYtPnN0cmlkZSA9IHN0cmlkZTsKKwlidWYtPnRpbGluZyA9IEk5MTVfVElMSU5HX05P TkU7CisJYnVmLT5zaXplID0gc2l6ZTsKK30KKworc3RhdGljIHZvaWQKK2VtaXRfc3RhbGxfdGlt ZXN0YW1wX2FuZF9ycGMoc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRjaCwKKwkJCSAgICAg ZHJtX2ludGVsX2JvICpkc3QsCisJCQkgICAgIGludCB0aW1lc3RhbXBfb2Zmc2V0LAorCQkJICAg ICBpbnQgcmVwb3J0X2RzdF9vZmZzZXQsCisJCQkgICAgIHVpbnQzMl90IHJlcG9ydF9pZCkKK3sK Kwl1aW50MzJfdCBwaXBlX2N0bF9mbGFncyA9IChQSVBFX0NPTlRST0xfQ1NfU1RBTEwgfAorCQkJ CSAgIFBJUEVfQ09OVFJPTF9SRU5ERVJfVEFSR0VUX0ZMVVNIIHwKKwkJCQkgICBQSVBFX0NPTlRS T0xfV1JJVEVfVElNRVNUQU1QKTsKKworCUJFR0lOX0JBVENIKDUsIDEpOworCU9VVF9CQVRDSChH RlhfT1BfUElQRV9DT05UUk9MIHwgKDUgLSAyKSk7CisJT1VUX0JBVENIKHBpcGVfY3RsX2ZsYWdz KTsKKwlPVVRfUkVMT0MoZHN0LCBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04sIEk5MTVfR0VN X0RPTUFJTl9JTlNUUlVDVElPTiwKKwkJICB0aW1lc3RhbXBfb2Zmc2V0KTsKKwlPVVRfQkFUQ0go MCk7IC8qIGltbSBsb3dlciAqLworCU9VVF9CQVRDSCgwKTsgLyogaW1tIHVwcGVyICovCisJQURW QU5DRV9CQVRDSCgpOworCisJQkVHSU5fQkFUQ0goMywgMSk7CisJT1VUX0JBVENIKEdFTjZfTUlf UkVQT1JUX1BFUkZfQ09VTlQpOworCU9VVF9SRUxPQyhkc3QsIEk5MTVfR0VNX0RPTUFJTl9JTlNU UlVDVElPTiwgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OLAorCQkgIHJlcG9ydF9kc3Rfb2Zm c2V0KTsKKwlPVVRfQkFUQ0gocmVwb3J0X2lkKTsKKwlBRFZBTkNFX0JBVENIKCk7Cit9CisKKy8q IFRlc3RzIHRoZSBJTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSB1c2UgY2FzZSB3aGVyZSBhbiB1bnBy aXZpbGVnZWQgcHJvY2VzcworICogc2hvdWxkIGJlIGFibGUgdG8gY29uZmlndXJlIHRoZSBPQSB1 bml0IGZvciBwZXItY29udGV4dCBtZXRyaWNzIChmb3IgYQorICogY29udGV4dCBhc3NvY2lhdGVk IHdpdGggdGhhdCBwcm9jZXNzJyBkcm0gZmlsZSBkZXNjcmlwdG9yKSBhbmQgdGhlIGNvdW50ZXJz CisgKiBzaG91bGQgb25seSByZWxhdGUgdG8gdGhhdCBzcGVjaWZpYyBjb250ZXh0LgorICovCitz dGF0aWMgdm9pZAordGVzdF9wZXJfY3R4X21pX3JwYyh2b2lkKQoreworCXVpbnQ2NF90IHByb3Bl cnRpZXNbXSA9IHsKKwkJRFJNX0k5MTVfUEVSRl9QUk9QX0NUWF9IQU5ETEUsIFVJTlQ2NF9NQVgs IC8qIHVwZGF0ZWQgYmVsb3cgKi8KKworCQkvKiBOb3RlOiB3ZSBoYXZlIHRvIHNwZWNpZnkgYXQg bGVhc3Qgb25lIHNhbXBsZSBwcm9wZXJ0eSBldmVuCisJCSAqIHRob3VnaCB3ZSBhcmVuJ3QgaW50 ZXJlc3RlZCBpbiBzYW1wbGVzIGluIHRoaXMgY2FzZQorCQkgKi8KKwkJRFJNX0k5MTVfUEVSRl9Q Uk9QX1NBTVBMRV9PQSwgdHJ1ZSwKKworCQkvKiBPQSB1bml0IGNvbmZpZ3VyYXRpb24gKi8KKwkJ RFJNX0k5MTVfUEVSRl9QUk9QX09BX01FVFJJQ1NfU0VULCBoc3dfcmVuZGVyX2Jhc2ljX2lkLAor CQlEUk1fSTkxNV9QRVJGX1BST1BfT0FfRk9STUFULCBJOTE1X09BX0ZPUk1BVF9BNDVfQjhfQzgs CisKKwkJLyogTm90ZTogbm8gT0EgZXhwb25lbnQgc3BlY2lmaWVkIGluIHRoaXMgY2FzZSAqLwor CX07CisJc3RydWN0IGRybV9pOTE1X3BlcmZfb3Blbl9wYXJhbSBwYXJhbSA9IHsKKwkJLmZsYWdz ID0gSTkxNV9QRVJGX0ZMQUdfRkRfQ0xPRVhFQywKKwkJLm51bV9wcm9wZXJ0aWVzID0gc2l6ZW9m KHByb3BlcnRpZXMpIC8gMTYsCisJCS5wcm9wZXJ0aWVzX3B0ciA9ICh1aW50NjRfdClwcm9wZXJ0 aWVzLAorCX07CisKKwkvKiBzaG91bGQgYmUgZGVmYXVsdCwgYnV0IGp1c3QgdG8gYmUgc3VyZS4u LiAqLworCXdyaXRlX3U2NF9maWxlKCIvcHJvYy9zeXMvZGV2L2k5MTUvcGVyZl9zdHJlYW1fcGFy YW5vaWQiLCAxKTsKKworCWlndF9mb3JrKGNoaWxkLCAxKSB7CisJCWRybV9pbnRlbF9idWZtZ3Ig KmJ1Zm1ncjsKKwkJZHJtX2ludGVsX2NvbnRleHQgKmNvbnRleHQwLCAqY29udGV4dDE7CisJCWlu dCBzdHJlYW1fZmQ7CisJCXN0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlciAqYmF0Y2g7CisJCXN0cnVj dCBpZ3RfYnVmIHNyYywgZHN0OworCQlkcm1faW50ZWxfYm8gKmJvOworCQl1aW50MzJfdCAqcmVw b3J0MF8zMiwgKnJlcG9ydDFfMzI7CisJCXVpbnQ2NF90IHRpbWVzdGFtcDBfNjQsIHRpbWVzdGFt cDFfNjQ7CisJCXVpbnQzMl90IGRlbHRhX3RzNjQsIGRlbHRhX29hMzI7CisJCXVpbnQ2NF90IGRl bHRhX3RzNjRfbnMsIGRlbHRhX29hMzJfbnM7CisJCXVpbnQzMl90IGRlbHRhX2RlbHRhOworCQlp bnQgbl9zYW1wbGVzX3dyaXR0ZW47CisJCWludCB3aWR0aCA9IDgwMDsKKwkJaW50IGhlaWdodCA9 IDYwMDsKKwkJaW50IHJldDsKKworCQlpZ3RfZHJvcF9yb290KCk7CisKKwkJYnVmbWdyID0gZHJt X2ludGVsX2J1Zm1ncl9nZW1faW5pdChkcm1fZmQsIDQwOTYpOworCQlkcm1faW50ZWxfYnVmbWdy X2dlbV9lbmFibGVfcmV1c2UoYnVmbWdyKTsKKworCQlzY3JhdGNoX2J1Zl9pbml0KGJ1Zm1nciwg JnNyYywgd2lkdGgsIGhlaWdodCwgMHhmZjAwMDBmZik7CisJCXNjcmF0Y2hfYnVmX2luaXQoYnVm bWdyLCAmZHN0LCB3aWR0aCwgaGVpZ2h0LCAweDAwZmYwMGZmKTsKKworCQliYXRjaCA9IGludGVs X2JhdGNoYnVmZmVyX2FsbG9jKGJ1Zm1nciwgZGV2aWQpOworCisJCWNvbnRleHQwID0gZHJtX2lu dGVsX2dlbV9jb250ZXh0X2NyZWF0ZShidWZtZ3IpOworCQlpZ3RfYXNzZXJ0KGNvbnRleHQwKTsK KworCQljb250ZXh0MSA9IGRybV9pbnRlbF9nZW1fY29udGV4dF9jcmVhdGUoYnVmbWdyKTsKKwkJ aWd0X2Fzc2VydChjb250ZXh0MSk7CisKKwkJaWd0X2RlYnVnKCJzdWJtaXR0aW5nIHdhcm0gdXAg cmVuZGVyX2NvcHlcbiIpOworCisJCS8qIFN1Ym1pdCBzb21lIGVhcmx5LCB1bm1lYXN1cmVkLCB3 b3JrIHRvIHRoZSBjb250ZXh0IHdlIHdhbnQKKwkJICogdG8gbWVhc3VyZSB0byB0cnkgYW5kIGNh dGNoIGlzc3VlcyB3aXRoIGk5MTUtcGVyZgorCQkgKiBpbml0aWFsaXppbmcgdGhlIEhXIGNvbnRl eHQgSUQgZm9yIGZpbHRlcmluZy4KKwkJICoKKwkJICogV2UgZG8gdGhpcyBiZWNhdXNlIGk5MTUt cGVyZiBzaW5nbGUgY29udGV4dCBmaWx0ZXJpbmcgaGFkCisJCSAqIHByZXZpb3VzbHkgb25seSBy ZWxpZWQgb24gYSBob29rIGludG8gY29udGV4dCBwaW5uaW5nIHRvCisJCSAqIGluaXRpYWxpemUg dGhlIEhXIGNvbnRleHQgSUQsIGluc3RlYWQgb2YgYWxzbyB0cnlpbmcgdG8KKwkJICogZGV0ZXJt aW5lIHRoZSBIVyBJRCB3aGlsZSBvcGVuaW5nIHRoZSBzdHJlYW0sIGluIGNhc2UgaXQKKwkJICog aGFzIGFscmVhZHkgYmVlbiBwaW5uZWQuCisJCSAqCisJCSAqIFRoaXMgd2Fzbid0IG5vdGljZWQg YnkgdGhlIHByZXZpb3VzIHVuaXQgdGVzdCBiZWNhdXNlIHdlCisJCSAqIHdlcmUgb3BlbmluZyB0 aGUgc3RyZWFtIHdoaWxlIHRoZSBjb250ZXh0IGhhZG4ndCBiZWVuCisJCSAqIHRvdWNoZWQgb3Ig cGlubmVkIHlldCBhbmQgc28gaXQgd29ya2VkIG91dCBjb3JyZWN0bHkgdG8gd2FpdAorCQkgKiBm b3IgdGhlIHBpbm5pbmcgaG9vay4KKwkJICoKKwkJICogTm93IGEgYnVnZ3kgdmVyc2lvbiBvZiBp OTE1LXBlcmYgd2lsbCBmYWlsIHRvIG1lYXN1cmUKKwkJICogYW55dGhpbmcgZm9yIGNvbnRleHQw IG9uY2UgdGhpcyBpbml0aWFsIHJlbmRlcl9jb3B5KCkgZW5kcworCQkgKiB1cCBwaW5uaW5nIHRo ZSBjb250ZXh0IHNpbmNlIHRoZXJlIHdvbid0IGV2ZXIgYmUgYSBwaW5uaW5nCisJCSAqIGhvb2sg Y2FsbGJhY2suCisJCSAqLworCQlyZW5kZXJfY29weShiYXRjaCwKKwkJCSAgICBjb250ZXh0MCwK KwkJCSAgICAmc3JjLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LAorCQkJICAgICZkc3QsIDAsIDApOwor CisJCXByb3BlcnRpZXNbMV0gPSBkcm1faW50ZWxfZ2VtX2NvbnRleHRfZ2V0X2NvbnRleHRfaWQo Y29udGV4dDApOworCisJCWlndF9kZWJ1Zygib3BlbmluZyBpOTE1LXBlcmYgc3RyZWFtXG4iKTsK KwkJc3RyZWFtX2ZkID0gX19wZXJmX29wZW4oZHJtX2ZkLCAmcGFyYW0pOworCisJCWJvID0gZHJt X2ludGVsX2JvX2FsbG9jKGJ1Zm1nciwgIm1pX3JwYyBkZXN0IGJvIiwgNDA5NiwgNjQpOworCisJ CXJldCA9IGRybV9pbnRlbF9ib19tYXAoYm8sIHRydWUgLyogd3JpdGUgZW5hYmxlICovKTsKKwkJ aWd0X2Fzc2VydF9lcShyZXQsIDApOworCisJCW1lbXNldChiby0+dmlydHVhbCwgMHg4MCwgNDA5 Nik7CisJCWRybV9pbnRlbF9ib191bm1hcChibyk7CisKKwkJZW1pdF9zdGFsbF90aW1lc3RhbXBf YW5kX3JwYyhiYXRjaCwKKwkJCQkJICAgICBibywKKwkJCQkJICAgICA1MTIgLyogdGltZXN0YW1w IG9mZnNldCAqLywKKwkJCQkJICAgICAwLCAvKiByZXBvcnQgZHN0IG9mZnNldCAqLworCQkJCQkg ICAgIDB4ZGVhZGJlZWYpOyAvKiByZXBvcnQgaWQgKi8KKworCQkvKiBFeHBsaWNpdGx5IGZsdXNo IGhlcmUgKGV2ZW4gdGhvdWdoIHRoZSByZW5kZXJfY29weSgpIGNhbGwKKwkJICogd2lsbCBpdHNl bGYgZmx1c2ggYmVmb3JlL2FmdGVyIHRoZSBjb3B5KSB0byBjbGFyaWZ5IHRoYXQKKwkJICogdGhh dCB0aGUgUElQRV9DT05UUk9MICsgTUlfUlBDIGNvbW1hbmRzIHdpbGwgYmUgaW4gYQorCQkgKiBz ZXBhcmF0ZSBiYXRjaCBmcm9tIHRoZSBjb3B5LgorCQkgKi8KKwkJaW50ZWxfYmF0Y2hidWZmZXJf Zmx1c2hfd2l0aF9jb250ZXh0KGJhdGNoLCBjb250ZXh0MCk7CisKKwkJcmVuZGVyX2NvcHkoYmF0 Y2gsCisJCQkgICAgY29udGV4dDAsCisJCQkgICAgJnNyYywgMCwgMCwgd2lkdGgsIGhlaWdodCwK KwkJCSAgICAmZHN0LCAwLCAwKTsKKworCQkvKiBBbm90aGVyIHJlZHVuZGFudCBmbHVzaCB0byBj bGFyaWZ5IGJhdGNoIGJvIGlzIGZyZWUgdG8gcmV1c2UgKi8KKwkJaW50ZWxfYmF0Y2hidWZmZXJf Zmx1c2hfd2l0aF9jb250ZXh0KGJhdGNoLCBjb250ZXh0MCk7CisKKwkJLyogc3VibWl0IHR3byBj b3BpZXMgb24gdGhlIG90aGVyIGNvbnRleHQgdG8gYXZvaWQgYSBmYWxzZQorCQkgKiBwb3NpdGl2 ZSBpbiBjYXNlIHRoZSBkcml2ZXIgc29tZWhvdyBlbmRlZCB1cCBmaWx0ZXJpbmcgZm9yCisJCSAq IGNvbnRleHQxCisJCSAqLworCQlyZW5kZXJfY29weShiYXRjaCwKKwkJCSAgICBjb250ZXh0MSwK KwkJCSAgICAmc3JjLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LAorCQkJICAgICZkc3QsIDAsIDApOwor CisJCXJlbmRlcl9jb3B5KGJhdGNoLAorCQkJICAgIGNvbnRleHQxLAorCQkJICAgICZzcmMsIDAs IDAsIHdpZHRoLCBoZWlnaHQsCisJCQkgICAgJmRzdCwgMCwgMCk7CisKKwkJLyogQW5kIGFub3Ro ZXIgKi8KKwkJaW50ZWxfYmF0Y2hidWZmZXJfZmx1c2hfd2l0aF9jb250ZXh0KGJhdGNoLCBjb250 ZXh0MSk7CisKKwkJZW1pdF9zdGFsbF90aW1lc3RhbXBfYW5kX3JwYyhiYXRjaCwKKwkJCQkJICAg ICBibywKKwkJCQkJICAgICA1MjAgLyogdGltZXN0YW1wIG9mZnNldCAqLywKKwkJCQkJICAgICAy NTYsIC8qIHJlcG9ydCBkc3Qgb2Zmc2V0ICovCisJCQkJCSAgICAgMHhiZWVmYmVlZik7IC8qIHJl cG9ydCBpZCAqLworCisJCWludGVsX2JhdGNoYnVmZmVyX2ZsdXNoX3dpdGhfY29udGV4dChiYXRj aCwgY29udGV4dDApOworCisJCXJldCA9IGRybV9pbnRlbF9ib19tYXAoYm8sIGZhbHNlIC8qIHdy aXRlIGVuYWJsZSAqLyk7CisJCWlndF9hc3NlcnRfZXEocmV0LCAwKTsKKworCQlyZXBvcnQwXzMy ID0gYm8tPnZpcnR1YWw7CisJCWlndF9hc3NlcnRfZXEocmVwb3J0MF8zMlswXSwgMHhkZWFkYmVl Zik7IC8qIHJlcG9ydCBJRCAqLworCQlpZ3RfYXNzZXJ0X25lcShyZXBvcnQwXzMyWzFdLCAwKTsg LyogdGltZXN0YW1wICovCisKKwkJcmVwb3J0MV8zMiA9IHJlcG9ydDBfMzIgKyA2NDsKKwkJaWd0 X2Fzc2VydF9lcShyZXBvcnQxXzMyWzBdLCAweGJlZWZiZWVmKTsgLyogcmVwb3J0IElEICovCisJ CWlndF9hc3NlcnRfbmVxKHJlcG9ydDFfMzJbMV0sIDApOyAvKiB0aW1lc3RhbXAgKi8KKworCQlw cmludF9yZXBvcnRzKHJlcG9ydDBfMzIsIHJlcG9ydDFfMzIsCisJCQkgICAgICBsb29rdXBfZm9y bWF0KEk5MTVfT0FfRk9STUFUX0E0NV9COF9DOCkpOworCisJCS8qIEE0MCA9PSBOIHNhbXBsZXMg d3JpdHRlbiB0byBhbGwgcmVuZGVyIHRhcmdldHMgKi8KKwkJbl9zYW1wbGVzX3dyaXR0ZW4gPSBy ZXBvcnQxXzMyWzQzXSAtIHJlcG9ydDBfMzJbNDNdOworCQlpZ3RfZGVidWcoIm4gc2FtcGxlcyB3 cml0dGVuID0gJWRcbiIsIG5fc2FtcGxlc193cml0dGVuKTsKKwkJaWd0X2Fzc2VydF9lcShuX3Nh bXBsZXNfd3JpdHRlbiwgd2lkdGggKiBoZWlnaHQpOworCisJCWlndF9kZWJ1ZygidGltZXN0YW1w MzIgMCA9ICV1XG4iLCByZXBvcnQwXzMyWzFdKTsKKwkJaWd0X2RlYnVnKCJ0aW1lc3RhbXAzMiAx ID0gJXVcbiIsIHJlcG9ydDFfMzJbMV0pOworCisJCXRpbWVzdGFtcDBfNjQgPSAqKHVpbnQ2NF90 ICopKCgodWludDhfdCAqKWJvLT52aXJ0dWFsKSArIDUxMik7CisJCXRpbWVzdGFtcDFfNjQgPSAq KHVpbnQ2NF90ICopKCgodWludDhfdCAqKWJvLT52aXJ0dWFsKSArIDUyMCk7CisKKwkJaWd0X2Rl YnVnKCJ0aW1lc3RhbXA2NCAwID0gJSJQUkl1NjQiXG4iLCB0aW1lc3RhbXAwXzY0KTsKKwkJaWd0 X2RlYnVnKCJ0aW1lc3RhbXA2NCAxID0gJSJQUkl1NjQiXG4iLCB0aW1lc3RhbXAxXzY0KTsKKwor CQlkZWx0YV90czY0ID0gdGltZXN0YW1wMV82NCAtIHRpbWVzdGFtcDBfNjQ7CisJCWRlbHRhX29h MzIgPSByZXBvcnQxXzMyWzFdIC0gcmVwb3J0MF8zMlsxXTsKKworCQkvKiBzYW5pdHkgY2hlY2sg dGhhdCB3ZSBjYW4gcGFzcyB0aGUgZGVsdGEgdG8gdGltZWJhc2Vfc2NhbGUgKi8KKwkJaWd0X2Fz c2VydChkZWx0YV90czY0IDwgVUlOVDMyX01BWCk7CisJCWRlbHRhX29hMzJfbnMgPSB0aW1lYmFz ZV9zY2FsZShkZWx0YV9vYTMyKTsKKwkJZGVsdGFfdHM2NF9ucyA9IHRpbWViYXNlX3NjYWxlKGRl bHRhX3RzNjQpOworCisJCWlndF9kZWJ1ZygidHMzMiBkZWx0YSA9ICV1LCA9ICV1bnNcbiIsCisJ CQkgIGRlbHRhX29hMzIsICh1bnNpZ25lZClkZWx0YV9vYTMyX25zKTsKKwkJaWd0X2RlYnVnKCJ0 czY0IGRlbHRhID0gJXUsID0gJXVuc1xuIiwKKwkJCSAgZGVsdGFfdHM2NCwgKHVuc2lnbmVkKWRl bHRhX3RzNjRfbnMpOworCisJCS8qIFRoZSBkZWx0YSBhcyBjYWxjdWxhdGVkIHZpYSB0aGUgUElQ RV9DT05UUk9MIHRpbWVzdGFtcCBvcgorCQkgKiB0aGUgT0EgcmVwb3J0IHRpbWVzdGFtcHMgc2hv dWxkIGJlIGFsbW9zdCBpZGVudGljYWwgYnV0CisJCSAqIGFsbG93IGEgMzIwIG5hbm9zZWNvbmRz IG1hcmdpbi4KKwkJICovCisJCWRlbHRhX2RlbHRhID0gZGVsdGFfdHM2NF9ucyA+IGRlbHRhX29h MzJfbnMgPworCQkJKGRlbHRhX3RzNjRfbnMgLSBkZWx0YV9vYTMyX25zKSA6CisJCQkoZGVsdGFf b2EzMl9ucyAtIGRlbHRhX3RzNjRfbnMpOworCQlpZ3RfYXNzZXJ0KGRlbHRhX2RlbHRhIDw9IDMy MCk7CisKKwkJZHJtX2ludGVsX2JvX3VucmVmZXJlbmNlKHNyYy5ibyk7CisJCWRybV9pbnRlbF9i b191bnJlZmVyZW5jZShkc3QuYm8pOworCisJCWRybV9pbnRlbF9ib191bm1hcChibyk7CisJCWRy bV9pbnRlbF9ib191bnJlZmVyZW5jZShibyk7CisJCWludGVsX2JhdGNoYnVmZmVyX2ZyZWUoYmF0 Y2gpOworCQlkcm1faW50ZWxfZ2VtX2NvbnRleHRfZGVzdHJveShjb250ZXh0MCk7CisJCWRybV9p bnRlbF9nZW1fY29udGV4dF9kZXN0cm95KGNvbnRleHQxKTsKKwkJZHJtX2ludGVsX2J1Zm1ncl9k ZXN0cm95KGJ1Zm1ncik7CisJCWNsb3NlKHN0cmVhbV9mZCk7CisJfQorCisJaWd0X3dhaXRjaGls ZHJlbigpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9yYzZfZGlzYWJsZSh2b2lkKQoreworCWlu dCBvYV9leHBvbmVudCA9IDEzOyAvKiAxIG1pbGxpc2Vjb25kICovCisJdWludDY0X3QgcHJvcGVy dGllc1tdID0geworCQkvKiBJbmNsdWRlIE9BIHJlcG9ydHMgaW4gc2FtcGxlcyAqLworCQlEUk1f STkxNV9QRVJGX1BST1BfU0FNUExFX09BLCB0cnVlLAorCisJCS8qIE9BIHVuaXQgY29uZmlndXJh dGlvbiAqLworCQlEUk1fSTkxNV9QRVJGX1BST1BfT0FfTUVUUklDU19TRVQsIGhzd19yZW5kZXJf YmFzaWNfaWQsCisJCURSTV9JOTE1X1BFUkZfUFJPUF9PQV9GT1JNQVQsIEk5MTVfT0FfRk9STUFU X0E0NV9COF9DOCwKKwkJRFJNX0k5MTVfUEVSRl9QUk9QX09BX0VYUE9ORU5ULCBvYV9leHBvbmVu dCwKKwl9OworCXN0cnVjdCBkcm1faTkxNV9wZXJmX29wZW5fcGFyYW0gcGFyYW0gPSB7CisJCS5m bGFncyA9IEk5MTVfUEVSRl9GTEFHX0ZEX0NMT0VYRUMsCisJCS5udW1fcHJvcGVydGllcyA9IHNp emVvZihwcm9wZXJ0aWVzKSAvIDE2LAorCQkucHJvcGVydGllc19wdHIgPSAodWludDY0X3QpcHJv cGVydGllcywKKwl9OworCWludCBzdHJlYW1fZmQgPSBfX3BlcmZfb3Blbihkcm1fZmQsICZwYXJh bSk7CisJdWludDY0X3Qgbl9ldmVudHNfc3RhcnQgPSByZWFkX2RlYnVnZnNfdTY0X3JlY29yZCgi aTkxNV9kcnBjX2luZm8iLAorCQkJCQkJCSAgIlJDNiByZXNpZGVuY3kgc2luY2UgYm9vdCIpOwor CXVpbnQ2NF90IG5fZXZlbnRzX2VuZDsKKworCW5hbm9zbGVlcCgmKHN0cnVjdCB0aW1lc3BlYyl7 IC50dl9zZWMgPSAwLCAudHZfbnNlYyA9IDUwMDAwMDAwMCB9LCBOVUxMKTsKKworCW5fZXZlbnRz X2VuZCA9IHJlYWRfZGVidWdmc191NjRfcmVjb3JkKCJpOTE1X2RycGNfaW5mbyIsCisJCQkJCSAg ICAgICAiUkM2IHJlc2lkZW5jeSBzaW5jZSBib290Iik7CisKKwlpZ3RfYXNzZXJ0X2VxKG5fZXZl bnRzX2VuZCAtIG5fZXZlbnRzX3N0YXJ0LCAwKTsKKworCWNsb3NlKHN0cmVhbV9mZCk7CisKKwlu X2V2ZW50c19zdGFydCA9IHJlYWRfZGVidWdmc191NjRfcmVjb3JkKCJpOTE1X2RycGNfaW5mbyIs CisJCQkJCQkgIlJDNiByZXNpZGVuY3kgc2luY2UgYm9vdCIpOworCisJbmFub3NsZWVwKCYoc3Ry dWN0IHRpbWVzcGVjKXsgLnR2X3NlYyA9IDAsIC50dl9uc2VjID0gNTAwMDAwMDAwIH0sIE5VTEwp OworCisJbl9ldmVudHNfZW5kID0gcmVhZF9kZWJ1Z2ZzX3U2NF9yZWNvcmQoImk5MTVfZHJwY19p bmZvIiwKKwkJCQkJICAgICAgICJSQzYgcmVzaWRlbmN5IHNpbmNlIGJvb3QiKTsKKworCWlndF9h c3NlcnRfbmVxKG5fZXZlbnRzX2VuZCAtIG5fZXZlbnRzX3N0YXJ0LCAwKTsKK30KKworc3RhdGlj IHVuc2lnbmVkCityZWFkX2k5MTVfbW9kdWxlX3JlZih2b2lkKQoreworCUZJTEUgKmZwID0gZm9w ZW4oIi9wcm9jL21vZHVsZXMiLCAiciIpOworCWNoYXIgKmxpbmUgPSBOVUxMOworCXNpemVfdCBs aW5lX2J1Zl9zaXplID0gMDsKKwlpbnQgbGVuID0gMDsKKwl1bnNpZ25lZCByZWZfY291bnQ7CisK KwlpZ3RfYXNzZXJ0KGZwKTsKKworCXdoaWxlICgobGVuID0gZ2V0bGluZSgmbGluZSwgJmxpbmVf YnVmX3NpemUsIGZwKSkgPiAwKSB7CisJCWlmIChzdHJuY21wKGxpbmUsICJpOTE1ICIsIDUpID09 IDApIHsKKwkJCXVuc2lnbmVkIGxvbmcgbWVtOworCQkJaW50IHJldCA9IHNzY2FuZihsaW5lICsg NSwgIiVsdSAldSIsICZtZW0sICZyZWZfY291bnQpOworCQkJaWd0X2Fzc2VydChyZXQgPT0gMik7 CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwlpZ3RfYXNzZXJ0KCEicmVhY2hlZCIpOworCitk b25lOgorCWZyZWUobGluZSk7CisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gcmVmX2NvdW50OworfQor CisvKiBjaGVjayB0aGF0IGFuIG9wZW4gaTkxNSBwZXJmIHN0cmVhbSBob2xkcyBhIHJlZmVyZW5j ZSBvbiB0aGUgZHJtIGk5MTUgbW9kdWxlCisgKiBpbmNsdWRpbmcgaW4gdGhlIGNvcm5lciBjYXNl IHdoZXJlIHRoZSBvcmlnaW5hbCBkcm0gZmQgaGFzIGJlZW4gY2xvc2VkLgorICovCitzdGF0aWMg dm9pZAordGVzdF9pOTE1X3JlZl9jb3VudCh2b2lkKQoreworCWludCBvYV9leHBvbmVudCA9IDEz OyAvKiAxIG1pbGxpc2Vjb25kICovCisJdWludDY0X3QgcHJvcGVydGllc1tdID0geworCQkvKiBJ bmNsdWRlIE9BIHJlcG9ydHMgaW4gc2FtcGxlcyAqLworCQlEUk1fSTkxNV9QRVJGX1BST1BfU0FN UExFX09BLCB0cnVlLAorCisJCS8qIE9BIHVuaXQgY29uZmlndXJhdGlvbiAqLworCQlEUk1fSTkx NV9QRVJGX1BST1BfT0FfTUVUUklDU19TRVQsIDAgLyogdXBkYXRlZCBiZWxvdyAqLywKKwkJRFJN X0k5MTVfUEVSRl9QUk9QX09BX0ZPUk1BVCwgSTkxNV9PQV9GT1JNQVRfQTQ1X0I4X0M4LAorCQlE Uk1fSTkxNV9QRVJGX1BST1BfT0FfRVhQT05FTlQsIG9hX2V4cG9uZW50LAorCX07CisJc3RydWN0 IGRybV9pOTE1X3BlcmZfb3Blbl9wYXJhbSBwYXJhbSA9IHsKKwkJLmZsYWdzID0gSTkxNV9QRVJG X0ZMQUdfRkRfQ0xPRVhFQywKKwkJLm51bV9wcm9wZXJ0aWVzID0gc2l6ZW9mKHByb3BlcnRpZXMp IC8gMTYsCisJCS5wcm9wZXJ0aWVzX3B0ciA9ICh1aW50NjRfdClwcm9wZXJ0aWVzLAorCX07CisJ dW5zaWduZWQgYmFzZWxpbmUsIHJlZl9jb3VudDAsIHJlZl9jb3VudDE7CisJaW50IHN0cmVhbV9m ZDsKKwl1aW50MzJfdCBvYV9yZXBvcnQwWzY0XTsKKwl1aW50MzJfdCBvYV9yZXBvcnQxWzY0XTsK KworCS8qIFRoaXMgc2hvdWxkIGJlIHRoZSBmaXJzdCB0ZXN0IGJlZm9yZSB0aGUgZmlyc3QgZml4 dHVyZSBzbyBubyBkcm1fZmQKKwkgKiBzaG91bGQgaGF2ZSBiZWVuIG9wZW5lZCBzbyBmYXIuLi4K KwkgKi8KKwlpZ3RfYXNzZXJ0X2VxKGRybV9mZCwgLTEpOworCisJYmFzZWxpbmUgPSByZWFkX2k5 MTVfbW9kdWxlX3JlZigpOworCWlndF9kZWJ1ZygiYmFzZWxpbmUgcmVmIGNvdW50IChkcm0gZmQg Y2xvc2VkKSA9ICV1XG4iLCBiYXNlbGluZSk7CisKKwlkcm1fZmQgPSBfX2RybV9vcGVuX2RyaXZl cihEUklWRVJfSU5URUwpOworCWRldmlkID0gaW50ZWxfZ2V0X2RybV9kZXZpZChkcm1fZmQpOwor CWRldmljZSA9IGRybV9nZXRfY2FyZCgpOworCisJaWd0X3JlcXVpcmUoSVNfSEFTV0VMTChkZXZp ZCkpOworCWlndF9yZXF1aXJlKGxvb2t1cF9oc3dfcmVuZGVyX2Jhc2ljX2lkKCkpOworCXByb3Bl cnRpZXNbM10gPSBoc3dfcmVuZGVyX2Jhc2ljX2lkOworCisJcmVmX2NvdW50MCA9IHJlYWRfaTkx NV9tb2R1bGVfcmVmKCk7CisJaWd0X2RlYnVnKCJpbml0aWFsIHJlZiBjb3VudCB3aXRoIGRybV9m ZCBvcGVuID0gJXVcbiIsIHJlZl9jb3VudDApOworCWlndF9hc3NlcnQocmVmX2NvdW50MCA+IGJh c2VsaW5lKTsKKworCXN0cmVhbV9mZCA9IF9fcGVyZl9vcGVuKGRybV9mZCwgJnBhcmFtKTsKKwly ZWZfY291bnQxID0gcmVhZF9pOTE1X21vZHVsZV9yZWYoKTsKKwlpZ3RfZGVidWcoInJlZiBjb3Vu dCBhZnRlciBvcGVuaW5nIGk5MTUgcGVyZiBzdHJlYW0gPSAldVxuIiwgcmVmX2NvdW50MSk7CisJ aWd0X2Fzc2VydChyZWZfY291bnQxID4gcmVmX2NvdW50MCk7CisKKwljbG9zZShkcm1fZmQpOwor CWRybV9mZCA9IC0xOworCXJlZl9jb3VudDAgPSByZWFkX2k5MTVfbW9kdWxlX3JlZigpOworCWln dF9kZWJ1ZygicmVmIGNvdW50IGFmdGVyIGNsb3NpbmcgZHJtIGZkID0gJXVcbiIsIHJlZl9jb3Vu dDApOworCisJaWd0X2Fzc2VydChyZWZfY291bnQwID4gYmFzZWxpbmUpOworCisJcmVhZF8yX29h X3JlcG9ydHMoc3RyZWFtX2ZkLAorCQkJICBJOTE1X09BX0ZPUk1BVF9BNDVfQjhfQzgsCisJCQkg IG9hX2V4cG9uZW50LAorCQkJICBvYV9yZXBvcnQwLAorCQkJICBvYV9yZXBvcnQxLAorCQkJICBm YWxzZSk7IC8qIG5vdCBqdXN0IHRpbWVyIHJlcG9ydHMgKi8KKworCWNsb3NlKHN0cmVhbV9mZCk7 CisJcmVmX2NvdW50MCA9IHJlYWRfaTkxNV9tb2R1bGVfcmVmKCk7CisJaWd0X2RlYnVnKCJyZWYg Y291bnQgYWZ0ZXIgY2xvc2luZyBpOTE1IHBlcmYgc3RyZWFtIGZkID0gJXVcbiIsIHJlZl9jb3Vu dDApOworCWlndF9hc3NlcnRfZXEocmVmX2NvdW50MCwgYmFzZWxpbmUpOworfQorCitzdGF0aWMg dm9pZAordGVzdF9zeXNjdGxfZGVmYXVsdHModm9pZCkKK3sKKwlpbnQgcGFyYW5vaWQgPSByZWFk X3U2NF9maWxlKCIvcHJvYy9zeXMvZGV2L2k5MTUvcGVyZl9zdHJlYW1fcGFyYW5vaWQiKTsKKwlp bnQgbWF4X2ZyZXEgPSByZWFkX3U2NF9maWxlKCIvcHJvYy9zeXMvZGV2L2k5MTUvb2FfbWF4X3Nh bXBsZV9yYXRlIik7CisKKwlpZ3RfYXNzZXJ0X2VxKHBhcmFub2lkLCAxKTsKKwlpZ3RfYXNzZXJ0 X2VxKG1heF9mcmVxLCAxMDAwMDApOworfQorCitpZ3RfbWFpbgoreworCWlndF9za2lwX29uX3Np bXVsYXRpb24oKTsKKworCWlndF9maXh0dXJlIHsKKwkJc3RydWN0IHN0YXQgc2I7CisKKwkJaWd0 X3JlcXVpcmUoc3RhdCgiL3Byb2Mvc3lzL2Rldi9pOTE1L3BlcmZfc3RyZWFtX3BhcmFub2lkIiwg JnNiKQorCQkJICAgID09IDApOworCQlpZ3RfcmVxdWlyZShzdGF0KCIvcHJvYy9zeXMvZGV2L2k5 MTUvb2FfbWF4X3NhbXBsZV9yYXRlIiwgJnNiKQorCQkJICAgID09IDApOworCX0KKworCWlndF9z dWJ0ZXN0KCJpOTE1LXJlZi1jb3VudCIpCisJCXRlc3RfaTkxNV9yZWZfY291bnQoKTsKKworCWln dF9zdWJ0ZXN0KCJzeXNjdGwtZGVmYXVsdHMiKQorCQl0ZXN0X3N5c2N0bF9kZWZhdWx0cygpOwor CisJaWd0X2ZpeHR1cmUgeworCQkvKiBXZSBleHBlY3QgdGhhdCB0aGUgcmVmIGNvdW50IHRlc3Qg YmVmb3JlIHRoZXNlIGZpeHR1cmVzCisJCSAqIHNob3VsZCBoYXZlIGNsb3NlZCBkcm1fZmQuLi4K KwkJICovCisJCWlndF9hc3NlcnRfZXEoZHJtX2ZkLCAtMSk7CisJCWRybV9mZCA9IGRybV9vcGVu X2RyaXZlcl9yZW5kZXIoRFJJVkVSX0lOVEVMKTsKKwkJZGV2aWQgPSBpbnRlbF9nZXRfZHJtX2Rl dmlkKGRybV9mZCk7CisJCWRldmljZSA9IGRybV9nZXRfY2FyZCgpOworCisJCWlndF9yZXF1aXJl KElTX0hBU1dFTEwoZGV2aWQpKTsKKwkJaWd0X3JlcXVpcmUobG9va3VwX2hzd19yZW5kZXJfYmFz aWNfaWQoKSk7CisKKwkJZ3RfZnJlcXVlbmN5X3JhbmdlX3NhdmUoKTsKKworCQl3cml0ZV91NjRf ZmlsZSgiL3Byb2Mvc3lzL2Rldi9pOTE1L3BlcmZfc3RyZWFtX3BhcmFub2lkIiwgMSk7CisJCXdy aXRlX3U2NF9maWxlKCIvcHJvYy9zeXMvZGV2L2k5MTUvb2FfbWF4X3NhbXBsZV9yYXRlIiwgMTAw MDAwKTsKKworCQlyZW5kZXJfY29weSA9IGlndF9nZXRfcmVuZGVyX2NvcHlmdW5jKGRldmlkKTsK KwkJaWd0X3JlcXVpcmVfZihyZW5kZXJfY29weSwgIm5vIHJlbmRlci1jb3B5IGZ1bmN0aW9uXG4i KTsKKwl9CisKKwlpZ3Rfc3VidGVzdCgibm9uLXN5c3RlbS13aWRlLXBhcmFub2lkIikKKwkJdGVz dF9zeXN0ZW1fd2lkZV9wYXJhbm9pZCgpOworCisJaWd0X3N1YnRlc3QoImludmFsaWQtb3Blbi1m bGFncyIpCisJCXRlc3RfaW52YWxpZF9vcGVuX2ZsYWdzKCk7CisKKwlpZ3Rfc3VidGVzdCgiaW52 YWxpZC1vYS1tZXRyaWMtc2V0LWlkIikKKwkJdGVzdF9pbnZhbGlkX29hX21ldHJpY19zZXRfaWQo KTsKKworCWlndF9zdWJ0ZXN0KCJpbnZhbGlkLW9hLWZvcm1hdC1pZCIpCisJCXRlc3RfaW52YWxp ZF9vYV9mb3JtYXRfaWQoKTsKKworCWlndF9zdWJ0ZXN0KCJtaXNzaW5nLXNhbXBsZS1mbGFncyIp CisJCXRlc3RfbWlzc2luZ19zYW1wbGVfZmxhZ3MoKTsKKworCWlndF9zdWJ0ZXN0KCJvYS1mb3Jt YXRzIikKKwkJdGVzdF9vYV9mb3JtYXRzKCk7CisKKwlpZ3Rfc3VidGVzdCgiaW52YWxpZC1vYS1l eHBvbmVudCIpCisJCXRlc3RfaW52YWxpZF9vYV9leHBvbmVudCgpOworCWlndF9zdWJ0ZXN0KCJs b3ctb2EtZXhwb25lbnQtcGVybWlzc2lvbnMiKQorCQl0ZXN0X2xvd19vYV9leHBvbmVudF9wZXJt aXNzaW9ucygpOworCWlndF9zdWJ0ZXN0KCJvYS1leHBvbmVudHMiKSB7CisJCXRlc3Rfb2FfZXhw b25lbnRzKDQ1MCk7CisJCXRlc3Rfb2FfZXhwb25lbnRzKDU1MCk7CisJfQorCisJaWd0X3N1YnRl c3QoInBlci1jb250ZXh0LW1vZGUtdW5wcml2aWxlZ2VkIikKKwkJdGVzdF9wZXJfY29udGV4dF9t b2RlX3VucHJpdmlsZWdlZCgpOworCisJaWd0X3N1YnRlc3QoImJ1ZmZlci1maWxsIikKKwkJdGVz dF9idWZmZXJfZmlsbCgpOworCisJaWd0X3N1YnRlc3QoImRpc2FibGVkLXJlYWQtZXJyb3IiKQor CQl0ZXN0X2Rpc2FibGVkX3JlYWRfZXJyb3IoKTsKKwlpZ3Rfc3VidGVzdCgibm9uLXNhbXBsaW5n LXJlYWQtZXJyb3IiKQorCQl0ZXN0X25vbl9zYW1wbGluZ19yZWFkX2Vycm9yKCk7CisKKwlpZ3Rf c3VidGVzdCgiZW5hYmxlLWRpc2FibGUiKQorCQl0ZXN0X2VuYWJsZV9kaXNhYmxlKCk7CisKKwlp Z3Rfc3VidGVzdCgiYmxvY2tpbmciKQorCQl0ZXN0X2Jsb2NraW5nKCk7CisKKwlpZ3Rfc3VidGVz dCgicG9sbGluZyIpCisJCXRlc3RfcG9sbGluZygpOworCisJaWd0X3N1YnRlc3QoInNob3J0LXJl YWRzIikKKwkJdGVzdF9zaG9ydF9yZWFkcygpOworCisJaWd0X3N1YnRlc3QoIm1pLXJwYyIpCisJ CXRlc3RfbWlfcnBjKCk7CisKKwlpZ3Rfc3VidGVzdCgibWktcnBjLXBlci1jdHgiKQorCQl0ZXN0 X3Blcl9jdHhfbWlfcnBjKCk7CisKKwlpZ3Rfc3VidGVzdCgicmM2LWRpc2FibGUiKQorCQl0ZXN0 X3JjNl9kaXNhYmxlKCk7CisKKwlpZ3RfZml4dHVyZSB7CisJCS8qIGxlYXZlIHN5c2N0bCBvcHRp b25zIGluIHRoZWlyIGRlZmF1bHQgc3RhdGUuLi4gKi8KKwkJd3JpdGVfdTY0X2ZpbGUoIi9wcm9j L3N5cy9kZXYvaTkxNS9vYV9tYXhfc2FtcGxlX3JhdGUiLCAxMDAwMDApOworCQl3cml0ZV91NjRf ZmlsZSgiL3Byb2Mvc3lzL2Rldi9pOTE1L3BlcmZfc3RyZWFtX3BhcmFub2lkIiwgMSk7CisKKwkJ Z3RfZnJlcXVlbmN5X3JhbmdlX3Jlc3RvcmUoKTsKKworCQljbG9zZShkcm1fZmQpOworCX0KK30K LS0gCjIuMTAuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn Cmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4 Cg==