From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.bootlin.com (mail.bootlin.com [62.4.15.54]) by gabe.freedesktop.org (Postfix) with ESMTP id 5954F6F243 for ; Thu, 10 Jan 2019 10:07:56 +0000 (UTC) Message-ID: From: Paul Kocialkowski Date: Thu, 10 Jan 2019 11:07:44 +0100 In-Reply-To: <20190108152001.5367-3-maxime.ripard@bootlin.com> References: <20190108152001.5367-3-maxime.ripard@bootlin.com> Mime-Version: 1.0 Subject: Re: [igt-dev] [PATCH i-g-t v2 03/13] igt: fb: generic YUV convertion function List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: Maxime Ripard , igt-dev@lists.freedesktop.org Cc: Petri Latvala , eben@raspberrypi.org, Thomas Petazzoni List-ID: T24gVHVlLCAyMDE5LTAxLTA4IGF0IDE2OjE5ICswMTAwLCBNYXhpbWUgUmlwYXJkIHdyb3RlOgo+ IFRoZSBjdXJyZW50IHdheSB3ZSB3b3JrIHdoZW4gd2Ugd2FudCB0byBzdXBwb3J0IGEgbmV3IFlV ViBmb3JtYXQgdG8gSUdULCB3ZQo+IGFsc28gbmVlZCB0byBhZGQgbmV3IGZ1bmN0aW9uIHRvIGNv bnZlcnQgdG8gYW5kIGZyb20gWFJHQjg4ODguCj4gCj4gVGhpcyBkb2Vzbid0IHJlYWxseSBzY2Fs ZSBob3dldmVyLCBhbmQgY3JlYXRlcyBhIGxvdCBvZiBjb2RlIHRvIG1haW50YWluLgo+IEluIG9y ZGVyIHRvIHdvcmsgYXJvdW5kIHRoaXMsIGNyZWF0ZSBhIGdlbmVyaWMgZnVuY3Rpb24gdG8gY29u dmVydCB0byBSR0IKPiBhbmQgb25lIHRvIGNvbnZlcnQgZnJvbSBSR0IuCj4gCj4gVGhlIG9ubHkg dGhpbmcgdGhhdCBpcyBuZWVkZWQgbm93IGlzIHRvIGFkZCBuZXcgcGFyYW1ldGVycywgYW5kIHRo YXQncyBpdC4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBNYXhpbWUgUmlwYXJkIDxtYXhpbWUucmlwYXJk QGJvb3RsaW4uY29tPgoKUmV2aWV3ZWQtYnk6IFBhdWwgS29jaWFsa293c2tpIDxwYXVsLmtvY2lh bGtvd3NraUBib290bGluLmNvbT4KCj4gLS0tCj4gIGxpYi9pZ3RfZmIuYyB8IDUzNyArKysrKysr KysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAgMSBmaWxlIGNo YW5nZWQsIDE3MSBpbnNlcnRpb25zKCspLCAzNjYgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdp dCBhL2xpYi9pZ3RfZmIuYyBiL2xpYi9pZ3RfZmIuYwo+IGluZGV4IDZhYjRlMzAzOTE2Ni4uNDU2 OTFmZDQ0MWQ5IDEwMDY0NAo+IC0tLSBhL2xpYi9pZ3RfZmIuYwo+ICsrKyBiL2xpYi9pZ3RfZmIu Ywo+IEBAIC0xNTc3LDQyNCArMTU3NywyMzcgQEAgc3RhdGljIHZvaWQgY29udmVydF9zcmNfcHV0 KGNvbnN0IHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQsCj4gIAkJZnJlZShzcmNfYnVmKTsKPiAgfQo+ ICAKPiAtc3RhdGljIHZvaWQgY29udmVydF9udjEyX3RvX3JnYjI0KHN0cnVjdCBmYl9jb252ZXJ0 ICpjdnQpCj4gK3N0cnVjdCB5dXZfcGFyYW1ldGVycyB7Cj4gKwl1bnNpZ25lZAl5X2luYzsKPiAr CXVuc2lnbmVkCXV2X2luYzsKPiArCXVuc2lnbmVkCXlfc3RyaWRlOwo+ICsJdW5zaWduZWQJdXZf c3RyaWRlOwo+ICsJdW5zaWduZWQJeV9vZmZzZXQ7Cj4gKwl1bnNpZ25lZAl1X29mZnNldDsKPiAr CXVuc2lnbmVkCXZfb2Zmc2V0Owo+ICt9Owo+ICsKPiArc3RhdGljIHZvaWQgZ2V0X3l1dl9wYXJh bWV0ZXJzKHN0cnVjdCBpZ3RfZmIgKmZiLCBzdHJ1Y3QgeXV2X3BhcmFtZXRlcnMgKnBhcmFtcykK PiAgewo+IC0JaW50IGksIGo7Cj4gLQljb25zdCB1aW50OF90ICp5LCAqdXY7Cj4gLQl1aW50OF90 ICpyZ2IyNCA9IGN2dC0+ZHN0LnB0cjsKPiAtCXVuc2lnbmVkIGludCByZ2IyNF9zdHJpZGUgPSBj dnQtPmRzdC5mYi0+c3RyaWRlc1swXTsKPiAtCXVuc2lnbmVkIGludCBwbGFuYXJfc3RyaWRlID0g Y3Z0LT5zcmMuZmItPnN0cmlkZXNbMF07Cj4gLQlzdHJ1Y3QgaWd0X21hdDQgbSA9IGlndF95Y2Jj cl90b19yZ2JfbWF0cml4KGN2dC0+c3JjLmZiLT5jb2xvcl9lbmNvZGluZywKPiAtCQkJCQkJICAg IGN2dC0+c3JjLmZiLT5jb2xvcl9yYW5nZSk7Cj4gLQl1aW50OF90ICpidWY7Cj4gLQo+IC0JaWd0 X2Fzc2VydChjdnQtPnNyYy5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX05WMTIgJiYKPiAt CQkgICBjdnQtPmRzdC5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1hSR0I4ODg4KTsKPiAt Cj4gLQlidWYgPSBjb252ZXJ0X3NyY19nZXQoY3Z0KTsKPiAtCXkgPSBidWYgKyBjdnQtPnNyYy5m Yi0+b2Zmc2V0c1swXTsKPiAtCXV2ID0gYnVmICsgY3Z0LT5zcmMuZmItPm9mZnNldHNbMV07Cj4g LQo+IC0JZm9yIChpID0gMDsgaSA8IGN2dC0+ZHN0LmZiLT5oZWlnaHQgLyAyOyBpKyspIHsKPiAt CQlmb3IgKGogPSAwOyBqIDwgY3Z0LT5kc3QuZmItPndpZHRoIC8gMjsgaisrKSB7Cj4gLQkJCS8q IENvbnZlcnQgMngyIHBpeGVsIGJsb2NrcyAqLwo+IC0JCQlzdHJ1Y3QgaWd0X3ZlYzQgeXV2WzRd Owo+IC0JCQlzdHJ1Y3QgaWd0X3ZlYzQgcmdiWzRdOwo+IC0KPiAtCQkJeXV2WzBdLmRbMF0gPSB5 W2ogKiAyICsgMF07Cj4gLQkJCXl1dlsxXS5kWzBdID0geVtqICogMiArIDFdOwo+IC0JCQl5dXZb Ml0uZFswXSA9IHlbaiAqIDIgKyAwICsgcGxhbmFyX3N0cmlkZV07Cj4gLQkJCXl1dlszXS5kWzBd ID0geVtqICogMiArIDEgKyBwbGFuYXJfc3RyaWRlXTsKPiAtCj4gLQkJCXl1dlswXS5kWzFdID0g eXV2WzFdLmRbMV0gPSB5dXZbMl0uZFsxXSA9IHl1dlszXS5kWzFdID0gdXZbaiAqIDIgKyAwXTsK PiAtCQkJeXV2WzBdLmRbMl0gPSB5dXZbMV0uZFsyXSA9IHl1dlsyXS5kWzJdID0geXV2WzNdLmRb Ml0gPSB1dltqICogMiArIDFdOwo+IC0JCQl5dXZbMF0uZFszXSA9IHl1dlsxXS5kWzNdID0geXV2 WzJdLmRbM10gPSB5dXZbM10uZFszXSA9IDEuMGY7Cj4gLQo+IC0JCQlyZ2JbMF0gPSBpZ3RfbWF0 cml4X3RyYW5zZm9ybSgmbSwgJnl1dlswXSk7Cj4gLQkJCXJnYlsxXSA9IGlndF9tYXRyaXhfdHJh bnNmb3JtKCZtLCAmeXV2WzFdKTsKPiAtCQkJcmdiWzJdID0gaWd0X21hdHJpeF90cmFuc2Zvcm0o Jm0sICZ5dXZbMl0pOwo+IC0JCQlyZ2JbM10gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1 dlszXSk7Cj4gLQo+IC0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgMF0sICZyZ2JbMF0pOwo+ IC0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgNF0sICZyZ2JbMV0pOwo+IC0JCQl3cml0ZV9y Z2IoJnJnYjI0W2ogKiA4ICsgMCArIHJnYjI0X3N0cmlkZV0sICZyZ2JbMl0pOwo+IC0JCQl3cml0 ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgNCArIHJnYjI0X3N0cmlkZV0sICZyZ2JbM10pOwo+IC0JCX0K PiAtCj4gLQkJaWYgKGN2dC0+ZHN0LmZiLT53aWR0aCAmIDEpIHsKPiAtCQkJLyogQ29udmVydCAx eDIgcGl4ZWwgYmxvY2sgKi8KPiAtCQkJc3RydWN0IGlndF92ZWM0IHl1dlsyXTsKPiAtCQkJc3Ry dWN0IGlndF92ZWM0IHJnYlsyXTsKPiAtCj4gLQkJCXl1dlswXS5kWzBdID0geVtqICogMiArIDBd Owo+IC0JCQl5dXZbMV0uZFswXSA9IHlbaiAqIDIgKyAwICsgcGxhbmFyX3N0cmlkZV07Cj4gKwlp Z3RfYXNzZXJ0KGlndF9mb3JtYXRfaXNfeXV2KGZiLT5kcm1fZm9ybWF0KSk7Cj4gIAo+IC0JCQl5 dXZbMF0uZFsxXSA9IHl1dlsxXS5kWzFdID0gdXZbaiAqIDIgKyAwXTsKPiAtCQkJeXV2WzBdLmRb Ml0gPSB5dXZbMV0uZFsyXSA9IHV2W2ogKiAyICsgMV07Cj4gLQkJCXl1dlswXS5kWzNdID0geXV2 WzFdLmRbM10gPSAxLjBmOwo+ICsJc3dpdGNoIChmYi0+ZHJtX2Zvcm1hdCkgewo+ICsJY2FzZSBE Uk1fRk9STUFUX05WMTI6Cj4gKwkJcGFyYW1zLT55X2luYyA9IDE7Cj4gKwkJcGFyYW1zLT51dl9p bmMgPSAyOwo+ICsJCWJyZWFrOwo+ICAKPiAtCQkJcmdiWzBdID0gaWd0X21hdHJpeF90cmFuc2Zv cm0oJm0sICZ5dXZbMF0pOwo+IC0JCQlyZ2JbMV0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwg Jnl1dlsxXSk7Cj4gLQo+IC0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgMF0sICZyZ2JbMF0p Owo+IC0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgMCArIHJnYjI0X3N0cmlkZV0sICZyZ2Jb MV0pOwo+IC0JCX0KPiAtCj4gLQkJcmdiMjQgKz0gMiAqIHJnYjI0X3N0cmlkZTsKPiAtCQl5ICs9 IDIgKiBwbGFuYXJfc3RyaWRlOwo+IC0JCXV2ICs9IHBsYW5hcl9zdHJpZGU7Cj4gKwljYXNlIERS TV9GT1JNQVRfWVVZVjoKPiArCWNhc2UgRFJNX0ZPUk1BVF9ZVllVOgo+ICsJY2FzZSBEUk1fRk9S TUFUX1VZVlk6Cj4gKwljYXNlIERSTV9GT1JNQVRfVllVWToKPiArCQlwYXJhbXMtPnlfaW5jID0g MjsKPiArCQlwYXJhbXMtPnV2X2luYyA9IDQ7Cj4gKwkJYnJlYWs7Cj4gKwo+ICsJY2FzZSBEUk1f Rk9STUFUX1hZVVY4ODg4Ogo+ICsJCXBhcmFtcy0+eV9pbmMgPSA0Owo+ICsJCXBhcmFtcy0+dXZf aW5jID0gNDsKPiArCQlicmVhazsKPiAgCX0KPiAgCj4gLQlpZiAoY3Z0LT5kc3QuZmItPmhlaWdo dCAmIDEpIHsKPiAtCQkvKiBDb252ZXJ0IGxhc3Qgcm93ICovCj4gLQkJZm9yIChqID0gMDsgaiA8 IGN2dC0+ZHN0LmZiLT53aWR0aCAvIDI7IGorKykgewo+IC0JCQkvKiBDb252ZXJ0IDJ4MSBwaXhl bCBibG9ja3MgKi8KPiAtCQkJc3RydWN0IGlndF92ZWM0IHl1dlsyXTsKPiAtCQkJc3RydWN0IGln dF92ZWM0IHJnYlsyXTsKPiAtCj4gLQkJCXl1dlswXS5kWzBdID0geVtqICogMiArIDBdOwo+IC0J CQl5dXZbMV0uZFswXSA9IHlbaiAqIDIgKyAxXTsKPiAtCQkJeXV2WzBdLmRbMV0gPSB5dXZbMV0u ZFsxXSA9IHV2W2ogKiAyICsgMF07Cj4gLQkJCXl1dlswXS5kWzJdID0geXV2WzFdLmRbMl0gPSB1 dltqICogMiArIDFdOwo+IC0JCQl5dXZbMF0uZFszXSA9IHl1dlsxXS5kWzNdID0gMS4wZjsKPiAr CXN3aXRjaCAoZmItPmRybV9mb3JtYXQpIHsKPiArCWNhc2UgRFJNX0ZPUk1BVF9OVjEyOgo+ICsJ CXBhcmFtcy0+eV9zdHJpZGUgPSBmYi0+c3RyaWRlc1swXTsKPiArCQlwYXJhbXMtPnV2X3N0cmlk ZSA9IGZiLT5zdHJpZGVzWzFdOwo+ICsJCWJyZWFrOwo+ICAKPiAtCQkJcmdiWzBdID0gaWd0X21h dHJpeF90cmFuc2Zvcm0oJm0sICZ5dXZbMF0pOwo+IC0JCQlyZ2JbMV0gPSBpZ3RfbWF0cml4X3Ry YW5zZm9ybSgmbSwgJnl1dlsxXSk7Cj4gKwljYXNlIERSTV9GT1JNQVRfWVVZVjoKPiArCWNhc2Ug RFJNX0ZPUk1BVF9ZVllVOgo+ICsJY2FzZSBEUk1fRk9STUFUX1VZVlk6Cj4gKwljYXNlIERSTV9G T1JNQVRfVllVWToKPiArCWNhc2UgRFJNX0ZPUk1BVF9YWVVWODg4ODoKPiArCQlwYXJhbXMtPnlf c3RyaWRlID0gZmItPnN0cmlkZXNbMF07Cj4gKwkJcGFyYW1zLT51dl9zdHJpZGUgPSBmYi0+c3Ry aWRlc1swXTsKPiArCQlicmVhazsKPiArCX0KPiAgCj4gLQkJCXdyaXRlX3JnYigmcmdiMjRbaiAq IDggKyAwXSwgJnJnYlswXSk7Cj4gLQkJCXdyaXRlX3JnYigmcmdiMjRbaiAqIDggKyA0XSwgJnJn YlswXSk7Cj4gLQkJfQo+ICsJc3dpdGNoIChmYi0+ZHJtX2Zvcm1hdCkgewo+ICsJY2FzZSBEUk1f Rk9STUFUX05WMTI6Cj4gKwkJcGFyYW1zLT55X29mZnNldCA9IGZiLT5vZmZzZXRzWzBdOwo+ICsJ CXBhcmFtcy0+dV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1sxXTsKPiArCQlwYXJhbXMtPnZfb2Zmc2V0 ID0gZmItPm9mZnNldHNbMV0gKyAxOwo+ICsJCWJyZWFrOwo+ICAKPiAtCQlpZiAoY3Z0LT5kc3Qu ZmItPndpZHRoICYgMSkgewo+IC0JCQkvKiBDb252ZXJ0IHNpbmdsZSBwaXhlbCAqLwo+IC0JCQlz dHJ1Y3QgaWd0X3ZlYzQgeXV2Owo+IC0JCQlzdHJ1Y3QgaWd0X3ZlYzQgcmdiOwo+ICsJY2FzZSBE Uk1fRk9STUFUX1lVWVY6Cj4gKwkJcGFyYW1zLT55X29mZnNldCA9IGZiLT5vZmZzZXRzWzBdOwo+ ICsJCXBhcmFtcy0+dV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDE7Cj4gKwkJcGFyYW1zLT52 X29mZnNldCA9IGZiLT5vZmZzZXRzWzBdICsgMzsKPiArCQlicmVhazsKPiAgCj4gLQkJCXl1di5k WzBdID0geVtqICogMiArIDBdOwo+IC0JCQl5dXYuZFsxXSA9IHV2W2ogKiAyICsgMF07Cj4gLQkJ CXl1di5kWzJdID0gdXZbaiAqIDIgKyAxXTsKPiAtCQkJeXV2LmRbM10gPSAxLjBmOwo+ICsJY2Fz ZSBEUk1fRk9STUFUX1lWWVU6Cj4gKwkJcGFyYW1zLT55X29mZnNldCA9IGZiLT5vZmZzZXRzWzBd Owo+ICsJCXBhcmFtcy0+dV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDM7Cj4gKwkJcGFyYW1z LT52X29mZnNldCA9IGZiLT5vZmZzZXRzWzBdICsgMTsKPiArCQlicmVhazsKPiAgCj4gLQkJCXJn YiA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmeXV2KTsKPiArCWNhc2UgRFJNX0ZPUk1BVF9V WVZZOgo+ICsJCXBhcmFtcy0+eV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDE7Cj4gKwkJcGFy YW1zLT51X29mZnNldCA9IGZiLT5vZmZzZXRzWzBdOwo+ICsJCXBhcmFtcy0+dl9vZmZzZXQgPSBm Yi0+b2Zmc2V0c1swXSArIDI7Cj4gKwkJYnJlYWs7Cj4gIAo+IC0JCQl3cml0ZV9yZ2IoJnJnYjI0 W2ogKiA4ICsgMF0sICZyZ2IpOwo+IC0JCX0KPiArCWNhc2UgRFJNX0ZPUk1BVF9WWVVZOgo+ICsJ CXBhcmFtcy0+eV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDE7Cj4gKwkJcGFyYW1zLT51X29m ZnNldCA9IGZiLT5vZmZzZXRzWzBdICsgMjsKPiArCQlwYXJhbXMtPnZfb2Zmc2V0ID0gZmItPm9m ZnNldHNbMF07Cj4gKwkJYnJlYWs7Cj4gKwo+ICsJY2FzZSBEUk1fRk9STUFUX1hZVVY4ODg4Ogo+ ICsJCXBhcmFtcy0+eV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDE7Cj4gKwkJcGFyYW1zLT51 X29mZnNldCA9IGZiLT5vZmZzZXRzWzBdICsgMjsKPiArCQlwYXJhbXMtPnZfb2Zmc2V0ID0gZmIt Pm9mZnNldHNbMF0gKyAzOwo+ICsJCWJyZWFrOwo+ICAJfQo+IC0KPiAtCWNvbnZlcnRfc3JjX3B1 dChjdnQsIGJ1Zik7Cj4gIH0KPiAgCj4gLXN0YXRpYyB2b2lkIGNvbnZlcnRfeXV2NDQ0X3RvX3Jn YjI0KHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQpCj4gK3N0YXRpYyB2b2lkIGNvbnZlcnRfeXV2X3Rv X3JnYjI0KHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQpCj4gIHsKPiArCWNvbnN0IHN0cnVjdCBmb3Jt YXRfZGVzY19zdHJ1Y3QgKnNyY19mbXQgPQo+ICsJCWxvb2t1cF9kcm1fZm9ybWF0KGN2dC0+c3Jj LmZiLT5kcm1fZm9ybWF0KTsKPiAgCWludCBpLCBqOwo+IC0JdWludDhfdCAqeXV2MjQ7Cj4gKwl1 aW50OF90IGJwcCA9IDQ7Cj4gKwl1aW50OF90ICp5LCAqdSwgKnY7Cj4gIAl1aW50OF90ICpyZ2Iy NCA9IGN2dC0+ZHN0LnB0cjsKPiAtCXVuc2lnbmVkIHJnYjI0X3N0cmlkZSA9IGN2dC0+ZHN0LmZi LT5zdHJpZGVzWzBdLCB4eXV2X3N0cmlkZSA9IGN2dC0+c3JjLmZiLT5zdHJpZGVzWzBdOwo+IC0J dWludDhfdCAqYnVmID0gbWFsbG9jKGN2dC0+c3JjLmZiLT5zaXplKTsKPiArCXVuc2lnbmVkIGlu dCByZ2IyNF9zdHJpZGUgPSBjdnQtPmRzdC5mYi0+c3RyaWRlc1swXTsKPiAgCXN0cnVjdCBpZ3Rf bWF0NCBtID0gaWd0X3ljYmNyX3RvX3JnYl9tYXRyaXgoY3Z0LT5zcmMuZmItPmNvbG9yX2VuY29k aW5nLAo+ICAJCQkJCQkgICAgY3Z0LT5zcmMuZmItPmNvbG9yX3JhbmdlKTsKPiArCXVpbnQ4X3Qg KmJ1ZjsKPiArCXN0cnVjdCB5dXZfcGFyYW1ldGVycyBwYXJhbXMgPSB7IH07Cj4gIAo+IC0JLyoK PiAtCSAqIFJlYWRpbmcgZnJvbSB0aGUgQk8gaXMgYXdmdWxseSBzbG93IGJlY2F1c2Ugb2YgbGFj ayBvZiByZWFkIGNhY2hpbmcsCj4gLQkgKiBpdCdzIGZhc3RlciB0byBjb3B5IHRoZSB3aG9sZSBC TyB0byBhIHRlbXBvcmFyeSBidWZmZXIgYW5kIGNvbnZlcnQKPiAtCSAqIGZyb20gdGhlcmUuCj4g LQkgKi8KPiAtCWlndF9tZW1jcHlfZnJvbV93YyhidWYsIGN2dC0+c3JjLnB0ciArIGN2dC0+c3Jj LmZiLT5vZmZzZXRzWzBdLCBjdnQtPnNyYy5mYi0+c2l6ZSk7Cj4gLQl5dXYyNCA9IGJ1ZjsKPiAr CWlndF9hc3NlcnQoY3Z0LT5kc3QuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9YUkdCODg4 OCAmJgo+ICsJCSAgIGlndF9mb3JtYXRfaXNfeXV2KGN2dC0+c3JjLmZiLT5kcm1fZm9ybWF0KSk7 Cj4gKwo+ICsJYnVmID0gY29udmVydF9zcmNfZ2V0KGN2dCk7Cj4gKwlnZXRfeXV2X3BhcmFtZXRl cnMoY3Z0LT5zcmMuZmIsICZwYXJhbXMpOwo+ICsJeSA9IGJ1ZiArIHBhcmFtcy55X29mZnNldDsK PiArCXUgPSBidWYgKyBwYXJhbXMudV9vZmZzZXQ7Cj4gKwl2ID0gYnVmICsgcGFyYW1zLnZfb2Zm c2V0Owo+ICAKPiAgCWZvciAoaSA9IDA7IGkgPCBjdnQtPmRzdC5mYi0+aGVpZ2h0OyBpKyspIHsK PiArCQljb25zdCB1aW50OF90ICp5X3RtcCA9IHk7Cj4gKwkJY29uc3QgdWludDhfdCAqdV90bXAg PSB1Owo+ICsJCWNvbnN0IHVpbnQ4X3QgKnZfdG1wID0gdjsKPiArCQl1aW50OF90ICpyZ2JfdG1w ID0gcmdiMjQ7Cj4gKwo+ICAJCWZvciAoaiA9IDA7IGogPCBjdnQtPmRzdC5mYi0+d2lkdGg7IGor Kykgewo+IC0JCQlmbG9hdCB5LCB1LCB2Owo+IC0JCQlzdHJ1Y3QgaWd0X3ZlYzQgeXV2Owo+IC0J CQlzdHJ1Y3QgaWd0X3ZlYzQgcmdiOwo+IC0KPiAtCQkJdiA9IHl1djI0W2kgKiB4eXV2X3N0cmlk ZSArIGogKiA0XTsKPiAtCQkJdSA9IHl1djI0W2kgKiB4eXV2X3N0cmlkZSArIGogKiA0ICsgMV07 Cj4gLQkJCXkgPSB5dXYyNFtpICogeHl1dl9zdHJpZGUgKyBqICogNCArIDJdOwo+IC0JCQl5dXYu ZFswXSA9IHk7Cj4gLQkJCXl1di5kWzFdID0gdTsKPiAtCQkJeXV2LmRbMl0gPSB2Owo+ICsJCQlz dHJ1Y3QgaWd0X3ZlYzQgcmdiLCB5dXY7Cj4gKwo+ICsJCQl5dXYuZFswXSA9ICp5X3RtcDsKPiAr CQkJeXV2LmRbMV0gPSAqdV90bXA7Cj4gKwkJCXl1di5kWzJdID0gKnZfdG1wOwo+ICAJCQl5dXYu ZFszXSA9IDEuMGY7Cj4gIAo+ICAJCQlyZ2IgPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1 dik7Cj4gKwkJCXdyaXRlX3JnYihyZ2JfdG1wLCAmcmdiKTsKPiAgCj4gLQkJCXdyaXRlX3JnYigm cmdiMjRbaSAqIHJnYjI0X3N0cmlkZSArIGogKiA0XSwgJnJnYik7Cj4gLQkJfQo+IC0JfQo+IC0K PiAtCWZyZWUoYnVmKTsKPiAtfQo+IC0KPiAtCj4gLXN0YXRpYyB2b2lkIGNvbnZlcnRfcmdiMjRf dG9feXV2NDQ0KHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQpCj4gLXsKPiAtCWludCBpLCBqOwo+IC0J dWludDhfdCAqcmdiMjQ7Cj4gLQl1aW50OF90ICp5dXY0NDQgPSBjdnQtPmRzdC5wdHIgKyBjdnQt PmRzdC5mYi0+b2Zmc2V0c1swXTsKPiAtCXVuc2lnbmVkIGludCByZ2IyNF9zdHJpZGUgPSBjdnQt PnNyYy5mYi0+c3RyaWRlc1swXSwgeHl1dl9zdHJpZGUgPSBjdnQtPmRzdC5mYi0+c3RyaWRlc1sw XTsKPiAtCXN0cnVjdCBpZ3RfbWF0NCBtID0gaWd0X3JnYl90b195Y2Jjcl9tYXRyaXgoY3Z0LT5k c3QuZmItPmNvbG9yX2VuY29kaW5nLAo+IC0JCQkJCQkgICAgY3Z0LT5kc3QuZmItPmNvbG9yX3Jh bmdlKTsKPiAtCj4gLQlyZ2IyNCA9IGN2dC0+c3JjLnB0cjsKPiArCQkJcmdiX3RtcCArPSBicHA7 Cj4gKwkJCXlfdG1wICs9IHBhcmFtcy55X2luYzsKPiAgCj4gLQlpZ3RfYXNzZXJ0X2YoY3Z0LT5k c3QuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9YWVVWODg4OCwKPiAtCQkgICAgICJDb252 ZXJzaW9uIG5vdCBpbXBsZW1lbnRlZCBmb3IgIVhZVVYgcGFja2VkIGZvcm1hdHNcbiIpOwo+IC0K PiAtCWZvciAoaSA9IDA7IGkgPCBjdnQtPmRzdC5mYi0+aGVpZ2h0OyBpKyspIHsKPiAtCQlmb3Ig KGogPSAwOyBqIDwgY3Z0LT5kc3QuZmItPndpZHRoOyBqKyspIHsKPiAtCQkJc3RydWN0IGlndF92 ZWM0IHJnYjsKPiAtCQkJc3RydWN0IGlndF92ZWM0IHl1djsKPiAtCj4gLQkJCXJlYWRfcmdiKCZy Z2IsICZyZ2IyNFtpICogcmdiMjRfc3RyaWRlICsgaiAqIDRdKTsKPiArCQkJaWYgKChzcmNfZm10 LT5oc3ViID09IDEpIHx8IChqICUgc3JjX2ZtdC0+aHN1YikpIHsKPiArCQkJCXVfdG1wICs9IHBh cmFtcy51dl9pbmM7Cj4gKwkJCQl2X3RtcCArPSBwYXJhbXMudXZfaW5jOwo+ICsJCQl9Cj4gKwkJ fQo+ICAKPiAtCQkJeXV2ID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZyZ2IpOwo+ICsJCXJn YjI0ICs9IHJnYjI0X3N0cmlkZTsKPiArCQl5ICs9IHBhcmFtcy55X3N0cmlkZTsKPiAgCj4gLQkJ CXl1djQ0NFtpICogeHl1dl9zdHJpZGUgKyBqICogNF0gPSB5dXYuZFsyXTsKPiAtCQkJeXV2NDQ0 W2kgKiB4eXV2X3N0cmlkZSArIGogKiA0ICsgMV0gPSB5dXYuZFsxXTsKPiAtCQkJeXV2NDQ0W2kg KiB4eXV2X3N0cmlkZSArIGogKiA0ICsgMl0gPSB5dXYuZFswXTsKPiArCQlpZiAoKHNyY19mbXQt PnZzdWIgPT0gMSkgfHwgKGkgJSBzcmNfZm10LT52c3ViKSkgewo+ICsJCQl1ICs9IHBhcmFtcy51 dl9zdHJpZGU7Cj4gKwkJCXYgKz0gcGFyYW1zLnV2X3N0cmlkZTsKPiAgCQl9Cj4gIAl9Cj4gKwo+ ICsJY29udmVydF9zcmNfcHV0KGN2dCwgYnVmKTsKPiAgfQo+ICAKPiAtc3RhdGljIHZvaWQgY29u dmVydF9yZ2IyNF90b19udjEyKHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQpCj4gK3N0YXRpYyB2b2lk IGNvbnZlcnRfcmdiMjRfdG9feXV2KHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQpCj4gIHsKPiArCWNv bnN0IHN0cnVjdCBmb3JtYXRfZGVzY19zdHJ1Y3QgKmRzdF9mbXQgPQo+ICsJCWxvb2t1cF9kcm1f Zm9ybWF0KGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0KTsKPiAgCWludCBpLCBqOwo+IC0JdWludDhf dCAqeSA9IGN2dC0+ZHN0LnB0ciArIGN2dC0+ZHN0LmZiLT5vZmZzZXRzWzBdOwo+IC0JdWludDhf dCAqdXYgPSBjdnQtPmRzdC5wdHIgKyBjdnQtPmRzdC5mYi0+b2Zmc2V0c1sxXTsKPiArCXVpbnQ4 X3QgKnksICp1LCAqdjsKPiAgCWNvbnN0IHVpbnQ4X3QgKnJnYjI0ID0gY3Z0LT5zcmMucHRyOwo+ ICsJdWludDhfdCBicHAgPSA0Owo+ICAJdW5zaWduZWQgcmdiMjRfc3RyaWRlID0gY3Z0LT5zcmMu ZmItPnN0cmlkZXNbMF07Cj4gLQl1bnNpZ25lZCBwbGFuYXJfc3RyaWRlID0gY3Z0LT5kc3QuZmIt PnN0cmlkZXNbMF07Cj4gIAlzdHJ1Y3QgaWd0X21hdDQgbSA9IGlndF9yZ2JfdG9feWNiY3JfbWF0 cml4KGN2dC0+ZHN0LmZiLT5jb2xvcl9lbmNvZGluZywKPiAgCQkJCQkJICAgIGN2dC0+ZHN0LmZi LT5jb2xvcl9yYW5nZSk7Cj4gKwlzdHJ1Y3QgeXV2X3BhcmFtZXRlcnMgcGFyYW1zID0geyB9Owo+ ICAKPiAgCWlndF9hc3NlcnQoY3Z0LT5zcmMuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9Y UkdCODg4OCAmJgo+IC0JCSAgIGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRf TlYxMik7Cj4gKwkJICAgaWd0X2Zvcm1hdF9pc195dXYoY3Z0LT5kc3QuZmItPmRybV9mb3JtYXQp KTsKPiAgCj4gLQlmb3IgKGkgPSAwOyBpIDwgY3Z0LT5kc3QuZmItPmhlaWdodCAvIDI7IGkrKykg ewo+IC0JCWZvciAoaiA9IDA7IGogPCBjdnQtPmRzdC5mYi0+d2lkdGggLyAyOyBqKyspIHsKPiAt CQkJLyogQ29udmVydCAyeDIgcGl4ZWwgYmxvY2tzICovCj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCBy Z2JbNF07Cj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXZbNF07Cj4gKwlnZXRfeXV2X3BhcmFtZXRl cnMoY3Z0LT5kc3QuZmIsICZwYXJhbXMpOwo+ICsJeSA9IGN2dC0+ZHN0LnB0ciArIHBhcmFtcy55 X29mZnNldDsKPiArCXUgPSBjdnQtPmRzdC5wdHIgKyBwYXJhbXMudV9vZmZzZXQ7Cj4gKwl2ID0g Y3Z0LT5kc3QucHRyICsgcGFyYW1zLnZfb2Zmc2V0Owo+ICAKPiAtCQkJcmVhZF9yZ2IoJnJnYlsw XSwgJnJnYjI0W2ogKiA4ICsgMF0pOwo+IC0JCQlyZWFkX3JnYigmcmdiWzFdLCAmcmdiMjRbaiAq IDggKyA0XSk7Cj4gLQkJCXJlYWRfcmdiKCZyZ2JbMl0sICZyZ2IyNFtqICogOCArIDAgKyByZ2Iy NF9zdHJpZGVdKTsKPiAtCQkJcmVhZF9yZ2IoJnJnYlszXSwgJnJnYjI0W2ogKiA4ICsgNCArIHJn YjI0X3N0cmlkZV0pOwo+IC0KPiAtCQkJeXV2WzBdID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0s ICZyZ2JbMF0pOwo+IC0JCQl5dXZbMV0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYlsx XSk7Cj4gLQkJCXl1dlsyXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmcmdiWzJdKTsKPiAt CQkJeXV2WzNdID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZyZ2JbM10pOwo+IC0KPiAtCQkJ eVtqICogMiArIDBdID0geXV2WzBdLmRbMF07Cj4gLQkJCXlbaiAqIDIgKyAxXSA9IHl1dlsxXS5k WzBdOwo+IC0JCQl5W2ogKiAyICsgMCArIHBsYW5hcl9zdHJpZGVdID0geXV2WzJdLmRbMF07Cj4g LQkJCXlbaiAqIDIgKyAxICsgcGxhbmFyX3N0cmlkZV0gPSB5dXZbM10uZFswXTsKPiArCWZvciAo aSA9IDA7IGkgPCBjdnQtPmRzdC5mYi0+aGVpZ2h0OyBpKyspIHsKPiArCQljb25zdCB1aW50OF90 ICpyZ2JfdG1wID0gcmdiMjQ7Cj4gKwkJdWludDhfdCAqeV90bXAgPSB5Owo+ICsJCXVpbnQ4X3Qg KnVfdG1wID0gdTsKPiArCQl1aW50OF90ICp2X3RtcCA9IHY7Cj4gIAo+IC0JCQkvKgo+IC0JCQkg KiBXZSBhc3N1bWUgdGhlIE1QRUcyIGNocm9tYSBzaXRpbmcgY29udmVudGlvbiwgd2hlcmUKPiAt CQkJICogcGl4ZWwgY2VudGVyIGZvciBDYidDcicgaXMgYmV0d2VlbiB0aGUgbGVmdCB0b3AgYW5k Cj4gLQkJCSAqIGJvdHRvbSBwaXhlbCBpbiBhIDJ4MiBibG9jaywgc28gdGFrZSB0aGUgYXZlcmFn ZS4KPiAtCQkJICovCj4gLQkJCXV2W2ogKiAyICsgMF0gPSAoeXV2WzBdLmRbMV0gKyB5dXZbMl0u ZFsxXSkgLyAyLjBmOwo+IC0JCQl1dltqICogMiArIDFdID0gKHl1dlswXS5kWzJdICsgeXV2WzJd LmRbMl0pIC8gMi4wZjsKPiAtCQl9Cj4gKwkJZm9yIChqID0gMDsgaiA8IGN2dC0+ZHN0LmZiLT53 aWR0aDsgaisrKSB7Cj4gKwkJCWNvbnN0IHVpbnQ4X3QgKnBhaXJfcmdiMjQgPSByZ2JfdG1wOwo+ ICsJCQlzdHJ1Y3QgaWd0X3ZlYzQgcGFpcl9yZ2IsIHJnYjsKPiArCQkJc3RydWN0IGlndF92ZWM0 IHBhaXJfeXV2LCB5dXY7Cj4gIAo+IC0JCWlmIChjdnQtPmRzdC5mYi0+d2lkdGggJiAxKSB7Cj4g LQkJCS8qIENvbnZlcnQgMXgyIHBpeGVsIGJsb2NrICovCj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCBy Z2JbMl07Cj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXZbMl07Cj4gKwkJCXJlYWRfcmdiKCZyZ2Is IHJnYl90bXApOwo+ICsJCQl5dXYgPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYik7Cj4g IAo+IC0JCQlyZWFkX3JnYigmcmdiWzBdLCAmcmdiMjRbaiAqIDggKyAwXSk7Cj4gLQkJCXJlYWRf cmdiKCZyZ2JbMl0sICZyZ2IyNFtqICogOCArIDAgKyByZ2IyNF9zdHJpZGVdKTsKPiArCQkJcmdi X3RtcCArPSBicHA7Cj4gIAo+IC0JCQl5dXZbMF0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwg JnJnYlswXSk7Cj4gLQkJCXl1dlsxXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmcmdiWzFd KTsKPiArCQkJKnlfdG1wID0geXV2LmRbMF07Cj4gKwkJCXlfdG1wICs9IHBhcmFtcy55X2luYzsK PiAgCj4gLQkJCXlbaiAqIDIgKyAwXSA9IHl1dlswXS5kWzBdOwo+IC0JCQl5W2ogKiAyICsgMCAr IHBsYW5hcl9zdHJpZGVdID0geXV2WzFdLmRbMF07Cj4gKwkJCWlmICgoaSAlIGRzdF9mbXQtPnZz dWIpIHx8IChqICUgZHN0X2ZtdC0+aHN1YikpCj4gKwkJCQljb250aW51ZTsKPiAgCj4gIAkJCS8q Cj4gIAkJCSAqIFdlIGFzc3VtZSB0aGUgTVBFRzIgY2hyb21hIHNpdGluZyBjb252ZW50aW9uLCB3 aGVyZQo+ICAJCQkgKiBwaXhlbCBjZW50ZXIgZm9yIENiJ0NyJyBpcyBiZXR3ZWVuIHRoZSBsZWZ0 IHRvcCBhbmQKPiAgCQkJICogYm90dG9tIHBpeGVsIGluIGEgMngyIGJsb2NrLCBzbyB0YWtlIHRo ZSBhdmVyYWdlLgo+ICsJCQkgKgo+ICsJCQkgKiBUaGVyZWZvcmUsIGlmIHdlIHVzZSBzdWJzYW1w bGluZywgd2Ugb25seSByZWFsbHkgY2FyZQo+ICsJCQkgKiBhYm91dCB0d28gcGl4ZWxzIGFsbCB0 aGUgdGltZSwgZWl0aGVyIHRoZSB0d28KPiArCQkJICogc3Vic2VxdWVudCBwaXhlbHMgaG9yaXpv bnRhbGx5LCB2ZXJ0aWNhbGx5LCBvciB0aGUKPiArCQkJICogdHdvIGNvcm5lcnMgaW4gYSAyeDIg YmxvY2suCj4gKwkJCSAqCj4gKwkJCSAqIFRoZSBvbmx5IGNvcm5lciBjYXNlIGlzIHdoZW4gd2Ug aGF2ZSBhbiBvZGQgbnVtYmVyIG9mCj4gKwkJCSAqIHBpeGVscywgYnV0IHRoaXMgY2FuIGJlIGhh bmRsZWQgcHJldHR5IGVhc2lseSBieSBub3QKPiArCQkJICogaW5jcmVtZW50aW5nIHRoZSBwYWly ZWQgcGl4ZWwgcG9pbnRlciBpbiB0aGUKPiArCQkJICogZGlyZWN0aW9uIGl0J3Mgb2RkIGluLgo+ ICAJCQkgKi8KPiAtCQkJdXZbaiAqIDIgKyAwXSA9ICh5dXZbMF0uZFsxXSArIHl1dlsxXS5kWzFd KSAvIDIuMGY7Cj4gLQkJCXV2W2ogKiAyICsgMV0gPSAoeXV2WzBdLmRbMl0gKyB5dXZbMV0uZFsy XSkgLyAyLjBmOwo+IC0JCX0KPiAtCj4gLQkJcmdiMjQgKz0gMiAqIHJnYjI0X3N0cmlkZTsKPiAt CQl5ICs9IDIgKiBwbGFuYXJfc3RyaWRlOwo+IC0JCXV2ICs9IHBsYW5hcl9zdHJpZGU7Cj4gLQl9 Cj4gLQo+IC0JLyogTGFzdCByb3cgY2Fubm90IGJlIGludGVycG9sYXRlZCBiZXR3ZWVuIDIgcGl4 ZWxzLCB0YWtlIHRoZSBzaW5nbGUgdmFsdWUgKi8KPiAtCWlmIChjdnQtPmRzdC5mYi0+aGVpZ2h0 ICYgMSkgewo+IC0JCWZvciAoaiA9IDA7IGogPCBjdnQtPmRzdC5mYi0+d2lkdGggLyAyOyBqKysp IHsKPiAtCQkJLyogQ29udmVydCAyeDEgcGl4ZWwgYmxvY2tzICovCj4gLQkJCXN0cnVjdCBpZ3Rf dmVjNCByZ2JbMl07Cj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXZbMl07Cj4gLQo+IC0JCQlyZWFk X3JnYigmcmdiWzBdLCAmcmdiMjRbaiAqIDggKyAwXSk7Cj4gLQkJCXJlYWRfcmdiKCZyZ2JbMV0s ICZyZ2IyNFtqICogOCArIDRdKTsKPiAtCj4gLQkJCXl1dlswXSA9IGlndF9tYXRyaXhfdHJhbnNm b3JtKCZtLCAmcmdiWzBdKTsKPiAtCQkJeXV2WzFdID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0s ICZyZ2JbMV0pOwo+ICsJCQlpZiAoaiAhPSAoY3Z0LT5kc3QuZmItPndpZHRoIC0gMSkpCj4gKwkJ CQlwYWlyX3JnYjI0ICs9IChkc3RfZm10LT5oc3ViIC0gMSkgKiBicHA7Cj4gIAo+IC0JCQl5W2og KiAyICsgMF0gPSB5dXZbMF0uZFswXTsKPiAtCQkJeVtqICogMiArIDFdID0geXV2WzFdLmRbMF07 Cj4gLQkJCXV2W2ogKiAyICsgMF0gPSB5dXZbMF0uZFsxXTsKPiAtCQkJdXZbaiAqIDIgKyAxXSA9 IHl1dlswXS5kWzJdOwo+IC0JCX0KPiAtCj4gLQkJaWYgKGN2dC0+ZHN0LmZiLT53aWR0aCAmIDEp IHsKPiAtCQkJLyogQ29udmVydCBzaW5nbGUgcGl4ZWwgKi8KPiAtCQkJc3RydWN0IGlndF92ZWM0 IHJnYjsKPiAtCQkJc3RydWN0IGlndF92ZWM0IHl1djsKPiArCQkJaWYgKGkgIT0gKGN2dC0+ZHN0 LmZiLT5oZWlnaHQgLSAxKSkKPiArCQkJCXBhaXJfcmdiMjQgKz0gcmdiMjRfc3RyaWRlICogKGRz dF9mbXQtPnZzdWIgLSAxKTsKPiAgCj4gLQkJCXJlYWRfcmdiKCZyZ2IsICZyZ2IyNFtqICogOCAr IDBdKTsKPiArCQkJcmVhZF9yZ2IoJnBhaXJfcmdiLCBwYWlyX3JnYjI0KTsKPiArCQkJcGFpcl95 dXYgPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnBhaXJfcmdiKTsKPiAgCj4gLQkJCXl1diA9 IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmcmdiKTsKPiArCQkJKnVfdG1wID0gKHl1di5kWzFd ICsgcGFpcl95dXYuZFsxXSkgLyAyLjBmOwo+ICsJCQkqdl90bXAgPSAoeXV2LmRbMl0gKyBwYWly X3l1di5kWzJdKSAvIDIuMGY7Cj4gIAo+IC0JCQl5W2ogKiAyICsgMF0gPSB5dXYuZFswXTsKPiAt CQkJdXZbaiAqIDIgKyAwXSA9IHl1di5kWzFdOwo+IC0JCQl1dltqICogMiArIDFdID0geXV2LmRb Ml07Cj4gLQkJfQo+IC0JfQo+IC19Cj4gLQo+IC0vKiB7IFkwLCBVLCBZMSwgViB9ICovCj4gLXN0 YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHN3aXp6bGVfeXV5dltdID0geyAwLCAxLCAyLCAzIH07 Cj4gLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHN3aXp6bGVfeXZ5dVtdID0geyAwLCAzLCAy LCAxIH07Cj4gLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHN3aXp6bGVfdXl2eVtdID0geyAx LCAwLCAzLCAyIH07Cj4gLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHN3aXp6bGVfdnl1eVtd ID0geyAxLCAyLCAzLCAwIH07Cj4gLQo+IC1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAqeXV5 dl9zd2l6emxlKHVpbnQzMl90IGZvcm1hdCkKPiAtewo+IC0Jc3dpdGNoIChmb3JtYXQpIHsKPiAt CWRlZmF1bHQ6Cj4gLQljYXNlIERSTV9GT1JNQVRfWVVZVjoKPiAtCQlyZXR1cm4gc3dpenpsZV95 dXl2Owo+IC0JY2FzZSBEUk1fRk9STUFUX1lWWVU6Cj4gLQkJcmV0dXJuIHN3aXp6bGVfeXZ5dTsK PiAtCWNhc2UgRFJNX0ZPUk1BVF9VWVZZOgo+IC0JCXJldHVybiBzd2l6emxlX3V5dnk7Cj4gLQlj YXNlIERSTV9GT1JNQVRfVllVWToKPiAtCQlyZXR1cm4gc3dpenpsZV92eXV5Owo+IC0JfQo+IC19 Cj4gLQo+IC1zdGF0aWMgdm9pZCBjb252ZXJ0X3l1eXZfdG9fcmdiMjQoc3RydWN0IGZiX2NvbnZl cnQgKmN2dCkKPiAtewo+IC0JaW50IGksIGo7Cj4gLQljb25zdCB1aW50OF90ICp5dXl2Owo+IC0J dWludDhfdCAqcmdiMjQgPSBjdnQtPmRzdC5wdHI7Cj4gLQl1bnNpZ25lZCBpbnQgcmdiMjRfc3Ry aWRlID0gY3Z0LT5kc3QuZmItPnN0cmlkZXNbMF07Cj4gLQl1bnNpZ25lZCBpbnQgeXV5dl9zdHJp ZGUgPSBjdnQtPnNyYy5mYi0+c3RyaWRlc1swXTsKPiAtCXN0cnVjdCBpZ3RfbWF0NCBtID0gaWd0 X3ljYmNyX3RvX3JnYl9tYXRyaXgoY3Z0LT5zcmMuZmItPmNvbG9yX2VuY29kaW5nLAo+IC0JCQkJ CQkgICAgY3Z0LT5zcmMuZmItPmNvbG9yX3JhbmdlKTsKPiAtCWNvbnN0IHVuc2lnbmVkIGNoYXIg KnN3eiA9IHl1eXZfc3dpenpsZShjdnQtPnNyYy5mYi0+ZHJtX2Zvcm1hdCk7Cj4gLQl1aW50OF90 ICpidWY7Cj4gLQo+IC0JaWd0X2Fzc2VydCgoY3Z0LT5zcmMuZmItPmRybV9mb3JtYXQgPT0gRFJN X0ZPUk1BVF9ZVVlWIHx8Cj4gLQkJICAgIGN2dC0+c3JjLmZiLT5kcm1fZm9ybWF0ID09IERSTV9G T1JNQVRfVVlWWSB8fAo+IC0JCSAgICBjdnQtPnNyYy5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9S TUFUX1lWWVUgfHwKPiAtCQkgICAgY3Z0LT5zcmMuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1B VF9WWVVZKSAmJgo+IC0JCSAgIGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRf WFJHQjg4ODgpOwo+IC0KPiAtCWJ1ZiA9IGNvbnZlcnRfc3JjX2dldChjdnQpOwo+IC0JeXV5diA9 IGJ1ZjsKPiAtCj4gLQlmb3IgKGkgPSAwOyBpIDwgY3Z0LT5kc3QuZmItPmhlaWdodDsgaSsrKSB7 Cj4gLQkJZm9yIChqID0gMDsgaiA8IGN2dC0+ZHN0LmZiLT53aWR0aCAvIDI7IGorKykgewo+IC0J CQkvKiBDb252ZXJ0IDJ4MSBwaXhlbCBibG9ja3MgKi8KPiAtCQkJc3RydWN0IGlndF92ZWM0IHl1 dlsyXTsKPiAtCQkJc3RydWN0IGlndF92ZWM0IHJnYlsyXTsKPiAtCj4gLQkJCXl1dlswXS5kWzBd ID0geXV5dltqICogNCArIHN3elswXV07Cj4gLQkJCXl1dlsxXS5kWzBdID0geXV5dltqICogNCAr IHN3elsyXV07Cj4gLQkJCXl1dlswXS5kWzFdID0geXV2WzFdLmRbMV0gPSB5dXl2W2ogKiA0ICsg c3d6WzFdXTsKPiAtCQkJeXV2WzBdLmRbMl0gPSB5dXZbMV0uZFsyXSA9IHl1eXZbaiAqIDQgKyBz d3pbM11dOwo+IC0JCQl5dXZbMF0uZFszXSA9IHl1dlsxXS5kWzNdID0gMS4wZjsKPiAtCj4gLQkJ CXJnYlswXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmeXV2WzBdKTsKPiAtCQkJcmdiWzFd ID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZ5dXZbMV0pOwo+IC0KPiAtCQkJd3JpdGVfcmdi KCZyZ2IyNFtqICogOCArIDBdLCAmcmdiWzBdKTsKPiAtCQkJd3JpdGVfcmdiKCZyZ2IyNFtqICog OCArIDRdLCAmcmdiWzFdKTsKPiAtCQl9Cj4gLQo+IC0JCWlmIChjdnQtPmRzdC5mYi0+d2lkdGgg JiAxKSB7Cj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXY7Cj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCBy Z2I7Cj4gLQo+IC0JCQl5dXYuZFswXSA9IHl1eXZbaiAqIDQgKyBzd3pbMF1dOwo+IC0JCQl5dXYu ZFsxXSA9IHl1eXZbaiAqIDQgKyBzd3pbMV1dOwo+IC0JCQl5dXYuZFsyXSA9IHl1eXZbaiAqIDQg KyBzd3pbM11dOwo+IC0JCQl5dXYuZFszXSA9IDEuMGY7Cj4gLQo+IC0JCQlyZ2IgPSBpZ3RfbWF0 cml4X3RyYW5zZm9ybSgmbSwgJnl1dik7Cj4gLQo+IC0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4 ICsgMF0sICZyZ2IpOwo+ICsJCQl1X3RtcCArPSBwYXJhbXMudXZfaW5jOwo+ICsJCQl2X3RtcCAr PSBwYXJhbXMudXZfaW5jOwo+ICAJCX0KPiAgCj4gIAkJcmdiMjQgKz0gcmdiMjRfc3RyaWRlOwo+ IC0JCXl1eXYgKz0geXV5dl9zdHJpZGU7Cj4gLQl9Cj4gLQo+IC0JY29udmVydF9zcmNfcHV0KGN2 dCwgYnVmKTsKPiAtfQo+IC0KPiAtc3RhdGljIHZvaWQgY29udmVydF9yZ2IyNF90b195dXl2KHN0 cnVjdCBmYl9jb252ZXJ0ICpjdnQpCj4gLXsKPiAtCWludCBpLCBqOwo+IC0JdWludDhfdCAqeXV5 diA9IGN2dC0+ZHN0LnB0cjsKPiAtCWNvbnN0IHVpbnQ4X3QgKnJnYjI0ID0gY3Z0LT5zcmMucHRy Owo+IC0JdW5zaWduZWQgcmdiMjRfc3RyaWRlID0gY3Z0LT5zcmMuZmItPnN0cmlkZXNbMF07Cj4g LQl1bnNpZ25lZCB5dXl2X3N0cmlkZSA9IGN2dC0+ZHN0LmZiLT5zdHJpZGVzWzBdOwo+IC0Jc3Ry dWN0IGlndF9tYXQ0IG0gPSBpZ3RfcmdiX3RvX3ljYmNyX21hdHJpeChjdnQtPmRzdC5mYi0+Y29s b3JfZW5jb2RpbmcsCj4gLQkJCQkJCSAgICBjdnQtPmRzdC5mYi0+Y29sb3JfcmFuZ2UpOwo+IC0J Y29uc3QgdW5zaWduZWQgY2hhciAqc3d6ID0geXV5dl9zd2l6emxlKGN2dC0+ZHN0LmZiLT5kcm1f Zm9ybWF0KTsKPiAtCj4gLQlpZ3RfYXNzZXJ0KGN2dC0+c3JjLmZiLT5kcm1fZm9ybWF0ID09IERS TV9GT1JNQVRfWFJHQjg4ODggJiYKPiAtCQkgICAoY3Z0LT5kc3QuZmItPmRybV9mb3JtYXQgPT0g RFJNX0ZPUk1BVF9ZVVlWIHx8Cj4gLQkJICAgIGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0ID09IERS TV9GT1JNQVRfVVlWWSB8fAo+IC0JCSAgICBjdnQtPmRzdC5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1f Rk9STUFUX1lWWVUgfHwKPiAtCQkgICAgY3Z0LT5kc3QuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZP Uk1BVF9WWVVZKSk7Cj4gLQo+IC0JZm9yIChpID0gMDsgaSA8IGN2dC0+ZHN0LmZiLT5oZWlnaHQ7 IGkrKykgewo+IC0JCWZvciAoaiA9IDA7IGogPCBjdnQtPmRzdC5mYi0+d2lkdGggLyAyOyBqKysp IHsKPiAtCQkJLyogQ29udmVydCAyeDEgcGl4ZWwgYmxvY2tzICovCj4gLQkJCXN0cnVjdCBpZ3Rf dmVjNCByZ2JbMl07Cj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXZbMl07Cj4gLQo+IC0JCQlyZWFk X3JnYigmcmdiWzBdLCAmcmdiMjRbaiAqIDggKyAwXSk7Cj4gLQkJCXJlYWRfcmdiKCZyZ2JbMV0s ICZyZ2IyNFtqICogOCArIDRdKTsKPiAtCj4gLQkJCXl1dlswXSA9IGlndF9tYXRyaXhfdHJhbnNm b3JtKCZtLCAmcmdiWzBdKTsKPiAtCQkJeXV2WzFdID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0s ICZyZ2JbMV0pOwo+ICsJCXkgKz0gcGFyYW1zLnlfc3RyaWRlOwo+ICAKPiAtCQkJeXV5dltqICog NCArIHN3elswXV0gPSB5dXZbMF0uZFswXTsKPiAtCQkJeXV5dltqICogNCArIHN3elsyXV0gPSB5 dXZbMV0uZFswXTsKPiAtCQkJeXV5dltqICogNCArIHN3elsxXV0gPSAoeXV2WzBdLmRbMV0gKyB5 dXZbMV0uZFsxXSkgLyAyLjBmOwo+IC0JCQl5dXl2W2ogKiA0ICsgc3d6WzNdXSA9ICh5dXZbMF0u ZFsyXSArIHl1dlsxXS5kWzJdKSAvIDIuMGY7Cj4gKwkJaWYgKChpICUgZHN0X2ZtdC0+dnN1Yikg PT0gKGRzdF9mbXQtPnZzdWIgLSAxKSkgewo+ICsJCQl1ICs9IHBhcmFtcy51dl9zdHJpZGU7Cj4g KwkJCXYgKz0gcGFyYW1zLnV2X3N0cmlkZTsKPiAgCQl9Cj4gLQo+IC0JCWlmIChjdnQtPmRzdC5m Yi0+d2lkdGggJiAxKSB7Cj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCByZ2I7Cj4gLQkJCXN0cnVjdCBp Z3RfdmVjNCB5dXY7Cj4gLQo+IC0JCQlyZWFkX3JnYigmcmdiLCAmcmdiMjRbaiAqIDggKyAwXSk7 Cj4gLQo+IC0JCQl5dXYgPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYik7Cj4gLQo+IC0J CQl5dXl2W2ogKiA0ICsgc3d6WzBdXSA9IHl1di5kWzBdOwo+IC0JCQl5dXl2W2ogKiA0ICsgc3d6 WzFdXSA9IHl1di5kWzFdOwo+IC0JCQl5dXl2W2ogKiA0ICsgc3d6WzNdXSA9IHl1di5kWzJdOwo+ IC0JCX0KPiAtCj4gLQkJcmdiMjQgKz0gcmdiMjRfc3RyaWRlOwo+IC0JCXl1eXYgKz0geXV5dl9z dHJpZGU7Cj4gIAl9Cj4gIH0KPiAgCj4gQEAgLTIwNDYsMzEgKzE4NTksMjMgQEAgc3RhdGljIHZv aWQgZmJfY29udmVydChzdHJ1Y3QgZmJfY29udmVydCAqY3Z0KQo+ICAJfSBlbHNlIGlmIChjdnQt PmRzdC5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1hSR0I4ODg4KSB7Cj4gIAkJc3dpdGNo IChjdnQtPnNyYy5mYi0+ZHJtX2Zvcm1hdCkgewo+ICAJCWNhc2UgRFJNX0ZPUk1BVF9YWVVWODg4 ODoKPiAtCQkJY29udmVydF95dXY0NDRfdG9fcmdiMjQoY3Z0KTsKPiAtCQkJcmV0dXJuOwo+ICAJ CWNhc2UgRFJNX0ZPUk1BVF9OVjEyOgo+IC0JCQljb252ZXJ0X252MTJfdG9fcmdiMjQoY3Z0KTsK PiAtCQkJcmV0dXJuOwo+IC0JCWNhc2UgRFJNX0ZPUk1BVF9ZVVlWOgo+IC0JCWNhc2UgRFJNX0ZP Uk1BVF9ZVllVOgo+ICAJCWNhc2UgRFJNX0ZPUk1BVF9VWVZZOgo+ICAJCWNhc2UgRFJNX0ZPUk1B VF9WWVVZOgo+IC0JCQljb252ZXJ0X3l1eXZfdG9fcmdiMjQoY3Z0KTsKPiArCQljYXNlIERSTV9G T1JNQVRfWVVZVjoKPiArCQljYXNlIERSTV9GT1JNQVRfWVZZVToKPiArCQkJY29udmVydF95dXZf dG9fcmdiMjQoY3Z0KTsKPiAgCQkJcmV0dXJuOwo+ICAJCX0KPiAgCX0gZWxzZSBpZiAoY3Z0LT5z cmMuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9YUkdCODg4OCkgewo+ICAJCXN3aXRjaCAo Y3Z0LT5kc3QuZmItPmRybV9mb3JtYXQpIHsKPiAgCQljYXNlIERSTV9GT1JNQVRfWFlVVjg4ODg6 Cj4gLQkJCWNvbnZlcnRfcmdiMjRfdG9feXV2NDQ0KGN2dCk7Cj4gLQkJCXJldHVybjsKPiAgCQlj YXNlIERSTV9GT1JNQVRfTlYxMjoKPiAtCQkJY29udmVydF9yZ2IyNF90b19udjEyKGN2dCk7Cj4g LQkJCXJldHVybjsKPiAgCQljYXNlIERSTV9GT1JNQVRfWVVZVjoKPiAgCQljYXNlIERSTV9GT1JN QVRfWVZZVToKPiAgCQljYXNlIERSTV9GT1JNQVRfVVlWWToKPiAgCQljYXNlIERSTV9GT1JNQVRf VllVWToKPiAtCQkJY29udmVydF9yZ2IyNF90b195dXl2KGN2dCk7Cj4gKwkJCWNvbnZlcnRfcmdi MjRfdG9feXV2KGN2dCk7Cj4gIAkJCXJldHVybjsKPiAgCQl9Cj4gIAl9Ci0tIApQYXVsIEtvY2lh bGtvd3NraSwgQm9vdGxpbgpFbWJlZGRlZCBMaW51eCBhbmQga2VybmVsIGVuZ2luZWVyaW5nCmh0 dHBzOi8vYm9vdGxpbi5jb20KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fCmlndC1kZXYgbWFpbGluZyBsaXN0CmlndC1kZXZAbGlzdHMuZnJlZWRlc2t0b3Au b3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaWd0LWRl dgo=