From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id D85B24493B for ; Fri, 2 Dec 2022 18:46:29 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5708968B30F; Fri, 2 Dec 2022 20:46:26 +0200 (EET) Received: from mail.frobbit.se (mail.frobbit.se [85.30.129.176]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6AF5668AF9F for ; Fri, 2 Dec 2022 20:46:20 +0200 (EET) Received: from debian.lan (unknown [IPv6:2a00:66c0:a::72c]) by mail.frobbit.se (Postfix) with ESMTPSA id BD8442037B for ; Fri, 2 Dec 2022 19:46:19 +0100 (CET) Message-ID: <6e60f8996f0d4d47cd988b99d7fe6b12d6e92846.camel@haerdin.se> From: Tomas =?ISO-8859-1?Q?H=E4rdin?= To: FFmpeg development discussions and patches Date: Fri, 02 Dec 2022 19:46:19 +0100 In-Reply-To: <20221202181130.87107-1-etemesicaleb@gmail.com> References: <20221202181130.87107-1-etemesicaleb@gmail.com> User-Agent: Evolution 3.38.3-1 MIME-Version: 1.0 Subject: Re: [FFmpeg-devel] [PATCH 2/2] avcodec/jpeg2000dec: Add support for HTJ2K decoding. X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: ZnJlIDIwMjItMTItMDIga2xvY2thbiAyMToxMSArMDMwMCBza3JldiBldGVtZXNpY2FsZWJAZ21h aWwuY29tOgo+IAo+ICsvKioKPiArICrCoCBHaXZlbiBhIHByZWNvbXB1dGVkIGMsIGNoZWNrcyB3 aGV0aGVyIG4gJSBkID09IDAKPiArICovCj4gK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQz Ml90IGlzX2RpdmlzaWJsZSh1aW50MzJfdCBuLCB1aW50NjRfdAo+IGMpCj4gK3sKPiArwqDCoMKg IHJldHVybiBuICogYyA8PSBjIC0gMTsKPiArfQoKVGhpcyBsb29rcyBsaWtlIHNvbWV0aGluZyB0 aGF0IGNvdWxkIGdvIGluIGxhdnUsIHNheSBpbnRtYXRoLmgKCj4gKwo+ICsvKioKPiArICogQGJy aWVmIFJlZmlsbCB0aGUgYnVmZmVyIGJhY2t3YXJkcyBpbiBsaXR0bGUgRW5kaWFuIHdoaWxlCj4g c2tpcHBpbmcKPiArICogb3ZlciBzdHVmZmluZyBiaXRzCj4gKyAqCj4gKyAqIFN0dWZmaW5nIGJp dHMgYXJlIHRob3NlIHRoYXQgYXBwZWFyIGluIHRoZSBwb3NpdGlvbiBvZiBhbnkgYnl0ZQo+IHdo b3NlCj4gKyAqIExTQnMgYXJlIGFsbCAxJ3MgaWYgdGhlIGxhc3QgY29uc3VtZWQgYnl0ZSB3YXMg bGFyZ2VyIHRoYW4gMHg4Rgo+ICsgKi8KPiArc3RhdGljIGludCBqcGVnMjAwMF9iaXRidWZfcmVm aWxsX2JhY2t3YXJkcyhTdGF0ZVZhcnMgKmJ1ZmZlciwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgY29uc3QgdWludDhfdCAqYXJyYXkpCgpEb24ndCB3ZSBhbHJlYWR5IGhhdmUgc3Vm ZmljaWVudCBiaXRyZWFkaW5nIGNhcGFiaWxpdGllcyBhbHJlYWR5PyBNYXliZQppdCBkb2Vzbid0 IGRvIHRoZSBuZWNlc3NhcnkgdW5zdHVmZmluZy4uCgoKPiArwqDCoMKgIC8qCj4gK8KgwqDCoMKg ICogQXMgYW4gb3B0aW1pemF0aW9uLCB3ZSBjYW4gcmVwbGFjZSBtb2R1bG8gb3BlcmF0aW9ucyB3 aXRoCj4gK8KgwqDCoMKgICogY2hlY2tpbmcgaWYgYSBudW1iZXIgaXMgZGl2aXNpYmxlICwgc2lu Y2UgdGhhdCdzIHRoZSBvbmx5Cj4gdGhpbmcgd2UgbmVlZC4KPiArwqDCoMKgwqAgKiB0aGlzIGlz IHBhaXJlZCB3aXRoIGlzX2RpdmlzaWJsZS4KPiArwqDCoMKgwqAgKiBDcmVkaXRzIHRvIERhbmll bCBMZW1pcmUgYmxvZyBwb3N0Ogo+ICvCoMKgwqDCoCAqICAgCj4gaHR0cHM6Ly9sZW1pcmUubWUv YmxvZy8yMDE5LzAyLzA4L2Zhc3Rlci1yZW1haW5kZXJzLXdoZW4tdGhlLWRpdmlzb3ItaXMtYS1j b25zdGFudC1iZWF0aW5nLWNvbXBpbGVycy1hbmQtbGliZGl2aWRlLwo+ICvCoMKgwqDCoCAqIEl0 J3MgVUIgb24gemVybywgYnV0IHdlIGNhbid0IGhhdmUgYSBxdWFkIGJlaW5nIHplcm8sIHRoZQo+ IHNwZWMgZG9lc24ndCBhbGxvdywKPiArwqDCoMKgwqAgKiBzbyB3ZSBlcnJvciBvdXQgZWFybHkg aW4gY2FzZSB0aGF0J3MgdGhlIGNhc2UuCj4gK8KgwqDCoMKgICovCj4gKwo+ICvCoMKgwqAgYyA9 IDEgKyBVSU5UNjRfQygweGZmZmZmZmZmZmZmZmZmZmYpIC8gcXVhZF93aWR0aDsKCkp1c3QgMHhm ZmZmZmZmZmZmZmZmZmZmVUxMIHdvdWxkIHdvcmsKCj4gKwo+ICvCoMKgwqAgZm9yIChpbnQgcm93 ID0gMTsgcm93IDwgcXVhZF9oZWlnaHQ7IHJvdysrKSB7Cj4gK8KgwqDCoMKgwqDCoMKgIHdoaWxl ICgocSAtIChyb3cgKiBxdWFkX3dpZHRoKSkgPCBxdWFkX3dpZHRoIC0gMSAmJiBxIDwKPiAocXVh ZF9oZWlnaHQgKiBxdWFkX3dpZHRoKSkgewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHExID0g cTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBxMiA9IHEgKyAxOwo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGNvbnRleHQxID0gc2lnbWFfbls0ICogKHExIC0gcXVhZF93aWR0aCkgKyAxXTsK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250ZXh0MSArPSBzaWdtYV9uWzQgKiAocTEgLSBx dWFkX3dpZHRoKSArIDNdIDw8IDI7IC8vCj4gbmUKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqAgaWYgKCFpc19kaXZpc2libGUocTEsIGMpKSB7CgpUaGVzZSBkaXZpc2liaWxpdHkgY2hlY2tz IGxvb2sgbGlrZSB0aGV5IGNvdWxkIGJlIGV2ZW4gc2ltcGxlciBnaXZlbgp0aGF0IHEgYWx3YXlz IGluY3JlYXNlcyBieSAyCgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29udGV4 dDEgfD0gc2lnbWFfbls0ICogKHExIC0gcXVhZF93aWR0aCkgLQo+IDFdO8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgLy8gbncKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNv bnRleHQxICs9IChzaWdtYV9uWzQgKiBxMSAtIDFdIHwgc2lnbWFfbls0ICogcTEgLQo+IDJdKSA8 PCAxOyAvLyBzd3wgcQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBpZiAoIWlzX2RpdmlzaWJsZShxMSArIDEsIGMpKQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgY29udGV4dDEgfD0gc2lnbWFfbls0ICogKHExIC0gcXVhZF93aWR0 aCkgKyA1XSA8PCAyOwo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoKHJldCA9IGpw ZWcyMDAwX2RlY29kZV9zaWdfZW1iKHMsIG1lbF9zdGF0ZSwKPiBtZWxfc3RyZWFtLCB2bGNfc3Ry ZWFtLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBkZWNfQ3h0VkxDX3Rh YmxlMSwKPiBEY3VwLCBzaWdfcGF0LCByZXNfb2ZmLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBlbWJfcGF0X2ssIGVtYl9wYXRfMSwKPiBKMktfUTEsIGNvbnRleHQxLCBM Y3VwLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBQY3VwKSkKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDwgMCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGdvdG8gZnJlZTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yIChp bnQgaSA9IDA7IGkgPCA0OyBpKyspCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBz aWdtYV9uWzQgKiBxMSArIGldID0gKHNpZ19wYXRbSjJLX1ExXSA+PiBpKSAmIDE7Cj4gKwo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnRleHQyID0gc2lnbWFfbls0ICogKHEyIC0gcXVhZF93 aWR0aCkgKyAxXTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250ZXh0MiArPSBzaWdtYV9u WzQgKiAocTIgLSBxdWFkX3dpZHRoKSArIDNdIDw8IDI7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGlmICghaXNfZGl2aXNpYmxlKHEyLCBjKSkgewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgY29udGV4dDIgfD0gc2lnbWFfbls0ICogKHEyIC0gcXVhZF93aWR0aCkgLSAx XTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnRleHQyICs9IChzaWdtYV9u WzQgKiBxMiAtIDFdIHwgc2lnbWFfbls0ICogcTIgLQo+IDJdKSA8PCAxOwo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIH0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoIWlzX2RpdmlzaWJs ZShxMiArIDEsIGMpKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29udGV4dDIg fD0gc2lnbWFfbls0ICogKHEyIC0gcXVhZF93aWR0aCkgKyA1XSA8PCAyOwo+ICsKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBpZiAoKHJldCA9IGpwZWcyMDAwX2RlY29kZV9zaWdfZW1iKHMsIG1l bF9zdGF0ZSwKPiBtZWxfc3RyZWFtLCB2bGNfc3RyZWFtLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBkZWNfQ3h0VkxDX3RhYmxlMSwKPiBEY3VwLCBzaWdfcGF0LCByZXNf b2ZmLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlbWJfcGF0X2ssIGVt Yl9wYXRfMSwKPiBKMktfUTIsIGNvbnRleHQyLCBMY3VwLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBQY3VwKSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IDwgMCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZnJlZTsKPiArCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaWdtYV9uWzQgKiBxMiArIGldID0gKHNpZ19w YXRbSjJLX1EyXSA+PiBpKSAmIDE7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVbSjJL X1ExXSA9IDA7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdVtKMktfUTJdID0gMDsKPiArCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAganBlZzIwMDBfYml0YnVmX3JlZmlsbF9iYWNrd2FyZHMo dmxjX3N0cmVhbSwgdmxjX2J1Zik7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChy ZXNfb2ZmW0oyS19RMV0gPT0gMSAmJiByZXNfb2ZmW0oyS19RMl0gPT0gMSkgewo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdV9wZnhbSjJLX1ExXSA9IHZsY19kZWNvZGVfdV9wcmVm aXgodmxjX3N0cmVhbSwKPiB2bGNfYnVmKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHVfcGZ4W0oyS19RMl0gPSB2bGNfZGVjb2RlX3VfcHJlZml4KHZsY19zdHJlYW0sCj4gdmxj X2J1Zik7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdV9zZnhbSjJLX1Ex XSA9IHZsY19kZWNvZGVfdV9zdWZmaXgodmxjX3N0cmVhbSwKPiB1X3BmeFtKMktfUTFdLCB2bGNf YnVmKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVfc2Z4W0oyS19RMl0gPSB2 bGNfZGVjb2RlX3Vfc3VmZml4KHZsY19zdHJlYW0sCj4gdV9wZnhbSjJLX1EyXSwgdmxjX2J1Zik7 Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdV9leHRbSjJLX1ExXSA9IHZs Y19kZWNvZGVfdV9leHRlbnNpb24odmxjX3N0cmVhbSwKPiB1X3NmeFtKMktfUTFdLCB2bGNfYnVm KTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVfZXh0W0oyS19RMl0gPSB2bGNf ZGVjb2RlX3VfZXh0ZW5zaW9uKHZsY19zdHJlYW0sCj4gdV9zZnhbSjJLX1EyXSwgdmxjX2J1Zik7 Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdVtKMktfUTFdID0gdV9wZnhb SjJLX1ExXSArIHVfc2Z4W0oyS19RMV0gKwo+ICh1X2V4dFtKMktfUTFdIDw8IDIpOwo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdVtKMktfUTJdID0gdV9wZnhbSjJLX1EyXSArIHVf c2Z4W0oyS19RMl0gKwo+ICh1X2V4dFtKMktfUTJdIDw8IDIpOwo+ICsKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCB9IGVsc2UgaWYgKHJlc19vZmZbSjJLX1ExXSA9PSAxIHx8IHJlc19vZmZbSjJL X1EyXSA9PSAxKQo+IHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVpbnQ4X3Qg cG9zID0gcmVzX29mZltKMktfUTFdID09IDEgPyAwIDogMTsKPiArCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB1X3BmeFtwb3NdID0gdmxjX2RlY29kZV91X3ByZWZpeCh2bGNfc3Ry ZWFtLAo+IHZsY19idWYpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdV9zZnhb cG9zXSA9IHZsY19kZWNvZGVfdV9zdWZmaXgodmxjX3N0cmVhbSwKPiB1X3BmeFtwb3NdLCB2bGNf YnVmKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVfZXh0W3Bvc10gPSB2bGNf ZGVjb2RlX3VfZXh0ZW5zaW9uKHZsY19zdHJlYW0sCj4gdV9zZnhbcG9zXSwgdmxjX2J1Zik7Cj4g Kwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdVtwb3NdID0gdV9wZnhbcG9zXSAr IHVfc2Z4W3Bvc10gKyAodV9leHRbcG9zXSA8PAo+IDIpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIH0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzcCA9IHNpZ19wYXRbSjJLX1ExXTsKPiAr Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ2FtbWFbSjJLX1ExXSA9IDE7Cj4gKwo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGlmIChzcCA9PSAwIHx8IHNwID09IDEgfHwgc3AgPT0gMiB8fCBz cCA9PSA0IHx8IHNwID09IDgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnYW1t YVtKMktfUTFdID0gMDsKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3AgPSBzaWdfcGF0 W0oyS19RMl07Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdhbW1hW0oyS19RMl0gPSAx Owo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoc3AgPT0gMCB8fCBzcCA9PSAxIHx8 IHNwID09IDIgfHwgc3AgPT0gNCB8fCBzcCA9PSA4KQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgZ2FtbWFbSjJLX1EyXSA9IDA7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IEVfbltKMktfUTFdID0gRVs0ICogKHExIC0gcXVhZF93aWR0aCkgKyAxXTsKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBFX25bSjJLX1EyXSA9IEVbNCAqIChxMiAtIHF1YWRfd2lkdGgpICsgMV07 Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEVfbmVbSjJLX1ExXSA9IEVbNCAqIChxMSAt IHF1YWRfd2lkdGgpICsgM107Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRV9uZVtKMktfUTJd ID0gRVs0ICogKHEyIC0gcXVhZF93aWR0aCkgKyAzXTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgRV9ud1tKMktfUTFdID0gKCFpc19kaXZpc2libGUocTEsIGMpKSAqIEVbRkZNQVgoKDQg KiAocTEKPiAtIHF1YWRfd2lkdGgpIC0gMSksIDApXTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBFX253W0oyS19RMl0gPSAoIWlzX2RpdmlzaWJsZShxMiwgYykpICogRVtGRk1BWCgoNCAqIChx Mgo+IC0gcXVhZF93aWR0aCkgLSAxKSwgMCldOwo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBFX25mW0oyS19RMV0gPSAoIWlzX2RpdmlzaWJsZShxMSArIDEsIGMpKSAqIEVbNCAqIChxMSAt Cj4gcXVhZF93aWR0aCkgKyA1XTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBFX25mW0oyS19R Ml0gPSAoIWlzX2RpdmlzaWJsZShxMiArIDEsIGMpKSAqIEVbNCAqIChxMiAtCj4gcXVhZF93aWR0 aCkgKyA1XTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbWF4X2VbSjJLX1ExXSA9IEZG TUFYKEVfbndbSjJLX1ExXSwgRkZNQVgzKEVfbltKMktfUTFdLAo+IEVfbmVbSjJLX1ExXSwgRV9u ZltKMktfUTFdKSk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbWF4X2VbSjJLX1EyXSA9IEZG TUFYKEVfbndbSjJLX1EyXSwgRkZNQVgzKEVfbltKMktfUTJdLAo+IEVfbmVbSjJLX1EyXSwgRV9u ZltKMktfUTJdKSk7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGthcHBhW0oyS19RMV0g PSBGRk1BWCgxLCBnYW1tYVtKMktfUTFdICogKG1heF9lW0oyS19RMV0KPiAtIDEpKTsKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBrYXBwYVtKMktfUTJdID0gRkZNQVgoMSwgZ2FtbWFbSjJLX1Ey XSAqIChtYXhfZVtKMktfUTJdCj4gLSAxKSk7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IFVbSjJLX1ExXSA9IGthcHBhW0oyS19RMV0gKyB1W0oyS19RMV07Cj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgVVtKMktfUTJdID0ga2FwcGFbSjJLX1EyXSArIHVbSjJLX1EyXTsKPiArCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG1bSjJLX1ExXVtpXSA9IHNpZ21hX25bNCAqIHEx ICsgaV0gKiBVW0oyS19RMV0gLQo+ICgoZW1iX3BhdF9rW0oyS19RMV0gPj4gaSkgJiAxKTsKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG1bSjJLX1EyXVtpXSA9IHNpZ21hX25bNCAq IHEyICsgaV0gKiBVW0oyS19RMl0gLQo+ICgoZW1iX3BhdF9rW0oyS19RMl0gPj4gaSkgJiAxKTsK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmVj b3Zlcl9tYWdfc2duKG1hZ19zZ25fc3RyZWFtLCBKMktfUTEsIHExLCBtX24sCj4ga25vd25fMSwg ZW1iX3BhdF8xLCB2LCBtLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgRSwgbXVfbiwgRGN1cCwgUGN1cCwgcExTQik7Cj4gKwo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHJlY292ZXJfbWFnX3NnbihtYWdfc2duX3N0cmVhbSwgSjJLX1Ey LCBxMiwgbV9uLAo+IGtub3duXzEsIGVtYl9wYXRfMSwgdiwgbSwKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEUsIG11X24sIERjdXAsIFBj dXAsIHBMU0IpOwo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBtb3ZlIHRvIHRoZSBu ZXh0IHF1YWQgcGFpciAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHEgKz0gMjsKPiArwqDC oMKgwqDCoMKgwqAgfQo+ICvCoMKgwqDCoMKgwqDCoCBpZiAocXVhZF93aWR0aCAlIDIgPT0gMSkg ewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHExID0gcTsKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAvKiBjYWxjdWxhdGUgY29udGV4dCBmb3IgY3VycmVudCBxdWFkICovCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAgY29udGV4dDEgPSBzaWdtYV9uWzQgKiAocTEgLSBxdWFkX3dpZHRoKSAr IDFdOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnRleHQxICs9IChzaWdtYV9uWzQgKiAo cTEgLSBxdWFkX3dpZHRoKSArIDNdIDw8IDIpOwo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBpZiAoIWlzX2RpdmlzaWJsZShxMSwgYykpIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGNvbnRleHQxIHw9IHNpZ21hX25bNCAqIChxMSAtIHF1YWRfd2lkdGgpIC0gMV07Cj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250ZXh0MSArPSAoc2lnbWFfbls0ICog cTEgLSAxXSB8IHNpZ21hX25bNCAqIHExIC0KPiAyXSkgPDwgMTsKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB9Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKCFpc19kaXZpc2libGUocTEg KyAxLCBjKSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnRleHQxIHw9IHNp Z21hX25bNCAqIChxMSAtIHF1YWRfd2lkdGgpICsgNV0gPDwgMjsKPiArCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgaWYgKChyZXQgPSBqcGVnMjAwMF9kZWNvZGVfc2lnX2VtYihzLCBtZWxfc3Rh dGUsCj4gbWVsX3N0cmVhbSwgdmxjX3N0cmVhbSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgZGVjX0N4dFZMQ190YWJsZTEsCj4gRGN1cCwgc2lnX3BhdCwgcmVzX29mZiwK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZW1iX3BhdF9rLCBlbWJfcGF0 XzEsCj4gSjJLX1ExLCBjb250ZXh0MSwgTGN1cCwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgUGN1cCkpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA8IDAp Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIGZyZWU7Cj4gKwo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2lnbWFfbls0ICogcTEgKyBpXSA9IChzaWdfcGF0W0oy S19RMV0gPj4gaSkgJiAxOwo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1W0oyS19RMV0g PSAwOwo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBSZWNvdmVyIG1hZ19zZ24gdmFs dWUgKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAocmVzX29mZltKMktfUTFdID09IDEp IHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVfcGZ4W0oyS19RMV0gPSB2bGNf ZGVjb2RlX3VfcHJlZml4KHZsY19zdHJlYW0sCj4gdmxjX2J1Zik7Cj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB1X3NmeFtKMktfUTFdID0gdmxjX2RlY29kZV91X3N1ZmZpeCh2bGNf c3RyZWFtLAo+IHVfcGZ4W0oyS19RMV0sIHZsY19idWYpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgdV9leHRbSjJLX1ExXSA9IHZsY19kZWNvZGVfdV9leHRlbnNpb24odmxjX3N0 cmVhbSwKPiB1X3NmeFtKMktfUTFdLCB2bGNfYnVmKTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB1W0oyS19RMV0gPSB1X3BmeFtKMktfUTFdICsgdV9zZnhbSjJLX1ExXSAr Cj4gKHVfZXh0W0oyS19RMV0gPDwgMik7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+ICsK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzcCA9IHNpZ19wYXRbSjJLX1ExXTsKPiArCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqAgZ2FtbWFbSjJLX1ExXSA9IDE7Cj4gKwo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGlmIChzcCA9PSAwIHx8IHNwID09IDEgfHwgc3AgPT0gMiB8fCBzcCA9PSA0 IHx8IHNwID09IDgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnYW1tYVtKMktf UTFdID0gMDsKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRV9uW0oyS19RMV0gPSBFWzQg KiAocTEgLSBxdWFkX3dpZHRoKSArIDFdOwo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBF X25lW0oyS19RMV0gPSBFWzQgKiAocTEgLSBxdWFkX3dpZHRoKSArIDNdOwo+ICsKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBFX253W0oyS19RMV0gPSAoIWlzX2RpdmlzaWJsZShxMSwgYykpICog RVtGRk1BWCgoNCAqIChxMQo+IC0gcXVhZF93aWR0aCkgLSAxKSwgMCldOwo+ICsKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBFX25mW0oyS19RMV0gPSAoIWlzX2RpdmlzaWJsZShxMSArIDEsIGMp KSAqIEVbNCAqIChxMSAtCj4gcXVhZF93aWR0aCkgKyA1XTsKPiArCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgbWF4X2VbSjJLX1ExXSA9IEZGTUFYKEVfbndbSjJLX1ExXSwgRkZNQVgzKEVfbltK MktfUTFdLAo+IEVfbmVbSjJLX1ExXSwgRV9uZltKMktfUTFdKSk7Cj4gKwo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGthcHBhW0oyS19RMV0gPSBGRk1BWCgxLCBnYW1tYVtKMktfUTFdICogKG1h eF9lW0oyS19RMV0KPiAtIDEpKTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgVVtKMktf UTFdID0ga2FwcGFbSjJLX1ExXSArIHVbSjJLX1ExXTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBtW0oyS19RMV1baV0gPSBzaWdtYV9uWzQgKiBxMSArIGldICogVVtKMktfUTFd IC0KPiAoKGVtYl9wYXRfa1tKMktfUTFdID4+IGkpICYgMSk7Cj4gKwo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHJlY292ZXJfbWFnX3NnbihtYWdfc2duX3N0cmVhbSwgSjJLX1ExLCBxMSwgbV9u LAo+IGtub3duXzEsIGVtYl9wYXRfMSwgdiwgbSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEUsIG11X24sIERjdXAsIFBjdXAsIHBMU0Ip Owo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHEgKz0gMTsKPiArwqDCoMKgwqDCoMKgwqAgfQo+ ICvCoMKgwqAgfQo+ICvCoMKgwqAgLy8gY29udmVydCB0byByYXN0ZXItc2NhbgoKQ291bGQgdGhp cyBiZSBkb25lIGFsbCBpbiBvbmUgZ28gaW4gdGhlIGxvb3AgYWJvdmU/IFdyaXRpbmcgdG8gbXUg dGhlbgpyZWFkaW5nIGZyb20gaXQgbGF0ZXIgaXMgbm90IHZlcnkgY2FjaGUgZnJpZW5kbHkuCgpO byBmdXJ0aGVyIGNvbW1lbnRzIGZvciBub3cuIE1pZ2h0IHJlLXJlYWQgaXQgbGF0ZXIuCgovVG9t YXMKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmZmbXBl Zy1kZXZlbCBtYWlsaW5nIGxpc3QKZmZtcGVnLWRldmVsQGZmbXBlZy5vcmcKaHR0cHM6Ly9mZm1w ZWcub3JnL21haWxtYW4vbGlzdGluZm8vZmZtcGVnLWRldmVsCgpUbyB1bnN1YnNjcmliZSwgdmlz aXQgbGluayBhYm92ZSwgb3IgZW1haWwKZmZtcGVnLWRldmVsLXJlcXVlc3RAZmZtcGVnLm9yZyB3 aXRoIHN1YmplY3QgInVuc3Vic2NyaWJlIi4K