From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id CCDB2C3DA60 for ; Wed, 17 Jul 2024 16:45:06 +0000 (UTC) Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) by mx.groups.io with SMTP id smtpd.web11.3230.1721234697266320757 for ; Wed, 17 Jul 2024 09:44:57 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20230601 header.b=ND3cS/kz; spf=pass (domain: gmail.com, ip: 209.85.128.49, mailfrom: adrian.freihofer@gmail.com) Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-42660b8dd27so48524325e9.3 for ; Wed, 17 Jul 2024 09:44:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1721234696; x=1721839496; darn=lists.openembedded.org; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:to:from:subject:message-id:from:to:cc:subject:date :message-id:reply-to; bh=SHHDtDXanmm22v8VAxAAp50bFn2BIkU97EYqJUAklbI=; b=ND3cS/kztDi7TgYedRFOJzT4pls0XB70R7RltmZrcW5zbOpzAq5EAyY4gD+POPIHDn dnY7tXV3SmqlHka03Z1UHc1sgl5kgyQekDFJzCDV/UQi4vQLoT2no0WEPh/dU4r+qAUn YeKdsrakygOWl3GoJW0+JPtLQjuAHsvr2148PLHvRT/s/MgkkQCkk4u5HXIm04CZ1qAz Y7jVVTPOEeMCbP3HU+sJkfQ9ffu3IRUKgc/Q72aYLc9RaDl+dxH42O9pnFAtzuazBIAx UDz1y+2gvzMQ4+UtbG/zgxq94KOGOLGt4yiixiFnwCZhjgFnjFv0zd2H9ECNn3/kWlbd BVIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1721234696; x=1721839496; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:to:from:subject:message-id:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=SHHDtDXanmm22v8VAxAAp50bFn2BIkU97EYqJUAklbI=; b=OuN1PmvNU8nOjZNw45LHtqCAwKJutsxzNDTTjO9naPrrIby9fV5atI+0lBiLjv2XgC U17nceEpaNBjP5EGXzdV/wQIWCnHGhJrnrXyELU/bWVZLpYrABJhuPxah2nTnPkDSe5x zOHpBqQ75b3efpTUil7ZAoS7MEAFGSPlnoS4nzmEcCJXum/bJyWWfhHkAxWq8wpSpS81 hnk8MEpgZKsnoxweAafIbZfYLxbVE5wBBnhHzqFfebplIwzZFu6bcdgMgG7m95RK7rzZ QeAVkCr+d3icfD3/ag3vNynbAyeGNfBzY/S/rGbmXjZrHxaqNaK/kHimSdmuQb5SThNV O6Vg== X-Forwarded-Encrypted: i=1; AJvYcCWm+AcHPHKhpcrm2dRA5jgh4yPKQG4Y18zXLKep3fBzwjZmugTBJtB/WemyQGRIxWDvoRKkvcAtqHQXSer+6i/ZkRvxmCD1hQZW31udvz7eDlXK4S/CbwLC X-Gm-Message-State: AOJu0YwedJN7dNSxqnoBUgEeqicB1KtmPl4KL4wjzlMJ4Z17G/7nWlnu 1j71oYhEAuOLpYQ2OpQ33QMm0WhS4bHdDy8PzXdDZuBWjv7FDjnw X-Google-Smtp-Source: AGHT+IHxYyvi/SktbPZdo1iGu8BBtERTrN0HLrMNrt6zHzIb07AenEyaTZ43piHAlrlWsbr2i7uSbw== X-Received: by 2002:a5d:6488:0:b0:366:ebd1:3bc1 with SMTP id ffacd0b85a97d-368316002e9mr2198842f8f.3.1721234695209; Wed, 17 Jul 2024 09:44:55 -0700 (PDT) Received: from wsadrian16.fritz.box ([2a02:169:59a6:0:55c4:f628:91f3:4287]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3680dafb877sm12260157f8f.69.2024.07.17.09.44.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Jul 2024 09:44:54 -0700 (PDT) Message-ID: Subject: Re: [OE-core][PATCH 2/6] classes/spdx-common: Move common SPDX to new class From: Adrian Freihofer To: JPEWhacker@gmail.com, openembedded-core@lists.openembedded.org Date: Wed, 17 Jul 2024 18:44:54 +0200 In-Reply-To: <20240610214456.2757397-3-JPEWhacker@gmail.com> References: <20240610214456.2757397-1-JPEWhacker@gmail.com> <20240610214456.2757397-3-JPEWhacker@gmail.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.52.2 (3.52.2-1.fc40app2) MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Wed, 17 Jul 2024 16:45:06 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/202169 T24gTW9uLCAyMDI0LTA2LTEwIGF0IDE1OjQxIC0wNjAwLCBKb3NodWEgV2F0dCB2aWEKbGlzdHMu b3BlbmVtYmVkZGVkLm9yZyB3cm90ZToKPiBNb3ZlcyBTUERYIGNvZGUgdGhhdCBjYW4gYmUgc2hh cmVkIGJldHdlZW4gZGlmZmVyZW50IFNQRFggdmVyc2lvbnMKPiBpbnRvCj4gYSBjb21tb24gY2xh c3MKPiAKPiBTaWduZWQtb2ZmLWJ5OiBKb3NodWEgV2F0dCA8SlBFV2hhY2tlckBnbWFpbC5jb20+ Cj4gLS0tCj4gwqBtZXRhL2NsYXNzZXMvY3JlYXRlLXNwZHgtMi4yLmJiY2xhc3MgfCAyNTkgKyst LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+IC0tCj4gwqBtZXRhL2NsYXNzZXMvc3BkeC1jb21tb24u YmJjbGFzc8KgwqDCoMKgIHwgMjU2Cj4gKysrKysrKysrKysrKysrKysrKysrKysrKysKPiDCoDIg ZmlsZXMgY2hhbmdlZCwgMjY2IGluc2VydGlvbnMoKyksIDI0OSBkZWxldGlvbnMoLSkKPiDCoGNy ZWF0ZSBtb2RlIDEwMDY0NCBtZXRhL2NsYXNzZXMvc3BkeC1jb21tb24uYmJjbGFzcwo+IAo+IGRp ZmYgLS1naXQgYS9tZXRhL2NsYXNzZXMvY3JlYXRlLXNwZHgtMi4yLmJiY2xhc3MKPiBiL21ldGEv Y2xhc3Nlcy9jcmVhdGUtc3BkeC0yLjIuYmJjbGFzcwo+IGluZGV4IDdjOGEwYjhiMGY3Li45NGEx NzJmYmM5NCAxMDA2NDQKPiAtLS0gYS9tZXRhL2NsYXNzZXMvY3JlYXRlLXNwZHgtMi4yLmJiY2xh c3MKPiArKysgYi9tZXRhL2NsYXNzZXMvY3JlYXRlLXNwZHgtMi4yLmJiY2xhc3MKPiBAQCAtNCw2 NSArNCwxMyBAQAo+IMKgIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Cj4g wqAjCj4gwqAKPiAtREVQTE9ZX0RJUl9TUERYID8/PSAiJHtERVBMT1lfRElSfS9zcGR4Igo+IC0K PiAtIyBUaGUgcHJvZHVjdCBuYW1lIHRoYXQgdGhlIENWRSBkYXRhYmFzZSB1c2VzLsKgIERlZmF1 bHRzIHRvIEJQTiwgYnV0Cj4gbWF5IG5lZWQgdG8KPiAtIyBiZSBvdmVycmlkZW4gcGVyIHJlY2lw ZSAoZm9yIGV4YW1wbGUgdGlmZi5iYiBzZXRzCj4gQ1ZFX1BST0RVQ1Q9bGlidGlmZikuCj4gLUNW RV9QUk9EVUNUID8/PSAiJHtCUE59Igo+IC1DVkVfVkVSU0lPTiA/Pz0gIiR7UFZ9Igo+IC0KPiAt U1BEWERJUiA/Pz0gIiR7V09SS0RJUn0vc3BkeCIKPiAtU1BEWERFUExPWSA9ICIke1NQRFhESVJ9 L2RlcGxveSIKPiAtU1BEWFdPUksgPSAiJHtTUERYRElSfS93b3JrIgo+IC1TUERYSU1BR0VXT1JL ID0gIiR7U1BEWERJUn0vaW1hZ2Utd29yayIKPiAtU1BEWFNES1dPUksgPSAiJHtTUERYRElSfS9z ZGstd29yayIKPiAtU1BEWERFUFMgPSAiJHtTUERYRElSfS9kZXBzLmpzb24iCj4gLQo+IC1TUERY X1RPT0xfTkFNRSA/Pz0gIm9lLXNwZHgtY3JlYXRvciIKPiAtU1BEWF9UT09MX1ZFUlNJT04gPz89 ICIxLjAiCj4gLQo+IC1TUERYUlVOVElNRURFUExPWSA9ICIke1NQRFhESVJ9L3J1bnRpbWUtZGVw bG95Igo+IC0KPiAtU1BEWF9JTkNMVURFX1NPVVJDRVMgPz89ICIwIgo+IC1TUERYX0FSQ0hJVkVf U09VUkNFUyA/Pz0gIjAiCj4gLVNQRFhfQVJDSElWRV9QQUNLQUdFRCA/Pz0gIjAiCj4gLQo+IC1T UERYX1VVSURfTkFNRVNQQUNFID8/PSAic2JvbS5vcGVuZW1iZWRkZWQub3JnIgo+IC1TUERYX05B TUVTUEFDRV9QUkVGSVggPz89ICJodHRwOi8vc3BkeC5vcmcvc3BkeGRvY3MiCj4gLVNQRFhfUFJF VFRZID8/PSAiMCIKPiAtCj4gLVNQRFhfTElDRU5TRVMgPz89ICIke0NPUkVCQVNFfS9tZXRhL2Zp bGVzL3NwZHgtbGljZW5zZXMuanNvbiIKPiAtCj4gLVNQRFhfQ1VTVE9NX0FOTk9UQVRJT05fVkFS UyA/Pz0gIiIKPiAtCj4gLVNQRFhfT1JHID8/PSAiT3BlbkVtYmVkZGVkICgpIgo+IC1TUERYX1NV UFBMSUVSID8/PSAiT3JnYW5pemF0aW9uOiAke1NQRFhfT1JHfSIKPiAtU1BEWF9TVVBQTElFUltk b2NdID0gIlRoZSBTUERYIFBhY2thZ2VTdXBwbGllciBmaWVsZCBmb3IgU1BEWAo+IHBhY2thZ2Vz IGNyZWF0ZWQgZnJvbSBcCj4gLcKgwqDCoCB0aGlzIHJlY2lwZS4gRm9yIFNQRFggZG9jdW1lbnRz IGNyZWF0ZSB1c2luZyB0aGlzIGNsYXNzIGR1cmluZwo+IHRoZSBidWlsZCwgdGhpcyBcCj4gLcKg wqDCoCBpcyB0aGUgY29udGFjdCBpbmZvcm1hdGlvbiBmb3IgdGhlIHBlcnNvbiBvciBvcmdhbml6 YXRpb24gd2hvIGlzCj4gZG9pbmcgdGhlIFwKPiAtwqDCoMKgIGJ1aWxkLiIKPiAtCj4gLWRlZiBl eHRyYWN0X2xpY2Vuc2VzKGZpbGVuYW1lKToKPiAtwqDCoMKgIGltcG9ydCByZQo+IC0KPiAtwqDC oMKgIGxpY19yZWdleCA9IHJlLmNvbXBpbGUocmInXlxXKlNQRFgtTGljZW5zZS1JZGVudGlmaWVy OlxzKihbCj4gXHdcZC4oKSstXSs/KSg/OlxzK1xXKik/JCcsIHJlLk1VTFRJTElORSkKPiAtCj4g LcKgwqDCoCB0cnk6Cj4gLcKgwqDCoMKgwqDCoMKgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3JiJykg YXMgZjoKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaXplID0gbWluKDE1MDAwLCBvcy5zdGF0 KGZpbGVuYW1lKS5zdF9zaXplKQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHR4dCA9IGYucmVh ZChzaXplKQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxpY2Vuc2VzID0gcmUuZmluZGFsbChs aWNfcmVnZXgsIHR4dCkKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiBsaWNlbnNlczoKPiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGFzY2lpX2xpY2Vuc2VzID0gW2xpYy5kZWNv ZGUoJ2FzY2lpJykgZm9yIGxpYyBpbgo+IGxpY2Vuc2VzXQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgcmV0dXJuIGFzY2lpX2xpY2Vuc2VzCj4gLcKgwqDCoCBleGNlcHQgRXhjZXB0 aW9uIGFzIGU6Cj4gLcKgwqDCoMKgwqDCoMKgIGJiLndhcm4oZiJFeGNlcHRpb24gcmVhZGluZyB7 ZmlsZW5hbWV9OiB7ZX0iKQo+IC3CoMKgwqAgcmV0dXJuIE5vbmUKPiAtCj4gLWRlZiBnZXRfZG9j X25hbWVzcGFjZShkLCBkb2MpOgo+ICtpbmhlcml0IHNwZHgtY29tbW9uCj4gKwo+ICtkZWYgZ2V0 X25hbWVzcGFjZShkLCBuYW1lKToKPiDCoMKgwqDCoCBpbXBvcnQgdXVpZAo+IMKgwqDCoMKgIG5h bWVzcGFjZV91dWlkID0gdXVpZC51dWlkNSh1dWlkLk5BTUVTUEFDRV9ETlMsCj4gZC5nZXRWYXIo IlNQRFhfVVVJRF9OQU1FU1BBQ0UiKSkKPiAtwqDCoMKgIHJldHVybiAiJXMvJXMtJXMiICUgKGQu Z2V0VmFyKCJTUERYX05BTUVTUEFDRV9QUkVGSVgiKSwKPiBkb2MubmFtZSwgc3RyKHV1aWQudXVp ZDUobmFtZXNwYWNlX3V1aWQsIGRvYy5uYW1lKSkpCj4gK8KgwqDCoCByZXR1cm4gIiVzLyVzLSVz IiAlIChkLmdldFZhcigiU1BEWF9OQU1FU1BBQ0VfUFJFRklYIiksIG5hbWUsCj4gc3RyKHV1aWQu dXVpZDUobmFtZXNwYWNlX3V1aWQsIG5hbWUpKSkKPiArCj4gwqAKPiDCoGRlZiBjcmVhdGVfYW5u b3RhdGlvbihkLCBjb21tZW50KToKPiDCoMKgwqDCoCBmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRl dGltZSwgdGltZXpvbmUKPiBAQCAtODAsMjYgKzI4LDYgQEAgZGVmIHJlY2lwZV9zcGR4X2lzX25h dGl2ZShkLCByZWNpcGUpOgo+IMKgwqDCoMKgwqDCoCBhLmFubm90YXRvciA9PSAiVG9vbDogJXMg LSAlcyIgJSAoZC5nZXRWYXIoIlNQRFhfVE9PTF9OQU1FIiksCj4gZC5nZXRWYXIoIlNQRFhfVE9P TF9WRVJTSU9OIikpIGFuZAo+IMKgwqDCoMKgwqDCoCBhLmNvbW1lbnQgPT0gImlzTmF0aXZlIiBm b3IgYSBpbiByZWNpcGUuYW5ub3RhdGlvbnMpCj4gwqAKPiAtZGVmIGlzX3dvcmtfc2hhcmVkX3Nw ZHgoZCk6Cj4gLcKgwqDCoCByZXR1cm4gYmIuZGF0YS5pbmhlcml0c19jbGFzcygna2VybmVsJywg ZCkgb3IgKCd3b3JrLXNoYXJlZCcgaW4KPiBkLmdldFZhcignV09SS0RJUicpKQo+IC0KPiAtZGVm IGdldF9qc29uX2luZGVudChkKToKPiAtwqDCoMKgIGlmIGQuZ2V0VmFyKCJTUERYX1BSRVRUWSIp ID09ICIxIjoKPiAtwqDCoMKgwqDCoMKgwqAgcmV0dXJuIDIKPiAtwqDCoMKgIHJldHVybiBOb25l Cj4gLQo+IC1weXRob24oKSB7Cj4gLcKgwqDCoCBpbXBvcnQganNvbgo+IC3CoMKgwqAgaWYgZC5n ZXRWYXIoIlNQRFhfTElDRU5TRV9EQVRBIik6Cj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybgo+IC0K PiAtwqDCoMKgIHdpdGggb3BlbihkLmdldFZhcigiU1BEWF9MSUNFTlNFUyIpLCAiciIpIGFzIGY6 Cj4gLcKgwqDCoMKgwqDCoMKgIGRhdGEgPSBqc29uLmxvYWQoZikKPiAtwqDCoMKgwqDCoMKgwqAg IyBUcmFuc2Zvcm0gdGhlIGxpY2Vuc2UgYXJyYXkgdG8gYSBkaWN0aW9uYXJ5Cj4gLcKgwqDCoMKg wqDCoMKgIGRhdGFbImxpY2Vuc2VzIl0gPSB7bFsibGljZW5zZUlkIl06IGwgZm9yIGwgaW4KPiBk YXRhWyJsaWNlbnNlcyJdfQo+IC3CoMKgwqDCoMKgwqDCoCBkLnNldFZhcigiU1BEWF9MSUNFTlNF X0RBVEEiLCBkYXRhKQo+IC19Cj4gLQo+IMKgZGVmIGNvbnZlcnRfbGljZW5zZV90b19zcGR4KGxp YywgZG9jdW1lbnQsIGQsIGV4aXN0aW5nPXt9KToKPiDCoMKgwqDCoCBmcm9tIHBhdGhsaWIgaW1w b3J0IFBhdGgKPiDCoMKgwqDCoCBpbXBvcnQgb2Uuc3BkeAo+IEBAIC0xNzIsMzQgKzEwMCw2IEBA IGRlZiBjb252ZXJ0X2xpY2Vuc2VfdG9fc3BkeChsaWMsIGRvY3VtZW50LCBkLAo+IGV4aXN0aW5n PXt9KToKPiDCoAo+IMKgwqDCoMKgIHJldHVybiAnICcuam9pbihjb252ZXJ0KGwpIGZvciBsIGlu IGxpY19zcGxpdCkKPiDCoAo+IC1kZWYgcHJvY2Vzc19zb3VyY2VzKGQpOgo+IC3CoMKgwqAgcG4g PSBkLmdldFZhcignUE4nKQo+IC3CoMKgwqAgYXNzdW1lX3Byb3ZpZGVkID0gKGQuZ2V0VmFyKCJB U1NVTUVfUFJPVklERUQiKSBvciAiIikuc3BsaXQoKQo+IC3CoMKgwqAgaWYgcG4gaW4gYXNzdW1l X3Byb3ZpZGVkOgo+IC3CoMKgwqDCoMKgwqDCoCBmb3IgcCBpbiBkLmdldFZhcigiUFJPVklERVMi KS5zcGxpdCgpOgo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIHAgIT0gcG46Cj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwbiA9IHAKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGJyZWFrCj4gLQo+IC3CoMKgwqAgIyBnbGliYy1sb2NhbGU6IGRvX2ZldGNoLCBk b191bnBhY2sgYW5kIGRvX3BhdGNoIHRhc2tzIGhhdmUgYmVlbgo+IGRlbGV0ZWQsCj4gLcKgwqDC oCAjIHNvIGF2b2lkIGFyY2hpdmluZyBzb3VyY2UgaGVyZS4KPiAtwqDCoMKgIGlmIHBuLnN0YXJ0 c3dpdGgoJ2dsaWJjLWxvY2FsZScpOgo+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gRmFsc2UKPiAt wqDCoMKgIGlmIGQuZ2V0VmFyKCdQTicpID09ICJsaWJ0b29sLWNyb3NzIjoKPiAtwqDCoMKgwqDC oMKgwqAgcmV0dXJuIEZhbHNlCj4gLcKgwqDCoCBpZiBkLmdldFZhcignUE4nKSA9PSAibGliZ2Nj LWluaXRpYWwiOgo+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gRmFsc2UKPiAtwqDCoMKgIGlmIGQu Z2V0VmFyKCdQTicpID09ICJzaGFkb3ctc3lzcm9vdCI6Cj4gLcKgwqDCoMKgwqDCoMKgIHJldHVy biBGYWxzZQo+IC0KPiAtwqDCoMKgICMgV2UganVzdCBhcmNoaXZlIGdjYy1zb3VyY2UgZm9yIGFs bCB0aGUgZ2NjIHJlbGF0ZWQgcmVjaXBlcwo+IC3CoMKgwqAgaWYgZC5nZXRWYXIoJ0JQTicpIGlu IFsnZ2NjJywgJ2xpYmdjYyddOgo+IC3CoMKgwqDCoMKgwqDCoCBiYi5kZWJ1ZygxLCAnc3BkeDog VGhlcmUgaXMgYnVnIGluIHNjYW4gb2YgJXMgaXMsIGRvCj4gbm90aGluZycgJSBwbikKPiAtwqDC oMKgwqDCoMKgwqAgcmV0dXJuIEZhbHNlCj4gLQo+IC3CoMKgwqAgcmV0dXJuIFRydWUKPiAtCj4g LQo+IMKgZGVmIGFkZF9wYWNrYWdlX2ZpbGVzKGQsIGRvYywgc3BkeF9wa2csIHRvcGRpciwgZ2V0 X3NwZHhpZCwKPiBnZXRfdHlwZXMsICosIGFyY2hpdmU9Tm9uZSwgaWdub3JlX2RpcnM9W10sCj4g aWdub3JlX3RvcF9sZXZlbF9kaXJzPVtdKToKPiDCoMKgwqDCoCBmcm9tIHBhdGhsaWIgaW1wb3J0 IFBhdGgKPiDCoMKgwqDCoCBpbXBvcnQgb2Uuc3BkeAo+IEBAIC0zNDgsMTQgKzI0OCwxMiBAQCBk ZWYgY29sbGVjdF9kZXBfcmVjaXBlcyhkLCBkb2MsIHNwZHhfcmVjaXBlKToKPiDCoMKgwqDCoCBp bXBvcnQgb2Uuc3BkeAo+IMKgCj4gwqDCoMKgwqAgZGVwbG95X2Rpcl9zcGR4ID0gUGF0aChkLmdl dFZhcigiREVQTE9ZX0RJUl9TUERYIikpCj4gLcKgwqDCoCBzcGR4X2RlcHNfZmlsZSA9IFBhdGgo ZC5nZXRWYXIoIlNQRFhERVBTIikpCj4gwqDCoMKgwqAgcGFja2FnZV9hcmNocyA9IGQuZ2V0VmFy KCJTU1RBVEVfQVJDSFMiKS5zcGxpdCgpCj4gwqDCoMKgwqAgcGFja2FnZV9hcmNocy5yZXZlcnNl KCkKPiDCoAo+IMKgwqDCoMKgIGRlcF9yZWNpcGVzID0gW10KPiDCoAo+IC3CoMKgwqAgd2l0aCBz cGR4X2RlcHNfZmlsZS5vcGVuKCJyIikgYXMgZjoKPiAtwqDCoMKgwqDCoMKgwqAgZGVwcyA9IGpz b24ubG9hZChmKQo+ICvCoMKgwqAgZGVwcyA9IGdldF9zcGR4X2RlcHMoZCkKPiDCoAo+IMKgwqDC oMKgIGZvciBkZXBfcG4sIGRlcF9oYXNoZm4sIGluX3Rhc2toYXNoIGluIGRlcHM6Cj4gwqDCoMKg wqDCoMKgwqDCoCAjIElmIHRoaXMgZGVwZW5kZW5jeSBpcyBub3QgY2FsY3VsYXRlZCBpbiB0aGUg dGFza2hhc2ggc2tpcAo+IGl0Lgo+IEBAIC00NjgsNTEgKzM2Niw2IEBAIGRlZiBhZGRfZG93bmxv YWRfcGFja2FnZXMoZCwgZG9jLCByZWNpcGUpOgo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAj IGJ1dCB0aGlzIHNob3VsZCBiZSBzdWZmaWNpZW50IGZvciBub3cKPiDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgZG9jLmFkZF9yZWxhdGlvbnNoaXAocGFja2FnZSwgIkJVSUxEX0RFUEVOREVOQ1lf T0YiLAo+IHJlY2lwZSkKPiDCoAo+IC1kZWYgY29sbGVjdF9kaXJlY3RfZGVwcyhkLCBkZXBfdGFz ayk6Cj4gLcKgwqDCoCBjdXJyZW50X3Rhc2sgPSAiZG9fIiArIGQuZ2V0VmFyKCJCQl9DVVJSRU5U VEFTSyIpCj4gLcKgwqDCoCBwbiA9IGQuZ2V0VmFyKCJQTiIpCj4gLQo+IC3CoMKgwqAgdGFza2Rl cGRhdGEgPSBkLmdldFZhcigiQkJfVEFTS0RFUERBVEEiLCBGYWxzZSkKPiAtCj4gLcKgwqDCoCBm b3IgdGhpc19kZXAgaW4gdGFza2RlcGRhdGEudmFsdWVzKCk6Cj4gLcKgwqDCoMKgwqDCoMKgIGlm IHRoaXNfZGVwWzBdID09IHBuIGFuZCB0aGlzX2RlcFsxXSA9PSBjdXJyZW50X3Rhc2s6Cj4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWsKPiAtwqDCoMKgIGVsc2U6Cj4gLcKgwqDCoMKgwqDC oMKgIGJiLmZhdGFsKGYiVW5hYmxlIHRvIGZpbmQgdGhpcyB7cG59OntjdXJyZW50X3Rhc2t9IGlu Cj4gdGFza2RlcGRhdGEiKQo+IC0KPiAtwqDCoMKgIGRlcHMgPSBzZXQoKQo+IC3CoMKgwqAgZm9y IGRlcF9uYW1lIGluIHRoaXNfZGVwWzNdOgo+IC3CoMKgwqDCoMKgwqDCoCBkZXBfZGF0YSA9IHRh c2tkZXBkYXRhW2RlcF9uYW1lXQo+IC3CoMKgwqDCoMKgwqDCoCBpZiBkZXBfZGF0YVsxXSA9PSBk ZXBfdGFzayBhbmQgZGVwX2RhdGFbMF0gIT0gcG46Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg ZGVwcy5hZGQoKGRlcF9kYXRhWzBdLCBkZXBfZGF0YVs3XSwgZGVwX25hbWUgaW4KPiB0aGlzX2Rl cFs4XSkpCj4gLQo+IC3CoMKgwqAgcmV0dXJuIHNvcnRlZChkZXBzKQo+IC0KPiAtY29sbGVjdF9k aXJlY3RfZGVwc1t2YXJkZXBzZXhjbHVkZV0gKz0gIkJCX1RBU0tERVBEQVRBIgo+IC1jb2xsZWN0 X2RpcmVjdF9kZXBzW3ZhcmRlcHNdICs9ICJERVBFTkRTIgo+IC0KPiAtcHl0aG9uIGRvX2NvbGxl Y3Rfc3BkeF9kZXBzKCkgewo+IC3CoMKgwqAgIyBUaGlzIHRhc2sgY2FsY3VsYXRlcyB0aGUgYnVp bGQgdGltZSBkZXBlbmRlbmNpZXMgb2YgdGhlCj4gcmVjaXBlLCBhbmQgaXMKPiAtwqDCoMKgICMg cmVxdWlyZWQgYmVjYXVzZSB3aGlsZSBhIHRhc2sgY2FuIGRlcHRhc2sgb24gaXRzZWxmLCB0aG9z ZQo+IGRlcGVuZGVuY2llcwo+IC3CoMKgwqAgIyBkbyBub3Qgc2hvdyB1cCBpbiBCQl9UQVNLREVQ REFUQS4gVG8gd29yayBhcm91bmQgdGhhdCwgdGhpcwo+IHRhc2sgZG9lcyB0aGUKPiAtwqDCoMKg ICMgZGVwdGFzayBvbiBkb19jcmVhdGVfc3BkeCBhbmQgd3JpdGVzIG91dCB0aGUgZGVwZW5kZW5j aWVzIGl0Cj4gZmluZHMsIHRoZW4KPiAtwqDCoMKgICMgZG9fY3JlYXRlX3NwZHggcmVhZHMgaW4g dGhlIGZvdW5kIGRlcGVuZGVuY2llcyB3aGVuIHdyaXRpbmcKPiB0aGUgYWN0dWFsCj4gLcKgwqDC oCAjIFNQRFggZG9jdW1lbnQKPiAtwqDCoMKgIGltcG9ydCBqc29uCj4gLcKgwqDCoCBmcm9tIHBh dGhsaWIgaW1wb3J0IFBhdGgKPiAtCj4gLcKgwqDCoCBzcGR4X2RlcHNfZmlsZSA9IFBhdGgoZC5n ZXRWYXIoIlNQRFhERVBTIikpCj4gLQo+IC3CoMKgwqAgZGVwcyA9IGNvbGxlY3RfZGlyZWN0X2Rl cHMoZCwgImRvX2NyZWF0ZV9zcGR4IikKPiAtCj4gLcKgwqDCoCB3aXRoIHNwZHhfZGVwc19maWxl Lm9wZW4oInciKSBhcyBmOgo+IC3CoMKgwqDCoMKgwqDCoCBqc29uLmR1bXAoZGVwcywgZikKPiAt fQo+IC0jIE5PVEU6IGRlcGVuZGluZyBvbiBkb191bnBhY2sgaXMgYSBoYWNrIHRoYXQgaXMgbmVj ZXNzYXJ5IHRvIGdldAo+IGl0J3MgZGVwZW5kZW5jaWVzIGZvciBhcmNoaXZlIHRoZSBzb3VyY2UK PiAtYWRkdGFzayBkb19jb2xsZWN0X3NwZHhfZGVwcyBhZnRlciBkb191bnBhY2sKPiAtZG9fY29s bGVjdF9zcGR4X2RlcHNbZGVwZW5kc10gKz0gIiR7UEFUQ0hERVBFTkRFTkNZfSIKPiAtZG9fY29s bGVjdF9zcGR4X2RlcHNbZGVwdGFza10gPSAiZG9fY3JlYXRlX3NwZHgiCj4gLWRvX2NvbGxlY3Rf c3BkeF9kZXBzW2RpcnNdID0gIiR7U1BEWERJUn0iCj4gwqAKPiDCoHB5dGhvbiBkb19jcmVhdGVf c3BkeCgpIHsKPiDCoMKgwqDCoCBmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZSwgdGltZXpv bmUKPiBAQCAtNTUxLDcgKzQwNCw3IEBAIHB5dGhvbiBkb19jcmVhdGVfc3BkeCgpIHsKPiDCoMKg wqDCoCBkb2MgPSBvZS5zcGR4LlNQRFhEb2N1bWVudCgpCj4gwqAKPiDCoMKgwqDCoCBkb2MubmFt ZSA9ICJyZWNpcGUtIiArIGQuZ2V0VmFyKCJQTiIpCj4gLcKgwqDCoCBkb2MuZG9jdW1lbnROYW1l c3BhY2UgPSBnZXRfZG9jX25hbWVzcGFjZShkLCBkb2MpCj4gK8KgwqDCoCBkb2MuZG9jdW1lbnRO YW1lc3BhY2UgPSBnZXRfbmFtZXNwYWNlKGQsIGRvYy5uYW1lKQo+IMKgwqDCoMKgIGRvYy5jcmVh dGlvbkluZm8uY3JlYXRlZCA9IGNyZWF0aW9uX3RpbWUKPiDCoMKgwqDCoCBkb2MuY3JlYXRpb25J bmZvLmNvbW1lbnQgPSAiVGhpcyBkb2N1bWVudCB3YXMgY3JlYXRlZCBieQo+IGFuYWx5emluZyBy ZWNpcGUgZmlsZXMgZHVyaW5nIHRoZSBidWlsZC4iCj4gwqDCoMKgwqAgZG9jLmNyZWF0aW9uSW5m by5saWNlbnNlTGlzdFZlcnNpb24gPQo+IGQuZ2V0VmFyKCJTUERYX0xJQ0VOU0VfREFUQSIpWyJs aWNlbnNlTGlzdFZlcnNpb24iXQo+IEBAIC02NTUsNyArNTA4LDcgQEAgcHl0aG9uIGRvX2NyZWF0 ZV9zcGR4KCkgewo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwYWNrYWdlX2RvYyA9IG9lLnNw ZHguU1BEWERvY3VtZW50KCkKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGtnX25hbWUgPSBk LmdldFZhcigiUEtHOiVzIiAlIHBhY2thZ2UpIG9yIHBhY2thZ2UKPiDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgcGFja2FnZV9kb2MubmFtZSA9IHBrZ19uYW1lCj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcGFja2FnZV9kb2MuZG9jdW1lbnROYW1lc3BhY2UgPSBnZXRfZG9jX25hbWVzcGFjZShk LAo+IHBhY2thZ2VfZG9jKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBhY2thZ2VfZG9jLmRv Y3VtZW50TmFtZXNwYWNlID0gZ2V0X25hbWVzcGFjZShkLAo+IHBhY2thZ2VfZG9jLm5hbWUpCj4g wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBhY2thZ2VfZG9jLmNyZWF0aW9uSW5mby5jcmVhdGVk ID0gY3JlYXRpb25fdGltZQo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwYWNrYWdlX2RvYy5j cmVhdGlvbkluZm8uY29tbWVudCA9ICJUaGlzIGRvY3VtZW50IHdhcwo+IGNyZWF0ZWQgYnkgYW5h bHl6aW5nIHBhY2thZ2VzIGNyZWF0ZWQgZHVyaW5nIHRoZSBidWlsZC4iCj4gwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHBhY2thZ2VfZG9jLmNyZWF0aW9uSW5mby5saWNlbnNlTGlzdFZlcnNpb24g PQo+IGQuZ2V0VmFyKCJTUERYX0xJQ0VOU0VfREFUQSIpWyJsaWNlbnNlTGlzdFZlcnNpb24iXQo+ IEBAIC03MTYsNDQgKzU2OSw2IEBAIGRvX2NyZWF0ZV9zcGR4W2RpcnNdID0gIiR7U1BEWFdPUkt9 Igo+IMKgZG9fY3JlYXRlX3NwZHhbY2xlYW5kaXJzXSA9ICIke1NQRFhERVBMT1l9ICR7U1BEWFdP Ukt9Igo+IMKgZG9fY3JlYXRlX3NwZHhbZGVwZW5kc10gKz0gIiR7UEFUQ0hERVBFTkRFTkNZfSIK PiDCoAo+IC1kZWYgY29sbGVjdF9wYWNrYWdlX3Byb3ZpZGVycyhkKToKPiAtwqDCoMKgIGZyb20g cGF0aGxpYiBpbXBvcnQgUGF0aAo+IC3CoMKgwqAgaW1wb3J0IG9lLnNib20KPiAtwqDCoMKgIGlt cG9ydCBvZS5zcGR4Cj4gLcKgwqDCoCBpbXBvcnQganNvbgo+IC0KPiAtwqDCoMKgIGRlcGxveV9k aXJfc3BkeCA9IFBhdGgoZC5nZXRWYXIoIkRFUExPWV9ESVJfU1BEWCIpKQo+IC0KPiAtwqDCoMKg IHByb3ZpZGVycyA9IHt9Cj4gLQo+IC3CoMKgwqAgZGVwcyA9IGNvbGxlY3RfZGlyZWN0X2RlcHMo ZCwgImRvX2NyZWF0ZV9zcGR4IikKPiAtwqDCoMKgIGRlcHMuYXBwZW5kKChkLmdldFZhcigiUE4i KSwgZC5nZXRWYXIoIkJCX0hBU0hGSUxFTkFNRSIpLCBUcnVlKSkKPiAtCj4gLcKgwqDCoCBmb3Ig ZGVwX3BuLCBkZXBfaGFzaGZuLCBfIGluIGRlcHM6Cj4gLcKgwqDCoMKgwqDCoMKgIGxvY2FsZGF0 YSA9IGQKPiAtwqDCoMKgwqDCoMKgwqAgcmVjaXBlX2RhdGEgPSBvZS5wYWNrYWdlZGF0YS5yZWFk X3BrZ2RhdGEoZGVwX3BuLCBsb2NhbGRhdGEpCj4gLcKgwqDCoMKgwqDCoMKgIGlmIG5vdCByZWNp cGVfZGF0YToKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsb2NhbGRhdGEgPSBiYi5kYXRhLmNy ZWF0ZUNvcHkoZCkKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsb2NhbGRhdGEuc2V0VmFyKCJQ S0dEQVRBX0RJUiIsICIke1BLR0RBVEFfRElSX1NES30iKQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHJlY2lwZV9kYXRhID0gb2UucGFja2FnZWRhdGEucmVhZF9wa2dkYXRhKGRlcF9wbiwKPiBs b2NhbGRhdGEpCj4gLQo+IC3CoMKgwqDCoMKgwqDCoCBmb3IgcGtnIGluIHJlY2lwZV9kYXRhLmdl dCgiUEFDS0FHRVMiLCAiIikuc3BsaXQoKToKPiAtCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg cGtnX2RhdGEgPSBvZS5wYWNrYWdlZGF0YS5yZWFkX3N1YnBrZ2RhdGFfZGljdChwa2csCj4gbG9j YWxkYXRhKQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJwcm92aWRlcyA9IHNldChuIGZvciBu LCBfIGluCj4gYmIudXRpbHMuZXhwbG9kZV9kZXBfdmVyc2lvbnMyKHBrZ19kYXRhLmdldCgiUlBS T1ZJREVTIiwKPiAiIikpLml0ZW1zKCkpCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcnByb3Zp ZGVzLmFkZChwa2cpCj4gLQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmICJQS0ciIGluIHBr Z19kYXRhOgo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGtnID0gcGtnX2RhdGFb IlBLRyJdCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBycHJvdmlkZXMuYWRkKHBr ZykKPiAtCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yIHIgaW4gcnByb3ZpZGVzOgo+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJvdmlkZXJzW3JdID0gKHBrZywgZGVwX2hh c2hmbikKPiAtCj4gLcKgwqDCoCByZXR1cm4gcHJvdmlkZXJzCj4gLQo+IC1jb2xsZWN0X3BhY2th Z2VfcHJvdmlkZXJzW3ZhcmRlcHNleGNsdWRlXSArPSAiQkJfVEFTS0RFUERBVEEiCj4gLQo+IMKg cHl0aG9uIGRvX2NyZWF0ZV9ydW50aW1lX3NwZHgoKSB7Cj4gwqDCoMKgwqAgZnJvbSBkYXRldGlt ZSBpbXBvcnQgZGF0ZXRpbWUsIHRpbWV6b25lCj4gwqDCoMKgwqAgaW1wb3J0IG9lLnNib20KPiBA QCAtODAwLDcgKzYxNSw3IEBAIHB5dGhvbiBkb19jcmVhdGVfcnVudGltZV9zcGR4KCkgewo+IMKg Cj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJ1bnRpbWVfZG9jID0gb2Uuc3BkeC5TUERYRG9j dW1lbnQoKQo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBydW50aW1lX2RvYy5uYW1lID0gInJ1 bnRpbWUtIiArIHBrZ19uYW1lCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcnVudGltZV9kb2Mu ZG9jdW1lbnROYW1lc3BhY2UgPQo+IGdldF9kb2NfbmFtZXNwYWNlKGxvY2FsZGF0YSwgcnVudGlt ZV9kb2MpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcnVudGltZV9kb2MuZG9jdW1lbnROYW1l c3BhY2UgPSBnZXRfbmFtZXNwYWNlKGxvY2FsZGF0YSwKPiBydW50aW1lX2RvYy5uYW1lKQo+IMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBydW50aW1lX2RvYy5jcmVhdGlvbkluZm8uY3JlYXRlZCA9 IGNyZWF0aW9uX3RpbWUKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcnVudGltZV9kb2MuY3Jl YXRpb25JbmZvLmNvbW1lbnQgPSAiVGhpcyBkb2N1bWVudCB3YXMKPiBjcmVhdGVkIGJ5IGFuYWx5 emluZyBwYWNrYWdlIHJ1bnRpbWUgZGVwZW5kZW5jaWVzLiIKPiDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcnVudGltZV9kb2MuY3JlYXRpb25JbmZvLmxpY2Vuc2VMaXN0VmVyc2lvbiA9Cj4gZC5n ZXRWYXIoIlNQRFhfTElDRU5TRV9EQVRBIilbImxpY2Vuc2VMaXN0VmVyc2lvbiJdCj4gQEAgLTg5 MSw2MCArNzA2LDYgQEAgZG9fY3JlYXRlX3J1bnRpbWVfc3BkeFtkaXJzXSA9Cj4gIiR7U1BEWFJV TlRJTUVERVBMT1l9Igo+IMKgZG9fY3JlYXRlX3J1bnRpbWVfc3BkeFtjbGVhbmRpcnNdID0gIiR7 U1BEWFJVTlRJTUVERVBMT1l9Igo+IMKgZG9fY3JlYXRlX3J1bnRpbWVfc3BkeFtyZGVwdGFza10g PSAiZG9fY3JlYXRlX3NwZHgiCj4gwqAKPiAtZGVmIHNwZHhfZ2V0X3NyYyhkKToKPiAtwqDCoMKg ICIiIgo+IC3CoMKgwqAgc2F2ZSBwYXRjaGVkIHNvdXJjZSBvZiB0aGUgcmVjaXBlIGluIFNQRFhf V09SS0RJUi4KPiAtwqDCoMKgICIiIgo+IC3CoMKgwqAgaW1wb3J0IHNodXRpbAo+IC3CoMKgwqAg c3BkeF93b3JrZGlyID0gZC5nZXRWYXIoJ1NQRFhXT1JLJykKPiAtwqDCoMKgIHNwZHhfc3lzcm9v dF9uYXRpdmUgPSBkLmdldFZhcignU1RBR0lOR19ESVJfTkFUSVZFJykKPiAtwqDCoMKgIHBuID0g ZC5nZXRWYXIoJ1BOJykKPiAtCj4gLcKgwqDCoCB3b3JrZGlyID0gZC5nZXRWYXIoIldPUktESVIi KQo+IC0KPiAtwqDCoMKgIHRyeToKPiAtwqDCoMKgwqDCoMKgwqAgIyBUaGUga2VybmVsIGNsYXNz IGZ1bmN0aW9ucyByZXF1aXJlIGl0IHRvIGJlIG9uIHdvcmstCj4gc2hhcmVkLCBzbyB3ZSBkb250 IGNoYW5nZSBXT1JLRElSCj4gLcKgwqDCoMKgwqDCoMKgIGlmIG5vdCBpc193b3JrX3NoYXJlZF9z cGR4KGQpOgo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgICMgQ2hhbmdlIHRoZSBXT1JLRElSIHRv IG1ha2UgZG9fdW5wYWNrIGRvX3BhdGNoIHJ1biBpbgo+IGFub3RoZXIgZGlyLgo+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGQuc2V0VmFyKCdXT1JLRElSJywgc3BkeF93b3JrZGlyKQo+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgICMgUmVzdG9yZSB0aGUgb3JpZ2luYWwgcGF0aCB0byByZWNpcGUn cyBuYXRpdmUgc3lzcm9vdAo+IChpdCdzIHJlbGF0aXZlIHRvIFdPUktESVIpLgo+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGQuc2V0VmFyKCdTVEFHSU5HX0RJUl9OQVRJVkUnLCBzcGR4X3N5c3Jv b3RfbmF0aXZlKQo+IC0KPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAjIFRoZSBjaGFuZ2VkICdX T1JLRElSJyBhbHNvIGNhdXNlZCAnQicgY2hhbmdlZCwgY3JlYXRlCj4gZGlyICdCJyBmb3IgdGhl Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIyBwb3NzaWJseSByZXF1aXJpbmcgb2YgdGhlIGZv bGxvd2luZyB0YXNrcyAoc3VjaCBhcwo+IHNvbWUgcmVjaXBlcydzCj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgIyBkb19wYXRjaCByZXF1aXJlZCAnQicgZXhpc3RlZCkuCj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgYmIudXRpbHMubWtkaXJoaWVyKGQuZ2V0VmFyKCdCJykpCj4gLQo+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGJiLmJ1aWxkLmV4ZWNfZnVuYygnZG9fdW5wYWNrJywgZCkKPiAt wqDCoMKgwqDCoMKgwqAgIyBDb3B5IHNvdXJjZSBvZiBrZXJuZWwgdG8gc3BkeF93b3JrZGlyCj4g LcKgwqDCoMKgwqDCoMKgIGlmIGlzX3dvcmtfc2hhcmVkX3NwZHgoZCk6Cj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgc2hhcmVfc3JjID0gZC5nZXRWYXIoJ1dPUktESVInKQo+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGQuc2V0VmFyKCdXT1JLRElSJywgc3BkeF93b3JrZGlyKQo+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGQuc2V0VmFyKCdTVEFHSU5HX0RJUl9OQVRJVkUnLCBzcGR4X3N5c3Jv b3RfbmF0aXZlKQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNyY19kaXIgPSBzcGR4X3dvcmtk aXIgKyAiLyIgKyBkLmdldFZhcignUE4nKSsgIi0iICsKPiBkLmdldFZhcignUFYnKSArICItIiAr IGQuZ2V0VmFyKCdQUicpCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYmIudXRpbHMubWtkaXJo aWVyKHNyY19kaXIpCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgYmIuZGF0YS5pbmhlcml0 c19jbGFzcygna2VybmVsJyxkKToKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNo YXJlX3NyYyA9IGQuZ2V0VmFyKCdTVEFHSU5HX0tFUk5FTF9ESVInKQo+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGNtZF9jb3B5X3NoYXJlID0gImNwIC1yZiAiICsgc2hhcmVfc3JjICsgIi8qICIg KyBzcmNfZGlyCj4gKyAiLyIKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjbWRfY29weV9zaGFy ZWRfcmVzID0gb3MucG9wZW4oY21kX2NvcHlfc2hhcmUpLnJlYWQoKQo+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGJiLm5vdGUoImNtZF9jb3B5X3NoYXJlZF9yZXN1bHQgPSAiICsKPiBjbWRfY29w eV9zaGFyZWRfcmVzKQo+IC0KPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnaXRfcGF0aCA9IHNy Y19kaXIgKyAiLy5naXQiCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgb3MucGF0aC5leGlz dHMoZ2l0X3BhdGgpOgppbXBvcnQgb3MucGF0aCBpcyBtaXNzaW5nCgo+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgc2h1dGlscy5ybXRyZWUoZ2l0X3BhdGgpClNob3VsZCBiZTogc2h1 dGlsLnJtdHJlZShnaXRfcGF0aCkKClRoYW5rIHlvdSBmb3IgU1BEWCAzLjAgc3VwcG9ydC4KQWRy aWFuCgo+IC0KPiAtwqDCoMKgwqDCoMKgwqAgIyBNYWtlIHN1cmUgZ2NjIGFuZCBrZXJuZWwgc291 cmNlcyBhcmUgcGF0Y2hlZCBvbmx5IG9uY2UKPiAtwqDCoMKgwqDCoMKgwqAgaWYgbm90IChkLmdl dFZhcignU1JDX1VSSScpID09ICIiIG9yCj4gaXNfd29ya19zaGFyZWRfc3BkeChkKSk6Cj4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgYmIuYnVpbGQuZXhlY19mdW5jKCdkb19wYXRjaCcsIGQpCj4g LQo+IC3CoMKgwqDCoMKgwqDCoCAjIFNvbWUgdXNlcmxhbmQgaGFzIG5vIHNvdXJjZS4KPiAtwqDC oMKgwqDCoMKgwqAgaWYgbm90IG9zLnBhdGguZXhpc3RzKCBzcGR4X3dvcmtkaXIgKToKPiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBiYi51dGlscy5ta2RpcmhpZXIoc3BkeF93b3JrZGlyKQo+IC3C oMKgwqAgZmluYWxseToKPiAtwqDCoMKgwqDCoMKgwqAgZC5zZXRWYXIoIldPUktESVIiLCB3b3Jr ZGlyKQo+IC0KPiAtc3BkeF9nZXRfc3JjW3ZhcmRlcHNleGNsdWRlXSArPSAiU1RBR0lOR19LRVJO RUxfRElSIgo+IC0KPiDCoGRvX3Jvb3Rmc1tyZWNyZGVwdGFza10gKz0gImRvX2NyZWF0ZV9zcGR4 IGRvX2NyZWF0ZV9ydW50aW1lX3NwZHgiCj4gwqBkb19yb290ZnNbY2xlYW5kaXJzXSArPSAiJHtT UERYSU1BR0VXT1JLfSIKPiDCoAo+IEBAIC0xMDE5LDcgKzc4MCw3IEBAIGRlZiBjb21iaW5lX3Nw ZHgoZCwgcm9vdGZzX25hbWUsCj4gcm9vdGZzX2RlcGxveWRpciwgcm9vdGZzX3NwZHhpZCwgcGFj a2FnZXMsIHNwZHgKPiDCoAo+IMKgwqDCoMKgIGRvYyA9IG9lLnNwZHguU1BEWERvY3VtZW50KCkK PiDCoMKgwqDCoCBkb2MubmFtZSA9IHJvb3Rmc19uYW1lCj4gLcKgwqDCoCBkb2MuZG9jdW1lbnRO YW1lc3BhY2UgPSBnZXRfZG9jX25hbWVzcGFjZShkLCBkb2MpCj4gK8KgwqDCoCBkb2MuZG9jdW1l bnROYW1lc3BhY2UgPSBnZXRfbmFtZXNwYWNlKGQsIGRvYy5uYW1lKQo+IMKgwqDCoMKgIGRvYy5j cmVhdGlvbkluZm8uY3JlYXRlZCA9IGNyZWF0aW9uX3RpbWUKPiDCoMKgwqDCoCBkb2MuY3JlYXRp b25JbmZvLmNvbW1lbnQgPSAiVGhpcyBkb2N1bWVudCB3YXMgY3JlYXRlZCBieQo+IGFuYWx5emlu ZyB0aGUgc291cmNlIG9mIHRoZSBZb2N0byByZWNpcGUgZHVyaW5nIHRoZSBidWlsZC4iCj4gwqDC oMKgwqAgZG9jLmNyZWF0aW9uSW5mby5saWNlbnNlTGlzdFZlcnNpb24gPQo+IGQuZ2V0VmFyKCJT UERYX0xJQ0VOU0VfREFUQSIpWyJsaWNlbnNlTGlzdFZlcnNpb24iXQo+IGRpZmYgLS1naXQgYS9t ZXRhL2NsYXNzZXMvc3BkeC1jb21tb24uYmJjbGFzcyBiL21ldGEvY2xhc3Nlcy9zcGR4LQo+IGNv bW1vbi5iYmNsYXNzCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMC4u NDY4YTExY2EzZTIKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvbWV0YS9jbGFzc2VzL3NwZHgtY29t bW9uLmJiY2xhc3MKPiBAQCAtMCwwICsxLDI1NiBAQAo+ICsjCj4gKyMgQ29weXJpZ2h0IE9wZW5F bWJlZGRlZCBDb250cmlidXRvcnMKPiArIwo+ICsjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wLW9ubHkKPiArIwo+ICsKPiArREVQTE9ZX0RJUl9TUERYID8/PSAiJHtERVBMT1lfRElS fS9zcGR4Igo+ICsKPiArIyBUaGUgcHJvZHVjdCBuYW1lIHRoYXQgdGhlIENWRSBkYXRhYmFzZSB1 c2VzLsKgIERlZmF1bHRzIHRvIEJQTiwgYnV0Cj4gbWF5IG5lZWQgdG8KPiArIyBiZSBvdmVycmlk ZW4gcGVyIHJlY2lwZSAoZm9yIGV4YW1wbGUgdGlmZi5iYiBzZXRzCj4gQ1ZFX1BST0RVQ1Q9bGli dGlmZikuCj4gK0NWRV9QUk9EVUNUID8/PSAiJHtCUE59Igo+ICtDVkVfVkVSU0lPTiA/Pz0gIiR7 UFZ9Igo+ICsKPiArU1BEWERJUiA/Pz0gIiR7V09SS0RJUn0vc3BkeCIKPiArU1BEWERFUExPWSA9 ICIke1NQRFhESVJ9L2RlcGxveSIKPiArU1BEWFdPUksgPSAiJHtTUERYRElSfS93b3JrIgo+ICtT UERYSU1BR0VXT1JLID0gIiR7U1BEWERJUn0vaW1hZ2Utd29yayIKPiArU1BEWFNES1dPUksgPSAi JHtTUERYRElSfS9zZGstd29yayIKPiArU1BEWERFUFMgPSAiJHtTUERYRElSfS9kZXBzLmpzb24i Cj4gKwo+ICtTUERYX1RPT0xfTkFNRSA/Pz0gIm9lLXNwZHgtY3JlYXRvciIKPiArU1BEWF9UT09M X1ZFUlNJT04gPz89ICIxLjAiCj4gKwo+ICtTUERYUlVOVElNRURFUExPWSA9ICIke1NQRFhESVJ9 L3J1bnRpbWUtZGVwbG95Igo+ICsKPiArU1BEWF9JTkNMVURFX1NPVVJDRVMgPz89ICIwIgo+ICtT UERYX0FSQ0hJVkVfU09VUkNFUyA/Pz0gIjAiCj4gK1NQRFhfQVJDSElWRV9QQUNLQUdFRCA/Pz0g IjAiCj4gKwo+ICtTUERYX1VVSURfTkFNRVNQQUNFID8/PSAic2JvbS5vcGVuZW1iZWRkZWQub3Jn Igo+ICtTUERYX05BTUVTUEFDRV9QUkVGSVggPz89ICJodHRwOi8vc3BkeC5vcmcvc3BkeGRvY3Mi Cj4gK1NQRFhfUFJFVFRZID8/PSAiMCIKPiArCj4gK1NQRFhfTElDRU5TRVMgPz89ICIke0NPUkVC QVNFfS9tZXRhL2ZpbGVzL3NwZHgtbGljZW5zZXMuanNvbiIKPiArCj4gK1NQRFhfQ1VTVE9NX0FO Tk9UQVRJT05fVkFSUyA/Pz0gIiIKPiArCj4gK1NQRFhfT1JHID8/PSAiT3BlbkVtYmVkZGVkICgp Igo+ICtTUERYX1NVUFBMSUVSID8/PSAiT3JnYW5pemF0aW9uOiAke1NQRFhfT1JHfSIKPiArU1BE WF9TVVBQTElFUltkb2NdID0gIlRoZSBTUERYIFBhY2thZ2VTdXBwbGllciBmaWVsZCBmb3IgU1BE WAo+IHBhY2thZ2VzIGNyZWF0ZWQgZnJvbSBcCj4gK8KgwqDCoCB0aGlzIHJlY2lwZS4gRm9yIFNQ RFggZG9jdW1lbnRzIGNyZWF0ZSB1c2luZyB0aGlzIGNsYXNzIGR1cmluZwo+IHRoZSBidWlsZCwg dGhpcyBcCj4gK8KgwqDCoCBpcyB0aGUgY29udGFjdCBpbmZvcm1hdGlvbiBmb3IgdGhlIHBlcnNv biBvciBvcmdhbml6YXRpb24gd2hvIGlzCj4gZG9pbmcgdGhlIFwKPiArwqDCoMKgIGJ1aWxkLiIK PiArCj4gK2RlZiBleHRyYWN0X2xpY2Vuc2VzKGZpbGVuYW1lKToKPiArwqDCoMKgIGltcG9ydCBy ZQo+ICsKPiArwqDCoMKgIGxpY19yZWdleCA9IHJlLmNvbXBpbGUocmInXlxXKlNQRFgtTGljZW5z ZS1JZGVudGlmaWVyOlxzKihbCj4gXHdcZC4oKSstXSs/KSg/OlxzK1xXKik/JCcsIHJlLk1VTFRJ TElORSkKPiArCj4gK8KgwqDCoCB0cnk6Cj4gK8KgwqDCoMKgwqDCoMKgIHdpdGggb3BlbihmaWxl bmFtZSwgJ3JiJykgYXMgZjoKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaXplID0gbWluKDE1 MDAwLCBvcy5zdGF0KGZpbGVuYW1lKS5zdF9zaXplKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHR4dCA9IGYucmVhZChzaXplKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxpY2Vuc2VzID0g cmUuZmluZGFsbChsaWNfcmVnZXgsIHR4dCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiBs aWNlbnNlczoKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGFzY2lpX2xpY2Vuc2Vz ID0gW2xpYy5kZWNvZGUoJ2FzY2lpJykgZm9yIGxpYyBpbgo+IGxpY2Vuc2VzXQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGFzY2lpX2xpY2Vuc2VzCj4gK8KgwqDCoCBl eGNlcHQgRXhjZXB0aW9uIGFzIGU6Cj4gK8KgwqDCoMKgwqDCoMKgIGJiLndhcm4oZiJFeGNlcHRp b24gcmVhZGluZyB7ZmlsZW5hbWV9OiB7ZX0iKQo+ICvCoMKgwqAgcmV0dXJuIE5vbmUKPiArCj4g K2RlZiBpc193b3JrX3NoYXJlZF9zcGR4KGQpOgo+ICvCoMKgwqAgcmV0dXJuIGJiLmRhdGEuaW5o ZXJpdHNfY2xhc3MoJ2tlcm5lbCcsIGQpIG9yICgnd29yay1zaGFyZWQnIGluCj4gZC5nZXRWYXIo J1dPUktESVInKSkKPiArCj4gK2RlZiBnZXRfanNvbl9pbmRlbnQoZCk6Cj4gK8KgwqDCoCBpZiBk LmdldFZhcigiU1BEWF9QUkVUVFkiKSA9PSAiMSI6Cj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAy Cj4gK8KgwqDCoCByZXR1cm4gTm9uZQo+ICsKPiArcHl0aG9uKCkgewo+ICvCoMKgwqAgaW1wb3J0 IGpzb24KPiArwqDCoMKgIGlmIGQuZ2V0VmFyKCJTUERYX0xJQ0VOU0VfREFUQSIpOgo+ICvCoMKg wqDCoMKgwqDCoCByZXR1cm4KPiArCj4gK8KgwqDCoCB3aXRoIG9wZW4oZC5nZXRWYXIoIlNQRFhf TElDRU5TRVMiKSwgInIiKSBhcyBmOgo+ICvCoMKgwqDCoMKgwqDCoCBkYXRhID0ganNvbi5sb2Fk KGYpCj4gK8KgwqDCoMKgwqDCoMKgICMgVHJhbnNmb3JtIHRoZSBsaWNlbnNlIGFycmF5IHRvIGEg ZGljdGlvbmFyeQo+ICvCoMKgwqDCoMKgwqDCoCBkYXRhWyJsaWNlbnNlcyJdID0ge2xbImxpY2Vu c2VJZCJdOiBsIGZvciBsIGluCj4gZGF0YVsibGljZW5zZXMiXX0KPiArwqDCoMKgwqDCoMKgwqAg ZC5zZXRWYXIoIlNQRFhfTElDRU5TRV9EQVRBIiwgZGF0YSkKPiArfQo+ICsKPiArZGVmIHByb2Nl c3Nfc291cmNlcyhkKToKPiArwqDCoMKgIHBuID0gZC5nZXRWYXIoJ1BOJykKPiArwqDCoMKgIGFz c3VtZV9wcm92aWRlZCA9IChkLmdldFZhcigiQVNTVU1FX1BST1ZJREVEIikgb3IgIiIpLnNwbGl0 KCkKPiArwqDCoMKgIGlmIHBuIGluIGFzc3VtZV9wcm92aWRlZDoKPiArwqDCoMKgwqDCoMKgwqAg Zm9yIHAgaW4gZC5nZXRWYXIoIlBST1ZJREVTIikuc3BsaXQoKToKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBpZiBwICE9IHBuOgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcG4g PSBwCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhawo+ICsKPiArwqDCoMKg ICMgZ2xpYmMtbG9jYWxlOiBkb19mZXRjaCwgZG9fdW5wYWNrIGFuZCBkb19wYXRjaCB0YXNrcyBo YXZlIGJlZW4KPiBkZWxldGVkLAo+ICvCoMKgwqAgIyBzbyBhdm9pZCBhcmNoaXZpbmcgc291cmNl IGhlcmUuCj4gK8KgwqDCoCBpZiBwbi5zdGFydHN3aXRoKCdnbGliYy1sb2NhbGUnKToKPiArwqDC oMKgwqDCoMKgwqAgcmV0dXJuIEZhbHNlCj4gK8KgwqDCoCBpZiBkLmdldFZhcignUE4nKSA9PSAi bGlidG9vbC1jcm9zcyI6Cj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBGYWxzZQo+ICvCoMKgwqAg aWYgZC5nZXRWYXIoJ1BOJykgPT0gImxpYmdjYy1pbml0aWFsIjoKPiArwqDCoMKgwqDCoMKgwqAg cmV0dXJuIEZhbHNlCj4gK8KgwqDCoCBpZiBkLmdldFZhcignUE4nKSA9PSAic2hhZG93LXN5c3Jv b3QiOgo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gRmFsc2UKPiArCj4gK8KgwqDCoCAjIFdlIGp1 c3QgYXJjaGl2ZSBnY2Mtc291cmNlIGZvciBhbGwgdGhlIGdjYyByZWxhdGVkIHJlY2lwZXMKPiAr wqDCoMKgIGlmIGQuZ2V0VmFyKCdCUE4nKSBpbiBbJ2djYycsICdsaWJnY2MnXToKPiArwqDCoMKg wqDCoMKgwqAgYmIuZGVidWcoMSwgJ3NwZHg6IFRoZXJlIGlzIGJ1ZyBpbiBzY2FuIG9mICVzIGlz LCBkbwo+IG5vdGhpbmcnICUgcG4pCj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBGYWxzZQo+ICsK PiArwqDCoMKgIHJldHVybiBUcnVlCj4gKwo+ICtkZWYgY29sbGVjdF9kaXJlY3RfZGVwcyhkLCBk ZXBfdGFzayk6Cj4gK8KgwqDCoCBjdXJyZW50X3Rhc2sgPSAiZG9fIiArIGQuZ2V0VmFyKCJCQl9D VVJSRU5UVEFTSyIpCj4gK8KgwqDCoCBwbiA9IGQuZ2V0VmFyKCJQTiIpCj4gKwo+ICvCoMKgwqAg dGFza2RlcGRhdGEgPSBkLmdldFZhcigiQkJfVEFTS0RFUERBVEEiLCBGYWxzZSkKPiArCj4gK8Kg wqDCoCBmb3IgdGhpc19kZXAgaW4gdGFza2RlcGRhdGEudmFsdWVzKCk6Cj4gK8KgwqDCoMKgwqDC oMKgIGlmIHRoaXNfZGVwWzBdID09IHBuIGFuZCB0aGlzX2RlcFsxXSA9PSBjdXJyZW50X3Rhc2s6 Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWsKPiArwqDCoMKgIGVsc2U6Cj4gK8KgwqDC oMKgwqDCoMKgIGJiLmZhdGFsKGYiVW5hYmxlIHRvIGZpbmQgdGhpcyB7cG59OntjdXJyZW50X3Rh c2t9IGluCj4gdGFza2RlcGRhdGEiKQo+ICsKPiArwqDCoMKgIGRlcHMgPSBzZXQoKQo+ICsKPiAr wqDCoMKgIGZvciBkZXBfbmFtZSBpbiB0aGlzX2RlcC5kZXBzOgo+ICvCoMKgwqDCoMKgwqDCoCBk ZXBfZGF0YSA9IHRhc2tkZXBkYXRhW2RlcF9uYW1lXQo+ICvCoMKgwqDCoMKgwqDCoCBpZiBkZXBf ZGF0YS50YXNrbmFtZSA9PSBkZXBfdGFzayBhbmQgZGVwX2RhdGEucG4gIT0gcG46Cj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgZGVwcy5hZGQoKGRlcF9kYXRhLnBuLCBkZXBfZGF0YS5oYXNoZm4s IGRlcF9uYW1lIGluCj4gdGhpc19kZXAudGFza2hhc2hfZGVwcykpCj4gKwo+ICvCoMKgwqAgcmV0 dXJuIHNvcnRlZChkZXBzKQo+ICsKPiArY29sbGVjdF9kaXJlY3RfZGVwc1t2YXJkZXBzZXhjbHVk ZV0gKz0gIkJCX1RBU0tERVBEQVRBIgo+ICtjb2xsZWN0X2RpcmVjdF9kZXBzW3ZhcmRlcHNdICs9 ICJERVBFTkRTIgo+ICsKPiArcHl0aG9uIGRvX2NvbGxlY3Rfc3BkeF9kZXBzKCkgewo+ICvCoMKg wqAgIyBUaGlzIHRhc2sgY2FsY3VsYXRlcyB0aGUgYnVpbGQgdGltZSBkZXBlbmRlbmNpZXMgb2Yg dGhlCj4gcmVjaXBlLCBhbmQgaXMKPiArwqDCoMKgICMgcmVxdWlyZWQgYmVjYXVzZSB3aGlsZSBh IHRhc2sgY2FuIGRlcHRhc2sgb24gaXRzZWxmLCB0aG9zZQo+IGRlcGVuZGVuY2llcwo+ICvCoMKg wqAgIyBkbyBub3Qgc2hvdyB1cCBpbiBCQl9UQVNLREVQREFUQS4gVG8gd29yayBhcm91bmQgdGhh dCwgdGhpcwo+IHRhc2sgZG9lcyB0aGUKPiArwqDCoMKgICMgZGVwdGFzayBvbiBkb19jcmVhdGVf c3BkeCBhbmQgd3JpdGVzIG91dCB0aGUgZGVwZW5kZW5jaWVzIGl0Cj4gZmluZHMsIHRoZW4KPiAr wqDCoMKgICMgZG9fY3JlYXRlX3NwZHggcmVhZHMgaW4gdGhlIGZvdW5kIGRlcGVuZGVuY2llcyB3 aGVuIHdyaXRpbmcKPiB0aGUgYWN0dWFsCj4gK8KgwqDCoCAjIFNQRFggZG9jdW1lbnQKPiArwqDC oMKgIGltcG9ydCBqc29uCj4gK8KgwqDCoCBmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKPiArCj4g K8KgwqDCoCBzcGR4X2RlcHNfZmlsZSA9IFBhdGgoZC5nZXRWYXIoIlNQRFhERVBTIikpCj4gKwo+ ICvCoMKgwqAgZGVwcyA9IGNvbGxlY3RfZGlyZWN0X2RlcHMoZCwgImRvX2NyZWF0ZV9zcGR4IikK PiArCj4gK8KgwqDCoCB3aXRoIHNwZHhfZGVwc19maWxlLm9wZW4oInciKSBhcyBmOgo+ICvCoMKg wqDCoMKgwqDCoCBqc29uLmR1bXAoZGVwcywgZikKPiArfQo+ICsjIE5PVEU6IGRlcGVuZGluZyBv biBkb191bnBhY2sgaXMgYSBoYWNrIHRoYXQgaXMgbmVjZXNzYXJ5IHRvIGdldAo+IGl0J3MgZGVw ZW5kZW5jaWVzIGZvciBhcmNoaXZlIHRoZSBzb3VyY2UKPiArYWRkdGFzayBkb19jb2xsZWN0X3Nw ZHhfZGVwcyBhZnRlciBkb191bnBhY2sKPiArZG9fY29sbGVjdF9zcGR4X2RlcHNbZGVwZW5kc10g Kz0gIiR7UEFUQ0hERVBFTkRFTkNZfSIKPiArZG9fY29sbGVjdF9zcGR4X2RlcHNbZGVwdGFza10g PSAiZG9fY3JlYXRlX3NwZHgiCj4gK2RvX2NvbGxlY3Rfc3BkeF9kZXBzW2RpcnNdID0gIiR7U1BE WERJUn0iCj4gKwo+ICtkZWYgZ2V0X3NwZHhfZGVwcyhkKToKPiArwqDCoMKgIGltcG9ydCBqc29u Cj4gK8KgwqDCoCBmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKPiArCj4gK8KgwqDCoCBzcGR4X2Rl cHNfZmlsZSA9IFBhdGgoZC5nZXRWYXIoIlNQRFhERVBTIikpCj4gKwo+ICvCoMKgwqAgd2l0aCBz cGR4X2RlcHNfZmlsZS5vcGVuKCJyIikgYXMgZjoKPiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGpz b24ubG9hZChmKQo+ICsKPiArZGVmIGNvbGxlY3RfcGFja2FnZV9wcm92aWRlcnMoZCk6Cj4gK8Kg wqDCoCBmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKPiArwqDCoMKgIGltcG9ydCBvZS5zYm9tCj4g K8KgwqDCoCBpbXBvcnQgb2Uuc3BkeAo+ICvCoMKgwqAgaW1wb3J0IGpzb24KPiArCj4gK8KgwqDC oCBkZXBsb3lfZGlyX3NwZHggPSBQYXRoKGQuZ2V0VmFyKCJERVBMT1lfRElSX1NQRFgiKSkKPiAr Cj4gK8KgwqDCoCBwcm92aWRlcnMgPSB7fQo+ICsKPiArwqDCoMKgIGRlcHMgPSBjb2xsZWN0X2Rp cmVjdF9kZXBzKGQsICJkb19jcmVhdGVfc3BkeCIpCj4gK8KgwqDCoCBkZXBzLmFwcGVuZCgoZC5n ZXRWYXIoIlBOIiksIGQuZ2V0VmFyKCJCQl9IQVNIRklMRU5BTUUiKSwgVHJ1ZSkpCj4gKwo+ICvC oMKgwqAgZm9yIGRlcF9wbiwgZGVwX2hhc2hmbiwgXyBpbiBkZXBzOgo+ICvCoMKgwqDCoMKgwqDC oCBsb2NhbGRhdGEgPSBkCj4gK8KgwqDCoMKgwqDCoMKgIHJlY2lwZV9kYXRhID0gb2UucGFja2Fn ZWRhdGEucmVhZF9wa2dkYXRhKGRlcF9wbiwgbG9jYWxkYXRhKQo+ICvCoMKgwqDCoMKgwqDCoCBp ZiBub3QgcmVjaXBlX2RhdGE6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbG9jYWxkYXRhID0g YmIuZGF0YS5jcmVhdGVDb3B5KGQpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbG9jYWxkYXRh LnNldFZhcigiUEtHREFUQV9ESVIiLCAiJHtQS0dEQVRBX0RJUl9TREt9IikKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCByZWNpcGVfZGF0YSA9IG9lLnBhY2thZ2VkYXRhLnJlYWRfcGtnZGF0YShk ZXBfcG4sCj4gbG9jYWxkYXRhKQo+ICsKPiArwqDCoMKgwqDCoMKgwqAgZm9yIHBrZyBpbiByZWNp cGVfZGF0YS5nZXQoIlBBQ0tBR0VTIiwgIiIpLnNwbGl0KCk6Cj4gKwo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHBrZ19kYXRhID0gb2UucGFja2FnZWRhdGEucmVhZF9zdWJwa2dkYXRhX2RpY3Qo cGtnLAo+IGxvY2FsZGF0YSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBycHJvdmlkZXMgPSBz ZXQobiBmb3IgbiwgXyBpbgo+IGJiLnV0aWxzLmV4cGxvZGVfZGVwX3ZlcnNpb25zMihwa2dfZGF0 YS5nZXQoIlJQUk9WSURFUyIsCj4gIiIpKS5pdGVtcygpKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHJwcm92aWRlcy5hZGQocGtnKQo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAi UEtHIiBpbiBwa2dfZGF0YToKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBrZyA9 IHBrZ19kYXRhWyJQS0ciXQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcnByb3Zp ZGVzLmFkZChwa2cpCj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZvciByIGluIHJwcm92 aWRlczoKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHByb3ZpZGVyc1tyXSA9IChw a2csIGRlcF9oYXNoZm4pCj4gKwo+ICvCoMKgwqAgcmV0dXJuIHByb3ZpZGVycwo+ICsKPiArY29s bGVjdF9wYWNrYWdlX3Byb3ZpZGVyc1t2YXJkZXBzZXhjbHVkZV0gKz0gIkJCX1RBU0tERVBEQVRB Igo+ICsKPiArZGVmIHNwZHhfZ2V0X3NyYyhkKToKPiArwqDCoMKgICIiIgo+ICvCoMKgwqAgc2F2 ZSBwYXRjaGVkIHNvdXJjZSBvZiB0aGUgcmVjaXBlIGluIFNQRFhfV09SS0RJUi4KPiArwqDCoMKg ICIiIgo+ICvCoMKgwqAgaW1wb3J0IHNodXRpbAo+ICvCoMKgwqAgc3BkeF93b3JrZGlyID0gZC5n ZXRWYXIoJ1NQRFhXT1JLJykKPiArwqDCoMKgIHNwZHhfc3lzcm9vdF9uYXRpdmUgPSBkLmdldFZh cignU1RBR0lOR19ESVJfTkFUSVZFJykKPiArwqDCoMKgIHBuID0gZC5nZXRWYXIoJ1BOJykKPiAr Cj4gK8KgwqDCoCB3b3JrZGlyID0gZC5nZXRWYXIoIldPUktESVIiKQo+ICsKPiArwqDCoMKgIHRy eToKPiArwqDCoMKgwqDCoMKgwqAgIyBUaGUga2VybmVsIGNsYXNzIGZ1bmN0aW9ucyByZXF1aXJl IGl0IHRvIGJlIG9uIHdvcmstCj4gc2hhcmVkLCBzbyB3ZSBkb250IGNoYW5nZSBXT1JLRElSCj4g K8KgwqDCoMKgwqDCoMKgIGlmIG5vdCBpc193b3JrX3NoYXJlZF9zcGR4KGQpOgo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgICMgQ2hhbmdlIHRoZSBXT1JLRElSIHRvIG1ha2UgZG9fdW5wYWNrIGRv X3BhdGNoIHJ1biBpbgo+IGFub3RoZXIgZGlyLgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGQu c2V0VmFyKCdXT1JLRElSJywgc3BkeF93b3JrZGlyKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg ICMgUmVzdG9yZSB0aGUgb3JpZ2luYWwgcGF0aCB0byByZWNpcGUncyBuYXRpdmUgc3lzcm9vdAo+ IChpdCdzIHJlbGF0aXZlIHRvIFdPUktESVIpLgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGQu c2V0VmFyKCdTVEFHSU5HX0RJUl9OQVRJVkUnLCBzcGR4X3N5c3Jvb3RfbmF0aXZlKQo+ICsKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAjIFRoZSBjaGFuZ2VkICdXT1JLRElSJyBhbHNvIGNhdXNl ZCAnQicgY2hhbmdlZCwgY3JlYXRlCj4gZGlyICdCJyBmb3IgdGhlCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgIyBwb3NzaWJseSByZXF1aXJpbmcgb2YgdGhlIGZvbGxvd2luZyB0YXNrcyAoc3Vj aCBhcwo+IHNvbWUgcmVjaXBlcydzCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIyBkb19wYXRj aCByZXF1aXJlZCAnQicgZXhpc3RlZCkuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYmIudXRp bHMubWtkaXJoaWVyKGQuZ2V0VmFyKCdCJykpCj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGJiLmJ1aWxkLmV4ZWNfZnVuYygnZG9fdW5wYWNrJywgZCkKPiArwqDCoMKgwqDCoMKgwqAgIyBD b3B5IHNvdXJjZSBvZiBrZXJuZWwgdG8gc3BkeF93b3JrZGlyCj4gK8KgwqDCoMKgwqDCoMKgIGlm IGlzX3dvcmtfc2hhcmVkX3NwZHgoZCk6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2hhcmVf c3JjID0gZC5nZXRWYXIoJ1dPUktESVInKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGQuc2V0 VmFyKCdXT1JLRElSJywgc3BkeF93b3JrZGlyKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGQu c2V0VmFyKCdTVEFHSU5HX0RJUl9OQVRJVkUnLCBzcGR4X3N5c3Jvb3RfbmF0aXZlKQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHNyY19kaXIgPSBzcGR4X3dvcmtkaXIgKyAiLyIgKyBkLmdldFZh cignUE4nKSsgIi0iICsKPiBkLmdldFZhcignUFYnKSArICItIiArIGQuZ2V0VmFyKCdQUicpCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYmIudXRpbHMubWtkaXJoaWVyKHNyY19kaXIpCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgYmIuZGF0YS5pbmhlcml0c19jbGFzcygna2VybmVsJyxk KToKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNoYXJlX3NyYyA9IGQuZ2V0VmFy KCdTVEFHSU5HX0tFUk5FTF9ESVInKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNtZF9jb3B5 X3NoYXJlID0gImNwIC1yZiAiICsgc2hhcmVfc3JjICsgIi8qICIgKyBzcmNfZGlyCj4gKyAiLyIK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjbWRfY29weV9zaGFyZWRfcmVzID0gb3MucG9wZW4o Y21kX2NvcHlfc2hhcmUpLnJlYWQoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJiLm5vdGUo ImNtZF9jb3B5X3NoYXJlZF9yZXN1bHQgPSAiICsKPiBjbWRfY29weV9zaGFyZWRfcmVzKQo+ICsK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnaXRfcGF0aCA9IHNyY19kaXIgKyAiLy5naXQiCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgb3MucGF0aC5leGlzdHMoZ2l0X3BhdGgpOgo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2h1dGlscy5ybXRyZWUoZ2l0X3BhdGgpCj4g Kwo+ICvCoMKgwqDCoMKgwqDCoCAjIE1ha2Ugc3VyZSBnY2MgYW5kIGtlcm5lbCBzb3VyY2VzIGFy ZSBwYXRjaGVkIG9ubHkgb25jZQo+ICvCoMKgwqDCoMKgwqDCoCBpZiBub3QgKGQuZ2V0VmFyKCdT UkNfVVJJJykgPT0gIiIgb3IKPiBpc193b3JrX3NoYXJlZF9zcGR4KGQpKToKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBiYi5idWlsZC5leGVjX2Z1bmMoJ2RvX3BhdGNoJywgZCkKPiArCj4gK8Kg wqDCoMKgwqDCoMKgICMgU29tZSB1c2VybGFuZCBoYXMgbm8gc291cmNlLgo+ICvCoMKgwqDCoMKg wqDCoCBpZiBub3Qgb3MucGF0aC5leGlzdHMoIHNwZHhfd29ya2RpciApOgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGJiLnV0aWxzLm1rZGlyaGllcihzcGR4X3dvcmtkaXIpCj4gK8KgwqDCoCBm aW5hbGx5Ogo+ICvCoMKgwqDCoMKgwqDCoCBkLnNldFZhcigiV09SS0RJUiIsIHdvcmtkaXIpCj4g Kwo+ICtzcGR4X2dldF9zcmNbdmFyZGVwc2V4Y2x1ZGVdICs9ICJTVEFHSU5HX0tFUk5FTF9ESVIi Cj4gKwo+IAo+IC09LT0tPS09LT0tPS09LT0tPS09LT0tCj4gTGlua3M6IFlvdSByZWNlaXZlIGFs bCBtZXNzYWdlcyBzZW50IHRvIHRoaXMgZ3JvdXAuCj4gVmlldy9SZXBseSBPbmxpbmUgKCMyMDA0 ODYpOgo+IGh0dHBzOi8vbGlzdHMub3BlbmVtYmVkZGVkLm9yZy9nL29wZW5lbWJlZGRlZC1jb3Jl L21lc3NhZ2UvMjAwNDg2Cj4gTXV0ZSBUaGlzIFRvcGljOiBodHRwczovL2xpc3RzLm9wZW5lbWJl ZGRlZC5vcmcvbXQvMTA2NjAyNTE2LzQ0NTQ1ODIKPiBHcm91cCBPd25lcjogb3BlbmVtYmVkZGVk LWNvcmUrb3duZXJAbGlzdHMub3BlbmVtYmVkZGVkLm9yZwo+IFVuc3Vic2NyaWJlOgo+IGh0dHBz Oi8vbGlzdHMub3BlbmVtYmVkZGVkLm9yZy9nL29wZW5lbWJlZGRlZC1jb3JlL3Vuc3ViwqBbCj4g YWRyaWFuLmZyZWlob2ZlckBnbWFpbC5jb21dCj4gLT0tPS09LT0tPS09LT0tPS09LT0tPS0KPiAK Cg==