From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 18FC9CD6E49 for ; Sat, 30 May 2026 14:36:53 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 82B04112875; Sat, 30 May 2026 14:36:52 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="WQRAnw2H"; dkim-atps=neutral Received: from sea.source.kernel.org (sea.source.kernel.org [172.234.252.31]) by gabe.freedesktop.org (Postfix) with ESMTPS id 67A67112875 for ; Sat, 30 May 2026 14:36:51 +0000 (UTC) Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id 48ED443421; Sat, 30 May 2026 14:36:51 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C9A6A1F00893; Sat, 30 May 2026 14:36:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1780151811; bh=qkuj8OhFHXyqgQPKbUxCfeYfitjkYWllEG/4ZUUkFOw=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=WQRAnw2HQgIsqSKDXzcLZipXjK0V/obgzPs8erOmYqRkteeJMMIMVLevcaiekpCv3 JYcZiBX1bKv+H6/WBk/DAa1JzsM6cooRBBFIOukcAEdhLiSodttKIivVh6zObyN7h0 Di73YjxOmnxdTWuS6I2qhvk6BHNzD/O1HBtEyMWdDYmthznlLGCliIbJ8GQqpluycE /tEBC7frXxcf3yNJ8krBoAzRRNdo689R0Df5D1ANvgBvodffkW0gvuTRg3b0EYkO0/ eVrTk5IAQiSviR/Y5RUu6i+3cNzz2NQZXI1QDo8/3jZkOdaP+SuM3GpkevlsPXoKUd eGF4oNtXyvsHg== From: Philipp Stanner To: Miguel Ojeda , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Sumit Semwal , =?UTF-8?q?Christian=20K=C3=B6nig?= , Philipp Stanner , "Paul E. McKenney" , Frederic Weisbecker , Neeraj Upadhyay , Joel Fernandes , Josh Triplett , Uladzislau Rezki , Steven Rostedt , Mathieu Desnoyers , Lai Jiangshan , Zqiang , Daniel Almeida , Greg Kroah-Hartman , Igor Korotin , Lorenzo Stoakes , Alexandre Courbot , FUJITA Tomonori , Krishna Ketan Rai , Shankari Anand , manos@pitsidianak.is, Boris Brezillon Cc: linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org, rcu@vger.kernel.org Subject: [PATCH 3/4] rust: Add dma_fence abstractions Date: Sat, 30 May 2026 16:35:11 +0200 Message-ID: <20260530143541.229628-5-phasta@kernel.org> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530143541.229628-2-phasta@kernel.org> References: <20260530143541.229628-2-phasta@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" QydzIGRtYV9mZW5jZSdzIGFyZSBzeW5jaHJvbmlzYXRpb24gcHJpbWl0aXZlcyB0aGF0IHdpbGwg YmUgbmVlZGVkIGJ5IGFsbApSdXN0IEdQVSBkcml2ZXJzLgoKVGhlIGRtYV9mZW5jZSBmcmFtZXdv cmsgc2V0cyBhIG51bWJlciBvZiBydWxlcywgbm90YWJseToKICAtIGZlbmNlcyBtdXN0IG9ubHkg YmUgc2lnbmFsbGVkIG9uY2UKICAtIGFsbCBmZW5jZXMgbXVzdCBiZSBzaWduYWxsZWQgYXQgc29t ZSBwb2ludAogIC0gZmVuY2UgZXJyb3IgY29kZXMgbXVzdCBvbmx5IGJlIHNldCBiZWZvcmUgc2ln bmFsbGluZwogIC0gZXZlcnkgcG9pbnRlciB0byBhIGZlbmNlIG11c3QgYmUgYmFja2VkIGJ5IGEg cmVmZXJlbmNlCgpBbGwgdGhvc2UgcnVsZXMgYXJlIGJlaW5nIGFkZHJlc3NlZCBieSB0aGVzZSBh YnN0cmFjdGlvbnMuCgpUbyBjbGVhbmx5IGRlY291cGxlIGZlbmNlIGlzc3VlcnMgYW5kIGNvbnN1 bWVycywgdHdvIHR5cGVzIGFyZSBwcm92aWRlZDoKICAtIERyaXZlckZlbmNlOiB0aGUgb25seSBm ZW5jZSB0eXBlIHRoYXQgY2FuIGJlIHNpZ25hbGxlZCBhbmQgdGhhdAogICAgY2FycmllcyBkcml2 ZXItc3BlY2lmaWMgZGF0YS4KICAtIEZlbmNlOiB0aGUgZmVuY2UgdHlwZSB0byBiZSBzaGFyZWQg d2l0aCBvdGhlciBkcml2ZXJzIGFuZCAvIG9yCiAgICB1c2Vyc3BhY2UuIFRoZSBvbmx5IHR5cGUg Y2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkIG9uLgogICAgQ2Fubm90IGJlIHNpZ25hbGxlZC4K CkhlcmVieSwgYSBGZW5jZSBsaXZlcyBpbiB0aGUgc2FtZSBjaHVuayBvZiBtZW1vcnkgYXMgYSBE cml2ZXJGZW5jZS4gQm90aApzaGFyZSB0aGUgcmVmY291bnQgb2YgdGhlIHVuZGVybHlpbmcgQyBk bWFfZmVuY2UuIFNpbmNlIHRoaXMKaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcHJvdmlkZSBhIGN1 c3RvbSBkbWFfZmVuY2VfYmFja2VuZF9vcHMucmVsZWFzZSgpCmZ1bmN0aW9uLCB0aGUgbWVtb3J5 IGlzIGZyZWVkIGJ5IHRoZSBkbWFfZmVuY2UgYmFja2VuZCBvbmNlIHRoZSByZWZjb3VudApkcm9w cyB0byAwLgoKVG8gY3JlYXRlIGEgRHJpdmVyRmVuY2UsIHRoZSB1c2VyIG11c3QgZmlyc3QgYWxs b2NhdGUgYQpEcml2ZXJGZW5jZUFsbG9jYXRpb24sIHNvIHRoYXQgdGhlIGNyZWF0aW9uIG9mIHRo ZSBEcml2ZXJGZW5jZSBsYXRlciBvbgpjYW4gYWx3YXlzIHN1Y2NlZWQuIE90aGVyd2lzZSwgZGVh ZGxvY2tzIGNvdWxkIG9jY3VyIGlmIGZlbmNlcyBuZWVkIHRvCmJlIGNyZWF0ZWQgaW4gYSBHUFUg am9iIHN1Ym1pc3Npb24gcGF0aC4KClN5bmNocm9uaXphdGlvbiBpcyBlbnN1cmVkIGJ5IHRoZSBk bWFfZmVuY2UgYmFja2VuZC4KCkFsbCBEcml2ZXJGZW5jZSdzIGNyZWF0ZWQgdGhyb3VnaCB0aGlz IGFic3RyYWN0aW9uIG11c3QgYmUgc2lnbmFsbGVkIGJ5CnRoZSBjcmVhdG9yIHdpdGggYW4gZXJy b3IgY29kZS4gSW4gY2FzZSBhIERyaXZlckZlbmNlIGRyb3BzIHdpdGhvdXQKYmVpbmcgc2lnbmFs bGVkIGJlZm9yZWhhbmQsIGl0IGlzIHNpZ25hbGxlZCB3aXRoIC1FQ0FOQ0VMTEVEIGFzIGl0cwpl cnJvciBhbmQgYSB3YXJuaW5nIGlzIHByaW50ZWQuIFRoaXMgYWxsb3dzIHRoZSBSdXN0IGFic3Ry YWN0aW9uIHRvIHZlcnkKY2xlYW5seSBkZWNvdXBsZSBmZW5jZSBpc3N1ZXIgYW5kIGNvbnN1bWVy IGJ5IHJlbHlpbmcgb24gdGhlIGRlY291cGxpbmcKbWVjaGFuaXNtcyBpbiB0aGUgQyBiYWNrZW5k LCB3aGljaCBlbnN1cmVzIHRocm91Z2ggUkNVIGFuZCB0aGUKJ3NpZ25hbGxlZCcgZmVuY2UtZmxh ZyB0aGF0IGRtYV9mZW5jZV9iYWNrZW5kX29wcyBmdW5jdGlvbnMgY2Fubm90CmFjY2VzcyB0aGUg cG90ZW50aWFsbHkgdW5sb2FkZWQgZHJpdmVyIGNvZGUgYW55bW9yZS4KClNpZ25hbGxpbmcgZmVu Y2VzIG9uIGRyb3AgdGh1cyBncmFudHMgbWFueSBhZHZhbnRhZ2VzLiBOb3Qgc2lnbmFsbGluZwpm ZW5jZXMgb24gZHJvcCB3b3VsZCByaXNrIGRlYWRsb2NrIGFuZCBkb2VzIG5vdCBncmFudCByZWFs IGFkdmFudGFnZXM6CkJ5IGRlZmluaXRpb24gb25seSB0aGUgZHJpdmVycyBjYW4gZW5zdXJlIHRo YXQgYSBmZW5jZSBhbHdheXMgcmVwcmVzZW50cwp0aGUgaGFyZHdhcmUncyBzdGF0ZSBjb3JyZWN0 bHkuCgpUaGlzIGltcGxlbWVudGF0aW9uIG1vZGVscyBhIERtYUZlbmNlQ3R4IChmZW5jZSBjb250 ZXh0KSBvYmplY3Qgb24gd2hpY2gKZmVuY2VzIGFyZSB0byBiZSBjcmVhdGVkLCB0aGVyZWJ5IGVu c3VyaW5nIGNvcnJlY3Qgc2VxdWVuY2UgbnVtYmVyaW5nCmFjY29yZGluZyB0byB0aGUgdGltZWxp bmUuCgpkbWFfZmVuY2Ugc3VwcG9ydHMgYSB2YXJpZXR5IG9mIGNhbGxiYWNrcy4gVGhlIG1hbmRh dG9yeSBjYWxsYmFja3MKKGdldF90aW1lbGluZV9uYW1lKCkgYW5kIGdldF9kcml2ZXJfbmFtZSgp KSBhcmUgaW1wbGVtZW50ZWQgaW4gdGhpcwpwYXRjaC4gRm9yIGNvbnZlbmllbmNlLCB0aGV5IHN0 b3JlIHRob3NlIG5hbWUgcGFyYW1ldGVycyBpbiB0aGUgZmVuY2UKY29udGV4dCwgc2F2aW5nIHRo ZSBkcml2ZXIgZnJvbSBpbXBsZW1lbnRpbmcgdGhlc2UgdHdvIGNhbGxiYWNrcy4KClN1cHBvcnQg Zm9yIG90aGVyIGNhbGxiYWNrcyAobGlrZSBmb3IgaGFyZHdhcmUgc2lnbmFsbGluZykgaXMgcHJl cGFyZWQKZm9yIHRocm91Z2ggdGhlIGZhY3QgdGhhdCBib3RoIERyaXZlckZlbmNlIGFuZCBGZW5j ZSBsaXZlIGluIHRoZSBzYW1lCmFsbG9jYXRpb24sIGFsbG93aW5nIGZvciB1c2FnZSBvZiBjb250 YWluZXJfb2YgZnJvbSB0aGUgY2FsbGJhY2sgdG8KYWNjZXNzIHRoZSBkcml2ZXItc3BlY2lmaWMg ZGF0YS4KClN5bmNocm9uaXphdGlvbiBmb3IgYmFja2VuZF9vcHMgY2FsbGJhY2tzIGlzIGVuc3Vy ZWQgdGhyb3VnaCBSQ1Ugd2hpY2gKcHJldmVudHMgVUFGLWJ1Z3Mgc2hvdWxkIGEgRHJpdmVyRmVu Y2UgZHJvcCB3aGlsZSBhIEZlbmNlIGNhbGxiYWNrCmlzIGN1cnJlbnRseSBvcGVyYXRpbmcgb24g dGhlIGFzc29jaWF0ZWQgZHJpdmVyIGRhdGEuCgpBZGQgYWJzdHJhY3Rpb25zIGZvciBkbWFfZmVu Y2UgaW4gUnVzdC4KClNpZ25lZC1vZmYtYnk6IFBoaWxpcHAgU3Rhbm5lciA8cGhhc3RhQGtlcm5l bC5vcmc+Ci0tLQogcnVzdC9iaW5kaW5ncy9iaW5kaW5nc19oZWxwZXIuaCAgfCAgIDEgKwogcnVz dC9oZWxwZXJzL2RtYV9mZW5jZS5jICAgICAgICAgfCAgNDggKysKIHJ1c3QvaGVscGVycy9oZWxw ZXJzLmMgICAgICAgICAgIHwgICAxICsKIHJ1c3Qva2VybmVsL2RtYV9idWYvZG1hX2ZlbmNlLnJz IHwgODIxICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIHJ1c3Qva2VybmVsL2RtYV9i dWYvbW9kLnJzICAgICAgIHwgIDEzICsKIHJ1c3Qva2VybmVsL2xpYi5ycyAgICAgICAgICAgICAg IHwgICAxICsKIDYgZmlsZXMgY2hhbmdlZCwgODg1IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBydXN0L2hlbHBlcnMvZG1hX2ZlbmNlLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0 L2tlcm5lbC9kbWFfYnVmL2RtYV9mZW5jZS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2Vy bmVsL2RtYV9idWYvbW9kLnJzCgpkaWZmIC0tZ2l0IGEvcnVzdC9iaW5kaW5ncy9iaW5kaW5nc19o ZWxwZXIuaCBiL3J1c3QvYmluZGluZ3MvYmluZGluZ3NfaGVscGVyLmgKaW5kZXggMjAxMTY0NWM3 Y2ZiLi42OWRhZWI3OTBmNzcgMTAwNjQ0Ci0tLSBhL3J1c3QvYmluZGluZ3MvYmluZGluZ3NfaGVs cGVyLmgKKysrIGIvcnVzdC9iaW5kaW5ncy9iaW5kaW5nc19oZWxwZXIuaApAQCAtNTIsNiArNTIs NyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2Uv ZmF1eC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1kaXJlY3Rpb24uaD4KKyNpbmNsdWRlIDxsaW51 eC9kbWEtZmVuY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUg PGxpbnV4L2RtYS1yZXN2Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybmFtZS5oPgpkaWZmIC0tZ2l0 IGEvcnVzdC9oZWxwZXJzL2RtYV9mZW5jZS5jIGIvcnVzdC9oZWxwZXJzL2RtYV9mZW5jZS5jCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uNjI0NGE1YTYxMDM4Ci0tLSAv ZGV2L251bGwKKysrIGIvcnVzdC9oZWxwZXJzL2RtYV9mZW5jZS5jCkBAIC0wLDAgKzEsNDggQEAK Ky8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisKKyNpbmNsdWRlIDxsaW51eC9k bWEtZmVuY2UuaD4KKworX19ydXN0X2hlbHBlciB2b2lkIHJ1c3RfaGVscGVyX2RtYV9mZW5jZV9n ZXQoc3RydWN0IGRtYV9mZW5jZSAqZikKK3sKKwlkbWFfZmVuY2VfZ2V0KGYpOworfQorCitfX3J1 c3RfaGVscGVyIHZvaWQgcnVzdF9oZWxwZXJfZG1hX2ZlbmNlX3B1dChzdHJ1Y3QgZG1hX2ZlbmNl ICpmKQoreworCWRtYV9mZW5jZV9wdXQoZik7Cit9CisKK19fcnVzdF9oZWxwZXIgYm9vbCBydXN0 X2hlbHBlcl9kbWFfZmVuY2VfYmVnaW5fc2lnbmFsbGluZyh2b2lkKQoreworCXJldHVybiBkbWFf ZmVuY2VfYmVnaW5fc2lnbmFsbGluZygpOworfQorCitfX3J1c3RfaGVscGVyIHZvaWQgcnVzdF9o ZWxwZXJfZG1hX2ZlbmNlX2VuZF9zaWduYWxsaW5nKGJvb2wgY29va2llKQoreworCWRtYV9mZW5j ZV9lbmRfc2lnbmFsbGluZyhjb29raWUpOworfQorCitfX3J1c3RfaGVscGVyIGJvb2wgcnVzdF9o ZWxwZXJfZG1hX2ZlbmNlX2lzX3NpZ25hbGVkKHN0cnVjdCBkbWFfZmVuY2UgKmYpCit7CisJcmV0 dXJuIGRtYV9mZW5jZV9pc19zaWduYWxlZChmKTsKK30KKworX19ydXN0X2hlbHBlciBib29sIHJ1 c3RfaGVscGVyX2RtYV9mZW5jZV9pc19zaWduYWxlZF9sb2NrZWQoc3RydWN0IGRtYV9mZW5jZSAq ZikKK3sKKwlyZXR1cm4gZG1hX2ZlbmNlX2lzX3NpZ25hbGVkX2xvY2tlZChmKTsKK30KKworX19y dXN0X2hlbHBlciB2b2lkIHJ1c3RfaGVscGVyX2RtYV9mZW5jZV9sb2NrX2lycXNhdmUoc3RydWN0 IGRtYV9mZW5jZSAqZiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJZG1hX2ZlbmNlX2xvY2tf aXJxc2F2ZShmLCAqZmxhZ3MpOworfQorCitfX3J1c3RfaGVscGVyIHZvaWQgcnVzdF9oZWxwZXJf ZG1hX2ZlbmNlX3VubG9ja19pcnFyZXN0b3JlKHN0cnVjdCBkbWFfZmVuY2UgKmYsIHVuc2lnbmVk IGxvbmcgKmZsYWdzKQoreworCWRtYV9mZW5jZV91bmxvY2tfaXJxcmVzdG9yZShmLCAqZmxhZ3Mp OworfQorCitfX3J1c3RfaGVscGVyIHZvaWQgcnVzdF9oZWxwZXJfZG1hX2ZlbmNlX3NldF9lcnJv cihzdHJ1Y3QgZG1hX2ZlbmNlICpmLCBpbnQgZXJyb3IpCit7CisJZG1hX2ZlbmNlX3NldF9lcnJv cihmLCBlcnJvcik7Cit9CmRpZmYgLS1naXQgYS9ydXN0L2hlbHBlcnMvaGVscGVycy5jIGIvcnVz dC9oZWxwZXJzL2hlbHBlcnMuYwppbmRleCA2MjU5MjFlMjdkZmIuLmQ5MTE0ZDBiM2M4ZiAxMDA2 NDQKLS0tIGEvcnVzdC9oZWxwZXJzL2hlbHBlcnMuYworKysgYi9ydXN0L2hlbHBlcnMvaGVscGVy cy5jCkBAIC01Nyw2ICs1Nyw3IEBACiAjaW5jbHVkZSAiY3JlZC5jIgogI2luY2x1ZGUgImRldmlj ZS5jIgogI2luY2x1ZGUgImRtYS5jIgorI2luY2x1ZGUgImRtYV9mZW5jZS5jIgogI2luY2x1ZGUg ImRtYS1yZXN2LmMiCiAjaW5jbHVkZSAiZHJtLmMiCiAjaW5jbHVkZSAiZXJyLmMiCmRpZmYgLS1n aXQgYS9ydXN0L2tlcm5lbC9kbWFfYnVmL2RtYV9mZW5jZS5ycyBiL3J1c3Qva2VybmVsL2RtYV9i dWYvZG1hX2ZlbmNlLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4u N2RjMWY1YzE2YjAyCi0tLSAvZGV2L251bGwKKysrIGIvcnVzdC9rZXJuZWwvZG1hX2J1Zi9kbWFf ZmVuY2UucnMKQEAgLTAsMCArMSw4MjEgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDI1LCAyMDI2IFJlZCBIYXQgSW5jLjoKKy8v ICAgLSBQaGlsaXBwIFN0YW5uZXIgPHBzdGFubmVyQHJlZGhhdC5jb20+CisKKy8vISBEcml2ZXJG ZW5jZSBzdXBwb3J0LgorLy8hCisvLyEgUmVmZXJlbmNlOiA8aHR0cHM6Ly9kb2NzLmtlcm5lbC5v cmcvZHJpdmVyLWFwaS9kbWEtYnVmLmh0bWwjYy5kbWFfZmVuY2U+CisvLyEKKy8vISBDIGhlYWRl cjogW2BpbmNsdWRlL2xpbnV4L2RtYS1mZW5jZS5oYF0oc3JjdHJlZS9pbmNsdWRlL2xpbnV4L2Rt YS1mZW5jZS5oKQorCit1c2UgY3JhdGU6OnsKKyAgICBhbGxvYzo6QWxsb2NFcnJvciwKKyAgICBi aW5kaW5ncywKKyAgICBjb250YWluZXJfb2YsCisgICAgZXJyb3I6OnRvX3Jlc3VsdCwKKyAgICBw cmVsdWRlOjoqLAorICAgIHN5bmM6OnJjdTo6UmN1Qm94LAorICAgIHR5cGVzOjpGb3JlaWduT3du YWJsZSwKKyAgICB0eXBlczo6T3BhcXVlLAorICAgIHdhcm5fb24sIC8vCit9OworCit1c2UgcGlu X2luaXQ6OnBpbl9pbml0X2Zyb21fY2xvc3VyZTsKKwordXNlIGNvcmU6OnsKKyAgICBtYXJrZXI6 OlBoYW50b21EYXRhLCAvLworICAgIG9wczo6RGVyZWYsCisgICAgcHRyLAorICAgIHB0cjo6ewor ICAgICAgICBkcm9wX2luX3BsYWNlLAorICAgICAgICBOb25OdWxsLCAvLworICAgIH0sCisgICAg c3luYzo6YXRvbWljOjp7CisgICAgICAgIEF0b21pY1U2NCwKKyAgICAgICAgT3JkZXJpbmcsIC8v CisgICAgfSwKK307CisKK3VzZSBiaW5kaW5nczo6RUNBTkNFTEVEOworCit1c2Uga2VybmVsOjpz dHI6OkNTdHJpbmc7Cit1c2Uga2VybmVsOjpzeW5jOjp7CisgICAgYXJlZjo6eworICAgICAgICBB UmVmLAorICAgICAgICBBbHdheXNSZWZDb3VudGVkLCAvLworICAgIH0sCisgICAgQXJjLAorICAg IEFyY0JvcnJvdywgLy8KK307CisKKy8vLyBWVGFibGUgZm9yIGRtYV9mZW5jZSBiYWNrZW5kX29w cyBjYWxsYmFja3MuCisvLworLy8gTWFuZGF0b3J5IGRtYV9mZW5jZSBiYWNrZW5kX29wcyBhcmUg aW1wbGVtZW50ZWQgaW1wbGljaXRseSB0aHJvdWdoCisvLyBbYEZlbmNlQ3R4YF0uIEFkZGl0aW9u YWwgb25lcyBzaGFsbCBnZXQgaW1wbGVtZW50ZWQgb24gdGhpcyB0cmFpdCwgd2hpY2ggdGhlbgor Ly8gc2hhbGwgYmUgZGVtYW5kZWQgZm9yIHRoZSBmZW5jZSBjb250ZXh0IGRhdGEuCitwdWIgdHJh aXQgRmVuY2VDdHhPcHMge30KKworLy8vIEEgZG1hLWZlbmNlIGNvbnRleHQuIEEgZmVuY2UgY29u dGV4dCB0YWtlcyBjYXJlIG9mIGFzc29jaWF0aW5nIHJlbGF0ZWQgZmVuY2VzIHdpdGggZWFjaCBv dGhlciwKKy8vLyBwcm92aWRpbmcgZWFjaCB3aXRoIHJhaXNpbmcgc2VxdWVuY2UgbnVtYmVycyBh bmQgYSBjb21tb24gaWRlbnRpZmllci4KKyNbcGluX2RhdGEoUGlubmVkRHJvcCldCitwdWIgc3Ry dWN0IEZlbmNlQ3R4PEY6IFNlbmQgKyBTeW5jLCBDOiBTZW5kICsgU3luYz4geworICAgIC8vLyBU aGUgZmVuY2UgY29udGV4dCBudW1iZXIuCisgICAgbnI6IHU2NCwKKyAgICAvLy8gVGhlIHNlcXVl bmNlIG51bWJlciBmb3IgdGhlIG5leHQgZmVuY2UgY3JlYXRlZC4KKyAgICBzZXFubzogQXRvbWlj VTY0LAorICAgIC8vIFRoZSBuYW1lIHBhcmFtZXRlcnMgbGl2ZSBpbiBSY3VCb3ggYmVjYXVzZSB0 aGV5IGNhbiBiZSBhY2Nlc3NlZCBieSB0aGUKKyAgICAvLyBkbWFfZmVuY2UgYmFja2VuZF9vcHMu IFRob3NlIGFjY2Vzc2VzIGFyZSBndWFyZGVkIGJ5IHRoZSByY3VfcmVhZF9sb2NrKCksCisgICAg Ly8gc28gZHJvcHBpbmcgdGhlbSBtdXN0IGJlIGRlbGF5ZWQgYnkgYSBncmFjZSBwZXJpb2QuCisg ICAgLy8vIFRoZSBuYW1lIG9mIHRoZSBkcml2ZXIgdGhpcyBGZW5jZUN0eCdzIGZlbmNlcyBiZWxv bmcgdG8uCisgICAgZHJpdmVyX25hbWU6IENTdHJpbmcsCisgICAgLy8vIFRoZSBuYW1lIG9mIHRo ZSB0aW1lbGluZSB0aGlzIEZlbmNlQ3R4J3MgZmVuY2VzIGJlbG9uZyB0by4KKyAgICB0aW1lbGlu ZV9uYW1lOiBDU3RyaW5nLAorICAgICNbcGluXQorICAgIGRhdGE6IEMsCisgICAgZmVuY2VfdHlw ZTogUGhhbnRvbURhdGE8Rj4sCit9CisKKyNbYWxsb3codW51c2VkX3Vuc2FmZSldCitpbXBsPEY6 IFNlbmQgKyBTeW5jICsgRHJpdmVyRmVuY2VBbGxvd2VkRGF0YSwgQzogU2VuZCArIFN5bmM+IEZl bmNlQ3R4PEYsIEM+IHsKKyAgICAvLyBUaGlzIGNhbiBsYXRlciBiZSBleHRlbmRlZCBhcyBhIHZ0 YWJsZSBpbiBjYXNlIG90aGVyIHBhcnRpZXMgbmVlZCBzdXBwb3J0CisgICAgLy8gZm9yIHRoZSBt b3JlICJleG90aWMiIGNhbGxiYWNrcy4KKyAgICBjb25zdCBPUFM6IGJpbmRpbmdzOjpkbWFfZmVu Y2Vfb3BzID0gYmluZGluZ3M6OmRtYV9mZW5jZV9vcHMgeworICAgICAgICBnZXRfZHJpdmVyX25h bWU6IFNvbWUoU2VsZjo6Z2V0X2RyaXZlcl9uYW1lKSwKKyAgICAgICAgZ2V0X3RpbWVsaW5lX25h bWU6IFNvbWUoU2VsZjo6Z2V0X3RpbWVsaW5lX25hbWUpLAorICAgICAgICBlbmFibGVfc2lnbmFs aW5nOiBOb25lLAorICAgICAgICBzaWduYWxlZDogTm9uZSwKKyAgICAgICAgd2FpdDogTm9uZSwK KyAgICAgICAgcmVsZWFzZTogTm9uZSwKKyAgICAgICAgc2V0X2RlYWRsaW5lOiBOb25lLAorICAg IH07CisKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGBGZW5jZUN0eGAuCisgICAgcHViIGZuIG5ldygK KyAgICAgICAgZHJpdmVyX25hbWU6IENTdHJpbmcsCisgICAgICAgIHRpbWVsaW5lX25hbWU6IENT dHJpbmcsCisgICAgICAgIGRhdGE6IGltcGwgUGluSW5pdDxDPiwKKyAgICApIC0+IFJlc3VsdDxB cmM8U2VsZj4+IHsKKyAgICAgICAgbGV0IGN0eCA9IHBpbl9pbml0IShTZWxmIHsKKyAgICAgICAg ICAgIC8vIFNBRkVUWTogYGRtYV9mZW5jZV9jb250ZXh0X2FsbG9jKClgIG1lcmVseSB3b3JrcyBv biBhIGdsb2JhbCBhdG9taWMuIFBhcmFtZXRlciBgMWAKKyAgICAgICAgICAgIC8vIGlzIHRoZSBu dW1iZXIgb2YgY29udGV4dHMgd2Ugd2FudCB0byBhbGxvY2F0ZS4KKyAgICAgICAgICAgIG5yOiB1 bnNhZmUgeyBiaW5kaW5nczo6ZG1hX2ZlbmNlX2NvbnRleHRfYWxsb2MoMSkgfSwKKyAgICAgICAg ICAgIHNlcW5vOiBBdG9taWNVNjQ6Om5ldygwKSwKKyAgICAgICAgICAgIGRyaXZlcl9uYW1lLAor ICAgICAgICAgICAgdGltZWxpbmVfbmFtZSwKKyAgICAgICAgICAgIGRhdGEgPC0gZGF0YSwKKyAg ICAgICAgICAgIGZlbmNlX3R5cGU6IFBoYW50b21EYXRhLAorICAgICAgICB9KTsKKworICAgICAg ICBBcmM6OnBpbl9pbml0KGN0eCwgR0ZQX0tFUk5FTCkKKyAgICB9CisKKyAgICBmbiBnZXRfbmV4 dF9mZW5jZV9zZXFubygmc2VsZikgLT4gdTY0IHsKKyAgICAgICAgc2VsZi5zZXFuby5mZXRjaF9h ZGQoMSwgT3JkZXJpbmc6OlJlbGF4ZWQpCisgICAgfQorCisgICAgLy8vIEFsbG9jYXRlIHRoZSBt ZW1vcnkgZm9yIGEgW2BEcml2ZXJGZW5jZWBdIGFuZCBhbHJlYWR5IHN0b3JlIGBkYXRhYCBpbnNp ZGUuCisgICAgLy8vCisgICAgLy8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgbWFueSB0aW1lcywg Y3JlYXRpb24gb2YgYSBbYERyaXZlckZlbmNlYF0gbXVzdCBub3QKKyAgICAvLy8gZmFpbCwgYW5k IGFsbG9jYXRpbmcgbWlnaHQgZGVhZGxvY2sgaW4gc29tZSBzaXR1YXRpb25zLgorICAgIC8vLwor ICAgIC8vLyBUaGUgYGRhdGFgIHlvdSBwYXNzIGhlcmUgbXVzdCBub3QgcGVyZm9ybSBhbnkgb3Bl cmF0aW9ucyB0aGF0IGFyZSBpbGxlZ2FsCisgICAgLy8vIGluIGF0b21pYyBjb250ZXh0IGluIGl0 cyBbYERyb3BgXSBpbXBsZW1lbnRhdGlvbi4KKyAgICBwdWIgZm4gbmV3X2ZlbmNlX2FsbG9jYXRp b24oCisgICAgICAgIHNlbGY6IEFyY0JvcnJvdzwnXywgU2VsZj4sCisgICAgICAgIGRhdGE6IEYs CisgICAgKSAtPiBSZXN1bHQ8RHJpdmVyRmVuY2VBbGxvY2F0aW9uPEYsIEM+PiB7CisgICAgICAg IGxldCBmY3R4ID0gQXJjOjo8U2VsZj46OmZyb20oc2VsZik7CisKKyAgICAgICAgRHJpdmVyRmVu Y2VBbGxvY2F0aW9uOjpuZXcoZmN0eCwgZGF0YSkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlIGEg bmV3IGZlbmNlLCBjb25zdW1pbmcgYGRhdGFgLgorICAgIC8vLworICAgIC8vLyBUaGUgZmVuY2Ug d2lsbCBpbmNyZW1lbnQgdGhlIHJlZmNvdW50IG9mIHRoZSBmZW5jZSBjb250ZXh0IGFzc29jaWF0 ZWQgd2l0aCB0aGlzCisgICAgLy8vIFtgRmVuY2VDdHhgXS4KKyAgICBwdWIgZm4gbmV3X2ZlbmNl KCZzZWxmLCBtZW1vcnk6IERyaXZlckZlbmNlQWxsb2NhdGlvbjxGLCBDPikgLT4gRHJpdmVyRmVu Y2U8RiwgQz4geworICAgICAgICBsZXQgc2Vxbm86IHU2NCA9IHNlbGYuZ2V0X25leHRfZmVuY2Vf c2Vxbm8oKTsKKworICAgICAgICAvLyBXZSBmZWVkIHRoZSBDIGRtYV9mZW5jZSBiYWNrZW5kIGEg TlVMTCBmb3IgdGhlIHNwaW5sb2NrIHNvIHRoYXQgaXQKKyAgICAgICAgLy8gdXNlcyBwZXItZmVu Y2UgbG9ja3MgYXV0b21hdGljYWxseS4KKyAgICAgICAgbGV0IG51bGxfcHRyOiAqbXV0IGJpbmRp bmdzOjpzcGlubG9jayA9IHB0cjo6bnVsbF9tdXQoKTsKKyAgICAgICAgbGV0IGZlbmNlX3B0ciA9 IG1lbW9yeS5hc19yYXcoKTsKKyAgICAgICAgLy8gU0FGRVRZOiBgZmVuY2VfcHRyYCBoYXMgYmVl biBjcmVhdGVkIGRpcmVjdGx5IGFib3ZlLiBJdCB3aWxsIGxpdmUKKyAgICAgICAgLy8gYXQgbGVh c3QgYXMgbG9uZyBhcyBgU2VsZmAuIFRoZSBzYW1lIGFwcGxpZXMgdG8gYCZTZWxmOjpPUFNgLgor ICAgICAgICB1bnNhZmUgeyBiaW5kaW5nczo6ZG1hX2ZlbmNlX2luaXQoZmVuY2VfcHRyLCAmU2Vs Zjo6T1BTLCBudWxsX3B0ciwgc2VsZi5uciwgc2Vxbm8pIH07CisKKyAgICAgICAgLy8gQSBgRHJp dmVyRmVuY2VBbGxvY2F0aW9uYCdzIHB1cnBvc2UgaXMgdG8gY2FycnkgYWxsb2NhdGVkIG1lbW9y eSwgc28gdGhhdAorICAgICAgICAvLyBgRHJpdmVyRmVuY2VgcyBjYW4gYWx3YXlzIGJlIGNyZWF0 ZWQgd2l0aG91dCBhbGxvY2F0aW5nLiBJbiB0aGlzCisgICAgICAgIC8vIG1ldGhvZCwgb3duZXJz aGlwIG92ZXIgdGhhdCBtZW1vcnkgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIG5ldworICAgICAgICAv LyBgRHJpdmVyRmVuY2VgIGFuZCBtYW5hZ2VkIHRocm91Z2ggcmVmY291bnRpbmcuIFRoZSBDIGRt YV9mZW5jZQorICAgICAgICAvLyBiYWNrZW5kIHdpbGwgdWx0aW1hdGVseSBmcmVlIHRoZSBtZW1v cnkgb25jZSB0aGUgcmVmY291bnQgcmVhY2hlcyAwLgorICAgICAgICBsZXQgcHRyID0gS0JveDo6 aW50b19yYXcobWVtb3J5LmRhdGEpOworICAgICAgICAvLyBTQUZFVFk6IGBwdHJgIHdhcyBqdXN0 IGNyZWF0ZWQgdmFsaWRseSBkaXJlY3RseSBhYm92ZS4KKyAgICAgICAgbGV0IHB0ciA9IHVuc2Fm ZSB7IE5vbk51bGw6Om5ld191bmNoZWNrZWQocHRyKSB9OworCisgICAgICAgIERyaXZlckZlbmNl IHsgZGF0YTogcHRyIH0KKyAgICB9CisKKyAgICBleHRlcm4gIkMiIGZuIGdldF9kcml2ZXJfbmFt ZShwdHI6ICptdXQgYmluZGluZ3M6OmRtYV9mZW5jZSkgLT4gKmNvbnN0IGNfY2hhciB7CisgICAg ICAgIC8vIFNBRkVUWTogVGhlIEMgYmFja2VuZCBvbmx5IGludm9rZXMgdGhpcyBjYWxsYmFjayB3 aXRoIGBwdHJgIHBvaW50aW5nCisgICAgICAgIC8vIHRvIGEgdmFsaWQsIHVuc2lnbmFsZWQgYGJp bmRpbmdzOjpkbWFfZmVuY2VgLiBBbGwgZmVuY2VzIGNyZWF0ZWQKKyAgICAgICAgLy8gaW4gdGhp cyBtb2R1bGUgYWx3YXlzIHJlc2lkZSB3aXRoaW4gYEZlbmNlYCB3aGljaCBhbHdheXMgcmVzaWRl cyBpbgorICAgICAgICAvLyBhIGBEcml2ZXJGZW5jZURhdGFgLCB0aHVzIHNhdGlzZnlpbmcgdGhl IGZ1bmN0aW9uJ3Mgc2FmZXR5IHJlcXVpcmVtZW50cy4KKyAgICAgICAgbGV0IGZjdHggPSB1bnNh ZmUgeyBTZWxmOjpmcm9tX3Jhd19mZW5jZShwdHIpIH07CisKKyAgICAgICAgZmN0eC5kcml2ZXJf bmFtZS5hc19jaGFyX3B0cigpCisgICAgfQorCisgICAgZXh0ZXJuICJDIiBmbiBnZXRfdGltZWxp bmVfbmFtZShwdHI6ICptdXQgYmluZGluZ3M6OmRtYV9mZW5jZSkgLT4gKmNvbnN0IGNfY2hhciB7 CisgICAgICAgIC8vIFNBRkVUWTogVGhlIEMgYmFja2VuZCBvbmx5IGludm9rZXMgdGhpcyBjYWxs YmFjayB3aXRoIGBwdHJgIHBvaW50aW5nCisgICAgICAgIC8vIHRvIGEgdmFsaWQsIHVuc2lnbmFs ZWQgYGJpbmRpbmdzOjpkbWFfZmVuY2VgLiBBbGwgZmVuY2VzIGNyZWF0ZWQKKyAgICAgICAgLy8g aW4gdGhpcyBtb2R1bGUgYWx3YXlzIHJlc2lkZSB3aXRoaW4gYEZlbmNlYCB3aGljaCBhbHdheXMg cmVzaWRlcyBpbgorICAgICAgICAvLyBhIGBEcml2ZXJGZW5jZURhdGFgLCB0aHVzIHNhdGlzZnlp bmcgdGhlIGZ1bmN0aW9uJ3Mgc2FmZXR5IHJlcXVpcmVtZW50cy4KKyAgICAgICAgbGV0IGZjdHgg PSB1bnNhZmUgeyBTZWxmOjpmcm9tX3Jhd19mZW5jZShwdHIpIH07CisKKyAgICAgICAgZmN0eC50 aW1lbGluZV9uYW1lLmFzX2NoYXJfcHRyKCkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlIGEgW2BG ZW5jZUN0eGBdIGZyb20gYW4gYXNzb2NpYXRlZCBbYGJpbmRpbmdzOjpkbWFfZmVuY2VgXS4KKyAg ICAvLy8KKyAgICAvLy8gIyBTYWZldHkKKyAgICAvLy8KKyAgICAvLy8gYHB0cmAgbXVzdCBiZSBh IHZhbGlkIHBvaW50ZXIgdG8gYSBkbWFfZmVuY2Ugd2hpY2ggcmVzaWRlcyB3aXRoaW4gYSBbYEZl bmNlYF0sCisgICAgLy8vIHdoaWNoIGluIHR1cm4gcmVzaWRlcyBpbiBhIFtgRHJpdmVyRmVuY2VE YXRhYF0uCisgICAgdW5zYWZlIGZuIGZyb21fcmF3X2ZlbmNlPCdhPihwdHI6ICptdXQgYmluZGlu Z3M6OmRtYV9mZW5jZSkgLT4gJidhIFNlbGYgeworICAgICAgICBsZXQgb3BhcXVlX2ZlbmNlID0g T3BhcXVlOjpjYXN0X2Zyb20ocHRyKTsKKworICAgICAgICAvLyBTQUZFVFk6IFNhZmUgZHVlIHRv IHRoZSBmdW5jdGlvbidzIG92ZXJhbGwgc2FmZXR5IHJlcXVpcmVtZW50cy4KKyAgICAgICAgbGV0 IGZlbmNlX3B0ciA9IHVuc2FmZSB7IGNvbnRhaW5lcl9vZiEob3BhcXVlX2ZlbmNlLCBGZW5jZSwg aW5uZXIpIH07CisKKyAgICAgICAgLy8gRHJpdmVyRmVuY2VEYXRhIGlzIHJlcHIoQykgYW5kIGEg RmVuY2UgaXMgaXRzIGZpcnN0IG1lbWJlci4KKyAgICAgICAgbGV0IGZlbmNlX2RhdGFfcHRyID0g ZmVuY2VfcHRyIGFzICptdXQgRHJpdmVyRmVuY2VEYXRhPEYsIEM+OworCisgICAgICAgIC8vIFNB RkVUWTogU2FmZSBiZWNhdXNlIG9mIHRoZSBzYWZldHkgY29tbWVudCBkaXJlY3RseSBhYm92ZS4K KyAgICAgICAgbGV0IGZlbmNlX2RhdGEgPSB1bnNhZmUgeyAmKmZlbmNlX2RhdGFfcHRyIH07CisK KyAgICAgICAgJmZlbmNlX2RhdGEuZmN0eAorICAgIH0KK30KKworLy8gRmVuY2VDdHgncyBkcm9w KCkgZW5zdXJlcyB0aGF0IHRoZSBkcml2ZXIgY2Fubm90IHVubG9hZCB3aGlsZSB0aGVyZSBhcmUg c3RpbGwKKy8vIGRtYV9mZW5jZSBjYWxsYmFja3MgcnVubmluZy4gVGhpcyBhbHNvIHByZXZlbnRz IFVBRiBwcm9ibGVtcyB3aXRoIGZjdHguZHJpdmVyX25hbWUKKy8vIGFuZCBmY3R4LnRpbWVsaW5l X25hbWUuCisvLworLy8gRHJpdmVyRmVuY2UgZGF0YSBnZXRzIGRyb3BwZWQgdGhyb3VnaCBjYWxs X3JjdSgpIGluIERyaXZlckZlbmNlOjpkcm9wLgorLy8gVGhpcyBgcmN1X2JhcnJpZXIoKWAgYWxz byBzZXJ2ZXMgdG8gd2FpdCBmb3IgdGhlaXIgY29tcGxldGlvbi4KKyNbcGlubmVkX2Ryb3BdCitp bXBsPEY6IFNlbmQgKyBTeW5jLCBDOiBTZW5kICsgU3luYz4gUGlubmVkRHJvcCBmb3IgRmVuY2VD dHg8RiwgQz4geworICAgIGZuIGRyb3Aoc2VsZjogUGluPCZtdXQgU2VsZj4pIHsKKyAgICAgICAg Ly8gU0FGRVRZOiBgcmN1X2JhcnJpZXIoKWAgaXMgYWx3YXlzIHNhZmUgdG8gYmUgY2FsbGVkLgor ICAgICAgICB1bnNhZmUgeyBiaW5kaW5nczo6cmN1X2JhcnJpZXIoKSB9OworICAgIH0KK30KKwor Ly8vIEVycm9yIHR5cGUgZm9yIGZlbmNlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbi4KKy8vLworLy8v IEdlbmVyaWMgb3ZlciBgVGAgc28gdGhhdCBgQWxyZWFkeVNpZ25hbGVkYCBjYW4gcmV0dXJuIHRo ZSBjYWxsYmFjayB0byB0aGUKKy8vLyBjYWxsZXIsIGFsbG93aW5nIGl0IHRvIHJlY2xhaW0gYW55 IHJlc291cmNlcyBvd25lZCBieSB0aGUgY2FsbGJhY2sgKGUuZy4sCisvLy8gYSBmZW5jZSBoYW5k bGUgdGhhdCBuZWVkcyB0byBiZSBzaWduYWxlZCkuCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgZW51 bSBDYWxsYmFja0Vycm9yPFQgPSAoKT4geworICAgIC8vLyBUaGUgZmVuY2Ugd2FzIGFscmVhZHkg c2lnbmFsZWQuIFRoZSBjYWxsYmFjayBpcyByZXR1cm5lZCBzbyB0aGUgY2FsbGVyCisgICAgLy8v IGNhbiBleHRyYWN0IG93bmVkIHJlc291cmNlcyB3aXRob3V0IGxvc2luZyB0aGVtLgorICAgIEFs cmVhZHlTaWduYWxlZChUKSwKKyAgICAvLy8gU29tZSBvdGhlciBlcnJvciBvY2N1cnJlZCBkdXJp bmcgcmVnaXN0cmF0aW9uLgorICAgIE90aGVyKEVycm9yKSwKK30KKworaW1wbDxUPiBGcm9tPENh bGxiYWNrRXJyb3I8VD4+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShlcnI6IENhbGxiYWNrRXJy b3I8VD4pIC0+IFNlbGYgeworICAgICAgICBtYXRjaCBlcnIgeworICAgICAgICAgICAgQ2FsbGJh Y2tFcnJvcjo6QWxyZWFkeVNpZ25hbGVkKF8pID0+IEVOT0VOVCwKKyAgICAgICAgICAgIENhbGxi YWNrRXJyb3I6Ok90aGVyKGUpID0+IGUsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8VD4g RnJvbTxBbGxvY0Vycm9yPiBmb3IgQ2FsbGJhY2tFcnJvcjxUPiB7CisgICAgZm4gZnJvbShlOiBB bGxvY0Vycm9yKSAtPiBTZWxmIHsKKyAgICAgICAgQ2FsbGJhY2tFcnJvcjo6T3RoZXIoRXJyb3I6 OmZyb20oZSkpCisgICAgfQorfQorCisvLy8gVHJhaXQgZm9yIGNhbGxiYWNrcyB0aGF0IGNhbiBi ZSByZWdpc3RlcmVkIG9uIGZlbmNlcy4KKy8vLworLy8vIFdoZW4gdGhlIGZlbmNlIHNpZ25hbHMs IHRoZSBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQuCisvLy8KKy8vLyAjIEV4YW1wbGUKKy8vLwor Ly8vIGBgYHJ1c3QKKy8vLyB1c2Uga2VybmVsOjpkbWFfYnVmOjpGZW5jZUNiOworLy8vCisvLy8g c3RydWN0IE15Q2FsbGJhY2sgeworLy8vICAgICAvLyBZb3VyIGNhbGxiYWNrIHN0YXRlIGhlcmUK Ky8vLyB9CisvLy8KKy8vLyBpbXBsIEZlbmNlQ2IgZm9yIE15Q2FsbGJhY2sgeworLy8vICAgICBm biBjYWxsZWQoJm11dCBzZWxmKSB7CisvLy8gICAgICAgICBwcl9pbmZvISgiRmVuY2Ugc2lnbmFs ZWQhIik7CisvLy8gICAgICAgICAvLyBIYW5kbGUgZmVuY2UgY29tcGxldGlvbgorLy8vICAgICB9 CisvLy8gfQorLy8vIGBgYAorcHViIHRyYWl0IEZlbmNlQ2I6IFNlbmQgKyAnc3RhdGljIHsKKyAg ICAvLy8gQ2FsbGVkIHdoZW4gdGhlIGZlbmNlIGlzIHNpZ25hbGVkLgorICAgIC8vLworICAgIC8v LyBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBmZW5jZSBzaWduYWxpbmcgcGF0aCwgd2hpY2ggbWF5 IGJlIGluIGludGVycnVwdAorICAgIC8vLyBjb250ZXh0IG9yIHdpdGggbG9ja3MgaGVsZCwgd2hp Y2ggaXMgd2h5IGBzZWxmYCBpcyBvbmx5IGJvcnJvd2VkLCBzbyB0aGF0CisgICAgLy8vIGl0IGNh bm5vdCBkcm9wLiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBub3Qgc2xlZXAgb3IgcGVyZm9ybQorICAg IC8vLyBsb25nLXJ1bm5pbmcgb3BlcmF0aW9ucy4KKyAgICAvLy8KKyAgICAvLy8gQW4gaW1wbGVt ZW50YXRpb24gbGlrZWx5IHdhbnRzIHRvIGluZm9ybSBpdHNlbGYgKGUuZy4sIHRocm91Z2ggYSB3 b3JrIGl0ZW0pCisgICAgLy8vIHdpdGhpbiB0aGlzIGNhbGxiYWNrIHRoYXQgdGhlIGFzc29jaWF0 ZWQgW2BGZW5jZUNiUmVnaXN0cmF0aW9uYF0gY2FuIG5vdyBiZQorICAgIC8vLyBkcm9wcGVkLgor ICAgIGZuIGNhbGxlZCgmbXV0IHNlbGYpOworfQorCisvLy8gQSBjYWxsYmFjayByZWdpc3RyYXRp b24gb24gYSBmZW5jZS4KKy8vLworLy8vIFdoZW4gdGhpcyBvYmplY3QgaXMgZHJvcHBlZCwgdGhl IGNhbGxiYWNrIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBpZiBpdAorLy8vIGhhc24ndCBiZWVu IGNhbGxlZCB5ZXQuCisvLy8KKy8vLyAjIEludmFyaWFudHMKKy8vLworLy8vIElmIGBjYWxsYmFj a2AgaXMgYFNvbWVgLCB0aGVuIGBjYmAgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBmZW5jZSBhbmQg dGhlCisvLy8gY2FsbGJhY2sgaGFzbid0IGJlZW4gaW52b2tlZCB5ZXQuIElmIGBOb25lYCwgdGhl IGNhbGxiYWNrIGhhcyBiZWVuIGludm9rZWQKKy8vLyBvciB0aGUgZmVuY2Ugd2FzIGFscmVhZHkg c2lnbmFsZWQgd2hlbiB3ZSB0cmllZCB0byByZWdpc3Rlci4KKyNbcGluX2RhdGEoUGlubmVkRHJv cCldCitwdWIgc3RydWN0IEZlbmNlQ2JSZWdpc3RyYXRpb248VDogRmVuY2VDYiArICdzdGF0aWM+ IHsKKyAgICAjW3Bpbl0KKyAgICBjYjogT3BhcXVlPGJpbmRpbmdzOjpkbWFfZmVuY2VfY2I+LAor ICAgIGNhbGxiYWNrOiBULAorICAgIGZlbmNlOiBBUmVmPEZlbmNlPiwKK30KKworaW1wbDxUOiBG ZW5jZUNiPiBGZW5jZUNiUmVnaXN0cmF0aW9uPFQ+IHsKKyAgICAvLy8gUmVnaXN0ZXIgYSBjYWxs YmFjayBvbiBhIGZlbmNlLgorICAgIC8vLworICAgIC8vLyBPbiBzdWNjZXNzIHRoZSBjYWxsYmFj ayBpcyBwaW5uZWQgaW4gcGxhY2UgYW5kIHdpbGwgZmlyZSB3aGVuIHRoZSBmZW5jZQorICAgIC8v LyBzaWduYWxzLiBPbiBgQWxyZWFkeVNpZ25hbGVkYCB0aGUgY2FsbGJhY2sgaXMgcmV0dXJuZWQg dG8gdGhlIGNhbGxlciBzbworICAgIC8vLyB0aGF0IG93bmVkIHJlc291cmNlcyBjYW4gYmUgcmVj bGFpbWVkLgorICAgIHB1YiBmbiBuZXc8J2E+KGZlbmNlOiAmJ2EgRmVuY2UsIGNhbGxiYWNrOiBU KSAtPiBpbXBsIFBpbkluaXQ8U2VsZiwgQ2FsbGJhY2tFcnJvcjxUPj4gKyAnYQorICAgIHdoZXJl CisgICAgICAgIFQ6ICdhLAorICAgIHsKKyAgICAgICAgLy8gVXNlcyBgcGluX2luaXRfZnJvbV9j bG9zdXJlYCBpbnN0ZWFkIG9mIGB0cnlfcGluX2luaXQhYCBzbyB0aGF0IG9uCisgICAgICAgIC8v IGAtRU5PRU5UYCAoYWxyZWFkeSBzaWduYWxlZCkgdGhlIGNhbGxiYWNrIGNhbiBiZSByZWFkIGJh Y2sgZnJvbSB0aGUKKyAgICAgICAgLy8gcGFydGlhbGx5LWluaXRpYWxpemVkIHNsb3QgYW5kIHJl dHVybmVkIHRocm91Z2ggdGhlIGVycm9yLgorICAgICAgICAvLworICAgICAgICAvLyBTQUZFVFk6 IGBwaW5faW5pdF9mcm9tX2Nsb3N1cmVgIHJlcXVpcmVzOgorICAgICAgICAvLyAtIE9uIGBPaygo KSlgOiB0aGUgc2xvdCBpcyBmdWxseSBpbml0aWFsaXplZCBhbmQgdmFsaWQgZm9yIGBEcm9wYC4K KyAgICAgICAgLy8gLSBPbiBgRXJyKF8pYDogdGhlIHNsb3QgaXMgY2xlYW4sIGkuZS46IG5vIHBh cnRpYWxseS1pbml0aWFsaXplZCBmaWVsZHMKKyAgICAgICAgLy8gICByZW1haW4sIGFuZCB0aGUg c2xvdCBjYW4gYmUgZGVhbGxvY2F0ZWQgd2l0aG91dCBkcm9wcGluZy4KKyAgICAgICAgLy8KKyAg ICAgICAgLy8gV2UgdXBob2xkIHRoaXMgYXMgZm9sbG93czoKKyAgICAgICAgLy8gLSBPbiBzdWNj ZXNzOiBhbGwgdGhyZWUgZmllbGRzIGFyZSBpbml0aWFsaXplZC4gT2soKCkpIGlzIHJldHVybmVk LgorICAgICAgICAvLyAtIE9uIEVOT0VOVCAoYWxyZWFkeSBzaWduYWxlZCk6IGBjYWxsYmFja2Ag YW5kIGBmZW5jZWAgYXJlIHJlYWQgYmFjaworICAgICAgICAvLyAgIGZyb20gdGhlIHNsb3Qgdmlh IGBwdHI6OnJlYWRgLCBsZWF2aW5nIHRoZSBzbG90IGNsZWFuLiBgY2JgIHdhcworICAgICAgICAv LyAgIGluaXRpYWxpemVkIGJ5IGBkbWFfZmVuY2VfYWRkX2NhbGxiYWNrYCAoaXQgY2FsbHMKKyAg ICAgICAgLy8gICBgSU5JVF9MSVNUX0hFQUQoJmNiLT5ub2RlKWAgZXZlbiBvbiBlcnJvciksIGJ1 dCBgY2JgIGlzCisgICAgICAgIC8vICAgYE9wYXF1ZTxkbWFfZmVuY2VfY2I+YCB3aGljaCBoYXMg bm8gYERyb3BgLCBzbyBub3QgZHJvcHBpbmcgaXQgaXMKKyAgICAgICAgLy8gICBmaW5lLiBUaGUg Y2FsbGJhY2sgaXMgcmV0dXJuZWQgdGhyb3VnaCBgQWxyZWFkeVNpZ25hbGVkKFQpYC4KKyAgICAg ICAgLy8gLSBPbiBvdGhlciBlcnJvcnM6IHNhbWUgY2xlYW51cCBhcyBFTk9FTlQsIGVycm9yIHJl dHVybmVkIGFzCisgICAgICAgIC8vICAgYE90aGVyKGUpYC4KKyAgICAgICAgdW5zYWZlIHsKKyAg ICAgICAgICAgIHBpbl9pbml0X2Zyb21fY2xvc3VyZShtb3ZlIHxzbG90OiAqbXV0IFNlbGZ8IHsK KyAgICAgICAgICAgICAgICBsZXQgc2xvdF9jYWxsYmFjayA9ICZyYXcgbXV0ICgqc2xvdCkuY2Fs bGJhY2s7CisgICAgICAgICAgICAgICAgbGV0IHNsb3RfZmVuY2UgPSAmcmF3IG11dCAoKnNsb3Qp LmZlbmNlOworICAgICAgICAgICAgICAgIGxldCBzbG90X2NiID0gJnJhdyBtdXQgKCpzbG90KS5j YjsKKworICAgICAgICAgICAgICAgIC8vIFdyaXRlIGNhbGxiYWNrIGFuZCBmZW5jZSBmaXJzdCDi gJQgbXVzdCBiZSB2aXNpYmxlIGJlZm9yZQorICAgICAgICAgICAgICAgIC8vIGRtYV9mZW5jZV9h ZGRfY2FsbGJhY2sgbWFrZXMgdGhlIHJlZ2lzdHJhdGlvbiBsaXZlLgorICAgICAgICAgICAgICAg IGNvcmU6OnB0cjo6d3JpdGUoc2xvdF9jYWxsYmFjaywgY2FsbGJhY2spOworICAgICAgICAgICAg ICAgIGNvcmU6OnB0cjo6d3JpdGUoc2xvdF9mZW5jZSwgQVJlZjo6ZnJvbShmZW5jZSkpOworCisg ICAgICAgICAgICAgICAgbGV0IHJldCA9IHRvX3Jlc3VsdChiaW5kaW5nczo6ZG1hX2ZlbmNlX2Fk ZF9jYWxsYmFjaygKKyAgICAgICAgICAgICAgICAgICAgZmVuY2UuaW5uZXIuZ2V0KCksCisgICAg ICAgICAgICAgICAgICAgIE9wYXF1ZTo6Y2FzdF9pbnRvKHNsb3RfY2IpLAorICAgICAgICAgICAg ICAgICAgICBTb21lKFNlbGY6OmRtYV9mZW5jZV9jYWxsYmFjayksCisgICAgICAgICAgICAgICAg KSk7CisKKyAgICAgICAgICAgICAgICBtYXRjaCByZXQgeworICAgICAgICAgICAgICAgICAgICBP aygoKSkgPT4gT2soKCkpLAorICAgICAgICAgICAgICAgICAgICBFcnIoZSkgPT4geworICAgICAg ICAgICAgICAgICAgICAgICAgLy8gUmVhZCBiYWNrIHdoYXQgd2Ugd3JvdGUgdG8gbGVhdmUgdGhl IHNsb3QgY2xlYW4uCisgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2JfYmFjayA9IGNvcmU6 OnB0cjo6cmVhZChzbG90X2NhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldCBf ZmVuY2VfYmFjayA9IGNvcmU6OnB0cjo6cmVhZChzbG90X2ZlbmNlKTsKKworICAgICAgICAgICAg ICAgICAgICAgICAgaWYgZS50b19lcnJubygpID09IEVOT0VOVC50b19lcnJubygpIHsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICBFcnIoQ2FsbGJhY2tFcnJvcjo6QWxyZWFkeVNpZ25hbGVk KGNiX2JhY2spKQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICBFcnIoQ2FsbGJhY2tFcnJvcjo6T3RoZXIoZSkpCisgICAgICAgICAg ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9 CisgICAgICAgICAgICB9KQorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIFJhdyBkbWEgZmVu Y2UgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgYnkgdGhlIEMgY29kZS4KKyAgICAvLy8KKyAgICAv Ly8gIyBTYWZldHkKKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpcyBvbmx5IGNhbGxlZCBieSB0aGUg ZG1hX2ZlbmNlIHN1YnN5c3RlbSB3aXRoIHZhbGlkIHBvaW50ZXJzLgorICAgIHVuc2FmZSBleHRl cm4gIkMiIGZuIGRtYV9mZW5jZV9jYWxsYmFjaygKKyAgICAgICAgX2ZlbmNlOiAqbXV0IGJpbmRp bmdzOjpkbWFfZmVuY2UsCisgICAgICAgIGNiOiAqbXV0IGJpbmRpbmdzOjpkbWFfZmVuY2VfY2Is CisgICAgKSB7CisgICAgICAgIGxldCBwdHIgPSBPcGFxdWU6OmNhc3RfZnJvbShjYikuY2FzdF9t dXQoKTsKKworICAgICAgICAvLyBTQUZFVFk6IEFsbCBgY2JgIHdlIGNhbiByZWNlaXZlIGhlcmUg aGF2ZSBiZWVuIGNyZWF0ZWQgaW4gc3VjaCBhIHdheQorICAgICAgICAvLyB0aGF0IHRoZXkgYXJl IGVtYmVkZGVkIGludG8gYSBgRmVuY2VDYlJlZ2lzdHJhdGlvbmAuIFRoZSBiYWNrZW5kCisgICAg ICAgIC8vIGVuc3VyZXMgc3luY2hyb25pc2F0aW9uIHNvIHdob2V2ZXIgaG9sZHMgdGhlIHJlZ2lz dHJhdGlvbiBvYmplY3QKKyAgICAgICAgLy8gY2Fubm90IGRyb3AgaXQgd2hpbGUgdGhpcyBjb2Rl IGlzIHJ1bm5pbmcuIFNlZSBgRmVuY2VDYlJlZ2lzdHJhdGlvbjo6ZHJvcGAuCisgICAgICAgIHVu c2FmZSB7CisgICAgICAgICAgICBsZXQgcmVnOiAqbXV0IFNlbGYgPSBjb250YWluZXJfb2YhKHB0 ciwgU2VsZiwgY2IpOworCisgICAgICAgICAgICAoKnJlZykuY2FsbGJhY2suY2FsbGVkKCk7Cisg ICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgZmVu Y2UgdGhpcyBjYWxsYmFjayBpcyByZWdpc3RlcmVkIG9uLgorICAgIHB1YiBmbiBmZW5jZShzZWxm OiBQaW48JlNlbGY+KSAtPiAmRmVuY2UgeworICAgICAgICAmc2VsZi5nZXRfcmVmKCkuZmVuY2UK KyAgICB9Cit9CisKKyNbcGlubmVkX2Ryb3BdCitpbXBsPFQ6IEZlbmNlQ2I+IFBpbm5lZERyb3Ag Zm9yIEZlbmNlQ2JSZWdpc3RyYXRpb248VD4geworICAgIGZuIGRyb3Aoc2VsZjogUGluPCZtdXQg U2VsZj4pIHsKKyAgICAgICAgLy8gQWx3YXlzIGNhbGwgZG1hX2ZlbmNlX3JlbW92ZV9jYWxsYmFj aywgZXZlbiBpZiBgY2FsbGJhY2tgIGhhcyBhbHJlYWR5CisgICAgICAgIC8vIGJlZW4gdGFrZW4g YnkgYGRtYV9mZW5jZV9jYWxsYmFja2AuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IKKyAgICAgICAg Ly8gc3luY2hyb25pemF0aW9uOiBgZG1hX2ZlbmNlX3JlbW92ZV9jYWxsYmFja2AgYWNxdWlyZXMg YGZlbmNlLT5sb2NrYCwKKyAgICAgICAgLy8gd2hpY2ggZW5zdXJlcyB0aGF0IGFueSBpbi1mbGln aHQgYGRtYV9mZW5jZV9zaWduYWxgICh3aGljaCBjYWxscyBvdXIKKyAgICAgICAgLy8gY2FsbGJh Y2sgd2hpbGUgaG9sZGluZyB0aGUgc2FtZSBsb2NrKSBoYXMgY29tcGxldGVkIGJlZm9yZSB3ZSBm cmVlCisgICAgICAgIC8vIHRoZSBzdHJ1Y3QuCisgICAgICAgIC8vCisgICAgICAgIC8vIFdpdGhv dXQgdGhpcywgRHJvcCBjYW4gcmFjZSB3aXRoIGEgY29uY3VycmVudCBzaWduYWw6CisgICAgICAg IC8vICAgQ1BVMCAoc2lnbmFsLCBsb2NrIGhlbGQpOiB0YWtlKCkgLT4gc2lnbmFsZWQoZmVuY2Vf cmVmKSAoaW4gcHJvZ3Jlc3MpCisgICAgICAgIC8vICAgQ1BVMSAoZHJvcCk6IHNlZXMgaXNfc29t ZSgpPT1mYWxzZSAtPiBza2lwcyBsb2NrIC0+IGZyZWVzIHN0cnVjdAorICAgICAgICAvLyAgIENQ VTA6IGFjY2Vzc2VzIGZlbmNlX3JlZiAtPiB1c2UtYWZ0ZXItZnJlZQorICAgICAgICAvLworICAg ICAgICAvLyBXaGVuIHRoZSBjYWxsYmFjayBoYXMgYWxyZWFkeSBmaXJlZCwgdGhlIHNpZ25hbCBw YXRoIGRldGFjaGVkIHRoZQorICAgICAgICAvLyBsaXN0IG5vZGUgdmlhIElOSVRfTElTVF9IRUFE LCBzbyBkbWFfZmVuY2VfcmVtb3ZlX2NhbGxiYWNrIGp1c3Qgc2VlcworICAgICAgICAvLyBhbiBl bXB0eSBub2RlIGFuZCByZXR1cm5zIGZhbHNlIOKAlCB0aGUgbG9jayBhY3F1aXNpdGlvbiBpcyB0 aGUgb25seQorICAgICAgICAvLyB0aGluZyB0aGF0IG1hdHRlcnMuCisgICAgICAgIC8vCisgICAg ICAgIC8vIFNBRkVUWTogVGhlIGZlbmNlIHBvaW50ZXIgaXMgdmFsaWQgYW5kIHRoZSBjYiB3YXMg aW5pdGlhbGl6ZWQgYnkKKyAgICAgICAgLy8gZG1hX2ZlbmNlX2FkZF9jYWxsYmFjayBkdXJpbmcg Y29uc3RydWN0aW9uLgorICAgICAgICB1bnNhZmUgeworICAgICAgICAgICAgYmluZGluZ3M6OmRt YV9mZW5jZV9yZW1vdmVfY2FsbGJhY2soc2VsZi5mZW5jZS5hc19yYXcoKSwgc2VsZi5jYi5nZXQo KSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFNBRkVUWTogRmVuY2VDYlJlZ2lzdHJhdGlv biBjYW4gYmUgc2VudCBiZXR3ZWVuIHRocmVhZHMKK3Vuc2FmZSBpbXBsPFQ6IEZlbmNlQ2I+IFNl bmQgZm9yIEZlbmNlQ2JSZWdpc3RyYXRpb248VD4ge30KKworLy8gU0FGRVRZOiAmRmVuY2VDYlJl Z2lzdHJhdGlvbiBjYW4gYmUgc2hhcmVkIGJldHdlZW4gdGhyZWFkcyBpZiAmVCBjYW4uCit1bnNh ZmUgaW1wbDxUOiBGZW5jZUNiPiBTeW5jIGZvciBGZW5jZUNiUmVnaXN0cmF0aW9uPFQ+IHdoZXJl IFQ6IFN5bmMge30KKworLy8vIFRoZSByZWNlaXZpbmcgY291bnRlcnBhcnQgb2YgYSBbYERyaXZl ckZlbmNlYF0sIGRlc2lnbmVkIHRvIHJlZ2lzdGVyIGNhbGxiYWNrcworLy8vIG9uLCBjaGVjayB0 aGUgc2lnbmFsbGVkIHN0YXRlIGV0Yy4gQSBbYEZlbmNlYF0gY2Fubm90IGJlIHNpZ25hbGxlZC4K Ky8vLyBBIFtgRmVuY2VgXSBpcyBhbHdheXMgcmVmY291bnRlZC4KK3B1YiBzdHJ1Y3QgRmVuY2Ug eworICAgIC8vLyBUaGUgYWN0dWFsIGRtYV9mZW5jZSBwYXNzZWQgdG8gQy4KKyAgICBpbm5lcjog T3BhcXVlPGJpbmRpbmdzOjpkbWFfZmVuY2U+LAorfQorCisvLyBTQUZFVFk6IEZlbmNlcyBhcmUg bGl0ZXJhbGx5IGRlc2lnbmVkIHRvIGJlIHNoYXJlZCBiZXR3ZWVuIHRocmVhZHMuCit1bnNhZmUg aW1wbCBTZW5kIGZvciBGZW5jZSB7fQorLy8gU0FGRVRZOiBGZW5jZXMgYXJlIGxpdGVyYWxseSBk ZXNpZ25lZCB0byBiZSBzaGFyZWQgYmV0d2VlbiB0aHJlYWRzLgordW5zYWZlIGltcGwgU3luYyBm b3IgRmVuY2Uge30KKworaW1wbCBGZW5jZSB7CisgICAgLy8vIENoZWNrIHdoZXRoZXIgdGhlIGZl bmNlIHdhcyBzaWduYWxsZWQgYXQgdGhlIG1vbWVudCBvZiB0aGUgZnVuY3Rpb24gY2FsbC4KKyAg ICBwdWIgZm4gaXNfc2lnbmFsZWQoJnNlbGYpIC0+IGJvb2wgeworICAgICAgICAvLyBTQUZFVFk6 IHNlbGYgaXMgYnkgZGVmaW5pdGlvbiBzdGlsbCB2YWxpZC4gVGhlIGJhY2tlbmQgZW5zdXJlcyBw cm9wZXIKKyAgICAgICAgLy8gbG9ja2luZy4KKyAgICAgICAgdW5zYWZlIHsgYmluZGluZ3M6OmRt YV9mZW5jZV9pc19zaWduYWxlZChzZWxmLmFzX3JhdygpKSB9CisgICAgfQorCisgICAgZm4gYXNf cmF3KCZzZWxmKSAtPiAqbXV0IGJpbmRpbmdzOjpkbWFfZmVuY2UgeworICAgICAgICBzZWxmLmlu bmVyLmdldCgpCisgICAgfQorCisgICAgLy8vIENyZWF0ZSBhIFtgRmVuY2VgXSBmcm9tIGEgcmF3 IEMgW2BiaW5kaW5nczo6ZG1hX2ZlbmNlYF0uCisgICAgLy8vCisgICAgLy8vICMgU2FmZXR5Cisg ICAgLy8vCisgICAgLy8vIGBwdHJgIG11c3QgcG9pbnQgdG8gYW4gaW5pdGlhbGl6ZWQgZmVuY2Ug dGhhdCBpcyBlbWJlZGRlZCBpbnRvIGEgW2BGZW5jZWBdLgorICAgIHB1YiB1bnNhZmUgZm4gZnJv bV9yYXc8J2E+KHB0cjogKm11dCBiaW5kaW5nczo6ZG1hX2ZlbmNlKSAtPiAmJ2EgU2VsZiB7Cisg ICAgICAgIC8vIFNBRkVUWTogU2FmZSBhcyBwZXIgdGhlIGZ1bmN0aW9uJ3Mgb3ZlcmFsbCBzYWZl dHkgcmVxdWlyZW1lbnRzLgorICAgICAgICB1bnNhZmUgeyAmKnB0ci5jYXN0KCkgfQorICAgIH0K K30KKworLy8gU0FGRVRZOiBUaGVzZSBpbXBsZW1lbnQgdGhlIEMgYmFja2VuZHMgcmVmY291bnRp bmcgbWV0aG9kcyB3aGljaCBhcmUgcHJvdmVuIHRvIHdvcmsgY29ycmVjdGx5LgordW5zYWZlIGlt cGwgQWx3YXlzUmVmQ291bnRlZCBmb3IgRmVuY2UgeworICAgIGZuIGluY19yZWYoJnNlbGYpIHsK KyAgICAgICAgLy8gU0FGRVRZOiBgc2VsZi5hc19yYXcoKWAgaXMgYSBwb2ludGVyIHRvIGEgdmFs aWQgYHN0cnVjdCBkbWFfZmVuY2VgLgorICAgICAgICB1bnNhZmUgeyBiaW5kaW5nczo6ZG1hX2Zl bmNlX2dldChzZWxmLmFzX3JhdygpKSB9CisgICAgfQorCisgICAgLy8vICMgU2FmZXR5CisgICAg Ly8vCisgICAgLy8vIGBwdHJgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBbYERyaXZlckZl bmNlYF0uCisgICAgdW5zYWZlIGZuIGRlY19yZWYocHRyOiBOb25OdWxsPFNlbGY+KSB7CisgICAg ICAgIC8vIFNBRkVUWTogYHB0cmAgaXMgbmV2ZXIgYSBOVUxMIHBvaW50ZXI7IGFuZCB3aGVuIGBk ZWNfcmVmKClgIGlzIGNhbGxlZAorICAgICAgICAvLyB0aGUgZmVuY2UgaXMgYnkgZGVmaW5pdGlv biBzdGlsbCB2YWxpZC4KKyAgICAgICAgbGV0IGZlbmNlID0gdW5zYWZlIHsgKCpwdHIuYXNfcHRy KCkpLmlubmVyLmdldCgpIH07CisKKyAgICAgICAgLy8gU0FGRVRZOiBWYWxpZCBiZWNhdXNlIGBm ZW5jZWAgd2FzIGNyZWF0ZWQgdmFsaWRseSBhYm92ZS4KKyAgICAgICAgdW5zYWZlIHsgYmluZGlu Z3M6OmRtYV9mZW5jZV9wdXQoZmVuY2UpIH0KKyAgICB9Cit9CisKKyNbcmVwcihDKV0gLy8gTmVj ZXNzYXJ5IHRvIGd1YXJhbnRlZSB0aGF0IGBpbm5lcmAgYWx3YXlzIGNvbWVzIGZpcnN0IHNvIHRo YXQgd2UgY2FuIGNhc3QuCisjW3Bpbl9kYXRhXQorc3RydWN0IERyaXZlckZlbmNlRGF0YTxGOiBT ZW5kICsgU3luYywgQzogU2VuZCArIFN5bmM+IHsKKyAgICAjW3Bpbl0KKyAgICAvLy8gVGhlIGlu bmVyIGZlbmNlLgorICAgIGlubmVyOiBGZW5jZSwKKyAgICAvLy8gUG9pbnRlciB0byBhY2Nlc3Mg dGhlIEZlbmNlQ3R4LiBVc2VmdWwgZm9yIG9idGFpbmluZyBuYW1lIHBhcmFtZXRlcnMuCisgICAg Ly8gVGhlIEZlbmNlQ3R4IGxpdmVzIGFzIGxvbmcgYXMgYXQgbGVhc3QgYWxsIGl0cyBmZW5jZXMs IGhlbmNlIHRoaXMgaXMgc2FmZS4KKyAgICBmY3R4OiBBcmM8RmVuY2VDdHg8RiwgQz4+LAorICAg IC8vLyBUaGUgQVBJIHVzZXIncyBkYXRhLiBBcyByZXF1aXJlZCBieSBbYERyaXZlckZlbmNlQWxs b3dlZERhdGFgXSwgdGhpcyBlaXRoZXIKKyAgICAvLy8gZG9lcyBub3QgbmVlZCBkcm9wLCBvciBt dXN0IGxpdmUgaW4gYSBbYHJjdTo6UmN1Qm94YF0uIEl0IGlzIGVzc2VudGlhbAorICAgIC8vLyB0 aGF0IHRoZSBkYXRhIG9ubHkgcGVyZm9ybXMgb3BlcmF0aW9ucyBsZWdhbCBpbiBhdG9taWMgY29u dGV4dCBpbiBpdHMKKyAgICAvLy8gW2BEcm9wYF0gaW1wbGVtZW50YXRpb24uCisgICAgI1twaW5d CisgICAgZGF0YTogRiwKK30KKworLy8vIEEgdHJhaXQgdG8gZW5mb3JjZSB0aGF0IGFsbCBkYXRh IGluIGEgW2BEcml2ZXJGZW5jZWBdIGVpdGhlciBkb2VzIG5vdCBuZWVkCisvLy8gZHJvcCwgb3Ig bGl2ZXMgaW4gYSBbYFJjdUJveGBdLgorcHViIHRyYWl0IERyaXZlckZlbmNlQWxsb3dlZERhdGE6 IHByaXZhdGU6OlNlYWxlZCB7fQorCittb2QgcHJpdmF0ZSB7CisgICAgcHViIHRyYWl0IFNlYWxl ZCB7fQorfQorCitpbXBsPEY6IENvcHk+IERyaXZlckZlbmNlQWxsb3dlZERhdGEgZm9yIEYge30K K2ltcGw8RjogU2VuZD4gRHJpdmVyRmVuY2VBbGxvd2VkRGF0YSBmb3IgUmN1Qm94PEY+IHt9CisK K2ltcGw8RjogQ29weT4gcHJpdmF0ZTo6U2VhbGVkIGZvciBGIHt9CitpbXBsPEY6IFNlbmQ+IHBy aXZhdGU6OlNlYWxlZCBmb3IgUmN1Qm94PEY+IHt9CisKKy8vLyBBIHN5bmNocm9uaXphdGlvbiBw cmltaXRpdmUgbWFpbmx5IGZvciBHUFUgZHJpdmVycy4KKy8vLworLy8vIEZlbmNlcyBhcmUgYWx3 YXlzIHJlZmVyZW5jZSBjb3VudGVkLiBUaGUgdHlwaWNhbCB1c2UgY2FzZSBpcyB0aGF0IG9uZSBz aWRlIHJlZ2lzdGVycworLy8vIGNhbGxiYWNrcyBvbiB0aGUgZmVuY2Ugd2hpY2ggd2lsbCBwZXJm b3JtIGEgY2VydGFpbiBhY3Rpb24gKHN1Y2ggYXMgcXVldWVpbmcgd29yaykgb25jZSB0aGUKKy8v LyBvdGhlciBzaWRlIHNpZ25hbHMgdGhlIGZlbmNlLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8v CisvLy8gYGBgCisvLy8gdXNlIGtlcm5lbDo6ZG1hX2J1Zjo6e0RyaXZlckZlbmNlLCBGZW5jZUN0 eCwgRmVuY2VDYiwgRmVuY2VDYlJlZ2lzdHJhdGlvbn07CisvLy8gdXNlIGtlcm5lbDo6c3RyOjpD U3RyaW5nOworLy8vIHVzZSBrZXJuZWw6OnN5bmM6OnsKKy8vLyAgICAgYXJlZjo6QVJlZiwKKy8v LyAgICAgcmN1OjpSY3VCb3gsIC8vCisvLy8gfTsKKy8vLyB1c2UgY29yZTo6b3BzOjpEZXJlZjsK Ky8vLyB1c2UgY29yZTo6Zm10OjpEaXNwbGF5OworLy8vCisvLy8gc3RydWN0IENhbGxiYWNrRGF0 YSB7IH0KKy8vLworLy8vIGltcGwgRmVuY2VDYiBmb3IgQ2FsbGJhY2tEYXRhIHsKKy8vLyAgICAg Zm4gY2FsbGVkKCZtdXQgc2VsZikgeworLy8vICAgICAgICAgcHJfaW5mbyEoIkRtYUZlbmNlIGNh bGxiYWNrIGV4ZWN1dGVkLlxuIik7CisvLy8gICAgIH0KKy8vLyB9CisvLy8KKy8vLyBsZXQgZHJp dmVyX25hbWUgPSBDU3RyaW5nOjp0cnlfZnJvbV9mbXQoZm10ISgiZHVtbXlfZHJpdmVyIikpPzsK Ky8vLyBsZXQgdGltZWxpbmVfbmFtZSA9IENTdHJpbmc6OnRyeV9mcm9tX2ZtdChmbXQhKCJkdW1t eV90aW1lbGluZSIpKT87CisvLy8KKy8vLyBsZXQgZmN0eCA9IEZlbmNlQ3R4OjpuZXcoZHJpdmVy X25hbWUsIHRpbWVsaW5lX25hbWUsICgpKT87CisvLy8KKy8vLyBsZXQgZmVuY2VfZGF0YSA9IENT dHJpbmc6OnRyeV9mcm9tX2ZtdChmbXQhKCJkdW1teV9kYXRhIikpPzsKKy8vLyAvLyBEcml2ZXJG ZW5jZTo6ZGF0YSBtdXN0IGVpdGhlciBub3QgbmVlZCBkcm9wLCBvciBsaXZlIGluIGFuIFJjdUJv eC4KKy8vLyBsZXQgZmVuY2VfZGF0YSA9IFJjdUJveDo6bmV3KGZlbmNlX2RhdGEsIEdGUF9LRVJO RUwpPzsKKy8vLworLy8vIGxldCBmZW5jZV9hbGxvYyA9IGZjdHguYXNfYXJjX2JvcnJvdygpLm5l d19mZW5jZV9hbGxvY2F0aW9uKGZlbmNlX2RhdGEpPzsKKy8vLyBsZXQgbXV0IGZlbmNlID0gZmN0 eC5uZXdfZmVuY2UoZmVuY2VfYWxsb2MpOworLy8vCisvLy8gbGV0IGNiX2RhdGEgPSBDYWxsYmFj a0RhdGEgeyB9OworLy8vIGxldCB3YWl0aW5nX2ZlbmNlID0gQVJlZjo6ZnJvbShmZW5jZS5hc19m ZW5jZSgpKTsKKy8vLyBsZXQgY2JfcmVnID0gRmVuY2VDYlJlZ2lzdHJhdGlvbjo6bmV3KCZ3YWl0 aW5nX2ZlbmNlLCBjYl9kYXRhKTsKKy8vLyBsZXQgY2JfcmVnID0gS0JveDo6cGluX2luaXQoY2Jf cmVnLCBHRlBfS0VSTkVMKT87CisvLy8KKy8vLyAvLyBEcml2ZXJGZW5jZSBpbXBsZW1lbnRzIERl cmVmLgorLy8vIC8vIEZJWE1FOiB1bml0IHRlc3QgY2xhaW1zIHRoYXQgQ1N0cmluZyBkb2VzIG5v dCBpbXBsZW1lbnQgRGlzcGxheS4gV2h5PworLy8vIC8vIHByX2luZm8hKCJGZW5jZSdzIGlubmVy IGRhdGEgaXM6IHt9IiwgZmVuY2UuZGVyZWYoKS5kZXJlZigpKTsKKy8vLworLy8vIC8vIFRPRE8g YmVnaW5fc2lnbmFsbGluZworLy8vIGZlbmNlLnNpZ25hbChPaygoKSkpOworLy8vIGFzc2VydF9l cSEod2FpdGluZ19mZW5jZS5pc19zaWduYWxlZCgpLCB0cnVlKTsKKy8vLworLy8vIE9rOjo8KCks IEVycm9yPigoKSkKKy8vLyBgYGAKK3B1YiBzdHJ1Y3QgRHJpdmVyRmVuY2U8RjogU2VuZCArIFN5 bmMsIEM6IFNlbmQgKyBTeW5jPiB7CisgICAgLy8vIFRoZSBhY3R1YWwgY29udGVudCBvZiB0aGUg ZmVuY2UuIExpdmVzIGluIGEgcmF3IHBvaW50ZXIgc28gdGhhdCBpdHMKKyAgICAvLy8gbWVtb3J5 IGNhbiBiZSBtYW5hZ2VkIGluZGVwZW5kZW50bHkuIFZhbGlkIHVudGlsIGJvdGggdGhlIFtgRHJp dmVyRmVuY2VgXQorICAgIC8vLyBhbmQgYWxsIGFzc29jaWF0ZWQgW2BGZW5jZWBdcyBoYXZlIGRp c2FwcGVhcmVkLgorICAgIGRhdGE6IE5vbk51bGw8RHJpdmVyRmVuY2VEYXRhPEYsIEM+PiwKK30K KworLy8vIEEgcHJlLXByZXBhcmVkIERNQSBmZW5jZSwgY2FycnlpbmcgdGhlIHVzZXIncyBkYXRh IGFuZCB0aGUgbWVtb3J5IGl0IGFuZCB0aGUKKy8vLyBmZW5jZSByZXNpZGUgaW4uIE9ubHkgdXNl ZnVsIGZvciBjcmVhdGluZyBhIFtgRHJpdmVyRmVuY2VgXS4gU3BsaXR0aW5nCisvLy8gYWxsb2Nh dGlvbiBhbmQgZnVsbCBpbml0aWFsaXphdGlvbiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBmZW5jZXMg Y2Fubm90IGJlCisvLy8gYWxsb2NhdGVkIGR5bmFtaWNhbGx5IGluIHNvbWUgY2lyY3Vtc3RhbmNl cyAoZGVhZGxvY2spLgorcHViIHN0cnVjdCBEcml2ZXJGZW5jZUFsbG9jYXRpb248RjogU2VuZCAr IFN5bmMsIEM6IFNlbmQgKyBTeW5jPiB7CisgICAgLy8vIFRoZSBtZW1vcnkgZm9yIHRoZSBhY3R1 YWwgY29udGVudCBvZiB0aGUgZmVuY2UuCisgICAgLy8vIEhhbmRlZCBvdmVyIHRvIGEgW2BEcml2 ZXJGZW5jZWBdLCBvciBkZWFsbG9jYXRlZCBvbmNlIHRoZQorICAgIC8vLyBbYERyaXZlckZlbmNl QWxsb2NhdGlvbmBdIGRyb3BzLgorICAgIGRhdGE6IEtCb3g8RHJpdmVyRmVuY2VEYXRhPEYsIEM+ PiwKK30KKworaW1wbDxGOiBTZW5kICsgU3luYyArIERyaXZlckZlbmNlQWxsb3dlZERhdGEsIEM6 IFNlbmQgKyBTeW5jPiBEcml2ZXJGZW5jZUFsbG9jYXRpb248RiwgQz4geworICAgIC8vLyBDcmVh dGUgYSBuZXcgYWxsb2NhdGlvbiBzbG90IHRoYXQgY2FuIGxhdGVyIGJlIHVzZWQgdG8gY3JlYXRl IGEgZnVsbHkKKyAgICAvLy8gaW5pdGlhbGl6ZWQgW2BEcml2ZXJGZW5jZWBdIHdpdGhvdXQgdGhl IG5lZWQgdG8gYWxsb2NhdGUuCisgICAgcHViIGZuIG5ldyhmY3R4OiBBcmM8RmVuY2VDdHg8Riwg Qz4+LCBkYXRhOiBGKSAtPiBSZXN1bHQ8U2VsZj4geworICAgICAgICBsZXQgZmVuY2VfZGF0YSA9 IERyaXZlckZlbmNlRGF0YSB7CisgICAgICAgICAgICAvLyBgaW5uZXJgIHJlbWFpbnMgdW5pbml0 aWFsaXplZCB1bnRpbCBhIFtgRHJpdmVyRmVuY2VgXSB0YWtlcyBvdmVyLgorICAgICAgICAgICAg aW5uZXI6IEZlbmNlIHsKKyAgICAgICAgICAgICAgICBpbm5lcjogT3BhcXVlOjp1bmluaXQoKSwK KyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBmY3R4LAorICAgICAgICAgICAgZGF0YSwKKyAg ICAgICAgfTsKKworICAgICAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHRoZSBDIGRtYV9mZW5j ZSBjYWxsYmFja3MsIGl0IGlzIG5lY2Vzc2FyeSBmb3IKKyAgICAgICAgLy8gYSBgRmVuY2VgIGFu ZCBhIGBEcml2ZXJGZW5jZWAgdG8gbGl2ZSBpbiB0aGUgc2FtZSBhbGxvY2F0aW9uLAorICAgICAg ICAvLyBiZWNhdXNlIHRoZSBDIGJhY2tlbmQgcGFzc2VzIGEgZG1hX2ZlbmNlLCBmcm9tIHdoaWNo IHRoZSBkcml2ZXIgbW9zdAorICAgICAgICAvLyBsaWtlbHkgd2FudHMgdG8gYmUgYWJsZSB0byBh Y2Nlc3MgaXRzIGBkYXRhYCBpbiBgRHJpdmVyRmVuY2VgLgorICAgICAgICAvLworICAgICAgICAv LyBIZW5jZSwgd2UgbmVlZCB0aGUgbWFuYWdlIHRoZSBtZW1vcnkgbWFudWFsbHkuIEl0IHdpbGwg YmUgZnJlZWQgYnkgdGhlCisgICAgICAgIC8vIEMgYmFja2VuZCBhdXRvbWF0aWNhbGx5IG9uY2Ug dGhlIHJlZmNvdW50IHdpdGhpbiBgRmVuY2VgIGRyb3BzIHRvIDAuCisgICAgICAgIGxldCBkYXRh ID0gS0JveDo6bmV3KGZlbmNlX2RhdGEsIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKT87CisKKyAg ICAgICAgT2soU2VsZiB7IGRhdGEgfSkKKyAgICB9CisKKyAgICBmbiBhc19yYXcoJnNlbGYpIC0+ ICptdXQgYmluZGluZ3M6OmRtYV9mZW5jZSB7CisgICAgICAgIHNlbGYuZGF0YS5pbm5lci5pbm5l ci5nZXQoKQorICAgIH0KK30KKworaW1wbDxGOiBTZW5kICsgU3luYywgQzogU2VuZCArIFN5bmM+ IERyaXZlckZlbmNlPEYsIEM+IHsKKyAgICBmbiBhc19yYXcoJnNlbGYpIC0+ICptdXQgYmluZGlu Z3M6OmRtYV9mZW5jZSB7CisgICAgICAgIC8vIFNBRkVUWTogVmFsaWQgYmVjYXVzZSBgc2VsZmAg aXMgdmFsaWQuCisgICAgICAgIGxldCBmZW5jZV9kYXRhID0gdW5zYWZlIHsgJm11dCAqc2VsZi5k YXRhLmFzX3B0cigpIH07CisKKyAgICAgICAgZmVuY2VfZGF0YS5pbm5lci5pbm5lci5nZXQoKQor ICAgIH0KKworICAgIC8vLyBDcmVhdGUgYSBbYERyaXZlckZlbmNlYF0gZnJvbSBhIHJhdyBwb2lu dGVyIHRvIGEgW2BiaW5kaW5nczo6ZG1hX2ZlbmNlYF0uCisgICAgLy8vCisgICAgLy8vICMgU2Fm ZXR5CisgICAgLy8vCisgICAgLy8vIGBwdHJgIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEg YGRtYV9mZW5jZWAgdGhhdCB3YXMgb2J0YWluZWQgdGhyb3VnaAorICAgIC8vLyBhIFtgRHJpdmVy RmVuY2VgXSB3aXRoIG1hdGNoaW5nIGdlbmVyaWMgZGF0YSBmb3IgYm90aCBmZW5jZSBhbmQgYXNz b2NpYXRlZAorICAgIC8vLyBbYEZlbmNlQ3R4YF0uCisgICAgdW5zYWZlIGZuIGZyb21fcmF3KHB0 cjogKm11dCBiaW5kaW5nczo6ZG1hX2ZlbmNlKSAtPiBTZWxmIHsKKyAgICAgICAgbGV0IG9wYXF1 ZV9mZW5jZSA9IE9wYXF1ZTo6Y2FzdF9mcm9tKHB0cik7CisKKyAgICAgICAgLy8gU0FGRVRZOiBT YWZlIGR1ZSB0byB0aGUgZnVuY3Rpb24ncyBvdmVyYWxsIHNhZmV0eSByZXF1aXJlbWVudHMuCisg ICAgICAgIGxldCBmZW5jZV9wdHIgPSB1bnNhZmUgeyBjb250YWluZXJfb2YhKG9wYXF1ZV9mZW5j ZSwgRmVuY2UsIGlubmVyKSB9OworCisgICAgICAgIC8vIERyaXZlckZlbmNlRGF0YSBpcyByZXBy KEMpIGFuZCBhIEZlbmNlIGlzIGl0cyBmaXJzdCBtZW1iZXIuCisgICAgICAgIGxldCBmZW5jZV9k YXRhX3B0ciA9IGZlbmNlX3B0ciBhcyAqbXV0IERyaXZlckZlbmNlRGF0YTxGLCBDPjsKKworICAg ICAgICAvLyBTQUZFVFk6IGBmZW5jZV9kYXRhX3B0cmAgd2FzIGNyZWF0ZWQgdmFsaWRseSBhYm92 ZS4KKyAgICAgICAgbGV0IGRhdGEgPSB1bnNhZmUgeyBOb25OdWxsOjpuZXdfdW5jaGVja2VkKGZl bmNlX2RhdGFfcHRyKSB9OworCisgICAgICAgIFNlbGYgeyBkYXRhIH0KKyAgICB9CisKKyAgICAv Ly8gUmV0dXJuIHRoZSB1bmRlcmx5aW5nIFtgRmVuY2VgXS4KKyAgICBwdWIgZm4gYXNfZmVuY2Uo JnNlbGYpIC0+ICZGZW5jZSB7CisgICAgICAgIC8vIFNBRkVUWTogYHNlbGZgIGlzIGJ5IGRlZmlu aXRpb24gc3RpbGwgdmFsaWQsIGFuZCBpdCBjYW5ub3QgZHJvcCB1bnRpbAorICAgICAgICAvLyB0 aGlzIG5ldyByZWZlcmVuY2UgaXMgZ29uZS4KKyAgICAgICAgdW5zYWZlIHsgRmVuY2U6OmZyb21f cmF3KHNlbGYuYXNfcmF3KCkpIH0KKyAgICB9CisKKyAgICAvLy8gU2lnbmFsIHRoZSBmZW5jZS4g VGhpcyB3aWxsIGludm9rZSBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MuCisgICAgcHViIGZuIHNp Z25hbChzZWxmLCByZXM6IFJlc3VsdCkgeworICAgICAgICBsZXQgZmVuY2UgPSBzZWxmLmFzX3Jh dygpOworICAgICAgICBsZXQgbXV0IGZlbmNlX2ZsYWdzOiB1c2l6ZSA9IDA7CisgICAgICAgIGxl dCBmbGFnX3B0ciA9ICZyYXcgbXV0IGZlbmNlX2ZsYWdzOworCisgICAgICAgIC8vIFNBRkVUWTog T25jZSBhIGBEcml2ZXJGZW5jZWAgaXMgaW5pdGlhbGl6ZWQsIHRoZSBpbm5lciBgZmVuY2VgIGlz CisgICAgICAgIC8vIHZhbGlkIGFuZCBpbml0aWFsaXplZC4gSXQgaXMgdmFsaWQgdW50aWwgdGhl IHJlZmNvdW50IGRyb3BzCisgICAgICAgIC8vIHRvIDAsIHdoaWNoIGNhbiBlYXJsaWVzdCBoYXBw ZW4gb25jZSB0aGUgYERyaXZlckZlbmNlYCBoYXMgYmVlbiBkcm9wcGVkLgorICAgICAgICB1bnNh ZmUgeworICAgICAgICAgICAgYmluZGluZ3M6OmRtYV9mZW5jZV9sb2NrX2lycXNhdmUoZmVuY2Us IGZsYWdfcHRyKTsKKyAgICAgICAgICAgIGlmICFiaW5kaW5nczo6ZG1hX2ZlbmNlX2lzX3NpZ25h bGVkX2xvY2tlZChmZW5jZSkgeworICAgICAgICAgICAgICAgIGlmIGxldCBFcnIoZXJyKSA9IHJl cyB7CisgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdzOjpkbWFfZmVuY2Vfc2V0X2Vycm9yKGZl bmNlLCBlcnIudG9fZXJybm8oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg IGJpbmRpbmdzOjpkbWFfZmVuY2Vfc2lnbmFsX2xvY2tlZChmZW5jZSk7CisgICAgICAgICAgICB9 CisgICAgICAgICAgICBiaW5kaW5nczo6ZG1hX2ZlbmNlX3VubG9ja19pcnFyZXN0b3JlKGZlbmNl LCBmbGFnX3B0cik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFNBRkVUWTogRmVuY2VzIGFy ZSBsaXRlcmFsbHkgZGVzaWduZWQgdG8gYmUgc2hhcmVkIGJldHdlZW4gdGhyZWFkcy4KK3Vuc2Fm ZSBpbXBsPEY6IFNlbmQgKyBTeW5jLCBDOiBTZW5kICsgU3luYz4gU2VuZCBmb3IgRHJpdmVyRmVu Y2U8RiwgQz4ge30KKworaW1wbDxGOiBTZW5kICsgU3luYywgQzogU2VuZCArIFN5bmM+IERlcmVm IGZvciBEcml2ZXJGZW5jZTxGLCBDPiB7CisgICAgdHlwZSBUYXJnZXQgPSBGOworCisgICAgZm4g ZGVyZWYoJnNlbGYpIC0+ICZTZWxmOjpUYXJnZXQgeworICAgICAgICAvLyBTQUZFVFk6IFRoYW5r cyB0byByZWZjb3VudGluZywgYGRhdGFgIGlzIGFsd2F5cyB2YWxpZCBhcyBsb25nIGFzIGBzZWxm YCBpcy4KKyAgICAgICAgbGV0IGRhdGEgPSB1bnNhZmUgeyAmKnNlbGYuZGF0YS5hc19wdHIoKSB9 OworCisgICAgICAgICZkYXRhLmRhdGEKKyAgICB9Cit9CisKKy8vLyBBIGJvcnJvd2VkIFtgRHJp dmVyRmVuY2VgXS4gQWxsIHlvdSBjYW4gZG8gd2l0aCBpdCBpcyBhY2Nlc3MgeW91ciB1c2VyIGRh dGEKKy8vLyBhbmQgb2J0YWluIGEgW2BGZW5jZWBdLgorcHViIHN0cnVjdCBEcml2ZXJGZW5jZUJv cnJvdzxGOiBTZW5kICsgU3luYywgQzogU2VuZCArIFN5bmM+IHsKKyAgICAvLy8gVGhlIGFjdHVh bCBjb250ZW50IG9mIHRoZSBmZW5jZS4gTGl2ZXMgaW4gYSByYXcgcG9pbnRlciBzbyB0aGF0IGl0 cworICAgIC8vLyBtZW1vcnkgY2FuIGJlIG1hbmFnZWQgaW5kZXBlbmRlbnRseS4gVmFsaWQgdW50 aWwgYm90aCB0aGUgW2BEcml2ZXJGZW5jZWBdCisgICAgLy8vIGFuZCBhbGwgYXNzb2NpYXRlZCBb YEZlbmNlYF1zIGhhdmUgZGlzYXBwZWFyZWQuCisgICAgZGF0YTogTm9uTnVsbDxEcml2ZXJGZW5j ZURhdGE8RiwgQz4+LAorfQorCitpbXBsPEY6IFNlbmQgKyBTeW5jLCBDOiBTZW5kICsgU3luYz4g RGVyZWYgZm9yIERyaXZlckZlbmNlQm9ycm93PEYsIEM+IHsKKyAgICB0eXBlIFRhcmdldCA9IEY7 CisKKyAgICBmbiBkZXJlZigmc2VsZikgLT4gJlNlbGY6OlRhcmdldCB7CisgICAgICAgIC8vIFNB RkVUWTogVGhhbmtzIHRvIHJlZmNvdW50aW5nLCBgZGF0YWAgaXMgYWx3YXlzIHZhbGlkIGFzIGxv bmcgYXMgYHNlbGZgIGlzLgorICAgICAgICBsZXQgZGF0YSA9IHVuc2FmZSB7ICYqc2VsZi5kYXRh LmFzX3B0cigpIH07CisKKyAgICAgICAgJmRhdGEuZGF0YQorICAgIH0KK30KKworaW1wbDxGOiBT ZW5kICsgU3luYywgQzogU2VuZCArIFN5bmM+IERyaXZlckZlbmNlQm9ycm93PEYsIEM+IHsKKyAg ICBmbiBhc19yYXcoJnNlbGYpIC0+ICptdXQgYmluZGluZ3M6OmRtYV9mZW5jZSB7CisgICAgICAg IC8vIFNBRkVUWTogVmFsaWQgYmVjYXVzZSBgc2VsZmAgaXMgdmFsaWQuCisgICAgICAgIGxldCBm ZW5jZV9kYXRhID0gdW5zYWZlIHsgJm11dCAqc2VsZi5kYXRhLmFzX3B0cigpIH07CisKKyAgICAg ICAgZmVuY2VfZGF0YS5pbm5lci5pbm5lci5nZXQoKQorICAgIH0KKworICAgIC8vLyBSZXR1cm4g dGhlIHVuZGVybHlpbmcgW2BGZW5jZWBdLgorICAgIHB1YiBmbiBhc19mZW5jZSgmc2VsZikgLT4g JkZlbmNlIHsKKyAgICAgICAgLy8gU0FGRVRZOiBgc2VsZmAgaXMgYnkgZGVmaW5pdGlvbiBzdGls bCB2YWxpZCwgYW5kIGl0IGNhbm5vdCBkcm9wIHVudGlsCisgICAgICAgIC8vIHRoaXMgbmV3IHJl ZmVyZW5jZSBpcyBnb25lLgorICAgICAgICB1bnNhZmUgeyBGZW5jZTo6ZnJvbV9yYXcoc2VsZi5h c19yYXcoKSkgfQorICAgIH0KKworICAgIC8vLyBHZXQgYSBbYERyaXZlckZlbmNlQm9ycm93YF0g ZnJvbSBhIHJhdyBwb2ludGVyLgorICAgIC8vLworICAgIC8vLyAjIFNhZmV0eQorICAgIC8vLwor ICAgIC8vLyBgcHRyYCBtdXN0IHBvaW50IHRvIGEgcmF3IGRtYV9mZW5jZSB3aXRoaW4gYSBbYEZl bmNlYF0gd2l0aGluIGEgW2BEcml2ZXJGZW5jZURhdGFgXS4KKyAgICB1bnNhZmUgZm4gZnJvbV9y YXcocHRyOiAqbXV0IGJpbmRpbmdzOjpkbWFfZmVuY2UpIC0+IFNlbGYgeworICAgICAgICBsZXQg b3BhcXVlX2ZlbmNlID0gT3BhcXVlOjpjYXN0X2Zyb20ocHRyKTsKKworICAgICAgICAvLyBTQUZF VFk6IFNhZmUgZHVlIHRvIHRoZSBmdW5jdGlvbidzIG92ZXJhbGwgc2FmZXR5IHJlcXVpcmVtZW50 cy4KKyAgICAgICAgbGV0IGZlbmNlX3B0ciA9IHVuc2FmZSB7IGNvbnRhaW5lcl9vZiEob3BhcXVl X2ZlbmNlLCBGZW5jZSwgaW5uZXIpIH07CisKKyAgICAgICAgLy8gRHJpdmVyRmVuY2VEYXRhIGlz IHJlcHIoQykgYW5kIGEgRmVuY2UgaXMgaXRzIGZpcnN0IG1lbWJlci4KKyAgICAgICAgbGV0IGZl bmNlX2RhdGFfcHRyID0gZmVuY2VfcHRyIGFzICptdXQgRHJpdmVyRmVuY2VEYXRhPEYsIEM+Owor CisgICAgICAgIC8vIFNBRkVUWTogYGZlbmNlX2RhdGFfcHRyYCB3YXMgY3JlYXRlZCB2YWxpZGx5 IGFib3ZlLgorICAgICAgICBsZXQgZGF0YSA9IHVuc2FmZSB7IE5vbk51bGw6Om5ld191bmNoZWNr ZWQoZmVuY2VfZGF0YV9wdHIpIH07CisKKyAgICAgICAgU2VsZiB7IGRhdGEgfQorICAgIH0KK30K KworLy8gU0FGRVRZOiBUaGUgUnVzdCBkbWFfZmVuY2UgYWJzdHJhY3Rpb25zIGFyZSBhbHJlYWR5 IGRlc2lnbmVkIGFyb3VuZCB0aGUgaW5uZXIKKy8vIEMgYGRtYV9mZW5jZWAsIHdoaWNoIGNhbiBz ZXJ2ZSBzYWZlbHkgYXMgdGhlIGlkZW50aWZpY2F0aW9uIHBvaW50IHdoZW4gYmVpbmcKKy8vIG93 bmVkIGJ5IEMuIE1vcmVvdmVyLCBzYWZldHkgaXMgZW5zdXJlZCBieSBub3QgZHJvcHBpbmcgYERy aXZlckZlbmNlYCBhbmQgYnkKKy8vIG9ubHkgYWxsb3dpbmcgb3BlcmF0aW9ucyB3aXRob3V0IHNp ZGUgZWZmZWN0cyBvbiB0aGUgQm9ycm93ZWQgdHlwZS4KK3Vuc2FmZSBpbXBsPEY6IFNlbmQgKyBT eW5jICsgJ3N0YXRpYywgQzogU2VuZCArIFN5bmMgKyAnc3RhdGljPiBGb3JlaWduT3duYWJsZQor ICAgIGZvciBEcml2ZXJGZW5jZTxGLCBDPgoreworICAgIC8vIGBEcml2ZXJGZW5jZWAgaXMgbWVy ZWx5IGEgd3JhcHBlciBhcm91bmQgYSByYXcgcG9pbnRlci4gVGh1cywgd2UgY2FuIGp1c3QKKyAg ICAvLyB1c2UgaXQgZGlyZWN0bHkuCisgICAgdHlwZSBCb3Jyb3dlZDwnYT4gPSBEcml2ZXJGZW5j ZUJvcnJvdzxGLCBDPjsKKyAgICB0eXBlIEJvcnJvd2VkTXV0PCdhPiA9IERyaXZlckZlbmNlQm9y cm93PEYsIEM+OworCisgICAgY29uc3QgRk9SRUlHTl9BTElHTjogdXNpemUgPSBjb3JlOjptZW06 OmFsaWduX29mOjo8YmluZGluZ3M6OmRtYV9mZW5jZT4oKTsKKworICAgIGZuIGludG9fZm9yZWln bihzZWxmKSAtPiAqbXV0IGNfdm9pZCB7CisgICAgICAgIGxldCBmZW5jZSA9IHNlbGY7CisKKyAg ICAgICAgbGV0IHB0ciA9IGZlbmNlLmFzX3JhdygpOworCisgICAgICAgIC8vIERyaXZlckZlbmNl IG11c3Qgbm90IGRyb3AuCisgICAgICAgIGNvcmU6Om1lbTo6Zm9yZ2V0KGZlbmNlKTsKKworICAg ICAgICBwdHIuY2FzdCgpCisgICAgfQorCisgICAgdW5zYWZlIGZuIGZyb21fZm9yZWlnbihwdHI6 ICptdXQgY192b2lkKSAtPiBTZWxmIHsKKyAgICAgICAgLy8gU0FGRVRZOiBTYWZlIGJlY2F1c2Ug dGhlIHRyYWl0IGltcGxlbWVudGF0aW9uIG9ubHkgaW52b2tlcyB0aGlzIHdpdGgKKyAgICAgICAg Ly8gYSB2YWxpZCBgcHRyYCwgYXNzb2NpYXRlZCB0byBhIGBEcml2ZXJGZW5jZWAgd2l0aCBtYXRj aGluZyBnZW5lcmljIGRhdGEuCisgICAgICAgIHVuc2FmZSB7IFNlbGY6OmZyb21fcmF3KHB0ci5j YXN0KCkpIH0KKyAgICB9CisKKyAgICB1bnNhZmUgZm4gYm9ycm93PCdhPihwdHI6ICptdXQgY192 b2lkKSAtPiBTZWxmOjpCb3Jyb3dlZDwnYT4geworICAgICAgICAvLyBTQUZFVFk6IFRoZSB0cmFp dCBpbXBsZW1lbnRhdGlvbiBlbnN1cmVzIHRoYXQgYHB0cmAgYWx3YXlzIHJlc2lkZXMKKyAgICAg ICAgLy8gd2l0aGluIGEgW2BGZW5jZWBdIHdpdGhpbiBhIFtgRHJpdmVyRmVuY2VEYXRhYF0uCisg ICAgICAgIHVuc2FmZSB7IERyaXZlckZlbmNlQm9ycm93Ojpmcm9tX3JhdyhwdHIuY2FzdCgpKSB9 CisgICAgfQorCisgICAgdW5zYWZlIGZuIGJvcnJvd19tdXQ8J2E+KHB0cjogKm11dCBjX3ZvaWQp IC0+IFNlbGY6OkJvcnJvd2VkTXV0PCdhPiB7CisgICAgICAgIC8vIFNBRkVUWTogVGhlIHRyYWl0 IGltcGxlbWVudGF0aW9uIGVuc3VyZXMgdGhhdCBgcHRyYCBhbHdheXMgcmVzaWRlcworICAgICAg ICAvLyB3aXRoaW4gYSBbYEZlbmNlYF0gd2l0aGluIGEgW2BEcml2ZXJGZW5jZURhdGFgXS4KKyAg ICAgICAgdW5zYWZlIHsgRHJpdmVyRmVuY2VCb3Jyb3c6OmZyb21fcmF3KHB0ci5jYXN0KCkpIH0K KyAgICB9Cit9CisKK2ltcGw8RjogU2VuZCArIFN5bmMsIEM6IFNlbmQgKyBTeW5jPiBEcm9wIGZv ciBEcml2ZXJGZW5jZTxGLCBDPiB7CisgICAgZm4gZHJvcCgmbXV0IHNlbGYpIHsKKyAgICAgICAg bGV0IGZlbmNlID0gc2VsZi5hc19yYXcoKTsKKyAgICAgICAgbGV0IG11dCBmZW5jZV9mbGFnczog dXNpemUgPSAwOworICAgICAgICBsZXQgZmxhZ19wdHIgPSAmcmF3IG11dCBmZW5jZV9mbGFnczsK KworICAgICAgICAvLyBTQUZFVFk6IE9uY2UgYSBgRHJpdmVyRmVuY2VgIGlzIGluaXRpYWxpemVk LCB0aGUgaW5uZXIgYGZlbmNlYCBpcworICAgICAgICAvLyB2YWxpZCBhbmQgaW5pdGlhbGl6ZWQu IEl0IGlzIHZhbGlkIHVudGlsIHRoZSByZWZjb3VudCBkcm9wcworICAgICAgICAvLyB0byAwLCB3 aGljaCBjYW4gZWFybGllc3QgaGFwcGVuIG9uY2UgdGhlIGBEcml2ZXJGZW5jZWAgaGFzIGJlZW4g ZHJvcHBlZC4KKyAgICAgICAgdW5zYWZlIHsKKyAgICAgICAgICAgIGJpbmRpbmdzOjpkbWFfZmVu Y2VfbG9ja19pcnFzYXZlKGZlbmNlLCBmbGFnX3B0cik7CisgICAgICAgICAgICAjW2FsbG93KHVu dXNlZF91bnNhZmUpXQorICAgICAgICAgICAgaWYgd2Fybl9vbiEoIWJpbmRpbmdzOjpkbWFfZmVu Y2VfaXNfc2lnbmFsZWRfbG9ja2VkKGZlbmNlKSkgeworICAgICAgICAgICAgICAgIGJpbmRpbmdz OjpkbWFfZmVuY2Vfc2V0X2Vycm9yKGZlbmNlLCBFQ0FOQ0VMRUQgYXMgaTMyKTsKKyAgICAgICAg ICAgICAgICBiaW5kaW5nczo6ZG1hX2ZlbmNlX3NpZ25hbF9sb2NrZWQoZmVuY2UpOworICAgICAg ICAgICAgfQorICAgICAgICAgICAgYmluZGluZ3M6OmRtYV9mZW5jZV91bmxvY2tfaXJxcmVzdG9y ZShmZW5jZSwgZmxhZ19wdHIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU0FGRVRZOiBgc2Vs Zi5kYXRhYCBpcyBvd25lZCBieSB0aGUgRHJpdmVyRmVuY2UsIGJ1dCBjb3VsZCBiZSBhY2Nlc3Nl ZAorICAgICAgICAvLyB0aHJvdWdoIHNvbWUgZG1hX2ZlbmNlIGNhbGxiYWNrcyByaWdodCBub3cu IEFjY2VzcyBpcyBiZWluZyByZXZva2VkCisgICAgICAgIC8vIGFib3ZlIGJ5IHNpZ25hbGxpbmcg dGhlIGZlbmNlLiBUaGUgRHJpdmVyRmVuY2VBbGxvd2VkRGF0YSB0cmFpdAorICAgICAgICAvLyBl bnN1cmVzIHRoYXQgdGhlIGRhdGEgZWl0aGVyIGRvZXMgbm90IG5lZWQgZHJvcCwgb3IgaWYgaXQg ZG9lcyBpdAorICAgICAgICAvLyBsaXZlcyBpbiBhIFJjdUJveCB3aGljaCB3aWxsIGRlbGF5IGRy b3BwaW5nIGJ5IG9uZSBncmFjZSBwZXJpb2QsIGhlbmNlCisgICAgICAgIC8vIGVuc3VyaW5nIHRo YXQgYWxsIHJlYWRlcnMgaGF2ZSBkaXNhcHBlYXJlZC4KKyAgICAgICAgdW5zYWZlIHsgZHJvcF9p bl9wbGFjZShzZWxmLmRhdGEuYXNfcHRyKCkpIH07CisKKyAgICAgICAgLy8gU0FGRVRZOiBPbmNl IGEgYERyaXZlckZlbmNlYCBpcyBpbml0aWFsaXplZCwgdGhlIGlubmVyIGBmZW5jZWAgaXMKKyAg ICAgICAgLy8gdmFsaWQgYW5kIGluaXRpYWxpemVkLiBJdCBpcyB2YWxpZCB1bnRpbCB0aGUgcmVm Y291bnQgZHJvcHMKKyAgICAgICAgLy8gdG8gMCwgd2hpY2ggY2FuIGVhcmxpZXN0IGhhcHBlbiBv bmNlIHRoZSBgRHJpdmVyRmVuY2VgIGhhcyBiZWVuIGRyb3BwZWQuCisgICAgICAgIHVuc2FmZSB7 CisgICAgICAgICAgICBiaW5kaW5nczo6ZG1hX2ZlbmNlX3B1dChmZW5jZSk7CisgICAgICAgIH0K KworICAgICAgICAvLyBUaGUgYWN0dWFsIG1lbW9yeSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGgg YSBgRHJpdmVyRmVuY2VgIGxpdmVzIGluCisgICAgICAgIC8vIGdldHMgZnJlZWQgYnkgdGhlIEMg ZG1hX2ZlbmNlIGJhY2tlbmQgb25jZSB0aGUgZmVuY2UncyByZWZjb3VudCByZWFjaGVzIDAuCisg ICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVzdC9rZXJuZWwvZG1hX2J1Zi9tb2QucnMgYi9ydXN0L2tl cm5lbC9kbWFfYnVmL21vZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw MDAuLmQ5ZGEzZGM1N2ZjZQotLS0gL2Rldi9udWxsCisrKyBiL3J1c3Qva2VybmVsL2RtYV9idWYv bW9kLnJzCkBAIC0wLDAgKzEsMTMgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwt Mi4wIE9SIE1JVAorCisvLyEgRE1BLWJ1ZiBzdWJzeXN0ZW0gYWJzdHJhY3Rpb25zLgorCitwdWIg bW9kIGRtYV9mZW5jZTsKKworcHViIHVzZSBzZWxmOjpkbWFfZmVuY2U6OnsKKyAgICBEcml2ZXJG ZW5jZSwKKyAgICBGZW5jZSwKKyAgICBGZW5jZUNiLAorICAgIEZlbmNlQ2JSZWdpc3RyYXRpb24s CisgICAgRmVuY2VDdHgsIC8vCit9OwpkaWZmIC0tZ2l0IGEvcnVzdC9rZXJuZWwvbGliLnJzIGIv cnVzdC9rZXJuZWwvbGliLnJzCmluZGV4IGI3MmIyZmJlMDQ2ZC4uYTA1Y2NhYTc1OThjIDEwMDY0 NAotLS0gYS9ydXN0L2tlcm5lbC9saWIucnMKKysrIGIvcnVzdC9rZXJuZWwvbGliLnJzCkBAIC02 Myw2ICs2Myw3IEBACiBwdWIgbW9kIGRldmljZV9pZDsKIHB1YiBtb2QgZGV2cmVzOwogcHViIG1v ZCBkbWE7CitwdWIgbW9kIGRtYV9idWY7CiBwdWIgbW9kIGRyaXZlcjsKICNbY2ZnKENPTkZJR19E Uk0gPSAieSIpXQogcHViIG1vZCBkcm07Ci0tIAoyLjU0LjAKCg==