Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lw3oA-0000Sw-Sa for pgadmin-hackers@arkaria.postgresql.org; Wed, 23 Jun 2021 14:24:51 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1lw3o8-0005Jb-B6 for pgadmin-hackers@arkaria.postgresql.org; Wed, 23 Jun 2021 14:24:48 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lw3o7-0005JT-TM for pgadmin-hackers@lists.postgresql.org; Wed, 23 Jun 2021 14:24:48 +0000 Received: from mail-pj1-x1033.google.com ([2607:f8b0:4864:20::1033]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1lw3o5-0007e6-0s for pgadmin-hackers@postgresql.org; Wed, 23 Jun 2021 14:24:46 +0000 Received: by mail-pj1-x1033.google.com with SMTP id 13-20020a17090a08cdb029016eed209ca4so1495887pjn.1 for ; Wed, 23 Jun 2021 07:24:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb-com.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=CVjmSR5qR/7Q3C1wGjrW0bGjm1Z2f9ISU92nPQp7cxI=; b=bIZnO6dED6CqDjUjXPOIpDHhkHCfnyfUpF95oHOR0/pdxAcIQdRxRXoDSKhc0V4OCC f/733ew8GjlNs4vIZJr/JS31JVKSnL6zzt7ReEgT613ZKFzgW9PSuVOSKTuePLOtd4uY JH4iLsUVrjixgJSO9djEyYofs3bI3Tlp459I8BlUl915uoxOe9Q5kzd9CA+/IiQCzizn F2SMyEX7JlToSYeFe6keJLG1fjUobxNfQBy46NPgFkZZpuALIWBcsge8R1yl7669hQNY NvpQIIFxlqdUKB249gxm5Mto1kB3psLxtIQdLAMaiINosg3VUVNSHvbUK88HcegTPAvj sfRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=CVjmSR5qR/7Q3C1wGjrW0bGjm1Z2f9ISU92nPQp7cxI=; b=i/qh0m9prtRxfBu+SYuxtD1EWL5ODi46Gv0C8vRAGpoRZ+Xa8SlaMOmtRkfB/jnT6Q wKMpjE9qEm5qlvjUKwASegFLMJTl+819COWJX5qyDs1OzMc+PUUOG/wS8ktaYFc/72t0 4MITqqNE7tc3jVtJns59BHYpVgt1dFg0RvAScvYUFur9GPnZCYBr4FNbWkqS+0IuMvFX 9HXZKBv37ebLko/FVfXCYOPKfPgVc3ep6vYLoAuGIHkLSorumlNl697LNTbwSCFsi8Ax mntcXPyq7thKf+nN1S9Mvu9zd5bFN5Mpc21FDNx65rs+dRcmZhUhm8FD0QCbsg2R4ikU D7Dg== X-Gm-Message-State: AOAM530GIueGPHDPqxJUsy1uMQn9m/H26SXkIK8EaSowJ4AdJ8bG74XR PMjF/TXsTPi4jGHYRCicfh5Qa+FVADdWYra+pDk4DvYIMWijrRA3MgHsozOBXTGDhG2KelbTG+d panDcZ1mZ+tp8Q6lsy0zFCPyuVOfiz2oonHCYFZJU9QNsINeIMo5/Xp6pekPBZ08qQxaQsEdQba Xokc1tzVmuuePgAukrGMEhtQqFt1S3QEzkNr6pdjjervwDKNaTI3yHglwLMA== X-Google-Smtp-Source: ABdhPJylqizSopfITnkiFswugJ9rcM0viIoXoUX3Hs8pH1xtnfnDFXpfSJZ5L0F2OxPlYP61TAlCeh1M7kiJg5Y+M2E= X-Received: by 2002:a17:90b:ecf:: with SMTP id gz15mr33664pjb.131.1624458283757; Wed, 23 Jun 2021 07:24:43 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Ashesh Vashi Date: Wed, 23 Jun 2021 19:54:32 +0530 Message-ID: Subject: Re: Refactor: Registry Classes To: Akshay Joshi Cc: pgadmin-hackers Content-Type: multipart/mixed; boundary="000000000000f52da605c56faa4a" X-CLOUD-SEC-AV-Info: enterprisedb,google_mail,monitor X-CLOUD-SEC-AV-Sent: true X-Gm-Spam: 0 X-Gm-Phishy: 0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000f52da605c56faa4a Content-Type: multipart/alternative; boundary="000000000000f52da405c56faa48" --000000000000f52da405c56faa48 Content-Type: text/plain; charset="UTF-8" On Wed, Jun 23, 2021 at 1:22 PM Akshay Joshi wrote: > Hi Ashesh > > Following are the review comments: > > - Fixed PEP8 issues. > > Done. > > - In "dynamic_registry/__init__.py" decorator @classmethod used for " > *_get*" and "*_load_modules*" methods which are actually outside of > the class. Even constructor also outside of the class. > > 'create_registry_metaclass' is not a class, but a method to create the dynamic classes. If I move these methods in 'create_registry_metaclass' method, SonarQube raises issues about complexity of the functions, hence - they're best kept outside of that method. > > - Remove unused imports from "driver/registry.py" > > Done > > - > - Fixed sonarqube issues in > "dynamic_registry/tests/registry/__init__.py" > > Done As discussed, SonarQube is not able to understand that the result object is a class, and not an object, hence - showing linter issues. I've disabled them in those lines by adding the comment '# NOSNAR' at the end. -- Thanks, Ashesh > > On Sat, Jun 19, 2021 at 11:27 AM Ashesh Vashi < > ashesh.vashi@enterprisedb.com> wrote: > >> On Sat, Jun 19, 2021 at 1:39 AM Ashesh Vashi < >> ashesh.vashi@enterprisedb.com> wrote: >> >>> Hi Akshay, >>> >>> We do have a couple of classes, which does automatic registration of the >>> base classes, >>> and which creates single-ton objects for these base classes, when needed. >>> >>> I would be working on a patch sooner, which will be using similar >>> functionality for loading >>> the multi-factor authentication. >>> >>> I realized - it will be a duplicate code at three places for the same >>> functionalities. >>> Hence - I worked on refactoring this registry class. >>> >>> Please find the patch for the same. >>> >> Found issues - some test files were using the old function >> 'Driver.load_drivers(...)'. >> They're fixed now. >> >> -- Thanks, Ashesh >> >>> >>> -- >>> >>> Thanks & Regards, >>> >>> Ashesh Vashi >>> EnterpriseDB INDIA: Enterprise PostgreSQL Company >>> >>> >>> >>> *http://www.linkedin.com/in/asheshvashi* >>> >>> >> > > -- > *Thanks & Regards* > *Akshay Joshi* > *pgAdmin Hacker | Principal Software Architect* > *EDB Postgres * > > *Mobile: +91 976-788-8246* > --000000000000f52da405c56faa48 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
On Wed, Jun 23, 2021 at 1:22 PM Akshay Jo= shi <akshay.joshi@enter= prisedb.com> wrote:
Hi=C2=A0Ashesh
<= br>
Following are the review comments:
  • Fixed PE= P8 issues.
Done.
  • In "= dynamic_registry/__init__.py" decorator @classmethod used for "_get" and "_load_modules" methods which are actu= ally outside of the class. Even constructor also outside of the class.
    <= /li>
'create_registry_metaclass' = is not a class, but a method to create the dynamic classes.
If I = move these methods in 'create_registry_metaclass' method, SonarQube= raises issues about complexity of the functions, hence - they're best = kept outside of that method.=C2=A0
  • Remove unused imports from "dr= iver/registry.py"
Done
  • =
  • Fixed sonarqube issues in "dynamic_registry/tests/registry/__init_= _.py"
Done
As discussed= , SonarQube is not able to understand that the result object is a class, an= d not an object, hence - showing linter issues.
I've disa= bled them in those lines by adding the comment '# NOSNAR' at the en= d.

-- Thanks, Ashesh

On Sat, Jun 19, 2021 at 11:27 AM Ashesh Vashi <ashesh.vashi@= enterprisedb.com> wrote:
On Sat, Jun 19, 2021 at 1= :39 AM Ashesh Vashi <ashesh.vashi@enterprisedb.com> wrote:
Hi Akshay,

We do have a couple of classes,= which does automatic registration of the base classes,
and which= creates single-ton objects for these base classes, when needed.
=
I would be working on a patch sooner, which will be using si= milar functionality for loading
the multi-factor authentication.<= /div>

I realized - it will be a duplicate code at three = places for the same functionalities.
Hence - I worked on refactor= ing this registry class.

Please find the patch for= the same.=C2=A0
Found issues - some test file= s were using the old function 'Driver.load_drivers(...)'.
They're fixed now.

-- Thanks, Ashesh

--

Thanks & Regards,

Ashesh= Vashi
EnterpriseDB INDIA: Enterprise PostgreSQL Company


http://www.linkedin.com/in/asheshvashi



--
Thank= s & Regards
Akshay Joshi
pgAdmin Hacker | Principal Softw= are Architect
EDB Po= stgres
Mobile: +91 976-788-8246

--000000000000f52da405c56faa48-- --000000000000f52da605c56faa4a Content-Type: application/octet-stream; name="refactor_registry_class_v3.patch" Content-Disposition: attachment; filename="refactor_registry_class_v3.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kq9kh1sy0 ZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL2F1dGhlbnRpY2F0ZS9fX2luaXRfXy5weSBiL3dlYi9w Z2FkbWluL2F1dGhlbnRpY2F0ZS9fX2luaXRfXy5weQppbmRleCBkMzI4YjBkMjQuLjEwMWQ1NzY1 NiAxMDA2NDQKLS0tIGEvd2ViL3BnYWRtaW4vYXV0aGVudGljYXRlL19faW5pdF9fLnB5CisrKyBi L3dlYi9wZ2FkbWluL2F1dGhlbnRpY2F0ZS9fX2luaXRfXy5weQpAQCAtMjIzLDcgKzIyMyw3IEBA IGRlZiBnZXRfYXV0aF9zb3VyY2VzKHR5cGUpOgogICAgIGlmIHR5cGUgaW4gYXV0aF9zb3VyY2Vz OgogICAgICAgICByZXR1cm4gYXV0aF9zb3VyY2VzW3R5cGVdCiAKLSAgICBhdXRoX3NvdXJjZSA9 IEF1dGhTb3VyY2VSZWdpc3RyeS5jcmVhdGUodHlwZSkKKyAgICBhdXRoX3NvdXJjZSA9IEF1dGhT b3VyY2VSZWdpc3RyeS5nZXQodHlwZSkKIAogICAgIGlmIGF1dGhfc291cmNlIGlzIG5vdCBOb25l OgogICAgICAgICBhdXRoX3NvdXJjZXNbdHlwZV0gPSBhdXRoX3NvdXJjZQpAQCAtMjM2LDcgKzIz Niw3IEBAIGRlZiBpbml0X2FwcChhcHApOgogICAgIGF1dGhfc291cmNlcyA9IGRpY3QoKQogCiAg ICAgc2V0YXR0cihhcHAsICdfcGdhZG1pbl9hdXRoX3NvdXJjZXMnLCBhdXRoX3NvdXJjZXMpCi0g ICAgQXV0aFNvdXJjZVJlZ2lzdHJ5LmxvYWRfYXV0aF9zb3VyY2VzKCkKKyAgICBBdXRoU291cmNl UmVnaXN0cnkubG9hZF9tb2R1bGVzKGFwcCkKIAogICAgIHJldHVybiBhdXRoX3NvdXJjZXMKIApk aWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vYXV0aGVudGljYXRlL3JlZ2lzdHJ5LnB5IGIvd2ViL3Bn YWRtaW4vYXV0aGVudGljYXRlL3JlZ2lzdHJ5LnB5CmluZGV4IDdkNzk3ZTY1OC4uODRjNWZkMDdh IDEwMDY0NAotLS0gYS93ZWIvcGdhZG1pbi9hdXRoZW50aWNhdGUvcmVnaXN0cnkucHkKKysrIGIv d2ViL3BnYWRtaW4vYXV0aGVudGljYXRlL3JlZ2lzdHJ5LnB5CkBAIC0xMCw1NiArMTAsOSBAQAog IiIiRXh0ZXJuYWwgQXV0aGVudGljYXRpb24gUmVnaXN0cnkuIiIiCiAKIAotZnJvbSBmbGFza19i YWJlbGV4IGltcG9ydCBnZXR0ZXh0Ci1mcm9tIGFiYyBpbXBvcnQgQUJDTWV0YQorZnJvbSBwZ2Fk bWluLnV0aWxzLmR5bmFtaWNfcmVnaXN0cnkgaW1wb3J0IGNyZWF0ZV9yZWdpc3RyeV9tZXRhY2xh c3MKIAogCi1kZWYgX2RlY29yYXRlX2Nsc19uYW1lKG1vZHVsZV9uYW1lKToKLSAgICBsZW5ndGgg PSBsZW4oX19wYWNrYWdlX18pICsgMQotCi0gICAgaWYgbGVuKG1vZHVsZV9uYW1lKSA+IGxlbmd0 aCBhbmQgbW9kdWxlX25hbWUuc3RhcnRzd2l0aChfX3BhY2thZ2VfXyk6Ci0gICAgICAgIHJldHVy biBtb2R1bGVfbmFtZVtsZW5ndGg6XQotCi0gICAgcmV0dXJuIG1vZHVsZV9uYW1lCi0KLQotY2xh c3MgQXV0aFNvdXJjZVJlZ2lzdHJ5KEFCQ01ldGEpOgotICAgIHJlZ2lzdHJ5ID0gTm9uZQotICAg IGF1dGhfc291cmNlcyA9IGRpY3QoKQotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGJh c2VzLCBkKToKLQotICAgICAgICAjIFJlZ2lzdGVyIHRoaXMgdHlwZSBvZiBhdXRoX3NvdXJjZXMs IGJhc2VkIG9uIHRoZSBtb2R1bGUgbmFtZQotICAgICAgICAjIEF2b2lkIHJlZ2lzdGVyaW5nIHRo ZSBCYXNlQXV0aGVudGljYXRpb24gaXRzZWxmCi0KLSAgICAgICAgQXV0aFNvdXJjZVJlZ2lzdHJ5 LnJlZ2lzdHJ5W19kZWNvcmF0ZV9jbHNfbmFtZShkWydfX21vZHVsZV9fJ10pXSA9IHNlbGYKLSAg ICAgICAgQUJDTWV0YS5fX2luaXRfXyhzZWxmLCBuYW1lLCBiYXNlcywgZCkKLQotICAgIEBjbGFz c21ldGhvZAotICAgIGRlZiBjcmVhdGUoY2xzLCBuYW1lLCAqKmt3YXJncyk6Ci0KLSAgICAgICAg aWYgbmFtZSBpbiBBdXRoU291cmNlUmVnaXN0cnkuYXV0aF9zb3VyY2VzOgotICAgICAgICAgICAg cmV0dXJuIEF1dGhTb3VyY2VSZWdpc3RyeS5hdXRoX3NvdXJjZXNbbmFtZV0KLQotICAgICAgICBp ZiBuYW1lIGluIEF1dGhTb3VyY2VSZWdpc3RyeS5yZWdpc3RyeToKLSAgICAgICAgICAgIEF1dGhT b3VyY2VSZWdpc3RyeS5hdXRoX3NvdXJjZXNbbmFtZV0gPSBcCi0gICAgICAgICAgICAgICAgKEF1 dGhTb3VyY2VSZWdpc3RyeS5yZWdpc3RyeVtuYW1lXSkoKiprd2FyZ3MpCi0gICAgICAgICAgICBy ZXR1cm4gQXV0aFNvdXJjZVJlZ2lzdHJ5LmF1dGhfc291cmNlc1tuYW1lXQotCi0gICAgICAgIHJh aXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCi0gICAgICAgICAgICBnZXR0ZXh0KAotICAgICAgICAg ICAgICAgICJBdXRoZW50aWNhdGlvbiBzb3VyY2UgJ3swfScgaGFzIG5vdCBiZWVuIGltcGxlbWVu dGVkLiIKLSAgICAgICAgICAgICkuZm9ybWF0KG5hbWUpCi0gICAgICAgICkKLQotICAgIEBjbGFz c21ldGhvZAotICAgIGRlZiBsb2FkX2F1dGhfc291cmNlcyhjbHMpOgotICAgICAgICAjIEluaXRp YWxpemUgdGhlIHJlZ2lzdHJ5IG9ubHkgaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBpbml0aWFsaXpl ZAotICAgICAgICBpZiBBdXRoU291cmNlUmVnaXN0cnkucmVnaXN0cnkgaXMgTm9uZToKLSAgICAg ICAgICAgIEF1dGhTb3VyY2VSZWdpc3RyeS5yZWdpc3RyeSA9IGRpY3QoKQotCi0gICAgICAgIGZy b20gaW1wb3J0bGliIGltcG9ydCBpbXBvcnRfbW9kdWxlCi0gICAgICAgIGZyb20gd2Vya3pldWcu dXRpbHMgaW1wb3J0IGZpbmRfbW9kdWxlcwotCi0gICAgICAgIGZvciBtb2R1bGVfbmFtZSBpbiBm aW5kX21vZHVsZXMoX19wYWNrYWdlX18sIFRydWUpOgotICAgICAgICAgICAgaW1wb3J0X21vZHVs ZShtb2R1bGVfbmFtZSkKK0F1dGhTb3VyY2VSZWdpc3RyeSA9IGNyZWF0ZV9yZWdpc3RyeV9tZXRh Y2xhc3MoCisgICAgIkF1dGhTb3VyY2VSZWdpc3RyeSIsIF9fcGFja2FnZV9fLCBkZWNvcmF0ZV9h c19tb2R1bGU9VHJ1ZQorKQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vYnJvd3Nlci9zZXJ2ZXJf Z3JvdXBzL3NlcnZlcnMvZGF0YWJhc2VzL3NjaGVtYXMvdGFibGVzL3RlbXBsYXRlcy9mb3JlaWdu X2tleS9zcWwvdGVzdHMvdGVzdF9mb3JlaWduX2tleV9wcm9wZXJ0aWVzLnB5IGIvd2ViL3BnYWRt aW4vYnJvd3Nlci9zZXJ2ZXJfZ3JvdXBzL3NlcnZlcnMvZGF0YWJhc2VzL3NjaGVtYXMvdGFibGVz L3RlbXBsYXRlcy9mb3JlaWduX2tleS9zcWwvdGVzdHMvdGVzdF9mb3JlaWduX2tleV9wcm9wZXJ0 aWVzLnB5CmluZGV4IDdjOWQ4ZjQyMy4uNGE2YzI2NjRiIDEwMDY0NAotLS0gYS93ZWIvcGdhZG1p bi9icm93c2VyL3NlcnZlcl9ncm91cHMvc2VydmVycy9kYXRhYmFzZXMvc2NoZW1hcy90YWJsZXMv dGVtcGxhdGVzL2ZvcmVpZ25fa2V5L3NxbC90ZXN0cy90ZXN0X2ZvcmVpZ25fa2V5X3Byb3BlcnRp ZXMucHkKKysrIGIvd2ViL3BnYWRtaW4vYnJvd3Nlci9zZXJ2ZXJfZ3JvdXBzL3NlcnZlcnMvZGF0 YWJhc2VzL3NjaGVtYXMvdGFibGVzL3RlbXBsYXRlcy9mb3JlaWduX2tleS9zcWwvdGVzdHMvdGVz dF9mb3JlaWduX2tleV9wcm9wZXJ0aWVzLnB5CkBAIC0xNCw3ICsxNCw3IEBAIGZyb20gcmVncmVz c2lvbi5weXRob25fdGVzdF91dGlscy50ZW1wbGF0ZV9oZWxwZXIgaW1wb3J0IGZpbGVfYXNfdGVt cGxhdGUKIGZyb20gcGdhZG1pbi51dGlscy5yb3V0ZSBpbXBvcnQgQmFzZVRlc3RHZW5lcmF0b3IK IGZyb20gcmVncmVzc2lvbi5weXRob25fdGVzdF91dGlscyBpbXBvcnQgdGVzdF91dGlscwogCi1E cml2ZXJSZWdpc3RyeS5sb2FkX2RyaXZlcnMoKQorRHJpdmVyUmVnaXN0cnkubG9hZF9tb2R1bGVz KCkKIAogCiBjbGFzcyBUZXN0Q29sdW1uRm9yZWlnbktleUdldENvbnN0cmFpbnRDb2xzKEJhc2VU ZXN0R2VuZXJhdG9yKToKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3V0aWxzL2RyaXZlci9fX2lu aXRfXy5weSBiL3dlYi9wZ2FkbWluL3V0aWxzL2RyaXZlci9fX2luaXRfXy5weQppbmRleCA1YzZk Njk0NWEuLmQ3NzQ4YzgzOSAxMDA2NDQKLS0tIGEvd2ViL3BnYWRtaW4vdXRpbHMvZHJpdmVyL19f aW5pdF9fLnB5CisrKyBiL3dlYi9wZ2FkbWluL3V0aWxzL2RyaXZlci9fX2luaXRfXy5weQpAQCAt MTIsMzIgKzEyLDE5IEBAIGZyb20gZmxhc2sgaW1wb3J0IGN1cnJlbnRfYXBwCiBmcm9tIC5yZWdp c3RyeSBpbXBvcnQgRHJpdmVyUmVnaXN0cnkKIAogCi1kZWYgZ2V0X2RyaXZlcih0eXBlLCBhcHA9 Tm9uZSk6Ci0gICAgaWYgYXBwIGlzIG5vdCBOb25lOgotICAgICAgICBEcml2ZXJSZWdpc3RyeS5s b2FkX2RyaXZlcnMoKQotCi0gICAgZHJpdmVycyA9IGdldGF0dHIoYXBwIG9yIGN1cnJlbnRfYXBw LCAnX3BnYWRtaW5fc2VydmVyX2RyaXZlcnMnLCBOb25lKQotCi0gICAgaWYgZHJpdmVycyBpcyBO b25lIG9yIG5vdCBpc2luc3RhbmNlKGRyaXZlcnMsIGRpY3QpOgotICAgICAgICBkcml2ZXJzID0g ZGljdCgpCitkZWYgZ2V0X2RyaXZlcihfdHlwZSwgYXBwPU5vbmUpOgogCi0gICAgaWYgdHlwZSBp biBkcml2ZXJzOgotICAgICAgICByZXR1cm4gZHJpdmVyc1t0eXBlXQotCi0gICAgZHJpdmVyID0g RHJpdmVyUmVnaXN0cnkuY3JlYXRlKHR5cGUpCi0KLSAgICBpZiBkcml2ZXIgaXMgbm90IE5vbmU6 Ci0gICAgICAgIGRyaXZlcnNbdHlwZV0gPSBkcml2ZXIKLSAgICAgICAgc2V0YXR0cihhcHAgb3Ig Y3VycmVudF9hcHAsICdfcGdhZG1pbl9zZXJ2ZXJfZHJpdmVycycsIGRyaXZlcnMpCisgICAgaWYg YXBwIGlzIG5vdCBOb25lOgorICAgICAgICBEcml2ZXJSZWdpc3RyeS5sb2FkX21vZHVsZXMoYXBw KQogCi0gICAgcmV0dXJuIGRyaXZlcgorICAgIHJldHVybiBEcml2ZXJSZWdpc3RyeS5nZXQoX3R5 cGUpCiAKIAogZGVmIGluaXRfYXBwKGFwcCk6CiAgICAgZHJpdmVycyA9IGRpY3QoKQogCiAgICAg c2V0YXR0cihhcHAsICdfcGdhZG1pbl9zZXJ2ZXJfZHJpdmVycycsIGRyaXZlcnMpCi0gICAgRHJp dmVyUmVnaXN0cnkubG9hZF9kcml2ZXJzKCkKKyAgICBEcml2ZXJSZWdpc3RyeS5sb2FkX21vZHVs ZXMoYXBwKQogCiAgICAgcmV0dXJuIGRyaXZlcnMKIApkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4v dXRpbHMvZHJpdmVyL3JlZ2lzdHJ5LnB5IGIvd2ViL3BnYWRtaW4vdXRpbHMvZHJpdmVyL3JlZ2lz dHJ5LnB5CmluZGV4IGFlNTM1NDI5Yi4uN2VlNWVlODliIDEwMDY0NAotLS0gYS93ZWIvcGdhZG1p bi91dGlscy9kcml2ZXIvcmVnaXN0cnkucHkKKysrIGIvd2ViL3BnYWRtaW4vdXRpbHMvZHJpdmVy L3JlZ2lzdHJ5LnB5CkBAIC05LDgwICs5LDkgQEAKIAogZnJvbSBhYmMgaW1wb3J0IEFCQ01ldGEK IAotZnJvbSBmbGFza19iYWJlbGV4IGltcG9ydCBnZXR0ZXh0Citmcm9tIHBnYWRtaW4udXRpbHMu ZHluYW1pY19yZWdpc3RyeSBpbXBvcnQgY3JlYXRlX3JlZ2lzdHJ5X21ldGFjbGFzcwogCiAKLWRl ZiBfZGVjb3JhdGVfY2xzX25hbWUobW9kdWxlX25hbWUpOgotICAgIGxlbmd0aCA9IGxlbihfX3Bh Y2thZ2VfXykgKyAxCi0KLSAgICBpZiBsZW4obW9kdWxlX25hbWUpID4gbGVuZ3RoIGFuZCBtb2R1 bGVfbmFtZS5zdGFydHN3aXRoKF9fcGFja2FnZV9fKToKLSAgICAgICAgcmV0dXJuIG1vZHVsZV9u YW1lW2xlbmd0aDpdCi0KLSAgICByZXR1cm4gbW9kdWxlX25hbWUKLQotCi1jbGFzcyBEcml2ZXJS ZWdpc3RyeShBQkNNZXRhKToKLSAgICAiIiIKLSAgICBjbGFzcyBEcml2ZXJSZWdpc3RyeShvYmpl Y3QpCi0gICAgICAgIEV2ZXJ5IERyaXZlciB3aWxsIGJlIHJlZ2lzdGVyZWQgYXV0b21hdGljYWxs eSBieSBpdHMgbW9kdWxlIG5hbWUuCi0KLSAgICAgICAgVGhpcyB1c2VzIGZhY3RvcnkgcGF0dGVy biB0byBnZW5yZWF0ZSBkcml2ZXIgb2JqZWN0IGJhc2VkIG9uIGl0cyBuYW1lCi0gICAgICAgIGF1 dG9tYXRpY2FsbHkuCi0KLSAgICBDbGFzcy1sZXZlbCBNZXRob2RzOgotICAgIC0tLS0tLS0tLS0t IC0tLS0tLS0KLSAgICAqIF9faW5pdF9fKC4uLikKLSAgICAgIC0gSXQgd2lsbCBiZSB1c2VkIHRv IHJlZ2lzdGVyIHR5cGUgb2YgZHJpdmVycy4gWW91IGRvbid0IG5lZWQgdG8gY2FsbAotICAgICAg ICB0aGlzIGZ1bmN0aW9uIGV4cGxpY2l0bHkuIFRoaXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGV4 ZWN1dGVkLCB3aGVuZXZlcgotICAgICAgICB3ZSBjcmVhdGUgY2xhc3MgYW5kIGluaGVyaXQgZnJv bSBCYXNlRHJpdmVyLCBpdCB3aWxsIHJlZ2lzdGVyIGl0IGFzCi0gICAgICAgIGF2YWlsYWJsZSBk cml2ZXIgaW4gRHJpdmVyUmVnaXN0cnkuIEJlY2F1c2UgLSB0aGUgX19tZXRhY2xhc3NfXyBmb3IK LSAgICAgICAgQmFzZURyaXZlciBpcyBzZXQgaXQgdG8gRHJpdmVyUmVnaXN0cnksIGFuZCBpdCB3 aWxsIGNyZWF0ZSBuZXcgaW5zdGFuY2UKLSAgICAgICAgb2YgdGhpcyBEcml2ZXJSZWdpc3RyeSBw ZXIgY2xhc3MuCi0KLSAgICAqIGNyZWF0ZSh0eXBlLCAqYXJncywgKiprd2FyZ3MpCi0gICAgICAt IENyZWF0ZSB0eXBlIG9mIGRyaXZlciBvYmplY3QgZm9yIHRoaXMgc2VydmVyLCBmcm9tIHRoZSBh dmFpbGFibGUKLSAgICAgICAgZHJpdmVyIGxpc3QgKGlmIGF2YWlsYWJsZSwgb3IgcmFpc2UgZXhj ZXB0aW9uKS4KLQotICAgICogbG9hZF9kcml2ZXJzKCk6Ci0gICAgICAtIFVzZSB0aGlzIGZ1bmN0 aW9uIGZyb20gaW5pdF9hcHAoLi4uKSB0byBsb2FkIGFsbCBhdmFpbGFibGUgZHJpdmVycyBpbgot ICAgICAgICB0aGUgcmVnaXN0cnkuCi0gICAgIiIiCi0gICAgcmVnaXN0cnkgPSBOb25lCi0gICAg ZHJpdmVycyA9IGRpY3QoKQotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGJhc2VzLCBk KToKLQotICAgICAgICAjIFJlZ2lzdGVyIHRoaXMgdHlwZSBvZiBkcml2ZXIsIGJhc2VkIG9uIHRo ZSBtb2R1bGUgbmFtZQotICAgICAgICAjIEF2b2lkIHJlZ2lzdGVyaW5nIHRoZSBCYXNlRHJpdmVy IGl0c2VsZgotCi0gICAgICAgIGlmIG5hbWUgIT0gJ0Jhc2VEcml2ZXInOgotICAgICAgICAgICAg RHJpdmVyUmVnaXN0cnkucmVnaXN0cnlbX2RlY29yYXRlX2Nsc19uYW1lKGRbJ19fbW9kdWxlX18n XSldID0gc2VsZgotCi0gICAgICAgIEFCQ01ldGEuX19pbml0X18oc2VsZiwgbmFtZSwgYmFzZXMs IGQpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgY3JlYXRlKGNscywgbmFtZSwgKiprd2Fy Z3MpOgotCi0gICAgICAgIGlmIG5hbWUgaW4gRHJpdmVyUmVnaXN0cnkuZHJpdmVyczoKLSAgICAg ICAgICAgIHJldHVybiBEcml2ZXJSZWdpc3RyeS5kcml2ZXJzW25hbWVdCi0KLSAgICAgICAgaWYg bmFtZSBpbiBEcml2ZXJSZWdpc3RyeS5yZWdpc3RyeToKLSAgICAgICAgICAgIERyaXZlclJlZ2lz dHJ5LmRyaXZlcnNbbmFtZV0gPSBcCi0gICAgICAgICAgICAgICAgKERyaXZlclJlZ2lzdHJ5LnJl Z2lzdHJ5W25hbWVdKSgqKmt3YXJncykKLSAgICAgICAgICAgIHJldHVybiBEcml2ZXJSZWdpc3Ry eS5kcml2ZXJzW25hbWVdCi0KLSAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKLSAg ICAgICAgICAgIGdldHRleHQoIkRyaXZlciAnezB9JyBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQu IikuZm9ybWF0KG5hbWUpCi0gICAgICAgICkKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBs b2FkX2RyaXZlcnMoY2xzKToKLSAgICAgICAgIyBJbml0aWFsaXplIHRoZSByZWdpc3RyeSBvbmx5 IGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQKLSAgICAgICAgaWYgRHJpdmVyUmVn aXN0cnkucmVnaXN0cnkgaXMgTm9uZToKLSAgICAgICAgICAgIERyaXZlclJlZ2lzdHJ5LnJlZ2lz dHJ5ID0gZGljdCgpCi0KLSAgICAgICAgZnJvbSBpbXBvcnRsaWIgaW1wb3J0IGltcG9ydF9tb2R1 bGUKLSAgICAgICAgZnJvbSB3ZXJremV1Zy51dGlscyBpbXBvcnQgZmluZF9tb2R1bGVzCi0KLSAg ICAgICAgZm9yIG1vZHVsZV9uYW1lIGluIGZpbmRfbW9kdWxlcyhfX3BhY2thZ2VfXywgVHJ1ZSk6 Ci0gICAgICAgICAgICBpbXBvcnRfbW9kdWxlKG1vZHVsZV9uYW1lKQorRHJpdmVyUmVnaXN0cnkg PSBjcmVhdGVfcmVnaXN0cnlfbWV0YWNsYXNzKAorICAgICJEcml2ZXJSZWdpc3RyeSIsIF9fcGFj a2FnZV9fLCBkZWNvcmF0ZV9hc19tb2R1bGU9VHJ1ZQorKQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRt aW4vdXRpbHMvZHluYW1pY19yZWdpc3RyeS9fX2luaXRfXy5weSBiL3dlYi9wZ2FkbWluL3V0aWxz L2R5bmFtaWNfcmVnaXN0cnkvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwLi5kYWJkZTNhOTUKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi91dGls cy9keW5hbWljX3JlZ2lzdHJ5L19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMTA0IEBACisjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIworIworIyBwZ0FkbWluIDQgLSBQb3N0Z3JlU1FMIFRvb2xzCisjCisjIENvcHly aWdodCAoQykgMjAxMyAtIDIwMjEsIFRoZSBwZ0FkbWluIERldmVsb3BtZW50IFRlYW0KKyMgVGhp cyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgUG9zdGdyZVNRTCBMaWNlbmNlCisjCisj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjCisKKyIiIlRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIGNy ZWF0aW5nIGR5bmFtaWMgcmVnaXN0cnkgbWV0YSBjbGFzcy4iIiIKKworZnJvbSBhYmMgaW1wb3J0 IEFCQ01ldGEKKworCisjIENvbnN0cnVjdG9yCitkZWYgX19jb25zdHJ1Y3RvcihzZWxmLCBuYW1l LCBiYXNlcywga3dhcmdzKToKKyAgICAjIFJlZ2lzdGVyIHRoaXMgdHlwZSBvZiBhdXRoX3NvdXJj ZXMsIGJhc2VkIG9uIHRoZSBtb2R1bGUgbmFtZQorICAgICMgQXZvaWQgcmVnaXN0ZXJpbmcgdGhl IEJhc2VBdXRoZW50aWNhdGlvbiBpdHNlbGYKKyAgICBjbHMgPSBzZWxmLl9fY2xhc3NfXworICAg IGVudHJ5ID0gc2VsZi5fZGVjb3JhdGVfY2xzX25hbWUobmFtZSwga3dhcmdzKQorCisgICAgaWYg Y2xzLl9yZWdpc3RyeSBpcyBOb25lOgorICAgICAgICBjbHMuX3JlZ2lzdHJ5ID0gZGljdCgpCisg ICAgZWxzZToKKyAgICAgICAgaWYgZW50cnkgaW4gY2xzLl9yZWdpc3RyeToKKyAgICAgICAgICAg IHJhaXNlIFJ1bnRpbWVFcnJvcigoCisgICAgICAgICAgICAgICAgInt9IGNsYXNzIGlzIGFscmVh ZHkgYmVlbiByZWdpc3RlcmVkIHdpdGgge30gIgorICAgICAgICAgICAgICAgICIocGFja2FnZTog e30pIgorICAgICAgICAgICAgKS5mb3JtYXQoZW50cnksIGNscy5fbmFtZV8sIGNscy5fcGFja2Fn ZV8pKQorCisgICAgaWYgY2xzLl9pbml0aWFsaXplZCBpcyBUcnVlOgorICAgICAgICBjbHMuX3Jl Z2lzdHJ5W2VudHJ5XSA9IHNlbGYKKyAgICBjbHMuX2luaXRpYWxpemVkID0gVHJ1ZQorCisgICAg QUJDTWV0YS5fX2luaXRfXyhzZWxmLCBuYW1lLCBiYXNlcywga3dhcmdzKQorCisKK0BjbGFzc21l dGhvZAorZGVmIF9fZ2V0KGNscywgbmFtZSwgKiprd2FyZ3MpOgorICAgIGlmIG5hbWUgaW4gY2xz Ll9vYmplY3RzOgorICAgICAgICByZXR1cm4gY2xzLl9vYmplY3RzW25hbWVdCisKKyAgICBpZiBj bHMuX3JlZ2lzdHJ5IGlzIG5vdCBOb25lIGFuZCBuYW1lIGluIGNscy5fcmVnaXN0cnk6CisgICAg ICAgIGNscy5fb2JqZWN0c1tuYW1lXSA9IChjbHMuX3JlZ2lzdHJ5W25hbWVdKSgqKmt3YXJncykK KworICAgICAgICByZXR1cm4gY2xzLl9vYmplY3RzW25hbWVdCisKKyAgICByYWlzZSBOb3RJbXBs ZW1lbnRlZEVycm9yKAorICAgICAgICAie30gJ3t9JyBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQu Ii5mb3JtYXQoY2xzLl9fbmFtZV9fLCBuYW1lKQorICAgICkKKworCitAY2xhc3NtZXRob2QKK2Rl ZiBfX2xvYWRfbW9kdWxlcyhjbHMsIGFwcD1Ob25lKToKKyAgICAjIEluaXRpYWxpemUgdGhlIHJl Z2lzdHJ5IG9ubHkgaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBpbml0aWFsaXplZAorICAgIGlmIGNs cy5fcmVnaXN0cnkgaXMgTm9uZToKKyAgICAgICAgY2xzLl9yZWdpc3RyeSA9IGRpY3QoKQorCisg ICAgZnJvbSBpbXBvcnRsaWIgaW1wb3J0IGltcG9ydF9tb2R1bGUKKyAgICBmcm9tIHdlcmt6ZXVn LnV0aWxzIGltcG9ydCBmaW5kX21vZHVsZXMKKworICAgIGZvciBtb2R1bGVfbmFtZSBpbiBmaW5k X21vZHVsZXMoY2xzLl9wYWNrYWdlXywgVHJ1ZSk6CisgICAgICAgIG1vZHVsZSA9IGltcG9ydF9t b2R1bGUobW9kdWxlX25hbWUpCisKKyAgICAgICAgaWYgImluaXRfYXBwIiBpbiBtb2R1bGUuX19k aWN0X18ua2V5cygpOgorICAgICAgICAgICAgbW9kdWxlLl9fZGljdF9fWyJpbml0X2FwcCJdKGFw cCkKKworCitkZWYgX19nZXRfbW9kdWxlX25hbWUoc2VsZiwgbmFtZSwga3dhcmdzKToKKyAgICBt b2R1bGVfbmFtZSA9IGt3YXJnc1siX19tb2R1bGVfXyJdCisgICAgbGVuZ3RoID0gbGVuKHNlbGYu X3BhY2thZ2VfKSArIDEKKworICAgIGlmIGxlbihtb2R1bGVfbmFtZSkgPiBsZW5ndGggYW5kIG1v ZHVsZV9uYW1lLnN0YXJ0c3dpdGgoc2VsZi5fcGFja2FnZV8pOgorICAgICAgICByZXR1cm4gbW9k dWxlX25hbWVbbGVuZ3RoOl0KKworICAgIHJldHVybiBtb2R1bGVfbmFtZQorCisKK2RlZiBfX2dl dF9jbGFzc19uYW1lKHNlbGYsIG5hbWUsIGt3YXJncyk6CisgICAgcmV0dXJuIG5hbWUKKworCitk ZWYgY3JlYXRlX3JlZ2lzdHJ5X21ldGFjbGFzcyhuYW1lLCBwYWNrYWdlLCBkZWNvcmF0ZV9hc19t b2R1bGU9VHJ1ZSk6CisKKyAgICBjbGFzc19wYXJhbXMgPSB7CisgICAgICAgICMgY29uc3RydWN0 b3IKKyAgICAgICAgIl9faW5pdF9fIjogX19jb25zdHJ1Y3RvciwKKworICAgICAgICAjIENsYXNz IG1lbWJlcnMKKyAgICAgICAgIl9yZWdpc3RyeSI6IE5vbmUsCisgICAgICAgICJfb2JqZWN0cyI6 IGRpY3QoKSwKKyAgICAgICAgIl9wYWNrYWdlXyI6IHBhY2thZ2UsCisKKyAgICAgICAgIyBNZW1i ZXIgZnVuY3Rpb25zCisgICAgICAgICJnZXQiOiBfX2dldCwKKyAgICAgICAgImxvYWRfbW9kdWxl cyI6IF9fbG9hZF9tb2R1bGVzLAorICAgICAgICAiX25hbWVfIjogbmFtZSwKKyAgICAgICAgIl9k ZWNvcmF0ZV9jbHNfbmFtZSI6IF9fZ2V0X21vZHVsZV9uYW1lCisgICAgICAgIGlmIGRlY29yYXRl X2FzX21vZHVsZSBpcyBUcnVlIGVsc2UgX19nZXRfY2xhc3NfbmFtZSwKKyAgICAgICAgIl9pbml0 aWFsaXplZCI6IEZhbHNlLAorICAgIH0KKworICAgICMgQ3JlYXRpbmcgY2xhc3MgZHluYW1pY2Fs bHkKKyAgICByZXR1cm4gdHlwZShwYWNrYWdlICsgIi4iICsgbmFtZSwgKEFCQ01ldGEsICksIGNs YXNzX3BhcmFtcykKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3V0aWxzL2R5bmFtaWNfcmVnaXN0 cnkvdGVzdHMvX19pbml0X18ucHkgYi93ZWIvcGdhZG1pbi91dGlscy9keW5hbWljX3JlZ2lzdHJ5 L3Rlc3RzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMC4u ODkxOTBiMzE2Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vdXRpbHMvZHluYW1pY19y ZWdpc3RyeS90ZXN0cy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDggQEAKKyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj CisjCisjIHBnQWRtaW4gNCAtIFBvc3RncmVTUUwgVG9vbHMKKyMKKyMgQ29weXJpZ2h0IChDKSAy MDEzIC0gMjAyMSwgVGhlIHBnQWRtaW4gRGV2ZWxvcG1lbnQgVGVhbQorIyBUaGlzIHNvZnR3YXJl IGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBQb3N0Z3JlU1FMIExpY2VuY2UKKyMKKyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi91dGlscy9keW5hbWljX3JlZ2lzdHJ5L3Rl c3RzL3JlZ2lzdHJ5L19faW5pdF9fLnB5IGIvd2ViL3BnYWRtaW4vdXRpbHMvZHluYW1pY19yZWdp c3RyeS90ZXN0cy9yZWdpc3RyeS9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAuLmQ2NDU1YjY3ZgotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3V0 aWxzL2R5bmFtaWNfcmVnaXN0cnkvdGVzdHMvcmVnaXN0cnkvX19pbml0X18ucHkKQEAgLTAsMCAr MSw5OSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgcGdBZG1pbiA0IC0gUG9zdGdyZVNRTCBUb29s cworIworIyBDb3B5cmlnaHQgKEMpIDIwMTMgLSAyMDIxLCBUaGUgcGdBZG1pbiBEZXZlbG9wbWVu dCBUZWFtCisjIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIFBvc3RncmVTUUwg TGljZW5jZQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ltcG9ydCBzaXgKK2Zyb20gcGdhZG1pbi51 dGlscy5keW5hbWljX3JlZ2lzdHJ5IGltcG9ydCBjcmVhdGVfcmVnaXN0cnlfbWV0YWNsYXNzCitm cm9tIC5yZWdpc3RyeSBpbXBvcnQgVGVzdE1vZHVsZVJlZ2lzdHJ5LCBUZXN0TmFtZWRSZWdpc3Ry eSwgVGVzdE5hbWVCYXNlCitmcm9tIC50ZXN0MSBpbXBvcnQgVGVzdE1vZHVsZTEKKworCitkZWYg dGVzdF9sb2FkX21vZHVsZXNfYmFzZWRfcmVnaXN0cnkoKToKKyAgICBUZXN0TW9kdWxlUmVnaXN0 cnkubG9hZF9tb2R1bGVzKCkKKworICAgIGlmIGxlbihUZXN0TW9kdWxlUmVnaXN0cnkuX3JlZ2lz dHJ5KSAhPSAyOgorICAgICAgICByZXR1cm4gIkxlbmd0aCBvZiB0aGUgcmVnaXN0cnkgc2hvdWxk IGhhdmUgYmVlbiAyIgorCisgICAgaWYgJ3Rlc3QxJyBub3QgaW4gVGVzdE1vZHVsZVJlZ2lzdHJ5 Ll9yZWdpc3RyeToKKyAgICAgICAgcmV0dXJuICIndGVzdDEnIGlzIG5vdCBmb3VuZCBpbiB0aGUg cmVnaXN0cnkiCisKKyAgICBpZiAndGVzdDInIG5vdCBpbiBUZXN0TW9kdWxlUmVnaXN0cnkuX3Jl Z2lzdHJ5OgorICAgICAgICByZXR1cm4gIid0ZXN0MicgaXMgbm90IGZvdW5kIGluIHRoZSByZWdp c3RyeSIKKworICAgIG9ial90ZXN0MV8xID0gVGVzdE1vZHVsZVJlZ2lzdHJ5LmdldCgndGVzdDEn KQorICAgIG9ial90ZXN0MV8yID0gVGVzdE1vZHVsZVJlZ2lzdHJ5LmdldCgndGVzdDEnKQorICAg IG9ial90ZXN0Ml8xID0gVGVzdE1vZHVsZVJlZ2lzdHJ5LmdldCgndGVzdDInKQorCisgICAgaWYg aWQob2JqX3Rlc3QxXzEpICE9IGlkKG9ial90ZXN0MV8yKToKKyAgICAgICAgcmV0dXJuICJSZWdp c3RyeSBoYXMgY3JlYXRlZCB0d28gc2VwYXJhdGUgaW5zdGFuY2VzIgorCisgICAgaWYgaXNpbnN0 YW5jZShvYmpfdGVzdDFfMSwgVGVzdE1vZHVsZTEpIGlzIEZhbHNlOgorICAgICAgICByZXR1cm4g IlJlZ2lzdHJ5IGNyZWF0ZWQgd3Jvbmcgb2JqZWN0IgorCisgICAgaWYgaWQob2JqX3Rlc3QxXzEp ID09IGlkKG9ial90ZXN0Ml8xKToKKyAgICAgICAgcmV0dXJuICJSZWdpc3RyeSBzaG91bGQgaGF2 ZSBjcmVhdGVkIGEgc2VwYXJhdGUgaW5zdGFuY2VzIGZvciAiIFwKKyAgICAgICAgICAgICJkaWZm ZXJlbnQgY2xhc3NlcyIKKworCitkZWYgdGVzdF9sb2FkX2NsYXNzbmFtZV9yZWdpc3RyeSgpOgor ICAgIFRlc3ROYW1lZFJlZ2lzdHJ5LmxvYWRfbW9kdWxlcygpCisKKyAgICBpZiAnQ2xhc3NUZXN0 TmFtZTEnIG5vdCBpbiBUZXN0TmFtZWRSZWdpc3RyeS5fcmVnaXN0cnk6CisgICAgICAgIHJldHVy biAiJ0NsYXNzVGVzdE5hbWUxJyBpcyBub3QgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5IgorCisgICAg aWYgJ0NsYXNzVGVzdE5hbWUyJyBub3QgaW4gVGVzdE5hbWVkUmVnaXN0cnkuX3JlZ2lzdHJ5Ogor ICAgICAgICByZXR1cm4gIidDbGFzc1Rlc3ROYW1lMicgaXMgbm90IGZvdW5kIGluIHRoZSByZWdp c3RyeSIKKworICAgIG9ial90ZXN0MV8xID0gVGVzdE5hbWVkUmVnaXN0cnkuZ2V0KCdDbGFzc1Rl c3ROYW1lMScpCisgICAgb2JqX3Rlc3QxXzIgPSBUZXN0TmFtZWRSZWdpc3RyeS5nZXQoJ0NsYXNz VGVzdE5hbWUxJykKKyAgICBvYmpfdGVzdDJfMSA9IFRlc3ROYW1lZFJlZ2lzdHJ5LmdldCgnQ2xh c3NUZXN0TmFtZTInKQorCisgICAgaWYgaWQob2JqX3Rlc3QxXzEpICE9IGlkKG9ial90ZXN0MV8y KToKKyAgICAgICAgcmV0dXJuICJSZWdpc3RyeSBoYXMgY3JlYXRlZCB0d28gc2VwYXJhdGUgaW5z dGFuY2VzIgorCisgICAgaWYgaWQob2JqX3Rlc3QxXzEpID09IGlkKG9ial90ZXN0Ml8xKToKKyAg ICAgICAgcmV0dXJuICJSZWdpc3RyeSBzaG91bGQgaGF2ZSBjcmVhdGVkIGEgc2VwYXJhdGUgaW5z dGFuY2VzIGZvciAiIFwKKyAgICAgICAgICAgICJkaWZmZXJlbnQgY2xhc3NlcyIKKworICAgIHRy eToKKyAgICAgICAgY2xhc3MgQ2xhc3NUZXN0TmFtZTEoVGVzdE5hbWVCYXNlKTogICMgTk9TT05B UgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHJldHVybiAiRXhwZWN0ZWQgYW4gcnVudGlt ZSBlcnJvciB3aGVuIHVzaW5nIHRoZSBzYW1lIGNsYXNzbmFtZSIKKyAgICBleGNlcHQgUnVudGlt ZUVycm9yOgorICAgICAgICBwYXNzCisKKworZGVmIHRlc3RfZW1wdHlfcmVnaXN0cnkoKToKKwor ICAgIEVtcHR5TW9kdWxlUmVnaXN0cnkgPSBjcmVhdGVfcmVnaXN0cnlfbWV0YWNsYXNzKCAgIyBO T1NPTkFSCisgICAgICAgICJFbXB0eU1vZHVsZVJlZ2lzdHJ5IiwgX19wYWNrYWdlX18sIGRlY29y YXRlX2FzX21vZHVsZT1UcnVlCisgICAgKQorCisgICAgaWYgRW1wdHlNb2R1bGVSZWdpc3RyeS5f cmVnaXN0cnkgaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiAiUmVnaXN0cnkgd2FzIHN1cHBv c2VkIHRvIGJlIE5vbmUiCisKKyAgICBpZiBFbXB0eU1vZHVsZVJlZ2lzdHJ5Ll9pbml0aWFsaXpl ZCBpcyBub3QgRmFsc2U6CisgICAgICAgIHJldHVybiAiUmVnaXN0cnkgaW5pdGlhbGl6ZWQgZmxh ZyBzaG91bGQgYmUgZmFsc2UiCisKKworZGVmIHRlc3RfY3JlYXRlX2Jhc2VfY2xhc3MoKToKKyAg ICBSZWdpc3RyeVdpdGhCYXNlQ2xhc3MgPSBjcmVhdGVfcmVnaXN0cnlfbWV0YWNsYXNzKCAgIyBO T1NPTkFSCisgICAgICAgICdSZWdpc3RyeVdpdGhCYXNlQ2xhc3MnLCBfX3BhY2thZ2VfXywgZGVj b3JhdGVfYXNfbW9kdWxlPUZhbHNlCisgICAgKQorCisgICAgQHNpeC5hZGRfbWV0YWNsYXNzKFJl Z2lzdHJ5V2l0aEJhc2VDbGFzcykKKyAgICBjbGFzcyBUZXN0QmFzZShvYmplY3QpOgorICAgICAg ICBwYXNzCisKKyAgICByZWdpc3RyeSA9IFJlZ2lzdHJ5V2l0aEJhc2VDbGFzcy5fcmVnaXN0cnkK KworICAgIGlmIHJlZ2lzdHJ5IGlzIE5vbmUgb3IgbGVuKHJlZ2lzdHJ5KSAhPSAwOgorICAgICAg ICByZXR1cm4gIlJlZ2lzdHJ5IHdhcyBub3Qgc3VwcG9zZWQgdG8gYmUgTm9uZSwgYW5kIGVtcHR5 IgorCisgICAgaWYgUmVnaXN0cnlXaXRoQmFzZUNsYXNzLl9pbml0aWFsaXplZCBpcyBGYWxzZToK KyAgICAgICAgcmV0dXJuICJSZWdpc3RyeSBpbml0aWFsaXplZCBmbGFnIHNob3VsZCBub3QgYmUg dHJ1ZSIKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3V0aWxzL2R5bmFtaWNfcmVnaXN0cnkvdGVz dHMvcmVnaXN0cnkvcmVnaXN0cnkucHkgYi93ZWIvcGdhZG1pbi91dGlscy9keW5hbWljX3JlZ2lz dHJ5L3Rlc3RzL3JlZ2lzdHJ5L3JlZ2lzdHJ5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMC4uYWM4M2JlZWJjCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vdXRp bHMvZHluYW1pY19yZWdpc3RyeS90ZXN0cy9yZWdpc3RyeS9yZWdpc3RyeS5weQpAQCAtMCwwICsx LDM4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBwZ0FkbWluIDQgLSBQb3N0Z3JlU1FMIFRvb2xz CisjCisjIENvcHlyaWdodCAoQykgMjAxMyAtIDIwMjEsIFRoZSBwZ0FkbWluIERldmVsb3BtZW50 IFRlYW0KKyMgVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgUG9zdGdyZVNRTCBM aWNlbmNlCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaW1wb3J0IHNpeAorZnJvbSBwZ2FkbWluLnV0 aWxzLmR5bmFtaWNfcmVnaXN0cnkgaW1wb3J0IGNyZWF0ZV9yZWdpc3RyeV9tZXRhY2xhc3MKKwor CitUZXN0TW9kdWxlUmVnaXN0cnkgPSBjcmVhdGVfcmVnaXN0cnlfbWV0YWNsYXNzKAorICAgICdU ZXN0TW9kdWxlUmVnaXN0cnknLCBfX3BhY2thZ2VfXywgZGVjb3JhdGVfYXNfbW9kdWxlPVRydWUK KykKKworCitUZXN0TmFtZWRSZWdpc3RyeSA9IGNyZWF0ZV9yZWdpc3RyeV9tZXRhY2xhc3MoCisg ICAgJ1Rlc3RSZWdpc3RyeScsIF9fcGFja2FnZV9fLCBkZWNvcmF0ZV9hc19tb2R1bGU9RmFsc2UK KykKKworCitAc2l4LmFkZF9tZXRhY2xhc3MoVGVzdE1vZHVsZVJlZ2lzdHJ5KQorY2xhc3MgVGVz dE1vZHVsZUJhc2Uob2JqZWN0KToKKyAgICBwYXNzCisKKworQHNpeC5hZGRfbWV0YWNsYXNzKFRl c3ROYW1lZFJlZ2lzdHJ5KQorY2xhc3MgVGVzdE5hbWVCYXNlKG9iamVjdCk6CisgICAgcGFzcwor CisKK2NsYXNzIENsYXNzVGVzdE5hbWUxKFRlc3ROYW1lQmFzZSk6CisgICAgcGFzcworCisKK2Ns YXNzIENsYXNzVGVzdE5hbWUyKFRlc3ROYW1lQmFzZSk6CisgICAgcGFzcwpkaWZmIC0tZ2l0IGEv d2ViL3BnYWRtaW4vdXRpbHMvZHluYW1pY19yZWdpc3RyeS90ZXN0cy9yZWdpc3RyeS90ZXN0MS5w eSBiL3dlYi9wZ2FkbWluL3V0aWxzL2R5bmFtaWNfcmVnaXN0cnkvdGVzdHMvcmVnaXN0cnkvdGVz dDEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwLi44ZjhmMjVkYjAKLS0t IC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi91dGlscy9keW5hbWljX3JlZ2lzdHJ5L3Rlc3Rz L3JlZ2lzdHJ5L3Rlc3QxLnB5CkBAIC0wLDAgKzEsMTUgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisj IHBnQWRtaW4gNCAtIFBvc3RncmVTUUwgVG9vbHMKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEzIC0g MjAyMSwgVGhlIHBnQWRtaW4gRGV2ZWxvcG1lbnQgVGVhbQorIyBUaGlzIHNvZnR3YXJlIGlzIHJl bGVhc2VkIHVuZGVyIHRoZSBQb3N0Z3JlU1FMIExpY2VuY2UKKyMKKyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj CisKK2Zyb20gLnJlZ2lzdHJ5IGltcG9ydCBUZXN0TW9kdWxlQmFzZQorCisKKyMgVGhpcyBjbGFz cyB3aWxsIGJlIHJlZ2lzdGVyZWQgd2l0aCBUZXN0TW9kdWxlUmVnaXN0cnkgKHJlZ2lzdHJ5KQor Y2xhc3MgVGVzdE1vZHVsZTEoVGVzdE1vZHVsZUJhc2UpOgorICAgIHBhc3MKZGlmZiAtLWdpdCBh L3dlYi9wZ2FkbWluL3V0aWxzL2R5bmFtaWNfcmVnaXN0cnkvdGVzdHMvcmVnaXN0cnkvdGVzdDIu cHkgYi93ZWIvcGdhZG1pbi91dGlscy9keW5hbWljX3JlZ2lzdHJ5L3Rlc3RzL3JlZ2lzdHJ5L3Rl c3QyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMC4uYzliMDQ1ODk1Ci0t LSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vdXRpbHMvZHluYW1pY19yZWdpc3RyeS90ZXN0 cy9yZWdpc3RyeS90ZXN0Mi5weQpAQCAtMCwwICsxLDE0IEBACisjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIwor IyBwZ0FkbWluIDQgLSBQb3N0Z3JlU1FMIFRvb2xzCisjCisjIENvcHlyaWdodCAoQykgMjAxMyAt IDIwMjEsIFRoZSBwZ0FkbWluIERldmVsb3BtZW50IFRlYW0KKyMgVGhpcyBzb2Z0d2FyZSBpcyBy ZWxlYXNlZCB1bmRlciB0aGUgUG9zdGdyZVNRTCBMaWNlbmNlCisjCisjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IworZnJvbSAucmVnaXN0cnkgaW1wb3J0IFRlc3RNb2R1bGVCYXNlCisKKworIyBUaGlzIGNsYXNz IHdpbGwgYmUgcmVnaXN0ZXJlZCB3aXRoIFRlc3RNb2R1bGVSZWdpc3RyeSAocmVnaXN0cnkpCitj bGFzcyBUZXN0TW9kdWxlMihUZXN0TW9kdWxlQmFzZSk6CisgICAgcGFzcwpkaWZmIC0tZ2l0IGEv d2ViL3BnYWRtaW4vdXRpbHMvZHluYW1pY19yZWdpc3RyeS90ZXN0cy90ZXN0X2R5bmFtaWNfcmVn aXN0cnkucHkgYi93ZWIvcGdhZG1pbi91dGlscy9keW5hbWljX3JlZ2lzdHJ5L3Rlc3RzL3Rlc3Rf ZHluYW1pY19yZWdpc3RyeS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAu LjUyMTM2YjA2OQotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3V0aWxzL2R5bmFtaWNf cmVnaXN0cnkvdGVzdHMvdGVzdF9keW5hbWljX3JlZ2lzdHJ5LnB5CkBAIC0wLDAgKzEsMzkgQEAK KyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjCisjCisjIHBnQWRtaW4gNCAtIFBvc3RncmVTUUwgVG9vbHMKKyMKKyMg Q29weXJpZ2h0IChDKSAyMDEzIC0gMjAyMSwgVGhlIHBnQWRtaW4gRGV2ZWxvcG1lbnQgVGVhbQor IyBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBQb3N0Z3JlU1FMIExpY2VuY2UK KyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmcm9tIHBnYWRtaW4udXRpbHMucm91dGUgaW1wb3J0IEJh c2VUZXN0R2VuZXJhdG9yCitmcm9tIC5yZWdpc3RyeSBpbXBvcnQgdGVzdF9sb2FkX21vZHVsZXNf YmFzZWRfcmVnaXN0cnksIHRlc3RfZW1wdHlfcmVnaXN0cnksIFwKKyAgICB0ZXN0X2NyZWF0ZV9i YXNlX2NsYXNzLCB0ZXN0X2xvYWRfY2xhc3NuYW1lX3JlZ2lzdHJ5CisKKworY2xhc3MgVGVzdER5 bmFtaWNSZWdpc3RyeShCYXNlVGVzdEdlbmVyYXRvcik6CisKKyAgICBzY2VuYXJpb3MgPSBbCisg ICAgICAgICgKKyAgICAgICAgICAgICJDaGVjayBlbXB0eSByZWdpc3RyeSIsCisgICAgICAgICAg ICBkaWN0KHRlc3Q9dGVzdF9lbXB0eV9yZWdpc3RyeSksCisgICAgICAgICksCisgICAgICAgICgK KyAgICAgICAgICAgICdMb2FkIHRoZSByZWdpc3RyeSBiYXNlZCBvbiB0aGUgbW9kdWxlcycsCisg ICAgICAgICAgICBkaWN0KHRlc3Q9dGVzdF9sb2FkX21vZHVsZXNfYmFzZWRfcmVnaXN0cnkpLAor ICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAnTG9hZCB0aGUgcmVnaXN0cnkgYmFz ZWQgb24gdGhlIG5hbWUgb2YgdGhlIGNsYXNzZXMnLAorICAgICAgICAgICAgZGljdCh0ZXN0PXRl c3RfbG9hZF9jbGFzc25hbWVfcmVnaXN0cnkpLAorICAgICAgICApLAorICAgICAgICAoCisgICAg ICAgICAgICAiV2hlbiBjcmVhdGVkIGEgYmFzZSBjbGFzcyByZWdpc3RyeSBpcyBpbml0aWFsaXpl ZCIsCisgICAgICAgICAgICBkaWN0KHRlc3Q9dGVzdF9jcmVhdGVfYmFzZV9jbGFzcyksCisgICAg ICAgICksCisgICAgXQorCisgICAgZGVmIHJ1blRlc3Qoc2VsZik6CisgICAgICAgIGVycm9yID0g c2VsZi50ZXN0KCkKKworICAgICAgICBpZiBlcnJvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAg IHNlbGYuZmFpbChlcnJvcikKZGlmZiAtLWdpdCBhL3dlYi9yZWdyZXNzaW9uL3B5dGhvbl90ZXN0 X3V0aWxzL3NxbF90ZW1wbGF0ZV90ZXN0X2Jhc2UucHkgYi93ZWIvcmVncmVzc2lvbi9weXRob25f dGVzdF91dGlscy9zcWxfdGVtcGxhdGVfdGVzdF9iYXNlLnB5CmluZGV4IGUzYTM4MTY3NS4uMmI5 ZmU3NmIwIDEwMDY0NAotLS0gYS93ZWIvcmVncmVzc2lvbi9weXRob25fdGVzdF91dGlscy9zcWxf dGVtcGxhdGVfdGVzdF9iYXNlLnB5CisrKyBiL3dlYi9yZWdyZXNzaW9uL3B5dGhvbl90ZXN0X3V0 aWxzL3NxbF90ZW1wbGF0ZV90ZXN0X2Jhc2UucHkKQEAgLTE1LDcgKzE1LDcgQEAgZnJvbSBwZ2Fk bWluLnV0aWxzLmRyaXZlciBpbXBvcnQgRHJpdmVyUmVnaXN0cnkKIGZyb20gcGdhZG1pbi51dGls cy52ZXJzaW9uZWRfdGVtcGxhdGVfbG9hZGVyIFwKICAgICBpbXBvcnQgZ2V0X3ZlcnNpb25fbWFw cGluZ19kaXJlY3RvcmllcwogCi1Ecml2ZXJSZWdpc3RyeS5sb2FkX2RyaXZlcnMoKQorRHJpdmVy UmVnaXN0cnkubG9hZF9tb2R1bGVzKCkKIAogCiBjbGFzcyBTUUxUZW1wbGF0ZVRlc3RCYXNlKEJh c2VUZXN0R2VuZXJhdG9yKToK --000000000000f52da605c56faa4a--