Return-Path: Delivered-To: apmail-db-derby-dev-archive@www.apache.org Received: (qmail 31859 invoked from network); 11 May 2005 20:01:11 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 11 May 2005 20:01:11 -0000 Received: (qmail 39089 invoked by uid 500); 11 May 2005 20:04:58 -0000 Delivered-To: apmail-db-derby-dev-archive@db.apache.org Received: (qmail 39065 invoked by uid 500); 11 May 2005 20:04:58 -0000 Mailing-List: contact derby-dev-help@db.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: List-Id: Reply-To: "Derby Development" Delivered-To: mailing list derby-dev@db.apache.org Received: (qmail 39049 invoked by uid 99); 11 May 2005 20:04:58 -0000 X-ASF-Spam-Status: No, hits=0.0 required=10.0 tests=RCVD_BY_IP X-Spam-Check-By: apache.org Received-SPF: pass (hermes.apache.org: domain of msatoor@gmail.com designates 64.233.184.206 as permitted sender) Received: from wproxy.gmail.com (HELO wproxy.gmail.com) (64.233.184.206) by apache.org (qpsmtpd/0.28) with ESMTP; Wed, 11 May 2005 13:04:57 -0700 Received: by wproxy.gmail.com with SMTP id 58so302156wri for ; Wed, 11 May 2005 13:01:06 -0700 (PDT) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:reply-to:to:subject:in-reply-to:mime-version:content-type:references; b=Rd5+tOAur1Hq2D87By+A3dRxpmZRgTYqWJHWd6S7iG4m25NO7+lcUBQPgO8SvNMule2CuqzGv8WTGmDXZwzGWg4IW+PQUfNv7dsPeF5am+Npg9E+hB9LqovhOBhQLKLPOdleou9up6wYcoXd5Ucgg30kpTg0fgL9vKCx15TXlAg= Received: by 10.54.6.50 with SMTP id 50mr481230wrf; Wed, 11 May 2005 13:01:06 -0700 (PDT) Received: by 10.54.49.41 with HTTP; Wed, 11 May 2005 13:01:06 -0700 (PDT) Message-ID: Date: Wed, 11 May 2005 13:01:06 -0700 From: Mamta Satoor Reply-To: Mamta Satoor To: Derby Development Subject: Re: [PATCH] (DERBY-251) DISTINCT query is returning duplicate rows In-Reply-To: <42825435.7030302@sbcglobal.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_972_7766598.1115841666656" References: <42825435.7030302@sbcglobal.net> X-Virus-Checked: Checked X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N ------=_Part_972_7766598.1115841666656 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Hi Jack, Appreciate you taking the time to do the review and catching the predicate with expression. I have changed the code and also added a test case for it. I have fired the derbyall suite on my codeline to make sure everything else runs smoothly. Attached is the updated patch anyways. thanks, Mamta On 5/11/05, Jack Klebanoff wrote: > The patch does not completely fix the problem. It does not handle the > case where the exists table column is embedded in an expression. Try the > following variation on the test select: >=20 > select distinct q1."NO1" from IDEPT q1, IDEPT q2 > where ( q2."DISCRIM_DEPT" =3D 'HardwareDept') > and ( q1."DISCRIM_DEPT" =3D 'SoftwareDept') and ( q1."NO1" <> ALL > (select q3."NO1" from IDEPT q3 where ( ABS(q3."REPORTTO_NO") =3D q2."N= O1"))) >=20 > Because q3."REPORTTO_NO" is inside a call to ABS the code added to > FromList.returnsAtMostSingleRow does not see it. >=20 > I would suggest using >=20 > JBitSet referencedTables =3D > and.getLeftOperand().getTablesReferenced(); > if( referencedTables.get( existsTableNumber)) > { >=20 > predicatesTemp.removeElementAt(predicatesTempIndex); > break; > } >=20 > instead of > BinaryRelationalOperatorNode beon =3D > (BinaryRelationalOperatorNode) > and.getLeftOperand(); > ValueNode left =3D beon.getLeftOperand(); > ValueNode right =3D beon.getRightOperand(); >=20 > /* If left or right side of predicate refer to > exists base table, > then remove it */ > if ((left instanceof ColumnReference) && > ((ColumnReference) left).getTableNumber() =3D= =3D > existsTableNumber) > { >=20 > predicatesTemp.removeElementAt(predicatesTempIndex); > break; > } > else if ((right instanceof ColumnReference) && > ((ColumnReference) right).getTableNumber() > =3D=3D existsTableNumber) > { >=20 > predicatesTemp.removeElementAt(predicatesTempIndex); > break; > } >=20 > I have tried it out and it seems to work. >=20 > Jack Klebanoff >=20 > Mamta Satoor wrote: >=20 > >Hi, > > > >I have a patch for this optimizer bug. Basically, the issue turned out > >to be the logic for DISTINCT elimination. During the optimization > >phase, if a query has DISTINCT clause, then impl.sql.compile.FromList > >class's returnsAtMostSingleRow() method gets called. This method > >returns true if the method concludes that DISTINCT in the query is > >redundant (based on a complex logic that decides that the query is > >going to return distinct rows on its own without the DISTINCT clause. > >The details of the current logic for DISTINCT elimination can be found > >in the comments at the method level.) > > > >For the query in question in this bug, the method returned true for > >DISTINCT elimination which is wrong. The explanation is as follows. > > > >First of all, I was able to simplify the query reported in the bug to > >following query. > >select distinct q1."NO1" from IDEPT q1, IDEPT q2 > >where ( q2."DISCRIM_DEPT" =3D 'HardwareDept') > >and ( q1."DISCRIM_DEPT" =3D 'SoftwareDept') and ( q1."NO1" <> ALL > >(select q3."NO1" from IDEPT q3 where (q3."REPORTTO_NO" =3D q2."NO1"))= ) > > > >This query gets converted to following during optimization > >select distinct q1."NO1" from IDEPT q1, IDEPT q2 > >where ( q2."DISCRIM_DEPT" =3D 'HardwareDept') > >and ( q1."DISCRIM_DEPT" =3D 'SoftwareDept') and not exists ( > >(select q3."NO1" from IDEPT q3 where > >( q3."REPORTTO_NO" =3D q2."NO1" and q3."NO1" =3D q1."NO1") ) ) ; > > > >This optimized query has 4 predicates associated with it > >q3.reportto_no =3D q2.no1 > >q2.discrim_dept =3D 'HardwareDept' > >q1.descrim_dept =3D 'SoftwareDept' > >q1.no1 =3D q3.no1 > > > >Next, on this optimized query(since it has DISTINCT clause in it), the > >returnsAtMostSingleRow() method gets called. The method incorrectly > >returns true indicating that DISTINCT can be eliminated. The reason > >for this is that method is looking at predicates that belong to the > >inside query with the exists clause (which is on table IDEPT q3) to > >determine DISTINCT elimination for the outer level. > > > >The fix is that the predicates from the exists query, (in this > >particular case, q3."NO1" =3D q1."NO1" and q3.reportto_no =3D q2.no1) > >should not be considered when deciding elimination of DISTINCT in the > >outer query. That is what the attached patch does. > > > >Hope this helps understand the problem and the proposed fix for it. > >The files impacted by the change are as follows > >svn stat > >M java\engine\org\apache\derby\impl\sql\compile\FromList.java > >M java\testing\org\apache\derbyTesting\functionTests\tests\lang\distinct= Elimination.sql > >M java\testing\org\apache\derbyTesting\functionTests\master\distinctElim= ination.out > > > >Please send in comments you may have. I have run the existing tests > >and the patch didn't cause any failures. > > > >thanks, > >Mamta > > > > >=20 > ------=_Part_972_7766598.1115841666656 Content-Type: text/plain; name="diff051105.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="diff051105.txt" SW5kZXg6IGphdmEvZW5naW5lL29yZy9hcGFjaGUvZGVyYnkvaW1wbC9zcWwvY29tcGlsZS9Gcm9t TGlzdC5qYXZhDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09DQotLS0gamF2YS9lbmdpbmUvb3JnL2FwYWNoZS9kZXJieS9p bXBsL3NxbC9jb21waWxlL0Zyb21MaXN0LmphdmEJKHJldmlzaW9uIDE2OTY0MikNCisrKyBqYXZh L2VuZ2luZS9vcmcvYXBhY2hlL2RlcmJ5L2ltcGwvc3FsL2NvbXBpbGUvRnJvbUxpc3QuamF2YQko d29ya2luZyBjb3B5KQ0KQEAgLTEwNDAsNyArMTA0MCw3IEBADQogCX0KIAogCS8qKgotCSAqIERl Y3JlbWVudCAocXVlcnkgYmxvY2spIGxldmVsICgwLWJhc2VkKSBmb3IgCisJICogRGVjcmVtZW50 IChxdWVyeSBibG9jaykgbGV2ZWwgKDAtYmFzZWQpIGZvcgogCSAqIGFsbCBvZiB0aGUgdGFibGVz IGluIHRoaXMgZnJvbSBsaXN0LgogCSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gZmxhdHRlbmluZyBh IHN1YnF1ZXJ5LgogCSAqCkBAIC0xMDY5LDcgKzEwNjksNyBAQA0KIAkJfQogCX0KIAotCQorCiAJ LyoqCiAJICogVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgYm90aCBzdWJxdWVyeSBmbGF0dGVuaW5n IGFuZCBkaXN0aW5jdAogCSAqIGVsaW1pbmF0aW9uIGJhc2VkIG9uIGEgdW5pcXVlbmVzcyBjb25k aXRpb24uICBGb3Igc3VicXVlcnkKQEAgLTEwNzksNyArMTA3OSw3IEBADQogCSAqIGFueSBkdXBs aWNhdGVzLgogCSAqIFRoaXMgaXMgdHJ1ZSBpZiBldmVyeSB0YWJsZSBpbiB0aGUgZnJvbSBsaXN0 IGlzCiAJICogKGEgYmFzZSB0YWJsZSBhbmQgdGhlIHNldCBvZiBjb2x1bW5zIGZyb20gdGhlIHRh YmxlIHRoYXQKLQkgKiBhcmUgaW4gZXF1YWxpdHkgY29tcGFyaXNvbnMgd2l0aCBleHByZXNzaW9u cyB0aGF0IGRvIG5vdCBpbmNsdWRlIGNvbHVtbnMgCisJICogYXJlIGluIGVxdWFsaXR5IGNvbXBh cmlzb25zIHdpdGggZXhwcmVzc2lvbnMgdGhhdCBkbyBub3QgaW5jbHVkZSBjb2x1bW5zCiAJICog ZnJvbSB0aGUgc2FtZSB0YWJsZSBpcyBhIHN1cGVyc2V0IG9mIGFueSB1bmlxdWUgaW5kZXgKIAkg KiBvbiB0aGUgdGFibGUpIG9yIGFuIEVYSVNUUyBGQlQuICBJbiBhZGRpdGlvbiwgYXQgbGVhc3Qg MSBvZiB0aGUgdGFibGVzCiAJICogaW4gdGhlIGxpc3QgaGFzIGEgc2V0IG9mIGNvbHVtbnMgaW4g ZXF1YWxpdHkgY29tcGFyaXNvbnMgd2l0aCBleHByZXNzaW9ucwpAQCAtMTEwNSwyOCArMTEwNSwy OCBAQA0KIAkgKgkJY3JlYXRlIGFuIGFycmF5IG9mIGNvbHVtbnMgZnJvbSB0aGUgdGFibGUoZXFP dXRlckNvbCkKIAkgKgkJKHRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhhdCBvbmx5IG9uZSBy b3cgd2lsbCBiZSByZXR1cm5lZAogCSAqCQlmcm9tIGEgam9pbikKLQkgKgkJCQorCSAqCiAJICoJ CWlmIHRoZSBjdXJyZW50IHRhYmxlIGlzIHRoZSB0YWJsZSBmb3IgdGhlIHJlc3VsdCBjb2x1bW5z CiAJICoJCQlzZXQgdGhlIHJlc3VsdCBjb2x1bW5zIGluIHRoZSBlcU91dGVyQ29sIGFuZCB0YWJs ZUNvbE1hcAogCSAqCQkJKGlmIHRoZXNlIGNvbHVtbnMgYXJlIGEgc3VwZXJzZXQgb2YgYSB1bmlx dWUgaW5kZXggYW5kCiAJICoJCQlhbGwgam9pbmluZyB0YWJsZXMgcmVzdWx0IGluIG9ubHkgb25l IHJvdywgdGhlCiAJICoJCQlyZXN1bHRzIHdpbGwgYmUgZGlzdGluY3QpCiAJICoJCWdvIHRocm91 Z2ggYWxsIHRoZSBwcmVkaWNhdGVzIGFuZCB1cGRhdGUgdGFibGVDb2xNYXAgIGFuZAotCSAqCQll cU91dGVyQ29sIHdpdGggam9pbiBjb2x1bW5zIGFuZCBjb3JyZWxhdGlvbiB2YXJpYWJsZXMsIAor CSAqCQllcU91dGVyQ29sIHdpdGggam9pbiBjb2x1bW5zIGFuZCBjb3JyZWxhdGlvbiB2YXJpYWJs ZXMsCiAJICoJCXBhcmFtZXRlcnMgYW5kIGNvbnN0YW50cwogCSAqCQlzaW5jZSBzZXR0aW5nIGNv bnN0YW50cywgY29ycmVsYXRpb24gdmFyaWFibGVzIGFuZCBwYXJhbWV0ZXJzLAotCSAqIAkJcmVk dWNlcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgcmVxdWlyZWQgZm9yIHVuaXF1ZW5lc3MgaW4gYSAK KwkgKiAJCXJlZHVjZXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIHJlcXVpcmVkIGZvciB1bmlxdWVu ZXNzIGluIGEKIAkgKgkJbXVsdGktY29sdW1uIGluZGV4LCB0aGV5IGFyZSBzZXQgZm9yIGFsbCB0 aGUgdGFibGVzIChpZiB0aGUKIAkgKgkJdGFibGUgaXMgbm90IHRoZSByZXN1bHQgdGFibGUsIGlu IHRoaXMgY2FzZSBvbmx5IHRoZSBjb2x1bW4gb2YgdGhlCiAgICAgICoJCXJlc3VsdCB0YWJsZSBp cyBzZXQpCiAJICoJCWpvaW4gY29sdW1ucyBhcmUganVzdCB1cGRhdGVkIGZvciB0aGUgY29sdW1u IGluIHRoZSByb3cgb2YgdGhlCiAJICoJCWpvaW5pbmcgdGFibGUuCi0JICoJCQotCSAqCQljaGVj ayBpZiB0aGUgbWFya2VkIGNvbHVtbnMgaW4gdGFibGVDb2xNYXAgYXJlIGEgc3VwZXJzZXQgb2Yg YSB1bmlxdWUgCi0JICoJCQlpbmRleAkJCisJICoKKwkgKgkJY2hlY2sgaWYgdGhlIG1hcmtlZCBj b2x1bW5zIGluIHRhYmxlQ29sTWFwIGFyZSBhIHN1cGVyc2V0IG9mIGEgdW5pcXVlCisJICoJCQlp bmRleAogCSAqCQkJKFRoaXMgbWVhbnMgdGhhdCB0aGUgam9pbiB3aWxsIG9ubHkgcHJvZHVjZSAx IHJvdyB3aGVuIGpvaW5lZAogCSAqCQkJd2l0aCAxIHJvdyBvZiBhbm90aGVyIHRhYmxlKQotCSAq CQljaGVjayB0aGF0IHRoZXJlIGlzIGEgbGVhc3Qgb25lIHRhYmxlIGZvciB3aGljaCB0aGUgY29s dW1ucyBpbiAKKwkgKgkJY2hlY2sgdGhhdCB0aGVyZSBpcyBhIGxlYXN0IG9uZSB0YWJsZSBmb3Ig d2hpY2ggdGhlIGNvbHVtbnMgaW4KIAkgKgkJCWVxT3V0ZXJDb2woaS5lLiBjb25zdGFudCB2YWx1 ZXMpIGFyZSBhIHN1cGVyc2V0IG9mIGEgdW5pcXVlIGluZGV4CiAJICoJCQkoVGhpcyBxdWFyYW50 ZWVzIHRoYXQgdGhlcmUgd2lsbCBiZSBvbmx5IG9uZSByb3cgc2VsZWN0ZWQKIAkgKgkJCWZyb20g dGhpcyB0YWJsZSkuCkBAIC0xMTM0LDggKzExMzQsOCBAQA0KIAkgKglPbmNlIGFsbCB0YWJsZXMg aGF2ZSBiZWVuIGV2YWx1YXRlZCwgY2hlY2sgdGhhdCBhbGwgdGhlIHRhYmxlcyBjYW4gYmUKIAkg KiAJam9pbmVkIGJ5IHVuaXF1ZSBpbmRleCBvciB3aWxsIGhhdmUgb25seSBvbmUgcm93CiAJICoK LQkgKgkKIAkgKgorCSAqCiAJICogQHBhcmFtIHJjbAkJCQlJZiBub24tbnVsbCwgdGhlIFJDTCBm cm9tIHRoZSBxdWVyeSBibG9jay4KIAkgKgkJCQkJCQlJZiBub24tbnVsbCBmb3Igc3VicXVlcmll cywgdGhlbiBlbnRyeSBjYW4KIAkgKgkJCQkJCQliZSBjb25zaWRlcmVkIGFzIHBhcnQgb2YgYW4g PSBjb21wYXJpc29uLgpAQCAtMTE1MCw4ICsxMTUwLDggQEANCiAJICoKIAkgKiBAZXhjZXB0aW9u IFN0YW5kYXJkRXhjZXB0aW9uCQlUaHJvd24gb24gZXJyb3IKIAkgKi8KLQlib29sZWFuIHJldHVy bnNBdE1vc3RTaW5nbGVSb3coUmVzdWx0Q29sdW1uTGlzdCByY2wsIAotCQkJCQkJCQkgICBWYWx1 ZU5vZGUgd2hlcmVDbGF1c2UsIAorCWJvb2xlYW4gcmV0dXJuc0F0TW9zdFNpbmdsZVJvdyhSZXN1 bHRDb2x1bW5MaXN0IHJjbCwKKwkJCQkJCQkJICAgVmFsdWVOb2RlIHdoZXJlQ2xhdXNlLAogCQkJ CQkJCQkgICBQcmVkaWNhdGVMaXN0IHdoZXJlUHJlZGljYXRlcywKIAkJCQkJCQkJICAgRGF0YURp Y3Rpb25hcnkgZGQpCiAJCXRocm93cyBTdGFuZGFyZEV4Y2VwdGlvbgpAQCAtMTE2MCw2ICsxMTYw LDEzIEBADQogCQlpbnRbXQkJCXRhYmxlTnVtYmVyczsKIAkJQ29sdW1uUmVmZXJlbmNlCWFkZGl0 aW9uYWxDUiA9IG51bGw7CiAKKwkJUHJlZGljYXRlTGlzdCBwcmVkaWNhdGVzVGVtcDsKKwkJcHJl ZGljYXRlc1RlbXAgPSAoUHJlZGljYXRlTGlzdCkgZ2V0Tm9kZUZhY3RvcnkoKS5nZXROb2RlKAor CQkJQ19Ob2RlVHlwZXMuUFJFRElDQVRFX0xJU1QsCWdldENvbnRleHRNYW5hZ2VyKCkpOworCQlp bnQgd2hlcmVQcmVkaWNhdGVzU2l6ZSA9IHdoZXJlUHJlZGljYXRlcy5zaXplKCk7CisJCWZvciAo aW50IGluZGV4ID0gMDsgaW5kZXggPCB3aGVyZVByZWRpY2F0ZXNTaXplOyBpbmRleCsrKQorCQkJ cHJlZGljYXRlc1RlbXAuYWRkUHJlZGljYXRlKChQcmVkaWNhdGUpd2hlcmVQcmVkaWNhdGVzLmVs ZW1lbnRBdChpbmRleCkpOworCiAJCS8qIFdoZW4gY29uc2lkZXJpbmcgc3VicXVlcnkgZmxhdHRl bmluZywgd2UgYXJlIGludGVyZXN0ZWQKIAkJICogaW4gdGhlIDFzdCAoYW5kIG9ubHkpIGVudHJ5 IGluIHRoZSBSQ0wuICAoVGhlIFJDTCB3aWxsIGJlCiAJCSAqIG51bGwgaWYgcmVzdWx0IGNvbHVt biBpcyBub3Qgb2YgaW50ZXJlc3QgZm9yIHN1YnF1ZXJ5IGZsYXR0ZW5pbmcuKQpAQCAtMTE5Myw2 ICsxMjAwLDc3IEBADQogCQkJewogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KKwkJCUZyb21CYXNl VGFibGUgZmJ0ID0gKEZyb21CYXNlVGFibGUpIHBybi5nZXRDaGlsZFJlc3VsdCgpOworCQkJLy9G b2xsb3dpbmcgZm9yIGxvb3AgY29kZSBpcyB0byB0YWtlIGNhcmUgb2YgRGVyYnktMjUxIChESVNU SU5DVCByZXR1cm5zCisJCQkvL2R1cGxpY2F0ZSByb3dzKS4KKwkJCS8vRGVyYnktMjUxIHJldHVy bmVkIGR1cGxpY2F0ZSByb3dzIGJlY2F1c2Ugd2Ugd2VyZSBsb29raW5nIGF0IHByZWRpY2F0ZXMK KwkJCS8vdGhhdCBiZWxvbmcgdG8gZXhpc3RzVGFibGUgdG8gZGV0ZXJtaW5lIERJU1RJTkNUIGVs aW1pbmF0aW9uCisJCQkvLworCQkJLy8oQ2hlY2sgbWV0aG9kIGxldmVsIGNvbW1lbnRzIHRvIHVu ZGVyc3RhbmQgRElTVElOQ1QgZWxpbWluYXRpb24gcnVsZXMuKQorCQkJLy8KKwkJCS8vRm9yIG9u ZSBzcGVjaWZpYyBleGFtcGxlLCBjb25zaWRlciB0aGUgcXVlcnkgYmVsb3cKKwkJCS8vc2VsZWN0 ICBkaXN0aW5jdCAgcTEuIk5PMSIgZnJvbSBJREVQVCBxMSwgSURFUFQgcTIKKwkJCS8vd2hlcmUg ICggcTIuIkRJU0NSSU1fREVQVCIgPSAnSGFyZHdhcmVEZXB0JykKKwkJCS8vYW5kICAoIHExLiJE SVNDUklNX0RFUFQiID0gJ1NvZnR3YXJlRGVwdCcpICBhbmQgICggcTEuIk5PMSIgPD4gQUxMCisJ CQkvLyhzZWxlY3QgIHEzLiJOTzEiIGZyb20gSURFUFQgcTMgd2hlcmUgIChxMy4iUkVQT1JUVE9f Tk8iID0gIHEyLiJOTzEiKSkpCisJCQkvLyhzZWxlY3QgIHEzLiJOTzEiIGZyb20gSURFUFQgcTMg d2hlcmUgICggQUJTKHEzLiJSRVBPUlRUT19OTyIpID0gIHEyLiJOTzEiKSkpCisJCQkvLworCQkJ Ly9UYWJsZSBJREVQVCBpbiB0aGUgcXVlcnkgYWJvdmUgaGFzIGEgcHJpbWFyeSBrZXkgZGVmaW5l ZCBvbiBjb2x1bW4gIk5PMSIKKwkJCS8vVGhpcyBxdWVyeSBnZXRzIGNvbnZlcnRlZCB0byBmb2xs b3dpbmcgZHVyaW5nIG9wdGltaXphdGlvbgorCQkJLy8KKwkJCS8vc2VsZWN0ICBkaXN0aW5jdCAg cTEuIk5PMSIgZnJvbSBJREVQVCBxMSwgSURFUFQgcTIKKwkJCS8vd2hlcmUgICggcTIuIkRJU0NS SU1fREVQVCIgPSAnSGFyZHdhcmVEZXB0JykKKwkJCS8vYW5kICAoIHExLiJESVNDUklNX0RFUFQi ID0gJ1NvZnR3YXJlRGVwdCcpICBhbmQgIG5vdCBleGlzdHMgKAorCQkJLy8oc2VsZWN0ICBxMy4i Tk8xIiBmcm9tIElERVBUIHEzIHdoZXJlCisJCQkvLyggICggQUJTKHEzLiJSRVBPUlRUT19OTyIp ID0gIHEyLiJOTzEiKSAgYW5kIHEzLiJOTzEiID0gcTEuIk5PMSIpICkgKSAgOworCQkJLy8KKwkJ CS8vRm9yIHRoZSBvcHRpbWl6ZWQgcXVlcnkgYWJvdmUsIERlcmJ5IGdlbmVyYXRlcyBmb2xsb3dp bmcgcHJlZGljYXRlcy4KKwkJCS8vQUJTKHEzLnJlcG9ydHRvX25vKSA9IHEyLm5vMQorCQkJLy9x Mi5kaXNjcmltX2RlcHQgPSAnSGFyZHdhcmVEZXB0JworCQkJLy9xMS5kZXNjcmltX2RlcHQgPSAn U29mdHdhcmVEZXB0JworCQkJLy9xMS5ubzEgPSBxMy5ubzEKKwkJCS8vVGhlIHByZWRpY2F0ZSBB QlMocTMuIk5PMSIpID0gcTEuIk5PMSIgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIHdoZW4gdHJ5 aW5nCisJCQkvL3RvIGRldGVybWluZSBpZiBxMSBpbiB0aGUgb3V0ZXIgcXVlcnkgaGFzIGVxdWFs aXR5IGNvbXBhcmlzb25zLiAKKwkJCS8vU2ltaWxhcmx5LCB0aGUgcHJlZGljYXRlIHEzLnJlcG9y dHRvX25vID0gcTIubm8xIHNob3VsZCBub3QgYmUKKwkJCS8vY29uc2lkZXJlZCB3aGVuIHRyeWlu ZyB0byBkZXRlcm1pbmUgaWYgcTIgaW4gdGhlIG91dGVyIHF1ZXJ5IGhhcworCQkJLy9lcXVhbGl0 eSBjb21wYXJpc29ucy4gVG8gYWNoaWV2ZSB0aGlzLCBwcmVkaWNhdGVzIGJhc2VkIG9uIGV4aXN0 cyBiYXNlCisJCQkvL3RhYmxlIHEzICh0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IHByZWRpY2F0ZSkg c2hvdWxkIGJlIHJlbW92ZWQgd2hpbGUKKwkJCS8vZXZhbHVhdGluZyBvdXRlciBxdWVyeSBmb3Ig dW5pcXVlbmVzcy4KKwkJCS8vCisJCQlpZiAoZmJ0LmdldEV4aXN0c0Jhc2VUYWJsZSgpKQorCQkJ eworCQkJCWludCBleGlzdHNUYWJsZU51bWJlciA9IGZidC5nZXRUYWJsZU51bWJlcigpOworCQkJ CWludCBwcmVkaWNhdGVzVGVtcFNpemUgPSBwcmVkaWNhdGVzVGVtcC5zaXplKCk7CisJCQkJZm9y IChpbnQgcHJlZGljYXRlc1RlbXBJbmRleCA9IHByZWRpY2F0ZXNUZW1wU2l6ZS0xOworCQkJCQlw cmVkaWNhdGVzVGVtcEluZGV4ID49IDA7IHByZWRpY2F0ZXNUZW1wSW5kZXgtLSkKKwkJCQl7CisJ CQkJCUFuZE5vZGUgdG9wQW5kTm9kZSA9IChBbmROb2RlKQorCQkJCQkJKChQcmVkaWNhdGUpIHBy ZWRpY2F0ZXNUZW1wLmVsZW1lbnRBdChwcmVkaWNhdGVzVGVtcEluZGV4KSkuZ2V0QW5kTm9kZSgp OworCisJCQkJCWZvciAoVmFsdWVOb2RlIHdoZXJlV2Fsa2VyID0gdG9wQW5kTm9kZTsgd2hlcmVX YWxrZXIgaW5zdGFuY2VvZiBBbmROb2RlOworCQkJCQkJd2hlcmVXYWxrZXIgPSAoKEFuZE5vZGUp IHdoZXJlV2Fsa2VyKS5nZXRSaWdodE9wZXJhbmQoKSkKKwkJCQkJeworCQkJCQkJLy8gU2VlIGlm IHRoaXMgaXMgYSBjYW5kaWRhdGUgPQorCQkJCQkJQW5kTm9kZSBhbmQgPSAoQW5kTm9kZSkgd2hl cmVXYWxrZXI7CisKKwkJCQkJCS8vd2Ugb25seSBuZWVkIHRvIHdvcnJ5IGFib3V0IGVxdWFsaXR5 IHByZWRpY2F0ZXMgYmVjYXVzZSBvbmx5IHRob3NlCisJCQkJCQkvL3ByZWRpY2F0ZXMgYXJlIGNv bnNpZGVyZWQgZHVyaW5nIERJU1RJTkNUIGVsaW1pbmF0aW9uLgorCQkJCQkJaWYgKCFhbmQuZ2V0 TGVmdE9wZXJhbmQoKS5pc1JlbGF0aW9uYWxPcGVyYXRvcigpIHx8CisJCQkJCQkJISgoKFJlbGF0 aW9uYWxPcGVyYXRvcikoYW5kLmdldExlZnRPcGVyYW5kKCkpKS5nZXRPcGVyYXRvcigpID09CisJ CQkJCQkJUmVsYXRpb25hbE9wZXJhdG9yLkVRVUFMU19SRUxPUCkpCisJCQkJCQl7CisJCQkJCQkJ Y29udGludWU7CisJCQkJCQl9CisKKwkJCQkJCUpCaXRTZXQgcmVmZXJlbmNlZFRhYmxlcyA9IGFu ZC5nZXRMZWZ0T3BlcmFuZCgpLmdldFRhYmxlc1JlZmVyZW5jZWQoKTsKKwkJCQkJCWlmIChyZWZl cmVuY2VkVGFibGVzLmdldChleGlzdHNUYWJsZU51bWJlcikpCisJCQkJCQl7CisJCQkJCQkJcHJl ZGljYXRlc1RlbXAucmVtb3ZlRWxlbWVudEF0KHByZWRpY2F0ZXNUZW1wSW5kZXgpOworCQkJCQkJ CWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQogCQl9CiAKIAkJLyogQnVpbGQg YW4gYXJyYXkgb2YgdGFibGVOdW1iZXJzIGZyb20gdGhpcyBxdWVyeSBibG9jay4KQEAgLTEyNDUs NyArMTMyMyw3IEBADQogCQkJLyogTm93IHNlZSBpZiB0aGVyZSBhcmUgYW55IGVxdWFsaXR5IGNv bmRpdGlvbnMKIAkJCSAqIG9mIGludGVyZXN0IGluIHRoZSB3aGVyZSBwcmVkaWNhdGVzLgogCQkJ ICovCi0JCQl3aGVyZVByZWRpY2F0ZXMuY2hlY2tUb3BQcmVkaWNhdGVzRm9yRXF1YWxzQ29uZGl0 aW9ucygKKwkJCXByZWRpY2F0ZXNUZW1wLmNoZWNrVG9wUHJlZGljYXRlc0ZvckVxdWFsc0NvbmRp dGlvbnMoCiAJCQkJCQkJCXRhYmxlTnVtYmVyLCBlcU91dGVyQ29scywgdGFibGVOdW1iZXJzLAog CQkJCQkJCQl0YWJsZUNvbE1hcFtpbmRleF0sIHJlc3VsdENvbFRhYmxlKTsKIApAQCAtMTI5OCw3 ICsxMzc2LDcgQEANCiAJCQkJCQkJLyogdW5pcXVlIGtleSBqb2luIC0gZXhpc3RzIHRhYmxlcyBh bHJlYWR5IG1hcmtlZCBhcyAKIAkJCQkJCQkgKiAxIHJvdyAtIHNvIGRvbid0IG5lZWQgdG8gbG9v ayBhdCB0aGVtCiAJCQkJCQkJICovCi0JCQkJCQkJaWYgKCFvbmVSb3dbaV0gJiYgdGFibGVDb2xN YXBbaV1baW5kZXhdLmdldCgwKSkJCisJCQkJCQkJaWYgKCFvbmVSb3dbaV0gJiYgdGFibGVDb2xN YXBbaV1baW5kZXhdLmdldCgwKSkKIAkJCQkJCQl7CiAJCQkJCQkJCW9uZVJvd1tpXSA9IHRydWU7 CiAJCQkJCQkJCWZvdW5kT25lUm93ID0gdHJ1ZTsKSW5kZXg6IGphdmEvdGVzdGluZy9vcmcvYXBh Y2hlL2RlcmJ5VGVzdGluZy9mdW5jdGlvblRlc3RzL3Rlc3RzL2xhbmcvZGlzdGluY3RFbGltaW5h dGlvbi5zcWwNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0NCi0tLSBqYXZhL3Rlc3Rpbmcvb3JnL2FwYWNoZS9kZXJieVRl c3RpbmcvZnVuY3Rpb25UZXN0cy90ZXN0cy9sYW5nL2Rpc3RpbmN0RWxpbWluYXRpb24uc3FsCShy ZXZpc2lvbiAxNjk2NDIpDQorKysgamF2YS90ZXN0aW5nL29yZy9hcGFjaGUvZGVyYnlUZXN0aW5n L2Z1bmN0aW9uVGVzdHMvdGVzdHMvbGFuZy9kaXN0aW5jdEVsaW1pbmF0aW9uLnNxbAkod29ya2lu ZyBjb3B5KQ0KQEAgLTEyLDYgKzEyLDExIEBADQogY3JlYXRlIHVuaXF1ZSBpbmRleCB0aHJlZV9j MSBvbiB0aHJlZShjMSk7CiBjcmVhdGUgdGFibGUgZm91cihjMSBpbnQsIGMyIGludCwgYzMgaW50 LCBjNCBpbnQsIGM1IGludCk7CiBjcmVhdGUgdW5pcXVlIGluZGV4IGZvdXJfYzFjMyBvbiBmb3Vy KGMxLCBjMyk7CitDUkVBVEUgVEFCTEUgIkFQUCIuIklERVBUIiAoIkRJU0NSSU1fREVQVCIgVkFS Q0hBUigzMiksICJOTzEiIElOVEVHRVIgTk9UIE5VTEwsIAorIk5BTUUiIFZBUkNIQVIoNTApLCAi QVVESVRPUl9OTyIgSU5URUdFUiwgIlJFUE9SVFRPX05PIiBJTlRFR0VSLCAiSEFSRFdBUkVBU1NF VCIKKyBWQVJDSEFSKDE1KSwgIlNPRlRXQVJFQVNTRVQiIFZBUkNIQVIoMTUpKTsKKy0tIHByaW1h cnkvdW5pcXVlCitBTFRFUiBUQUJMRSAiQVBQIi4iSURFUFQiIEFERCBDT05TVFJBSU5UICJQS19J REVQVCIgUFJJTUFSWSBLRVkgKCJOTzEiKTsKIAogaW5zZXJ0IGludG8gb25lIHZhbHVlcyAoMSwg MSwgMSwgMSwgMSk7CiBpbnNlcnQgaW50byBvbmUgdmFsdWVzICgyLCAxLCAxLCAxLCAxKTsKQEAg LTUxLDYgKzU2LDEyIEBADQogaW5zZXJ0IGludG8gZm91ciB2YWx1ZXMgKDMsIDEsIDIsIDEsIDEp OwogaW5zZXJ0IGludG8gZm91ciB2YWx1ZXMgKDMsIDEsIDMsIDEsIDEpOwogCitpbnNlcnQgaW50 byBpZGVwdCB2YWx1ZXMgKCdEZXB0JywgMSwgJ0RlcGFydG1lbnQxJywgbnVsbCwgbnVsbCwgbnVs bCwgbnVsbCk7CitpbnNlcnQgaW50byBpZGVwdCB2YWx1ZXMgKCdIYXJkd2FyZURlcHQnLCAyLCAn RGVwYXJ0bWVudDInLCAyNSwgMSwgJ2hhcmR3YXJlYXNldDInLCBudWxsKTsKK2luc2VydCBpbnRv IGlkZXB0IHZhbHVlcyAoJ0hhcmR3YXJlRGVwdCcsIDMsICdEZXBhcnRtZW50MycsIDI1LCAyLCAn aGFyZHdhcmVhc2V0MycsIG51bGwpOworaW5zZXJ0IGludG8gaWRlcHQgdmFsdWVzICgnU29mdHdh cmVEZXB0JywgNCwgJ0RlcGFydG1lbnQ0JywgMjUsIDEsIG51bGwsICdzb2Z0d2FyZWFzc2V0NCcp OworaW5zZXJ0IGludG8gaWRlcHQgdmFsdWVzICgnU29mdHdhcmVEZXB0JywgNSwgJ0RlcGFydG1l bnQ1JywgMzAsIDQsIG51bGwsICdzb2Z0d2FyZWFzc2V0NScpOworCiBjYWxsIFNZU0NTX1VUSUwu U1lTQ1NfU0VUX1JVTlRJTUVTVEFUSVNUSUNTKDEpOwogbWF4aW11bWRpc3BsYXl3aWR0aCAyMDAw MDsKIApAQCAtNjEsNiArNzIsMjQgQEANCiAtLSBGb2xsb3dpbmcgcnVudGltZSBzdGF0aXN0aWNz IG91dHB1dCBzaG91bGQgaGF2ZSBEaXN0aW5jdCBTY2FuIGluIGl0CiB2YWx1ZXMgU1lTQ1NfVVRJ TC5TWVNDU19HRVRfUlVOVElNRVNUQVRJU1RJQ1MoKTsKIAorLS1EZXJieTI1MSBEaXN0aW5jdCBz aG91bGQgbm90IGdldCBlbGltaW5hdGVkIGZvciBmb2xsb3dpbmcgcXVlcnkKKy0tYmVjYXVzZSB0 aGVyZSBpcyBubyBlcXVhbGl0eSBjb25kaXRpb24gb24gdW5pcXVlIGNvbHVtbiBvZiB0YWJsZQor LS1pbiB0aGUgb3V0c2lkZSBxdWVyeQorc2VsZWN0ICBkaXN0aW5jdCAgcTEuIk5PMSIsICBxMS4i TkFNRSIsICBxMS4iQVVESVRPUl9OTyIsICAKK3ExLiJSRVBPUlRUT19OTyIsICBxMS4iRElTQ1JJ TV9ERVBUIiwgIHExLiJTT0ZUV0FSRUFTU0VUIiBmcm9tIAorSURFUFQgcTEsIElERVBUIHEyIHdo ZXJlICAoIHEyLiJESVNDUklNX0RFUFQiID0gJ0hhcmR3YXJlRGVwdCcpIAorIGFuZCAgKCBxMS4i RElTQ1JJTV9ERVBUIiA9ICdTb2Z0d2FyZURlcHQnKSAgYW5kICAoIHExLiJOTzEiIAorPD4gQUxM ICAoIHNlbGVjdCAgcTMuIk5PMSIgZnJvbSBJREVQVCBxMyB3aGVyZSAgKCAoIAorcTMuIkRJU0NS SU1fREVQVCIgPSAnRGVwdCcpICBvciAgKCBxMy4iRElTQ1JJTV9ERVBUIiA9IAorJ0hhcmR3YXJl RGVwdCcpICBvciAgKCBxMy4iRElTQ1JJTV9ERVBUIiA9ICdTb2Z0d2FyZURlcHQnKSApICAKK2Fu ZCAgKCBxMy4iUkVQT1JUVE9fTk8iID0gIHEyLiJOTzEiKSApICkgIDsKKy0tCistLUFub3RoZXIg dGVzdCBjYXNlIG9mIERlcmJ5MjUxIHdoZXJlIHRoZSBleGlzdHMgdGFibGUgY29sdW1uIGlzIGVt YmVkZGVkIGluIGFuIGV4cHJlc3Npb24uCitzZWxlY3QgIGRpc3RpbmN0ICBxMS4iTk8xIiBmcm9t IElERVBUIHExLCBJREVQVCBxMgord2hlcmUgICggcTIuIkRJU0NSSU1fREVQVCIgPSAnSGFyZHdh cmVEZXB0JykKK2FuZCAgKCBxMS4iRElTQ1JJTV9ERVBUIiA9ICdTb2Z0d2FyZURlcHQnKSAgYW5k ICAoIHExLiJOTzEiIDw+IEFMTAorKHNlbGVjdCAgcTMuIk5PMSIgZnJvbSBJREVQVCBxMyB3aGVy ZSAgKCBBQlMocTMuIlJFUE9SVFRPX05PIikgPSAgcTIuIk5PMSIpKSk7CisKIC0tIHJlc3VsdCBv cmRlcmluZyBpcyBub3QgZ3VhcmFudGVlZCwgYnV0IG9yZGVyIGJ5IGNsYXVzZSB3aWxsIGNoYW5n ZSBob3cKIC0tIGRpc3RpbmN0IGlzIGV4ZWN1dGVkLiAgU28gdGVzdCBieSByZXRyaWV2aW5nIGRh dGEgaW50byBhIHRlbXAgdGFibGUgYW5kCiAtLSByZXR1cm4gcmVzdWx0cyBvcmRlcmVkIGFmdGVy IG1ha2luZyBzdXJlIHRoZSBxdWVyeSB3YXMgZXhlY3V0ZWQgYXMgZXhwZWN0ZWQuCkBAIC0xNzAs MyArMTk5LDQgQEANCiBkcm9wIHRhYmxlIHR3bzsKIGRyb3AgdGFibGUgdGhyZWU7CiBkcm9wIHRh YmxlIGZvdXI7Citkcm9wIHRhYmxlIGlkZXB0OwpJbmRleDogamF2YS90ZXN0aW5nL29yZy9hcGFj aGUvZGVyYnlUZXN0aW5nL2Z1bmN0aW9uVGVzdHMvbWFzdGVyL2Rpc3RpbmN0RWxpbWluYXRpb24u b3V0DQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09DQotLS0gamF2YS90ZXN0aW5nL29yZy9hcGFjaGUvZGVyYnlUZXN0aW5n L2Z1bmN0aW9uVGVzdHMvbWFzdGVyL2Rpc3RpbmN0RWxpbWluYXRpb24ub3V0CShyZXZpc2lvbiAx Njk2NDIpDQorKysgamF2YS90ZXN0aW5nL29yZy9hcGFjaGUvZGVyYnlUZXN0aW5nL2Z1bmN0aW9u VGVzdHMvbWFzdGVyL2Rpc3RpbmN0RWxpbWluYXRpb24ub3V0CSh3b3JraW5nIGNvcHkpDQpAQCAt MTksNiArMTksMTMgQEANCiAwIHJvd3MgaW5zZXJ0ZWQvdXBkYXRlZC9kZWxldGVkCiBpaj4gY3Jl YXRlIHVuaXF1ZSBpbmRleCBmb3VyX2MxYzMgb24gZm91cihjMSwgYzMpOwogMCByb3dzIGluc2Vy dGVkL3VwZGF0ZWQvZGVsZXRlZAoraWo+IENSRUFURSBUQUJMRSAiQVBQIi4iSURFUFQiICgiRElT Q1JJTV9ERVBUIiBWQVJDSEFSKDMyKSwgIk5PMSIgSU5URUdFUiBOT1QgTlVMTCwgCisiTkFNRSIg VkFSQ0hBUig1MCksICJBVURJVE9SX05PIiBJTlRFR0VSLCAiUkVQT1JUVE9fTk8iIElOVEVHRVIs ICJIQVJEV0FSRUFTU0VUIgorIFZBUkNIQVIoMTUpLCAiU09GVFdBUkVBU1NFVCIgVkFSQ0hBUigx NSkpOworMCByb3dzIGluc2VydGVkL3VwZGF0ZWQvZGVsZXRlZAoraWo+IC0tIHByaW1hcnkvdW5p cXVlCitBTFRFUiBUQUJMRSAiQVBQIi4iSURFUFQiIEFERCBDT05TVFJBSU5UICJQS19JREVQVCIg UFJJTUFSWSBLRVkgKCJOTzEiKTsKKzAgcm93cyBpbnNlcnRlZC91cGRhdGVkL2RlbGV0ZWQKIGlq PiBpbnNlcnQgaW50byBvbmUgdmFsdWVzICgxLCAxLCAxLCAxLCAxKTsKIDEgcm93IGluc2VydGVk L3VwZGF0ZWQvZGVsZXRlZAogaWo+IGluc2VydCBpbnRvIG9uZSB2YWx1ZXMgKDIsIDEsIDEsIDEs IDEpOwpAQCAtODcsNiArOTQsMTYgQEANCiAxIHJvdyBpbnNlcnRlZC91cGRhdGVkL2RlbGV0ZWQK IGlqPiBpbnNlcnQgaW50byBmb3VyIHZhbHVlcyAoMywgMSwgMywgMSwgMSk7CiAxIHJvdyBpbnNl cnRlZC91cGRhdGVkL2RlbGV0ZWQKK2lqPiBpbnNlcnQgaW50byBpZGVwdCB2YWx1ZXMgKCdEZXB0 JywgMSwgJ0RlcGFydG1lbnQxJywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisxIHJvdyBpbnNl cnRlZC91cGRhdGVkL2RlbGV0ZWQKK2lqPiBpbnNlcnQgaW50byBpZGVwdCB2YWx1ZXMgKCdIYXJk d2FyZURlcHQnLCAyLCAnRGVwYXJ0bWVudDInLCAyNSwgMSwgJ2hhcmR3YXJlYXNldDInLCBudWxs KTsKKzEgcm93IGluc2VydGVkL3VwZGF0ZWQvZGVsZXRlZAoraWo+IGluc2VydCBpbnRvIGlkZXB0 IHZhbHVlcyAoJ0hhcmR3YXJlRGVwdCcsIDMsICdEZXBhcnRtZW50MycsIDI1LCAyLCAnaGFyZHdh cmVhc2V0MycsIG51bGwpOworMSByb3cgaW5zZXJ0ZWQvdXBkYXRlZC9kZWxldGVkCitpaj4gaW5z ZXJ0IGludG8gaWRlcHQgdmFsdWVzICgnU29mdHdhcmVEZXB0JywgNCwgJ0RlcGFydG1lbnQ0Jywg MjUsIDEsIG51bGwsICdzb2Z0d2FyZWFzc2V0NCcpOworMSByb3cgaW5zZXJ0ZWQvdXBkYXRlZC9k ZWxldGVkCitpaj4gaW5zZXJ0IGludG8gaWRlcHQgdmFsdWVzICgnU29mdHdhcmVEZXB0JywgNSwg J0RlcGFydG1lbnQ1JywgMzAsIDQsIG51bGwsICdzb2Z0d2FyZWFzc2V0NScpOworMSByb3cgaW5z ZXJ0ZWQvdXBkYXRlZC9kZWxldGVkCiBpaj4gY2FsbCBTWVNDU19VVElMLlNZU0NTX1NFVF9SVU5U SU1FU1RBVElTVElDUygxKTsKIDAgcm93cyBpbnNlcnRlZC91cGRhdGVkL2RlbGV0ZWQKIGlqPiBt YXhpbXVtZGlzcGxheXdpZHRoIDIwMDAwOwpAQCAtMTQzLDYgKzE2MCwzMSBAQA0KIE5vbmUKIAlu ZXh0IHF1YWxpZmllcnM6CiBOb25lCitpaj4gLS1EZXJieTI1MSBEaXN0aW5jdCBzaG91bGQgbm90 IGdldCBlbGltaW5hdGVkIGZvciBmb2xsb3dpbmcgcXVlcnkKKy0tYmVjYXVzZSB0aGVyZSBpcyBu byBlcXVhbGl0eSBjb25kaXRpb24gb24gdW5pcXVlIGNvbHVtbiBvZiB0YWJsZQorLS1pbiB0aGUg b3V0c2lkZSBxdWVyeQorc2VsZWN0ICBkaXN0aW5jdCAgcTEuIk5PMSIsICBxMS4iTkFNRSIsICBx MS4iQVVESVRPUl9OTyIsICAKK3ExLiJSRVBPUlRUT19OTyIsICBxMS4iRElTQ1JJTV9ERVBUIiwg IHExLiJTT0ZUV0FSRUFTU0VUIiBmcm9tIAorSURFUFQgcTEsIElERVBUIHEyIHdoZXJlICAoIHEy LiJESVNDUklNX0RFUFQiID0gJ0hhcmR3YXJlRGVwdCcpIAorIGFuZCAgKCBxMS4iRElTQ1JJTV9E RVBUIiA9ICdTb2Z0d2FyZURlcHQnKSAgYW5kICAoIHExLiJOTzEiIAorPD4gQUxMICAoIHNlbGVj dCAgcTMuIk5PMSIgZnJvbSBJREVQVCBxMyB3aGVyZSAgKCAoIAorcTMuIkRJU0NSSU1fREVQVCIg PSAnRGVwdCcpICBvciAgKCBxMy4iRElTQ1JJTV9ERVBUIiA9IAorJ0hhcmR3YXJlRGVwdCcpICBv ciAgKCBxMy4iRElTQ1JJTV9ERVBUIiA9ICdTb2Z0d2FyZURlcHQnKSApICAKK2FuZCAgKCBxMy4i UkVQT1JUVE9fTk8iID0gIHEyLiJOTzEiKSApICkgIDsKK05PMSAgICAgICAgfE5BTUUgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfEFVRElUT1JfTk8gfFJFUE9S VFRPX05PfERJU0NSSU1fREVQVCAgICAgICAgICAgICAgICAgICAgfFNPRlRXQVJFQVNTRVQgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCis0ICAgICAgICAgIHxEZXBhcnRtZW50NCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwyNSAgICAgICAgIHwxICAgICAgICAgIHxTb2Z0 d2FyZURlcHQgICAgICAgICAgICAgICAgICAgIHxzb2Z0d2FyZWFzc2V0NCAKKzUgICAgICAgICAg fERlcGFydG1lbnQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfDMwICAg ICAgICAgfDQgICAgICAgICAgfFNvZnR3YXJlRGVwdCAgICAgICAgICAgICAgICAgICAgfHNvZnR3 YXJlYXNzZXQ1IAoraWo+IC0tCistLUFub3RoZXIgdGVzdCBjYXNlIG9mIERlcmJ5MjUxIHdoZXJl IHRoZSBleGlzdHMgdGFibGUgY29sdW1uIGlzIGVtYmVkZGVkIGluIGFuIGV4cHJlc3Npb24uCitz ZWxlY3QgIGRpc3RpbmN0ICBxMS4iTk8xIiBmcm9tIElERVBUIHExLCBJREVQVCBxMgord2hlcmUg ICggcTIuIkRJU0NSSU1fREVQVCIgPSAnSGFyZHdhcmVEZXB0JykKK2FuZCAgKCBxMS4iRElTQ1JJ TV9ERVBUIiA9ICdTb2Z0d2FyZURlcHQnKSAgYW5kICAoIHExLiJOTzEiIDw+IEFMTAorKHNlbGVj dCAgcTMuIk5PMSIgZnJvbSBJREVQVCBxMyB3aGVyZSAgKCBBQlMocTMuIlJFUE9SVFRPX05PIikg PSAgcTIuIk5PMSIpKSk7CitOTzEgICAgICAgIAorLS0tLS0tLS0tLS0KKzQgICAgICAgICAgCis1 ICAgICAgICAgIAogaWo+IC0tIHJlc3VsdCBvcmRlcmluZyBpcyBub3QgZ3VhcmFudGVlZCwgYnV0 IG9yZGVyIGJ5IGNsYXVzZSB3aWxsIGNoYW5nZSBob3cKIC0tIGRpc3RpbmN0IGlzIGV4ZWN1dGVk LiAgU28gdGVzdCBieSByZXRyaWV2aW5nIGRhdGEgaW50byBhIHRlbXAgdGFibGUgYW5kCiAtLSBy ZXR1cm4gcmVzdWx0cyBvcmRlcmVkIGFmdGVyIG1ha2luZyBzdXJlIHRoZSBxdWVyeSB3YXMgZXhl Y3V0ZWQgYXMgZXhwZWN0ZWQuCkBAIC0yMzE5LDQgKzIzNjEsNiBAQA0KIDAgcm93cyBpbnNlcnRl ZC91cGRhdGVkL2RlbGV0ZWQKIGlqPiBkcm9wIHRhYmxlIGZvdXI7CiAwIHJvd3MgaW5zZXJ0ZWQv dXBkYXRlZC9kZWxldGVkCitpaj4gZHJvcCB0YWJsZSBpZGVwdDsKKzAgcm93cyBpbnNlcnRlZC91 cGRhdGVkL2RlbGV0ZWQKIGlqPiAK ------=_Part_972_7766598.1115841666656--