From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A4856231832 for ; Fri, 9 May 2025 14:50:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746802249; cv=none; b=EhGa9+IM6LPxvri5xQwzfUuZdJvaFaNnLGM4mRixEyzTm8s+VXlX3U0dDLIXNLorSStpTSGIqyLK+ATRfhQUvxYuiO1tNPeLri3U7pDqH9/aLcjJkkGTh9ugjDaXuugYZWistz9ebIC7JbHFUNp7DBCOxsZWN+xT03H1O+b7FnI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746802249; c=relaxed/simple; bh=dYikGy4l7FmisGNkulEjdUDK1j5m/eToFQUWWm4DhPo=; h=Message-ID:Subject:From:To:Cc:Date:In-Reply-To:References: Content-Type:MIME-Version; b=myefZ8VUf1v8NqbVspSs/KsBauyMwGnq3pJYukMPIzea8BxK5DUuKWmjyz3pXOsrrjmM3iwdb/8cGe5o+XaYFeLd+cA5FizPQqGl/tqvQkeM7pHX3q7CFmPpW9IEIhCFnKOsrfh7usGtbdpapG6hOGPTPCRXwJqFUW6SOblp3zI= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=ayAd+xSN; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="ayAd+xSN" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1746802244; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=dYikGy4l7FmisGNkulEjdUDK1j5m/eToFQUWWm4DhPo=; b=ayAd+xSNxLtBAR6P97Zg5TfkDzUrXbo6yf2c/Pm/HlcsojoCehjwo85Xb3ewF4sRuSfxEZ /OhH23GViRgneVI4BqFFxX6ykMaJDS7x3LRRACstcLVEcI7Z62J7FkAVRe+MZKt4E45nW6 9SswdJgukJd4139rE2lE2Dhfb9dGSdo= Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-299-k2io0t3iMpizGPUnwNrKdQ-1; Fri, 09 May 2025 10:50:34 -0400 X-MC-Unique: k2io0t3iMpizGPUnwNrKdQ-1 X-Mimecast-MFC-AGG-ID: k2io0t3iMpizGPUnwNrKdQ_1746802233 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-442cdf07ad9so9757735e9.2 for ; Fri, 09 May 2025 07:50:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746802232; x=1747407032; h=mime-version:user-agent:content-transfer-encoding:autocrypt :references:in-reply-to:date:cc:to:from:subject:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=dYikGy4l7FmisGNkulEjdUDK1j5m/eToFQUWWm4DhPo=; b=b2U1x8xVsgLbNGG0CNJ/qyayqWI2j1pSSx6Vn1JQV3mLTNmDvzVFaK09/8uZb04eyU +VNZCXkOG3Hghn42ksgfOyWg7Uxpu0bZG3IkaLUaPCvV+7P2xrwo7wcIK98GW8AmRCeC xzxRFemlMvNIryy7wQsQRqc60RHxRITwSj2bcJQWEVggXJO2BTSTOG6Es/MZhMkwXDP3 r4/XtzPsy12pDvFm+VsBlkHBmofGjl1WA4K3ywUvb5FO17iCHRbte4y+f6hTlvYgylZe 8mVhJ2WkIrXUVNlVKDF17/U6uXS55cXeFZYQaZcJ/76VUexWM98EZDqlTX8+ASVG0n37 zXiQ== X-Forwarded-Encrypted: i=1; AJvYcCVPs7ILIvr0mzOVPVl59it+DyyPpkvGDsObrQsvaSbFqmZIEDBmBxPCq8OHfUzyjab/EJ0IuNIxzqoKRRg=@vger.kernel.org X-Gm-Message-State: AOJu0YxsOr9U2VAmP2idmx+ZTqOxWNoeU8Vkzm+EbmbUu8h3PLs1ZLtj i2oferEaW1HIEU7/RFAyJWIvsYdzsfdokwX3I18GKbkRMeG5ZFMKix8tIbbHDyx0911/uQfOJp8 pfT29UzlsuYBscYofKTp2e+E6DbG7tjtToC66bWmJqgmodQy3I+RsuTIRQCmuTg== X-Gm-Gg: ASbGncvcqfTI7c3D/J9SSH1PWoOqpYMFQ5fVE6l9TuBAJkNTBR8tFD+jegXeOQCzEBW 2XA+K7SO5eKkQvb/rLclwe2/DbLhOOMu5QMeg2tvZCrzyyQZpCsp/IyubJWkhnhhoMU35Pe+zKQ oyNnraPquVJ52CuZrCWjKFrj+leox/z9imQvT2ERIAZRm79rC2jCOKz+9gMvbZUClyb77jI7mmh 2gDhQohigq52NoJl5Mz1j0Iyj1GgwhG2qoA4BA0s7EYvtp4TN//K4qTgnEjEv4cMJc6vJyKA685 UnL/XZ57UIthV6PCpVuW7t84r1Ra5HFc0WinEw== X-Received: by 2002:a5d:648d:0:b0:3a0:b84d:892e with SMTP id ffacd0b85a97d-3a1f64f17b9mr2983578f8f.54.1746802232368; Fri, 09 May 2025 07:50:32 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFhgvMo0dbc6MbFG9Q3Q5D4rY1xtu2awgww+6GuL7veoDfDJiNf/+X0AAo/nKPaHoalEwroug== X-Received: by 2002:a5d:648d:0:b0:3a0:b84d:892e with SMTP id ffacd0b85a97d-3a1f64f17b9mr2983548f8f.54.1746802231802; Fri, 09 May 2025 07:50:31 -0700 (PDT) Received: from gmonaco-thinkpadt14gen3.rmtit.csb ([185.107.56.30]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a1f5a2ce36sm3469149f8f.71.2025.05.09.07.50.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 May 2025 07:50:31 -0700 (PDT) Message-ID: <817f3cb62b2632286e5c6fffde3163592a110eee.camel@redhat.com> Subject: Re: [PATCH v7 13/22] rv: Add support for LTL monitors From: Gabriele Monaco To: Nam Cao Cc: john.ogness@linutronix.de, Steven Rostedt , linux-trace-kernel@vger.kernel.org, linux-kernel@vger.kernel.org Date: Fri, 09 May 2025 16:50:29 +0200 In-Reply-To: <4a992489b5bebd8558dc42eeef0bd998686a42b4.1746776116.git.namcao@linutronix.de> References: <4a992489b5bebd8558dc42eeef0bd998686a42b4.1746776116.git.namcao@linutronix.de> Autocrypt: addr=gmonaco@redhat.com; prefer-encrypt=mutual; keydata=mDMEZuK5YxYJKwYBBAHaRw8BAQdAmJ3dM9Sz6/Hodu33Qrf8QH2bNeNbOikqYtxWFLVm0 1a0JEdhYnJpZWxlIE1vbmFjbyA8Z21vbmFjb0ByZWRoYXQuY29tPoiZBBMWCgBBFiEEysoR+AuB3R Zwp6j270psSVh4TfIFAmbiuWMCGwMFCQWjmoAFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgk Q70psSVh4TfJzZgD/TXjnqCyqaZH/Y2w+YVbvm93WX2eqBqiVZ6VEjTuGNs8A/iPrKbzdWC7AicnK xyhmqeUWOzFx5P43S1E1dhsrLWgP Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.56.1 (3.56.1-1.fc42) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 T24gRnJpLCAyMDI1LTA1LTA5IGF0IDEwOjEyICswMjAwLCBOYW0gQ2FvIHdyb3RlOgo+IFdoaWxl IGF0dGVtcHRpbmcgdG8gaW1wbGVtZW50IERBIG1vbml0b3JzIGZvciBzb21lIGNvbXBsZXgKPiBz cGVjaWZpY2F0aW9ucywKPiBkZXRlcm1pbmlzdGljIGF1dG9tYXRvbiBpcyBmb3VuZCB0byBiZSBp bmFwcHJvcHJpYXRlIGFzIHRoZQo+IHNwZWNpZmljYXRpb24KPiBsYW5ndWFnZS4gVGhlIGF1dG9t YXRvbiBpcyBjb21wbGljYXRlZCwgaGFyZCB0byB1bmRlcnN0YW5kLCBhbmQKPiBlcnJvci1wcm9u ZS4KPiAKPiBGb3IgdGhlc2UgY2FzZXMsIGxpbmVhciB0ZW1wb3JhbCBsb2dpYyBpcyBtb3JlIHN1 aXRhYmxlIGFzIHRoZQo+IHNwZWNpZmljYXRpb24gbGFuZ3VhZ2UuCj4gCj4gQWRkIHN1cHBvcnQg Zm9yIGxpbmVhciB0ZW1wb3JhbCBsb2dpYyBydW50aW1lIHZlcmlmaWNhdGlvbiBtb25pdG9yLgo+ IAo+IEZvciBhbGwgdGhlIGRldGFpbHMsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbnMgYWRkZWQgYnkg dGhpcyBjb21taXQuCj4gCj4gU2lnbmVkLW9mZi1ieTogTmFtIENhbyA8bmFtY2FvQGxpbnV0cm9u aXguZGU+Cj4gLS0tCgpJIHRyaWVkIGdlbmVyYXRpbmcgc29tZSBsZXNzIHRoYW4gdHJpdmlhbCBt b25pdG9ycyBhbmQgSSdtIGdldHRpbmcgYSBmZXcKZXJyb3JzLCBwbGVhc2UgZmluZCBiZWxvdyBz b21lIHF1ZXN0aW9ucy9jb21tZW50cy4KVGhlcmUgYXJlIGFsc28gc29tZSB0eXBvcyBpbiB0aGUg cmVmZXJlbmNlcy4KCj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHJhY2UvcnYvbGluZWFy X3RlbXBvcmFsX2xvZ2ljLnJzdCBiL0RvY3VtZW50YXRpb24vdHJhY2UvcnYvbGluZWFyX3RlbXBv cmFsX2xvZ2ljLnJzdAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAw Li42YmYxMGQ4ZTM3NjEKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvRG9jdW1lbnRhdGlvbi90cmFj ZS9ydi9saW5lYXJfdGVtcG9yYWxfbG9naWMucnN0Cj4gQEAgLTAsMCArMSwxMjIgQEAKPiArTGlu ZWFyIHRlbXBvcmFsIGxvZ2ljCj4gKz09PT09PT09PT09PT09PT09PT09PQo+ICsKPiArSW50cm9k dWN0aW9uCj4gKy0tLS0tLS0tLS0tLQo+ICsKPiArUnVudGltZSB2ZXJpZmljYXRpb24gbW9uaXRv ciBpcyBhIHZlcmlmaWNhdGlvbiB0ZWNobmlxdWUgd2hpY2ggY2hlY2tzIHRoYXQgdGhlIGtlcm5l bCBmb2xsb3dzIGEKPiArc3BlY2lmaWNhdGlvbi4gSXQgZG9lcyBzbyBieSB1c2luZyB0cmFjZXBv aW50cyB0byBtb25pdG9yIHRoZSBrZXJuZWwncyBleGVjdXRpb24gdHJhY2UsIGFuZAo+ICt2ZXJp ZnlpbmcgdGhhdCB0aGUgZXhlY3V0aW9uIHRyYWNlIHNhc3RpZmllcyB0aGUgc3BlY2lmaWNhdGlv bi4KPiArCj4gK0luaXRpYWxseSwgdGhlIHNwZWNpZmljYXRpb24gY2FuIG9ubHkgYmUgd3JpdHRl biBpbiB0aGUgZm9ybSBvZiBkZXRlcm1pbmlzdGljIGF1dG9tYXRvbiAoREEpLgo+ICtIb3dldmVy LCB3aGlsZSBhdHRlbXB0aW5nIHRvIGltcGxlbWVudCBEQSBtb25pdG9ycyBmb3Igc29tZSBjb21w bGV4IHNwZWNpZmljYXRpb25zLCBkZXRlcm1pbmlzdGljCj4gK2F1dG9tYXRvbiBpcyBmb3VuZCB0 byBiZSBpbmFwcHJvcHJpYXRlIGFzIHRoZSBzcGVjaWZpY2F0aW9uIGxhbmd1YWdlLiBUaGUgYXV0 b21hdG9uIGlzIGNvbXBsaWNhdGVkLAo+ICtoYXJkIHRvIHVuZGVyc3RhbmQsIGFuZCBlcnJvci1w cm9uZS4KPiArCj4gK1RodXMsIFJWIG1vbml0b3JzIGJhc2VkIG9uIGxpbmVhciB0ZW1wb3JhbCBs b2dpYyAoTFRMKSBhcmUgaW50cm9kdWNlZC4gVGhpcyB0eXBlIG9mIG1vbml0b3IgdXNlcyBMVEwK PiArYXMgc3BlY2lmaWNhdGlvbiBpbnN0ZWFkIG9mIERBLiBGb3Igc29tZSBjYXNlcywgd3JpdGlu ZyB0aGUgc3BlY2lmaWNhdGlvbiBhcyBMVEwgaXMgbW9yZSBjb25jaXNlIGFuZAo+ICtpbnR1aXRp dmUuCj4gKwo+ICtNYW55IG1hdGVyaWFscyBleHBsYWluIExUTCBpbiBkZXRhaWxzLiBPbmUgYm9v ayBpczo6Cj4gKwo+ICsgIENocmlzdGVsIEJhaWVyICoqYXVuZCoqIEpvb3N0LVBpZXRlciBLYXRv ZW46IFByaW5jaXBsZXMgb2YgTW9kZWwgQ2hlY2tpbmcsIFRoZSBNSVQgUHJlc3MsIDIwMDguCgpU eXBvIGhlcmUgYW5kIGFsc28gaW4gdGhlIHJlZmVyZW5jZXMgYXQgdGhlIGVuZCBvZiB0aGUgcGFn ZSAob21pdHRlZCBmb3IgYnJldml0eSkuCgogICsgIENocmlzdGVsIEJhaWVyIGFuZCBKb29zdC1Q aWV0ZXIgS2F0b2VuOiBQcmluY2lwbGVzIG9mIE1vZGVsIENoZWNraW5nLCBUaGUgTUlUIFByZXNz LCAyMDA4LgoKPiBbLi4uXQo+IGRpZmYgLS1naXQgYS90b29scy92ZXJpZmljYXRpb24vcnZnZW4v cnZnZW4vbHRsMmJhLnB5Cj4gYi90b29scy92ZXJpZmljYXRpb24vcnZnZW4vcnZnZW4vbHRsMmJh LnB5Cj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLmFhNWMzMzM5 YWFiOAo+IC0tLSAvZGV2L251bGwKPiArKysgYi90b29scy92ZXJpZmljYXRpb24vcnZnZW4vcnZn ZW4vbHRsMmJhLnB5Cj4gQEAgLTAsMCArMSw1NTggQEAKPiArIyEvdXNyL2Jpbi9lbnYgcHl0aG9u Mwo+ICsjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKPiArIwo+ICsjIElt cGxlbWVudGF0aW9uIGJhc2VkIG9uCj4gKyMgR2VydGgsIFIuLCBQZWxlZCwgRC4sIFZhcmRpLCBN LlkuLCBXb2xwZXIsIFAuICgxOTk2KS4KPiArIyBTaW1wbGUgT24tdGhlLWZseSBBdXRvbWF0aWMg VmVyaWZpY2F0aW9uIG9mIExpbmVhciBUZW1wb3JhbCBMb2dpYy4KPiArIyBodHRwczovL2RvaS5v cmcvMTAuMTAwNy85NzgtMC0zODctMzQ4OTItNl8xCj4gKyMgV2l0aCBleHRyYSBvcHRpbWl6YXRp b25zCj4gKwo+ICtmcm9tIHBseS5sZXggaW1wb3J0IGxleAo+ICtmcm9tIHBseS55YWNjIGltcG9y dCB5YWNjCj4gKwo+ICsjIEdyYW1tYXI6Cj4gKyPCoAlsdGwgOjo9IG9wZCB8ICggbHRsICkgfCBs dGwgYmlub3AgbHRsIHwgdW5vcCBsdGwKPiArIwo+ICsjIE9wZXJhbmRzIChvcGQpOgo+ICsjwqAJ dHJ1ZSwgZmFsc2UsIHVzZXItZGVmaW5lZCBuYW1lcwo+ICsjCj4gKyMgVW5hcnkgT3BlcmF0b3Jz ICh1bm9wKToKPiArI8KgwqDCoMKgwqDCoCBhbHdheXMKPiArI8KgwqDCoMKgwqDCoCBldmVudHVh bGx5Cj4gKyPCoMKgwqDCoMKgwqAgbm90Cj4gKyMKPiArIyBCaW5hcnkgT3BlcmF0b3JzIChiaW5v cCk6Cj4gKyPCoMKgwqDCoMKgwqAgdW50aWwKPiArI8KgwqDCoMKgwqDCoCBhbmQKPiArI8KgwqDC oMKgwqDCoCBvcgo+ICsjwqDCoMKgwqDCoMKgIGltcGx5Cj4gKyPCoMKgwqDCoMKgwqAgZXF1aXZh bGVudAo+ICsKPiArdG9rZW5zID0gKAo+ICvCoMKgICdBTkQnLAo+ICvCoMKgICdPUicsCj4gK8Kg wqAgJ0lNUExZJywKPiArwqDCoCAnVU5USUwnLAo+ICvCoMKgICdBTFdBWVMnLAo+ICvCoMKgICdF VkVOVFVBTExZJywKPiArwqDCoCAnVkFSSUFCTEUnLAo+ICvCoMKgICdMSVRFUkFMJywKPiArwqDC oCAnTk9UJywKPiArwqDCoCAnTFBBUkVOJywKPiArwqDCoCAnUlBBUkVOJywKPiArwqDCoCAnQVNT SUdOJywKPiArKQo+ICsKPiArdF9BTkQgPSByJ2FuZCcKPiArdF9PUiA9IHInb3InCj4gK3RfSU1Q TFkgPSByJ2ltcGx5Jwo+ICt0X1VOVElMID0gcid1bnRpbCcKPiArdF9BTFdBWVMgPSByJ2Fsd2F5 cycKPiArdF9FVkVOVFVBTExZID0gcidldmVudHVhbGx5Jwo+ICt0X1ZBUklBQkxFID0gcidbQS1a XzAtOV0rJwo+ICt0X0xJVEVSQUwgPSByJ3RydWV8ZmFsc2UnCj4gK3RfTk9UID0gcidub3QnCj4g K3RfTFBBUkVOID0gcidcKCcKPiArdF9SUEFSRU4gPSByJ1wpJwo+ICt0X0FTU0lHTiA9IHInPScK PiArdF9pZ25vcmVfQ09NTUVOVCA9IHInXCMuKicKPiArdF9pZ25vcmUgPSAnIFx0XG4nCj4gKwo+ ICtkZWYgdF9lcnJvcih0KToKPiArwqDCoMKgIHJhaXNlIFZhbHVlRXJyb3IoIklsbGVnYWwgY2hh cmFjdGVyICclcyciICUgdC52YWx1ZVswXSkKPiArCj4gK2xleGVyID0gbGV4KCkKPiArCj4gK2Ns YXNzIEdyYXBoTm9kZToKPiArwqDCoMKgIHVpZCA9IDAKPiArCj4gK8KgwqDCoCBkZWYgX19pbml0 X18oc2VsZiwgaW5jb21pbmc6IHNldFsnR3JhcGhOb2RlJ10sIG5ldywgb2xkLCBfbmV4dCk6Cj4g K8KgwqDCoMKgwqDCoMKgIHNlbGYuaW5pdCA9IEZhbHNlCj4gK8KgwqDCoMKgwqDCoMKgIHNlbGYu b3V0Z29pbmcgPSBzZXQoKQo+ICvCoMKgwqDCoMKgwqDCoCBzZWxmLmxhYmVscyA9IHNldCgpCj4g K8KgwqDCoMKgwqDCoMKgIHNlbGYuaW5jb21pbmcgPSBpbmNvbWluZy5jb3B5KCkKPiArwqDCoMKg wqDCoMKgwqAgc2VsZi5uZXcgPSBuZXcuY29weSgpCj4gK8KgwqDCoMKgwqDCoMKgIHNlbGYub2xk ID0gb2xkLmNvcHkoKQo+ICvCoMKgwqDCoMKgwqDCoCBzZWxmLm5leHQgPSBfbmV4dC5jb3B5KCkK PiArwqDCoMKgwqDCoMKgwqAgc2VsZi5pZCA9IEdyYXBoTm9kZS51aWQKPiArwqDCoMKgwqDCoMKg wqAgR3JhcGhOb2RlLnVpZCArPSAxCj4gKwo+ICvCoMKgwqAgZGVmIGV4cGFuZChzZWxmLCBub2Rl X3NldCk6Cj4gK8KgwqDCoMKgwqDCoMKgIGlmIG5vdCBzZWxmLm5ldzoKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBmb3IgbmQgaW4gbm9kZV9zZXQ6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBpZiBuZC5vbGQgPT0gc2VsZi5vbGQgYW5kIG5kLm5leHQgPT0gc2VsZi5uZXh0Ogo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBuZC5pbmNvbWluZyB8PSBz ZWxmLmluY29taW5nCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJl dHVybiBub2RlX3NldAo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBuZXdfY3VycmVudF9u b2RlID0gR3JhcGhOb2RlKHtzZWxmfSwgc2VsZi5uZXh0LCBzZXQoKSwKPiBzZXQoKSkKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gbmV3X2N1cnJlbnRfbm9kZS5leHBhbmQoe3NlbGZ9 IHwgbm9kZV9zZXQpCj4gK8KgwqDCoMKgwqDCoMKgIG4gPSBzZWxmLm5ldy5wb3AoKQo+ICvCoMKg wqDCoMKgwqDCoCByZXR1cm4gbi5leHBhbmQoc2VsZiwgbm9kZV9zZXQpCj4gKwo+ICvCoMKgwqAg ZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6Cj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBzZWxmLmlk IDwgb3RoZXIuaWQKPiArCj4gK2NsYXNzIEFTVE5vZGU6Cj4gK8KgwqDCoCB1aWQgPSAxCj4gKwo+ ICvCoMKgwqAgZGVmIF9faW5pdF9fKHNlbGYsIG9wKToKPiArwqDCoMKgwqDCoMKgwqAgc2VsZi5v cCA9IG9wCj4gK8KgwqDCoMKgwqDCoMKgIHNlbGYuaWQgPSBBU1ROb2RlLnVpZAo+ICvCoMKgwqDC oMKgwqDCoCBBU1ROb2RlLnVpZCArPSAxCj4gKwo+ICvCoMKgwqAgZGVmIF9faGFzaF9fKHNlbGYp Ogo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gaGFzaChzZWxmLm9wKQo+ICsKPiArwqDCoMKgIGRl ZiBfX2VxX18oc2VsZiwgb3RoZXIpOgo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gc2VsZiBpcyBv dGhlcgo+ICsKPiArwqDCoMKgIGRlZiBfX2l0ZXJfXyhzZWxmKToKPiArwqDCoMKgwqDCoMKgwqAg eWllbGQgc2VsZgo+ICvCoMKgwqDCoMKgwqDCoCB5aWVsZCBmcm9tIHNlbGYub3AKPiArCj4gK8Kg wqDCoCBkZWYgbmVnYXRlKHNlbGYpOgo+ICvCoMKgwqDCoMKgwqDCoCBzZWxmLm9wID0gc2VsZi5v cC5uZWdhdGUoKQo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gc2VsZgo+ICsKPiArwqDCoMKgIGRl ZiBleHBhbmQoc2VsZiwgbm9kZSwgbm9kZV9zZXQpOgo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4g c2VsZi5vcC5leHBhbmQoc2VsZiwgbm9kZSwgbm9kZV9zZXQpCj4gKwo+ICvCoMKgwqAgZGVmIF9f c3RyX18oc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgIGlmIGlzaW5zdGFuY2Uoc2VsZi5vcCwgTGl0 ZXJhbCk6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHN0cihzZWxmLm9wLnZhbHVl KQo+ICvCoMKgwqDCoMKgwqDCoCBlbGlmIGlzaW5zdGFuY2Uoc2VsZi5vcCwgVmFyaWFibGUpOgo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiBzZWxmLm9wLm5hbWUubG93ZXIoKQo+ICvC oMKgwqDCoMKgwqDCoCByZXR1cm4gInZhbCIgKyBzdHIoc2VsZi5pZCkKPiArCj4gK8KgwqDCoCBk ZWYgbm9ybWFsaXplKHNlbGYpOgo+ICvCoMKgwqDCoMKgwqDCoCAjIEdldCByaWQgb2Y6Cj4gK8Kg wqDCoMKgwqDCoMKgICPCoMKgIC0gQUxXQVlTCj4gK8KgwqDCoMKgwqDCoMKgICPCoMKgIC0gRVZF TlRVQUxMWQo+ICvCoMKgwqDCoMKgwqDCoCAjwqDCoCAtIElNUExZCj4gK8KgwqDCoMKgwqDCoMKg ICMgQW5kIG1vdmUgYWxsIHRoZSBOT1QgdG8gYmUgaW5zaWRlCj4gK8KgwqDCoMKgwqDCoMKgIHNl bGYub3AgPSBzZWxmLm9wLm5vcm1hbGl6ZSgpCj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBzZWxm Cj4gKwo+ICtjbGFzcyBCaW5hcnlPcDoKPiArwqDCoMKgIG9wX3N0ciA9ICJub3Rfc3VwcG9ydGVk Igo+ICsKPiArwqDCoMKgIGRlZiBfX2luaXRfXyhzZWxmLCBsZWZ0OiBBU1ROb2RlLCByaWdodDog QVNUTm9kZSk6Cj4gK8KgwqDCoMKgwqDCoMKgIHNlbGYubGVmdCA9IGxlZnQKPiArwqDCoMKgwqDC oMKgwqAgc2VsZi5yaWdodCA9IHJpZ2h0Cj4gKwo+ICvCoMKgwqAgZGVmIF9faGFzaF9fKHNlbGYp Ogo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gaGFzaCgoc2VsZi5sZWZ0LCBzZWxmLnJpZ2h0KSkK PiArCj4gK8KgwqDCoCBkZWYgX19pdGVyX18oc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgIHlpZWxk IGZyb20gc2VsZi5sZWZ0Cj4gK8KgwqDCoMKgwqDCoMKgIHlpZWxkIGZyb20gc2VsZi5yaWdodAo+ ICsKPiArwqDCoMKgIGRlZiBub3JtYWxpemUoc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgIHJhaXNl IE5vdEltcGxlbWVudGVkRXJyb3IKPiArCj4gK8KgwqDCoCBkZWYgbmVnYXRlKHNlbGYpOgo+ICvC oMKgwqDCoMKgwqDCoCByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCj4gKwo+ICvCoMKgwqAgZGVm IF9pc190ZW1wb3JhbChzZWxmKToKPiArwqDCoMKgwqDCoMKgwqAgcmFpc2UgTm90SW1wbGVtZW50 ZWRFcnJvcgo+ICsKPiArwqDCoMKgIGRlZiBpc190ZW1wb3JhbChzZWxmKToKPiArwqDCoMKgwqDC oMKgwqAgaWYgc2VsZi5sZWZ0Lm9wLmlzX3RlbXBvcmFsKCk6Cj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcmV0dXJuIFRydWUKPiArwqDCoMKgwqDCoMKgwqAgaWYgc2VsZi5yaWdodC5vcC5pc190 ZW1wb3JhbCgpOgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiBUcnVlCj4gK8KgwqDC oMKgwqDCoMKgIHJldHVybiBzZWxmLl9pc190ZW1wb3JhbCgpCj4gKwo+ICvCoMKgwqAgQHN0YXRp Y21ldGhvZAo+ICvCoMKgwqAgZGVmIGV4cGFuZChuOiBBU1ROb2RlLCBub2RlOiBHcmFwaE5vZGUs IG5vZGVfc2V0KSAtPgo+IHNldFtHcmFwaE5vZGVdOgo+ICvCoMKgwqDCoMKgwqDCoCByYWlzZSBO b3RJbXBsZW1lbnRlZEVycm9yCj4gKwo+ICtjbGFzcyBBbmRPcChCaW5hcnlPcCk6Cj4gK8KgwqDC oCBvcF9zdHIgPSAnJiYnCj4gKwo+ICvCoMKgwqAgZGVmIF9faW5pdF9fKHNlbGYsIGxlZnQsIHJp Z2h0KToKPiArwqDCoMKgwqDCoMKgwqAgc3VwZXIoKS5fX2luaXRfXyhsZWZ0LCByaWdodCkKPiAr Cj4gK8KgwqDCoCBkZWYgbm9ybWFsaXplKHNlbGYpOgo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4g c2VsZgo+ICsKPiArwqDCoMKgIGRlZiBuZWdhdGUoc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgIHJl dHVybiBPck9wKHNlbGYubGVmdC5uZWdhdGUoKSwgc2VsZi5yaWdodC5uZWdhdGUoKSkKPiArCj4g K8KgwqDCoCBkZWYgX2lzX3RlbXBvcmFsKHNlbGYpOgo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4g RmFsc2UKPiArCj4gK8KgwqDCoCBAc3RhdGljbWV0aG9kCj4gK8KgwqDCoCBkZWYgZXhwYW5kKG46 IEFTVE5vZGUsIG5vZGU6IEdyYXBoTm9kZSwgbm9kZV9zZXQpIC0+Cj4gc2V0W0dyYXBoTm9kZV06 Cj4gK8KgwqDCoMKgwqDCoMKgIGlmIG5vdCBuLm9wLmlzX3RlbXBvcmFsKCk6Cj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAgbm9kZS5vbGQuYWRkKG4pCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg cmV0dXJuIG5vZGUuZXhwYW5kKG5vZGVfc2V0KQo+ICsKPiArwqDCoMKgwqDCoMKgwqAgdG1wID0g R3JhcGhOb2RlKG5vZGUuaW5jb21pbmcsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgbm9kZS5uZXcgfCAoe24ub3AubGVmdCwgbi5vcC5yaWdodH0gLQo+ IG5vZGUub2xkKSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBub2RlLm9sZCB8IHtufSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBub2RlLm5leHQpCj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiB0bXAuZXhw YW5kKG5vZGVfc2V0KQo+ICsKPiArY2xhc3MgT3JPcChCaW5hcnlPcCk6Cj4gK8KgwqDCoCBvcF9z dHIgPSAnfHwnCj4gKwo+ICvCoMKgwqAgZGVmIF9faW5pdF9fKHNlbGYsIGxlZnQsIHJpZ2h0KToK PiArwqDCoMKgwqDCoMKgwqAgc3VwZXIoKS5fX2luaXRfXyhsZWZ0LCByaWdodCkKPiArCj4gK8Kg wqDCoCBkZWYgbm9ybWFsaXplKHNlbGYpOgo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gc2VsZgo+ ICsKPiArwqDCoMKgIGRlZiBuZWdhdGUoc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBB bmRPcChzZWxmLmxlZnQubmVnYXRlKCksIHNlbGYucmlnaHQubmVnYXRlKCkpCj4gKwo+ICvCoMKg wqAgZGVmIF9pc190ZW1wb3JhbChzZWxmKToKPiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIEZhbHNl Cj4gKwo+ICvCoMKgwqAgQHN0YXRpY21ldGhvZAo+ICvCoMKgwqAgZGVmIGV4cGFuZChuOiBBU1RO b2RlLCBub2RlOiBHcmFwaE5vZGUsIG5vZGVfc2V0KSAtPgo+IHNldFtHcmFwaE5vZGVdOgo+ICvC oMKgwqDCoMKgwqDCoCBpZiBub3Qgbi5vcC5pc190ZW1wb3JhbCgpOgo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIG5vZGUub2xkIHw9IHtufQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVy biBub2RlLmV4cGFuZChub2RlX3NldCkKPiArCj4gK8KgwqDCoMKgwqDCoMKgIG5vZGUxID0gR3Jh cGhOb2RlKG5vZGUuaW5jb21pbmcsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIG5vZGUubmV3IHwgKHtuLm9wLmxlZnR9IC0gbm9kZS5vbGQpLAo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBub2Rl Lm9sZCB8IHtufSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgbm9kZS5uZXh0KQo+ICvCoMKgwqDCoMKgwqDCoCBub2RlMiA9IEdyYXBoTm9kZShu b2RlLmluY29taW5nLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBub2RlLm5ldyB8ICh7bi5vcC5yaWdodH0gLSBub2RlLm9sZCksCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG5vZGUub2xkIHwg e259LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBub2RlLm5leHQpCj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBub2RlMi5leHBhbmQobm9kZTEu ZXhwYW5kKG5vZGVfc2V0KSkKPiArCj4gK2NsYXNzIFVudGlsT3AoQmluYXJ5T3ApOgo+ICvCoMKg wqAgZGVmIF9faW5pdF9fKHNlbGYsIGxlZnQsIHJpZ2h0KToKPiArwqDCoMKgwqDCoMKgwqAgc3Vw ZXIoKS5fX2luaXRfXyhsZWZ0LCByaWdodCkKPiArCj4gK8KgwqDCoCBkZWYgbm9ybWFsaXplKHNl bGYpOgo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gc2VsZgo+ICsKPiArwqDCoMKgIGRlZiBuZWdh dGUoc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBWT3Aoc2VsZi5sZWZ0Lm5lZ2F0ZSgp LCBzZWxmLnJpZ2h0Lm5lZ2F0ZSgpKQo+ICsKPiArwqDCoMKgIGRlZiBfaXNfdGVtcG9yYWwoc2Vs Zik6Cj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBUcnVlCj4gKwo+ICvCoMKgwqAgQHN0YXRpY21l dGhvZAo+ICvCoMKgwqAgZGVmIGV4cGFuZChuOiBBU1ROb2RlLCBub2RlOiBHcmFwaE5vZGUsIG5v ZGVfc2V0KSAtPgo+IHNldFtHcmFwaE5vZGVdOgo+ICvCoMKgwqDCoMKgwqDCoCBub2RlMSA9IEdy YXBoTm9kZShub2RlLmluY29taW5nLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBub2RlLm5ldyB8ICh7bi5vcC5sZWZ0fSAtIG5vZGUub2xkKSwK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbm9k ZS5vbGQgfCB7bn0sCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIG5vZGUubmV4dCB8IHtufSkKPiArwqDCoMKgwqDCoMKgwqAgbm9kZTIgPSBHcmFw aE5vZGUobm9kZS5pbmNvbWluZywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgbm9kZS5uZXcgfCAoe24ub3AucmlnaHR9IC0gbm9kZS5vbGQpLAo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBub2Rl Lm9sZCB8IHtufSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgbm9kZS5uZXh0KQo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gbm9kZTIuZXhwYW5k KG5vZGUxLmV4cGFuZChub2RlX3NldCkpCj4gKwo+ICtjbGFzcyBWT3AoQmluYXJ5T3ApOgo+ICvC oMKgwqAgZGVmIF9faW5pdF9fKHNlbGYsIGxlZnQsIHJpZ2h0KToKPiArwqDCoMKgwqDCoMKgwqAg c3VwZXIoKS5fX2luaXRfXyhsZWZ0LCByaWdodCkKPiArCj4gK8KgwqDCoCBkZWYgbm9ybWFsaXpl KHNlbGYpOgo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gc2VsZgo+ICsKPiArwqDCoMKgIGRlZiBu ZWdhdGUoc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBVbnRpbE9wKHNlbGYubGVmdC5u ZWdhdGUoKSwgc2VsZi5yaWdodC5uZWdhdGUoKSkKPiArCj4gK8KgwqDCoCBkZWYgX2lzX3RlbXBv cmFsKHNlbGYpOgo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gVHJ1ZQo+ICsKPiArwqDCoMKgIEBz dGF0aWNtZXRob2QKPiArwqDCoMKgIGRlZiBleHBhbmQobjogQVNUTm9kZSwgbm9kZTogR3JhcGhO b2RlLCBub2RlX3NldCkgLT4KPiBzZXRbR3JhcGhOb2RlXToKPiArwqDCoMKgwqDCoMKgwqAgbm9k ZTEgPSBHcmFwaE5vZGUobm9kZS5pbmNvbWluZywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbm9kZS5uZXcgfCAoe24ub3AucmlnaHR9IC0gbm9k ZS5vbGQpLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBub2RlLm9sZCB8IHtufSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgbm9kZS5uZXh0IHwge259KQo+ICvCoMKgwqDCoMKgwqDCoCBub2Rl MiA9IEdyYXBoTm9kZShub2RlLmluY29taW5nLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBub2RlLm5ldyB8ICh7bi5vcC5sZWZ0LCBuLm9wLnJp Z2h0fSAtCj4gbm9kZS5vbGQpLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBub2RlLm9sZCB8IHtufSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbm9kZS5uZXh0KQo+ICvCoMKgwqDCoMKgwqDC oCByZXR1cm4gbm9kZTIuZXhwYW5kKG5vZGUxLmV4cGFuZChub2RlX3NldCkpCj4gKwo+ICtjbGFz cyBJbXBseU9wKEJpbmFyeU9wKToKPiArwqDCoMKgIGRlZiBfX2luaXRfXyhzZWxmLCBsZWZ0LCBy aWdodCk6Cj4gK8KgwqDCoMKgwqDCoMKgIHN1cGVyKCkuX19pbml0X18obGVmdCwgcmlnaHQpCj4g Kwo+ICvCoMKgwqAgZGVmIG5vcm1hbGl6ZShzZWxmKToKPiArwqDCoMKgwqDCoMKgwqAgIyBQIC0+ IFEgPT09ICFQIHwgUQo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gT3JPcChzZWxmLmxlZnQubmVn YXRlKCksIHNlbGYucmlnaHQpCj4gKwo+ICvCoMKgwqAgZGVmIF9pc190ZW1wb3JhbChzZWxmKToK PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIEZhbHNlCj4gKwo+ICvCoMKgwqAgZGVmIG5lZ2F0ZShz ZWxmKToKPiArwqDCoMKgwqDCoMKgwqAgIyAhKFAgLT4gUSkgPT09ICEoIVAgfCBRKSA9PT0gUCAm ICFRCj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBBbmRPcChzZWxmLmxlZnQsIHNlbGYucmlnaHQu bmVnYXRlKCkpCj4gKwo+ICtjbGFzcyBVbmFyeU9wOgo+ICvCoMKgwqAgZGVmIF9faW5pdF9fKHNl bGYsIGNoaWxkOiBBU1ROb2RlKToKPiArwqDCoMKgwqDCoMKgwqAgc2VsZi5jaGlsZCA9IGNoaWxk Cj4gKwo+ICvCoMKgwqAgZGVmIF9faXRlcl9fKHNlbGYpOgo+ICvCoMKgwqDCoMKgwqDCoCB5aWVs ZCBmcm9tIHNlbGYuY2hpbGQKPiArCj4gK8KgwqDCoCBkZWYgX19oYXNoX18oc2VsZik6Cj4gK8Kg wqDCoMKgwqDCoMKgIHJldHVybiBoYXNoKHNlbGYuY2hpbGQpCj4gKwo+ICvCoMKgwqAgZGVmIG5v cm1hbGl6ZShzZWxmKToKPiArwqDCoMKgwqDCoMKgwqAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJv cgo+ICsKPiArwqDCoMKgIGRlZiBfaXNfdGVtcG9yYWwoc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKg IHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKPiArCj4gK8KgwqDCoCBkZWYgaXNfdGVtcG9yYWwo c2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgIGlmIHNlbGYuY2hpbGQub3AuaXNfdGVtcG9yYWwoKToK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gVHJ1ZQo+ICvCoMKgwqDCoMKgwqDCoCBy ZXR1cm4gc2VsZi5faXNfdGVtcG9yYWwoKQo+ICsKPiArwqDCoMKgIGRlZiBuZWdhdGUoc2VsZik6 Cj4gK8KgwqDCoMKgwqDCoMKgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKPiArCj4gK2NsYXNz IEV2ZW50dWFsbHlPcChVbmFyeU9wKToKPiArwqDCoMKgIGRlZiBfX2luaXRfXyhzZWxmLCBjaGls ZCk6Cj4gK8KgwqDCoMKgwqDCoMKgIHN1cGVyKCkuX19pbml0X18oY2hpbGQpCj4gKwo+ICvCoMKg wqAgZGVmIF9fc3RyX18oc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAiZXZlbnR1YWxs eSAiICsgc3RyKHNlbGYuY2hpbGQpCj4gKwo+ICvCoMKgwqAgZGVmIG5vcm1hbGl6ZShzZWxmKToK PiArwqDCoMKgwqDCoMKgwqAgIyA8PkYgPT0gdHJ1ZSBVIEYKPiArwqDCoMKgwqDCoMKgwqAgcmV0 dXJuIFVudGlsT3AoTGl0ZXJhbChUcnVlKSwgc2VsZi5yaWdodCkKPiArCj4gK8KgwqDCoCBkZWYg X2lzX3RlbXBvcmFsKHNlbGYpOgo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gVHJ1ZQo+ICsKPiAr wqDCoMKgIGRlZiBuZWdhdGUoc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgICMgITw+RiA9PSBbXSgh RikKPiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIEFsd2F5c09wKHNlbGYucmlnaHQubmVnYXRlKCkp Lm5vcm1hbGl6ZSgpCgpTaG91bGRuJ3QgdGhpcyBiZToKICArwqDCoMKgwqDCoMKgwqAgcmV0dXJu IEFsd2F5c09wKHNlbGYuY2hpbGQubmVnYXRlKCkpLm5vcm1hbGl6ZSgpCgo+ICsKPiArY2xhc3Mg QWx3YXlzT3AoVW5hcnlPcCk6Cj4gK8KgwqDCoCBkZWYgX19pbml0X18oc2VsZiwgY2hpbGQpOgo+ ICvCoMKgwqDCoMKgwqDCoCBzdXBlcigpLl9faW5pdF9fKGNoaWxkKQo+ICsKPiArwqDCoMKgIGRl ZiBub3JtYWxpemUoc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgICMgW11GID09PSAhKHRydWUgVSAh RikgPT0gZmFsc2UgViBGCj4gK8KgwqDCoMKgwqDCoMKgIG5ldyA9IEFTVE5vZGUoTGl0ZXJhbChG YWxzZSkpCj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBWT3AobmV3LCBzZWxmLmNoaWxkKQo+ICsK PiArwqDCoMKgIGRlZiBfaXNfdGVtcG9yYWwoc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgIHJldHVy biBUcnVlCj4gKwo+ICvCoMKgwqAgZGVmIG5lZ2F0ZShzZWxmKToKPiArwqDCoMKgwqDCoMKgwqAg IyAhW11GID09IDw+KCFGKQo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gRXZlbnR1YWxseU9wKHNl bGYubGVmdCwKPiBzZWxmLnJpZ2h0Lm5lZ2F0ZSgpKS5ub3JtYWxpemUoKQoKU2hvdWxkbid0IHRo aXMgYmU6CiAgK8KgwqDCoMKgwqDCoMKgIHJldHVybiBFdmVudHVhbGx5T3Aoc2VsZi5jaGlsZC5u ZWdhdGUoKSkubm9ybWFsaXplKCkKCj4gKwo+ICtjbGFzcyBOb3RPcChVbmFyeU9wKToKPiArwqDC oMKgIGRlZiBfX2luaXRfXyhzZWxmLCBjaGlsZCk6Cj4gK8KgwqDCoMKgwqDCoMKgIHN1cGVyKCku X19pbml0X18oY2hpbGQpCj4gKwo+ICvCoMKgwqAgZGVmIF9fc3RyX18oc2VsZik6Cj4gK8KgwqDC oMKgwqDCoMKgIHJldHVybiAiISIgKyBzdHIoc2VsZi5jaGlsZCkKPiArCj4gK8KgwqDCoCBkZWYg bm9ybWFsaXplKHNlbGYpOgo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gc2VsZi5jaGlsZC5vcC5u ZWdhdGUoKQo+ICsKPiArwqDCoMKgIGRlZiBuZWdhdGUoc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKg IHJldHVybiBzZWxmLmNoaWxkLm9wCj4gKwo+ICvCoMKgwqAgZGVmIF9pc190ZW1wb3JhbChzZWxm KToKPiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIEZhbHNlCj4gKwo+ICvCoMKgwqAgQHN0YXRpY21l dGhvZAo+ICvCoMKgwqAgZGVmIGV4cGFuZChuOiBBU1ROb2RlLCBub2RlOiBHcmFwaE5vZGUsIG5v ZGVfc2V0KSAtPgo+IHNldFtHcmFwaE5vZGVdOgo+ICvCoMKgwqDCoMKgwqDCoCBmb3IgZiBpbiBu b2RlLm9sZDoKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiBuLm9wLmNoaWxkIGlzIGY6Cj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gbm9kZV9zZXQKPiArwqDCoMKg wqDCoMKgwqAgbm9kZS5vbGQgfD0ge259Cj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBub2RlLmV4 cGFuZChub2RlX3NldCkKPiArCj4gK2NsYXNzIFZhcmlhYmxlOgo+ICvCoMKgwqAgZGVmIF9faW5p dF9fKHNlbGYsIG5hbWU6IHN0cik6Cj4gK8KgwqDCoMKgwqDCoMKgIHNlbGYubmFtZSA9IG5hbWUK PiArCj4gK8KgwqDCoCBkZWYgX19oYXNoX18oc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgIHJldHVy biBoYXNoKHNlbGYubmFtZSkKPiArCj4gK8KgwqDCoCBkZWYgX19pdGVyX18oc2VsZik6Cj4gK8Kg wqDCoMKgwqDCoMKgIHlpZWxkIGZyb20gKCkKPiArCj4gK8KgwqDCoCBkZWYgbmVnYXRlKHNlbGYp Ogo+ICvCoMKgwqDCoMKgwqDCoCBuZXcgPSBBU1ROb2RlKHNlbGYpCj4gK8KgwqDCoMKgwqDCoMKg IHJldHVybiBOb3RPcChuZXcpCj4gKwo+ICvCoMKgwqAgZGVmIG5vcm1hbGl6ZShzZWxmKToKPiAr wqDCoMKgwqDCoMKgwqAgcmV0dXJuIHNlbGYKPiArCj4gK8KgwqDCoCBkZWYgaXNfdGVtcG9yYWwo c2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBGYWxzZQo+ICsKPiArwqDCoMKgIEBzdGF0 aWNtZXRob2QKPiArwqDCoMKgIGRlZiBleHBhbmQobjogQVNUTm9kZSwgbm9kZTogR3JhcGhOb2Rl LCBub2RlX3NldCkgLT4KPiBzZXRbR3JhcGhOb2RlXToKPiArwqDCoMKgwqDCoMKgwqAgZm9yIGYg aW4gbm9kZS5vbGQ6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgaXNpbnN0YW5jZShmLCBO b3RPcCkgYW5kIGYub3AuY2hpbGQgaXMgbjoKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHJldHVybiBub2RlX3NldAo+ICvCoMKgwqDCoMKgwqDCoCBub2RlLm9sZCB8PSB7bn0KPiAr wqDCoMKgwqDCoMKgwqAgcmV0dXJuIG5vZGUuZXhwYW5kKG5vZGVfc2V0KQo+ICsKPiArY2xhc3Mg TGl0ZXJhbDoKPiArwqDCoMKgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZTogYm9vbCk6Cj4gK8Kg wqDCoMKgwqDCoMKgIHNlbGYudmFsdWUgPSB2YWx1ZQo+ICsKPiArwqDCoMKgIGRlZiBfX2l0ZXJf XyhzZWxmKToKPiArwqDCoMKgwqDCoMKgwqAgeWllbGQgZnJvbSAoKQo+ICsKPiArwqDCoMKgIGRl ZiBfX2hhc2hfXyhzZWxmKToKPiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGhhc2goc2VsZi52YWx1 ZSkKPiArCj4gK8KgwqDCoCBkZWYgX19zdHJfXyhzZWxmKToKPiArwqDCoMKgwqDCoMKgwqAgaWYg c2VsZi52YWx1ZToKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gInRydWUiCj4gK8Kg wqDCoMKgwqDCoMKgIHJldHVybiAiZmFsc2UiCj4gKwo+ICvCoMKgwqAgZGVmIG5lZ2F0ZShzZWxm KToKPiArwqDCoMKgwqDCoMKgwqAgc2VsZi52YWx1ZSA9IG5vdCBzZWxmLnZhbHVlCj4gK8KgwqDC oMKgwqDCoMKgIHJldHVybiBzZWxmCj4gKwo+ICvCoMKgwqAgZGVmIG5vcm1hbGl6ZShzZWxmKToK PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHNlbGYKPiArCj4gK8KgwqDCoCBkZWYgaXNfdGVtcG9y YWwoc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBGYWxzZQo+ICsKPiArwqDCoMKgIEBz dGF0aWNtZXRob2QKPiArwqDCoMKgIGRlZiBleHBhbmQobjogQVNUTm9kZSwgbm9kZTogR3JhcGhO b2RlLCBub2RlX3NldCkgLT4KPiBzZXRbR3JhcGhOb2RlXToKPiArwqDCoMKgwqDCoMKgwqAgaWYg bm90IG4ub3AudmFsdWU6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIG5vZGVfc2V0 Cj4gK8KgwqDCoMKgwqDCoMKgIG5vZGUub2xkIHw9IHtufQo+ICvCoMKgwqDCoMKgwqDCoCByZXR1 cm4gbm9kZS5leHBhbmQobm9kZV9zZXQpCj4gKwo+ICtkZWYgcF9zcGVjKHApOgo+ICvCoMKgwqAg JycnCj4gK8KgwqDCoCBzcGVjIDogYXNzaWduCj4gK8KgwqDCoMKgwqDCoMKgwqAgfCBhc3NpZ24g c3BlYwo+ICvCoMKgwqAgJycnCj4gK8KgwqDCoCBpZiBsZW4ocCkgPT0gMzoKPiArwqDCoMKgwqDC oMKgwqAgcFsyXS5hcHBlbmQocFsxXSkKPiArwqDCoMKgwqDCoMKgwqAgcFswXSA9IHBbMl0KPiAr wqDCoMKgIGVsc2U6Cj4gK8KgwqDCoMKgwqDCoMKgIHBbMF0gPSBbcFsxXV0KPiArCj4gK2RlZiBw X2Fzc2lnbihwKToKPiArwqDCoMKgICcnJwo+ICvCoMKgwqAgYXNzaWduIDogVkFSSUFCTEUgQVNT SUdOIGx0bAo+ICvCoMKgwqAgJycnCj4gK8KgwqDCoCBwWzBdID0gKHBbMV0sIHBbM10pCj4gKwo+ ICtkZWYgcF9sdGwocCk6Cj4gK8KgwqDCoCAnJycKPiArwqDCoMKgIGx0bCA6IG9wZAo+ICvCoMKg wqDCoMKgwqDCoCB8IGJpbm9wCj4gK8KgwqDCoMKgwqDCoMKgIHwgdW5vcAo+ICvCoMKgwqAgJycn Cj4gK8KgwqDCoCBwWzBdID0gcFsxXQo+ICsKPiArZGVmIHBfb3BkKHApOgo+ICvCoMKgwqAgJycn Cj4gK8KgwqDCoCBvcGQgOiBWQVJJQUJMRQo+ICvCoMKgwqDCoMKgwqDCoCB8IExJVEVSQUwKPiAr wqDCoMKgwqDCoMKgwqAgfCBMUEFSRU4gbHRsIFJQQVJFTgo+ICvCoMKgwqAgJycnCj4gK8KgwqDC oCBpZiBwWzFdID09ICJ0cnVlIjoKPiArwqDCoMKgwqDCoMKgwqAgcFswXSA9IEFTVE5vZGUoTGl0 ZXJhbChUcnVlKSkKPiArwqDCoMKgIGVsaWYgcFsxXSA9PSAiZmFsc2UiOgo+ICvCoMKgwqDCoMKg wqDCoCBwWzBdID0gQVNUTm9kZShMaXRlcmFsKEZhbHNlKSkKPiArwqDCoMKgIGVsaWYgcFsxXSA9 PSAnKCc6Cj4gK8KgwqDCoMKgwqDCoMKgIHBbMF0gPSBwWzJdCj4gK8KgwqDCoCBlbHNlOgo+ICvC oMKgwqDCoMKgwqDCoCBwWzBdID0gQVNUTm9kZShWYXJpYWJsZShwWzFdKSkKPiArCj4gK2RlZiBw X3Vub3AocCk6Cj4gK8KgwqDCoCAnJycKPiArwqDCoMKgIHVub3AgOiBBTFdBWVMgbHRsCj4gK8Kg wqDCoMKgwqDCoMKgwqAgfCBFVkVOVFVBTExZIGx0bAo+ICvCoMKgwqDCoMKgwqDCoMKgIHwgTk9U IGx0bAo+ICvCoMKgwqAgJycnCj4gK8KgwqDCoCBpZiBwWzFdID09ICJhbHdheXMiOgo+ICvCoMKg wqDCoMKgwqDCoCBvcCA9IEFsd2F5c09wKHBbMl0pCj4gK8KgwqDCoCBpZiBwWzFdID09ICJldmVu dHVhbGx5IjoKPiArwqDCoMKgwqDCoMKgwqAgb3AgPSBFdmVudHVhbGx5T3AocFsyXSkKPiArwqDC oMKgIGlmIHBbMV0gPT0gIm5vdCI6Cj4gK8KgwqDCoMKgwqDCoMKgIG9wID0gTm90T3AocFsyXSkK ClB5bGludCBpcyBjb21wbGFpbmluZyBhYm91dCB0aGlzIG9uZSwgd291bGRuJ3QgaXQgYmUgYmV0 dGVyIGNoYW5naW5nIGl0IHRvIGFuCmlmL2VsaWYgY2hhaW4gYW5kIGFkZGRpbmc6CgogICAgZWxz ZToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIHVuYXJ5IG9wZXJhdG9yOiAlcyIg JSBwWzFdKQoKCj4gKwo+ICvCoMKgwqAgcFswXSA9IEFTVE5vZGUob3ApCj4gKwo+ICtkZWYgcF9i aW5vcChwKToKPiArwqDCoMKgICcnJwo+ICvCoMKgwqAgYmlub3AgOiBvcGQgVU5USUwgbHRsCj4g K8KgwqDCoMKgwqDCoMKgwqDCoCB8IG9wZCBBTkQgbHRsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoCB8 IG9wZCBPUiBsdGwKPiArwqDCoMKgwqDCoMKgwqDCoMKgIHwgb3BkIElNUExZIGx0bAo+ICvCoMKg wqAgJycnCj4gK8KgwqDCoCBpZiBwWzJdID09ICJhbmQiOgo+ICvCoMKgwqDCoMKgwqDCoCBvcCA9 IEFuZE9wKHBbMV0sIHBbM10pCj4gK8KgwqDCoCBlbGlmIHBbMl0gPT0gInVudGlsIjoKPiArwqDC oMKgwqDCoMKgwqAgb3AgPSBVbnRpbE9wKHBbMV0sIHBbM10pCj4gK8KgwqDCoCBlbGlmIHBbMl0g PT0gIm9yIjoKPiArwqDCoMKgwqDCoMKgwqAgb3AgPSBPck9wKHBbMV0sIHBbM10pCj4gK8KgwqDC oCBlbGlmIHBbMl0gPT0gImltcGx5IjoKPiArwqDCoMKgwqDCoMKgwqAgb3AgPSBJbXBseU9wKHBb MV0sIHBbM10pCj4gK8KgwqDCoCBlbHNlOgo+ICvCoMKgwqDCoMKgwqDCoCByYWlzZSBWYWx1ZUVy cm9yKCJJbnZhbGlkIGJpbmFyeSBvcGVyYXRvcjogJXMiICUgcFsyXSkKPiArCj4gK8KgwqDCoCBw WzBdID0gQVNUTm9kZShvcCkKPiArCj4gK3BhcnNlciA9IHlhY2MoKQo+ICsKPiArZGVmIHBhcnNl X2x0bChzOiBzdHIpIC0+IEFTVE5vZGU6Cj4gK8KgwqDCoCBzcGVjID0gcGFyc2VyLnBhcnNlKHMp Cj4gKwo+ICvCoMKgwqAgc3ViZXhwciA9IGRpY3QoKQo+ICsKPiArwqDCoMKgIGZvciBhc3NpZ24g aW4gc3BlYzoKPiArwqDCoMKgwqDCoMKgwqAgaWYgYXNzaWduWzBdID09ICJSVUxFIjoKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBydWxlID0gYXNzaWduWzFdCj4gK8KgwqDCoMKgwqDCoMKgIGVs c2U6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3ViZXhwclthc3NpZ25bMF1dID0gYXNzaWdu WzFdCgpydWxlIG1heSBiZSB1bmRlZmluZWQgaGVyZSAoYnV0IEkgZ3Vlc3MgcHl0aG9uIHdpbGwg anVzdCBzYXkgdmFyaWFibGUgcnVsZSBpcwp1bmRlZmluZWQgYW5kIGl0IHdvdWxkIGJlIHF1aXRl IGNsZWFyIHRoZSBsdGwgZGlkbid0IHN0YXJ0IHdpdGggYSBydWxlLgoKSSdtIHN0aWxsIGdldHRp bmcgYSBmZXcgbW9yZSBlcnJvcnMgYnV0IG15IG1vZGVsIG1heSBiZSB0byBibGFtZSwgc3RpbGwg bmVlZCB0bwpwbGF5IGEgYml0LgoKQ2hlZXJzLApHYWJyaWVsZQoKPiArCj4gK8KgwqDCoCBmb3Ig bm9kZSBpbiBydWxlOgo+ICvCoMKgwqDCoMKgwqDCoCBpZiBub3QgaXNpbnN0YW5jZShub2RlLm9w LCBWYXJpYWJsZSk6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29udGludWUKPiArwqDCoMKg wqDCoMKgwqAgcmVwbGFjZSA9IHN1YmV4cHIuZ2V0KG5vZGUub3AubmFtZSkKPiArwqDCoMKgwqDC oMKgwqAgaWYgcmVwbGFjZSBpcyBub3QgTm9uZToKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBu b2RlLm9wID0gcmVwbGFjZS5vcAo+ICsKPiArwqDCoMKgIHJldHVybiBydWxlCj4gKwo+ICtkZWYg Y3JlYXRlX2dyYXBoKHM6IHN0cik6Cj4gK8KgwqDCoCBhdG9tcyA9IHNldCgpCj4gKwo+ICvCoMKg wqAgbHRsID0gcGFyc2VfbHRsKHMpCj4gK8KgwqDCoCBmb3IgYyBpbiBsdGw6Cj4gK8KgwqDCoMKg wqDCoMKgIGMubm9ybWFsaXplKCkKPiArwqDCoMKgwqDCoMKgwqAgaWYgaXNpbnN0YW5jZShjLm9w LCBWYXJpYWJsZSk6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYXRvbXMuYWRkKGMub3AubmFt ZSkKPiArCj4gK8KgwqDCoCBpbml0ID0gR3JhcGhOb2RlKHNldCgpLCBzZXQoKSwgc2V0KCksIHNl dCgpKQo+ICvCoMKgwqAgaGVhZCA9IEdyYXBoTm9kZSh7aW5pdH0sIHtsdGx9LCBzZXQoKSwgc2V0 KCkpCj4gK8KgwqDCoCBncmFwaCA9IHNvcnRlZChoZWFkLmV4cGFuZChzZXQoKSkpCj4gKwo+ICvC oMKgwqAgZm9yIGksIG5vZGUgaW4gZW51bWVyYXRlKGdyYXBoKToKPiArwqDCoMKgwqDCoMKgwqAg IyBUaGUgaWQgYXNzaWdubWVudCBkdXJpbmcgZ3JhcGggZ2VuZXJhdGlvbiBoYXMgZ2Fwcy4KPiBS ZWFzc2lnbiB0aGVtCj4gK8KgwqDCoMKgwqDCoMKgIG5vZGUuaWQgPSBpCj4gKwo+ICvCoMKgwqDC oMKgwqDCoCBmb3IgaW5jb21pbmcgaW4gbm9kZS5pbmNvbWluZzoKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBpZiBpbmNvbWluZyBpcyBpbml0Ogo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgbm9kZS5pbml0ID0gVHJ1ZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVsc2U6Cj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbmNvbWluZy5vdXRnb2luZy5hZGQobm9k ZSkKPiArwqDCoMKgwqDCoMKgwqAgZm9yIG8gaW4gbm9kZS5vbGQ6Cj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgaWYgbm90IG8ub3AuaXNfdGVtcG9yYWwoKToKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIG5vZGUubGFiZWxzLmFkZChzdHIobykpCj4gKwo+ICvCoMKgwqAgcmV0dXJu IHNvcnRlZChhdG9tcyksIGdyYXBoLCBsdGwKPiBkaWZmIC0tZ2l0IGEvdG9vbHMvdmVyaWZpY2F0 aW9uL3J2Z2VuL3J2Z2VuL2x0bDJrLnB5Cj4gYi90b29scy92ZXJpZmljYXRpb24vcnZnZW4vcnZn ZW4vbHRsMmsucHkKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMC4u YjhkYTkwOTRmYjRmCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL3Rvb2xzL3ZlcmlmaWNhdGlvbi9y dmdlbi9ydmdlbi9sdGwyay5weQo+IEBAIC0wLDAgKzEsMjQ1IEBACj4gKyMhL3Vzci9iaW4vZW52 IHB5dGhvbjMKPiArIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Cj4gKwo+ ICtmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKPiArZnJvbSAuIGltcG9ydCBnZW5lcmF0b3IKPiAr ZnJvbSAuIGltcG9ydCBsdGwyYmEKPiArCj4gK0NPTFVNTl9MSU1JVCA9IDEwMAo+ICsKPiArZGVm IGxpbmVfbGVuKGxpbmU6IHN0cikgLT4gaW50Ogo+ICvCoMKgwqAgdGFicyA9IGxpbmUuY291bnQo J1x0JykKPiArwqDCoMKgIHJldHVybiB0YWJzICogNyArIGxlbihsaW5lKQo+ICsKPiArZGVmIGJy ZWFrX2xvbmdfbGluZShsaW5lOiBzdHIsIGluZGVudD0nJykgLT4gbGlzdFtzdHJdOgo+ICvCoMKg wqAgcmVzdWx0ID0gW10KPiArwqDCoMKgIHdoaWxlIGxpbmVfbGVuKGxpbmUpID4gQ09MVU1OX0xJ TUlUOgo+ICvCoMKgwqDCoMKgwqDCoCBpID0gbGluZVs6Q09MVU1OX0xJTUlUIC0gbGluZV9sZW4o bGluZSldLnJmaW5kKCcgJykKPiArwqDCoMKgwqDCoMKgwqAgcmVzdWx0LmFwcGVuZChsaW5lWzpp XSkKPiArwqDCoMKgwqDCoMKgwqAgbGluZSA9IGluZGVudCArIGxpbmVbaSArIDE6XQo+ICvCoMKg wqAgaWYgbGluZToKPiArwqDCoMKgwqDCoMKgwqAgcmVzdWx0LmFwcGVuZChsaW5lKQo+ICvCoMKg wqAgcmV0dXJuIHJlc3VsdAo+ICsKPiArZGVmIGJ1aWxkX2NvbmRpdGlvbl9zdHJpbmcobm9kZTog bHRsMmJhLkdyYXBoTm9kZSk6Cj4gK8KgwqDCoCBpZiBub3Qgbm9kZS5sYWJlbHM6Cj4gK8KgwqDC oMKgwqDCoMKgIHJldHVybiAiKHRydWUpIgo+ICsKPiArwqDCoMKgIHJlc3VsdCA9ICIoIgo+ICsK PiArwqDCoMKgIGZpcnN0ID0gVHJ1ZQo+ICvCoMKgwqAgZm9yIGxhYmVsIGluIHNvcnRlZChub2Rl LmxhYmVscyk6Cj4gK8KgwqDCoMKgwqDCoMKgIGlmIG5vdCBmaXJzdDoKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCByZXN1bHQgKz0gIiAmJiAiCj4gK8KgwqDCoMKgwqDCoMKgIHJlc3VsdCArPSBs YWJlbAo+ICvCoMKgwqDCoMKgwqDCoCBmaXJzdCA9IEZhbHNlCj4gKwo+ICvCoMKgwqAgcmVzdWx0 ICs9ICIpIgo+ICsKPiArwqDCoMKgIHJldHVybiByZXN1bHQKPiArCj4gK2RlZiBhYmJyZXZpYXRl X2F0b21zKGF0b21zOiBsaXN0W3N0cl0pIC0+IGxpc3Rbc3RyXToKPiArwqDCoMKgIGRlZiBzaG9y dGVuKHM6IHN0cikgLT4gc3RyOgo+ICvCoMKgwqDCoMKgwqDCoCBza2lwID0gWyJpcyIsICJieSIs ICJvciIsICJhbmQiXQo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gJ18nLmpvaW4oW3hbOjJdIGZv ciB4IGluIHMubG93ZXIoKS5zcGxpdCgnXycpIGlmIHgKPiBub3QgaW4gc2tpcF0pCj4gKwo+ICvC oMKgwqAgYWJicnMgPSBbXQo+ICvCoMKgwqAgZm9yIGF0b20gaW4gYXRvbXM6Cj4gK8KgwqDCoMKg wqDCoMKgIGZvciBpIGluIHJhbmdlKGxlbihhdG9tKSwgLTEsIC0xKToKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBpZiBzdW0oYS5zdGFydHN3aXRoKGF0b21bOmldKSBmb3IgYSBpbiBhdG9tcykg PiAxOgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWsKPiArwqDCoMKgwqDC oMKgwqAgc2hhcmUgPSBhdG9tWzppXQo+ICvCoMKgwqDCoMKgwqDCoCB1bmlxdWUgPSBhdG9tW2k6 XQo+ICvCoMKgwqDCoMKgwqDCoCBhYmJycy5hcHBlbmQoKHNob3J0ZW4oc2hhcmUpICsgc2hvcnRl bih1bmlxdWUpKSkKPiArwqDCoMKgIHJldHVybiBhYmJycwo+ICsKPiArY2xhc3MgbHRsMmsoZ2Vu ZXJhdG9yLk1vbml0b3IpOgo+ICvCoMKgwqAgdGVtcGxhdGVfZGlyID0gImx0bDJrIgo+ICsKPiAr wqDCoMKgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlX3BhdGgsIE1vbml0b3JUeXBlLCBleHRyYV9w YXJhbXM9e30pOgo+ICvCoMKgwqDCoMKgwqDCoCBpZiBNb25pdG9yVHlwZSAhPSAicGVyX3Rhc2si Ogo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoIk9u bHkgcGVyX3Rhc2sgbW9uaXRvciBpcwo+IHN1cHBvcnRlZCBmb3IgTFRMIikKPiArwqDCoMKgwqDC oMKgwqAgc3VwZXIoKS5fX2luaXRfXyhleHRyYV9wYXJhbXMpCj4gK8KgwqDCoMKgwqDCoMKgIHdp dGggb3BlbihmaWxlX3BhdGgpIGFzIGY6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2VsZi5h dG9tcywgc2VsZi5iYSwgc2VsZi5sdGwgPQo+IGx0bDJiYS5jcmVhdGVfZ3JhcGgoZi5yZWFkKCkp Cj4gK8KgwqDCoMKgwqDCoMKgIHNlbGYuYXRvbXNfYWJiciA9IGFiYnJldmlhdGVfYXRvbXMoc2Vs Zi5hdG9tcykKPiArwqDCoMKgwqDCoMKgwqAgc2VsZi5uYW1lID0gZXh0cmFfcGFyYW1zLmdldCgi bW9kZWxfbmFtZSIpCj4gK8KgwqDCoMKgwqDCoMKgIGlmIG5vdCBzZWxmLm5hbWU6Cj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgc2VsZi5uYW1lID0gUGF0aChmaWxlX3BhdGgpLnN0ZW0KPiArCj4g K8KgwqDCoCBkZWYgX2ZpbGxfc3RhdGVzKHNlbGYpIC0+IHN0cjoKPiArwqDCoMKgwqDCoMKgwqAg YnVmID0gWwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJlbnVtIGx0bF9idWNoaV9zdGF0ZSB7 IiwKPiArwqDCoMKgwqDCoMKgwqAgXQo+ICsKPiArwqDCoMKgwqDCoMKgwqAgZm9yIG5vZGUgaW4g c2VsZi5iYToKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBidWYuYXBwZW5kKCJcdFMlaSwiICUg bm9kZS5pZCkKPiArwqDCoMKgwqDCoMKgwqAgYnVmLmFwcGVuZCgiXHRSVl9OVU1fQkFfU1RBVEVT IikKPiArwqDCoMKgwqDCoMKgwqAgYnVmLmFwcGVuZCgifTsiKQo+ICvCoMKgwqDCoMKgwqDCoCBi dWYuYXBwZW5kKCJzdGF0aWNfYXNzZXJ0KFJWX05VTV9CQV9TVEFURVMgPD0KPiBSVl9NQVhfQkFf U1RBVEVTKTsiKQo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gYnVmCj4gKwo+ICvCoMKgwqAgZGVm IF9maWxsX2F0b21zKHNlbGYpOgo+ICvCoMKgwqDCoMKgwqDCoCBidWYgPSBbImVudW0gbHRsX2F0 b20geyJdCj4gK8KgwqDCoMKgwqDCoMKgIGZvciBhIGluIHNvcnRlZChzZWxmLmF0b21zKToKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBidWYuYXBwZW5kKCJcdExUTF8lcywiICUgYSkKPiArwqDC oMKgwqDCoMKgwqAgYnVmLmFwcGVuZCgiXHRMVExfTlVNX0FUT00iKQo+ICvCoMKgwqDCoMKgwqDC oCBidWYuYXBwZW5kKCJ9OyIpCj4gK8KgwqDCoMKgwqDCoMKgIGJ1Zi5hcHBlbmQoInN0YXRpY19h c3NlcnQoTFRMX05VTV9BVE9NIDw9Cj4gUlZfTUFYX0xUTF9BVE9NKTsiKQo+ICvCoMKgwqDCoMKg wqDCoCByZXR1cm4gYnVmCj4gKwo+ICvCoMKgwqAgZGVmIF9maWxsX2F0b21zX3RvX3N0cmluZyhz ZWxmKToKPiArwqDCoMKgwqDCoMKgwqAgYnVmID0gWwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg ICJzdGF0aWMgY29uc3QgY2hhciAqbHRsX2F0b21fc3RyKGVudW0gbHRsX2F0b20gYXRvbSkiLAo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJ7IiwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAi XHRzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbmFtZXNbXSA9IHsiCj4gK8KgwqDCoMKgwqDCoMKg IF0KPiArCj4gK8KgwqDCoMKgwqDCoMKgIGZvciBuYW1lIGluIHNlbGYuYXRvbXNfYWJicjoKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBidWYuYXBwZW5kKCJcdFx0XCIlc1wiLCIgJSBuYW1lKQo+ ICsKPiArwqDCoMKgwqDCoMKgwqAgYnVmLmV4dGVuZChbCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqAgIlx0fTsiLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICIiLAo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgICJcdHJldHVybiBuYW1lc1thdG9tXTsiLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICJ9Igo+ICvCoMKgwqDCoMKgwqDCoCBdKQo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gYnVm Cj4gKwo+ICvCoMKgwqAgZGVmIF9maWxsX2F0b21fdmFsdWVzKHNlbGYpOgo+ICvCoMKgwqDCoMKg wqDCoCBidWYgPSBbXQo+ICvCoMKgwqDCoMKgwqDCoCBmb3Igbm9kZSBpbiBzZWxmLmx0bDoKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiBub2RlLm9wLmlzX3RlbXBvcmFsKCk6Cj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZQo+ICsKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBpZiBpc2luc3RhbmNlKG5vZGUub3AsIGx0bDJiYS5WYXJpYWJsZSk6Cj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBidWYuYXBwZW5kKCJcdGJvb2wgJXMgPSB0ZXN0X2Jp dChMVExfJXMsIG1vbi0KPiA+YXRvbXMpOyIgJSAobm9kZSwgbm9kZS5vcC5uYW1lKSkKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBlbGlmIGlzaW5zdGFuY2Uobm9kZS5vcCwgbHRsMmJhLkFuZE9w KToKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJ1Zi5hcHBlbmQoIlx0Ym9vbCAl cyA9ICVzICYmICVzOyIgJSAobm9kZSwKPiBub2RlLm9wLmxlZnQsIG5vZGUub3AucmlnaHQpKQo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVsaWYgaXNpbnN0YW5jZShub2RlLm9wLCBsdGwyYmEu T3JPcCk6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBidWYuYXBwZW5kKCJcdGJv b2wgJXMgPSAlcyB8fCAlczsiICUgKG5vZGUsCj4gbm9kZS5vcC5sZWZ0LCBub2RlLm9wLnJpZ2h0 KSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlbGlmIGlzaW5zdGFuY2Uobm9kZS5vcCwgbHRs MmJhLk5vdE9wKToKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJ1Zi5hcHBlbmQo Ilx0Ym9vbCAlcyA9ICElczsiICUgKG5vZGUsCj4gbm9kZS5vcC5jaGlsZCkpCj4gK8KgwqDCoMKg wqDCoMKgIGJ1Zi5yZXZlcnNlKCkKPiArCj4gK8KgwqDCoMKgwqDCoMKgIGJ1ZjIgPSBbXQo+ICvC oMKgwqDCoMKgwqDCoCBmb3IgbGluZSBpbiBidWY6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg YnVmMi5leHRlbmQoYnJlYWtfbG9uZ19saW5lKGxpbmUsICJcdMKgwqDCoMKgICIpKQo+ICvCoMKg wqDCoMKgwqDCoCByZXR1cm4gYnVmMgo+ICsKPiArwqDCoMKgIGRlZiBfZmlsbF90cmFuc2l0aW9u cyhzZWxmKToKPiArwqDCoMKgwqDCoMKgwqAgYnVmID0gWwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICJzdGF0aWMgdm9pZCIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgImx0bF9wb3NzaWJs ZV9uZXh0X3N0YXRlcyhzdHJ1Y3QgbHRsX21vbml0b3IgKm1vbiwKPiB1bnNpZ25lZCBpbnQgc3Rh dGUsIHVuc2lnbmVkIGxvbmcgKm5leHQpIiwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAieyIK PiArwqDCoMKgwqDCoMKgwqAgXQo+ICvCoMKgwqDCoMKgwqDCoCBidWYuZXh0ZW5kKHNlbGYuX2Zp bGxfYXRvbV92YWx1ZXMoKSkKPiArwqDCoMKgwqDCoMKgwqAgYnVmLmV4dGVuZChbCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgIiIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIlx0c3dpdGNo IChzdGF0ZSkgeyIKPiArwqDCoMKgwqDCoMKgwqAgXSkKPiArCj4gK8KgwqDCoMKgwqDCoMKgIGZv ciBub2RlIGluIHNlbGYuYmE6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnVmLmFwcGVuZCgi XHRjYXNlIFMlaToiICUgbm9kZS5pZCkKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9y IG8gaW4gc29ydGVkKG5vZGUub3V0Z29pbmcpOgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgbGluZcKgwqAgPSAiXHRcdGlmICIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGluZGVudCA9ICJcdFx0wqDCoCAiCj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgbGluZSArPSBidWlsZF9jb25kaXRpb25fc3RyaW5nKG8pCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBsaW5lcyA9IGJyZWFrX2xvbmdfbGluZShsaW5lLCBpbmRlbnQpCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBidWYuZXh0ZW5kKGxpbmVzKQo+ICsKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJ1Zi5hcHBlbmQoIlx0XHRcdF9fc2V0X2Jp dChTJWksIG5leHQpOyIgJSBvLmlkKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJ1Zi5hcHBl bmQoIlx0XHRicmVhazsiKQo+ICvCoMKgwqDCoMKgwqDCoCBidWYuZXh0ZW5kKFsKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAiXHR9IiwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAifSIKPiAr wqDCoMKgwqDCoMKgwqAgXSkKPiArCj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBidWYKPiArCj4g K8KgwqDCoCBkZWYgX2ZpbGxfc3RhcnQoc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgIGJ1ZiA9IFsK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAic3RhdGljIHZvaWQgbHRsX3N0YXJ0KHN0cnVjdCB0 YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0Cj4gbHRsX21vbml0b3IgKm1vbikiLAo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgICJ7Igo+ICvCoMKgwqDCoMKgwqDCoCBdCj4gK8KgwqDCoMKgwqDCoMKg IGJ1Zi5leHRlbmQoc2VsZi5fZmlsbF9hdG9tX3ZhbHVlcygpKQo+ICvCoMKgwqDCoMKgwqDCoCBi dWYuYXBwZW5kKCIiKQo+ICsKPiArwqDCoMKgwqDCoMKgwqAgZm9yIG5vZGUgaW4gc2VsZi5iYToK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiBub3Qgbm9kZS5pbml0Ogo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgY29udGludWUKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqAgbGluZcKgwqAgPSAiXHRpZiAiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW5kZW50ID0g Ilx0wqDCoCAiCj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxpbmUgKz0gYnVpbGRfY29u ZGl0aW9uX3N0cmluZyhub2RlKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxpbmVzID0gYnJl YWtfbG9uZ19saW5lKGxpbmUsIGluZGVudCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBidWYu ZXh0ZW5kKGxpbmVzKQo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBidWYuYXBwZW5kKCJc dFx0X19zZXRfYml0KFMlaSwgbW9uLT5zdGF0ZXMpOyIgJSBub2RlLmlkKQo+ICvCoMKgwqDCoMKg wqDCoCBidWYuYXBwZW5kKCJ9IikKPiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGJ1Zgo+ICsKPiAr wqDCoMKgIGRlZiBmaWxsX3RyYWNlcG9pbnRfaGFuZGxlcnNfc2tlbChzZWxmKToKPiArwqDCoMKg wqDCoMKgwqAgYnVmZiA9IFtdCj4gK8KgwqDCoMKgwqDCoMKgIGJ1ZmYuYXBwZW5kKCJzdGF0aWMg dm9pZCBoYW5kbGVfZXhhbXBsZV9ldmVudCh2b2lkICpkYXRhLCAvKgo+IFhYWDogZmlsbCBoZWFk ZXIgKi8pIikKPiArwqDCoMKgwqDCoMKgwqAgYnVmZi5hcHBlbmQoInsiKQo+ICvCoMKgwqDCoMKg wqDCoCBidWZmLmFwcGVuZCgiXHRsdGxfYXRvbV91cGRhdGUodGFzaywgTFRMXyVzLCB0cnVlL2Zh bHNlKTsiICUKPiBzZWxmLmF0b21zWzBdKQo+ICvCoMKgwqDCoMKgwqDCoCBidWZmLmFwcGVuZCgi fSIpCj4gK8KgwqDCoMKgwqDCoMKgIGJ1ZmYuYXBwZW5kKCIiKQo+ICvCoMKgwqDCoMKgwqDCoCBy ZXR1cm4gJ1xuJy5qb2luKGJ1ZmYpCj4gKwo+ICvCoMKgwqAgZGVmIGZpbGxfdHJhY2Vwb2ludF9h dHRhY2hfcHJvYmUoc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAiXHRydl9hdHRhY2hf dHJhY2VfcHJvYmUoXCIlc1wiLCAvKiBYWFg6IHRyYWNlcG9pbnQKPiAqLywgaGFuZGxlX2V4YW1w bGVfZXZlbnQpOyIgXAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJSBzZWxmLm5h bWUKPiArCj4gK8KgwqDCoCBkZWYgZmlsbF90cmFjZXBvaW50X2RldGFjaF9oZWxwZXIoc2VsZik6 Cj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAiXHRydl9kZXRhY2hfdHJhY2VfcHJvYmUoXCIlc1wi LCAvKiBYWFg6IHRyYWNlcG9pbnQKPiAqLywgaGFuZGxlX3NhbXBsZV9ldmVudCk7IiBcCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAlIHNlbGYubmFtZQo+ICsKPiArwqDCoMKgIGRl ZiBmaWxsX2F0b21zX2luaXQoc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgIGJ1ZmYgPSBbXQo+ICvC oMKgwqDCoMKgwqDCoCBmb3IgYSBpbiBzZWxmLmF0b21zOgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGJ1ZmYuYXBwZW5kKCJcdGx0bF9hdG9tX3NldChtb24sIExUTF8lcywgdHJ1ZS9mYWxzZSk7 IiAlCj4gYSkKPiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuICdcbicuam9pbihidWZmKQo+ICsKPiAr wqDCoMKgIGRlZiBmaWxsX21vZGVsX2goc2VsZik6Cj4gK8KgwqDCoMKgwqDCoMKgIGJ1ZiA9IFsK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAiLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQ TC0yLjAgKi8iLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICIiLAo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgICIjaW5jbHVkZSA8bGludXgvcnYuaD4iLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICIiLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICIjZGVmaW5lIE1PTklUT1JfTkFNRSAi ICsgc2VsZi5uYW1lLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICIiCj4gK8KgwqDCoMKgwqDC oMKgIF0KPiArCj4gK8KgwqDCoMKgwqDCoMKgIGJ1Zi5leHRlbmQoc2VsZi5fZmlsbF9hdG9tcygp KQo+ICvCoMKgwqDCoMKgwqDCoCBidWYuYXBwZW5kKCcnKQo+ICsKPiArwqDCoMKgwqDCoMKgwqAg YnVmLmV4dGVuZChzZWxmLl9maWxsX2F0b21zX3RvX3N0cmluZygpKQo+ICvCoMKgwqDCoMKgwqDC oCBidWYuYXBwZW5kKCcnKQo+ICsKPiArwqDCoMKgwqDCoMKgwqAgYnVmLmV4dGVuZChzZWxmLl9m aWxsX3N0YXRlcygpKQo+ICvCoMKgwqDCoMKgwqDCoCBidWYuYXBwZW5kKCcnKQo+ICsKPiArwqDC oMKgwqDCoMKgwqAgYnVmLmV4dGVuZChzZWxmLl9maWxsX3N0YXJ0KCkpCj4gK8KgwqDCoMKgwqDC oMKgIGJ1Zi5hcHBlbmQoJycpCj4gKwo+ICvCoMKgwqDCoMKgwqDCoCBidWYuZXh0ZW5kKHNlbGYu X2ZpbGxfdHJhbnNpdGlvbnMoKSkKPiArwqDCoMKgwqDCoMKgwqAgYnVmLmFwcGVuZCgnJykKPiAr Cj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAnXG4nLmpvaW4oYnVmKQo+ICsKPiArwqDCoMKgIGRl ZiBmaWxsX21vbml0b3JfY2xhc3NfdHlwZShzZWxmKToKPiArwqDCoMKgwqDCoMKgwqAgcmV0dXJu ICJMVExfTU9OX0VWRU5UU19JRCIKPiArCj4gK8KgwqDCoCBkZWYgZmlsbF9tb25pdG9yX2NsYXNz KHNlbGYpOgo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gImx0bF9tb25pdG9yX2lkIgo+ICsKPiAr wqDCoMKgIGRlZiBmaWxsX21haW5fYyhzZWxmKToKPiArwqDCoMKgwqDCoMKgwqAgbWFpbl9jID0g c3VwZXIoKS5maWxsX21haW5fYygpCj4gK8KgwqDCoMKgwqDCoMKgIG1haW5fYyA9IG1haW5fYy5y ZXBsYWNlKCIlJUFUT01TX0lOSVQlJSIsCj4gc2VsZi5maWxsX2F0b21zX2luaXQoKSkKPiArCj4g K8KgwqDCoMKgwqDCoMKgIHJldHVybiBtYWluX2MKPiBkaWZmIC0tZ2l0IGEvdG9vbHMvdmVyaWZp Y2F0aW9uL3J2Z2VuL3J2Z2VuL3RlbXBsYXRlcy9sdGwyay9tYWluLmMKPiBiL3Rvb2xzL3Zlcmlm aWNhdGlvbi9ydmdlbi9ydmdlbi90ZW1wbGF0ZXMvbHRsMmsvbWFpbi5jCj4gbmV3IGZpbGUgbW9k ZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjJmM2M0ZDY0Mjc0Ngo+IC0tLSAvZGV2L251 bGwKPiArKysgYi90b29scy92ZXJpZmljYXRpb24vcnZnZW4vcnZnZW4vdGVtcGxhdGVzL2x0bDJr L21haW4uYwo+IEBAIC0wLDAgKzEsMTAyIEBACj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wCj4gKyNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KPiArI2luY2x1ZGUgPGxpbnV4 L3RyYWNlcG9pbnQuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+ICsjaW5jbHVkZSA8 bGludXgvbW9kdWxlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Cj4gKyNpbmNsdWRlIDxs aW51eC9ydi5oPgo+ICsjaW5jbHVkZSA8cnYvaW5zdHJ1bWVudGF0aW9uLmg+Cj4gKwo+ICsjZGVm aW5lIE1PRFVMRV9OQU1FICIlJU1PREVMX05BTUUlJSIKPiArCj4gKy8qCj4gKyAqIFhYWDogaW5j bHVkZSByZXF1aXJlZCB0cmFjZXBvaW50IGhlYWRlcnMsIGUuZy4sCj4gKyAqICNpbmNsdWRlIDx0 cmFjZS9ldmVudHMvc2NoZWQuaD4KPiArICovCj4gKyNpbmNsdWRlIDxydl90cmFjZS5oPgo+ICsl JUlOQ0xVREVfUEFSRU5UJSUKPiArCj4gKy8qCj4gKyAqIFRoaXMgaXMgdGhlIHNlbGYtZ2VuZXJh dGVkIHBhcnQgb2YgdGhlIG1vbml0b3IuIEdlbmVyYWxseSwgdGhlcmUKPiBpcyBubyBuZWVkCj4g KyAqIHRvIHRvdWNoIHRoaXMgc2VjdGlvbi4KPiArICovCj4gKyNpbmNsdWRlICIlJU1PREVMX05B TUUlJS5oIgo+ICsjaW5jbHVkZSA8cnYvbHRsX21vbml0b3IuaD4KPiArCj4gK3N0YXRpYyB2b2lk IGx0bF9hdG9tc19mZXRjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdAo+IGx0bF9t b25pdG9yICptb24pCj4gK3sKPiArCS8qCj4gKwkgKiBUaGlzIGlzIGNhbGxlZCBldmVyeXRpbWUg dGhlIEJ1Y2hpIGF1dG9tYXRvbiBpcwo+IHRyaWdnZXJlZC4KPiArCSAqCj4gKwkgKiBUaGlzIGZ1 bmN0aW9uIGNvdWxkIGJlIHVzZWQgdG8gZmV0Y2ggdGhlIGF0b21pYwo+IHByb3Bvc2l0aW9ucyB3 aGljaCBhcmUgZXhwZW5zaXZlIHRvCj4gKwkgKiB0cmFjZS4gSXQgaXMgcG9zc2libGUgb25seSBp ZiB0aGUgYXRvbWljIHByb3Bvc2l0aW9uIGRvZXMKPiBub3QgbmVlZCB0byBiZSB1cGRhdGVkIGF0 Cj4gKwkgKiBwcmVjaXNlIHRpbWUuCj4gKwkgKgo+ICsJICogSXQgaXMgcmVjb21tZW5kZWQgdG8g dXNlIHRyYWNlcG9pbnRzIGFuZAo+IGx0bF9hdG9tX3VwZGF0ZSgpIGluc3RlYWQuCj4gKwkgKi8K PiArfQo+ICsKPiArc3RhdGljIHZvaWQgbHRsX2F0b21zX2luaXQoc3RydWN0IHRhc2tfc3RydWN0 ICp0YXNrLCBzdHJ1Y3QKPiBsdGxfbW9uaXRvciAqbW9uLCBib29sIHRhc2tfY3JlYXRpb24pCj4g K3sKPiArCS8qCj4gKwkgKiBUaGlzIHNob3VsZCBpbml0aWFsaXplIGFzIG1hbnkgYXRvbWljIHBy b3Bvc2l0aW9ucyBhcwo+IHBvc3NpYmxlLgo+ICsJICoKPiArCSAqIEB0YXNrX2NyZWF0aW9uIGlu ZGljYXRlcyB3aGV0aGVyIHRoZSB0YXNrIGlzIGJlaW5nCj4gY3JlYXRlZC4gVGhpcyBpcyBmYWxz ZSBpZiB0aGUgdGFzayBpcwo+ICsJICogYWxyZWFkeSBydW5uaW5nIGJlZm9yZSB0aGUgbW9uaXRv ciBpcyBlbmFibGVkLgo+ICsJICovCj4gKyUlQVRPTVNfSU5JVCUlCj4gK30KPiArCj4gKy8qCj4g KyAqIFRoaXMgaXMgdGhlIGluc3RydW1lbnRhdGlvbiBwYXJ0IG9mIHRoZSBtb25pdG9yLgo+ICsg Kgo+ICsgKiBUaGlzIGlzIHRoZSBzZWN0aW9uIHdoZXJlIG1hbnVhbCB3b3JrIGlzIHJlcXVpcmVk LiBIZXJlIHRoZQo+IGtlcm5lbCBldmVudHMKPiArICogYXJlIHRyYW5zbGF0ZWQgaW50byBtb2Rl bCdzIGV2ZW50Lgo+ICsgKi8KPiArJSVUUkFDRVBPSU5UX0hBTkRMRVJTX1NLRUwlJQo+ICtzdGF0 aWMgaW50IGVuYWJsZV8lJU1PREVMX05BTUUlJSh2b2lkKQo+ICt7Cj4gKwlpbnQgcmV0dmFsOwo+ ICsKPiArCXJldHZhbCA9IGx0bF9tb25pdG9yX2luaXQoKTsKPiArCWlmIChyZXR2YWwpCj4gKwkJ cmV0dXJuIHJldHZhbDsKPiArCj4gKyUlVFJBQ0VQT0lOVF9BVFRBQ0glJQo+ICsKPiArCXJldHVy biAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkaXNhYmxlXyUlTU9ERUxfTkFNRSUlKHZvaWQp Cj4gK3sKPiArJSVUUkFDRVBPSU5UX0RFVEFDSCUlCj4gKwo+ICsJbHRsX21vbml0b3JfZGVzdHJv eSgpOwo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBUaGlzIGlzIHRoZSBtb25pdG9yIHJlZ2lzdGVyIHNl Y3Rpb24uCj4gKyAqLwo+ICtzdGF0aWMgc3RydWN0IHJ2X21vbml0b3IgcnZfJSVNT0RFTF9OQU1F JSUgPSB7Cj4gKwkubmFtZSA9ICIlJU1PREVMX05BTUUlJSIsCj4gKwkuZGVzY3JpcHRpb24gPSAi JSVERVNDUklQVElPTiUlIiwKPiArCS5lbmFibGUgPSBlbmFibGVfJSVNT0RFTF9OQU1FJSUsCj4g KwkuZGlzYWJsZSA9IGRpc2FibGVfJSVNT0RFTF9OQU1FJSUsCj4gK307Cj4gKwo+ICtzdGF0aWMg aW50IF9faW5pdCByZWdpc3Rlcl8lJU1PREVMX05BTUUlJSh2b2lkKQo+ICt7Cj4gKwlyZXR1cm4g cnZfcmVnaXN0ZXJfbW9uaXRvcigmcnZfJSVNT0RFTF9OQU1FJSUsICUlUEFSRU5UJSUpOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2V4aXQgdW5yZWdpc3Rlcl8lJU1PREVMX05BTUUlJSh2b2lk KQo+ICt7Cj4gKwlydl91bnJlZ2lzdGVyX21vbml0b3IoJnJ2XyUlTU9ERUxfTkFNRSUlKTsKPiAr fQo+ICsKPiArbW9kdWxlX2luaXQocmVnaXN0ZXJfJSVNT0RFTF9OQU1FJSUpOwo+ICttb2R1bGVf ZXhpdCh1bnJlZ2lzdGVyXyUlTU9ERUxfTkFNRSUlKTsKPiArCj4gK01PRFVMRV9MSUNFTlNFKCJH UEwiKTsKPiArTU9EVUxFX0FVVEhPUigvKiBUT0RPICovKTsKPiArTU9EVUxFX0RFU0NSSVBUSU9O KCIlJU1PREVMX05BTUUlJTogJSVERVNDUklQVElPTiUlIik7Cj4gZGlmZiAtLWdpdCBhL3Rvb2xz L3ZlcmlmaWNhdGlvbi9ydmdlbi9ydmdlbi90ZW1wbGF0ZXMvbHRsMmsvdHJhY2UuaAo+IGIvdG9v bHMvdmVyaWZpY2F0aW9uL3J2Z2VuL3J2Z2VuL3RlbXBsYXRlcy9sdGwyay90cmFjZS5oCj4gbmV3 IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjQ5Mzk0YzRiMGYxYwo+IC0t LSAvZGV2L251bGwKPiArKysgYi90b29scy92ZXJpZmljYXRpb24vcnZnZW4vcnZnZW4vdGVtcGxh dGVzL2x0bDJrL3RyYWNlLmgKPiBAQCAtMCwwICsxLDE0IEBACj4gKy8qIFNQRFgtTGljZW5zZS1J ZGVudGlmaWVyOiBHUEwtMi4wICovCj4gKwo+ICsvKgo+ICsgKiBTbmlwcGV0IHRvIGJlIGluY2x1 ZGVkIGluIHJ2X3RyYWNlLmgKPiArICovCj4gKwo+ICsjaWZkZWYgQ09ORklHX1JWX01PTl8lJU1P REVMX05BTUVfVVAlJQo+ICtERUZJTkVfRVZFTlQoZXZlbnRfJSVNT05JVE9SX0NMQVNTJSUsIGV2 ZW50XyUlTU9ERUxfTkFNRSUlLAo+ICsJwqDCoMKgwqAgVFBfUFJPVE8oc3RydWN0IHRhc2tfc3Ry dWN0ICp0YXNrLCBjaGFyICpzdGF0ZXMsIGNoYXIKPiAqYXRvbXMsIGNoYXIgKm5leHQpLAo+ICsJ wqDCoMKgwqAgVFBfQVJHUyh0YXNrLCBzdGF0ZXMsIGF0b21zLCBuZXh0KSk7Cj4gK0RFRklORV9F VkVOVChlcnJvcl8lJU1PTklUT1JfQ0xBU1MlJSwgZXJyb3JfJSVNT0RFTF9OQU1FJSUsCj4gKwnC oMKgwqDCoCBUUF9QUk9UTyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spLAo+ICsJwqDCoMKgwqAg VFBfQVJHUyh0YXNrKSk7Cj4gKyNlbmRpZiAvKiBDT05GSUdfUlZfTU9OXyUlTU9ERUxfTkFNRV9V UCUlICovCg==