From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lyude Subject: [RFC i-g-t v3 5/5] Add support for hotplug testing with the Chamelium Date: Wed, 30 Nov 2016 20:24:48 -0500 Message-ID: <20161201012448.16334-6-lyude@redhat.com> References: <20161201012448.16334-1-lyude@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by gabe.freedesktop.org (Postfix) with ESMTPS id 538C66E5E4 for ; Thu, 1 Dec 2016 01:24:56 +0000 (UTC) In-Reply-To: <20161201012448.16334-1-lyude@redhat.com> 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 Cc: Lyude List-Id: intel-gfx@lists.freedesktop.org Rm9yIHRoZSBwdXJwb3NlIG9mIHRlc3RpbmcgdGhpbmdzIHN1Y2ggYXMgaG90cGx1Z2dpbmcgYW5k IGJhZCBtb25pdG9ycywKdGhlIENocm9tZU9TIHRlYW0gZW5kZWQgdXAgZGVzaWduaW5nIGEgbmVh dCBsaXR0bGUgZGV2aWNlIGtub3duIGFzIHRoZQpDaGFtZWxpdW0uIE1vcmUgaW5mb3JtYXRpb24g b24gdGhpcyBjYW4gYmUgZm91bmQgaGVyZToKCglodHRwczovL3d3dy5jaHJvbWl1bS5vcmcvY2hy b21pdW0tb3MvdGVzdGluZy9jaGFtZWxpdW0KClRoaXMgYWRkcyBzdXBwb3J0IGZvciBhIGNvdXBs ZSBvZiB0aGluZ3MgdG8gaW50ZWwtZ3B1LXRvb2xzOgogLSBpZ3QgbGlicmFyeSBmdW5jdGlvbnMg Zm9yIGNvbm5lY3RpbmcgdG8gdWRldiBhbmQgbW9uaXRvcmluZyBpdCBmb3IKICAgaG90cGx1ZyBl dmVudHMsIGxvb3NlbHkgYmFzZWQgb2ZmIG9mIHRoZSB1bmZpbmlzaGVkIGhvdHBsdWdnaW5nCiAg IGltcGxlbWVudGF0aW9uIGluIHRlc3RkaXNwbGF5CiAtIExpYnJhcnkgZnVuY3Rpb25zIGZvciBj b250cm9sbGluZyB0aGUgY2hhbWVsaXVtIGluIHRlc3RzIHVzaW5nCiAgIHhtbHJwYy4gQSBjb3Vw bGUgb2YgUlBDIGNhbGxzIHdlcmUgb21taXR0ZWQgaGVyZSwgbWFpbmx5IGJlY2F1c2UgdGhleQog ICBkaWRuJ3Qgc2VlbSB2ZXJ5IHVzZWZ1bCBmb3Igb3VyIG5lZWRzICh5ZXQpCiAtIEEgc2V0IG9m IGJhc2ljIHRlc3RzIHVzaW5nIHRoZSBjaGFtZWxpdW0uCgpTaWduZWQtb2ZmLWJ5OiBMeXVkZSA8 bHl1ZGVAcmVkaGF0LmNvbT4KCkNoYW5nZXMgc2luY2UgdjE6Ci0gRG9uJ3QgdHJ5IHRvIGd1ZXNz IGNvbm5lY3RvciBtYXBwaW5ncywgaGF2ZSB0aGUgdXNlciBzcGVjaWZ5IHRoZW0KICBtYW51YWxs eSB1c2luZyBhIGNvbmZpZ3VyYXRpb24gZmlsZQotIE9wZW4gRFJNIGZkIHVzaW5nIERSSVZFUl9B TlksIG5vdCBEUklWRVJfSU5URUwKLSBMb3dlciB0aGUgaG90cGx1ZyB0aW1lb3V0IGEgbGl0dGxl IGJpdCwgc2luY2UgMzAgc2Vjb25kcyB3YXMgbGVmdG92ZXIKICBmcm9tIGRlYnVnZ2luZyB0aGVz ZSB0ZXN0cyBhbnl3YXkKLSBEb24ndCB0cnkgdG8ga2VlcCB0cmFjayBvZiB0aGUgb3JpZ2luYWwg c3RhdGUgb2YgdGhlIGNoYW1lbGl1bSBwb3J0cywKICBhbmQganVzdCBsZWF2ZSB0aGVtIHBsdWdn ZWQgaW4gYWZ0ZXIgZWFjaCBydW4uIFRoaXMgbWFrZXMgbW9yZSBzZW5zZQogIHRvIG1lLCBzaW5j ZSBJJ2QgaW1hZ2luZSBpbiBhdXRvbWF0ZWQgdGVzdGluZyBzZXR1cHMgdXNpbmcgY2hhbWVsaXVt cwogIHRoYXQgYWxsIG9mIHRoZSBleHRyYSBtb25pdG9ycyB3aWxsIHByb2JhYmx5IGJlIHByb3Zp ZGVkIGJ5IHRoZQogIENoYW1lbGl1bSB0byBiZWdpbiB3aXRoLCBzbyBrZWVwaW5nIHRoZW0gcGx1 Z2dlZCBpbiB3b3VsZCBtYWtlIHN1cmUKICB0ZXN0cyBydW5uaW5nIGFmdGVyd2FyZHMgdGhhdCBy ZXF1aXJlID4xIG1vbml0b3IgZG9uJ3QgZ2V0IHNraXBwZWQuCi0gQWRkIHdhaXRfZm9yX2Nvbm5l Y3RvcigpIHRvIHRoZSBjaGFtZWxpdW0gdGVzdHMuIEFmdGVyIHNvbWUgbW9yZQogIHRlc3Rpbmcs IEkgZm91bmQgdGhhdCBkZXBlbmRpbmcgb24gdGhlIHN5c3RlbSBzb21lIHRlc3RzIHdvdWxkIHRo cm93CiAgZmFsc2UgbmVnYXRpdmVzIGR1ZSB0byB1cyBub3Qgd2FpdGluZyBsb25nIGVub3VnaCBm b3IgdGhlIHN5c3RlbSB0bwogIGRldGVjdCB0aGF0IHdlIGNvbm5lY3RlZCBzb21ldGhpbmcgdG8g aXQuIFRoaXMgbWFpbmx5IGhhcHBlbmVkIHdpdGgKICBWR0EgY29ubmVjdG9ycywgc2luY2UgdGhl aXIgbGFjayBvZiBIUEQgbWFrZXMgdGhlbSB0YWtlIHNpZ25pZmljYW50bHkKICBsb25nZXIgZm9y IHRoZSBoYXJkd2FyZSB0byBub3RpY2UuIHdhaXRfZm9yX2Nvbm5lY3RvcigpIGZpeGVzIHRoaXMg YnkKICBjb250aW51YWxseSByZXByb2JpbmcgdGhlIHN0YXR1cyBvZiB0aGUgZGVzaXJlZCBjb25u ZWN0b3IgKHdpdGhvdXQKICByZWx5aW5nIG9uIGEgaHBkIGV2ZW50IGhhcHBlbmluZywgc2luY2Ug dGhhdCBtaWdodCBuZXZlciBjb21lKSB1bnRpbAogIHdlIGdldCB3aGF0IHdlIHdhbnQsIG9yIHdl IHRpbWUgb3V0IGFuZCBmYWlsLgotIFVzZSBrbXN0ZXN0X2dldF9wcm9wZXJ0eSgpIGZvciByZXRy aWV2aW5nIEVESURzIGluc3RlYWQgb2YgZG9pbmcgaXQgYnkKICBoYW5kCi0gRG9uJ3QgaGFyZGNv ZGUgUElQRV9BIGZvciBicmluZ2luZyB1cCB0aGUgZGlzcGxheSwgdXNlIGttc3Rlc3QgdG8gZmlu ZAogIGFuIGFwcHJvcHJpYXRlIENSVEMgdG8gdXNlLgpDaGFuZ2VzIHNpbmNlIHYyOgotIEZpeCBp bmNvcnJlY3QgdXNhZ2Ugb2YgdGhlIGxpc3QgaGVscGVycyB3aGVuIHJlY29yZGluZyBuZXcgRURJ RHMKLSBBZGQgbWlzc2luZyBkb2N1bWVudGF0aW9uCi0gTWFrZSBzdXJlIGRvY3VtZW50YXRpb24g YWN0dWFsbHkgYXBwZWFycwotIFNpbmNlIHdlIGZpbmFsbHkgZ290IHZpZGVvIGNhcHR1cmUgd29y a2luZywgYWRkIENSQyBmdW5jdGlvbnMgYW5kIGZpeAogIHRoZSBvbmVzIHdlIGNvdWxkbid0IGFj dHVhbGx5IHRlc3QgYmVmb3JlCi0gSW4gdGhlIGV4aXQgaGFuZGxlciwgcmVzZXQgdGhlIHhtbHJw YyBlbnYgc28gd2UgY2FuIHByb3Blcmx5IHJlc2V0IHRoZQogIENoYW1lbGl1bSBldmVuIGFmdGVy IGFuIFJQQyBlcnJvcgotIE1ha2Ugc3VyZSBjb21waWxpbmcgd2l0aG91dCBDaGFtZWxpdW0gc3Vw cG9ydCBzdGlsbCB3b3JrcwotLS0KIGNvbmZpZ3VyZS5hYyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgIDEzICsKIC4uLi9pbnRlbC1ncHUtdG9vbHMvaW50ZWwtZ3B1LXRv b2xzLWRvY3MueG1sICAgICAgIHwgICAxICsKIGxpYi9NYWtlZmlsZS5hbSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICA0ICstCiBsaWIvTWFrZWZpbGUuc291cmNlcyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxMCArLQogbGliL2lndC5oICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDQgKwogbGliL2lndF9jaGFtZWxpdW0u YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4NDkgKysrKysrKysrKysrKysrKysr KysrCiBsaWIvaWd0X2NoYW1lbGl1bS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICA3MyArKwogc2NyaXB0cy9ydW4tdGVzdHMuc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgIDQgKy0KIHRlc3RzL01ha2VmaWxlLmFtICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICA1ICstCiB0ZXN0cy9NYWtlZmlsZS5zb3VyY2VzICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAgOSArLQogdGVzdHMvY2hhbWVsaXVtLmMgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCA0MDcgKysrKysrKysrKwogMTEgZmlsZXMgY2hhbmdlZCwgMTM3MSBp bnNlcnRpb25zKCspLCA4IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYi9pZ3Rf Y2hhbWVsaXVtLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvaWd0X2NoYW1lbGl1bS5oCiBjcmVh dGUgbW9kZSAxMDA2NDQgdGVzdHMvY2hhbWVsaXVtLmMKCmRpZmYgLS1naXQgYS9jb25maWd1cmUu YWMgYi9jb25maWd1cmUuYWMKaW5kZXggYjYyYjhmYy4uMTkyMDYwOSAxMDA2NDQKLS0tIGEvY29u ZmlndXJlLmFjCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMjYzLDYgKzI2MywxOCBAQCBpZiB0ZXN0 ICJ4JHdpdGhfbGlidW53aW5kIiA9IHh5ZXM7IHRoZW4KIAkJCSAgQUNfTVNHX0VSUk9SKFtsaWJ1 bndpbmQgbm90IGZvdW5kLiBVc2UgLS13aXRob3V0LWxpYnVud2luZCB0byBkaXNhYmxlIGxpYnVu d2luZCBzdXBwb3J0Ll0pKQogZmkKIAorIyBlbmFibGUgc3VwcG9ydCBmb3IgdXNpbmcgdGhlIGNo YW1lbGl1bQorQUNfQVJHX0VOQUJMRShjaGFtZWxpdW0sCisJICAgICAgQVNfSEVMUF9TVFJJTkco Wy0tZGlzYWJsZS1jaGFtZWxpdW1dLAorCQkJICAgICBbQnVpbGQgdGVzdHMgd2l0aG91dCBjaGFt ZWxpdW0gc3VwcG9ydF0pLAorCSAgICAgIFtdLCBbZW5hYmxlX2NoYW1lbGl1bT15ZXNdKQorCitB TV9DT05ESVRJT05BTChIQVZFX0NIQU1FTElVTSwgW3Rlc3QgIngkZW5hYmxlX2NoYW1lbGl1bSIg PSB4eWVzXSkKK2lmIHRlc3QgIngkZW5hYmxlX2NoYW1lbGl1bSIgPSB4eWVzOyB0aGVuCisJQUNf REVGSU5FKEhBVkVfQ0hBTUVMSVVNLCAxLCBbY2hhbWVsaXVtIHN1cG9ydF0pCisJUEtHX0NIRUNL X01PRFVMRVMoWE1MUlBDLCB4bWxycGNfY2xpZW50KQorZmkKKwogIyBlbmFibGUgZGVidWcgc3lt Ym9scwogQUNfQVJHX0VOQUJMRShkZWJ1ZywKIAkgICAgICBBU19IRUxQX1NUUklORyhbLS1kaXNh YmxlLWRlYnVnXSwKQEAgLTM2MCw2ICszNzIsNyBAQCBlY2hvICIgICAgICAgQXNzZW1ibGVyICAg ICAgICAgIDogJHtlbmFibGVfYXNzZW1ibGVyfSIKIGVjaG8gIiAgICAgICBEZWJ1Z2dlciAgICAg ICAgICAgOiAke2VuYWJsZV9kZWJ1Z2dlcn0iCiBlY2hvICIgICAgICAgT3ZlcmxheSAgICAgICAg ICAgIDogWDogJHtlbmFibGVfb3ZlcmxheV94bGlifSwgWHY6ICR7ZW5hYmxlX292ZXJsYXlfeHZs aWJ9IgogZWNobyAiICAgICAgIHg4Ni1zcGVjaWZpYyB0b29scyA6ICR7YnVpbGRfeDg2fSIKK2Vj aG8gIiAgICAgICBDaGFtZWxpdW0gc3VwcG9ydCAgOiAke2VuYWJsZV9jaGFtZWxpdW19IgogZWNo byAiIgogZWNobyAiIOKAoiBBUEktRG9jdW1lbnRhdGlvbiAgICAgIDogJHtlbmFibGVfZ3RrX2Rv Y30iCiBlY2hvICIg4oCiIEZhaWwgb24gd2FybmluZ3MgICAgICAgOiAke2VuYWJsZV93ZXJyb3J9 IgpkaWZmIC0tZ2l0IGEvZG9jcy9yZWZlcmVuY2UvaW50ZWwtZ3B1LXRvb2xzL2ludGVsLWdwdS10 b29scy1kb2NzLnhtbCBiL2RvY3MvcmVmZXJlbmNlL2ludGVsLWdwdS10b29scy9pbnRlbC1ncHUt dG9vbHMtZG9jcy54bWwKaW5kZXggNTU5MDJhYi4uZjUxNWYzMyAxMDA2NDQKLS0tIGEvZG9jcy9y ZWZlcmVuY2UvaW50ZWwtZ3B1LXRvb2xzL2ludGVsLWdwdS10b29scy1kb2NzLnhtbAorKysgYi9k b2NzL3JlZmVyZW5jZS9pbnRlbC1ncHUtdG9vbHMvaW50ZWwtZ3B1LXRvb2xzLWRvY3MueG1sCkBA IC0zMyw2ICszMyw3IEBACiAgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2lndF92YzQueG1sIi8+ CiAgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2lndF92Z2VtLnhtbCIvPgogICAgIDx4aTppbmNs dWRlIGhyZWY9InhtbC9pZ3RfZHVtbXlsb2FkLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9 InhtbC9pZ3RfY2hhbWVsaXVtLnhtbCIvPgogICA8L2NoYXB0ZXI+CiAgIDx4aTppbmNsdWRlIGhy ZWY9InhtbC9pZ3RfdGVzdF9wcm9ncmFtcy54bWwiLz4KIApkaWZmIC0tZ2l0IGEvbGliL01ha2Vm aWxlLmFtIGIvbGliL01ha2VmaWxlLmFtCmluZGV4IGI3YzcwMjAuLjAxMzY2NjMgMTAwNjQ0Ci0t LSBhL2xpYi9NYWtlZmlsZS5hbQorKysgYi9saWIvTWFrZWZpbGUuYW0KQEAgLTIzLDcgKzIzLDcg QEAgaWYgIUhBVkVfTElCRFJNX0lOVEVMCiBlbmRpZgogCiBBTV9DUFBGTEFHUyA9IC1JJCh0b3Bf c3JjZGlyKQotQU1fQ0ZMQUdTID0gJChDV0FSTkZMQUdTKSAkKERSTV9DRkxBR1MpICQoUENJQUND RVNTX0NGTEFHUykgJChLTU9EX0NGTEFHUykgJChMSUJVTldJTkRfQ0ZMQUdTKSAkKERFQlVHX0NG TEFHUykgXAorQU1fQ0ZMQUdTID0gJChDV0FSTkZMQUdTKSAkKERSTV9DRkxBR1MpICQoUENJQUND RVNTX0NGTEFHUykgJChLTU9EX0NGTEFHUykgJChMSUJVTldJTkRfQ0ZMQUdTKSAkKERFQlVHX0NG TEFHUykgJChYTUxSUENfQ0ZMQUdTKSAkKFVERVZfQ0ZMQUdTKSBcCiAJICAgIC1ESUdUX1NSQ0RJ Uj1cIiIkKGFic190b3Bfc3JjZGlyKS90ZXN0cyJcIiBcCiAJICAgIC1ESUdUX0RBVEFESVI9XCIi JChwa2dkYXRhZGlyKSJcIiBcCiAJICAgIC1ESUdUX0xPR19ET01BSU49XCIiJChzdWJzdCBfLC0s JCopIlwiIFwKQEAgLTM5LDUgKzM5LDcgQEAgbGliaW50ZWxfdG9vbHNfbGFfTElCQUREID0gXAog CSQoTElCVURFVl9MSUJTKSBcCiAJJChMSUJVTldJTkRfTElCUykgXAogCSQoVElNRVJfTElCUykg XAorCSQoWE1MUlBDX0xJQlMpIFwKKwkkKFVERVZfTElCUykgXAogCS1sbQogCmRpZmYgLS1naXQg YS9saWIvTWFrZWZpbGUuc291cmNlcyBiL2xpYi9NYWtlZmlsZS5zb3VyY2VzCmluZGV4IDdmYzVl YzIuLjcxMzJlMzIgMTAwNjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZS5zb3VyY2VzCisrKyBiL2xpYi9N YWtlZmlsZS5zb3VyY2VzCkBAIC03OCw4ICs3OCwxNCBAQCBsaWJfc291cmNlX2xpc3QgPQkgCVwK IAlpZ3RfZHVtbXlsb2FkLmMJCVwKIAlpZ3RfZHVtbXlsb2FkLmgJCVwKIAl1d2lsZG1hdC91d2ls ZG1hdC5oCVwKLQl1d2lsZG1hdC91d2lsZG1hdC5jCVwKLQkkKE5VTEwpCisJdXdpbGRtYXQvdXdp bGRtYXQuYworCitpZiBIQVZFX0NIQU1FTElVTQorbGliX3NvdXJjZV9saXN0ICs9IGlndF9jaGFt ZWxpdW0uaCBcCisJCSAgIGlndF9jaGFtZWxpdW0uYworZW5kaWYKKworbGliX3NvdXJjZV9saXN0 ICs9ICQoTlVMTCkKIAogLlBIT05ZOiB2ZXJzaW9uLmgudG1wCiAKZGlmZiAtLWdpdCBhL2xpYi9p Z3QuaCBiL2xpYi9pZ3QuaAppbmRleCBhMDAyOGQ1Li5kMGRlZDc5IDEwMDY0NAotLS0gYS9saWIv aWd0LmgKKysrIGIvbGliL2lndC5oCkBAIC00Nyw0ICs0Nyw4IEBACiAjaW5jbHVkZSAibWVkaWFf c3Bpbi5oIgogI2luY2x1ZGUgInJlbmRlcmNvcHkuaCIKIAorI2lmZGVmIEhBVkVfQ0hBTUVMSVVN CisjaW5jbHVkZSAiaWd0X2NoYW1lbGl1bS5oIgorI2VuZGlmCisKICNlbmRpZiAvKiBJR1RfSCAq LwpkaWZmIC0tZ2l0IGEvbGliL2lndF9jaGFtZWxpdW0uYyBiL2xpYi9pZ3RfY2hhbWVsaXVtLmMK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU5NGU0YQotLS0gL2Rldi9udWxs CisrKyBiL2xpYi9pZ3RfY2hhbWVsaXVtLmMKQEAgLTAsMCArMSw4NDkgQEAKKy8qCisgKiBDb3B5 cmlnaHQgwqkgMjAxNiBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBn cmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29w eSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRo ZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJp Y3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNl LCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAor ICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJz b25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1Ympl Y3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmln aHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQK KyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFu dGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJ UyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNT IE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5U SUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhP UlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMg T1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1Qs IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVD VElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJ TiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICBMeXVkZSBQYXVsIDxseXVkZUBy ZWRoYXQuY29tPgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN0cmlu Zy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8eG1scnBjLWMvYmFzZS5oPgorI2lu Y2x1ZGUgPHhtbHJwYy1jL2NsaWVudC5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKworI2luY2x1ZGUg ImlndC5oIgorCisjZGVmaW5lIGNoZWNrX3JwYygpIFwKKwlpZ3RfYXNzZXJ0X2YoIWVudi5mYXVs dF9vY2N1cnJlZCwgIkNoYW1lbGl1bSBSUEMgY2FsbCBmYWlsZWQ6ICVzXG4iLCBcCisJCSAgICAg ZW52LmZhdWx0X3N0cmluZyk7CisKKy8qKgorICogU0VDVElPTjppZ3RfY2hhbWVsaXVtCisgKiBA c2hvcnRfZGVzY3JpcHRpb246IExpYnJhcnkgZm9yIGVuY29ycG9yYXRpbmcgdGhlIENoYW1lbGl1 bSBpbnRvIGlndCB0ZXN0cworICogQHRpdGxlOiBDaGFtZWxpdW0KKyAqIEBpbmNsdWRlOiBpZ3Rf Y2hhbWVsaXVtLmgKKyAqCisgKiBUaGlzIGxpYnJhcnkgY29udGFpbnMgaGVscGVycyBmb3IgdXNp bmcgQ2hhbWVsaXVtcyBpbiBJR1QgdGVzdHMuIFRoaXMgYWxsb3dzCisgKiBmb3IgdGVzdHMgdG8g c2ltdWxhdGUgbW9yZSBkaWZmaWN1bHQgdGFza3MgdG8gYXV0b21hdGUgc3VjaCBhcyBkaXNwbGF5 CisgKiBob3RwbHVnZ2luZywgZmF1bHR5IGRpc3BsYXkgYmVoYXZpb3JzLCBldGMuCisgKgorICog TW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQ2hhbWVsaXVtIGNhbiBiZSBmb3VuZAorICogW29uIHRo ZSBDaHJvbWVPUyBwcm9qZWN0IHBhZ2VdKGh0dHBzOi8vd3d3LmNocm9taXVtLm9yZy9jaHJvbWl1 bS1vcy90ZXN0aW5nL2NoYW1lbGl1bSkuCisgKgorICogSW4gb3JkZXIgdG8gcnVuIHRlc3RzIHVz aW5nIHRoZSBDaGFtZWxpdW0sIGEgdmFsaWQgY29uZmlndXJhdGlvbiBmaWxlIG11c3QgYmUKKyAq IHByZXNlbnQuICBUaGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGEgbm9ybWFsIEdsaWIga2V5Zmls ZSAoc2ltaWxhciB0byBXaW5kb3dzCisgKiBJTkkpIHN0cnVjdHVyZWQgbGlrZSBzbzoKKyAqCisg KiB8WzwhLS0gbGFuZ3VhZ2U9InBsYWluIiAtLT4KKyAqCVtDaGFtZWxpdW1dCisgKglVUkw9aHR0 cDovL2NoYW1lbGVvbjo5OTkyICMgVGhlIFVSTCB1c2VkIGZvciBjb25uZWN0aW5nIHRvIHRoZSBD aGFtZWxpdW0ncyBSUEMgc2VydmVyCisgKgorICoJIyBUaGUgcmVzdCBvZiB0aGUgc2VjdGlvbnMg YXJlIHVzZWQgZm9yIGRlZmluaW5nIGNvbm5lY3RvciBtYXBwaW5ncy4KKyAqCSMgVGhpcyBpcyBy ZXF1aXJlZCBzbyBhbnkgdGVzdHMgdXNpbmcgdGhlIENoYW1lbGl1bSBrbm93IHdoaWNoIGNvbm5l Y3RvcgorICoJIyBvbiB0aGUgdGVzdCBtYWNoaW5lIHNob3VsZCBiZSBjb25uZWN0ZWQgdG8gZWFj aCBDaGFtZWxpdW0gcG9ydC4KKyAqCSMKKyAqCSMgSW4gdGhlIGV2ZW50IHRoYXQgYW55IG9mIHRo ZXNlIG1hcHBpbmdzIGFyZSBzcGVjaWZpZWQgaW5jb3JyZWN0bHksCisgKgkjIGFueSBob3RwbHVn Z2luZyB0ZXN0cyBmb3IgdGhlIGluY29ycmVjdCBjb25uZWN0b3IgbWFwcGluZyB3aWxsIGZhaWwu CisgKgorICoJW0RQLTFdICMgVGhlIG5hbWUgb2YgdGhlIERSTSBjb25uZWN0b3IKKyAqCUNoYW1l bGl1bVBvcnRJRD0xICMgVGhlIElEIG9mIHRoZSBwb3J0IG9uIHRoZSBDaGFtZWxpdW0gdGhpcyBj b25uZWN0b3IgaXMgYXR0YWNoZWQgdG8KKyAqCisgKglbSERNSS1BLTFdCisgKglDaGFtZWxpdW1Q b3J0SUQ9MworICogXXwKKyAqCisgKiBCeSBkZWZhdWx0LCB0aGlzIGZpbGUgaXMgZXhwZWN0ZWQg dG8gZXhpc3QgaW4gfi8uaWd0X2NoYW1lbGl1bV9yYyAuIFRoZQorICogZGlyZWN0b3J5IGZvciB0 aGlzIGNhbiBiZSBvdmVycmlkZW4gYnkgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUK KyAqICVDSEFNRUxJVU1fQ09ORklHX1BBVEguCisgKi8KKworLyoqCisgKiBjaGFtZWxpdW1fcG9y dHM6CisgKgorICogQ29udGFpbnMgaW5mb3JtYXRpb24gb24gYWxsIG9mIHRoZSBwb3J0cyB0aGF0 IGFyZSBjb25maWd1cmVkIGZvciB1c2Ugd2l0aCB0aGUKKyAqIENoYW1lbGl1bS4gVGhpcyBpbmZv cm1hdGlvbiBpcyBpbml0aWFsaXplZCB3aGVuICNjaGFtZWxpdW1faW5pdCBpcyBjYWxsZWQuCisg Ki8KK3N0cnVjdCBjaGFtZWxpdW1fcG9ydCAqY2hhbWVsaXVtX3BvcnRzOworCisvKioKKyAqIGNo YW1lbGl1bV9wb3J0X2NvdW50OgorICoKKyAqIEhvdyBtYW55IHBvcnRzIGFyZSBjb25maWd1cmVk IGZvciB1c2UgYnkgdGhlIENoYW1lbGl1bS4KKyAqLworaW50IGNoYW1lbGl1bV9wb3J0X2NvdW50 OworCitzdGF0aWMgY29uc3QgY2hhciAqY2hhbWVsaXVtX3VybDsKK3N0YXRpYyB4bWxycGNfZW52 IGVudjsKKworc3RydWN0IGNoYW1lbGl1bV9lZGlkIHsKKwlpbnQgaWQ7CisJc3RydWN0IGlndF9s aXN0IGxpbms7Cit9Oworc3RydWN0IGNoYW1lbGl1bV9lZGlkICphbGxvY2F0ZWRfZWRpZHM7CisK Ky8qKgorICogY2hhbWVsaXVtX3BsdWc6CisgKiBAaWQ6IFRoZSBJRCBvZiB0aGUgcG9ydCBvbiB0 aGUgY2hhbWVsaXVtIHRvIHBsdWcKKyAqCisgKiBTaW11bGF0ZSBhIGRpc3BsYXkgY29ubmVjdG9y IGJlaW5nIHBsdWdnZWQgaW50byB0aGUgc3lzdGVtIHVzaW5nIHRoZQorICogY2hhbWVsaXVtLgor ICovCit2b2lkIGNoYW1lbGl1bV9wbHVnKGludCBpZCkKK3sKKwl4bWxycGNfdmFsdWUgKnJlczsK KworCWlndF9kZWJ1ZygiUGx1Z2dpbmcgcG9ydCAlZFxuIiwgaWQpOworCXJlcyA9IHhtbHJwY19j bGllbnRfY2FsbCgmZW52LCBjaGFtZWxpdW1fdXJsLCAiUGx1ZyIsICIoaSkiLCBpZCk7CisJY2hl Y2tfcnBjKCk7CisKKwl4bWxycGNfREVDUkVGKHJlcyk7Cit9CisKKy8qKgorICogY2hhbWVsaXVt X3VucGx1ZzoKKyAqIEBpZDogVGhlIElEIG9mIHRoZSBwb3J0IG9uIHRoZSBjaGFtZWxpdW0gdG8g dW5wbHVnCisgKgorICogU2ltdWxhdGUgYSBkaXNwbGF5IGNvbm5lY3RvciBiZWluZyB1bnBsdWdn ZWQgZnJvbSB0aGUgc3lzdGVtIHVzaW5nIHRoZQorICogY2hhbWVsaXVtLgorICovCit2b2lkIGNo YW1lbGl1bV91bnBsdWcoaW50IGlkKQoreworCXhtbHJwY192YWx1ZSAqcmVzOworCisJaWd0X2Rl YnVnKCJVbnBsdWdnaW5nIHBvcnQgJWRcbiIsIGlkKTsKKwlyZXMgPSB4bWxycGNfY2xpZW50X2Nh bGwoJmVudiwgY2hhbWVsaXVtX3VybCwgIlVucGx1ZyIsICIoaSkiLCBpZCk7CisJY2hlY2tfcnBj KCk7CisKKwl4bWxycGNfREVDUkVGKHJlcyk7Cit9CisKKy8qKgorICogY2hhbWVsaXVtX2lzX3Bs dWdnZWQ6CisgKiBAaWQ6IFRoZSBJRCBvZiB0aGUgcG9ydCBvbiB0aGUgY2hhbWVsaXVtIHRvIGNo ZWNrIHRoZSBzdGF0dXMgb2YKKyAqCisgKiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4g cG9ydCBoYXMgYmVlbiBwbHVnZ2VkIGludG8gdGhlIHN5c3RlbSB1c2luZworICogI2NoYW1lbGl1 bV9wbHVnLgorICoKKyAqIFJldHVybnM6ICV0cnVlIGlmIHRoZSBjb25uZWN0b3IgaXMgc2V0IHRv IHBsdWdnZWQgaW4sICVmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgY2hhbWVsaXVtX2lzX3Bs dWdnZWQoaW50IGlkKQoreworCXhtbHJwY192YWx1ZSAqcmVzOworCXhtbHJwY19ib29sIGlzX3Bs dWdnZWQ7CisKKwlyZXMgPSB4bWxycGNfY2xpZW50X2NhbGwoJmVudiwgY2hhbWVsaXVtX3VybCwg IklzUGx1Z2dlZCIsICIoaSkiLCBpZCk7CisJY2hlY2tfcnBjKCk7CisKKwl4bWxycGNfcmVhZF9i b29sKCZlbnYsIHJlcywgJmlzX3BsdWdnZWQpOworCXhtbHJwY19ERUNSRUYocmVzKTsKKworCXJl dHVybiBpc19wbHVnZ2VkOworfQorCisvKioKKyAqIGNoYW1lbGl1bV9wb3J0X3dhaXRfdmlkZW9f aW5wdXRfc3RhYmxlOgorICogQGlkOiBUaGUgSUQgb2YgdGhlIHBvcnQgb24gdGhlIGNoYW1lbGl1 bSB0byBjaGVjayB0aGUgc3RhdHVzIG9mCisgKiBAdGltZW91dF9zZWNzOiBIb3cgbG9uZyB0byB3 YWl0IGZvciBhIHZpZGVvIHNpZ25hbCB0byBhcHBlYXIgYmVmb3JlIHRpbWluZworICogb3V0Cisg KgorICogV2FpdHMgZm9yIGEgdmlkZW8gc2lnbmFsIHRvIGFwcGVhciBvbiB0aGUgZ2l2ZW4gcG9y dC4gVGhpcyBpcyB1c2VmdWwgZm9yCisgKiBjaGVja2luZyB3aGV0aGVyIG9yIG5vdCB3ZSd2ZSBz ZXR1cCBhIG1vbml0b3IgY29ycmVjdGx5LgorICoKKyAqIFJldHVybnM6ICV0cnVlIGlmIGEgdmlk ZW8gc2lnbmFsIHdhcyBkZXRlY3RlZCwgJWZhbHNlIGlmIHdlIHRpbWVkIG91dAorICovCitib29s IGNoYW1lbGl1bV9wb3J0X3dhaXRfdmlkZW9faW5wdXRfc3RhYmxlKGludCBpZCwgaW50IHRpbWVv dXRfc2VjcykKK3sKKwl4bWxycGNfdmFsdWUgKnJlczsKKwl4bWxycGNfYm9vbCBpc19vbjsKKwor CWlndF9kZWJ1ZygiV2FpdGluZyBmb3IgdmlkZW8gaW5wdXQgdG8gc3RhYmFsaXplIG9uIHBvcnQg JWRcbiIsIGlkKTsKKworCXJlcyA9IHhtbHJwY19jbGllbnRfY2FsbCgmZW52LCBjaGFtZWxpdW1f dXJsLCAiV2FpdFZpZGVvSW5wdXRTdGFibGUiLAorCQkJCSAiKGlpKSIsIGlkLCB0aW1lb3V0X3Nl Y3MpOworCWNoZWNrX3JwYygpOworCisJeG1scnBjX3JlYWRfYm9vbCgmZW52LCByZXMsICZpc19v bik7CisJeG1scnBjX0RFQ1JFRihyZXMpOworCisJcmV0dXJuIGlzX29uOworfQorCisvKioKKyAq IGNoYW1lbGl1bV9maXJlX2hwZF9wdWxzZXM6CisgKiBAaWQ6IFRoZSBJRCBvZiB0aGUgcG9ydCB0 byBmaXJlIGhvdHBsdWcgcHVsc2VzIG9uCisgKiBAd2lkdGhfbXNlYzogSG93IGxvbmcgZWFjaCBw dWxzZSBzaG91bGQgbGFzdAorICogQGNvdW50OiBUaGUgbnVtYmVyIG9mIHB1bHNlcyB0byBzZW5k CisgKgorICogQSBjb252aWVuZW5jZSBmdW5jdGlvbiBmb3Igc2VuZGluZyBtdWx0aXBsZSBob3Rw bHVnIHB1bHNlcyB0byB0aGUgc3lzdGVtLgorICogVGhlIHB1bHNlcyBzdGFydCBhdCBsb3cgKGUu Zy4gY29ubmVjdG9yIGlzIGRpc2Nvbm5lY3RlZCksIGFuZCB0aGVuIGFsdGVybmF0ZQorICogZnJv bSBoaWdoIChlLmcuIGNvbm5lY3RvciBpcyBwbHVnZ2VkIGluKSB0byBsb3cuIFRoaXMgaXMgdGhl IGVxdWl2YWxlbnQgb2YKKyAqIHJlcGVhdGVkbHkgY2FsbGluZyAjY2hhbWVsaXVtX3BsdWcgYW5k ICNjaGFtZWxpdW1fdW5wbHVnLCB3YWl0aW5nCisgKiBAd2lkdGhfbXNlYyBiZXR3ZWVuIGVhY2gg Y2FsbC4KKyAqCisgKiBJZiBAY291bnQgaXMgZXZlbiwgdGhlIGxhc3QgcHVsc2Ugc2VudCB3aWxs IGJlIGhpZ2gsIGFuZCBpZiBpdCdzIG9kZCB0aGVuIGl0CisgKiB3aWxsIGJlIGxvdy4gUmVzZXR0 aW5nIHRoZSBIUEQgbGluZSBiYWNrIHRvIGl0J3MgcHJldmlvdXMgc3RhdGUsIGlmIGRlc2lyZWQs CisgKiBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlci4KKyAqLwordm9pZCBjaGFt ZWxpdW1fZmlyZV9ocGRfcHVsc2VzKGludCBpZCwgaW50IHdpZHRoX21zZWMsIGludCBjb3VudCkK K3sKKwl4bWxycGNfdmFsdWUgKnB1bHNlX3dpZHRocyA9IHhtbHJwY19hcnJheV9uZXcoJmVudiks CisJCSAgICAgKndpZHRoID0geG1scnBjX2ludF9uZXcoJmVudiwgd2lkdGhfbXNlYyksICpyZXM7 CisJaW50IGk7CisKKwlpZ3RfZGVidWcoIkZpcmluZyAlZCBIUEQgcHVsc2VzIHdpdGggd2lkdGgg b2YgJWQgbXNlYyBvbiBpZCAlZFxuIiwKKwkJICBjb3VudCwgd2lkdGhfbXNlYywgaWQpOworCisJ Zm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXhtbHJwY19hcnJheV9hcHBlbmRfaXRlbSgm ZW52LCBwdWxzZV93aWR0aHMsIHdpZHRoKTsKKworCXJlcyA9IHhtbHJwY19jbGllbnRfY2FsbCgm ZW52LCBjaGFtZWxpdW1fdXJsLCAiRmlyZU1peGVkSHBkUHVsc2VzIiwKKwkJCQkgIihpQSkiLCBp ZCwgcHVsc2Vfd2lkdGhzKTsKKwljaGVja19ycGMoKTsKKworCXhtbHJwY19ERUNSRUYocmVzKTsK Kwl4bWxycGNfREVDUkVGKHdpZHRoKTsKKwl4bWxycGNfREVDUkVGKHB1bHNlX3dpZHRocyk7Cit9 CisKKy8qKgorICogY2hhbWVsaXVtX2ZpcmVfbWl4ZWRfaHBkX3B1bHNlczoKKyAqIEBpZDogVGhl IElEIG9mIHRoZSBwb3J0IHRvIGZpcmUgaG90cGx1ZyBwdWxzZXMgb24KKyAqIEAuLi46IFRoZSBs ZW5ndGggb2YgZWFjaCBwdWxzZSBpbiBtaWxsaXNlY29uZHMsIHRlcm1pbmF0ZWQgd2l0aCBhICUw CisgKgorICogRG9lcyB0aGUgc2FtZSB0aGluZyBhcyAjY2hhbWVsaXVtX2ZpcmVfaHBkX3B1bHNl cywgYnV0IGFsbG93cyB0aGUgY2FsbGVyIHRvCisgKiBzcGVjaWZ5IHRoZSBsZW5ndGggb2YgZWFj aCBpbmRpdmlkdWFsIHB1bHNlLgorICovCit2b2lkIGNoYW1lbGl1bV9maXJlX21peGVkX2hwZF9w dWxzZXMoaW50IGlkLCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCXhtbHJwY192YWx1ZSAqcHVs c2Vfd2lkdGhzID0geG1scnBjX2FycmF5X25ldygmZW52KSwgKndpZHRoLCAqcmVzOworCWludCBh cmc7CisKKwlpZ3RfZGVidWcoIkZpcmluZyBtaXhlZCBIUEQgcHVsc2VzIG9uIHBvcnQgJWRcbiIs IGlkKTsKKworCXZhX3N0YXJ0KGFyZ3MsIGlkKTsKKwlmb3IgKGFyZyA9IHZhX2FyZyhhcmdzLCBp bnQpOyBhcmc7IGFyZyA9IHZhX2FyZyhhcmdzLCBpbnQpKSB7CisJCXdpZHRoID0geG1scnBjX2lu dF9uZXcoJmVudiwgYXJnKTsKKwkJeG1scnBjX2FycmF5X2FwcGVuZF9pdGVtKCZlbnYsIHB1bHNl X3dpZHRocywgd2lkdGgpOworCQl4bWxycGNfREVDUkVGKHdpZHRoKTsKKwl9CisJdmFfZW5kKGFy Z3MpOworCisJcmVzID0geG1scnBjX2NsaWVudF9jYWxsKCZlbnYsIGNoYW1lbGl1bV91cmwsICJG aXJlTWl4ZWRIcGRQdWxzZXMiLAorCQkJCSAiKGlBKSIsIGlkLCBwdWxzZV93aWR0aHMpOworCWNo ZWNrX3JwYygpOworCXhtbHJwY19ERUNSRUYocmVzKTsKKworCXhtbHJwY19ERUNSRUYocHVsc2Vf d2lkdGhzKTsKK30KKworc3RhdGljIHZvaWQgYXN5bmNfcnBjX2hhbmRsZXIoY29uc3QgY2hhciAq c2VydmVyX3VybCwgY29uc3QgY2hhciAqbWV0aG9kX25hbWUsCisJCQkgICAgICB4bWxycGNfdmFs dWUgKnBhcmFtX2FycmF5LCB2b2lkICp1c2VyX2RhdGEsCisJCQkgICAgICB4bWxycGNfZW52ICpm YXVsdCwgeG1scnBjX3ZhbHVlICpyZXN1bHQpCit7CisJLyogV2UgZG9uJ3QgY2FyZSBhYm91dCB0 aGUgcmVzcG9uc2VzICovCit9CisKKy8qKgorICogY2hhbWVsaXVtX2FzeW5jX2hwZF9wdWxzZV9z dGFydDoKKyAqIEBpZDogVGhlIElEIG9mIHRoZSBwb3J0IHRvIGZpcmUgYSBob3RwbHVnIHB1bHNl IG9uCisgKiBAaGlnaDogV2hldGhlciB0byBmaXJlIGEgaGlnaCBwdWxzZSAoZS5nLiBzaW11bGF0 ZSBhIGNvbm5lY3QpLCBvciBhIGxvdworICogcHVsc2UgKGUuZy4gc2ltdWxhdGUgYSBkaXNjb25u ZWN0KQorICogQGRlbGF5X3NlY3M6IEhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIHNlbmRpbmcgdGhl IEhQRCBwdWxzZS4KKyAqCisgKiBJbnN0cnVjdHMgdGhlIGNoYW1lbGl1bSB0byBzZW5kIGFuIGhw ZCBwdWxzZSBhZnRlciBAZGVsYXlfc2VjcyBzZWNvbmRzIGhhdmUKKyAqIHBhc3NlZCwgd2l0aG91 dCB3YWl0aW5nIGZvciB0aGUgY2hhbWVsaXVtIHRvIGZpbmlzaC4gVGhpcyBpcyB1c2VmdWwgZm9y CisgKiB0ZXN0aW5nIHRoaW5ncyBzdWNoIGFzIGhwZCBhZnRlciBhIHN1c3BlbmQvcmVzdW1lIGN5 Y2xlLCBzaW5jZSB3ZSBjYW4ndCB0ZWxsCisgKiB0aGUgY2hhbWVsaXVtIHRvIHNlbmQgYSBob3Rw bHVnIGF0IHRoZSBzYW1lIHRpbWUgdGhhdCBvdXIgc3lzdGVtIGlzCisgKiBzdXNwZW5kZWQuCisg KgorICogSXQgaXMgcmVxdWlyZWQgdGhhdCB0aGUgdXNlciBldmVudHVhbGx5IGNhbGwKKyAqICNj aGFtZWxpdW1fYXN5bmNfaHBkX3B1bHNlX2ZpbmlzaCwgdG8gY2xlYW4gdXAgdGhlIGxlZnRvdmVy IFhNTC1SUEMKKyAqIHJlc3BvbnNlcyBmcm9tIHRoZSBjaGFtZWxpdW0uCisgKi8KK3ZvaWQgY2hh bWVsaXVtX2FzeW5jX2hwZF9wdWxzZV9zdGFydChpbnQgaWQsIGJvb2wgaGlnaCwgaW50IGRlbGF5 X3NlY3MpCit7CisJeG1scnBjX3ZhbHVlICpwdWxzZV93aWR0aHMgPSB4bWxycGNfYXJyYXlfbmV3 KCZlbnYpLCAqd2lkdGg7CisKKwkvKiBUT0RPOiBBY3R1YWxseSBpbXBsZW1lbnQgc29tZXRoaW5n IGluIHRoZSBjaGFtZWxlb24gc2VydmVyIHRvIGFsbG93CisJICogZm9yIGRlbGF5ZWQgYWN0aW9u cyBzdWNoIGFzIGhvdHBsdWdzLiBUaGlzIHdvdWxkIHdvcmsgYSBiaXQgYmV0dGVyCisJICogYW5k IGFsbG93IHVzIHRvIHRlc3Qgc3VzcGVuZC9yZXN1bWUgb24gcG9ydHMgd2l0aG91dCBocGQgbGlr ZSBWR0EKKwkgKi8KKworCWlndF9kZWJ1ZygiU2VuZGluZyBIUEQgcHVsc2UgKCVzKSBvbiBwb3J0 ICVkIHdpdGggJWQgc2Vjb25kIGRlbGF5XG4iLAorCQkgIGhpZ2ggPyAiaGlnaC0+bG93IiA6ICJs b3ctPmhpZ2giLCBpZCwgZGVsYXlfc2Vjcyk7CisKKwkvKiBJZiB3ZSdyZSBzdGFydGluZyBhdCBo aWdoLCBtYWtlIHRoZSBmaXJzdCBwdWxzZSB3aWR0aCAwIHNvIHdlIGtlZXAKKwkgKiB0aGUgcG9y dCBjb25uZWN0ZWQgKi8KKwlpZiAoaGlnaCkgeworCQl3aWR0aCA9IHhtbHJwY19pbnRfbmV3KCZl bnYsIDApOworCQl4bWxycGNfYXJyYXlfYXBwZW5kX2l0ZW0oJmVudiwgcHVsc2Vfd2lkdGhzLCB3 aWR0aCk7CisJCXhtbHJwY19ERUNSRUYod2lkdGgpOworCX0KKworCXdpZHRoID0geG1scnBjX2lu dF9uZXcoJmVudiwgZGVsYXlfc2VjcyAqIDEwMDApOworCXhtbHJwY19hcnJheV9hcHBlbmRfaXRl bSgmZW52LCBwdWxzZV93aWR0aHMsIHdpZHRoKTsKKwl4bWxycGNfREVDUkVGKHdpZHRoKTsKKwor CXhtbHJwY19jbGllbnRfY2FsbF9hc3luY2goY2hhbWVsaXVtX3VybCwgIkZpcmVNaXhlZEhwZFB1 bHNlcyIsCisJCQkJICBhc3luY19ycGNfaGFuZGxlciwgTlVMTCwgIihpQSkiLAorCQkJCSAgaWQs IHB1bHNlX3dpZHRocyk7CisJeG1scnBjX0RFQ1JFRihwdWxzZV93aWR0aHMpOworfQorCisvKioK KyAqIGNoYW1lbGl1bV9hc3luY19ocGRfcHVsc2VfZmluaXNoOgorICoKKyAqIFdhaXRzIGZvciBh bnkgYXN5bmNocm9ub3VzIFJQQyBzdGFydGVkIGJ5ICNjaGFtZWxpdW1fYXN5bmNfaHBkX3B1bHNl X3N0YXJ0CisgKiB0byBjb21wbGV0ZSwgYW5kIHRoZW4gY2xlYW5zIHVwIGFueSBsZWZ0b3ZlciBy ZXNwb25zZXMgZnJvbSB0aGUgY2hhbWVsaXVtLgorICogSWYgYWxsIG9mIHRoZSBSUEMgY2FsbHMg aGF2ZSBhbHJlYWR5IGNvbXBsZXRlZCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgKiBpbW1lZGlh dGVseS4KKyAqLwordm9pZCBjaGFtZWxpdW1fYXN5bmNfaHBkX3B1bHNlX2ZpbmlzaCh2b2lkKQor eworCXhtbHJwY19jbGllbnRfZXZlbnRfbG9vcF9maW5pc2hfYXN5bmNoKCk7Cit9CisKKy8qKgor ICogY2hhbWVsaXVtX25ld19lZGlkOgorICogQGVkaWQ6IFRoZSBlZGlkIGJsb2IgdG8gdXBsb2Fk IHRvIHRoZSBjaGFtZWxpdW0KKyAqCisgKiBVcGxvYWRzIGFuZCByZWdpc3RlcnMgYSBuZXcgRURJ RCB3aXRoIHRoZSBjaGFtZWxpdW0uIFRoZSBFRElEIHdpbGwgYmUKKyAqIGRlc3Ryb3llZCBhdXRv bWF0aWNhbGx5IHdoZW4gI2NoYW1lbGl1bV9kZWluaXQgaXMgY2FsbGVkLgorICoKKyAqIFJldHVy bnM6IFRoZSBJRCBvZiB0aGUgRURJRCB1cGxvYWRlZCB0byB0aGUgY2hhbWVsaXVtLgorICovCitp bnQgY2hhbWVsaXVtX25ld19lZGlkKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVkaWQpCit7CisJeG1s cnBjX3ZhbHVlICpyZXM7CisJc3RydWN0IGNoYW1lbGl1bV9lZGlkICphbGxvY2F0ZWRfZWRpZDsK KwlpbnQgZWRpZF9pZDsKKworCXJlcyA9IHhtbHJwY19jbGllbnRfY2FsbCgmZW52LCBjaGFtZWxp dW1fdXJsLCAiQ3JlYXRlRWRpZCIsCisJCQkJICIoNikiLCBlZGlkLCBFRElEX0xFTkdUSCk7CisJ Y2hlY2tfcnBjKCk7CisKKwl4bWxycGNfcmVhZF9pbnQoJmVudiwgcmVzLCAmZWRpZF9pZCk7CisJ eG1scnBjX0RFQ1JFRihyZXMpOworCisJYWxsb2NhdGVkX2VkaWQgPSBtYWxsb2Moc2l6ZW9mKHN0 cnVjdCBjaGFtZWxpdW1fZWRpZCkpOworCWlndF9hc3NlcnQoYWxsb2NhdGVkX2VkaWQpOworCisJ YWxsb2NhdGVkX2VkaWQtPmlkID0gZWRpZF9pZDsKKwlpZ3RfbGlzdF9pbml0KCZhbGxvY2F0ZWRf ZWRpZC0+bGluayk7CisKKwlpZiAoYWxsb2NhdGVkX2VkaWRzKSB7CisJCWlndF9saXN0X2FkZCgm YWxsb2NhdGVkX2VkaWRzLT5saW5rLCAmYWxsb2NhdGVkX2VkaWQtPmxpbmspOworCX0gZWxzZSB7 CisJCWFsbG9jYXRlZF9lZGlkcyA9IGFsbG9jYXRlZF9lZGlkOworCX0KKworCXJldHVybiBlZGlk X2lkOworfQorCitzdGF0aWMgdm9pZCBjaGFtZWxpdW1fZGVzdHJveV9lZGlkKGludCBlZGlkX2lk KQoreworCXhtbHJwY192YWx1ZSAqcmVzOworCisJcmVzID0geG1scnBjX2NsaWVudF9jYWxsKCZl bnYsIGNoYW1lbGl1bV91cmwsICJEZXN0cm95RWRpZCIsCisJCQkJICIoaSkiLCBlZGlkX2lkKTsK KwljaGVja19ycGMoKTsKKworCXhtbHJwY19ERUNSRUYocmVzKTsKK30KKworLyoqCisgKiBjaGFt ZWxpdW1fcG9ydF9zZXRfZWRpZDoKKyAqIEBpZDogVGhlIElEIG9mIHRoZSBwb3J0IHRvIHNldCB0 aGUgRURJRCBvbgorICogQGVkaWRfaWQ6IFRoZSBJRCBvZiBhbiBFRElEIG9uIHRoZSBjaGFtZWxp dW0gY3JlYXRlZCB3aXRoCisgKiAjY2hhbWVsaXVtX25ld19lZGlkLCBvciAwIHRvIGRpc2FibGUg dGhlIEVESUQgb24gdGhlIHBvcnQKKyAqCisgKiBTZXRzIGEgcG9ydCBvbiB0aGUgY2hhbWVsaXVt IHRvIHVzZSB0aGUgc3BlY2lmaWVkIEVESUQuIFRoaXMgZG9lcyBub3QgZmlyZSBhCisgKiBob3Rw bHVnIHB1bHNlIG9uIGl0J3Mgb3duLCBhbmQgbWVyZWx5IGNoYW5nZXMgd2hhdCBFRElEIHRoZSBj aGFtZWxpdW0gcG9ydAorICogd2lsbCByZXBvcnQgdG8gdXMgdGhlIG5leHQgdGltZSB3ZSBwcm9i ZSBpdC4gVXNlcnMgd2lsbCBuZWVkIHRvIHJlcHJvYmUgdGhlCisgKiBjb25uZWN0b3JzIHRoZW1z ZWx2ZXMgaWYgdGhleSB3YW50IHRvIHNlZSB0aGUgRURJRCByZXBvcnRlZCBieSB0aGUgcG9ydAor ICogY2hhbmdlLgorICovCit2b2lkIGNoYW1lbGl1bV9wb3J0X3NldF9lZGlkKGludCBpZCwgaW50 IGVkaWRfaWQpCit7CisJeG1scnBjX3ZhbHVlICpyZXM7CisKKwlyZXMgPSB4bWxycGNfY2xpZW50 X2NhbGwoJmVudiwgY2hhbWVsaXVtX3VybCwgIkFwcGx5RWRpZCIsCisJCQkJICIoaWkpIiwgaWQs IGVkaWRfaWQpOworCWNoZWNrX3JwYygpOworCisJeG1scnBjX0RFQ1JFRihyZXMpOworfQorCisv KioKKyAqIGNoYW1lbGl1bV9wb3J0X3NldF9kZGNfc3RhdGU6CisgKiBAaWQ6IFRoZSBJRCBvZiB0 aGUgcG9ydCB3aG9zZSBEREMgYnVzIHdlIHdhbnQgdG8gbW9kaWZ5CisgKiBAZW5hYmxlZDogV2hl dGhlciBvciBub3QgdG8gZW5hYmxlIHRoZSBEREMgYnVzCisgKgorICogVGhpcyBkaXNhYmxlcyB0 aGUgRERDIGJ1cyAoZS5nLiB0aGUgaTJjIGxpbmUgb24gdGhlIGNvbm5lY3RvciB0aGF0IGdpdmVz IHVzCisgKiBhbiBFRElEKSBvZiB0aGUgc3BlY2lmaWVkIHBvcnQgb24gdGhlIGNoYW1lbGl1bS4g VGhpcyBpcyB1c2VmdWwgZm9yIHRlc3RpbmcKKyAqIGJlaGF2aW9yIG9uIGxlZ2FjeSBjb25uZWN0 b3JzIHN1Y2ggYXMgVkdBLCB3aGVyZSB0aGUgcHJlc2VuY2Ugb2YgYSBEREMgYnVzCisgKiBpcyBu b3QgYWx3YXlzIGd1YXJhbnRlZWQuCisgKi8KK3ZvaWQgY2hhbWVsaXVtX3BvcnRfc2V0X2RkY19z dGF0ZShpbnQgcG9ydCwgYm9vbCBlbmFibGVkKQoreworCXhtbHJwY192YWx1ZSAqcmVzOworCisJ aWd0X2RlYnVnKCIlc2FibGluZyBEREMgYnVzIG9uIHBvcnQgJWRcbiIsCisJCSAgZW5hYmxlZCA/ ICJFbiIgOiAiRGlzIiwgcG9ydCk7CisKKwlyZXMgPSB4bWxycGNfY2xpZW50X2NhbGwoJmVudiwg Y2hhbWVsaXVtX3VybCwgIlNldERkY1N0YXRlIiwKKwkJCQkgIihpYikiLCBwb3J0LCBlbmFibGVk KTsKKwljaGVja19ycGMoKTsKKworCXhtbHJwY19ERUNSRUYocmVzKTsKK30KKworLyoqCisgKiBj aGFtZWxpdW1fcG9ydF9nZXRfZGRjX3N0YXRlOgorICogQGlkOiBUaGUgSUQgb2YgdGhlIHBvcnQg d2hvc2UgRERDIGJ1cyB3ZSB3YW50IHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YKKyAqCisgKiBDaGVj ayB3aGV0aGVyIG9yIG5vdCB0aGUgRERDIGJ1cyBvbiB0aGUgc3BlY2lmaWVkIGNoYW1lbGl1bSBw b3J0IGlzIGVuYWJsZWQKKyAqIG9yIG5vdC4KKyAqCisgKiBSZXR1cm5zOiAldHJ1ZSBpZiB0aGUg RERDIGJ1cyBpcyBlbmFibGVkLCAlZmFsc2Ugb3RoZXJ3aXNlLgorICovCitib29sIGNoYW1lbGl1 bV9wb3J0X2dldF9kZGNfc3RhdGUoaW50IGlkKQoreworCXhtbHJwY192YWx1ZSAqcmVzOworCXht bHJwY19ib29sIGVuYWJsZWQ7CisKKwlyZXMgPSB4bWxycGNfY2xpZW50X2NhbGwoJmVudiwgY2hh bWVsaXVtX3VybCwgIklzRGRjRW5hYmxlZCIsCisJCQkJICIoaSkiLCBpZCk7CisJY2hlY2tfcnBj KCk7CisKKwl4bWxycGNfcmVhZF9ib29sKCZlbnYsIHJlcywgJmVuYWJsZWQpOworCisJeG1scnBj X0RFQ1JFRihyZXMpOworCXJldHVybiBlbmFibGVkOworfQorCisvKioKKyAqIGNoYW1lbGl1bV9w b3J0X2dldF9yZXNvbHV0aW9uOgorICogQGlkOiBUaGUgSUQgb2YgdGhlIHBvcnQgd2hvc2UgZGlz cGxheSByZXNvbHV0aW9uIHdlIHdhbnQgdG8gY2hlY2sKKyAqIEB4OiBXaGVyZSB0byBzdG9yZSB0 aGUgaG9yaXpvbnRhbCByZXNvbHV0aW9uIG9mIHRoZSBwb3J0CisgKiBAeTogV2hlcmUgdG8gc3Rv cmUgdGhlIHZlcmljYWwgcmVzb2x1dGlvbiBvZiB0aGUgcG9ydAorICoKKyAqIENoZWNrIHRoZSBj dXJyZW50IHJlcG9ydGVkIGRpc3BsYXkgcmVzb2x1dGlvbiBvZiB0aGUgc3BlY2lmaWVkIHBvcnQg b24gdGhlCisgKiBjaGFtZWxpdW0uIFRoaXMgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgYnkgdGhl IGNoYW1lbGl1bSBpdHNlbGYsIG5vdCBEUk0uCisgKiBVc2VmdWwgZm9yIHZlcmlmeWluZyB0aGF0 IHdlIHJlYWxseSBhcmUgc2Nhbm5pbmcgb3V0IGF0IHRoZSByZXNvbHV0aW9uIHdlCisgKiB0aGlu ayB3ZSBhcmUuCisgKi8KK3ZvaWQgY2hhbWVsaXVtX3BvcnRfZ2V0X3Jlc29sdXRpb24oaW50IGlk LCBpbnQgKngsIGludCAqeSkKK3sKKwl4bWxycGNfdmFsdWUgKnJlcywgKnJlc194LCAqcmVzX3k7 CisKKwlyZXMgPSB4bWxycGNfY2xpZW50X2NhbGwoJmVudiwgY2hhbWVsaXVtX3VybCwgIkRldGVj dFJlc29sdXRpb24iLAorCQkJCSAiKGkpIiwgaWQpOworCWNoZWNrX3JwYygpOworCisJeG1scnBj X2FycmF5X3JlYWRfaXRlbSgmZW52LCByZXMsIDAsICZyZXNfeCk7CisJeG1scnBjX2FycmF5X3Jl YWRfaXRlbSgmZW52LCByZXMsIDEsICZyZXNfeSk7CisJeG1scnBjX3JlYWRfaW50KCZlbnYsIHJl c194LCB4KTsKKwl4bWxycGNfcmVhZF9pbnQoJmVudiwgcmVzX3ksIHkpOworCisJeG1scnBjX0RF Q1JFRihyZXNfeCk7CisJeG1scnBjX0RFQ1JFRihyZXNfeSk7CisJeG1scnBjX0RFQ1JFRihyZXMp OworfQorCitzdGF0aWMgdm9pZCBjcmNfZnJvbV94bWwoeG1scnBjX3ZhbHVlICp4bWxfY3JjLCBp Z3RfY3JjX3QgKm91dCkKK3sKKwl4bWxycGNfdmFsdWUgKnJlczsKKwlpbnQgaTsKKworCW91dC0+ bl93b3JkcyA9IHhtbHJwY19hcnJheV9zaXplKCZlbnYsIHhtbF9jcmMpOworCWZvciAoaSA9IDA7 IGkgPCBvdXQtPm5fd29yZHM7IGkrKykgeworCQl4bWxycGNfYXJyYXlfcmVhZF9pdGVtKCZlbnYs IHhtbF9jcmMsIGksICZyZXMpOworCQl4bWxycGNfcmVhZF9pbnQoJmVudiwgcmVzLCAoaW50Kikm b3V0LT5jcmNbaV0pOworCQl4bWxycGNfREVDUkVGKHJlcyk7CisJfQorfQorCisvKioKKyAqIGNo YW1lbGl1bV9nZXRfY3JjX2Zvcl9hcmVhOgorICogQGlkOiBUaGUgSUQgb2YgdGhlIHBvcnQgZnJv bSB3aGljaCB3ZSB3YW50IHRvIHJldHJpZXZlIHRoZSBDUkMKKyAqIEB4OiBUaGUgWCBjb29yZGlu YXRlIG9uIHRoZSBlbXVsYXRlZCBkaXNwbGF5IHRvIHN0YXJ0IGNhbGN1bGF0aW5nIHRoZSBDUkMK KyAqIGZyb20KKyAqIEB5OiBUaGUgWSBjb29yZGluYXRlIG9uIHRoZSBlbXVsYXRlZCBkaXNwbGF5 IHRvIHN0YXJ0IGNhbGN1bGF0aW5nIHRoZSBDUkMKKyAqIGZyb20KKyAqIEB3OiBUaGUgd2lkdGgg b2YgdGhlIGFyZWEgdG8gZmV0Y2ggdGhlIENSQyBmcm9tLCBvciAlMCBmb3IgdGhlIHdob2xlIGRp c3BsYXkKKyAqIEBoOiBUaGUgaGVpZ2h0IG9mIHRoZSBhcmVhIHRvIGZldGNoIHRoZSBDUkMgZnJv bSwgb3IgJTAgZm9yIHRoZSB3aG9sZSBkaXNwbGF5CisgKgorICogUmVhZHMgYmFjayB0aGUgcGl4 ZWwgQ1JDIGZvciBhbiBhcmVhIG9uIHRoZSBzcGVjaWZpZWQgY2hhbWVsaXVtIHBvcnQuIFRoaXMK KyAqIGlzIHRoZSBzYW1lIGFzIHVzaW5nIHRoZSBDUkMgcmVhZGJhY2sgZnJvbSBhIEdQVSwgdGhl IG1haW4gZGlmZmVyZW5jZSBiZWluZworICogdGhlIGRhdGEgaXMgcHJvdmlkZWQgYnkgdGhlIGNo YW1lbGl1bSBhbmQgYWxzbyBhbGxvd3MgdXMgdG8gc3BlY2lmeSBhIHJlZ2lvbgorICogb2YgdGhl IHNjcmVlbiB0byB1c2UgYXMgb3Bwb3NlZCB0byB0aGUgZW50aXJlIHRoaW5nLgorICoKKyAqIFJl dHVybnM6IFRoZSBDUkMgcmVhZCBiYWNrIGZyb20gdGhlIGNoYW1lbGl1bQorICovCitpZ3RfY3Jj X3QgKmNoYW1lbGl1bV9nZXRfY3JjX2Zvcl9hcmVhKGludCBpZCwgaW50IHgsIGludCB5LCBpbnQg dywgaW50IGgpCit7CisJeG1scnBjX3ZhbHVlICpyZXM7CisJaWd0X2NyY190ICpyZXQgPSBtYWxs b2Moc2l6ZW9mKGlndF9jcmNfdCkpOzsKKworCXJlcyA9IHhtbHJwY19jbGllbnRfY2FsbCgmZW52 LCBjaGFtZWxpdW1fdXJsLCAiQ29tcHV0ZVBpeGVsQ2hlY2tzdW0iLAorCQkJCSAodyAmJiBoKSA/ ICIoaWlpaWkpIiA6ICIoaW5ubm4pIiwKKwkJCQkgaWQsIHgsIHksIHcsIGgpOworCWNoZWNrX3Jw YygpOworCisJY3JjX2Zyb21feG1sKHJlcywgcmV0KTsKKwl4bWxycGNfREVDUkVGKHJlcyk7CisK KwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGNoYW1lbGl1bV9zdGFydF9jYXB0dXJlOgorICog QGlkOiBUaGUgSUQgb2YgdGhlIHBvcnQgZm9yIHdoaWNoIHdlIHdhbnQgdG8gc3RhcnQgY2FwdHVy aW5nIGZyYW1lcyBvbgorICogQHg6IFRoZSBYIGNvb3JkaW5hdGUgdG8gY3JvcCB0aGUgdmlkZW8g dG8KKyAqIEB5OiBUaGUgWSBjb29yZGluYXRlIHRvIGNyb3AgdGhlIHZpZGVvIHRvCisgKiBAdzog VGhlIHdpZHRoIG9mIHRoZSBjcm9wcGVkIHZpZGVvLCBvciAlMCBmb3IgdGhlIHdob2xlIGRpc3Bs YXkKKyAqIEBoOiBUaGUgaGVpZ2h0IG9mIHRoZSBjcm9wcGVkIHZpZGVvLCBvciAlMCBmb3IgdGhl IHdob2xlIGRpc3BsYXkKKyAqCisgKiBTdGFydHMgY2FwdHVyaW5nIHZpZGVvIGZyYW1lcyBvbiB0 aGUgZ2l2ZW4gQ2hhbWVsaXVtIHBvcnQuIE9uY2UgdGhlIHVzZXIgaXMKKyAqIGZpbmlzaGVkIGNh cHR1cmluZyBmcmFtZXMsIHRoZXkgc2hvdWxkIGNhbGwgI2NoYW1lbGl1bV9zdG9wX2NhcHR1cmUu CisgKgorICogRm9yIGNhcHR1cmluZyBhIHNpbmdsZSBmcmFtZSwgdXNlcnMgY2FuIHVzZSB0aGUg b25lLXNob3QKKyAqIEBjaGFtZWxpdW1fZ2V0X2NyY19mb3JfYXJlYQorICovCit2b2lkIGNoYW1l bGl1bV9zdGFydF9jYXB0dXJlKGludCBpZCwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCit7 CisJeG1scnBjX2NsaWVudF9jYWxsKCZlbnYsIGNoYW1lbGl1bV91cmwsICJTdGFydENhcHR1cmlu Z1ZpZGVvIiwKKwkJCSAgICh3ICYmIGgpID8gIihpaWlpaSkiIDogIihpbm5ubikiLCBpZCwgeCwg eSwgdywgaCk7CisJY2hlY2tfcnBjKCk7Cit9CisKKy8qKgorICogY2hhbWVsaXVtX3N0b3BfY2Fw dHVyZToKKyAqIEBmcmFtZV9jb3VudDogVGhlIG51bWJlciBvZiBmcmFtZXMgdG8gd2FpdCB0byBj YXB0dXJlLCBvciAlMCB0byBzdG9wCisgKiBpbW1lZGlhdGVseQorICoKKyAqIEZpbmlzaGVzIGNh cHR1cmluZyB2aWRlbyBmcmFtZXMgb24gdGhlIGdpdmVuIENoYW1lbGl1bSBwb3J0LiBJZiBAZnJh bWVfY291bnQKKyAqIGlzIHNwZWNpZmllZCwgdGhpcyBjYWxsIHdpbGwgYmxvY2sgdW50aWwgdGhl IGdpdmVuIG51bWJlciBvZiBmcmFtZXMgaGF2ZSBiZWVuCisgKiBjYXB0dXJlZC4KKyAqLwordm9p ZCBjaGFtZWxpdW1fc3RvcF9jYXB0dXJlKGludCBmcmFtZV9jb3VudCkKK3sKKwl4bWxycGNfY2xp ZW50X2NhbGwoJmVudiwgY2hhbWVsaXVtX3VybCwgIlN0b3BDYXB0dXJpbmdWaWRlbyIsCisJCQkg ICAiKGkpIiwgZnJhbWVfY291bnQpOworCWNoZWNrX3JwYygpOworfQorCisvKioKKyAqIGNoYW1l bGl1bV9yZWFkX2NhcHR1cmVkX2NyY3M6CisgKiBAZnJhbWVfY291bnQ6IFdoZXJlIHRvIHN0b3Jl IHRoZSBudW1iZXIgb2YgQ1JDcyB3ZSByZWFkIGluCisgKgorICogUmVhZHMgYWxsIG9mIHRoZSBD UkNzIHRoYXQgaGF2ZSBiZWVuIGNhcHR1cmVkIHRodXMgZmFyIGZyb20gdGhlIENoYW1lbGl1bS4K KyAqCisgKiBSZXR1cm5zOiBBbiBhcnJheSBvZiBAZnJhbWVfY291bnQgbGVuZ3RoIGNvbnRhaW5p bmcgYWxsIG9mIHRoZSBDUkNzIHdlIHJlYWQKKyAqLworaWd0X2NyY190ICpjaGFtZWxpdW1fcmVh ZF9jYXB0dXJlZF9jcmNzKGludCAqZnJhbWVfY291bnQpCit7CisJaWd0X2NyY190ICpyZXQ7CisJ eG1scnBjX3ZhbHVlICpyZXMsICplbGVtOworCWludCBpOworCisJcmVzID0geG1scnBjX2NsaWVu dF9jYWxsKCZlbnYsIGNoYW1lbGl1bV91cmwsICJHZXRDYXB0dXJlZENoZWNrc3VtcyIsCisJCQkJ ICIoaW4pIiwgMCk7CisJY2hlY2tfcnBjKCk7CisKKwkqZnJhbWVfY291bnQgPSB4bWxycGNfYXJy YXlfc2l6ZSgmZW52LCByZXMpOworCXJldCA9IGNhbGxvYyhzaXplb2YoaWd0X2NyY190KSwgKmZy YW1lX2NvdW50KTsKKworCWZvciAoaSA9IDA7IGkgPCAqZnJhbWVfY291bnQ7IGkrKykgeworCQl4 bWxycGNfYXJyYXlfcmVhZF9pdGVtKCZlbnYsIHJlcywgaSwgJmVsZW0pOworCisJCWNyY19mcm9t X3htbChlbGVtLCAmcmV0W2ldKTsKKwkJcmV0W2ldLmZyYW1lID0gaTsKKworCQl4bWxycGNfREVD UkVGKGVsZW0pOworCX0KKworCXhtbHJwY19ERUNSRUYocmVzKTsKKworCXJldHVybiByZXQ7Cit9 CisKKy8qKgorICogY2hhbWVsaXVtX2dldF9mcmFtZV9saW1pdDoKKyAqIEBpZDogVGhlIElEIG9m IHRoZSBwb3J0IHRvIGdldCB0aGUgY2FwdHVyZSBmcmFtZSBsaW1pdCBmb3IKKyAqIEB3OiBUaGUg d2lkdGggb2YgdGhlIGFyZWEgdG8gZ2V0IHRoZSBjYXB0dXJlIGZyYW1lIGxpbWl0IGZvciwgb3Ig JTAgZm9yIHRoZQorICogd2hvbGUgZGlzcGxheQorICogQGg6IFRoZSBoZWlnaHQgb2YgdGhlIGFy ZWEgdG8gZ2V0IHRoZSBjYXB0dXJlIGZyYW1lIGxpbWl0IGZvciwgb3IgJTAgZm9yIHRoZQorICog d2hvbGUgZGlzcGxheQorICoKKyAqIEdldHMgdGhlIG1heCBudW1iZXIgb2YgZnJhbWVzIHdlIGNh biBjYXB0dXJlIHdpdGggdGhlIENoYW1lbGl1bSBmb3IgdGhlIGdpdmVuCisgKiByZXNvbHV0aW9u LgorICoKKyAqIFJldHVybnM6IFRoZSBudW1iZXIgb2YgdGhlIG1heCBudW1iZXIgb2YgZnJhbWVz IHdlIGNhbiBjYXB0dXJlCisgKi8KK2ludCBjaGFtZWxpdW1fZ2V0X2ZyYW1lX2xpbWl0KGludCBp ZCwgaW50IHcsIGludCBoKQoreworCXhtbHJwY192YWx1ZSAqcmVzOworCWludCByZXQ7CisKKwlp ZiAoIXcgJiYgIWgpCisJCWNoYW1lbGl1bV9wb3J0X2dldF9yZXNvbHV0aW9uKGlkLCAmdywgJmgp OworCisJcmVzID0geG1scnBjX2NsaWVudF9jYWxsKCZlbnYsIGNoYW1lbGl1bV91cmwsICJHZXRN YXhGcmFtZUxpbWl0IiwKKwkJCQkgIihpaWkpIiwgaWQsIHcsIGgpOworCWNoZWNrX3JwYygpOwor CisJeG1scnBjX3JlYWRfaW50KCZlbnYsIHJlcywgJnJldCk7CisJeG1scnBjX0RFQ1JFRihyZXMp OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBjaGFtZWxpdW1fZ2V0 X3BvcnRfdHlwZShpbnQgcG9ydCkKK3sKKwl4bWxycGNfdmFsdWUgKnJlczsKKwljb25zdCBjaGFy ICpwb3J0X3R5cGVfc3RyOworCXVuc2lnbmVkIGludCBwb3J0X3R5cGU7CisKKwlyZXMgPSB4bWxy cGNfY2xpZW50X2NhbGwoJmVudiwgY2hhbWVsaXVtX3VybCwgIkdldENvbm5lY3RvclR5cGUiLAor CQkJCSAiKGkpIiwgcG9ydCk7CisJY2hlY2tfcnBjKCk7CisKKwl4bWxycGNfcmVhZF9zdHJpbmco JmVudiwgcmVzLCAmcG9ydF90eXBlX3N0cik7CisJaWd0X2RlYnVnKCJQb3J0ICVkIGlzIG9mIHR5 cGUgJyVzJ1xuIiwgcG9ydCwgcG9ydF90eXBlX3N0cik7CisKKwlpZiAoc3RyY21wKHBvcnRfdHlw ZV9zdHIsICJEUCIpID09IDApCisJCXBvcnRfdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9EaXNw bGF5UG9ydDsKKwllbHNlIGlmIChzdHJjbXAocG9ydF90eXBlX3N0ciwgIkhETUkiKSA9PSAwKQor CQlwb3J0X3R5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUE7CisJZWxzZSBpZiAoc3RyY21w KHBvcnRfdHlwZV9zdHIsICJWR0EiKSA9PSAwKQorCQlwb3J0X3R5cGUgPSBEUk1fTU9ERV9DT05O RUNUT1JfVkdBOworCWVsc2UKKwkJcG9ydF90eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX1Vua25v d247CisKKwlmcmVlKCh2b2lkKilwb3J0X3R5cGVfc3RyKTsKKwl4bWxycGNfREVDUkVGKHJlcyk7 CisKKwlyZXR1cm4gcG9ydF90eXBlOworfQorCitzdGF0aWMgdm9pZCBjaGFtZWxpdW1fcmVhZF9w b3J0X21hcHBpbmdzKGludCBkcm1fZmQsIEdLZXlGaWxlICprZXlfZmlsZSkKK3sKKwlkcm1Nb2Rl UmVzICpyZXM7CisJZHJtTW9kZUNvbm5lY3RvciAqY29ubmVjdG9yOworCXN0cnVjdCBjaGFtZWxp dW1fcG9ydCAqcG9ydDsKKwlHRXJyb3IgKmVycm9yID0gTlVMTDsKKwljaGFyICoqZ3JvdXBfbGlz dDsKKwljaGFyICpncm91cDsKKwlzaXplX3QgZ3JvdXBfbGlzdF9sZW47CisJaW50IHBvcnRfaSwg aSwgajsKKworCWdyb3VwX2xpc3QgPSBnX2tleV9maWxlX2dldF9ncm91cHMoa2V5X2ZpbGUsICZn cm91cF9saXN0X2xlbik7CisJY2hhbWVsaXVtX3BvcnRfY291bnQgPSBncm91cF9saXN0X2xlbiAt IDE7CisJY2hhbWVsaXVtX3BvcnRzID0gY2FsbG9jKHNpemVvZihzdHJ1Y3QgY2hhbWVsaXVtX3Bv cnQpLAorCQkJCSBjaGFtZWxpdW1fcG9ydF9jb3VudCk7CisJbWVtc2V0KGNoYW1lbGl1bV9wb3J0 cywgMCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBjaGFtZWxpdW1fcG9ydCkgKiBjaGFtZWxpdW1f cG9ydF9jb3VudCk7CisJcG9ydF9pID0gMDsKKwlyZXMgPSBkcm1Nb2RlR2V0UmVzb3VyY2VzKGRy bV9mZCk7CisKKwlmb3IgKGkgPSAwOyBncm91cF9saXN0W2ldICE9IE5VTEw7IGkrKykgeworCQln cm91cCA9IGdyb3VwX2xpc3RbaV07CisKKwkJaWYgKHN0cmNtcChncm91cCwgIkNoYW1lbGl1bSIp ID09IDApCisJCQljb250aW51ZTsKKworCQlwb3J0ID0gJmNoYW1lbGl1bV9wb3J0c1twb3J0X2kr K107CisJCXBvcnQtPmNvbm5lY3Rvcl9uYW1lID0gc3RyZHVwKGdyb3VwKTsKKwkJcG9ydC0+aWQg PSBnX2tleV9maWxlX2dldF9pbnRlZ2VyKGtleV9maWxlLCBncm91cCwKKwkJCQkJCSAgIkNoYW1l bGl1bVBvcnRJRCIsCisJCQkJCQkgICZlcnJvcik7CisJCWlndF9yZXF1aXJlX2YocG9ydC0+aWQs CisJCQkgICAgICAiRmFpbGVkIHRvIHJlYWQgY2hhbWVsaXVtIHBvcnQgSUQgZm9yICVzOiAlc1xu IiwKKwkJCSAgICAgIGdyb3VwLCBlcnJvci0+bWVzc2FnZSk7CisKKwkJcG9ydC0+dHlwZSA9IGNo YW1lbGl1bV9nZXRfcG9ydF90eXBlKHBvcnQtPmlkKTsKKwkJaWd0X3JlcXVpcmVfZihwb3J0LT50 eXBlICE9IERSTV9NT0RFX0NPTk5FQ1RPUl9Vbmtub3duLAorCQkJICAgICAgIlVuYWJsZSB0byBy ZXRyaWV2ZSB0aGUgcGh5c2ljYWwgcG9ydCB0eXBlIGZyb20gdGhlIENoYW1lbGl1bSBmb3IgJyVz J1xuIiwKKwkJCSAgICAgIGdyb3VwKTsKKworCQlmb3IgKGogPSAwOworCQkgICAgIGogPCByZXMt PmNvdW50X2Nvbm5lY3RvcnMgJiYgIXBvcnQtPmNvbm5lY3Rvcl9pZDsKKwkJICAgICBqKyspIHsK KwkJCWNoYXIgY29ubmVjdG9yX25hbWVbNTBdOworCisJCQljb25uZWN0b3IgPSBkcm1Nb2RlR2V0 Q29ubmVjdG9yQ3VycmVudCgKKwkJCSAgICBkcm1fZmQsIHJlcy0+Y29ubmVjdG9yc1tqXSk7CisK KwkJCS8qIFdlIGhhdmUgdG8gZ2VuZXJhdGUgdGhlIGNvbm5lY3RvciBuYW1lIG9uIG91ciBvd24g Ki8KKwkJCXNucHJpbnRmKGNvbm5lY3Rvcl9uYW1lLCA1MCwgIiVzLSV1IiwKKwkJCQkga21zdGVz dF9jb25uZWN0b3JfdHlwZV9zdHIoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSksCisJCQkJIGNv bm5lY3Rvci0+Y29ubmVjdG9yX3R5cGVfaWQpOworCisJCQlpZiAoc3RyY21wKGNvbm5lY3Rvcl9u YW1lLCBncm91cCkgPT0gMCkKKwkJCQlwb3J0LT5jb25uZWN0b3JfaWQgPSBjb25uZWN0b3ItPmNv bm5lY3Rvcl9pZDsKKworCQkJZHJtTW9kZUZyZWVDb25uZWN0b3IoY29ubmVjdG9yKTsKKwkJfQor CQlpZ3RfYXNzZXJ0X2YocG9ydC0+Y29ubmVjdG9yX2lkLAorCQkJICAgICAiTm8gY29ubmVjdG9y IGZvdW5kIHdpdGggbmFtZSAnJXMnXG4iLCBncm91cCk7CisKKwkJaWd0X2RlYnVnKCJQb3J0ICcl cycgd2l0aCBwaHlzaWNhbCB0eXBlICclcycgbWFwcGVkIHRvIENoYW1lbGl1bSBwb3J0ICVkXG4i LAorCQkJICBncm91cCwga21zdGVzdF9jb25uZWN0b3JfdHlwZV9zdHIocG9ydC0+dHlwZSksCisJ CQkgIHBvcnQtPmlkKTsKKwl9CisKKwlkcm1Nb2RlRnJlZVJlc291cmNlcyhyZXMpOworCWdfc3Ry ZnJlZXYoZ3JvdXBfbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkIGNoYW1lbGl1bV9yZWFkX2NvbmZp ZyhpbnQgZHJtX2ZkKQoreworCUdLZXlGaWxlICprZXlfZmlsZSA9IGdfa2V5X2ZpbGVfbmV3KCk7 CisJR0Vycm9yICplcnJvciA9IE5VTEw7CisJY2hhciAqa2V5X2ZpbGVfbG9jOworCWludCByYzsK KworCWtleV9maWxlX2xvYyA9IGdldGVudigiQ0hBTUVMSVVNX0NPTkZJR19QQVRIIik7CisJaWYg KCFrZXlfZmlsZV9sb2MpIHsKKwkJaWd0X3JlcXVpcmUoa2V5X2ZpbGVfbG9jID0gYWxsb2NhKDEw MCkpOworCQlzbnByaW50ZihrZXlfZmlsZV9sb2MsIDEwMCwgIiVzLy5pZ3RfY2hhbWVsaXVtX3Jj IiwKKwkJCSBnX2dldF9ob21lX2RpcigpKTsKKwl9CisKKwlyYyA9IGdfa2V5X2ZpbGVfbG9hZF9m cm9tX2ZpbGUoa2V5X2ZpbGUsIGtleV9maWxlX2xvYywKKwkJCQkgICAgICAgR19LRVlfRklMRV9O T05FLCAmZXJyb3IpOworCWlndF9yZXF1aXJlX2YocmMsICJGYWlsZWQgdG8gcmVhZCBjaGFtZWxp dW0gY29uZmlndXJhdGlvbiBmaWxlOiAlc1xuIiwKKwkJICAgICAgZXJyb3ItPm1lc3NhZ2UpOwor CisJY2hhbWVsaXVtX3VybCA9IGdfa2V5X2ZpbGVfZ2V0X3N0cmluZyhrZXlfZmlsZSwgIkNoYW1l bGl1bSIsICJVUkwiLAorCQkJCQkgICAgICAmZXJyb3IpOworCWlndF9yZXF1aXJlX2YoY2hhbWVs aXVtX3VybCwKKwkJICAgICAgIkNvdWxkbid0IHJlYWQgY2hhbWVsaXVtIFVSTCBmcm9tIGNvbmZp ZyBmaWxlOiAlc1xuIiwKKwkJICAgICAgZXJyb3ItPm1lc3NhZ2UpOworCisJY2hhbWVsaXVtX3Jl YWRfcG9ydF9tYXBwaW5ncyhkcm1fZmQsIGtleV9maWxlKTsKKworCWdfa2V5X2ZpbGVfZnJlZShr ZXlfZmlsZSk7Cit9CisKKy8qKgorICogY2hhbWVsaXVtX3Jlc2V0OgorICoKKyAqIFJlc2V0cyB0 aGUgY2hhbWVsaXVtJ3MgSU8gYm9hcmQuIEFzIHdlbGwsIHRoaXMgYWxzbyBoYXMgdGhlIGVmZmVj dCBvZgorICogY2F1c2luZyBhbGwgb2YgdGhlIGNoYW1lbGl1bSBwb3J0cyB0byBnZXQgc2V0IHRv IHVucGx1Z2dlZAorICovCit2b2lkIGNoYW1lbGl1bV9yZXNldCh2b2lkKQoreworCXhtbHJwY192 YWx1ZSAqcmVzOworCisJaWd0X2RlYnVnKCJSZXNldHRpbmcgdGhlIGNoYW1lbGl1bVxuIik7CisK KwlyZXMgPSB4bWxycGNfY2xpZW50X2NhbGwoJmVudiwgY2hhbWVsaXVtX3VybCwgIlJlc2V0Iiwg IigpIik7CisJY2hlY2tfcnBjKCk7CisKKwl4bWxycGNfREVDUkVGKHJlcyk7Cit9CisKK3N0YXRp YyB2b2lkIGNoYW1lbGl1bV9leGl0X2hhbmRsZXIoaW50IHNpZykKK3sKKwl4bWxycGNfZW52X2Ns ZWFuKCZlbnYpOworCXhtbHJwY19lbnZfaW5pdCgmZW52KTsKKworCWNoYW1lbGl1bV9kZWluaXQo KTsKK30KKworLyoqCisgKiBjaGFtZWxpdW1faW5pdDoKKyAqIEBkcm1fZmQ6IGRybSBmaWxlIGRl c2NyaXB0b3IKKyAqCisgKiBTZXRzIHVwIGEgY29ubmVjdGlvbiB3aXRoIGEgY2hhbWVsaXVtLCB1 c2luZyB0aGUgVVJMIHNwZWNpZmllZCBpbiB0aGUKKyAqIENoYW1lbGl1bSBjb25maWd1cmF0aW9u LiBUaGlzIG11c3QgYmUgY2FsbGVkIGZpcnN0IGJlZm9yZSB0cnlpbmcgdG8gdXNlIHRoZQorICog Y2hhbWVsaXVtLgorICoKKyAqIElmIHdlIGZhaWwgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB3 aXRoIHRoZSBjaGFtZWxpdW0sIGZhaWwgdG8gZmluZCBhCisgKiBjb25maWd1cmVkIGNvbm5lY3Rv ciwgZXRjLiB3ZSBmYWlsIHRoZSBjdXJyZW50IHRlc3QuCisgKi8KK3ZvaWQgY2hhbWVsaXVtX2lu aXQoaW50IGRybV9mZCkKK3sKKwl4bWxycGNfZW52X2luaXQoJmVudik7CisKKwl4bWxycGNfY2xp ZW50X2luaXQyKCZlbnYsIFhNTFJQQ19DTElFTlRfTk9fRkxBR1MsIFBBQ0tBR0UsCisJCQkgICAg UEFDS0FHRV9WRVJTSU9OLCBOVUxMLCAwKTsKKwlpZ3RfZmFpbF9vbl9mKGVudi5mYXVsdF9vY2N1 cnJlZCwKKwkJICAgICAgIkZhaWxlZCB0byBpbml0IHhtbHJwYzogJXNcbiIsCisJCSAgICAgIGVu di5mYXVsdF9zdHJpbmcpOworCisJY2hhbWVsaXVtX3JlYWRfY29uZmlnKGRybV9mZCk7CisJY2hh bWVsaXVtX3Jlc2V0KCk7CisKKwlpZ3RfaW5zdGFsbF9leGl0X2hhbmRsZXIoY2hhbWVsaXVtX2V4 aXRfaGFuZGxlcik7Cit9CisKKy8qKgorICogY2hhbWVsaXVtX2RlaW5pdDoKKyAqCisgKiBGcmVl cyB0aGUgcmVzb3VyY2VzIHVzZWQgYnkgYSBjb25uZWN0aW9uIHRvIHRoZSBjaGFtZWxpdW0gdGhh dCB3YXMgc2V0IHVwCisgKiB3aXRoICNjaGFtZWxpdW1faW5pdC4gQXMgd2VsbCwgdGhpcyBmdW5j dGlvbiByZXN0b3JlcyB0aGUgc3RhdGUgb2YgdGhlCisgKiBjaGFtZWxpdW0gbGlrZSBpdCB3YXMg YmVmb3JlIGNhbGxpbmcgI2NoYW1lbGl1bV9pbml0LiBUaGlzIGZ1bmN0aW9uIGlzIGFsc28KKyAq IGNhbGxlZCBhcyBhbiBleGl0IGhhbmRsZXIsIHNvIHVzZXJzIG9ubHkgbmVlZCB0byBjYWxsIG1h bnVhbGx5IGlmIHRoZXkgZG9uJ3QKKyAqIHdhbnQgdGhlIGNoYW1lbGl1bSBpbnRlcmZlcmluZyB3 aXRoIG90aGVyIHRlc3RzIGluIHRoZSBzYW1lIGZpbGUuCisgKi8KK3ZvaWQgY2hhbWVsaXVtX2Rl aW5pdCh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBjaGFtZWxpdW1fZWRpZCAqcG9zLCAqdG1w OworCisJaWYgKCFjaGFtZWxpdW1fdXJsKQorCQlyZXR1cm47CisKKwkvKiBXZSB3YW50IHRvIG1h a2Ugc3VyZSB3ZSBsZWF2ZSBhbGwgb2YgdGhlIHBvcnRzIHBsdWdnZWQgaW4sIHNpbmNlCisJICog dGVzdGluZyBzZXR1cHMgcmVxdWlyaW5nIG11bHRpcGxlIG1vbml0b3JzIGFyZSBwcm9iYWJseSB1 c2luZyB0aGUKKwkgKiBjaGFtZWxpdW0gdG8gcHJvdmlkZSBzYWlkIG1vbml0b3JzCisJICovCisJ Y2hhbWVsaXVtX3Jlc2V0KCk7CisJZm9yIChpID0gMDsgaSA8IGNoYW1lbGl1bV9wb3J0X2NvdW50 OyBpKyspCisJCWNoYW1lbGl1bV9wbHVnKGNoYW1lbGl1bV9wb3J0c1tpXS5pZCk7CisKKwkvKiBE ZXN0cm95IGFueSBFRElEcyB3ZSBjcmVhdGVkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBsZWFrIHRo ZW0gKi8KKwlpZ3RfbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmYWxsb2NhdGVkX2VkaWRz LT5saW5rLCBsaW5rKSB7CisJCWNoYW1lbGl1bV9kZXN0cm95X2VkaWQocG9zLT5pZCk7CisJCWZy ZWUocG9zKTsKKwl9CisKKwl4bWxycGNfY2xpZW50X2NsZWFudXAoKTsKKwl4bWxycGNfZW52X2Ns ZWFuKCZlbnYpOworCisJZm9yIChpID0gMDsgaSA8IGNoYW1lbGl1bV9wb3J0X2NvdW50OyBpKysp CisJCWZyZWUoY2hhbWVsaXVtX3BvcnRzW2ldLmNvbm5lY3Rvcl9uYW1lKTsKKworCWZyZWUoY2hh bWVsaXVtX3BvcnRzKTsKKwlhbGxvY2F0ZWRfZWRpZHMgPSBOVUxMOworCWNoYW1lbGl1bV91cmwg PSBOVUxMOworCWNoYW1lbGl1bV9wb3J0cyA9IE5VTEw7CisJY2hhbWVsaXVtX3BvcnRfY291bnQg PSAwOworfQorCmRpZmYgLS1naXQgYS9saWIvaWd0X2NoYW1lbGl1bS5oIGIvbGliL2lndF9jaGFt ZWxpdW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjdhYWRmCi0tLSAv ZGV2L251bGwKKysrIGIvbGliL2lndF9jaGFtZWxpdW0uaApAQCAtMCwwICsxLDczIEBACisvKgor ICogQ29weXJpZ2h0IMKpIDIwMTYgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBo ZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEK KyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZp bGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0 IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRz IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGlj ZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJt aXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNv LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUg Y29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRo ZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Ig c3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09G VFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwg RVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUg V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRI RSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBE QU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENP TlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElO IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5H UworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEx5dWRlIFBhdWwgPGx5dWRl QHJlZGhhdC5jb20+CisgKi8KKworI2lmbmRlZiBJR1RfQ0hBTUVMSVVNX0gKKyNkZWZpbmUgSUdU X0NIQU1FTElVTV9ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJpZ3QuaCIKKyNp bmNsdWRlIDxzdGRib29sLmg+CisKKy8qKgorICogY2hhbWVsaXVtX3BvcnQ6CisgKiBAdHlwZTog VGhlIERSTSBjb25uZWN0b3IgdHlwZSBvZiB0aGUgY2hhbWVsaXVtIHBvcnQgKG5vdCB0aGUgaG9z dCdzKQorICogQGlkOiBUaGUgSUQgb2YgdGhlIGNoYW1lbGl1bSBwb3J0CisgKiBAY29ubmVjdG9y X2lkOiBUaGUgSUQgb2YgdGhlIERSTSBjb25uZWN0b3IgY29ubmVjdGVkIHRvIHRoaXMgcG9ydAor ICogQGNvbm5lY3Rvcl9uYW1lOiBUaGUgbmFtZSBvZiB0aGUgRFJNIGNvbm5lY3RvcgorICovCitz dHJ1Y3QgY2hhbWVsaXVtX3BvcnQgeworCXVuc2lnbmVkIGludCB0eXBlOworCWludCBpZDsKKwlp bnQgY29ubmVjdG9yX2lkOworCWNoYXIgKmNvbm5lY3Rvcl9uYW1lOworfTsKKworZXh0ZXJuIGlu dCBjaGFtZWxpdW1fcG9ydF9jb3VudDsKK2V4dGVybiBzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgKmNo YW1lbGl1bV9wb3J0czsKKwordm9pZCBjaGFtZWxpdW1faW5pdChpbnQgZHJtX2ZkKTsKK3ZvaWQg Y2hhbWVsaXVtX2RlaW5pdCh2b2lkKTsKK3ZvaWQgY2hhbWVsaXVtX3Jlc2V0KHZvaWQpOworCit2 b2lkIGNoYW1lbGl1bV9wbHVnKGludCBpZCk7Cit2b2lkIGNoYW1lbGl1bV91bnBsdWcoaW50IGlk KTsKK2Jvb2wgY2hhbWVsaXVtX2lzX3BsdWdnZWQoaW50IGlkKTsKK2Jvb2wgY2hhbWVsaXVtX3Bv cnRfd2FpdF92aWRlb19pbnB1dF9zdGFibGUoaW50IGlkLCBpbnQgdGltZW91dF9zZWNzKTsKK3Zv aWQgY2hhbWVsaXVtX2ZpcmVfbWl4ZWRfaHBkX3B1bHNlcyhpbnQgaWQsIC4uLik7Cit2b2lkIGNo YW1lbGl1bV9maXJlX2hwZF9wdWxzZXMoaW50IGlkLCBpbnQgd2lkdGhfbXNlYywgaW50IGNvdW50 KTsKK3ZvaWQgY2hhbWVsaXVtX2FzeW5jX2hwZF9wdWxzZV9zdGFydChpbnQgaWQsIGJvb2wgaGln aCwgaW50IGRlbGF5X3NlY3MpOwordm9pZCBjaGFtZWxpdW1fYXN5bmNfaHBkX3B1bHNlX2Zpbmlz aCh2b2lkKTsKK2ludCBjaGFtZWxpdW1fbmV3X2VkaWQoY29uc3QgdW5zaWduZWQgY2hhciAqZWRp ZCk7Cit2b2lkIGNoYW1lbGl1bV9wb3J0X3NldF9lZGlkKGludCBpZCwgaW50IGVkaWRfaWQpOwor Ym9vbCBjaGFtZWxpdW1fcG9ydF9nZXRfZGRjX3N0YXRlKGludCBpZCk7Cit2b2lkIGNoYW1lbGl1 bV9wb3J0X3NldF9kZGNfc3RhdGUoaW50IGlkLCBib29sIGVuYWJsZWQpOwordm9pZCBjaGFtZWxp dW1fcG9ydF9nZXRfcmVzb2x1dGlvbihpbnQgaWQsIGludCAqeCwgaW50ICp5KTsKK2lndF9jcmNf dCAqY2hhbWVsaXVtX2dldF9jcmNfZm9yX2FyZWEoaW50IGlkLCBpbnQgeCwgaW50IHksIGludCB3 LCBpbnQgaCk7Cit2b2lkIGNoYW1lbGl1bV9zdGFydF9jYXB0dXJlKGludCBpZCwgaW50IHgsIGlu dCB5LCBpbnQgdywgaW50IGgpOwordm9pZCBjaGFtZWxpdW1fc3RvcF9jYXB0dXJlKGludCBmcmFt ZV9jb3VudCk7CitpZ3RfY3JjX3QgKmNoYW1lbGl1bV9yZWFkX2NhcHR1cmVkX2NyY3MoaW50ICpm cmFtZV9jb3VudCk7CitpbnQgY2hhbWVsaXVtX2dldF9mcmFtZV9saW1pdChpbnQgaWQsIGludCB3 LCBpbnQgaCk7CisKKyNlbmRpZiAvKiBJR1RfQ0hBTUVMSVVNX0ggKi8KZGlmZiAtLWdpdCBhL3Nj cmlwdHMvcnVuLXRlc3RzLnNoIGIvc2NyaXB0cy9ydW4tdGVzdHMuc2gKaW5kZXggOTdiYTllNS4u NjUzOWJmOSAxMDA3NTUKLS0tIGEvc2NyaXB0cy9ydW4tdGVzdHMuc2gKKysrIGIvc2NyaXB0cy9y dW4tdGVzdHMuc2gKQEAgLTEyMiwxMCArMTIyLDEwIEBAIGlmIFsgISAteCAiJFBJR0xJVCIgXTsg dGhlbgogZmkKIAogaWYgWyAieCRSRVNVTUUiICE9ICJ4IiBdOyB0aGVuCi0Jc3VkbyBJR1RfVEVT VF9ST09UPSIkSUdUX1RFU1RfUk9PVCIgIiRQSUdMSVQiIHJlc3VtZSAiJFJFU1VMVFMiICROT1JF VFJZCisJc3VkbyBJR1RfVEVTVF9ST09UPSIkSUdUX1RFU1RfUk9PVCIgQ0hBTUVMSVVNX0hPU1Q9 IiRDSEFNRUxJVU1fSE9TVCIgIiRQSUdMSVQiIHJlc3VtZSAiJFJFU1VMVFMiICROT1JFVFJZCiBl bHNlCiAJbWtkaXIgLXAgIiRSRVNVTFRTIgotCXN1ZG8gSUdUX1RFU1RfUk9PVD0iJElHVF9URVNU X1JPT1QiICIkUElHTElUIiBydW4gaWd0IC1vICIkUkVTVUxUUyIgLXMgJFZFUkJPU0UgJEVYQ0xV REUgJEZJTFRFUgorCXN1ZG8gSUdUX1RFU1RfUk9PVD0iJElHVF9URVNUX1JPT1QiIENIQU1FTElV TV9IT1NUPSIkQ0hBTUVMSVVNX0hPU1QiICIkUElHTElUIiBydW4gaWd0IC1vICIkUkVTVUxUUyIg LXMgJFZFUkJPU0UgJEVYQ0xVREUgJEZJTFRFUgogZmkKIAogaWYgWyAiJFNVTU1BUlkiID09ICJo dG1sIiBdOyB0aGVuCmRpZmYgLS1naXQgYS90ZXN0cy9NYWtlZmlsZS5hbSBiL3Rlc3RzL01ha2Vm aWxlLmFtCmluZGV4IGE0MDgxMjYuLjA2YThlNmIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL01ha2VmaWxl LmFtCisrKyBiL3Rlc3RzL01ha2VmaWxlLmFtCkBAIC02Myw3ICs2Myw3IEBAIEFNX0NGTEFHUyA9 ICQoRFJNX0NGTEFHUykgJChDV0FSTkZMQUdTKSAtV25vLXVudXNlZC1yZXN1bHQgJChERUJVR19D RkxBR1MpXAogCSQoTElCVU5XSU5EX0NGTEFHUykgJChXRVJST1JfQ0ZMQUdTKSBcCiAJJChOVUxM KQogCi1MREFERCA9IC4uL2xpYi9saWJpbnRlbF90b29scy5sYSAkKEdMSUJfTElCUykKK0xEQURE ID0gLi4vbGliL2xpYmludGVsX3Rvb2xzLmxhICQoR0xJQl9MSUJTKSAkKFhNTFJQQ19MSUJTKQog CiBBTV9DRkxBR1MgKz0gJChDQUlST19DRkxBR1MpICQoTElCVURFVl9DRkxBR1MpICQoR0xJQl9D RkxBR1MpCiBBTV9MREZMQUdTID0gLVdsLC0tYXMtbmVlZGVkCkBAIC0xMTksNSArMTE5LDggQEAg dmM0X3dhaXRfYm9fQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoRFJNX1ZDNF9DRkxBR1MpCiB2YzRf d2FpdF9ib19MREFERCA9ICQoTERBREQpICQoRFJNX1ZDNF9MSUJTKQogdmM0X3dhaXRfc2Vxbm9f Q0ZMQUdTID0gJChBTV9DRkxBR1MpICQoRFJNX1ZDNF9DRkxBR1MpCiB2YzRfd2FpdF9zZXFub19M REFERCA9ICQoTERBREQpICQoRFJNX1ZDNF9MSUJTKQorCitjaGFtZWxpdW1fQ0ZMQUdTID0gJChB TV9DRkxBR1MpICQoWE1MUlBDX0NGTEFHUykgJChVREVWX0NGTEFHUykKK2NoYW1lbGl1bV9MREFE RCA9ICQoTERBREQpICQoWE1MUlBDX0xJQlMpICQoVURFVl9MSUJTKQogZW5kaWYKIApkaWZmIC0t Z2l0IGEvdGVzdHMvTWFrZWZpbGUuc291cmNlcyBiL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMKaW5k ZXggNTdhMTBjNS4uNWVlYWU3NyAxMDA2NDQKLS0tIGEvdGVzdHMvTWFrZWZpbGUuc291cmNlcwor KysgYi90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCkBAIC0xMzUsOCArMTM1LDEzIEBAIFRFU1RTX3By b2dzX00gPSBcCiAJcHJpbWVfdmdlbSBcCiAJdGVtcGxhdGUgXAogCXZnZW1fYmFzaWMgXAotCXZn ZW1fc2xvdyBcCi0JJChOVUxMKQorCXZnZW1fc2xvdworCitpZiBIQVZFX0NIQU1FTElVTQorVEVT VFNfcHJvZ3NfTSArPSBjaGFtZWxpdW0KK2VuZGlmCisKK1RFU1RTX3Byb2dzX00gKz0gJChOVUxM KQogCiBURVNUU19wcm9nc19YTSA9IFwKICAgICBnZW1fY29uY3VycmVudF9hbGwgXApkaWZmIC0t Z2l0IGEvdGVzdHMvY2hhbWVsaXVtLmMgYi90ZXN0cy9jaGFtZWxpdW0uYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGY2NDVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMv Y2hhbWVsaXVtLmMKQEAgLTAsMCArMSw0MDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNiBS ZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9m IGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3 YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwK KyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGlu ZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnks IG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwg Y29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhl CisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxv d2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0 aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkg c2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBv ZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMg SVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVE LCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5U QUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZS SU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hU IEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJ QUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJX SVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBT T0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUu CisgKgorICogQXV0aG9yczoKKyAqICAgIEx5dWRlIFBhdWwgPGx5dWRlQHJlZGhhdC5jb20+Cisg Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImlndC5oIgorCisjaW5jbHVkZSA8 ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBk cm1fZmQ7Cit9IGRhdGFfdDsKKworI2RlZmluZSBIT1RQTFVHX1RJTUVPVVQgMjAgLyogc2Vjb25k cyAqLworCitzdGF0aWMgdm9pZAorcmVxdWlyZV9jb25uZWN0b3JfcHJlc2VudChkYXRhX3QgKmRh dGEsIHVuc2lnbmVkIGludCB0eXBlKQoreworCWludCBpOworCWJvb2wgZm91bmQgPSBmYWxzZTsK KworCWZvciAoaSA9IDA7IGkgPCBjaGFtZWxpdW1fcG9ydF9jb3VudCAmJiAhZm91bmQ7IGkrKykg eworCQlpZiAoY2hhbWVsaXVtX3BvcnRzW2ldLnR5cGUgPT0gdHlwZSkKKwkJCWZvdW5kID0gdHJ1 ZTsKKwl9CisKKwlpZ3RfcmVxdWlyZV9mKGZvdW5kLCAiTm8gcG9ydCBvZiB0eXBlICVzIHdhcyBm b3VuZFxuIiwKKwkJICAgICAga21zdGVzdF9jb25uZWN0b3JfdHlwZV9zdHIodHlwZSkpOworfQor CitzdGF0aWMgZHJtTW9kZUNvbm5lY3Rpb24KK3JlcHJvYmVfY29ubmVjdG9yKGRhdGFfdCAqZGF0 YSwgc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0KQoreworCWRybU1vZGVDb25uZWN0b3IgKmNv bm5lY3RvcjsKKwlkcm1Nb2RlQ29ubmVjdGlvbiBzdGF0dXM7CisKKwlpZ3RfZGVidWcoIlJlcHJv YmluZyAlcy4uLlxuIiwgcG9ydC0+Y29ubmVjdG9yX25hbWUpOworCWNvbm5lY3RvciA9IGRybU1v ZGVHZXRDb25uZWN0b3IoZGF0YS0+ZHJtX2ZkLCBwb3J0LT5jb25uZWN0b3JfaWQpOworCWlndF9h c3NlcnQoY29ubmVjdG9yKTsKKwlzdGF0dXMgPSBjb25uZWN0b3ItPmNvbm5lY3Rpb247CisKKwlk cm1Nb2RlRnJlZUNvbm5lY3Rvcihjb25uZWN0b3IpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0 YXRpYyB2b2lkCit3YWl0X2Zvcl9jb25uZWN0b3IoZGF0YV90ICpkYXRhLCBzdHJ1Y3QgY2hhbWVs aXVtX3BvcnQgKnBvcnQsCisJCSAgIGRybU1vZGVDb25uZWN0aW9uIHN0YXR1cykKK3sKKwlib29s IGZpbmlzaGVkID0gZmFsc2U7CisKKwlpZ3RfZGVidWcoIldhaXRpbmcgZm9yICVzIHRvICVzY29u bmVjdC4uLlxuIiwgcG9ydC0+Y29ubmVjdG9yX25hbWUsCisJCSAgc3RhdHVzID09IERSTV9NT0RF X0RJU0NPTk5FQ1RFRCA/ICJkaXMiIDogIiIpOworCisJLyoKKwkgKiBSZWx5IG9uIHNpbXBsZSBy ZXByb2Jpbmcgc28gd2UgZG9uJ3QgZmFpbCB0ZXN0cyB0aGF0IGRvbid0IHJlcXVpcmUKKwkgKiB0 aGF0IGhwZCBldmVudHMgd29yayBpbiB0aGUgZXZlbnQgdGhhdCBocGQgZG9lc24ndCB3b3JrIG9u IHRoZSBzeXN0ZW0KKwkgKi8KKwlpZ3RfdW50aWxfdGltZW91dChIT1RQTFVHX1RJTUVPVVQpIHsK KwkJaWYgKHJlcHJvYmVfY29ubmVjdG9yKGRhdGEsIHBvcnQpID09IHN0YXR1cykgeworCQkJZmlu aXNoZWQgPSB0cnVlOworCQkJcmV0dXJuOworCQl9CisKKwkJc2xlZXAoMSk7CisJfQorCisJaWd0 X2Fzc2VydChmaW5pc2hlZCk7Cit9CisKK3N0YXRpYyB2b2lkCityZXNldF9zdGF0ZShkYXRhX3Qg KmRhdGEsIHN0cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydCkKK3sKKwlpZ3RfcmVzZXRfY29ubmVj dG9ycygpOworCWNoYW1lbGl1bV9yZXNldCgpOworCXdhaXRfZm9yX2Nvbm5lY3RvcihkYXRhLCBw b3J0LCBEUk1fTU9ERV9ESVNDT05ORUNURUQpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9iYXNp Y19ob3RwbHVnKGRhdGFfdCAqZGF0YSwgc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0KQorewor CWludCBpOworCisJcmVzZXRfc3RhdGUoZGF0YSwgcG9ydCk7CisKKwlpZ3Rfd2F0Y2hfaG90cGx1 ZygpOworCisJZm9yIChpID0gMDsgaSA8IDE1OyBpKyspIHsKKwkJaWd0X2ZsdXNoX2hvdHBsdWdz KCk7CisKKwkJLyogQ2hlY2sgaWYgd2UgZ2V0IGEgc3lzZnMgaG90cGx1ZyBldmVudCAqLworCQlj aGFtZWxpdW1fcGx1Zyhwb3J0LT5pZCk7CisJCWlndF9hc3NlcnQoaWd0X2hvdHBsdWdfZGV0ZWN0 ZWQoSE9UUExVR19USU1FT1VUKSk7CisJCWlndF9hc3NlcnQocmVwcm9iZV9jb25uZWN0b3IoZGF0 YSwgcG9ydCkgPT0gRFJNX01PREVfQ09OTkVDVEVEKTsKKworCQlpZ3RfZmx1c2hfaG90cGx1Z3Mo KTsKKworCQkvKiBOb3cgY2hlY2sgaWYgd2UgZ2V0IGEgaG90cGx1ZyBmcm9tIGRpc2Nvbm5lY3Rp b24gKi8KKwkJY2hhbWVsaXVtX3VucGx1Zyhwb3J0LT5pZCk7CisJCWlndF9hc3NlcnQoaWd0X2hv dHBsdWdfZGV0ZWN0ZWQoSE9UUExVR19USU1FT1VUKSk7CisJCWlndF9hc3NlcnQocmVwcm9iZV9j b25uZWN0b3IoZGF0YSwgcG9ydCkgPT0KKwkJCSAgIERSTV9NT0RFX0RJU0NPTk5FQ1RFRCk7CisK KwkJLyogU2xlZXAgc28gd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IGNhdXNlIGFuIGhwZCBzdG9ybSAq LworCQlzbGVlcCgxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2VkaWRfcmVhZChkYXRh X3QgKmRhdGEsIHN0cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydCwKKwkgICAgICAgaW50IGVkaWRf aWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVkaWQpCit7CisJZHJtTW9kZVByb3BlcnR5QmxvYlB0 ciBlZGlkX2Jsb2IgPSBOVUxMOworCXVpbnQ2NF90IGVkaWRfYmxvYl9pZDsKKworCXJlc2V0X3N0 YXRlKGRhdGEsIHBvcnQpOworCisJY2hhbWVsaXVtX3BvcnRfc2V0X2VkaWQocG9ydC0+aWQsIGVk aWRfaWQpOworCWNoYW1lbGl1bV9wbHVnKHBvcnQtPmlkKTsKKwl3YWl0X2Zvcl9jb25uZWN0b3Io ZGF0YSwgcG9ydCwgRFJNX01PREVfQ09OTkVDVEVEKTsKKworCWlndF9hc3NlcnQoa21zdGVzdF9n ZXRfcHJvcGVydHkoZGF0YS0+ZHJtX2ZkLCBwb3J0LT5jb25uZWN0b3JfaWQsCisJCQkJCURSTV9N T0RFX09CSkVDVF9DT05ORUNUT1IsICJFRElEIiwgTlVMTCwKKwkJCQkJJmVkaWRfYmxvYl9pZCwg TlVMTCkpOworCWlndF9hc3NlcnQoZWRpZF9ibG9iID0gZHJtTW9kZUdldFByb3BlcnR5QmxvYihk YXRhLT5kcm1fZmQsCisJCQkJCQkgICAgICBlZGlkX2Jsb2JfaWQpKTsKKworCS8qIENvbXBhcmUg dGhlIEVESUQgZnJvbSB0aGUgY29ubmVjdG9yIHRvIHdoYXQgd2UgZXhwZWN0ICovCisJaWd0X2Fz c2VydChtZW1jbXAoZWRpZCwgZWRpZF9ibG9iLT5kYXRhLCBFRElEX0xFTkdUSCkgPT0gMCk7CisK Kwlkcm1Nb2RlRnJlZVByb3BlcnR5QmxvYihlZGlkX2Jsb2IpOworfQorCitzdGF0aWMgdm9pZAor dGVzdF9zdXNwZW5kX3Jlc3VtZV9ocGQoZGF0YV90ICpkYXRhLCBzdHJ1Y3QgY2hhbWVsaXVtX3Bv cnQgKnBvcnQsCisJCQllbnVtIGlndF9zdXNwZW5kX3N0YXRlIHN0YXRlLAorCQkJZW51bSBpZ3Rf c3VzcGVuZF90ZXN0IHRlc3QpCit7CisJaW50IGRlbGF5ID0gNzsKKworCWlndF9za2lwX3dpdGhv dXRfc3VzcGVuZF9zdXBwb3J0KHN0YXRlLCB0ZXN0KTsKKwlyZXNldF9zdGF0ZShkYXRhLCBwb3J0 KTsKKwlpZ3Rfd2F0Y2hfaG90cGx1ZygpOworCisJaWd0X3NldF9hdXRvcmVzdW1lX2RlbGF5KDE1 KTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBub3RpY2UgbmV3IGNvbm5lY3RvcnMgYWZ0ZXIgcmVzdW1p bmcgKi8KKwljaGFtZWxpdW1fYXN5bmNfaHBkX3B1bHNlX3N0YXJ0KHBvcnQtPmlkLCBmYWxzZSwg ZGVsYXkpOworCWlndF9zeXN0ZW1fc3VzcGVuZF9hdXRvcmVzdW1lKHN0YXRlLCB0ZXN0KTsKKwlj aGFtZWxpdW1fYXN5bmNfaHBkX3B1bHNlX2ZpbmlzaCgpOworCisJaWd0X2Fzc2VydChpZ3RfaG90 cGx1Z19kZXRlY3RlZChIT1RQTFVHX1RJTUVPVVQpKTsKKwlpZ3RfYXNzZXJ0KHJlcHJvYmVfY29u bmVjdG9yKGRhdGEsIHBvcnQpID09IERSTV9NT0RFX0NPTk5FQ1RFRCk7CisKKwlpZ3RfZmx1c2hf aG90cGx1Z3MoKTsKKworCS8qIE5vdyBtYWtlIHN1cmUgd2Ugbm90aWNlIGRpc2Nvbm5lY3RlZCBj b25uZWN0b3JzIGFmdGVyIHJlc3VtaW5nICovCisJY2hhbWVsaXVtX2FzeW5jX2hwZF9wdWxzZV9z dGFydChwb3J0LT5pZCwgdHJ1ZSwgZGVsYXkpOworCWlndF9zeXN0ZW1fc3VzcGVuZF9hdXRvcmVz dW1lKHN0YXRlLCB0ZXN0KTsKKwljaGFtZWxpdW1fYXN5bmNfaHBkX3B1bHNlX2ZpbmlzaCgpOwor CisJaWd0X2Fzc2VydChpZ3RfaG90cGx1Z19kZXRlY3RlZChIT1RQTFVHX1RJTUVPVVQpKTsKKwlp Z3RfYXNzZXJ0KHJlcHJvYmVfY29ubmVjdG9yKGRhdGEsIHBvcnQpID09IERSTV9NT0RFX0RJU0NP Tk5FQ1RFRCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N1c3BlbmRfcmVzdW1lX2VkaWRfY2hh bmdlKGRhdGFfdCAqZGF0YSwgc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0LAorCQkJCWVudW0g aWd0X3N1c3BlbmRfc3RhdGUgc3RhdGUsCisJCQkJZW51bSBpZ3Rfc3VzcGVuZF90ZXN0IHRlc3Qs CisJCQkJaW50IGVkaWRfaWQsCisJCQkJaW50IGFsdF9lZGlkX2lkKQoreworCWlndF9za2lwX3dp dGhvdXRfc3VzcGVuZF9zdXBwb3J0KHN0YXRlLCB0ZXN0KTsKKwlyZXNldF9zdGF0ZShkYXRhLCBw b3J0KTsKKwlpZ3Rfd2F0Y2hfaG90cGx1ZygpOworCisJLyogRmlyc3QgcGx1ZyBpbiB0aGUgcG9y dCAqLworCWNoYW1lbGl1bV9wb3J0X3NldF9lZGlkKHBvcnQtPmlkLCBlZGlkX2lkKTsKKwljaGFt ZWxpdW1fcGx1Zyhwb3J0LT5pZCk7CisJd2FpdF9mb3JfY29ubmVjdG9yKGRhdGEsIHBvcnQsIERS TV9NT0RFX0NPTk5FQ1RFRCk7CisKKwlpZ3RfZmx1c2hfaG90cGx1Z3MoKTsKKworCS8qCisJICog Q2hhbmdlIHRoZSBlZGlkIGJlZm9yZSB3ZSBzdXNwZW5kLiBPbiByZXN1bWUsIHRoZSBtYWNoaW5l IHNob3VsZAorCSAqIG5vdGljZSB0aGUgRURJRCBjaGFuZ2UgYW5kIGZpcmUgYSBob3RwbHVnIGV2 ZW50LgorCSAqLworCWNoYW1lbGl1bV9wb3J0X3NldF9lZGlkKHBvcnQtPmlkLCBhbHRfZWRpZF9p ZCk7CisKKwlpZ3Rfc3lzdGVtX3N1c3BlbmRfYXV0b3Jlc3VtZShzdGF0ZSwgdGVzdCk7CisJaWd0 X2Fzc2VydChpZ3RfaG90cGx1Z19kZXRlY3RlZChIT1RQTFVHX1RJTUVPVVQpKTsKK30KKworc3Rh dGljIHZvaWQKK3Rlc3RfZGlzcGxheShkYXRhX3QgKmRhdGEsIHN0cnVjdCBjaGFtZWxpdW1fcG9y dCAqcG9ydCkKK3sKKwlpZ3RfZGlzcGxheV90IGRpc3BsYXk7CisJaWd0X291dHB1dF90ICpvdXRw dXQ7CisJaWd0X3BsYW5lX3QgKnByaW1hcnk7CisJc3RydWN0IGlndF9mYiBmYjsKKwlkcm1Nb2Rl UmVzICpyZXM7CisJZHJtTW9kZU1vZGVJbmZvICptb2RlOworCWRybU1vZGVDb25uZWN0b3IgKmNv bm5lY3RvcjsKKwl1aW50MzJfdCBjcnRjX2lkOworCWludCBmYl9pZDsKKworCXJlc2V0X3N0YXRl KGRhdGEsIHBvcnQpOworCisJY2hhbWVsaXVtX3BsdWcocG9ydC0+aWQpOworCXdhaXRfZm9yX2Nv bm5lY3RvcihkYXRhLCBwb3J0LCBEUk1fTU9ERV9DT05ORUNURUQpOworCWlndF9hc3NlcnQocmVz ID0gZHJtTW9kZUdldFJlc291cmNlcyhkYXRhLT5kcm1fZmQpKTsKKwlrbXN0ZXN0X3Vuc2V0X2Fs bF9jcnRjcyhkYXRhLT5kcm1fZmQsIHJlcyk7CisKKwlpZ3RfZGlzcGxheV9pbml0KCZkaXNwbGF5 LCBkYXRhLT5kcm1fZmQpOworCisJLyogRmluZCB0aGUgb3V0cHV0IHN0cnVjdCBmb3IgdGhpcyBj b25uZWN0b3IgKi8KKwlmb3JfZWFjaF9jb25uZWN0ZWRfb3V0cHV0KCZkaXNwbGF5LCBvdXRwdXQp IHsKKwkJaWYgKG91dHB1dC0+Y29uZmlnLmNvbm5lY3Rvci0+Y29ubmVjdG9yX2lkID09CisJCSAg ICBwb3J0LT5jb25uZWN0b3JfaWQpCisJCQlicmVhazsKKwl9CisKKwljb25uZWN0b3IgPSBkcm1N b2RlR2V0Q29ubmVjdG9yQ3VycmVudChkYXRhLT5kcm1fZmQsCisJCQkJCSAgICAgICBwb3J0LT5j b25uZWN0b3JfaWQpOworCisJLyogRmluZCBhIHNwYXJlIENSVEMgdG8gdXNlIGZvciB0aGUgZGlz cGxheSAqLworCWNydGNfaWQgPSBrbXN0ZXN0X2ZpbmRfY3J0Y19mb3JfY29ubmVjdG9yKGRhdGEt PmRybV9mZCwgcmVzLCBjb25uZWN0b3IsCisJCQkJCQkgIDApOworCisJLyogU2V0dXAgdGhlIGRp c3BsYXkgKi8KKwlpZ3Rfb3V0cHV0X3NldF9waXBlKG91dHB1dCwga21zdGVzdF9nZXRfcGlwZV9m cm9tX2NydGNfaWQoZGF0YS0+ZHJtX2ZkLAorCQkJCQkJCQkgIGNydGNfaWQpKTsKKwltb2RlID0g aWd0X291dHB1dF9nZXRfbW9kZShvdXRwdXQpOworCXByaW1hcnkgPSBpZ3Rfb3V0cHV0X2dldF9w bGFuZShvdXRwdXQsIElHVF9QTEFORV9QUklNQVJZKTsKKwlpZ3RfYXNzZXJ0KHByaW1hcnkpOwor CisJZmJfaWQgPSBpZ3RfY3JlYXRlX3BhdHRlcm5fZmIoZGF0YS0+ZHJtX2ZkLAorCQkJCSAgICAg IG1vZGUtPmhkaXNwbGF5LAorCQkJCSAgICAgIG1vZGUtPnZkaXNwbGF5LAorCQkJCSAgICAgIERS TV9GT1JNQVRfWFJHQjg4ODgsCisJCQkJICAgICAgTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwK KwkJCQkgICAgICAmZmIpOworCWlndF9hc3NlcnQoZmJfaWQgPiAwKTsKKwlpZ3RfcGxhbmVfc2V0 X2ZiKHByaW1hcnksICZmYik7CisKKwlpZ3RfZGlzcGxheV9jb21taXQoJmRpc3BsYXkpOworCisJ aWd0X2Fzc2VydChjaGFtZWxpdW1fcG9ydF93YWl0X3ZpZGVvX2lucHV0X3N0YWJsZShwb3J0LT5p ZCwKKwkJCQkJCQkgIEhPVFBMVUdfVElNRU9VVCkpOworCisJZHJtTW9kZUZyZWVSZXNvdXJjZXMo cmVzKTsKKwlkcm1Nb2RlRnJlZUNvbm5lY3Rvcihjb25uZWN0b3IpOworCWlndF9kaXNwbGF5X2Zp bmkoJmRpc3BsYXkpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9ocGRfd2l0aG91dF9kZGMoZGF0 YV90ICpkYXRhLCBzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgKnBvcnQpCit7CisJcmVzZXRfc3RhdGUo ZGF0YSwgcG9ydCk7CisJaWd0X3dhdGNoX2hvdHBsdWcoKTsKKworCS8qIERpc2FibGUgdGhlIERE QyBvbiB0aGUgY29ubmVjdG9yIGFuZCBtYWtlIHN1cmUgd2Ugc3RpbGwgZ2V0IGEKKwkgKiBob3Rw bHVnCisJICovCisJY2hhbWVsaXVtX3BvcnRfc2V0X2RkY19zdGF0ZShwb3J0LT5pZCwgZmFsc2Up OworCWNoYW1lbGl1bV9wbHVnKHBvcnQtPmlkKTsKKworCWlndF9hc3NlcnQoaWd0X2hvdHBsdWdf ZGV0ZWN0ZWQoSE9UUExVR19USU1FT1VUKSk7CisJaWd0X2Fzc2VydChyZXByb2JlX2Nvbm5lY3Rv cihkYXRhLCBwb3J0KSA9PSBEUk1fTU9ERV9DT05ORUNURUQpOworfQorCisjZGVmaW5lIGZvcl9l YWNoX3BvcnQocCwgcG9ydCkgICAgICAgICAgICAgICAgICBcCisJZm9yIChwID0gMCwgcG9ydCA9 ICZjaGFtZWxpdW1fcG9ydHNbcF07IFwKKwkgICAgIHAgPCBjaGFtZWxpdW1fcG9ydF9jb3VudDsg ICAgICAgICAgXAorCSAgICAgcCsrLCBwb3J0ID0gJmNoYW1lbGl1bV9wb3J0c1twXSkgICBcCisK KyNkZWZpbmUgY29ubmVjdG9yX3N1YnRlc3QobmFtZV9fLCB0eXBlX18pIFwKKwlpZ3Rfc3VidGVz dChuYW1lX18pICAgICAgICAgICAgICAgXAorCQlmb3JfZWFjaF9wb3J0KHAsIHBvcnQpICAgIFwK KwkJCWlmIChwb3J0LT50eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl8gIyMgdHlwZV9fKQorCisj ZGVmaW5lIGRlZmluZV9jb21tb25fY29ubmVjdG9yX3Rlc3RzKHR5cGVfc3RyX18sIHR5cGVfXykg ICAgICAgICAgICAgICAgICAgICBcCisJY29ubmVjdG9yX3N1YnRlc3QodHlwZV9zdHJfXyAiLWhw ZCIsIHR5cGVfXykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJdGVzdF9iYXNpY19ob3Rw bHVnKCZkYXRhLCBwb3J0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCisJY29ubmVjdG9yX3N1YnRlc3QodHlwZV9zdHJfXyAiLWVkaWQtcmVh ZCIsIHR5cGVfXykgeyAgICAgICAgICAgICAgICAgIFwKKwkJdGVzdF9lZGlkX3JlYWQoJmRhdGEs IHBvcnQsIGVkaWRfaWQsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkgICAgICAgaWd0 X2ttc19nZXRfYmFzZV9lZGlkKCkpOyAgICAgICAgICAgICAgICAgICAgICBcCisJCXRlc3RfZWRp ZF9yZWFkKCZkYXRhLCBwb3J0LCBhbHRfZWRpZF9pZCwgICAgICAgICAgICAgICAgICAgICAgXAor CQkJICAgICAgIGlndF9rbXNfZ2V0X2FsdF9lZGlkKCkpOyAgICAgICAgICAgICAgICAgICAgICAg XAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJY29ubmVjdG9yX3N1 YnRlc3QodHlwZV9zdHJfXyAiLWhwZC1hZnRlci1zdXNwZW5kIiwgdHlwZV9fKSAgICAgICAgICAg IFwKKwkJdGVzdF9zdXNwZW5kX3Jlc3VtZV9ocGQoJmRhdGEsIHBvcnQsICAgICAgICAgICAgICAg ICAgICAgICAgICBcCisJCQkJCVNVU1BFTkRfU1RBVEVfTUVNLCAgICAgICAgICAgICAgICAgICAg XAorCQkJCQlTVVNQRU5EX1RFU1RfTk9ORSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKKwljb25uZWN0b3Jfc3VidGVzdCh0eXBlX3N0cl9fICItaHBkLWFmdGVy LWhpYmVybmF0ZSIsIHR5cGVfXykgICAgICAgICAgXAorCQl0ZXN0X3N1c3BlbmRfcmVzdW1lX2hw ZCgmZGF0YSwgcG9ydCwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJU1VTUEVORF9T VEFURV9ESVNLLCAgICAgICAgICAgICAgICAgICBcCisJCQkJCVNVU1BFTkRfVEVTVF9ERVZJQ0VT KTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWNvbm5lY3Rvcl9z dWJ0ZXN0KHR5cGVfc3RyX18gIi1lZGlkLWNoYW5nZS1kdXJpbmctc3VzcGVuZCIsIHR5cGVfXykg ICBcCisJCXRlc3Rfc3VzcGVuZF9yZXN1bWVfZWRpZF9jaGFuZ2UoJmRhdGEsIHBvcnQsICAgICAg ICAgICAgICAgICAgXAorCQkJCQkJU1VTUEVORF9TVEFURV9NRU0sICAgICAgICAgICAgXAorCQkJ CQkJU1VTUEVORF9URVNUX05PTkUsICAgICAgICAgICAgXAorCQkJCQkJZWRpZF9pZCwgYWx0X2Vk aWRfaWQpOyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWNvbm5lY3Rvcl9zdWJ0 ZXN0KHR5cGVfc3RyX18gIi1lZGlkLWNoYW5nZS1kdXJpbmctaGliZXJuYXRlIiwgdHlwZV9fKSBc CisJCXRlc3Rfc3VzcGVuZF9yZXN1bWVfZWRpZF9jaGFuZ2UoJmRhdGEsIHBvcnQsICAgICAgICAg ICAgICAgICAgXAorCQkJCQkJU1VTUEVORF9TVEFURV9ESVNLLCAgICAgICAgICAgXAorCQkJCQkJ U1VTUEVORF9URVNUX0RFVklDRVMsICAgICAgICAgXAorCQkJCQkJZWRpZF9pZCwgYWx0X2VkaWRf aWQpOyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWNvbm5lY3Rvcl9zdWJ0ZXN0 KHR5cGVfc3RyX18gIi1kaXNwbGF5IiwgdHlwZV9fKSAgICAgICAgICAgICAgICAgICAgICBcCisJ CXRlc3RfZGlzcGxheSgmZGF0YSwgcG9ydCk7CisKK3N0YXRpYyBkYXRhX3QgZGF0YTsKKworaWd0 X21haW4KK3sKKwlzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgKnBvcnQ7CisJaW50IGVkaWRfaWQsIGFs dF9lZGlkX2lkLCBwOworCisJaWd0X2ZpeHR1cmUgeworCQlpZ3Rfc2tpcF9vbl9zaW11bGF0aW9u KCk7CisKKwkJZGF0YS5kcm1fZmQgPSBkcm1fb3Blbl9kcml2ZXJfbWFzdGVyKERSSVZFUl9BTlkp OworCisJCWNoYW1lbGl1bV9pbml0KGRhdGEuZHJtX2ZkKTsKKworCQllZGlkX2lkID0gY2hhbWVs aXVtX25ld19lZGlkKGlndF9rbXNfZ2V0X2Jhc2VfZWRpZCgpKTsKKwkJYWx0X2VkaWRfaWQgPSBj aGFtZWxpdW1fbmV3X2VkaWQoaWd0X2ttc19nZXRfYWx0X2VkaWQoKSk7CisKKwkJLyogU28gZmJj b24gZG9lc24ndCB0cnkgdG8gcmVwcm9iZSB0aGluZ3MgaXRzZWxmICovCisJCWttc3Rlc3Rfc2V0 X3Z0X2dyYXBoaWNzX21vZGUoKTsKKwl9CisKKwlpZ3Rfc3VidGVzdF9ncm91cCB7CisJCWlndF9m aXh0dXJlIHsKKwkJCXJlcXVpcmVfY29ubmVjdG9yX3ByZXNlbnQoCisJCQkgICAgJmRhdGEsIERS TV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydCk7CisJCX0KKworCQlkZWZpbmVfY29tbW9uX2Nv bm5lY3Rvcl90ZXN0cygiZHAiLCBEaXNwbGF5UG9ydCk7CisJfQorCisJaWd0X3N1YnRlc3RfZ3Jv dXAgeworCQlpZ3RfZml4dHVyZSB7CisJCQlyZXF1aXJlX2Nvbm5lY3Rvcl9wcmVzZW50KAorCQkJ ICAgICZkYXRhLCBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUEpOworCQl9CisKKwkJZGVmaW5lX2Nv bW1vbl9jb25uZWN0b3JfdGVzdHMoImhkbWkiLCBIRE1JQSk7CisJfQorCisJaWd0X3N1YnRlc3Rf Z3JvdXAgeworCQlpZ3RfZml4dHVyZSB7CisJCQlyZXF1aXJlX2Nvbm5lY3Rvcl9wcmVzZW50KAor CQkJICAgICZkYXRhLCBEUk1fTU9ERV9DT05ORUNUT1JfVkdBKTsKKwkJfQorCisJCWNvbm5lY3Rv cl9zdWJ0ZXN0KCJ2Z2EtaHBkIiwgVkdBKQorCQkJdGVzdF9iYXNpY19ob3RwbHVnKCZkYXRhLCBw b3J0KTsKKworCQljb25uZWN0b3Jfc3VidGVzdCgidmdhLWVkaWQtcmVhZCIsIFZHQSkgeworCQkJ dGVzdF9lZGlkX3JlYWQoJmRhdGEsIHBvcnQsIGVkaWRfaWQsCisJCQkJICAgICAgIGlndF9rbXNf Z2V0X2Jhc2VfZWRpZCgpKTsKKwkJCXRlc3RfZWRpZF9yZWFkKCZkYXRhLCBwb3J0LCBhbHRfZWRp ZF9pZCwKKwkJCQkgICAgICAgaWd0X2ttc19nZXRfYWx0X2VkaWQoKSk7CisJCX0KKworCQkvKiBG SVhNRTogUmlnaHQgbm93IHRoZXJlIGlzbid0IGEgd2F5IHRvIGRvIGFueSBzb3J0IG9mIGRlbGF5 ZWQKKwkJICogcHN1ZWRvLWhvdHBsdWcgd2l0aCBWR0EsIHNvIHRlc3RpbmcgZGV0ZWN0aW9uIGFm dGVyIGEKKwkJICogc3VzcGVuZC9yZXN1bWUgY3ljbGUgaXNuJ3QgcG9zc2libGUgeWV0CisJCSAq LworCisJCWNvbm5lY3Rvcl9zdWJ0ZXN0KCJ2Z2EtaHBkLXdpdGhvdXQtZGRjIiwgVkdBKQorCQkJ dGVzdF9ocGRfd2l0aG91dF9kZGMoJmRhdGEsIHBvcnQpOworCisJCWNvbm5lY3Rvcl9zdWJ0ZXN0 KCJ2Z2EtZGlzcGxheSIsIFZHQSkKKwkJCXRlc3RfZGlzcGxheSgmZGF0YSwgcG9ydCk7CisJfQor fQotLSAKMi45LjMKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9y ZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdm eAo=