Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wRw4y-002osM-0W for pgsql-hackers@arkaria.postgresql.org; Tue, 26 May 2026 18:00:37 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wRw4u-005X6D-2b for pgsql-hackers@arkaria.postgresql.org; Tue, 26 May 2026 18:00:33 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wRw4u-005X64-0T for pgsql-hackers@lists.postgresql.org; Tue, 26 May 2026 18:00:33 +0000 Received: from meesny.iki.fi ([2001:67c:2b0:1c1::201]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1wRw4r-00000000tTu-0SfG for pgsql-hackers@lists.postgresql.org; Tue, 26 May 2026 18:00:32 +0000 Received: from [10.0.2.15] (unknown [130.41.208.2]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: hlinnaka) by meesny.iki.fi (Postfix) with ESMTPSA id 4gQ0sF4lRbzyRb; Tue, 26 May 2026 21:00:17 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1779818419; 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: in-reply-to:in-reply-to:references:references; bh=3pSZSet2KF3yLr2lR+3hCG3rHclfX0XbFpgJJpb2VGc=; b=tu+N+jovpLOfNbKEod7rwzOQ+MgMr5jUOAFjlFJ0nfHF45ObsxzJDC4FLGd51ykZhsteN5 lEKsYR88clLXRvmWLKXinetl25tJC1ANZMLULbX7kiTHHrGSIj03KQnaF4AjrdW4zbJvIk a/n2q9eEvr74+DdjqbH0EGXx4wx2FaM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1779818419; 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: in-reply-to:in-reply-to:references:references; bh=3pSZSet2KF3yLr2lR+3hCG3rHclfX0XbFpgJJpb2VGc=; b=KjKvYiyDJVwMUbw72kaeZsEAshJCqwesyTPei4aXwfLhKiyaiJ7tAcG+NDFNTAiyM00f63 5orSAw+O4vKQGwdFXtvtaIA08yGnfO4SozCakZm0GEX2gZVXv6rOxO5D8I0HQao7jqPLFL 5eMKUzph7J9nD1U6T8p8ylJti6yCr+c= ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=meesny; cv=none; t=1779818419; b=wpzn2o1S0qfcXjvcykaQf5/8L0+fsz9poZJ7udbkGbszqQ5GImmGECM92MC8OozvZ18/t+ XmyCtAbv0wFNcuG5xkhWAKGWe1X9bBnBFMmuFUPKpAEUZlpnx/Srp/KaDUVTQEaphYqowN F1NJ1edcoUoLK1KeBN1g2DNynaJbrrw= ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=hlinnaka smtp.mailfrom=hlinnaka@iki.fi Content-Type: multipart/mixed; boundary="------------11yL5R6bxRT3GvJ6StfyD7Az" Message-ID: Date: Tue, 26 May 2026 21:00:11 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Avoid orphaned objects dependencies, take 3 To: Bertrand Drouvot , Robert Haas Cc: Jeff Davis , Roman Eskin , Michael Paquier , Alexander Lakhin , pgsql-hackers@lists.postgresql.org, Tom Lane References: <298d95b5570b91a7d0ee42895e79890feefc67d6.camel@j-davis.com> <9f5f0dd4-96d5-4d90-9436-62d96e0298f9@arenadata.io> Content-Language: en-US From: Heikki Linnakangas In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------11yL5R6bxRT3GvJ6StfyD7Az Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 18/05/2026 15:14, Bertrand Drouvot wrote: > On Wed, May 13, 2026 at 04:20:21PM -0400, Robert Haas wrote: >> On Tue, Apr 28, 2026 at 7:17 AM Bertrand Drouvot >> wrote: >>> 0003: Add Assert guard to detect permission check before lock regressions >>> >>> Add instrumentation under USE_ASSERT_CHECKING to detect cases where object_aclcheck() >>> is called on a referenced object before a lock is held on it, which would widen >>> the TOCTOU window between the permission check and the dependency recording. >> >> I really like the idea of having some kind of cross-check system that >> can detect future (or current) coding mistakes. > > Thanks for the feedback! BTW, it detected a new one due to 4793fc41f82, so v21 > attached does fix it to make the CI green. I had a closer look at patch 0001. It doesn't fix all the problems, we definitely need patch 0002/0003 too, but it's a good step forward and I think it makes sense to commit it independently. So I'm focusing on that now. I noticed we are already doing essentially the same thing for shared dependencies, in shdepLockAndCheckObject(). I see that you even copied the function comment from shdepLockAndCheckObject() to LockNotPinnedObject(), but I didn't see it being otherwise mentioned in this thread. In any case, that's a good argument for doing the same for non-shared dependencies that we already do for shared dependencies. > + if (object->classId == RelationRelationId) > + { > + /* skip shared relations as they are pinned */ > + if (IsSharedRelation(object->objectId)) > + return; > + > + /* > + * We must be in one of the two following cases that would already > + * prevent the relation to be dropped: 1. The relation is already > + * locked (could be an existing relation or a relation that we are > + * creating). 2. The relation is protected indirectly (i.e an index > + * protected by a lock on its table, a table protected by a lock on a > + * function that depends of the table...). To avoid any risks, acquire > + * a lock if there is none. That may add unnecessary lock for 2. but > + * that's worth it. > + */ > + if (!CheckRelationOidLockedByMe(object->objectId, AccessShareLock, true)) > + LockRelationOid(object->objectId, AccessShareLock); > + return; > + } Hmm, shouldn't that re-check that the relation exists, after acquiring the lock, like the non-relation codepath does? Otherwise it's a little pointless to acquire the lock. I did a bunch of little refactorings and ended up with the attached. Notable changes: - I renamed and moved LockNotPinnedObject() into dependencyLockAndCheckObject(), for consistency with shdepLockAndCheckObject(). - Removed ObjectByIdExist(), inlined it into the caller. The argument to use SnapshotSelf or not seemed a bit too special to be generally useful - Changed the error message and code to rhyme with the existing "role was concurrently dropped" errors. I didn't add the OID to the error message however, because that makes the testing hard. It'd be nice to have a general masking mechanism for OIDs and XIDs in error messages in tests, but now is not the time for that. - Added a test for a dependency on a role too, to cover the existing shdepLockAndCheckObject() function. It's currently disabled because it prints the OID, though. - Heikki --------------11yL5R6bxRT3GvJ6StfyD7Az Content-Type: text/x-patch; charset=UTF-8; name="v22-0001-Avoid-orphaned-objects-dependencies.patch" Content-Disposition: attachment; filename="v22-0001-Avoid-orphaned-objects-dependencies.patch" Content-Transfer-Encoding: base64 RnJvbSBkNTE1MjNkOTAwM2M5MDJmMzk2OGUxNzRmMTU4YzI3NjgwZWFiNDI3IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBCZXJ0cmFuZCBEcm91dm90IDxiZXJ0cmFuZGRyb3V2 b3QucGdAZ21haWwuY29tPgpEYXRlOiBNb24sIDI3IEFwciAyMDI2IDE0OjAxOjQ2ICswMDAw ClN1YmplY3Q6IFtQQVRDSCB2MjIgMS8xXSBBdm9pZCBvcnBoYW5lZCBvYmplY3RzIGRlcGVu ZGVuY2llcwoKQ29uY3VycmVudCBEREwgY2FuIGNyZWF0ZSBvcnBoYW5lZCBkZXBlbmRlbmNp ZXMgaW4gcGdfZGVwZW5kLCBvYmplY3RzCnJlZmVyZW5jaW5nIG90aGVyIG9iamVjdHMgdGhh dCBubyBsb25nZXIgZXhpc3QuIEZvciBleGFtcGxlOgoKU2NlbmFyaW8gMToKCnNlc3Npb24g MTogYmVnaW47IGRyb3Agc2NoZW1hIHNjaGVtOwpzZXNzaW9uIDI6IGNyZWF0ZSBhIGZ1bmN0 aW9uIGluIHRoZSBzY2hlbWEgc2NoZW0Kc2Vzc2lvbiAxOiBjb21taXQ7CgpXaXRoIHRoZSBh Ym92ZSwgdGhlIGZ1bmN0aW9uIGNyZWF0ZWQgaW4gc2Vzc2lvbiAyIHdvdWxkIGJlIGxpbmtl ZCB0byBhIG5vbgpleGlzdGluZyBzY2hlbWEuCgpTY2VuYXJpbyAyOgoKc2Vzc2lvbiAxOiBi ZWdpbjsgY3JlYXRlIGEgZnVuY3Rpb24gaW4gdGhlIHNjaGVtYSBzY2hlbQpzZXNzaW9uIDI6 IGRyb3Agc2NoZW1hIHNjaGVtOwpzZXNzaW9uIDE6IGNvbW1pdDsKCldpdGggdGhlIGFib3Zl LCB0aGUgZnVuY3Rpb24gY3JlYXRlZCBpbiBzZXNzaW9uIDEgd291bGQgYmUgbGlua2VkIHRv IGEgbm9uCmV4aXN0aW5nIHNjaGVtYS4KCkZpeCBieSBhY3F1aXJpbmcgQWNjZXNzU2hhcmVM b2NrIG9uIHJlZmVyZW5jZWQgb2JqZWN0cyB3aGVuIHJlY29yZGluZwpkZXBlbmRlbmNpZXMu IFRoaXMgY29uZmxpY3RzIHdpdGggQWNjZXNzRXhjbHVzaXZlTG9jayB0YWtlbiBieSBEUk9Q LApwcmV2ZW50aW5nIHRoZSByYWNlLiBBZnRlciBhY3F1aXJpbmcgdGhlIGxvY2ssIHZlcmlm eSB0aGUgb2JqZWN0IHN0aWxsCmV4aXN0cywgaWYgaXQgd2FzIGRyb3BwZWQgY29uY3VycmVu dGx5LCByZXBvcnQgYW4gZXJyb3IuCgpUaGUgbG9jayBhbmQgY2hlY2sgaXMgZG9uZSBpbiBi b3RoIHJlY29yZE11bHRpcGxlRGVwZW5kZW5jaWVzKCkgYW5kCmNoYW5nZURlcGVuZGVuY3lG b3IoKS4KClRoZSBwYXRjaCBhZGRzIGEgZmV3IHRlc3RzIGZvciBzb21lIGRlcGVuZGVuY3kg Y2FzZXMgKHRoYXQgd291bGQgY3VycmVudGx5IHByb2R1Y2UKb3JwaGFuZWQgb2JqZWN0cyk6 CgotIHNjaGVtYSBhbmQgZnVuY3Rpb24gKGFzIHRoZSBhYm92ZSBzY2VuYXJpb3MpCi0gYWx0 ZXIgYSBkZXBlbmRlbmN5IChmdW5jdGlvbiBhbmQgc2NoZW1hKQotIGZ1bmN0aW9uIGFuZCBh cmcgdHlwZQotIGZ1bmN0aW9uIGFuZCByZXR1cm4gdHlwZQotIGZ1bmN0aW9uIGFuZCBmdW5j dGlvbgotIGRvbWFpbiBhbmQgZG9tYWluCi0gdGFibGUgYW5kIHR5cGUKLSBzZXJ2ZXIgYW5k IGZvcmVpZ24gZGF0YSB3cmFwcGVyCgpBdXRob3I6IEJlcnRyYW5kIERyb3V2b3QgPGJlcnRy YW5kZHJvdXZvdC5wZ0BnbWFpbC5jb20+ClJldmlld2VkLWJ5OiBIZWlra2kgTGlubmFrYW5n YXMgPGhlaWtraS5saW5uYWthbmdhc0Bpa2kuZmk+CkRpc2N1c3Npb246IGh0dHBzOi8vcG9z dGdyLmVzL20vWmlZam4wZVZjN3B4Vlk0NUBpcC0xMC05Ny0xLTM0LmV1LXdlc3QtMy5jb21w dXRlLmludGVybmFsCi0tLQogc3JjL2JhY2tlbmQvY2F0YWxvZy9wZ19kZXBlbmQuYyAgICAg ICAgICAgICAgIHwgMTMwICsrKysrKysrKysrKysrKysrCiAuLi4vZXhwZWN0ZWQvdGVzdF9k ZXBlbmRlbmNpZXNfbG9ja3Mub3V0ICAgICAgfCAxMzcgKysrKysrKysrKysrKysrKysrCiBz cmMvdGVzdC9pc29sYXRpb24vaXNvbGF0aW9uX3NjaGVkdWxlICAgICAgICAgfCAgIDEgKwog Li4uL3NwZWNzL3Rlc3RfZGVwZW5kZW5jaWVzX2xvY2tzLnNwZWMgICAgICAgIHwgMTA4ICsr KysrKysrKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2FsdGVyX3RhYmxlLm91 dCAgICAgfCAgMTEgKy0KIDUgZmlsZXMgY2hhbmdlZCwgMzgyIGluc2VydGlvbnMoKyksIDUg ZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvaXNvbGF0aW9uL2V4 cGVjdGVkL3Rlc3RfZGVwZW5kZW5jaWVzX2xvY2tzLm91dAogY3JlYXRlIG1vZGUgMTAwNjQ0 IHNyYy90ZXN0L2lzb2xhdGlvbi9zcGVjcy90ZXN0X2RlcGVuZGVuY2llc19sb2Nrcy5zcGVj CgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY2F0YWxvZy9wZ19kZXBlbmQuYyBiL3NyYy9i YWNrZW5kL2NhdGFsb2cvcGdfZGVwZW5kLmMKaW5kZXggMDdjMmQ0MWMxODkuLmZmMTdkNTg1 MGM1IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jYXRhbG9nL3BnX2RlcGVuZC5jCisrKyBi L3NyYy9iYWNrZW5kL2NhdGFsb2cvcGdfZGVwZW5kLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNp bmNsdWRlICJhY2Nlc3MvdGFibGUuaCIKICNpbmNsdWRlICJjYXRhbG9nL2NhdGFsb2cuaCIK ICNpbmNsdWRlICJjYXRhbG9nL2RlcGVuZGVuY3kuaCIKKyNpbmNsdWRlICJjYXRhbG9nL2lu ZGV4LmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9pbmRleGluZy5oIgogI2luY2x1ZGUgImNhdGFs b2cvcGdfY29uc3RyYWludC5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfZGVwZW5kLmgiCkBA IC0yNywxMyArMjgsMTcgQEAKICNpbmNsdWRlICJjYXRhbG9nL3BhcnRpdGlvbi5oIgogI2lu Y2x1ZGUgImNvbW1hbmRzL2V4dGVuc2lvbi5oIgogI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgor I2luY2x1ZGUgInN0b3JhZ2UvbG1nci5oIgorI2luY2x1ZGUgInN0b3JhZ2UvbG9jay5oIgog I2luY2x1ZGUgInV0aWxzL2ZtZ3JvaWRzLmgiCiAjaW5jbHVkZSAidXRpbHMvbHN5c2NhY2hl LmgiCiAjaW5jbHVkZSAidXRpbHMvcmVsLmgiCisjaW5jbHVkZSAidXRpbHMvc25hcG1nci5o IgogI2luY2x1ZGUgInV0aWxzL3N5c2NhY2hlLmgiCiAKIAogc3RhdGljIGJvb2wgaXNPYmpl Y3RQaW5uZWQoY29uc3QgT2JqZWN0QWRkcmVzcyAqb2JqZWN0KTsKK3N0YXRpYyB2b2lkIGRl cGVuZGVuY3lMb2NrQW5kQ2hlY2tPYmplY3QoT2lkIGNsYXNzSWQsIE9pZCBvYmplY3RJZCk7 CiAKIAogLyoKQEAgLTEwOSw2ICsxMTQsMTIgQEAgcmVjb3JkTXVsdGlwbGVEZXBlbmRlbmNp ZXMoY29uc3QgT2JqZWN0QWRkcmVzcyAqZGVwZW5kZXIsCiAJCWlmIChpc09iamVjdFBpbm5l ZChyZWZlcmVuY2VkKSkKIAkJCWNvbnRpbnVlOwogCisJCS8qCisJCSAqIEFjcXVpcmUgYSBs b2NrIGFuZCBjaGVjayBvYmplY3Qgc3RpbGwgZXhpc3RzIHdoaWxlIHJlY29yZGluZyB0aGUK KwkJICogZGVwZW5kZW5jeS4KKwkJICovCisJCWRlcGVuZGVuY3lMb2NrQW5kQ2hlY2tPYmpl Y3QocmVmZXJlbmNlZC0+Y2xhc3NJZCwgcmVmZXJlbmNlZC0+b2JqZWN0SWQpOworCiAJCWlm IChzbG90X2luaXRfY291bnQgPCBtYXhfc2xvdHMpCiAJCXsKIAkJCXNsb3Rbc2xvdF9zdG9y ZWRfY291bnRdID0gTWFrZVNpbmdsZVR1cGxlVGFibGVTbG90KFJlbGF0aW9uR2V0RGVzY3Io ZGVwZW5kRGVzYyksCkBAIC01MDcsNiArNTE4LDEzIEBAIGNoYW5nZURlcGVuZGVuY3lGb3Io T2lkIGNsYXNzSWQsIE9pZCBvYmplY3RJZCwKIAkJcmV0dXJuIDE7CiAJfQogCisJLyoKKwkg KiBNYWtlIHN1cmUgdGhlIG5ldyByZWZlcmVuY2VkIG9iamVjdCBkb2Vzbid0IGdvIGF3YXkg d2hpbGUgd2UgcmVjb3JkIHRoZQorCSAqIGRlcGVuZGVuY3kuCisJICovCisJaWYgKCFuZXdJ c1Bpbm5lZCkKKwkJZGVwZW5kZW5jeUxvY2tBbmRDaGVja09iamVjdChyZWZDbGFzc0lkLCBu ZXdSZWZPYmplY3RJZCk7CisKIAlkZXBSZWwgPSB0YWJsZV9vcGVuKERlcGVuZFJlbGF0aW9u SWQsIFJvd0V4Y2x1c2l2ZUxvY2spOwogCiAJLyogVGhlcmUgc2hvdWxkIGJlIGV4aXN0aW5n IGRlcGVuZGVuY3kgcmVjb3JkKHMpLCBzbyBzZWFyY2guICovCkBAIC03MTQsNiArNzMyLDEx OCBAQCBpc09iamVjdFBpbm5lZChjb25zdCBPYmplY3RBZGRyZXNzICpvYmplY3QpCiB9CiAK IAorLyoKKyAqIGRlcGVuZGVuY3lMb2NrQW5kQ2hlY2tPYmplY3QKKyAqCisgKiBMb2NrIHRo ZSBvYmplY3QgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gcmVjb3JkIGEgZGVwZW5kZW5jeSBvbi4g IEFmdGVyIGl0J3MKKyAqIGxvY2tlZCwgdmVyaWZ5IHRoYXQgaXQgaGFzbid0IGJlZW4gZHJv cHBlZCB3aGlsZSB3ZSB3ZXJlbid0IGxvb2tpbmcuICBJZgorICogdGhlIG9iamVjdCBoYXMg YmVlbiBkcm9wcGVkLCBhbiBlcnJvciBpcyB0aHJvd24uCisgKgorICogSWYgdGhlIGNhbGxl ciBhbHJlYWR5IGhvbGRzIGEgbG9jayB0aGF0IGNvbmZsaWN0cyB3aXRoIERST1AKKyAqIChB Y2Nlc3NTaGFyZUxvY2sgb3Igc3Ryb25nZXIpLCB0aGlzIGRvZXMgbm90aGluZy4gIFRoYXQg aXMgdGhlIGRlc2lyZWQgY2FzZQorICogLSBjYWxsZXJzIHNob3VsZCBhY3F1aXJlIHRoZSBs b2NrIHdoZW4gdGhleSBsb29rIHVwIHRoZSBvYmplY3QgYWxyZWFkeSAtCisgKiBidXQgbWFu eSBjYWxsZXJzIGFyZSBza2lwcGluZyBpdCBjdXJyZW50bHkuICBUaGlzIGlzIGEgYmFja3N0 b3AgdG8gbWFrZQorICogdGhhdCB3ZSBkb24ndCByZWNvcmQgYSBib2d1cyByZWZlcmVuY2Ug cGVybWFuZW50bHkgaW4gdGhlIGNhdGFsb2dzLiAgSW4gdGhlCisgKiBmdXR1cmUsIGFmdGVy IHdlIGhhdmUgdGlnaHRlbmVkIHVwIGFsbCB0aGUgY2FsbGVycywgdGhpcyBjb3VsZCBqdXN0 IHZlcmlmeQorICogdGhhdCBhbGwgdGhlIG9iamVjdHMgYXJlIGluZGVlZCBsb2NrZWQgYW5k IHRocm93IGFuIGVycm9yIGlmIG5vdC4KKyAqLworc3RhdGljIHZvaWQKK2RlcGVuZGVuY3lM b2NrQW5kQ2hlY2tPYmplY3QoT2lkIGNsYXNzSWQsIE9pZCBvYmplY3RJZCkKK3sKKwkvKgor CSAqIFBpbm5lZCBvYmplY3RzIGNhbm5vdCBiZSBkcm9wcGVkIGNvbmN1cnJlbnRseSwgYW5k IGNhbGxlcnMgY2hlY2tlZCB0aGlzCisJICogYWxyZWFkeS4KKwkgKi8KKwlBc3NlcnQoIUlz UGlubmVkT2JqZWN0KGNsYXNzSWQsIG9iamVjdElkKSk7CisKKwlpZiAoY2xhc3NJZCAhPSBS ZWxhdGlvblJlbGF0aW9uSWQpCisJeworCQlMT0NLVEFHCQl0YWc7CisJCVN5c0NhY2hlSWRl bnRpZmllciBjYWNoZTsKKwkJUmVsYXRpb24gcmVsOworCQlTeXNTY2FuRGVzYyBzY2FuOwor CQlTY2FuS2V5RGF0YSBza2V5OworCQlIZWFwVHVwbGUgdHVwbGU7CisKKwkJU0VUX0xPQ0tU QUdfT0JKRUNUKHRhZywKKwkJCQkJCSAgIE15RGF0YWJhc2VJZCwKKwkJCQkJCSAgIGNsYXNz SWQsCisJCQkJCQkgICBvYmplY3RJZCwKKwkJCQkJCSAgIDApOworCisJCWlmIChMb2NrSGVs ZEJ5TWUoJnRhZywgQWNjZXNzU2hhcmVMb2NrLCB0cnVlKSkKKwkJCXJldHVybjsKKworCQkv KiBBc3N1bWUgd2Ugc2hvdWxkIGxvY2sgdGhlIHdob2xlIG9iamVjdCBub3QgYSBzdWItb2Jq ZWN0ICovCisJCUxvY2tEYXRhYmFzZU9iamVjdChjbGFzc0lkLCBvYmplY3RJZCwgMCwgQWNj ZXNzU2hhcmVMb2NrKTsKKworCQkvKgorCQkgKiBDaGVjayB0aGF0IHRoZSBvYmplY3Qgc3Rp bGwgZXhpc3RzLiAgSWYgdGhlIGNhdGFsb2cgaGFzIGEgc3VpdGFibGUKKwkJICogc3lzY2Fj aGUsIGNoZWNrIHRoYXQgZmlyc3QuCisJCSAqLworCQljYWNoZSA9IGdldF9vYmplY3RfY2F0 Y2FjaGVfb2lkKGNsYXNzSWQpOworCQlpZiAoY2FjaGUgIT0gU1lTQ0FDSEVJRF9JTlZBTElE KQorCQl7CisJCQlpZiAoU2VhcmNoU3lzQ2FjaGVFeGlzdHMxKGNhY2hlLCBPYmplY3RJZEdl dERhdHVtKG9iamVjdElkKSkpCisJCQkJcmV0dXJuOworCQl9CisKKwkJLyoKKwkJICogSWYg aXQncyBub3QgZm91bmQgaW4gdGhlIHN5c2NhY2hlLCBvciB0aGVyZSdzIG5vIHN1aXRhYmxl IHN5c2NhY2hlCisJCSAqIHdlIGNhbiB1c2UsIHNjYW4gdGhlIGNhdGFsb2cgdGFibGUgdXNp bmcgU25hcHNob3RTZWxmLiAgVGhpcworCQkgKiBoYW5kbGVzIHRoZSBjYXNlIHRoYXQgaXQn cyBhbiBvYmplY3Qgd2UganVzdCBjcmVhdGVkIChmb3IgZXhhbXBsZSwKKwkJICogaWYgaXQn cyBhIGNvbXBvc2l0ZSB0eXBlIGNyZWF0ZWQgYXMgcGFydCBvZiBjcmVhdGluZyBhIHRhYmxl KS4KKwkJICovCisJCXJlbCA9IHRhYmxlX29wZW4oY2xhc3NJZCwgQWNjZXNzU2hhcmVMb2Nr KTsKKworCQlTY2FuS2V5SW5pdCgmc2tleSwKKwkJCQkJZ2V0X29iamVjdF9hdHRudW1fb2lk KGNsYXNzSWQpLAorCQkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJCQkJ CU9iamVjdElkR2V0RGF0dW0ob2JqZWN0SWQpKTsKKworCQlzY2FuID0gc3lzdGFibGVfYmVn aW5zY2FuKHJlbCwgZ2V0X29iamVjdF9vaWRfaW5kZXgoY2xhc3NJZCksCisJCQkJCQkJCSAg dHJ1ZSwgU25hcHNob3RTZWxmLCAxLCAmc2tleSk7CisKKwkJdHVwbGUgPSBzeXN0YWJsZV9n ZXRuZXh0KHNjYW4pOworCQlpZiAoIUhlYXBUdXBsZUlzVmFsaWQodHVwbGUpKQorCQkJZXJl cG9ydChFUlJPUiwKKwkJCQkJKGVycmNvZGUoRVJSQ09ERV9VTkRFRklORURfT0JKRUNUKSwK KwkJCQkJIGVycm1zZygiZGVwZW5kZW50ICVzIHdhcyBjb25jdXJyZW50bHkgZHJvcHBlZCIs CisJCQkJCQkJZ2V0X29iamVjdF9jbGFzc19kZXNjcihjbGFzc0lkKSkpKTsKKworCQlzeXN0 YWJsZV9lbmRzY2FuKHNjYW4pOworCQl0YWJsZV9jbG9zZShyZWwsIEFjY2Vzc1NoYXJlTG9j ayk7CisJfQorCWVsc2UKKwl7CisJCS8qCisJCSAqIFNhbWUgbG9naWMgZm9yIHBnX2NsYXNz IGVudHJpZXMsIGJ1dCBsb2NraW5nIHJlbGF0aW9ucyBpcyBoYW5kbGVkCisJCSAqIGJ5IGRp ZmZlcmVudCBmdW5jdGlvbnMuCisJCSAqCisJCSAqIENhbGxlcnMgYXJlIG1vcmUgY2FyZWZ1 bCB3aXRoIGxvY2tpbmcgcmVsYXRpb25zIHRoYW4gb3RoZXIgb2JqZWN0cywKKwkJICogc28g d2Ugc2hvdWxkIGFscmVhZHkgaGF2ZSBhIGxvY2sgb24gdGhlIHJlbGF0aW9uLCBvciBvbiBh bm90aGVyCisJCSAqIG9iamVjdCB0aGF0IGluZGlyZWN0bHkgcHJldmVudHMgdGhlIHJlbGF0 aW9uIGZyb20gYmVpbmcgZHJvcHBlZC4KKwkJICogRm9yIGV4YW1wbGUsIHdlIG1pZ2h0IGhh dmUgYSBzdHJvbmcgbG9jayBvbiBhIHRhYmxlIHdoaWxlIGFkZGluZworCQkgKiBkZXBlbmRl bmN5IHRvIGl0cyBpbmRleC4gIEhvd2V2ZXIsIHdlIGNhbm5vdCBkZXRlY3QgdGhlIGluZGly ZWN0bHkKKwkJICogcHJvdGVjdGVkIGNhc2UgaGVyZSBlYXNpbHkuICBUbyBlcnIgb24gdGhl IHNhZmUgc2lkZSwgYWNxdWlyZSBhCisJCSAqIGxvY2sgZGlyZWN0bHkgb24gdGhlIHJlbGF0 aW9uIGlmIHdlJ3JlIG5vdCBob2xkaW5nIG9uZSBhbHJlYWR5LgorCQkgKi8KKworCQkvKiBh bGwgc2hhcmVkIHJlbGF0aW9ucyBhcmUgcGlubmVkICovCisJCUFzc2VydCghSXNTaGFyZWRS ZWxhdGlvbihvYmplY3RJZCkpOworCisJCWlmIChDaGVja1JlbGF0aW9uT2lkTG9ja2VkQnlN ZShvYmplY3RJZCwgQWNjZXNzU2hhcmVMb2NrLCB0cnVlKSkKKwkJCXJldHVybjsKKwkJTG9j a1JlbGF0aW9uT2lkKG9iamVjdElkLCBBY2Nlc3NTaGFyZUxvY2spOworCisJCWlmIChTZWFy Y2hTeXNDYWNoZUV4aXN0czEoUkVMT0lELCBPYmplY3RJZEdldERhdHVtKG9iamVjdElkKSkp CisJCQlyZXR1cm47CisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9V TkRFRklORURfT0JKRUNUKSwKKwkJCQkgZXJybXNnKCJkZXBlbmRlbnQgcmVsYXRpb24gd2Fz IGNvbmN1cnJlbnRseSBkcm9wcGVkIikpKTsKKwl9Cit9CisKIC8qCiAgKiBWYXJpb3VzIHNw ZWNpYWwtcHVycG9zZSBsb29rdXBzIGFuZCBtYW5pcHVsYXRpb25zIG9mIHBnX2RlcGVuZC4K ICAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvaXNvbGF0aW9uL2V4cGVjdGVkL3Rlc3RfZGVw ZW5kZW5jaWVzX2xvY2tzLm91dCBiL3NyYy90ZXN0L2lzb2xhdGlvbi9leHBlY3RlZC90ZXN0 X2RlcGVuZGVuY2llc19sb2Nrcy5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAwMDAuLjNiZjllNDM1NzI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvaXNv bGF0aW9uL2V4cGVjdGVkL3Rlc3RfZGVwZW5kZW5jaWVzX2xvY2tzLm91dApAQCAtMCwwICsx LDEzNyBAQAorUGFyc2VkIHRlc3Qgc3BlYyB3aXRoIDIgc2Vzc2lvbnMKKworc3RhcnRpbmcg cGVybXV0YXRpb246IHMxX2JlZ2luIHMxX2NyZWF0ZV9mdW5jdGlvbl9pbl9zY2hlbWEgczJf ZHJvcF9zY2hlbWEgczFfY29tbWl0CitzdGVwIHMxX2JlZ2luOiBCRUdJTjsKK3N0ZXAgczFf Y3JlYXRlX2Z1bmN0aW9uX2luX3NjaGVtYTogQ1JFQVRFIEZVTkNUSU9OIHRlc3RzY2hlbWEu Zm9vKCkgUkVUVVJOUyBpbnQgQVMgJ3NlbGVjdCAxJyBMQU5HVUFHRSBzcWw7CitzdGVwIHMy X2Ryb3Bfc2NoZW1hOiBEUk9QIFNDSEVNQSB0ZXN0c2NoZW1hOyA8d2FpdGluZyAuLi4+Citz dGVwIHMxX2NvbW1pdDogQ09NTUlUOworc3RlcCBzMl9kcm9wX3NjaGVtYTogPC4uLiBjb21w bGV0ZWQ+CitFUlJPUjogIGNhbm5vdCBkcm9wIHNjaGVtYSB0ZXN0c2NoZW1hIGJlY2F1c2Ug b3RoZXIgb2JqZWN0cyBkZXBlbmQgb24gaXQKKworc3RhcnRpbmcgcGVybXV0YXRpb246IHMy X2JlZ2luIHMyX2Ryb3Bfc2NoZW1hIHMxX2NyZWF0ZV9mdW5jdGlvbl9pbl9zY2hlbWEgczJf Y29tbWl0CitzdGVwIHMyX2JlZ2luOiBCRUdJTjsKK3N0ZXAgczJfZHJvcF9zY2hlbWE6IERS T1AgU0NIRU1BIHRlc3RzY2hlbWE7CitzdGVwIHMxX2NyZWF0ZV9mdW5jdGlvbl9pbl9zY2hl bWE6IENSRUFURSBGVU5DVElPTiB0ZXN0c2NoZW1hLmZvbygpIFJFVFVSTlMgaW50IEFTICdz ZWxlY3QgMScgTEFOR1VBR0Ugc3FsOyA8d2FpdGluZyAuLi4+CitzdGVwIHMyX2NvbW1pdDog Q09NTUlUOworc3RlcCBzMV9jcmVhdGVfZnVuY3Rpb25faW5fc2NoZW1hOiA8Li4uIGNvbXBs ZXRlZD4KK0VSUk9SOiAgZGVwZW5kZW50IHNjaGVtYSB3YXMgY29uY3VycmVudGx5IGRyb3Bw ZWQKKworc3RhcnRpbmcgcGVybXV0YXRpb246IHMxX2JlZ2luIHMxX2FsdGVyX2Z1bmN0aW9u X3NjaGVtYSBzMl9kcm9wX2FsdGVyc2NoZW1hIHMxX2NvbW1pdAorc3RlcCBzMV9iZWdpbjog QkVHSU47CitzdGVwIHMxX2FsdGVyX2Z1bmN0aW9uX3NjaGVtYTogQUxURVIgRlVOQ1RJT04g cHVibGljLmZhbHRlcigpIFNFVCBTQ0hFTUEgYWx0ZXJzY2hlbWE7CitzdGVwIHMyX2Ryb3Bf YWx0ZXJzY2hlbWE6IERST1AgU0NIRU1BIGFsdGVyc2NoZW1hOyA8d2FpdGluZyAuLi4+Citz dGVwIHMxX2NvbW1pdDogQ09NTUlUOworc3RlcCBzMl9kcm9wX2FsdGVyc2NoZW1hOiA8Li4u IGNvbXBsZXRlZD4KK0VSUk9SOiAgY2Fubm90IGRyb3Agc2NoZW1hIGFsdGVyc2NoZW1hIGJl Y2F1c2Ugb3RoZXIgb2JqZWN0cyBkZXBlbmQgb24gaXQKKworc3RhcnRpbmcgcGVybXV0YXRp b246IHMyX2JlZ2luIHMyX2Ryb3BfYWx0ZXJzY2hlbWEgczFfYWx0ZXJfZnVuY3Rpb25fc2No ZW1hIHMyX2NvbW1pdAorc3RlcCBzMl9iZWdpbjogQkVHSU47CitzdGVwIHMyX2Ryb3BfYWx0 ZXJzY2hlbWE6IERST1AgU0NIRU1BIGFsdGVyc2NoZW1hOworc3RlcCBzMV9hbHRlcl9mdW5j dGlvbl9zY2hlbWE6IEFMVEVSIEZVTkNUSU9OIHB1YmxpYy5mYWx0ZXIoKSBTRVQgU0NIRU1B IGFsdGVyc2NoZW1hOyA8d2FpdGluZyAuLi4+CitzdGVwIHMyX2NvbW1pdDogQ09NTUlUOwor c3RlcCBzMV9hbHRlcl9mdW5jdGlvbl9zY2hlbWE6IDwuLi4gY29tcGxldGVkPgorRVJST1I6 ICBkZXBlbmRlbnQgc2NoZW1hIHdhcyBjb25jdXJyZW50bHkgZHJvcHBlZAorCitzdGFydGlu ZyBwZXJtdXRhdGlvbjogczFfYmVnaW4gczFfY3JlYXRlX2Z1bmN0aW9uX3dpdGhfYXJndHlw ZSBzMl9kcm9wX2Zvb190eXBlIHMxX2NvbW1pdAorc3RlcCBzMV9iZWdpbjogQkVHSU47Citz dGVwIHMxX2NyZWF0ZV9mdW5jdGlvbl93aXRoX2FyZ3R5cGU6IENSRUFURSBGVU5DVElPTiBm b29hcmd0eXBlKG51bSBmb28pIFJFVFVSTlMgaW50IEFTICdzZWxlY3QgMScgTEFOR1VBR0Ug c3FsOworc3RlcCBzMl9kcm9wX2Zvb190eXBlOiBEUk9QIFRZUEUgcHVibGljLmZvbzsgPHdh aXRpbmcgLi4uPgorc3RlcCBzMV9jb21taXQ6IENPTU1JVDsKK3N0ZXAgczJfZHJvcF9mb29f dHlwZTogPC4uLiBjb21wbGV0ZWQ+CitFUlJPUjogIGNhbm5vdCBkcm9wIHR5cGUgZm9vIGJl Y2F1c2Ugb3RoZXIgb2JqZWN0cyBkZXBlbmQgb24gaXQKKworc3RhcnRpbmcgcGVybXV0YXRp b246IHMyX2JlZ2luIHMyX2Ryb3BfZm9vX3R5cGUgczFfY3JlYXRlX2Z1bmN0aW9uX3dpdGhf YXJndHlwZSBzMl9jb21taXQKK3N0ZXAgczJfYmVnaW46IEJFR0lOOworc3RlcCBzMl9kcm9w X2Zvb190eXBlOiBEUk9QIFRZUEUgcHVibGljLmZvbzsKK3N0ZXAgczFfY3JlYXRlX2Z1bmN0 aW9uX3dpdGhfYXJndHlwZTogQ1JFQVRFIEZVTkNUSU9OIGZvb2FyZ3R5cGUobnVtIGZvbykg UkVUVVJOUyBpbnQgQVMgJ3NlbGVjdCAxJyBMQU5HVUFHRSBzcWw7IDx3YWl0aW5nIC4uLj4K K3N0ZXAgczJfY29tbWl0OiBDT01NSVQ7CitzdGVwIHMxX2NyZWF0ZV9mdW5jdGlvbl93aXRo X2FyZ3R5cGU6IDwuLi4gY29tcGxldGVkPgorRVJST1I6ICBkZXBlbmRlbnQgdHlwZSB3YXMg Y29uY3VycmVudGx5IGRyb3BwZWQKKworc3RhcnRpbmcgcGVybXV0YXRpb246IHMxX2JlZ2lu IHMxX2NyZWF0ZV9mdW5jdGlvbl93aXRoX3JldHR5cGUgczJfZHJvcF9mb29fcmV0dHlwZSBz MV9jb21taXQKK3N0ZXAgczFfYmVnaW46IEJFR0lOOworc3RlcCBzMV9jcmVhdGVfZnVuY3Rp b25fd2l0aF9yZXR0eXBlOiBDUkVBVEUgRlVOQ1RJT04gZm9vdHJldHR5cGUoKSBSRVRVUk5T IGlkIExBTkdVQUdFIHNxbCBSRVRVUk4gMTsKK3N0ZXAgczJfZHJvcF9mb29fcmV0dHlwZTog RFJPUCBET01BSU4gaWQ7IDx3YWl0aW5nIC4uLj4KK3N0ZXAgczFfY29tbWl0OiBDT01NSVQ7 CitzdGVwIHMyX2Ryb3BfZm9vX3JldHR5cGU6IDwuLi4gY29tcGxldGVkPgorRVJST1I6ICBj YW5ub3QgZHJvcCB0eXBlIGlkIGJlY2F1c2Ugb3RoZXIgb2JqZWN0cyBkZXBlbmQgb24gaXQK Kworc3RhcnRpbmcgcGVybXV0YXRpb246IHMyX2JlZ2luIHMyX2Ryb3BfZm9vX3JldHR5cGUg czFfY3JlYXRlX2Z1bmN0aW9uX3dpdGhfcmV0dHlwZSBzMl9jb21taXQKK3N0ZXAgczJfYmVn aW46IEJFR0lOOworc3RlcCBzMl9kcm9wX2Zvb19yZXR0eXBlOiBEUk9QIERPTUFJTiBpZDsK K3N0ZXAgczFfY3JlYXRlX2Z1bmN0aW9uX3dpdGhfcmV0dHlwZTogQ1JFQVRFIEZVTkNUSU9O IGZvb3RyZXR0eXBlKCkgUkVUVVJOUyBpZCBMQU5HVUFHRSBzcWwgUkVUVVJOIDE7IDx3YWl0 aW5nIC4uLj4KK3N0ZXAgczJfY29tbWl0OiBDT01NSVQ7CitzdGVwIHMxX2NyZWF0ZV9mdW5j dGlvbl93aXRoX3JldHR5cGU6IDwuLi4gY29tcGxldGVkPgorRVJST1I6ICBkZXBlbmRlbnQg dHlwZSB3YXMgY29uY3VycmVudGx5IGRyb3BwZWQKKworc3RhcnRpbmcgcGVybXV0YXRpb246 IHMxX2JlZ2luIHMxX2NyZWF0ZV9mdW5jdGlvbl93aXRoX2Z1bmN0aW9uIHMyX2Ryb3BfZnVu Y3Rpb25fZiBzMV9jb21taXQKK3N0ZXAgczFfYmVnaW46IEJFR0lOOworc3RlcCBzMV9jcmVh dGVfZnVuY3Rpb25fd2l0aF9mdW5jdGlvbjogQ1JFQVRFIEZVTkNUSU9OIGZvb2Z1bmMoKSBS RVRVUk5TIGludCBMQU5HVUFHRSBTUUwgUkVUVVJOIGYoKSArIDE7CitzdGVwIHMyX2Ryb3Bf ZnVuY3Rpb25fZjogRFJPUCBGVU5DVElPTiBmKCk7IDx3YWl0aW5nIC4uLj4KK3N0ZXAgczFf Y29tbWl0OiBDT01NSVQ7CitzdGVwIHMyX2Ryb3BfZnVuY3Rpb25fZjogPC4uLiBjb21wbGV0 ZWQ+CitFUlJPUjogIGNhbm5vdCBkcm9wIGZ1bmN0aW9uIGYoKSBiZWNhdXNlIG90aGVyIG9i amVjdHMgZGVwZW5kIG9uIGl0CisKK3N0YXJ0aW5nIHBlcm11dGF0aW9uOiBzMl9iZWdpbiBz Ml9kcm9wX2Z1bmN0aW9uX2YgczFfY3JlYXRlX2Z1bmN0aW9uX3dpdGhfZnVuY3Rpb24gczJf Y29tbWl0CitzdGVwIHMyX2JlZ2luOiBCRUdJTjsKK3N0ZXAgczJfZHJvcF9mdW5jdGlvbl9m OiBEUk9QIEZVTkNUSU9OIGYoKTsKK3N0ZXAgczFfY3JlYXRlX2Z1bmN0aW9uX3dpdGhfZnVu Y3Rpb246IENSRUFURSBGVU5DVElPTiBmb29mdW5jKCkgUkVUVVJOUyBpbnQgTEFOR1VBR0Ug U1FMIFJFVFVSTiBmKCkgKyAxOyA8d2FpdGluZyAuLi4+CitzdGVwIHMyX2NvbW1pdDogQ09N TUlUOworc3RlcCBzMV9jcmVhdGVfZnVuY3Rpb25fd2l0aF9mdW5jdGlvbjogPC4uLiBjb21w bGV0ZWQ+CitFUlJPUjogIGRlcGVuZGVudCBmdW5jdGlvbiB3YXMgY29uY3VycmVudGx5IGRy b3BwZWQKKworc3RhcnRpbmcgcGVybXV0YXRpb246IHMxX2JlZ2luIHMxX2NyZWF0ZV9kb21h aW5fd2l0aF9kb21haW4gczJfZHJvcF9kb21haW5faWQgczFfY29tbWl0CitzdGVwIHMxX2Jl Z2luOiBCRUdJTjsKK3N0ZXAgczFfY3JlYXRlX2RvbWFpbl93aXRoX2RvbWFpbjogQ1JFQVRF IERPTUFJTiBpZGlkIGFzIGlkOworc3RlcCBzMl9kcm9wX2RvbWFpbl9pZDogRFJPUCBET01B SU4gaWQ7IDx3YWl0aW5nIC4uLj4KK3N0ZXAgczFfY29tbWl0OiBDT01NSVQ7CitzdGVwIHMy X2Ryb3BfZG9tYWluX2lkOiA8Li4uIGNvbXBsZXRlZD4KK0VSUk9SOiAgY2Fubm90IGRyb3Ag dHlwZSBpZCBiZWNhdXNlIG90aGVyIG9iamVjdHMgZGVwZW5kIG9uIGl0CisKK3N0YXJ0aW5n IHBlcm11dGF0aW9uOiBzMl9iZWdpbiBzMl9kcm9wX2RvbWFpbl9pZCBzMV9jcmVhdGVfZG9t YWluX3dpdGhfZG9tYWluIHMyX2NvbW1pdAorc3RlcCBzMl9iZWdpbjogQkVHSU47CitzdGVw IHMyX2Ryb3BfZG9tYWluX2lkOiBEUk9QIERPTUFJTiBpZDsKK3N0ZXAgczFfY3JlYXRlX2Rv bWFpbl93aXRoX2RvbWFpbjogQ1JFQVRFIERPTUFJTiBpZGlkIGFzIGlkOyA8d2FpdGluZyAu Li4+CitzdGVwIHMyX2NvbW1pdDogQ09NTUlUOworc3RlcCBzMV9jcmVhdGVfZG9tYWluX3dp dGhfZG9tYWluOiA8Li4uIGNvbXBsZXRlZD4KK0VSUk9SOiAgZGVwZW5kZW50IHR5cGUgd2Fz IGNvbmN1cnJlbnRseSBkcm9wcGVkCisKK3N0YXJ0aW5nIHBlcm11dGF0aW9uOiBzMV9iZWdp biBzMV9jcmVhdGVfdGFibGVfd2l0aF90eXBlIHMyX2Ryb3BfZm9vdGFiX3R5cGUgczFfY29t bWl0CitzdGVwIHMxX2JlZ2luOiBCRUdJTjsKK3N0ZXAgczFfY3JlYXRlX3RhYmxlX3dpdGhf dHlwZTogQ1JFQVRFIFRBQkxFIHRhYnR5cGUoYSBmb290YWIpOworc3RlcCBzMl9kcm9wX2Zv b3RhYl90eXBlOiBEUk9QIFRZUEUgcHVibGljLmZvb3RhYjsgPHdhaXRpbmcgLi4uPgorc3Rl cCBzMV9jb21taXQ6IENPTU1JVDsKK3N0ZXAgczJfZHJvcF9mb290YWJfdHlwZTogPC4uLiBj b21wbGV0ZWQ+CitFUlJPUjogIGNhbm5vdCBkcm9wIHR5cGUgZm9vdGFiIGJlY2F1c2Ugb3Ro ZXIgb2JqZWN0cyBkZXBlbmQgb24gaXQKKworc3RhcnRpbmcgcGVybXV0YXRpb246IHMyX2Jl Z2luIHMyX2Ryb3BfZm9vdGFiX3R5cGUgczFfY3JlYXRlX3RhYmxlX3dpdGhfdHlwZSBzMl9j b21taXQKK3N0ZXAgczJfYmVnaW46IEJFR0lOOworc3RlcCBzMl9kcm9wX2Zvb3RhYl90eXBl OiBEUk9QIFRZUEUgcHVibGljLmZvb3RhYjsKK3N0ZXAgczFfY3JlYXRlX3RhYmxlX3dpdGhf dHlwZTogQ1JFQVRFIFRBQkxFIHRhYnR5cGUoYSBmb290YWIpOyA8d2FpdGluZyAuLi4+Citz dGVwIHMyX2NvbW1pdDogQ09NTUlUOworc3RlcCBzMV9jcmVhdGVfdGFibGVfd2l0aF90eXBl OiA8Li4uIGNvbXBsZXRlZD4KK0VSUk9SOiAgZGVwZW5kZW50IHR5cGUgd2FzIGNvbmN1cnJl bnRseSBkcm9wcGVkCisKK3N0YXJ0aW5nIHBlcm11dGF0aW9uOiBzMV9iZWdpbiBzMV9jcmVh dGVfc2VydmVyX3dpdGhfZmR3X3dyYXBwZXIgczJfZHJvcF9mZHdfd3JhcHBlciBzMV9jb21t aXQKK3N0ZXAgczFfYmVnaW46IEJFR0lOOworc3RlcCBzMV9jcmVhdGVfc2VydmVyX3dpdGhf ZmR3X3dyYXBwZXI6IENSRUFURSBTRVJWRVIgc3J2X2Zkd193cmFwcGVyIEZPUkVJR04gREFU QSBXUkFQUEVSIGZkd193cmFwcGVyOworc3RlcCBzMl9kcm9wX2Zkd193cmFwcGVyOiBEUk9Q IEZPUkVJR04gREFUQSBXUkFQUEVSIGZkd193cmFwcGVyIFJFU1RSSUNUOyA8d2FpdGluZyAu Li4+CitzdGVwIHMxX2NvbW1pdDogQ09NTUlUOworc3RlcCBzMl9kcm9wX2Zkd193cmFwcGVy OiA8Li4uIGNvbXBsZXRlZD4KK0VSUk9SOiAgY2Fubm90IGRyb3AgZm9yZWlnbi1kYXRhIHdy YXBwZXIgZmR3X3dyYXBwZXIgYmVjYXVzZSBvdGhlciBvYmplY3RzIGRlcGVuZCBvbiBpdAor CitzdGFydGluZyBwZXJtdXRhdGlvbjogczJfYmVnaW4gczJfZHJvcF9mZHdfd3JhcHBlciBz MV9jcmVhdGVfc2VydmVyX3dpdGhfZmR3X3dyYXBwZXIgczJfY29tbWl0CitzdGVwIHMyX2Jl Z2luOiBCRUdJTjsKK3N0ZXAgczJfZHJvcF9mZHdfd3JhcHBlcjogRFJPUCBGT1JFSUdOIERB VEEgV1JBUFBFUiBmZHdfd3JhcHBlciBSRVNUUklDVDsKK3N0ZXAgczFfY3JlYXRlX3NlcnZl cl93aXRoX2Zkd193cmFwcGVyOiBDUkVBVEUgU0VSVkVSIHNydl9mZHdfd3JhcHBlciBGT1JF SUdOIERBVEEgV1JBUFBFUiBmZHdfd3JhcHBlcjsgPHdhaXRpbmcgLi4uPgorc3RlcCBzMl9j b21taXQ6IENPTU1JVDsKK3N0ZXAgczFfY3JlYXRlX3NlcnZlcl93aXRoX2Zkd193cmFwcGVy OiA8Li4uIGNvbXBsZXRlZD4KK0VSUk9SOiAgZGVwZW5kZW50IGZvcmVpZ24tZGF0YSB3cmFw cGVyIHdhcyBjb25jdXJyZW50bHkgZHJvcHBlZAorCitzdGFydGluZyBwZXJtdXRhdGlvbjog czFfYmVnaW4gczFfYWx0ZXJfZnVuY3Rpb25fb3duZXIgczJfZHJvcF9yb2xlIHMxX2NvbW1p dAorc3RlcCBzMV9iZWdpbjogQkVHSU47CitzdGVwIHMxX2FsdGVyX2Z1bmN0aW9uX293bmVy OiBBTFRFUiBGVU5DVElPTiBwdWJsaWMuZmFsdGVyKCkgT1dORVIgVE8gcmVncmVzc19kZXBl bmRlbmN5Oworc3RlcCBzMl9kcm9wX3JvbGU6IERST1AgUk9MRSByZWdyZXNzX2RlcGVuZGVu Y3k7IDx3YWl0aW5nIC4uLj4KK3N0ZXAgczFfY29tbWl0OiBDT01NSVQ7CitzdGVwIHMyX2Ry b3Bfcm9sZTogPC4uLiBjb21wbGV0ZWQ+CitFUlJPUjogIHJvbGUgInJlZ3Jlc3NfZGVwZW5k ZW5jeSIgY2Fubm90IGJlIGRyb3BwZWQgYmVjYXVzZSBzb21lIG9iamVjdHMgZGVwZW5kIG9u IGl0CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9pc29sYXRpb24vaXNvbGF0aW9uX3NjaGVkdWxl IGIvc3JjL3Rlc3QvaXNvbGF0aW9uL2lzb2xhdGlvbl9zY2hlZHVsZQppbmRleCAxNTc4YmEx OTFjOC4uODNmNjI2ZDUxYjUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2lzb2xhdGlvbi9pc29s YXRpb25fc2NoZWR1bGUKKysrIGIvc3JjL3Rlc3QvaXNvbGF0aW9uL2lzb2xhdGlvbl9zY2hl ZHVsZQpAQCAtMTI2LDMgKzEyNiw0IEBAIHRlc3Q6IHNlcmlhbGl6YWJsZS1wYXJhbGxlbC0z CiB0ZXN0OiBtYXR2aWV3LXdyaXRlLXNrZXcKIHRlc3Q6IGxvY2stbm93YWl0CiB0ZXN0OiBm b3ItcG9ydGlvbi1vZgordGVzdDogdGVzdF9kZXBlbmRlbmNpZXNfbG9ja3MKXCBObyBuZXds aW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9pc29sYXRpb24vc3Bl Y3MvdGVzdF9kZXBlbmRlbmNpZXNfbG9ja3Muc3BlYyBiL3NyYy90ZXN0L2lzb2xhdGlvbi9z cGVjcy90ZXN0X2RlcGVuZGVuY2llc19sb2Nrcy5zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAwMDAwLi5mZDgwYzljYjliNwotLS0gL2Rldi9udWxsCisrKyBiL3Ny Yy90ZXN0L2lzb2xhdGlvbi9zcGVjcy90ZXN0X2RlcGVuZGVuY2llc19sb2Nrcy5zcGVjCkBA IC0wLDAgKzEsMTA4IEBACisjIFRlc3QgdGhhdCBjb25jdXJyZW50IERETCBwcm9wZXJseSBw cmV2ZW50cyBvcnBoYW5lZCBkZXBlbmRlbmNpZXMuCisjCisjIFdoZW4gc2Vzc2lvbiAxIGNy ZWF0ZXMgYW4gb2JqZWN0IHRoYXQgZGVwZW5kcyBvbiBhIHJlZmVyZW5jZWQgb2JqZWN0LAor IyBhbmQgc2Vzc2lvbiAyIGNvbmN1cnJlbnRseSBkcm9wcyB0aGF0IHJlZmVyZW5jZWQgb2Jq ZWN0LCB0aGUgbG9jaworIyBhY3F1aXJlZCBkdXJpbmcgZGVwZW5kZW5jeSByZWNvcmRpbmcg bXVzdCBwcmV2ZW50IHRoZSBkcm9wIG9yIHRoZQorIyBjcmVhdGUgbXVzdCBmYWlsIHdpdGgg ImRlcGVuZGVudCBvYmplY3QgZG9lcyBub3QgZXhpc3QiLgorCitzZXR1cAoreworCUNSRUFU RSBTQ0hFTUEgdGVzdHNjaGVtYTsKKwlDUkVBVEUgU0NIRU1BIGFsdGVyc2NoZW1hOworCUNS RUFURSBUWVBFIHB1YmxpYy5mb28gYXMgZW51bSAoJ29uZScsICd0d28nKTsKKwlDUkVBVEUg VFlQRSBwdWJsaWMuZm9vdGFiIGFzIGVudW0gKCd0aHJlZScsICdmb3VyJyk7CisJQ1JFQVRF IERPTUFJTiBpZCBBUyBpbnQ7CisJQ1JFQVRFIEZVTkNUSU9OIGYoKSBSRVRVUk5TIGludCBM QU5HVUFHRSBTUUwgUkVUVVJOIDE7CisJQ1JFQVRFIEZVTkNUSU9OIHB1YmxpYy5mYWx0ZXIo KSBSRVRVUk5TIGludCBMQU5HVUFHRSBTUUwgUkVUVVJOIDE7CisJQ1JFQVRFIEZPUkVJR04g REFUQSBXUkFQUEVSIGZkd193cmFwcGVyOworCUNSRUFURSBST0xFIHJlZ3Jlc3NfZGVwZW5k ZW5jeTsKK30KKwordGVhcmRvd24KK3sKKwlEUk9QIEZVTkNUSU9OIElGIEVYSVNUUyB0ZXN0 c2NoZW1hLmZvbygpOworCURST1AgRlVOQ1RJT04gSUYgRVhJU1RTIGZvb2FyZ3R5cGUobnVt IGZvbyk7CisJRFJPUCBGVU5DVElPTiBJRiBFWElTVFMgZm9vdHJldHR5cGUoKTsKKwlEUk9Q IEZVTkNUSU9OIElGIEVYSVNUUyBmb29mdW5jKCk7CisJRFJPUCBGVU5DVElPTiBJRiBFWElT VFMgcHVibGljLmZhbHRlcigpOworCURST1AgRlVOQ1RJT04gSUYgRVhJU1RTIGFsdGVyc2No ZW1hLmZhbHRlcigpOworCURST1AgRE9NQUlOIElGIEVYSVNUUyBpZGlkOworCURST1AgU0VS VkVSIElGIEVYSVNUUyBzcnZfZmR3X3dyYXBwZXI7CisJRFJPUCBUQUJMRSBJRiBFWElTVFMg dGFidHlwZTsKKwlEUk9QIFNDSEVNQSBJRiBFWElTVFMgdGVzdHNjaGVtYTsKKwlEUk9QIFND SEVNQSBJRiBFWElTVFMgYWx0ZXJzY2hlbWE7CisJRFJPUCBUWVBFIElGIEVYSVNUUyBwdWJs aWMuZm9vOworCURST1AgVFlQRSBJRiBFWElTVFMgcHVibGljLmZvb3RhYjsKKwlEUk9QIERP TUFJTiBJRiBFWElTVFMgaWQ7CisJRFJPUCBGVU5DVElPTiBJRiBFWElTVFMgZigpOworCURS T1AgRk9SRUlHTiBEQVRBIFdSQVBQRVIgSUYgRVhJU1RTIGZkd193cmFwcGVyOworCURST1Ag Uk9MRSByZWdyZXNzX2RlcGVuZGVuY3k7Cit9CisKK3Nlc3Npb24gInMxIgorCitzdGVwICJz MV9iZWdpbiIgeyBCRUdJTjsgfQorc3RlcCAiczFfY3JlYXRlX2Z1bmN0aW9uX2luX3NjaGVt YSIgeyBDUkVBVEUgRlVOQ1RJT04gdGVzdHNjaGVtYS5mb28oKSBSRVRVUk5TIGludCBBUyAn c2VsZWN0IDEnIExBTkdVQUdFIHNxbDsgfQorc3RlcCAiczFfY3JlYXRlX2Z1bmN0aW9uX3dp dGhfYXJndHlwZSIgeyBDUkVBVEUgRlVOQ1RJT04gZm9vYXJndHlwZShudW0gZm9vKSBSRVRV Uk5TIGludCBBUyAnc2VsZWN0IDEnIExBTkdVQUdFIHNxbDsgfQorc3RlcCAiczFfY3JlYXRl X2Z1bmN0aW9uX3dpdGhfcmV0dHlwZSIgeyBDUkVBVEUgRlVOQ1RJT04gZm9vdHJldHR5cGUo KSBSRVRVUk5TIGlkIExBTkdVQUdFIHNxbCBSRVRVUk4gMTsgfQorc3RlcCAiczFfY3JlYXRl X2Z1bmN0aW9uX3dpdGhfZnVuY3Rpb24iIHsgQ1JFQVRFIEZVTkNUSU9OIGZvb2Z1bmMoKSBS RVRVUk5TIGludCBMQU5HVUFHRSBTUUwgUkVUVVJOIGYoKSArIDE7IH0KK3N0ZXAgInMxX2Fs dGVyX2Z1bmN0aW9uX293bmVyIiB7IEFMVEVSIEZVTkNUSU9OIHB1YmxpYy5mYWx0ZXIoKSBP V05FUiBUTyByZWdyZXNzX2RlcGVuZGVuY3k7IH0KK3N0ZXAgInMxX2FsdGVyX2Z1bmN0aW9u X3NjaGVtYSIgeyBBTFRFUiBGVU5DVElPTiBwdWJsaWMuZmFsdGVyKCkgU0VUIFNDSEVNQSBh bHRlcnNjaGVtYTsgfQorc3RlcCAiczFfY3JlYXRlX2RvbWFpbl93aXRoX2RvbWFpbiIgeyBD UkVBVEUgRE9NQUlOIGlkaWQgYXMgaWQ7IH0KK3N0ZXAgInMxX2NyZWF0ZV90YWJsZV93aXRo X3R5cGUiIHsgQ1JFQVRFIFRBQkxFIHRhYnR5cGUoYSBmb290YWIpOyB9CitzdGVwICJzMV9j cmVhdGVfc2VydmVyX3dpdGhfZmR3X3dyYXBwZXIiIHsgQ1JFQVRFIFNFUlZFUiBzcnZfZmR3 X3dyYXBwZXIgRk9SRUlHTiBEQVRBIFdSQVBQRVIgZmR3X3dyYXBwZXI7IH0KK3N0ZXAgInMx X2NvbW1pdCIgeyBDT01NSVQ7IH0KKworc2Vzc2lvbiAiczIiCisKK3N0ZXAgInMyX2JlZ2lu IiB7IEJFR0lOOyB9CitzdGVwICJzMl9kcm9wX3NjaGVtYSIgeyBEUk9QIFNDSEVNQSB0ZXN0 c2NoZW1hOyB9CitzdGVwICJzMl9kcm9wX2FsdGVyc2NoZW1hIiB7IERST1AgU0NIRU1BIGFs dGVyc2NoZW1hOyB9CitzdGVwICJzMl9kcm9wX2Zvb190eXBlIiB7IERST1AgVFlQRSBwdWJs aWMuZm9vOyB9CitzdGVwICJzMl9kcm9wX2Zvb19yZXR0eXBlIiB7IERST1AgRE9NQUlOIGlk OyB9CitzdGVwICJzMl9kcm9wX2Zvb3RhYl90eXBlIiB7IERST1AgVFlQRSBwdWJsaWMuZm9v dGFiOyB9CitzdGVwICJzMl9kcm9wX2Z1bmN0aW9uX2YiIHsgRFJPUCBGVU5DVElPTiBmKCk7 IH0KK3N0ZXAgInMyX2Ryb3BfZG9tYWluX2lkIiB7IERST1AgRE9NQUlOIGlkOyB9CitzdGVw ICJzMl9kcm9wX2Zkd193cmFwcGVyIiB7IERST1AgRk9SRUlHTiBEQVRBIFdSQVBQRVIgZmR3 X3dyYXBwZXIgUkVTVFJJQ1Q7IH0KK3N0ZXAgInMyX2Ryb3Bfcm9sZSIgeyBEUk9QIFJPTEUg cmVncmVzc19kZXBlbmRlbmN5OyB9CitzdGVwICJzMl9jb21taXQiIHsgQ09NTUlUOyB9CisK KyMgZnVuY3Rpb24gLSBzY2hlbWEKK3Blcm11dGF0aW9uICJzMV9iZWdpbiIgInMxX2NyZWF0 ZV9mdW5jdGlvbl9pbl9zY2hlbWEiICJzMl9kcm9wX3NjaGVtYSIgInMxX2NvbW1pdCIKK3Bl cm11dGF0aW9uICJzMl9iZWdpbiIgInMyX2Ryb3Bfc2NoZW1hIiAiczFfY3JlYXRlX2Z1bmN0 aW9uX2luX3NjaGVtYSIgInMyX2NvbW1pdCIKKworIyBhbHRlciBmdW5jdGlvbiAtIHNjaGVt YQorcGVybXV0YXRpb24gInMxX2JlZ2luIiAiczFfYWx0ZXJfZnVuY3Rpb25fc2NoZW1hIiAi czJfZHJvcF9hbHRlcnNjaGVtYSIgInMxX2NvbW1pdCIKK3Blcm11dGF0aW9uICJzMl9iZWdp biIgInMyX2Ryb3BfYWx0ZXJzY2hlbWEiICJzMV9hbHRlcl9mdW5jdGlvbl9zY2hlbWEiICJz Ml9jb21taXQiCisKKyMgZnVuY3Rpb24gLSBhcmd0eXBlCitwZXJtdXRhdGlvbiAiczFfYmVn aW4iICJzMV9jcmVhdGVfZnVuY3Rpb25fd2l0aF9hcmd0eXBlIiAiczJfZHJvcF9mb29fdHlw ZSIgInMxX2NvbW1pdCIKK3Blcm11dGF0aW9uICJzMl9iZWdpbiIgInMyX2Ryb3BfZm9vX3R5 cGUiICJzMV9jcmVhdGVfZnVuY3Rpb25fd2l0aF9hcmd0eXBlIiAiczJfY29tbWl0IgorCisj IGZ1bmN0aW9uIC0gcmV0dHlwZQorcGVybXV0YXRpb24gInMxX2JlZ2luIiAiczFfY3JlYXRl X2Z1bmN0aW9uX3dpdGhfcmV0dHlwZSIgInMyX2Ryb3BfZm9vX3JldHR5cGUiICJzMV9jb21t aXQiCitwZXJtdXRhdGlvbiAiczJfYmVnaW4iICJzMl9kcm9wX2Zvb19yZXR0eXBlIiAiczFf Y3JlYXRlX2Z1bmN0aW9uX3dpdGhfcmV0dHlwZSIgInMyX2NvbW1pdCIKKworIyBmdW5jdGlv biAtIGZ1bmN0aW9uCitwZXJtdXRhdGlvbiAiczFfYmVnaW4iICJzMV9jcmVhdGVfZnVuY3Rp b25fd2l0aF9mdW5jdGlvbiIgInMyX2Ryb3BfZnVuY3Rpb25fZiIgInMxX2NvbW1pdCIKK3Bl cm11dGF0aW9uICJzMl9iZWdpbiIgInMyX2Ryb3BfZnVuY3Rpb25fZiIgInMxX2NyZWF0ZV9m dW5jdGlvbl93aXRoX2Z1bmN0aW9uIiAiczJfY29tbWl0IgorCisjIGRvbWFpbiAtIGRvbWFp bgorcGVybXV0YXRpb24gInMxX2JlZ2luIiAiczFfY3JlYXRlX2RvbWFpbl93aXRoX2RvbWFp biIgInMyX2Ryb3BfZG9tYWluX2lkIiAiczFfY29tbWl0IgorcGVybXV0YXRpb24gInMyX2Jl Z2luIiAiczJfZHJvcF9kb21haW5faWQiICJzMV9jcmVhdGVfZG9tYWluX3dpdGhfZG9tYWlu IiAiczJfY29tbWl0IgorCisjIHRhYmxlIC0gdHlwZQorcGVybXV0YXRpb24gInMxX2JlZ2lu IiAiczFfY3JlYXRlX3RhYmxlX3dpdGhfdHlwZSIgInMyX2Ryb3BfZm9vdGFiX3R5cGUiICJz MV9jb21taXQiCitwZXJtdXRhdGlvbiAiczJfYmVnaW4iICJzMl9kcm9wX2Zvb3RhYl90eXBl IiAiczFfY3JlYXRlX3RhYmxlX3dpdGhfdHlwZSIgInMyX2NvbW1pdCIKKworIyBzZXJ2ZXIg LSBmb3JlaWduIGRhdGEgd3JhcHBlcgorcGVybXV0YXRpb24gInMxX2JlZ2luIiAiczFfY3Jl YXRlX3NlcnZlcl93aXRoX2Zkd193cmFwcGVyIiAiczJfZHJvcF9mZHdfd3JhcHBlciIgInMx X2NvbW1pdCIKK3Blcm11dGF0aW9uICJzMl9iZWdpbiIgInMyX2Ryb3BfZmR3X3dyYXBwZXIi ICJzMV9jcmVhdGVfc2VydmVyX3dpdGhfZmR3X3dyYXBwZXIiICJzMl9jb21taXQiCisKKyMg ZnVuY3Rpb24gLSByb2xlCitwZXJtdXRhdGlvbiAiczFfYmVnaW4iICJzMV9hbHRlcl9mdW5j dGlvbl9vd25lciIgInMyX2Ryb3Bfcm9sZSIgInMxX2NvbW1pdCIKKworIyBYWFg6IFRoaXMg cGVybXV0YXRpb24gaXMgZGlzYWJsZWQgYmVjYXVzZSB0aGUgZXJyb3IgbWVzc2FnZSwgInJv bGUKKyMgPE9JRD4gd2FzIGNvbmN1cnJlbnRseSBkcm9wcGVkIiwgY29udGFpbnMgYW4gT0lE IHRoYXQgaXMgbm90IHN0YWJsZS4KKyMKKyMgcGVybXV0YXRpb24gInMyX2JlZ2luIiAiczJf ZHJvcF9yb2xlIiAiczFfYWx0ZXJfZnVuY3Rpb25fb3duZXIiICJzMl9jb21taXQiCmRpZmYg LS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2FsdGVyX3RhYmxlLm91dCBiL3Ny Yy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvYWx0ZXJfdGFibGUub3V0CmluZGV4IDZkZDIyYmUw ZThkLi5iODkxZDY4ZDRhNyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9hbHRlcl90YWJsZS5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9hbHRl cl90YWJsZS5vdXQKQEAgLTI5NDksMTEgKzI5NDksMTIgQEAgYmVnaW47CiBhbHRlciB0YWJs ZSBhbHRlcmxvY2syCiBhZGQgY29uc3RyYWludCBhbHRlcmxvY2sybnYgZm9yZWlnbiBrZXkg KGYxKSByZWZlcmVuY2VzIGFsdGVybG9jayAoZjEpIE5PVCBWQUxJRDsKIHNlbGVjdCAqIGZy b20gbXlfbG9ja3Mgb3JkZXIgYnkgMTsKLSAgcmVsbmFtZSAgIHwgICAgIG1heF9sb2NrbW9k ZSAgICAgIAotLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gYWx0ZXJs b2NrICB8IFNoYXJlUm93RXhjbHVzaXZlTG9jawotIGFsdGVybG9jazIgfCBTaGFyZVJvd0V4 Y2x1c2l2ZUxvY2sKLSgyIHJvd3MpCisgICAgcmVsbmFtZSAgICAgfCAgICAgbWF4X2xvY2tt b2RlICAgICAgCistLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg YWx0ZXJsb2NrICAgICAgfCBTaGFyZVJvd0V4Y2x1c2l2ZUxvY2sKKyBhbHRlcmxvY2syICAg ICB8IFNoYXJlUm93RXhjbHVzaXZlTG9jaworIGFsdGVybG9ja19wa2V5IHwgQWNjZXNzU2hh cmVMb2NrCisoMyByb3dzKQogCiBjb21taXQ7CiBiZWdpbjsKLS0gCjIuNDcuMwoK --------------11yL5R6bxRT3GvJ6StfyD7Az--