delorie.com/archives/browse.cgi | search |
Mailing-List: | contact cygwin-help AT sourceware DOT cygnus DOT com; run by ezmlm |
List-Subscribe: | <mailto:cygwin-subscribe AT sources DOT redhat DOT com> |
List-Archive: | <http://sources.redhat.com/ml/cygwin/> |
List-Post: | <mailto:cygwin AT sources DOT redhat DOT com> |
List-Help: | <mailto:cygwin-help AT sources DOT redhat DOT com>, <http://sources.redhat.com/ml/#faqs> |
Sender: | cygwin-owner AT sources DOT redhat DOT com |
Delivered-To: | mailing list cygwin AT sources DOT redhat DOT com |
Date: | Fri, 13 Jul 2001 16:10:28 -0400 (EDT) |
From: | Ken Tew <ken2 AT andrew DOT cmu DOT edu> |
To: | cygwin AT cygwin DOT com |
Subject: | Bug in pthread_cond_signal under Win NT 4.0 |
Message-ID: | <Pine.LNX.4.21L-021.0107131554450.6237-300000@unix47.andrew.cmu.edu> |
MIME-Version: | 1.0 |
--42006283-6672078-995055028=:6237 Content-Type: TEXT/PLAIN; charset=US-ASCII If you signal a condition variable without any threads actually waiting on the condition variable, then when a thread does wait on that variable it will hang. I've attached the file pthread_bug_test.cpp which is a simple program to demonstrate the bug. I also attached a modified thread.cc which fixes the bug. It simply checks to see if any threads are waiting on the condition before signalling. The only change I made to thread.cc was adding the line: if (waiting) at line 452 in the file. ---------- \////// [ O o ] Ken Tew - Licensed to Program \_=_/ http://www.pitt.edu/~ktew _| |_ / \_/ \ ________________________________________oOOO___OOOo__ --42006283-6672078-995055028=:6237 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="pthread_bug_test.cpp" Content-Transfer-Encoding: BASE64 Content-ID: <Pine DOT LNX DOT 4 DOT 21L-021 DOT 0107131610280 DOT 6237 AT unix47 DOT andrew DOT cmu DOT edu> Content-Description: test code to show bug Content-Disposition: attachment; filename="pthread_bug_test.cpp" I2luY2x1ZGUgPHB0aHJlYWQuaD4NCiNpbmNsdWRlIDxzZW1hcGhvcmUuaD4N CiNpbmNsdWRlIDxzdGRpby5oPg0KI2luY2x1ZGUgPHVuaXN0ZC5oPg0KDQpw dGhyZWFkX211dGV4X3QgbXV0aWU7DQpwdGhyZWFkX2NvbmRfdCAgY29uZDsN CnNlbV90ICAgICAgICAgICBzZW1pZTsNCmludCAgICAgICAgICAgICB3YWl0 aW5nOw0KDQp2b2lkICoNCnRocmVhZF9zdGFydCh2b2lkICogZHVtbXkpIA0K ew0KICBwdGhyZWFkX211dGV4X2xvY2soJm11dGllKTsNCiAgcHJpbnRmKCIl dSBnb3QgbG9jayBhYm91dCB0byB3YWtlIHBvc3QgdG8gc2VtaWVcbiIsIHB0 aHJlYWRfc2VsZigpKTsNCiAgc2VtX3Bvc3QoJnNlbWllKTsNCg0KICBwdGhy ZWFkX2NvbmRfc2lnbmFsKCZjb25kKTsNCg0KICBwcmludGYoIiV1IHNlbnQg c2lnbmFsXG4iLCBwdGhyZWFkX3NlbGYoKSk7DQogIHB0aHJlYWRfbXV0ZXhf dW5sb2NrKCZtdXRpZSk7DQoNCiAgc2VtX3dhaXQoJnNlbWllKTsgIC8vIHdh aXQgdW50aWwgd2Uga25vdyBtYWluIGhhcyBncmFiYmVkIG11dGV4DQoNCiAg aWYgKHdhaXRpbmcpIHsNCiAgICBwdGhyZWFkX211dGV4X2xvY2soJm11dGll KTsNCiAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZjb25kKTsNCiAgICBwdGhy ZWFkX211dGV4X3VubG9jaygmbXV0aWUpOw0KICB9DQoNCiAgcHJpbnRmKCJj aGlsZCBkb25lLiBhYm91dCB0byBleGl0XG4iKTsNCg0KICBwdGhyZWFkX2V4 aXQoTlVMTCk7DQoNCg0KfSAvKiBlbmQgdGhyZWFkX3N0YXJ0ICovDQoNCg0K bWFpbigpDQp7DQogIHB0aHJlYWRfdCBjaGlsZDsNCg0KICBwdGhyZWFkX211 dGV4X2luaXQoJm11dGllLCBOVUxMKTsNCiAgcHRocmVhZF9jb25kX2luaXQo JmNvbmQsIE5VTEwpOw0KICBzZW1faW5pdCgmc2VtaWUsIDAsIDApOw0KDQog IHB0aHJlYWRfY3JlYXRlKCZjaGlsZCwgTlVMTCwgdGhyZWFkX3N0YXJ0LCBO VUxMKTsNCg0KICAvKiB3YWl0IHVudGlsIGNoaWxkIGdyYWJzIGxvY2sgc28g c2lnbmFsIGNhbiBiZSBzZW50IGJlZm9yZSB3YWl0aW5nIA0KICAgICBzdGFy dHMNCiAgKi8NCiAgDQogIHByaW50ZigiSW5pdGlhbGl6YXRpb24gZG9uZVxu Iik7DQogIHNlbV93YWl0KCZzZW1pZSk7DQoNCiAgcHRocmVhZF9tdXRleF9s b2NrKCZtdXRpZSk7DQogIHdhaXRpbmc9MTsNCiAgc2VtX3Bvc3QoJnNlbWll KTsgLy8gd2FrZSBjaGlsZCBub3cgdGhhdCBwYXJlbnQgaGFzIGxvY2sNCiAg cHJpbnRmKCJNYWluIGxvY2tlZCBtdXRleCwgYWJvdXQgdG8gd2FpdCBvbiBj b25kaXRpb25cbiIpOw0KICBwdGhyZWFkX2NvbmRfd2FpdCgmY29uZCwgJm11 dGllKTsNCiAgd2FpdGluZz0wOw0KICBwcmludGYoIk1haW4gd29rZSBmcm9t IGNvbmRpdGlvblxuIik7DQogIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRp ZSk7DQoNCg0KICBwdGhyZWFkX2pvaW4oJmNoaWxkLE5VTEwpOw0KDQp9DQo= --42006283-6672078-995055028=:6237 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="thread.cc" Content-Transfer-Encoding: BASE64 Content-ID: <Pine DOT LNX DOT 4 DOT 21L-021 DOT 0107131610281 DOT 6237 AT unix47 DOT andrew DOT cmu DOT edu> Content-Description: fixed file Content-Disposition: attachment; filename="thread.cc" LyogdGhyZWFkLmNjOiBMb2NraW5nIGFuZCB0aHJlYWRpbmcgbW9kdWxlIGZ1 bmN0aW9ucw0NCg0NCiAgIENvcHlyaWdodCAxOTk4LCAxOTk5LCAyMDAwLCAy MDAxIFJlZCBIYXQsIEluYy4NDQoNDQogICBPcmlnaW5hbGx5IHdyaXR0ZW4g YnkgTWFyY28gRnV5a3NjaG90IDxtYXJjb0BkZGkubmw+DQ0KDQ0KVGhpcyBm aWxlIGlzIHBhcnQgb2YgQ3lnd2luLg0NCg0NClRoaXMgc29mdHdhcmUgaXMg YSBjb3B5cmlnaHRlZCB3b3JrIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBv ZiB0aGUNDQpDeWd3aW4gbGljZW5zZS4gIFBsZWFzZSBjb25zdWx0IHRoZSBm aWxlICJDWUdXSU5fTElDRU5TRSIgZm9yDQ0KZGV0YWlscy4gKi8NDQoNDQov KiBJbXBsZW1lbnRhdGlvbiBvdmVydmlldyBhbmQgY2F2ZWF0czoNDQoNDQog IFdpbjMyIHB1dHMgc29tZSBjb250cmFpbnRzIG9uIHdoYXQgY2FuIGFuZCBj YW5ub3QgYmUgaW1wbGVtZW50ZWQuIFdoZXJlIHBvc3NpYmxlDQ0KICB3ZSB3 b3JrIGFyb3VuZCB0aG9zZSBjb250cmFpbnN0cy4gV2hlcmUgd2UgY2Fubm90 IHdvcmsgYXJvdW5kIHRoZSBjb25zdHJhaW50cyB3ZQ0NCiAgZWl0aGVyIHBy ZXRlbmQgdG8gYmUgY29uZm9ybWFudCwgb3IgcmV0dXJuIGFuIGVycm9yIGNv ZGUuDQ0KDQ0KICBTb21lIGNhdmVhdHM6IFBST0NFU1NfU0hBUkVEIG9iamVj dHMgd2hpbGUgdGhleSBwcmV0ZW5kIHRvIGJlIHByb2Nlc3Mgc2hhcmVkLA0N CiAgbWF5IG5vdCBhY3R1YWxseSB3b3JrLiBTb21lIHRlc3QgY2FzZXMgYXJl IG5lZWRlZCB0byBkZXRlcm1pbmUgd2luMzIncyBiZWhhdmlvdXIuDQ0KICBN eSBzdXNwaWNpb24gaXMgdGhhdCB0aGUgd2luMzIgaGFuZGxlIG5lZWRzIHRv IGJlIG9wZW5lZCB3aXRoIGRpZmZlcmVudCBmbGFncyBmb3INDQogIHByb3Bl ciBvcGVyYXRpb24uDQ0KDQ0KICBSLkNvbGxpbnMsIEFwcmlsIDIwMDEuDQ0K DQ0KICAqLw0NCg0NCiNpZmRlZiBIQVZFX0NPTkZJR19IDQ0KIyBpbmNsdWRl ICJjb25maWcuaCINDQojZW5kaWYNDQoNDQojaWZkZWYgX01UX1NBRkUNDQoj aW5jbHVkZSAid2luc3VwLmgiDQ0KI2luY2x1ZGUgPGxpbWl0cy5oPg0NCiNp bmNsdWRlIDxlcnJuby5oPg0NCiNpbmNsdWRlICJjeWdlcnJuby5oIg0NCiNp bmNsdWRlIDxhc3NlcnQuaD4NDQojaW5jbHVkZSA8c3RkbGliLmg+DQ0KI2lu Y2x1ZGUgPHN5c2xvZy5oPg0NCiNpbmNsdWRlICJzeW5jLmgiDQ0KI2luY2x1 ZGUgInNpZ3Byb2MuaCINDQojaW5jbHVkZSAicGluZm8uaCINDQojaW5jbHVk ZSAicGVycHJvY2Vzcy5oIg0NCiNpbmNsdWRlICJzZWN1cml0eS5oIg0NCiNp bmNsdWRlIDxzZW1hcGhvcmUuaD4NDQojaW5jbHVkZSA8c3RkaW8uaD4NDQoj aW5jbHVkZSA8c3lzL3RpbWViLmg+DQ0KDQ0KZXh0ZXJuIGludCB0aHJlYWRz YWZlOw0NCg0NCi8qIHB0aHJlYWRfa2V5X2Rlc3RydWN0b3JfbGlzdCBjbGFz czogdG8tYmUgdGhyZWFkc2FmZSBzaW5nbGUgbGlua2VkIGxpc3QNDQogKiBG SVhNRTogUHV0IG1lIGluIGEgZGVkaWNhdGVkIGZpbGUsIG9yIGEgbGVhc3Qg YSB0b29scyBhcmVhICENDQogKi8NDQoNDQpwdGhyZWFkX2tleV9kZXN0cnVj dG9yICoNDQpwdGhyZWFkX2tleV9kZXN0cnVjdG9yOjpJbnNlcnRBZnRlciAo cHRocmVhZF9rZXlfZGVzdHJ1Y3RvciAqIG5vZGUpDQ0Kew0NCiAgcHRocmVh ZF9rZXlfZGVzdHJ1Y3RvciAqdGVtcCA9IG5leHQ7DQ0KICBuZXh0ID0gbm9k ZTsNDQogIHJldHVybiB0ZW1wOw0NCn0NDQoNDQpwdGhyZWFkX2tleV9kZXN0 cnVjdG9yICoNDQpwdGhyZWFkX2tleV9kZXN0cnVjdG9yOjpVbmxpbmtOZXh0 ICgpDQ0Kew0NCiAgcHRocmVhZF9rZXlfZGVzdHJ1Y3RvciAqdGVtcCA9IG5l eHQ7DQ0KICBpZiAobmV4dCkNDQogICAgbmV4dCA9IG5leHQtPk5leHQgKCk7 DQ0KICByZXR1cm4gdGVtcDsNDQp9DQ0KDQ0KcHRocmVhZF9rZXlfZGVzdHJ1 Y3RvciAqDQ0KcHRocmVhZF9rZXlfZGVzdHJ1Y3Rvcjo6TmV4dCAoKQ0NCnsN DQogIHJldHVybiBuZXh0Ow0NCn0NDQoNDQp2b2lkDQ0KcHRocmVhZF9rZXlf ZGVzdHJ1Y3Rvcl9saXN0OjpJbnNlcnQgKHB0aHJlYWRfa2V5X2Rlc3RydWN0 b3IgKiBub2RlKQ0NCnsNDQogIGlmICghbm9kZSkNDQogICAgcmV0dXJuOw0N CiAgaGVhZCA9IG5vZGUtPkluc2VydEFmdGVyIChoZWFkKTsNDQogIGlmICgh aGVhZCkNDQogICAgaGVhZCA9IG5vZGU7CQkvKiBmaXJzdCBub2RlIHNwZWNp YWwgY2FzZSAqLw0NCn0NDQoNDQogIC8qIHJlbW92ZSBhIGdpdmVuIGRhdGFp dGVtLCB3aGVyZXZlciBpbiB0aGUgbGlzdCBpdCBpcyAqLw0NCnB0aHJlYWRf a2V5X2Rlc3RydWN0b3IgKg0NCnB0aHJlYWRfa2V5X2Rlc3RydWN0b3JfbGlz dDo6UmVtb3ZlIChwdGhyZWFkX2tleSAqIGtleSkNDQp7DQ0KICBpZiAoIWtl eSkNDQogICAgcmV0dXJuIE5VTEw7DQ0KICBpZiAoIWhlYWQpDQ0KICAgIHJl dHVybiBOVUxMOw0NCiAgaWYgKGtleSA9PSBoZWFkLT5rZXkpDQ0KICAgIHJl dHVybiBQb3AgKCk7DQ0KICBwdGhyZWFkX2tleV9kZXN0cnVjdG9yICp0ZW1w ID0gaGVhZDsNDQogIHdoaWxlICh0ZW1wICYmIHRlbXAtPk5leHQgKCkgJiYg IShrZXkgPT0gdGVtcC0+TmV4dCAoKS0+a2V5KSkNDQogICAgew0NCiAgICAg IHRlbXAgPSB0ZW1wLT5OZXh0ICgpOw0NCiAgICB9DQ0KICBpZiAodGVtcCkN DQogICAgcmV0dXJuIHRlbXAtPlVubGlua05leHQgKCk7DQ0KICByZXR1cm4g TlVMTDsNDQp9DQ0KDQ0KICAvKiBnZXQgdGhlIGZpcnN0IGl0ZW0gYW5kIHJl bW92ZSBhdCB0aGUgc2FtZSB0aW1lICovDQ0KcHRocmVhZF9rZXlfZGVzdHJ1 Y3RvciAqDQ0KcHRocmVhZF9rZXlfZGVzdHJ1Y3Rvcl9saXN0OjpQb3AgKCkN DQp7DQ0KICBwdGhyZWFkX2tleV9kZXN0cnVjdG9yICp0ZW1wID0gaGVhZDsN DQogIGhlYWQgPSBoZWFkLT5OZXh0ICgpOw0NCiAgcmV0dXJuIHRlbXA7DQ0K fQ0NCg0NCnB0aHJlYWRfa2V5X2Rlc3RydWN0b3I6Og0NCnB0aHJlYWRfa2V5 X2Rlc3RydWN0b3IgKHZvaWQgKCp0aGVkZXN0cnVjdG9yKSAodm9pZCAqKSwg cHRocmVhZF9rZXkgKiBrZXkpDQ0Kew0NCiAgZGVzdHJ1Y3RvciA9IHRoZWRl c3RydWN0b3I7DQ0KICBuZXh0ID0gTlVMTDsNDQogIHRoaXMtPmtleSA9IGtl eTsNDQp9DQ0KDQ0Kdm9pZA0NCnB0aHJlYWRfa2V5X2Rlc3RydWN0b3JfbGlz dDo6SXRlcmF0ZU51bGwgKCkNDQp7DQ0KICBwdGhyZWFkX2tleV9kZXN0cnVj dG9yICp0ZW1wID0gaGVhZDsNDQogIHdoaWxlICh0ZW1wKQ0NCiAgICB7DQ0K ICAgICAgdGVtcC0+ZGVzdHJ1Y3RvciAoKHRlbXAtPmtleSktPmdldCAoKSk7 DQ0KICAgICAgdGVtcCA9IHRlbXAtPk5leHQgKCk7DQ0KICAgIH0NDQp9DQ0K DQ0KDQ0KI2RlZmluZSBNVF9JTlRFUkZBQ0UgdXNlcl9kYXRhLT50aHJlYWRp bnRlcmZhY2UNDQoNDQpzdHJ1Y3QgX3JlZW50ICoNDQpfcmVlbnRfY2xpYiAo KQ0NCnsNDQogIGludCB0bXAgPSBHZXRMYXN0RXJyb3IgKCk7DQ0KICBzdHJ1 Y3QgX19yZWVudF90ICpfciA9DQ0KICAgIChzdHJ1Y3QgX19yZWVudF90ICop IFRsc0dldFZhbHVlIChNVF9JTlRFUkZBQ0UtPnJlZW50X2luZGV4KTsNDQoN DQojaWZkZWYgX0NZR19USFJFQURfRkFJTFNBRkUNDQogIGlmIChfciA9PSAw KQ0NCiAgICBzeXN0ZW1fcHJpbnRmICgibG9jYWwgdGhyZWFkIHN0b3JhZ2Ug bm90IGluaXRlZCIpOw0NCiNlbmRpZg0NCg0NCiAgU2V0TGFzdEVycm9yICh0 bXApOw0NCiAgcmV0dXJuIF9yLT5fY2xpYjsNDQp9DQ0KDQ0Kc3RydWN0IF93 aW5zdXBfdCAqDQ0KX3JlZW50X3dpbnN1cCAoKQ0NCnsNDQogIGludCB0bXAg PSBHZXRMYXN0RXJyb3IgKCk7DQ0KICBzdHJ1Y3QgX19yZWVudF90ICpfcjsN DQogIF9yID0gKHN0cnVjdCBfX3JlZW50X3QgKikgVGxzR2V0VmFsdWUgKE1U X0lOVEVSRkFDRS0+cmVlbnRfaW5kZXgpOw0NCiNpZmRlZiBfQ1lHX1RIUkVB RF9GQUlMU0FGRQ0NCiAgaWYgKF9yID09IDApDQ0KICAgIHN5c3RlbV9wcmlu dGYgKCJsb2NhbCB0aHJlYWQgc3RvcmFnZSBub3QgaW5pdGVkIik7DQ0KI2Vu ZGlmDQ0KICBTZXRMYXN0RXJyb3IgKHRtcCk7DQ0KICByZXR1cm4gX3ItPl93 aW5zdXA7DQ0KfQ0NCg0NCmlubGluZSBMUENSSVRJQ0FMX1NFQ1RJT04NDQpS ZXNvdXJjZUxvY2tzOjpMb2NrIChpbnQgX3Jlc2lkKQ0NCnsNDQojaWZkZWYg X0NZR19USFJFQURfRkFJTFNBRkUNDQogIGlmICghaW5pdGVkKQ0NCiAgICBz eXN0ZW1fcHJpbnRmICgibG9jayBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemF0 aW9uIik7DQ0KDQ0KICB0aHJlYWRfcHJpbnRmDQ0KICAgICgiR2V0IFJlc291 cmNlIGxvY2sgJWQgPT0+ICVwIGZvciAlcCAsIHJlYWwgOiAlZCAsIHRocmVh ZGlkICVkICIsIF9yZXNpZCwNDQogICAgICZsb2NrLCB1c2VyX2RhdGEsIG15 c2VsZi0+cGlkLCBHZXRDdXJyZW50VGhyZWFkSWQgKCkpOw0NCiNlbmRpZg0N CiAgcmV0dXJuICZsb2NrOw0NCn0NDQoNDQp2b2lkDQ0KU2V0UmVzb3VyY2VM b2NrIChpbnQgX3Jlc19pZCwgaW50IF9tb2RlLCBjb25zdCBjaGFyICpfZnVu Y3Rpb24pDQ0Kew0NCiNpZmRlZiBfQ1lHX1RIUkVBRF9GQUlMU0FGRQ0NCiAg dGhyZWFkX3ByaW50ZiAoIlNldCByZXNvdXJjZSBsb2NrICVkIG1vZGUgJWQg Zm9yICVzIHN0YXJ0IiwNDQoJCSBfcmVzX2lkLCBfbW9kZSwgX2Z1bmN0aW9u KTsNDQojZW5kaWYNDQogIEVudGVyQ3JpdGljYWxTZWN0aW9uICh1c2VyX2Rh dGEtPnJlc291cmNlbG9ja3MtPkxvY2sgKF9yZXNfaWQpKTsNDQoNDQojaWZk ZWYgX0NZR19USFJFQURfRkFJTFNBRkUNDQogIHVzZXJfZGF0YS0+cmVzb3Vy Y2Vsb2Nrcy0+b3duZXIgPSBHZXRDdXJyZW50VGhyZWFkSWQgKCk7DQ0KICB1 c2VyX2RhdGEtPnJlc291cmNlbG9ja3MtPmNvdW50Kys7DQ0KI2VuZGlmDQ0K fQ0NCg0NCnZvaWQNDQpSZWxlYXNlUmVzb3VyY2VMb2NrIChpbnQgX3Jlc19p ZCwgaW50IF9tb2RlLCBjb25zdCBjaGFyICpfZnVuY3Rpb24pDQ0Kew0NCiNp ZmRlZiBfQ1lHX1RIUkVBRF9GQUlMU0FGRQ0NCiAgdGhyZWFkX3ByaW50ZiAo IlJlbGVhc2UgcmVzb3VyY2UgbG9jayAlZCBtb2RlICVkIGZvciAlcyBkb25l IiwgX3Jlc19pZCwNDQoJCSBfbW9kZSwgX2Z1bmN0aW9uKTsNDQoNDQogIEFz c2VydFJlc291cmNlT3duZXIgKF9yZXNfaWQsIF9tb2RlKTsNDQogIHVzZXJf ZGF0YS0+cmVzb3VyY2Vsb2Nrcy0+Y291bnQtLTsNDQogIGlmICh1c2VyX2Rh dGEtPnJlc291cmNlbG9ja3MtPmNvdW50ID09IDApDQ0KICAgIHVzZXJfZGF0 YS0+cmVzb3VyY2Vsb2Nrcy0+b3duZXIgPSAwOw0NCiNlbmRpZg0NCg0NCiAg TGVhdmVDcml0aWNhbFNlY3Rpb24gKHVzZXJfZGF0YS0+cmVzb3VyY2Vsb2Nr cy0+TG9jayAoX3Jlc19pZCkpOw0NCn0NDQoNDQojaWZkZWYgX0NZR19USFJF QURfRkFJTFNBRkUNDQp2b2lkDQ0KQXNzZXJ0UmVzb3VyY2VPd25lciAoaW50 IF9yZXNfaWQsIGludCBfbW9kZSkNDQp7DQ0KDQ0KICB0aHJlYWRfcHJpbnRm DQ0KICAgICgiQXNzZXJ0IFJlc291cmNlIGxvY2sgJWQgPT0+IGZvciAlcCAs IHJlYWwgOiAlZCAsIHRocmVhZGlkICVkIGNvdW50ICVkIG93bmVyICVkIiwN DQogICAgIF9yZXNfaWQsIHVzZXJfZGF0YSwgbXlzZWxmLT5waWQsIEdldEN1 cnJlbnRUaHJlYWRJZCAoKSwNDQogICAgIHVzZXJfZGF0YS0+cmVzb3VyY2Vs b2Nrcy0+Y291bnQsIHVzZXJfZGF0YS0+cmVzb3VyY2Vsb2Nrcy0+b3duZXIp Ow0NCiAgaWYgKHVzZXJfZGF0YSAmJiAodXNlcl9kYXRhLT5yZXNvdXJjZWxv Y2tzLT5vd25lciAhPSBHZXRDdXJyZW50VGhyZWFkSWQgKCkpKQ0NCiAgICBz eXN0ZW1fcHJpbnRmICgiYXNzZXJ0aW9uIGZhaWxlZCwgbm90IHRoZSByZXNv dXJjZSBvd25lciIpOw0NCn0NDQoNDQojZW5kaWYNDQoNDQp2b2lkDQ0KUmVz b3VyY2VMb2Nrczo6SW5pdCAoKQ0NCnsNDQogIEluaXRpYWxpemVDcml0aWNh bFNlY3Rpb24gKCZsb2NrKTsNDQogIGluaXRlZCA9IHRydWU7DQ0KDQ0KI2lm ZGVmIF9DWUdfVEhSRUFEX0ZBSUxTQUZFDQ0KICBvd25lciA9IDA7DQ0KICBj b3VudCA9IDA7DQ0KI2VuZGlmDQ0KDQ0KICB0aHJlYWRfcHJpbnRmICgibG9j ayAlcCBpbml0ZWQgYnkgJXAgLCAlZCIsICZsb2NrLCB1c2VyX2RhdGEsIG15 c2VsZi0+cGlkKTsNDQp9DQ0KDQ0Kdm9pZA0NClJlc291cmNlTG9ja3M6OkRl bGV0ZSAoKQ0NCnsNDQogIGlmIChpbml0ZWQpDQ0KICAgIHsNDQogICAgICB0 aHJlYWRfcHJpbnRmICgiQ2xvc2UgUmVzb3VyY2UgTG9ja3MgJXAgIiwgJmxv Y2spOw0NCiAgICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbiAoJmxvY2spOw0N CiAgICAgIGluaXRlZCA9IGZhbHNlOw0NCiAgICB9DQ0KfQ0NCg0NCnZvaWQN DQpNVGludGVyZmFjZTo6SW5pdCAoaW50IGZvcmtlZCkNDQp7DQ0KI2lmIDAN DQogIGZvciAoaW50IGkgPSAwOyBpIDwgTVRfTUFYX0lURU1TOyBpKyspDQ0K ICAgIHsNDQogICAgICB0aHJlYWRsaXN0Lml0ZW1zW2ldID0gTlVMTDsNDQog ICAgICBtdXRleGxpc3QuaXRlbXNbaV0gPSBOVUxMOw0NCiAgICAgIHNlbWFs aXN0Lml0ZW1zW2ldID0gTlVMTDsNDQogICAgfQ0NCg0NCiAgdGhyZWFkbGlz dC5pbmRleCA9IDA7DQ0KICBtdXRleGxpc3QuaW5kZXggPSAwOw0NCiAgc2Vt YWxpc3QuaW5kZXggPSAwOw0NCiNlbmRpZg0NCg0NCiAgcmVlbnRfaW5kZXgg PSBUbHNBbGxvYyAoKTsNDQogIHJlZW50cy5fY2xpYiA9IF9pbXB1cmVfcHRy Ow0NCiAgcmVlbnRzLl93aW5zdXAgPSAmd2luc3VwX3JlZW50Ow0NCg0NCiAg d2luc3VwX3JlZW50Ll9wcm9jZXNzX2xvZ21hc2sgPSBMT0dfVVBUTyAoTE9H X0RFQlVHKTsNDQojaWYgMA0NCiAgd2luc3VwX3JlZW50Ll9ncnBfcG9zID0g MDsNDQogIHdpbnN1cF9yZWVudC5fcHJvY2Vzc19pZGVudCA9IDA7DQ0KICB3 aW5zdXBfcmVlbnQuX3Byb2Nlc3NfbG9nb3B0ID0gMDsNDQogIHdpbnN1cF9y ZWVudC5fcHJvY2Vzc19mYWNpbGl0eSA9IDA7DQ0KI2VuZGlmDQ0KDQ0KICBU bHNTZXRWYWx1ZSAocmVlbnRfaW5kZXgsICZyZWVudHMpOw0NCiAgLy8gdGhl IHN0YXRpYyByZWVudF9kYXRhIHdpbGwgYmUgdXNlZCBpbiB0aGUgbWFpbiB0 aHJlYWQNDQoNDQoNDQogIGlmICghaW5kZXhhbGxvY2F0ZWQpDQ0KICAgIHsN DQogICAgICBpbmRleGFsbG9jYXRlZCA9ICgtMSk7DQ0KICAgICAgdGhyZWFk X3NlbGZfZHdUbHNJbmRleCA9IFRsc0FsbG9jICgpOw0NCiAgICAgIGlmICh0 aHJlYWRfc2VsZl9kd1Rsc0luZGV4ID09IFRMU19PVVRfT0ZfSU5ERVhFUykN DQoJc3lzdGVtX3ByaW50Zg0NCgkgICgibG9jYWwgc3RvcmFnZSBmb3IgdGhy ZWFkIGNvdWxkbid0IGJlIHNldFxuVGhpcyBtZWFucyB0aGF0IHdlIGFyZSBu b3QgdGhyZWFkIHNhZmUhXG4iKTsNDQogICAgfQ0NCg0NCiAgY29uY3VycmVu Y3kgPSAwOw0NCiAgdGhyZWFkY291bnQgPSAxOyAvKiAxIGN1cnJlbnQgdGhy ZWFkIHdoZW4gSW5pdCBvY2N1cnMuKi8NDQoNDQogIG1haW50aHJlYWQud2lu MzJfb2JqX2lkID0gbXlzZWxmLT5oUHJvY2VzczsNDQogIG1haW50aHJlYWQu c2V0VGhyZWFkSWR0b0N1cnJlbnQgKCk7DQ0KICAvKiBzdG9yZSB0aGUgbWFp biB0aHJlYWQncyBzZWxmIHBvaW50ZXIgKi8NDQogIFRsc1NldFZhbHVlICh0 aHJlYWRfc2VsZl9kd1Rsc0luZGV4LCAmbWFpbnRocmVhZCk7DQ0KDQ0KICBp ZiAoZm9ya2VkKQ0NCiAgICByZXR1cm47DQ0KDQ0KICAvKiBwb3NzaWJsZSB0 aGUgYXRmb3JrIGxpc3RzIHNob3VsZCBiZSBpbml0ZWQgaGVyZSBhcyB3ZWxs ICovDQ0KDQ0KICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKQ0NCiAg ICBwc2hhcmVkX211dGV4c1tpXSA9IE5VTEw7DQ0KDQ0KI2lmIDANDQogIGl0 ZW0tPmZ1bmN0aW9uID0gTlVMTDsNDQoNDQogIGl0ZW0tPnNpZ3MgPSBOVUxM Ow0NCiAgaXRlbS0+c2lnbWFzayA9IE5VTEw7DQ0KICBpdGVtLT5zaWd0b2Rv ID0gTlVMTDsNDQojZW5kaWYNDQp9DQ0KDQ0KcHRocmVhZDo6cHRocmVhZCAo KTp2ZXJpZnlhYmxlX29iamVjdCAoUFRIUkVBRF9NQUdJQyksIHdpbjMyX29i al9pZCAoMCksDQ0KY2FuY2Vsc3RhdGUgKDApLCBjYW5jZWx0eXBlICgwKQ0N CnsNDQp9DQ0KDQ0KcHRocmVhZDo6fnB0aHJlYWQgKCkNDQp7DQ0KICBpZiAo d2luMzJfb2JqX2lkKQ0NCiAgICBDbG9zZUhhbmRsZSAod2luMzJfb2JqX2lk KTsNDQp9DQ0KDQ0KDQ0Kdm9pZA0NCnB0aHJlYWQ6OmNyZWF0ZSAodm9pZCAq KCpmdW5jKSAodm9pZCAqKSwgcHRocmVhZF9hdHRyICogbmV3YXR0ciwNDQoJ CSB2b2lkICp0aHJlYWRhcmcpDQ0Kew0NCiAgLyogYWxyZWFkeSBydW5uaW5n ID8gKi8NDQogIGlmICh3aW4zMl9vYmpfaWQpDQ0KICAgIHJldHVybjsNDQoN DQogIGlmIChuZXdhdHRyKQ0NCiAgICB7DQ0KICAgICAgYXR0ci5qb2luYWJs ZSA9IG5ld2F0dHItPmpvaW5hYmxlOw0NCiAgICAgIGF0dHIuY29udGVudGlv bnNjb3BlID0gbmV3YXR0ci0+Y29udGVudGlvbnNjb3BlOw0NCiAgICAgIGF0 dHIuaW5oZXJpdHNjaGVkID0gbmV3YXR0ci0+aW5oZXJpdHNjaGVkOw0NCiAg ICAgIGF0dHIuc3RhY2tzaXplID0gbmV3YXR0ci0+c3RhY2tzaXplOw0NCiAg ICB9DQ0KICBmdW5jdGlvbiA9IGZ1bmM7DQ0KICBhcmcgPSB0aHJlYWRhcmc7 DQ0KDQ0KICB3aW4zMl9vYmpfaWQgPTo6Q3JlYXRlVGhyZWFkICgmc2VjX25v bmVfbmloLCBhdHRyLnN0YWNrc2l6ZSwNDQoJCQkJKExQVEhSRUFEX1NUQVJU X1JPVVRJTkUpIHRocmVhZF9pbml0X3dyYXBwZXIsDQ0KCQkJCXRoaXMsIENS RUFURV9TVVNQRU5ERUQsICZ0aHJlYWRfaWQpOw0NCg0NCiAgaWYgKCF3aW4z Ml9vYmpfaWQpDQ0KICAgIG1hZ2ljID0gMDsNDQogIGVsc2UNDQogICAgew0N CiAgICAgIC8qIEZJWE1FOiBzZXQgdGhlIHByaW9yaXR5IGFwcHJvcHJpYXRl bHkgZm9yIHN5c3RlbSBjb250ZW50aW9uIHNjb3BlICovDQ0KICAgICAgaWYg KGF0dHIuaW5oZXJpdHNjaGVkID09IFBUSFJFQURfRVhQTElDSVRfU0NIRUQp DQ0KCXsNDQoJICAvKiBGSVhNRTogc2V0IHRoZSBzY2hlZHVsaW5nIHNldHRp bmdzIGZvciB0aGUgbmV3IHRocmVhZCAqLw0NCgkgIC8qIHNjaGVkX3RocmVh ZF9zZXRwYXJhbSAod2luMzJfb2JqX2lkLCBhdHRyLnNjaGVkcGFyYW0pOyAq Lw0NCgl9DQ0KICAgICAgUmVzdW1lVGhyZWFkICh3aW4zMl9vYmpfaWQpOw0N CiAgICB9DQ0KfQ0NCg0NCnB0aHJlYWRfYXR0cjo6cHRocmVhZF9hdHRyICgp OnZlcmlmeWFibGVfb2JqZWN0IChQVEhSRUFEX0FUVFJfTUFHSUMpLA0NCmpv aW5hYmxlIChQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSksIGNvbnRlbnRpb25z Y29wZSAoUFRIUkVBRF9TQ09QRV9QUk9DRVNTKSwNDQppbmhlcml0c2NoZWQg KFBUSFJFQURfSU5IRVJJVF9TQ0hFRCksIHN0YWNrc2l6ZSAoMCkNDQp7DQ0K ICBzY2hlZHBhcmFtLnNjaGVkX3ByaW9yaXR5ID0gMDsNDQp9DQ0KDQ0KcHRo cmVhZF9hdHRyOjp+cHRocmVhZF9hdHRyICgpDQ0Kew0NCn0NDQoNDQpwdGhy ZWFkX2NvbmRhdHRyOjpwdGhyZWFkX2NvbmRhdHRyICgpOnZlcmlmeWFibGVf b2JqZWN0DQ0KICAoUFRIUkVBRF9DT05EQVRUUl9NQUdJQyksIHNoYXJlZCAo UFRIUkVBRF9QUk9DRVNTX1BSSVZBVEUpDQ0Kew0NCn0NDQoNDQpwdGhyZWFk X2NvbmRhdHRyOjp+cHRocmVhZF9jb25kYXR0ciAoKQ0NCnsNDQp9DQ0KDQ0K cHRocmVhZF9jb25kOjpwdGhyZWFkX2NvbmQgKHB0aHJlYWRfY29uZGF0dHIg KiBhdHRyKTp2ZXJpZnlhYmxlX29iamVjdCAoUFRIUkVBRF9DT05EX01BR0lD KQ0NCnsNDQogIGludCB0ZW1wZXJyOw0NCiAgdGhpcy0+c2hhcmVkID0gYXR0 ciA/IGF0dHItPnNoYXJlZCA6IFBUSFJFQURfUFJPQ0VTU19QUklWQVRFOw0N CiAgdGhpcy0+bXV0ZXggPSBOVUxMOw0NCiAgdGhpcy0+d2FpdGluZyA9IDA7 DQ0KDQ0KICB0aGlzLT53aW4zMl9vYmpfaWQgPTo6Q3JlYXRlRXZlbnQgKCZz ZWNfbm9uZV9uaWgsIGZhbHNlLAkvKiBhdXRvIHNpZ25hbCByZXNldCAtIHdo aWNoIEkgdGhpbmsgaXMgcHRocmVhZHMgbGlrZSA/ICovDQ0KCQkJCSAgICAg ZmFsc2UsCS8qIHN0YXJ0IG5vbiBzaWduYWxlZCAqLw0NCgkJCQkgICAgIE5V TEwgLyogbm8gbmFtZSAqLyk7DQ0KICAvKiBUT0RPOiBtYWtlIGEgc2hhcmVk IG1lbSBtdXRleCBpZiBvdXQgYXR0cmlidXRlcyByZXF1ZXN0IHNoYXJlZCBt ZW0gY29uZCAqLw0NCiAgY29uZF9hY2Nlc3M9TlVMTDsNDQogIGlmICgodGVt cGVyciA9IHB0aHJlYWRfbXV0ZXhfaW5pdCAoJnRoaXMtPmNvbmRfYWNjZXNz LCBOVUxMKSkpDQ0KICAgIHsNDQogICAgICBzeXN0ZW1fcHJpbnRmICgiY291 bGRuJ3QgaW5pdCBtdXRleCwgdGhpcyAlMHAgZXJybm89JWRcbiIsIHRoaXMs IHRlbXBlcnIpOw0NCiAgICAgIC8qIHdlIG5lZWQgdGhlIG11dGV4IGZvciBj b3JyZWN0IGJlaGF2aW91ciAqLw0NCiAgICAgIG1hZ2ljID0gMDsNDQogICAg fQ0NCg0NCiAgaWYgKCF0aGlzLT53aW4zMl9vYmpfaWQpDQ0KICAgIG1hZ2lj ID0gMDsNDQp9DQ0KDQ0KcHRocmVhZF9jb25kOjp+cHRocmVhZF9jb25kICgp DQ0Kew0NCiAgaWYgKHdpbjMyX29ial9pZCkNDQogICAgQ2xvc2VIYW5kbGUg KHdpbjMyX29ial9pZCk7DQ0KICBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgKCZj b25kX2FjY2Vzcyk7DQ0KfQ0NCg0NCnZvaWQNDQpwdGhyZWFkX2NvbmQ6OkJy b2FkQ2FzdCAoKQ0NCnsNDQogIGlmIChwdGhyZWFkX211dGV4X2xvY2sgKCZj b25kX2FjY2VzcykpDQ0KICAgIHN5c3RlbV9wcmludGYgKCJGYWlsZWQgdG8g bG9jayBjb25kaXRpb24gdmFyaWFibGUgYWNjZXNzIG11dGV4LCB0aGlzICUw cFxuIiwgdGhpcyk7DQ0KICBpbnQgY291bnQgPSB3YWl0aW5nOw0NCiAgaWYg KCF2ZXJpZnlhYmxlX29iamVjdF9pc3ZhbGlkIChtdXRleCwgUFRIUkVBRF9N VVRFWF9NQUdJQykpDQ0KICAgIHsNDQogICAgICBpZiAocHRocmVhZF9tdXRl eF91bmxvY2sgKCZjb25kX2FjY2VzcykpDQ0KCXN5c3RlbV9wcmludGYgKCJG YWlsZWQgdG8gdW5sb2NrIGNvbmRpdGlvbiB2YXJpYWJsZSBhY2Nlc3MgbXV0 ZXgsIHRoaXMgJTBwXG4iLCB0aGlzKTsNDQogICAgICAvKiBUaGlzIGlzbid0 IGFuZCBBUEkgZXJyb3IgLSB1c2VycyBhcmUgYWxsb3dlZCB0byBjYWxsIHRo aXMgd2hlbiBubyB0aHJlYWRzDQ0KCSBhcmUgd2FpdGluZw0NCgkgc3lzdGVt X3ByaW50ZiAoIkJyb2FkY2FzdCBjYWxsZWQgd2l0aCBpbnZhbGlkIG11dGV4 XG4iKTsNDQogICAgICAqLw0NCiAgICAgIHJldHVybjsNDQogICAgfQ0NCiAg d2hpbGUgKGNvdW50LS0pDQ0KICAgIFB1bHNlRXZlbnQgKHdpbjMyX29ial9p ZCk7DQ0KICBpZiAocHRocmVhZF9tdXRleF91bmxvY2sgKCZjb25kX2FjY2Vz cykpDQ0KICAgIHN5c3RlbV9wcmludGYgKCJGYWlsZWQgdG8gdW5sb2NrIGNv bmRpdGlvbiB2YXJpYWJsZSBhY2Nlc3MgbXV0ZXgsIHRoaXMgJTBwXG4iLCB0 aGlzKTsNDQp9DQ0KDQ0Kdm9pZA0NCnB0aHJlYWRfY29uZDo6U2lnbmFsICgp DQ0Kew0NCiAgaWYgKHB0aHJlYWRfbXV0ZXhfbG9jayAoJmNvbmRfYWNjZXNz KSkNDQogICAgc3lzdGVtX3ByaW50ZiAoIkZhaWxlZCB0byBsb2NrIGNvbmRp dGlvbiB2YXJpYWJsZSBhY2Nlc3MgbXV0ZXgsIHRoaXMgJTBwXG4iLCB0aGlz KTsNDQogIGlmICghdmVyaWZ5YWJsZV9vYmplY3RfaXN2YWxpZCAobXV0ZXgs IFBUSFJFQURfTVVURVhfTUFHSUMpKQ0NCiAgICB7DQ0KICAgICAgaWYgKHB0 aHJlYWRfbXV0ZXhfdW5sb2NrICgmY29uZF9hY2Nlc3MpKQ0NCglzeXN0ZW1f cHJpbnRmICgiRmFpbGVkIHRvIHVubG9jayBjb25kaXRpb24gdmFyaWFibGUg YWNjZXNzIG11dGV4LCB0aGlzICUwcFxuIiwNDQoJCSAgICAgICB0aGlzKTsN DQogICAgICByZXR1cm47DQ0KICAgIH0NDQogIGlmICh3YWl0aW5nKQ0NCiAg ICBQdWxzZUV2ZW50ICh3aW4zMl9vYmpfaWQpOw0NCiAgaWYgKHB0aHJlYWRf bXV0ZXhfdW5sb2NrICgmY29uZF9hY2Nlc3MpKQ0NCiAgICBzeXN0ZW1fcHJp bnRmICgiRmFpbGVkIHRvIHVubG9jayBjb25kaXRpb24gdmFyaWFibGUgYWNj ZXNzIG11dGV4LCB0aGlzICUwcFxuIiwgdGhpcyk7DQ0KfQ0NCg0NCmludA0N CnB0aHJlYWRfY29uZDo6VGltZWRXYWl0IChEV09SRCBkd01pbGxpc2Vjb25k cykNDQp7DQ0KICBEV09SRCBydjsNDQogIGlmIChvc19iZWluZ19ydW4gIT0g d2luTlQpDQ0KICAgIHsNDQogICAgICAvLyBGSVhNRTogcmFjZSBjb25kaXRp b24gKHBvdGVudGlhbGx5IGRyb3AgZXZlbnRzDQ0KICAgICAgLy8gUG9zc2li bGUgc29sdXRpb24gKHNpbmdsZSBwcm9jZXNzIG9ubHkpIC0gcGxhY2UgdGhp cyBpbiBhIGNyaXRpY2FsIHNlY3Rpb24uDQ0KICAgICAgUmVsZWFzZU11dGV4 IChtdXRleC0+d2luMzJfb2JqX2lkKTsNDQogICAgICBydiA9IFdhaXRGb3JT aW5nbGVPYmplY3QgKHdpbjMyX29ial9pZCwgZHdNaWxsaXNlY29uZHMpOw0N CiAgICB9DQ0KICBlbHNlDQ0KICAgIHJ2ID0gU2lnbmFsT2JqZWN0QW5kV2Fp dCAobXV0ZXgtPndpbjMyX29ial9pZCwgd2luMzJfb2JqX2lkLCBkd01pbGxp c2Vjb25kcywNDQoJCQkgZmFsc2UpOw0NCiAgc3dpdGNoIChydikNDQogICAg ew0NCiAgICBjYXNlIFdBSVRfRkFJTEVEOg0NCiAgICAgIHJldHVybiAwOwkJ CS8qIFBPU0lYIGRvZXNuJ3QgYWxsb3cgZXJyb3JzIGFmdGVyIHdlIG1vZGlm eSB0aGUgbXV0ZXggc3RhdGUgKi8NDQogICAgY2FzZSBXQUlUX0FCQU5ET05F RDoNDQogICAgY2FzZSBXQUlUX1RJTUVPVVQ6DQ0KICAgICAgcmV0dXJuIEVU SU1FRE9VVDsNDQogICAgY2FzZSBXQUlUX09CSkVDVF8wOg0NCiAgICAgIHJl dHVybiAwOwkJCS8qIHdlIGhhdmUgYmVlbiBzaWduYWxlZCAqLw0NCiAgICBk ZWZhdWx0Og0NCiAgICAgIHJldHVybiAwOw0NCiAgICB9DQ0KfQ0NCg0NCnB0 aHJlYWRfa2V5OjpwdGhyZWFkX2tleSAodm9pZCAoKmRlc3RydWN0b3IpICh2 b2lkICopKTp2ZXJpZnlhYmxlX29iamVjdCAoUFRIUkVBRF9LRVlfTUFHSUMp DQ0Kew0NCiAgZHdUbHNJbmRleCA9IFRsc0FsbG9jICgpOw0NCiAgaWYgKGR3 VGxzSW5kZXggPT0gVExTX09VVF9PRl9JTkRFWEVTKQ0NCiAgICBtYWdpYyA9 IDA7DQ0KICBlbHNlIGlmIChkZXN0cnVjdG9yKQ0NCiAgICB7DQ0KICAgICAg TVRfSU5URVJGQUNFLT5kZXN0cnVjdG9ycy4NDQoJSW5zZXJ0IChuZXcgcHRo cmVhZF9rZXlfZGVzdHJ1Y3RvciAoZGVzdHJ1Y3RvciwgdGhpcykpOw0NCiAg ICB9DQ0KfQ0NCg0NCnB0aHJlYWRfa2V5Ojp+cHRocmVhZF9rZXkgKCkNDQp7 DQ0KICBpZiAocHRocmVhZF9rZXlfZGVzdHJ1Y3RvciAqIGRlc3QgPSBNVF9J TlRFUkZBQ0UtPmRlc3RydWN0b3JzLlJlbW92ZSAodGhpcykpDQ0KICAgIGRl bGV0ZSBkZXN0Ow0NCiAgVGxzRnJlZSAoZHdUbHNJbmRleCk7DQ0KfQ0NCg0N CmludA0NCnB0aHJlYWRfa2V5OjpzZXQgKGNvbnN0IHZvaWQgKnZhbHVlKQ0N CnsNDQogIC8qIHRoZSBPUyBmdW5jdGlvbiBkb2Vzbid0IHBlcmZvcm0gZXJy b3IgY2hlY2tpbmcgKi8NDQogIFRsc1NldFZhbHVlIChkd1Rsc0luZGV4LCAo dm9pZCAqKSB2YWx1ZSk7DQ0KICByZXR1cm4gMDsNDQp9DQ0KDQ0Kdm9pZCAq DQ0KcHRocmVhZF9rZXk6OmdldCAoKQ0NCnsNDQogIHNldF9lcnJubyAoMCk7 DQ0KICByZXR1cm4gVGxzR2V0VmFsdWUgKGR3VGxzSW5kZXgpOw0NCn0NDQoN DQojZGVmaW5lIFNZU19CQVNFICh1bnNpZ25lZCBjaGFyKSAweEMwDQ0KLy8g Tm90ZTogdGhlIG9yZGVyIGlzIGltcG9ydGFudC4gVGhpcyBpcyBhbiBvdmVy bG9hZGVkIHB0aHJlYWRfbXV0ZXhfdCBmcm9tDQ0KLy8gdXNlcmxhbmQNDQp0 eXBlZGVmIHN0cnVjdCBfcHNoYXJlZF9tdXRleCB7DQ0KIHVuc2lnbmVkIGNo YXIgaWQ7DQ0KIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQ7DQ0KIHVuc2lnbmVk IGNoYXIgcmVzZXJ2ZWQyOw0NCiB1bnNpZ25lZCBjaGFyIGZsYWdzOw0NCn0g cHNoYXJlZF9tdXRleDsNDQoNDQovKiBwc2hhcmVkIG11dGV4czoNDQogKiB0 aGUgbXV0ZXhfdCAoc2l6ZSA0KSBpcyBub3QgdXNlZCBhcyBhIHZlcmlmeWFi bGUgb2JqZWN0IGJlY2F1c2Ugd2UgY2Fubm90DQ0KICogZ3VhcmFudGVlIHRo ZSBzYW1lIGFkZHJlc3Mgc3BhY2UgZm9yIGFsbCBwcm9jZXNzZXMuDQ0KICog d2UgdXNlIHRoZSBmb2xsb3dpbmc6DQ0KICogaGlnaCBiaXQgc2V0IChuZXZl ciBhIHZhbGlkIGFkZHJlc3MpLg0NCiAqIHNlY29uZCBieXRlIGlzIHJlc2Vy dmVkIGZvciB0aGUgcHJpb3JpdHkuDQ0KICogdGhpcmQgYnl0ZSBpcyByZXNl cnZlZA0NCiAqIGZvdXJ0aCBieXRlIGlzIHRoZSBtdXRleCBpZC4gKG1heCAy NTUgY3lnd2luIG11dGV4cyBzeXN0ZW0gd2lkZSkuDQ0KICogY3JlYXRpbmcg bXV0ZXgncyBkb2VzIGdldCBzbG93ZXIgYW5kIHNsb3dlciwgYnV0IGFzIGNy ZWF0aW9uIGlzIGEgb25lIHRpbWUNDQogKiBqb2IsIGl0IHNob3VsZCBuZXZl ciBiZWNvbWUgYW4gaXNzdWUNDQogKg0NCiAqIEFuZCBpZiB5b3UncmUgbG9v a2luZyBhdCB0aGlzIGFuZCB0aGlua2luZywgd2h5IG5vdCBhbiBhcnJheSBp biBjeWd3aW4gZm9yIGFsbCBtdXRleHMsDQ0KICogLSB5b3UgaW5jdXIgYSBw ZW5hbHR5IG9uIF9ldmVyeV8gbXV0ZXggY2FsbCBhbmQgeW91IGhhdmUgdG9z ZXJpYWxpc2UgdGhlbSBhbGwuDQ0KICogLi4uIEJhZCBrYXJtYS4NDQogKg0N CiAqIG9wdGlvbiAyPyBwdXQgZXZlcnl0aGluZyBpbiB1c2Vyc3BhY2UgYW5k IHVwZGF0ZSB0aGUgQUJJPw0NCiAqIC0gYmFkIGthcm1hIGFzIHdlbGwgLSB0 aGUgSEFORExFLCB3aGlsZSBpZGVudGljYWwgYWNyb3NzIHByb2Nlc3MncywN DQogKiBJc24ndCBkdXBsaWNhdGVkLCBpdCdzIHJlb3BlbmVkLg0NCiAqLw0N Cg0NCnB0aHJlYWRfbXV0ZXg6OnB0aHJlYWRfbXV0ZXggKHVuc2lnbmVkIHNo b3J0IGlkKTp2ZXJpZnlhYmxlX29iamVjdCAoUFRIUkVBRF9NVVRFWF9NQUdJ QykNDQp7DQ0KICAvL0ZJWE1FOiBzZXQgYW4gYXBwcm9wcmlhdGUgc2VjdXJp dHkgbWFzayAtIHByb2JhYmx5IGV2ZXJ5b25lLg0NCiAgaWYgKE1UX0lOVEVS RkFDRS0+cHNoYXJlZF9tdXRleHNbaWRdKQ0NCiAgICByZXR1cm47DQ0KICBj aGFyIHN0cmluZ2J1ZlsyOV07DQ0KICBzbnByaW50ZiAoc3RyaW5nYnVmLCAy OSwgIkNZR1dJTk1VVEVYMHglMHgiLCBpZCAmIDB4MDAwZik7DQ0KICBzeXN0 ZW1fcHJpbnRmICgibmFtZSBvZiBtdXRleCB0byB0cmFuc3BhcmVudGx5IG9w ZW4gJXNcbiIsc3RyaW5nYnVmKTsNDQogIHRoaXMtPndpbjMyX29ial9pZCA9 OjpDcmVhdGVNdXRleCAoJnNlY19ub25lX25paCwgZmFsc2UsIHN0cmluZ2J1 Zik7DQ0KICBpZiAod2luMzJfb2JqX2lkPT0wIHx8ICh3aW4zMl9vYmpfaWQg JiYgR2V0TGFzdEVycm9yICgpICE9IEVSUk9SX0FMUkVBRFlfRVhJU1RTKSkN DQogICAgew0NCiAgICAgIC8vIHRoZSBtdXRleCBoYXMgYmVlbiBkZWxldGVk IG9yIHdlIGNvdWxkbid0IGdldCBhY2Nlc3MuDQ0KCS8vIHRoZSBlcnJvcl9h bHJlYWR5X2V4aXN0cyB0ZXN0IGlzIGJlY2F1c2Ugd2UgYXJlIG9ubHkgb3Bl bmluZyBhbg0NCgkvLyBleGlzdGludCBtdXRleCBoZXJlDQ0KICAgICAgc3lz dGVtX3ByaW50ZiAoImNvdWxkbid0IGdldCBwc2hhcmVkIG11dGV4ICV4LCAl ZFxuIix3aW4zMl9vYmpfaWQsIEdldExhc3RFcnJvciAoKSk7DQ0KICAgICAg Q2xvc2VIYW5kbGUgKHdpbjMyX29ial9pZCk7DQ0KICAgICAgbWFnaWMgPSAw Ow0NCiAgICAgIHdpbjMyX29ial9pZCA9IE5VTEw7DQ0KICAgICAgcmV0dXJu Ow0NCiAgICB9DQ0KICBwc2hhcmVkID0gUFRIUkVBRF9QUk9DRVNTX1NIQVJF RDsNDQoNDQogIE1UX0lOVEVSRkFDRS0+cHNoYXJlZF9tdXRleHNbaWRdID0g dGhpczsNDQp9DQ0KDQ0KcHRocmVhZF9tdXRleDo6cHRocmVhZF9tdXRleCAo cHRocmVhZF9tdXRleF90ICptdXRleCwgcHRocmVhZF9tdXRleGF0dHIgKiBh dHRyKTp2ZXJpZnlhYmxlX29iamVjdCAoUFRIUkVBRF9NVVRFWF9NQUdJQykN DQp7DQ0KICAvKiBhdHRyIGNoZWNrZWQgaW4gdGhlIEMgY2FsbCAqLw0NCiAg aWYgKGF0dHIgJiYgYXR0ci0+cHNoYXJlZD09UFRIUkVBRF9QUk9DRVNTX1NI QVJFRCkNDQogICAgew0NCiAgICAgIC8vRklYTUU6IHNldCBhbiBhcHByb3By aWF0ZSBzZWN1cml0eSBtYXNrIC0gcHJvYmFibHkgZXZlcnlvbmUuDQ0KICAg ICAgLy8gVGhpcyBkb2VzIG9wZW4gYSBELk8uUy4gLSB0aGUgbmFtZSBpcyBn dWVzc2FibGUgKGlmIHlvdSBhcmUgd2lsbGluZyB0byBydW4NDQogICAgICAv LyB0aHJ1IGFsbCBwb3NzaWJsZSBhZGRyZXNzIHZhbHVlcyA6XQ0NCiAgICAg IGNoYXIgc3RyaW5nYnVmWzI5XTsNDQogICAgICB1bnNpZ25lZCBzaG9ydCBp ZCA9IDE7DQ0KICAgICAgd2hpbGUgKGlkIDwgMjU2KQ0NCgl7DQ0KCSAgc25w cmludGYgKHN0cmluZ2J1ZiwgMjksICJDWUdXSU5NVVRFWDB4JTB4IiwgaWQg JiAweDAwMGYpOw0NCgkgIHN5c3RlbV9wcmludGYgKCJuYW1lIG9mIG11dGV4 IHRvIGNyZWF0ZSAlc1xuIixzdHJpbmdidWYpOw0NCgkgIHRoaXMtPndpbjMy X29ial9pZCA9OjpDcmVhdGVNdXRleCAoJnNlY19ub25lX25paCwgZmFsc2Us IHN0cmluZ2J1Zik7DQ0KCSAgaWYgKHRoaXMtPndpbjMyX29ial9pZCAmJiBH ZXRMYXN0RXJyb3IgKCkgIT0gRVJST1JfQUxSRUFEWV9FWElTVFMpDQ0KCSAg ICB7DQ0KCSAgICAgIE1UX0lOVEVSRkFDRS0+cHNoYXJlZF9tdXRleHNbaWRd ID0gdGhpczsNDQoJICAgICAgcHNoYXJlZF9tdXRleCAqcG11dGV4PShwc2hh cmVkX211dGV4ICopKG11dGV4KTsNDQoJICAgICAgcG11dGV4LT5pZCA9IGlk Ow0NCgkgICAgICBwbXV0ZXgtPmZsYWdzID0gU1lTX0JBU0U7DQ0KCSAgICAg IHBzaGFyZWQgPSBQVEhSRUFEX1BST0NFU1NfU0hBUkVEOw0NCgkgICAgICBj b25kd2FpdHMgPSAwOw0NCgkgICAgICByZXR1cm47DQ0KCSAgICB9DQ0KCSAg aWQrKzsNDQoJICBDbG9zZUhhbmRsZSAod2luMzJfb2JqX2lkKTsNDQoJfQ0N CiAgICAgIG1hZ2ljID0gMDsNDQogICAgICB3aW4zMl9vYmpfaWQgPSBOVUxM Ow0NCiAgICB9DQ0KICBlbHNlDQ0KICAgIHsNDQogICAgICB0aGlzLT53aW4z Ml9vYmpfaWQgPTo6Q3JlYXRlTXV0ZXggKCZzZWNfbm9uZV9uaWgsIGZhbHNl LCBOVUxMKTsNDQoNDQogICAgICBpZiAoIXdpbjMyX29ial9pZCkNDQoJbWFn aWMgPSAwOw0NCiAgICAgIGNvbmR3YWl0cyA9IDA7DQ0KICAgICAgcHNoYXJl ZCA9IFBUSFJFQURfUFJPQ0VTU19QUklWQVRFOw0NCiAgICB9DQ0KfQ0NCg0N CnB0aHJlYWRfbXV0ZXg6OnB0aHJlYWRfbXV0ZXggKHB0aHJlYWRfbXV0ZXhh dHRyICogYXR0cik6dmVyaWZ5YWJsZV9vYmplY3QgKFBUSFJFQURfTVVURVhf TUFHSUMpDQ0Kew0NCiAgLyogYXR0ciBjaGVja2VkIGluIHRoZSBDIGNhbGwg Ki8NDQogIGlmIChhdHRyICYmIGF0dHItPnBzaGFyZWQ9PVBUSFJFQURfUFJP Q0VTU19TSEFSRUQpDQ0KICAgIHsNDQogICAgICAvKiBmb3IgcHNoYXJlZCBt dXRleCdzIHdlIG5lZWQgdGhlIG11dGV4IGFkZHJlc3MgKi8NDQogICAgICBt YWdpYyA9IDA7DQ0KICAgICAgcmV0dXJuOw0NCiAgICB9DQ0KDQ0KICB0aGlz LT53aW4zMl9vYmpfaWQgPTo6Q3JlYXRlTXV0ZXggKCZzZWNfbm9uZV9uaWgs IGZhbHNlLCBOVUxMKTsNDQoNDQogIGlmICghd2luMzJfb2JqX2lkKQ0NCiAg ICBtYWdpYyA9IDA7DQ0KICBjb25kd2FpdHMgPSAwOw0NCiAgcHNoYXJlZCA9 IFBUSFJFQURfUFJPQ0VTU19QUklWQVRFOw0NCn0NDQoNDQpwdGhyZWFkX211 dGV4Ojp+cHRocmVhZF9tdXRleCAoKQ0NCnsNDQogIGlmICh3aW4zMl9vYmpf aWQpDQ0KICAgIENsb3NlSGFuZGxlICh3aW4zMl9vYmpfaWQpOw0NCiAgd2lu MzJfb2JqX2lkID0gTlVMTDsNDQp9DQ0KDQ0KaW50DQ0KcHRocmVhZF9tdXRl eDo6TG9jayAoKQ0NCnsNDQogIHJldHVybiBXYWl0Rm9yU2luZ2xlT2JqZWN0 ICh3aW4zMl9vYmpfaWQsIElORklOSVRFKTsNDQp9DQ0KDQ0KaW50DQ0KcHRo cmVhZF9tdXRleDo6VHJ5TG9jayAoKQ0NCnsNDQogIHJldHVybiBXYWl0Rm9y U2luZ2xlT2JqZWN0ICh3aW4zMl9vYmpfaWQsIDApOw0NCn0NDQoNDQppbnQN DQpwdGhyZWFkX211dGV4OjpVbkxvY2sgKCkNDQp7DQ0KICByZXR1cm4gUmVs ZWFzZU11dGV4ICh3aW4zMl9vYmpfaWQpOw0NCn0NDQoNDQpwdGhyZWFkX211 dGV4ICoqDQ0KX19wdGhyZWFkX211dGV4X2dldHBzaGFyZWQgKHB0aHJlYWRf bXV0ZXhfdCAqbXV0ZXgpDQ0Kew0NCiAgaWYgKCgoKHBzaGFyZWRfbXV0ZXgg KikobXV0ZXgpKS0+ZmxhZ3MgJiBTWVNfQkFTRSkgIT0gU1lTX0JBU0UpDQ0K ICAgIHJldHVybiAocHRocmVhZF9tdXRleCAqKikgbXV0ZXg7DQ0KICBwc2hh cmVkX211dGV4ICpwbXV0ZXg9KHBzaGFyZWRfbXV0ZXggKikobXV0ZXgpOw0N CiAgaWYgKChNVF9JTlRFUkZBQ0UtPnBzaGFyZWRfbXV0ZXhzW3BtdXRleC0+ aWRdKSAhPSBOVUxMKQ0NCiAgICByZXR1cm4gJihNVF9JTlRFUkZBQ0UtPnBz aGFyZWRfbXV0ZXhzW3BtdXRleC0+aWRdKTsNDQogIC8qIGF0dGVtcHQgdG8g Z2V0IHRoZSBleGlzdGluZyBtdXRleCAqLw0NCiAgcHRocmVhZF9tdXRleCAq IG5ld211dGV4Ow0NCiAgbmV3bXV0ZXggPSBuZXcgcHRocmVhZF9tdXRleCAo cG11dGV4LT5pZCk7DQ0KICBpZiAoIXZlcmlmeWFibGVfb2JqZWN0X2lzdmFs aWQgKG5ld211dGV4LCBQVEhSRUFEX01VVEVYX01BR0lDKSkNDQogIHsNDQog ICAgZGVsZXRlIChuZXdtdXRleCk7DQ0KICAgIE1UX0lOVEVSRkFDRS0+cHNo YXJlZF9tdXRleHNbcG11dGV4LT5pZF0gPSBOVUxMOw0NCiAgICByZXR1cm4g JihNVF9JTlRFUkZBQ0UtPnBzaGFyZWRfbXV0ZXhzWzBdKTsNDQogIH0NDQog IHJldHVybiAmKE1UX0lOVEVSRkFDRS0+cHNoYXJlZF9tdXRleHNbcG11dGV4 LT5pZF0pOw0NCn0NDQoNDQpwdGhyZWFkX211dGV4YXR0cjo6cHRocmVhZF9t dXRleGF0dHIgKCk6dmVyaWZ5YWJsZV9vYmplY3QgKFBUSFJFQURfTVVURVhB VFRSX01BR0lDKSwNDQpwc2hhcmVkIChQVEhSRUFEX1BST0NFU1NfUFJJVkFU RSksIG11dGV4dHlwZSAoUFRIUkVBRF9NVVRFWF9ERUZBVUxUKQ0NCnsNDQp9 DQ0KDQ0KcHRocmVhZF9tdXRleGF0dHI6On5wdGhyZWFkX211dGV4YXR0ciAo KQ0NCnsNDQp9DQ0KDQ0Kc2VtYXBob3JlOjpzZW1hcGhvcmUgKGludCBwc2hh cmVkLCB1bnNpZ25lZCBpbnQgdmFsdWUpOnZlcmlmeWFibGVfb2JqZWN0IChT RU1fTUFHSUMpDQ0Kew0NCiAgdGhpcy0+d2luMzJfb2JqX2lkID06OkNyZWF0 ZVNlbWFwaG9yZSAoJnNlY19ub25lX25paCwgdmFsdWUsIExPTkdfTUFYLA0N CgkJCQkJIE5VTEwpOw0NCiAgaWYgKCF0aGlzLT53aW4zMl9vYmpfaWQpDQ0K ICAgIG1hZ2ljID0gMDsNDQogIHRoaXMtPnNoYXJlZCA9IHBzaGFyZWQ7DQ0K fQ0NCg0NCnNlbWFwaG9yZTo6fnNlbWFwaG9yZSAoKQ0NCnsNDQogIGlmICh3 aW4zMl9vYmpfaWQpDQ0KICAgIENsb3NlSGFuZGxlICh3aW4zMl9vYmpfaWQp Ow0NCn0NDQoNDQp2b2lkDQ0Kc2VtYXBob3JlOjpQb3N0ICgpDQ0Kew0NCiAg bG9uZyBwYzsNDQogIFJlbGVhc2VTZW1hcGhvcmUgKHdpbjMyX29ial9pZCwg MSwgJnBjKTsNDQp9DQ0KDQ0KaW50DQ0Kc2VtYXBob3JlOjpUcnlXYWl0ICgp DQ0Kew0NCiAgLyogRklYTUU6IHNpZ25hbHMgc2hvdWxkIGJlIGFibGUgdG8g aW50ZXJydXB0IHNlbWFwaG9yZXMuLi4NDQogICAqIFdlIHByb2JhYmx5IG5l ZWQgV2FpdEZvck11bHRpcGxlT2JqZWN0cyBoZXJlLg0NCiAgICovDQ0KICBp ZiAoV2FpdEZvclNpbmdsZU9iamVjdCAod2luMzJfb2JqX2lkLCAwKSA9PSBX QUlUX1RJTUVPVVQpDQ0KICAgIHJldHVybiBFQUdBSU47DQ0KICBlbHNlDQ0K ICAgIHJldHVybiAwOw0NCn0NDQoNDQp2b2lkDQ0Kc2VtYXBob3JlOjpXYWl0 ICgpDQ0Kew0NCiAgV2FpdEZvclNpbmdsZU9iamVjdCAod2luMzJfb2JqX2lk LCBJTkZJTklURSk7DQ0KfQ0NCg0NCnZlcmlmeWFibGVfb2JqZWN0Ojp2ZXJp ZnlhYmxlX29iamVjdCAobG9uZyB2ZXJpZnllcik6DQ0KbWFnaWMgKHZlcmlm eWVyKQ0NCnsNDQp9DQ0KDQ0KdmVyaWZ5YWJsZV9vYmplY3Q6On52ZXJpZnlh YmxlX29iamVjdCAoKQ0NCnsNDQogIG1hZ2ljID0gMDsNDQp9DQ0KDQ0KLyog R2VuZXJpYyBtZW1vcnkgYWNjY2VzcyByb3V0aW5lIC0gd2hlcmUgc2hvdWxk IGl0IGxpdmUgPyAqLw0NCmludCBfX3N0ZGNhbGwNDQpjaGVja192YWxpZF9w b2ludGVyICh2b2lkICpwb2ludGVyKQ0NCnsNDQogIGlmICghcG9pbnRlciB8 fCBJc0JhZFdyaXRlUHRyIChwb2ludGVyLCBzaXplb2YgKHZlcmlmeWFibGVf b2JqZWN0KSkpDQ0KICAgIHJldHVybiBFRkFVTFQ7DQ0KICByZXR1cm4gMDsN DQp9DQ0KDQ0KaW50DQ0KdmVyaWZ5YWJsZV9vYmplY3RfaXN2YWxpZCAodmVy aWZ5YWJsZV9vYmplY3QgKiBvYmplY3QsIGxvbmcgbWFnaWMpDQ0Kew0NCiAg aWYgKCFvYmplY3QpDQ0KICAgIHJldHVybiAwOw0NCiAgaWYgKGNoZWNrX3Zh bGlkX3BvaW50ZXIgKG9iamVjdCkpDQ0KICAgIHJldHVybiAwOw0NCiAgaWYg KG9iamVjdC0+bWFnaWMgIT0gbWFnaWMpDQ0KICAgIHJldHVybiAwOw0NCiAg cmV0dXJuIC0xOw0NCn0NDQoNDQovKiAgUHRocmVhZHMgKi8NDQp2b2lkICoN DQp0aHJlYWRfaW5pdF93cmFwcGVyICh2b2lkICpfYXJnKQ0NCnsNDQogIC8v IFNldHVwIHRoZSBsb2NhbC9nbG9iYWwgc3RvcmFnZSBvZiB0aGlzIHRocmVh ZA0NCg0NCiAgcHRocmVhZCAqdGhyZWFkID0gKHB0aHJlYWQgKikgX2FyZzsN DQogIHN0cnVjdCBfX3JlZW50X3QgbG9jYWxfcmVlbnQ7DQ0KICBzdHJ1Y3Qg X3dpbnN1cF90IGxvY2FsX3dpbnN1cDsNDQogIHN0cnVjdCBfcmVlbnQgbG9j YWxfY2xpYiA9IF9SRUVOVF9JTklUKGxvY2FsX2NsaWIpOw0NCg0NCiAgc3Ry dWN0IHNpZ2FjdGlvbiBfc2lnc1tOU0lHXTsNDQogIHNpZ3NldF90IF9zaWdf bWFzazsJCS8qIG9uZSBzZXQgZm9yIGV2ZXJ5dGhpbmcgdG8gaWdub3JlLiAq Lw0NCiAgTE9ORyBfc2lndG9kb1tOU0lHICsgX19TSUdPRkZTRVRdOw0NCg0N CiAgLy8gc2V0dXAgc2lnbmFsIHN0cnVjdHVyZXMNDQogIHRocmVhZC0+c2ln cyA9IF9zaWdzOw0NCiAgdGhyZWFkLT5zaWdtYXNrID0gJl9zaWdfbWFzazsN DQogIHRocmVhZC0+c2lndG9kbyA9IF9zaWd0b2RvOw0NCg0NCiAgbWVtc2V0 ICgmbG9jYWxfd2luc3VwLCAwLCBzaXplb2YgKHN0cnVjdCBfd2luc3VwX3Qp KTsNDQoNDQogIGxvY2FsX3JlZW50Ll9jbGliID0gJmxvY2FsX2NsaWI7DQ0K ICBsb2NhbF9yZWVudC5fd2luc3VwID0gJmxvY2FsX3dpbnN1cDsNDQoNDQog IGxvY2FsX3dpbnN1cC5fcHJvY2Vzc19sb2dtYXNrID0gTE9HX1VQVE8gKExP R19ERUJVRyk7DQ0KDQ0KICAvKiBUaGlzIGlzIG5vdCBjaGVja2VkIGJ5IHRo ZSBPUyAhISAqLw0NCiAgaWYgKCFUbHNTZXRWYWx1ZSAoTVRfSU5URVJGQUNF LT5yZWVudF9pbmRleCwgJmxvY2FsX3JlZW50KSkNDQogICAgc3lzdGVtX3By aW50ZiAoImxvY2FsIHN0b3JhZ2UgZm9yIHRocmVhZCBjb3VsZG4ndCBiZSBz ZXQiKTsNDQoNDQogIC8qIHRoZSBPUyBkb2Vzbid0IGNoZWNrIHRoaXMgZm9y IDw9NjQgVGxzIGVudHJpZXMgKHByZSB3aW4yaykgKi8NDQogIFRsc1NldFZh bHVlIChNVF9JTlRFUkZBQ0UtPnRocmVhZF9zZWxmX2R3VGxzSW5kZXgsIHRo cmVhZCk7DQ0KDQ0KI2lmZGVmIF9DWUdfVEhSRUFEX0ZBSUxTQUZFDQ0KICBp ZiAoX1JFRU5UID09IF9pbXB1cmVfcHRyKQ0NCiAgICBzeXN0ZW1fcHJpbnRm ICgibG9jYWwgc3RvcmFnZSBmb3IgdGhyZWFkIGlzbid0IHNldHVwIGNvcnJl Y3RseSIpOw0NCiNlbmRpZg0NCg0NCiAgdGhyZWFkX3ByaW50ZiAoInN0YXJ0 ZWQgdGhyZWFkICVwICVwICVwICVwICVwICVwIiwgX2FyZywgJmxvY2FsX2Ns aWIsDQ0KCQkgX2ltcHVyZV9wdHIsIHRocmVhZCwgdGhyZWFkLT5mdW5jdGlv biwgdGhyZWFkLT5hcmcpOw0NCg0NCiAgLy8gY2FsbCB0aGUgdXNlcidzIHRo cmVhZA0NCiAgdm9pZCAqcmV0ID0gdGhyZWFkLT5mdW5jdGlvbiAodGhyZWFk LT5hcmcpOw0NCg0NCiAgX19wdGhyZWFkX2V4aXQgKHJldCk7DQ0KDQ0KI2lm IDANDQovLyA/Pz8gVGhpcyBjb2RlIG9ubHkgcnVucyBpZiB0aGUgdGhyZWFk IGV4aXRzIGJ5IHJldHVybmluZy4NDQovLyBpdCdzIGFsbCBub3cgaW4gX19w dGhyZWFkX2V4aXQgKCk7DQ0KI2VuZGlmDQ0KICAvKiBuZXZlciByZWFjaGVk ICovDQ0KICByZXR1cm4gMDsNDQp9DQ0KDQ0KaW50DQ0KX19wdGhyZWFkX2Ny ZWF0ZSAocHRocmVhZF90ICogdGhyZWFkLCBjb25zdCBwdGhyZWFkX2F0dHJf dCAqIGF0dHIsDQ0KCQkgIHZvaWQgKigqc3RhcnRfcm91dGluZSkgKHZvaWQg KiksIHZvaWQgKmFyZykNDQp7DQ0KICBpZiAoYXR0ciAmJiAhdmVyaWZ5YWJs ZV9vYmplY3RfaXN2YWxpZCAoKmF0dHIsIFBUSFJFQURfQVRUUl9NQUdJQykp DQ0KICAgIHJldHVybiBFSU5WQUw7DQ0KDQ0KICAqdGhyZWFkID0gbmV3IHB0 aHJlYWQgKCk7DQ0KICAoKnRocmVhZCktPmNyZWF0ZSAoc3RhcnRfcm91dGlu ZSwgYXR0ciA/ICphdHRyIDogTlVMTCwgYXJnKTsNDQogIGlmICghdmVyaWZ5 YWJsZV9vYmplY3RfaXN2YWxpZCAoKnRocmVhZCwgUFRIUkVBRF9NQUdJQykp DQ0KICAgIHsNDQogICAgICBkZWxldGUgKCp0aHJlYWQpOw0NCiAgICAgICp0 aHJlYWQgPSBOVUxMOw0NCiAgICAgIHJldHVybiBFQUdBSU47DQ0KICAgIH0N DQogIEludGVybG9ja2VkSW5jcmVtZW50ICgmTVRfSU5URVJGQUNFLT50aHJl YWRjb3VudCk7DQ0KDQ0KICByZXR1cm4gMDsNDQp9DQ0KDQ0KaW50DQ0KX19w dGhyZWFkX29uY2UgKHB0aHJlYWRfb25jZV90ICogb25jZV9jb250cm9sLCB2 b2lkICgqaW5pdF9yb3V0aW5lKSAodm9pZCkpDQ0Kew0NCiAgcHRocmVhZF9t dXRleF9sb2NrICgmb25jZV9jb250cm9sLT5tdXRleCk7DQ0KICAvKiBIZXJl IHdlIG11c3Qgc2V0IGEgY2FuY2VsbGF0aW9uIGhhbmRsZXIgdG8gdW5sb2Nr IHRoZSBtdXRleCBpZiBuZWVkZWQgKi8NDQogIC8qIGJ1dCBhIGNhbmNlbGxh dGlvbiBoYW5kbGVyIGlzIG5vdCB0aGUgcmlnaHQgdGhpbmcuIFdlIG5lZWQg dGhpcyBpbiB0aGUgdGhyZWFkDQ0KICAgKiBjbGVhbnVwIHJvdXRpbmUuIEFz c3VtcHRpb246IGEgdGhyZWFkIGNhbiBvbmx5IGJlIGluIG9uZSBwdGhyZWFk X29uY2Ugcm91dGluZQ0NCiAgICogYXQgYSB0aW1lLiBTdG90ZSBhIG11dGV4 X3QgKiBpbiB0aGUgcHRocmVhZF9zdHJ1Y3R1cmUuIGlmIHRoYXQncyBub24g bnVsbCB1bmxvY2sNDQogICAqIG9uIHB0aHJlYWRfZXhpdCAoKTsNDQogICAq Lw0NCiAgaWYgKG9uY2VfY29udHJvbC0+c3RhdGUgPT0gMCkNDQogICAgew0N CiAgICAgIGluaXRfcm91dGluZSAoKTsNDQogICAgICBvbmNlX2NvbnRyb2wt PnN0YXRlID0gMTsNDQogICAgfQ0NCiAgLyogSGVyZSB3ZSBtdXN0IHJlbW92 ZSBvdXIgY2FuY2VsbGF0aW9uIGhhbmRsZXIgKi8NDQogIHB0aHJlYWRfbXV0 ZXhfdW5sb2NrICgmb25jZV9jb250cm9sLT5tdXRleCk7DQ0KICByZXR1cm4g MDsNDQp9DQ0KDQ0KLyogQ2FuY2VsYWJpbGl0eSBzdGF0ZXMgKi8NDQoNDQoN DQovKiBQZXJmb3JtIHRoZSBhY3R1YWwgY2FuY2VsICovDQ0Kdm9pZA0NCl9f cHRocmVhZF9jbGVhbnVwIChwdGhyZWFkX3QgdGhyZWFkKQ0NCnsNDQp9DQ0K DQ0KDQ0KaW50DQ0KX19wdGhyZWFkX2NhbmNlbCAocHRocmVhZF90IHRocmVh ZCkNDQp7DQ0KICBpZiAoIXZlcmlmeWFibGVfb2JqZWN0X2lzdmFsaWQgKHRo cmVhZCwgUFRIUkVBRF9NQUdJQykpDQ0KICAgIHJldHVybiBFU1JDSDsNDQog IGlmICh0aHJlYWQtPmNhbmNlbHN0YXRlID09IFBUSFJFQURfQ0FOQ0VMX0VO QUJMRSkNDQogICAgew0NCiNpZiAwDQ0KICAgICAgLyogb25jZSBhbGwgdGhl IGZ1bmN0aW9ucyBjYWxsIHRlc3RjYW5jZWwgKCksIHdlIHdpbGwgZG8gdGhp cyAqLw0NCiAgICAgIGlmICh0aHJlYWQtPmNhbmNlbHR5cGUgPT0gUFRIUkVB RF9DQU5DRUxfREVGRVJSRUQpDQ0KCXsNDQoJfQ0NCiAgICAgIGVsc2UNDQoJ ew0NCgkgIC8qIHBvc3NpYmxlIEZJWE1FOiB0aGlzIGZ1bmN0aW9uIGlzIG1l YW50IHRvIHJldHVybiBhc3luY2hyb25vdXNseQ0NCgkgICAqIGZyb20gdGhl IGNhbmNlbGxhdGlvbiByb3V0aW5lIGFjdHVhbGx5IGZpcmluZy4gU28gd2Ug bWF5IG5lZWQgc29tZSBzb3J0DQ0KCSAgICogb2Ygc2lnbmFsIHRvIGJlIHNl bnQgdGhhdCBpcyBpbW1lZGlhdGVseSByZWNpZXZlZCBhbmQgYWN0ZWQgb24u DQ0KCSAgICovDQ0KCSAgX19wdGhyZWFkX2NsZWFudXAgKHRocmVhZCk7DQ0K CX0NDQojZW5kaWYNDQogICAgfQ0NCi8qICByZXR1cm4gMDsNDQoqLw0NCg0N CiAgcmV0dXJuIEVTUkNIOw0NCi8qDQ0KICB3ZSByZXR1cm4gRVNSQ0ggdW50 aWwgYWxsIHRoZSByZXF1aXJlZCBmdW5jdGlvbnMgY2FsbCB0ZXN0Y2FuY2Vs ICgpOw0NCiAgdGhpcyB3aWxsIGdpdmUgYXBwbGljYXRpb25zIHByZWRpY3Rh YmxlIGJlaGF2aW91ci4NDQoNDQogIHRoZSByZXF1aXJlZCBmdW5jdGlvbiBs aXN0IGlzOiAqIGluZGljYXRlcyBkb25lLCBYIGluZGljYXRlcyBub3QgcHJl c2VudCBpbiBjeWd3aW4uDQ0KYWlvX3N1c3BlbmQgKCkNDQoqY2xvc2UgKCkN DQoqY3JlYXQgKCkNDQpmY250bCAoKQ0NCmZzeW5jICgpDQ0KZ2V0bXNnICgp DQ0KZ2V0cG1zZyAoKQ0NCmxvY2tmICgpDQ0KbXFfcmVjZWl2ZSAoKQ0NCm1x X3NlbmQgKCkNDQptc2dyY3YgKCkNDQptc2dzbmQgKCkNDQptc3luYyAoKQ0N Cm5hbm9zbGVlcCAoKQ0NCm9wZW4gKCkNDQpwYXVzZSAoKQ0NCnBvbGwgKCkN DQpwcmVhZCAoKQ0NCnB0aHJlYWRfY29uZF90aW1lZHdhaXQgKCkNDQpwdGhy ZWFkX2NvbmRfd2FpdCAoKQ0NCipwdGhyZWFkX2pvaW4gKCkNDQpwdGhyZWFk X3Rlc3RjYW5jZWwgKCkNDQpwdXRtc2cgKCkNDQpwdXRwbXNnICgpDQ0KcHdy aXRlICgpDQ0KcmVhZCAoKQ0NCnJlYWR2ICgpDQ0Kc2VsZWN0ICgpDQ0Kc2Vt X3dhaXQgKCkNDQpzaWdwYXVzZSAoKQ0NCnNpZ3N1c3BlbmQgKCkNDQpzaWd0 aW1lZHdhaXQgKCkNDQpzaWd3YWl0ICgpDQ0Kc2lnd2FpdGluZm8gKCkNDQoq c2xlZXAgKCkNDQpzeXN0ZW0gKCkNDQp0Y2RyYWluICgpDQ0KKnVzbGVlcCAo KQ0NCndhaXQgKCkNDQp3YWl0MygpDQ0Kd2FpdGlkICgpDQ0Kd2FpdHBpZCAo KQ0NCndyaXRlICgpDQ0Kd3JpdGV2ICgpDQ0KDQ0KdGhlIG9wdGlvbmFsIGxp c3QgaXM6DQ0KY2F0Y2xvc2UgKCkNDQpjYXRnZXRzICgpDQ0KY2F0b3BlbiAo KQ0NCmNsb3NlZGlyICgpDQ0KY2xvc2Vsb2cgKCkNDQpjdGVybWlkICgpDQ0K ZGJtX2Nsb3NlICgpDQ0KZGJtX2RlbGV0ZSAoKQ0NCmRibV9mZXRjaCAoKQ0N CmRibV9uZXh0a2V5ICgpDQ0KZGJtX29wZW4gKCkNDQpkYm1fc3RvcmUgKCkN DQpkbGNsb3NlICgpDQ0KZGxvcGVuICgpDQ0KZW5kZ3JlbnQgKCkNDQplbmRw d2VudCAoKQ0NCmVuZHV0eGVudCAoKQ0NCmZjbG9zZSAoKQ0NCmZjbnRsICgp DQ0KZmZsdXNoICgpDQ0KZmdldGMgKCkNDQpmZ2V0cG9zICgpDQ0KZmdldHMg KCkNDQpmZ2V0d2MgKCkNDQpmZ2V0d3MgKCkNDQpmb3BlbiAoKQ0NCmZwcmlu dGYgKCkNDQpmcHV0YyAoKQ0NCmZwdXRzICgpDQ0KZnB1dHdjICgpDQ0KZnB1 dHdzICgpDQ0KZnJlYWQgKCkNDQpmcmVvcGVuICgpDQ0KZnNjYW5mICgpDQ0K ZnNlZWsgKCkNDQpmc2Vla28gKCkNDQpmc2V0cG9zICgpDQ0KZnRlbGwgKCkN DQpmdGVsbG8gKCkNDQpmdHcgKCkNDQpmd3ByaW50ZiAoKQ0NCmZ3cml0ZSAo KQ0NCmZ3c2NhbmYgKCkNDQpnZXRjICgpDQ0KZ2V0Y191bmxvY2tlZCAoKQ0N CmdldGNoYXIgKCkNDQpnZXRjaGFyX3VubG9ja2VkICgpDQ0KZ2V0Y3dkICgp DQ0KZ2V0ZGF0ZSAoKQ0NCmdldGdyZW50ICgpDQ0KZ2V0Z3JnaWQgKCkNDQpn ZXRncmdpZF9yICgpDQ0KZ2V0Z3JuYW0gKCkNDQpnZXRncm5hbV9yICgpDQ0K Z2V0bG9naW4gKCkNDQpnZXRsb2dpbl9yICgpDQ0KZ2V0cHdlbnQgKCkNDQoq IGdldHB3bmFtICgpDQ0KKiBnZXRwd25hbV9yICgpDQ0KKiBnZXRwd3VpZCAo KQ0NCiogZ2V0cHd1aWRfciAoKQ0NCmdldHMgKCkNDQpnZXR1dHhlbnQgKCkN DQpnZXR1dHhpZCAoKQ0NCmdldHV0eGxpbmUgKCkNDQpnZXR3ICgpDQ0KZ2V0 d2MgKCkNDQpnZXR3Y2hhciAoKQ0NCmdldHdkICgpDQ0KZ2xvYiAoKQ0NCmlj b252X2Nsb3NlICgpDQ0KaWNvbnZfb3BlbiAoKQ0NCmlvY3RsICgpDQ0KbHNl ZWsgKCkNDQpta3N0ZW1wICgpDQ0KbmZ0dyAoKQ0NCm9wZW5kaXIgKCkNDQpv cGVubG9nICgpDQ0KcGNsb3NlICgpDQ0KcGVycm9yICgpDQ0KcG9wZW4gKCkN DQpwcmludGYgKCkNDQpwdXRjICgpDQ0KcHV0Y191bmxvY2tlZCAoKQ0NCnB1 dGNoYXIgKCkNDQpwdXRjaGFyX3VubG9ja2VkICgpDQ0KcHV0cyAoKQ0NCnB1 dHV0eGxpbmUgKCkNDQpwdXR3ICgpDQ0KcHV0d2MgKCkNDQpwdXR3Y2hhciAo KQ0NCnJlYWRkaXIgKCkNDQpyZWFkZGlyX3IgKCkNDQpyZW1vdmUgKCkNDQpy ZW5hbWUgKCkNDQpyZXdpbmQgKCkNDQpyZXdpbmRkaXIgKCkNDQpzY2FuZiAo KQ0NCnNlZWtkaXIgKCkNDQpzZW1vcCAoKQ0NCnNldGdyZW50ICgpDQ0Kc2V0 cHdlbnQgKCkNDQpzZXR1dHhlbnQgKCkNDQpzdHJlcnJvciAoKQ0NCnN5c2xv ZyAoKQ0NCnRtcGZpbGUgKCkNDQp0bXBuYW0gKCkNDQp0dHluYW1lICgpDQ0K dHR5bmFtZV9yICgpDQ0KdW5nZXRjICgpDQ0KdW5nZXR3YyAoKQ0NCnVubGlu ayAoKQ0NCnZmcHJpbnRmICgpDQ0KdmZ3cHJpbnRmICgpDQ0KdnByaW50ZiAo KQ0NCnZ3cHJpbnRmICgpDQ0Kd3ByaW50ZiAoKQ0NCndzY2FuZiAoKQ0NCg0N Ck5vdGUsIHRoYXQgZm9yIGZjbnRsICgpLCBmb3IgYW55IHZhbHVlIG9mIHRo ZSBjbWQgYXJndW1lbnQuDQ0KDQ0KQW5kIHdlIG11c3Qgbm90IGludHJvZHVj ZSBjYW5jZWxsYXRpb24gcG9pbnRzIGFueXdoZXJlIGVsc2UgdGhhdCdzIHBh cnQgb2YgdGhlIHBvc2l4IG9yDQ0Kb3Blbmdyb3VwIHNwZWNzLg0NCiAqLw0N Cn0NDQoNDQovKiBubyByYWNlcyBpbiB0aGVzZSB0aHJlZSBmdW5jdGlvbnM6 IHRoZXkgYXJlIGFsbCBjdXJyZW50LXRocmVhZC1vbmx5ICovDQ0KaW50DQ0K X19wdGhyZWFkX3NldGNhbmNlbHN0YXRlIChpbnQgc3RhdGUsIGludCAqb2xk c3RhdGUpDQ0Kew0NCiAgY2xhc3MgcHRocmVhZCAqdGhyZWFkID0gX19wdGhy ZWFkX3NlbGYgKCk7DQ0KICBpZiAoc3RhdGUgIT0gUFRIUkVBRF9DQU5DRUxf RU5BQkxFICYmIHN0YXRlICE9IFBUSFJFQURfQ0FOQ0VMX0RJU0FCTEUpDQ0K ICAgIHJldHVybiBFSU5WQUw7DQ0KICAqb2xkc3RhdGUgPSB0aHJlYWQtPmNh bmNlbHN0YXRlOw0NCiAgdGhyZWFkLT5jYW5jZWxzdGF0ZSA9IHN0YXRlOw0N CiAgcmV0dXJuIDA7DQ0KfQ0NCg0NCmludA0NCl9fcHRocmVhZF9zZXRjYW5j ZWx0eXBlIChpbnQgdHlwZSwgaW50ICpvbGR0eXBlKQ0NCnsNDQogIGNsYXNz IHB0aHJlYWQgKnRocmVhZCA9IF9fcHRocmVhZF9zZWxmICgpOw0NCiAgaWYg KHR5cGUgIT0gUFRIUkVBRF9DQU5DRUxfREVGRVJSRUQgJiYgdHlwZSAhPSBQ VEhSRUFEX0NBTkNFTF9BU1lOQ0hST05PVVMpDQ0KICAgIHJldHVybiBFSU5W QUw7DQ0KICAqb2xkdHlwZSA9IHRocmVhZC0+Y2FuY2VsdHlwZTsNDQogIHRo cmVhZC0+Y2FuY2VsdHlwZSA9IHR5cGU7DQ0KICByZXR1cm4gMDsNDQp9DQ0K DQ0KLyogZGVmZXJyZWQgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaGFuZGxlciAq Lw0NCnZvaWQNDQpfX3B0aHJlYWRfdGVzdGNhbmNlbCAodm9pZCkNDQp7DQ0K ICBjbGFzcyBwdGhyZWFkICp0aHJlYWQgPSBfX3B0aHJlYWRfc2VsZiAoKTsN DQogIGlmICh0aHJlYWQtPmNhbmNlbHN0YXRlID09IFBUSFJFQURfQ0FOQ0VM X0RJU0FCTEUpDQ0KICAgIHJldHVybjsNDQogIC8qIGNoZWNrIHRoZSBjYW5j ZWxsYXRpb24gZXZlbnQgb2JqZWN0IGhlcmUgLSBub3QgbmVlZGVkdW50aWwg cHRocmVhZF9jYW5jZWwgYWN0dWFsbHkNDQogICAqIGRvZXMgc29tZXRoaW5n Ki8NDQp9DQ0KDQ0KLyoNDQogKiBSYWNlcyBpbiBwdGhyZWFkX2F0Zm9yazoN DQogKiBXZSBhcmUgcmFjZSBzYWZlIGluIHRoYXQgYW55IGFkZGl0aW9ucyB0 byB0aGUgbGlzdHMgYXJlIG1hZGUgdmlhDQ0KICogSW50ZXJsb2NrZWRFeGNo YW5nZVBvaW50ZXIuDQ0KICogSG93ZXZlciwgaWYgdGhlIHVzZXIgYXBwbGlj YXRpb24gZG9lc24ndCBwZXJmb3JtIHN5bmNyb25pc2F0aW9uIG9mIHNvbWUg c29ydA0NCiAqIEl0J3Mgbm90IGd1YXJhbnRlZWQgdGhhdCBhIG5lYXIgc2lt dWx0YW5lb3VzIGNhbGwgdG8gcHRocmVhZF9hdGZvcmsgYW5kIGZvcmsNDQog KiB3aWxsIHJlc3VsdCBpbiB0aGUgbmV3IGF0Zm9yayBoYW5kbGVycyBiZWlu ZyBjYWxscy4NDQogKiBNb3JlIHJpZ29yb3VzIGludGVybmFsIHN5bmNyb25p c2F0aW9uIGlzbid0IG5lZWRlZCBhcyB0aGUgdXNlciBwcm9ncmFtIGlzbid0 DQ0KICogZ3VhcmFudGVlaW5nIHRoZWlyIG93biBzdGF0ZS4NDQogKg0NCiAq IGFzIGZhciBhcyBtdWx0aXBsZSBjYWxscyB0byBwdGhyZWFkX2F0Zm9yaywg dGhlIHdvcnN0IGNhc2UgaXMgc2ltdWx0YW5lb3VzIGNhbGxzDQ0KICogd2ls bCByZXN1bHQgaW4gYW4gaW5kZXRlcm1pbmF0ZSBvcmRlciBmb3IgcGFyZW50 IGFuZCBjaGlsZCBjYWxscyAod2hhdCBnZXRzIGluc2VydGVkDQ0KICogZmly c3QgaXNuJ3QgZ3VhcmFudGVlZC4pDQ0KICoNDQogKiBUaGVyZSBpcyBvbmUg cG90ZW50aWFsIHJhY2UuLi4gRG9lcyB0aGUgcmVzdWx0IG9mIEludGVybG9j a2VkRXhjaGFuZ2VQb2ludGVyDQ0KICogZ2V0IGNvbW1pdHRlZCB0byB0aGUg cmV0dXJuIGxvY2F0aW9uIF9iZWZvcmVfIGFueSBjb250ZXh0IHN3aXRjaGVz IGNhbiBvY2N1cj8NDQogKiBJZiB5ZXMsIHdlJ3JlIHNhZmUsIGlmIG5vLCB3 ZSdyZSBub3QuDQ0KICovDQ0Kdm9pZA0NCl9fcHRocmVhZF9hdGZvcmtwcmVw YXJlICh2b2lkKQ0NCnsNDQogIGNhbGxiYWNrICpjYiA9IE1UX0lOVEVSRkFD RS0+cHRocmVhZF9wcmVwYXJlOw0NCiAgd2hpbGUgKGNiKQ0NCiAgICB7DQ0K ICAgICAgY2ItPmNiICgpOw0NCiAgICAgIGNiID0gY2ItPm5leHQ7DQ0KICAg IH0NDQp9DQ0KDQ0Kdm9pZA0NCl9fcHRocmVhZF9hdGZvcmtwYXJlbnQgKHZv aWQpDQ0Kew0NCiAgY2FsbGJhY2sgKmNiID0gTVRfSU5URVJGQUNFLT5wdGhy ZWFkX3BhcmVudDsNDQogIHdoaWxlIChjYikNDQogICAgew0NCiAgICAgIGNi LT5jYiAoKTsNDQogICAgICBjYiA9IGNiLT5uZXh0Ow0NCiAgICB9DQ0KfQ0N Cg0NCnZvaWQNDQpfX3B0aHJlYWRfYXRmb3JrY2hpbGQgKHZvaWQpDQ0Kew0N CiAgY2FsbGJhY2sgKmNiID0gTVRfSU5URVJGQUNFLT5wdGhyZWFkX2NoaWxk Ow0NCiAgd2hpbGUgKGNiKQ0NCiAgICB7DQ0KICAgICAgY2ItPmNiICgpOw0N CiAgICAgIGNiID0gY2ItPm5leHQ7DQ0KICAgIH0NDQp9DQ0KDQ0KLyogRklY TUU6IGltcGxlbWVudCBJbnRlcmxvY2tFeGNoYW5nZVBvaW50ZXIgYW5kIGdl dCByaWQgb2YgdGhlIHNpbGx5IHR5cGVjYXN0cyBiZWxvdw0NCiAqLw0NCiNk ZWZpbmUgSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIgSW50ZXJsb2NrZWRF eGNoYW5nZQ0NCg0NCi8qIFJlZ2lzdGVyIGEgc2V0IG9mIGZ1bmN0aW9ucyB0 byBydW4gYmVmb3JlIGFuZCBhZnRlciBmb3JrLg0NCiAqIHByZXBhcmUgY2Fs bHMgYXJlIGNhbGxlZCBpbiBMSS1GQyBvcmRlci4NDQogKiBwYXJlbnQgYW5k IGNoaWxkIGNhbGxzIGFyZSBjYWxsZWQgaW4gRkktRkMgb3JkZXIuDQ0KICov DQ0KaW50DQ0KX19wdGhyZWFkX2F0Zm9yayAodm9pZCAoKnByZXBhcmUpKHZv aWQpLCB2b2lkICgqcGFyZW50KSh2b2lkKSwgdm9pZCAoKmNoaWxkKSh2b2lk KSkNDQp7DQ0KICBjYWxsYmFjayAqIHByZXBjYiA9IE5VTEwsICogcGFyZW50 Y2IgPSBOVUxMLCAqIGNoaWxkY2IgPSBOVUxMOw0NCiAgaWYgKHByZXBhcmUp DQ0KICAgIHsNDQogICAgICBwcmVwY2IgPSBuZXcgY2FsbGJhY2s7DQ0KICAg ICAgaWYgKCFwcmVwY2IpDQ0KCXJldHVybiBFTk9NRU07DQ0KICAgIH0NDQog IGlmIChwYXJlbnQpDQ0KICAgIHsNDQogICAgICBwYXJlbnRjYiA9IG5ldyBj YWxsYmFjazsNDQogICAgICBpZiAoIXBhcmVudGNiKQ0NCgl7DQ0KCSAgaWYg KHByZXBjYikNDQoJICAgIGRlbGV0ZSBwcmVwY2I7DQ0KCSAgcmV0dXJuIEVO T01FTTsNDQoJfQ0NCiAgICB9DQ0KICBpZiAoY2hpbGQpDQ0KICAgIHsNDQog ICAgICBjaGlsZGNiID0gbmV3IGNhbGxiYWNrOw0NCiAgICAgIGlmICghY2hp bGRjYikNDQoJew0NCgkgIGlmIChwcmVwY2IpDQ0KCSAgICBkZWxldGUgcHJl cGNiOw0NCgkgIGlmIChwYXJlbnRjYikNDQoJICAgIGRlbGV0ZSBwYXJlbnRj YjsNDQoJICByZXR1cm4gRU5PTUVNOw0NCgl9DQ0KICAgIH0NDQoNDQogIGlm IChwcmVwY2IpDQ0KICB7DQ0KICAgIHByZXBjYi0+Y2IgPSBwcmVwYXJlOw0N CiAgICBwcmVwY2ItPm5leHQ9KGNhbGxiYWNrICopSW50ZXJsb2NrZWRFeGNo YW5nZVBvaW50ZXIgKChMT05HICopICZNVF9JTlRFUkZBQ0UtPnB0aHJlYWRf cHJlcGFyZSwgKGxvbmcgaW50KSBwcmVwY2IpOw0NCiAgfQ0NCiAgaWYgKHBh cmVudGNiKQ0NCiAgew0NCiAgICBwYXJlbnRjYi0+Y2IgPSBwYXJlbnQ7DQ0K ICAgIGNhbGxiYWNrICoqIHQgPSAmTVRfSU5URVJGQUNFLT5wdGhyZWFkX3Bh cmVudDsNDQogICAgd2hpbGUgKCp0KQ0NCiAgICAgIHQgPSAmKCp0KS0+bmV4 dDsNDQogICAgLyogdCA9IHBvaW50ZXIgdG8gbGFzdCBuZXh0IGluIHRoZSBs aXN0ICovDQ0KICAgIHBhcmVudGNiLT5uZXh0PShjYWxsYmFjayAqKUludGVy bG9ja2VkRXhjaGFuZ2VQb2ludGVyICgoTE9ORyAqKSB0LCAobG9uZyBpbnQp IHBhcmVudGNiKTsNDQogIH0NDQogIGlmIChjaGlsZGNiKQ0NCiAgew0NCiAg ICBjaGlsZGNiLT5jYiA9IGNoaWxkOw0NCiAgICBjYWxsYmFjayAqKiB0ID0g Jk1UX0lOVEVSRkFDRS0+cHRocmVhZF9jaGlsZDsNDQogICAgd2hpbGUgKCp0 KQ0NCiAgICAgIHQgPSAmKCp0KS0+bmV4dDsNDQogICAgLyogdCA9IHBvaW50 ZXIgdG8gbGFzdCBuZXh0IGluIHRoZSBsaXN0ICovDQ0KICAgIGNoaWxkY2It Pm5leHQ9KGNhbGxiYWNrICopSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIg KChMT05HICopIHQsIChsb25nIGludCkgY2hpbGRjYik7DQ0KICB9DQ0KICBy ZXR1cm4gMDsNDQp9DQ0KDQ0KaW50DQ0KX19wdGhyZWFkX2F0dHJfaW5pdCAo cHRocmVhZF9hdHRyX3QgKiBhdHRyKQ0NCnsNDQogICphdHRyID0gbmV3IHB0 aHJlYWRfYXR0cjsNDQogIGlmICghdmVyaWZ5YWJsZV9vYmplY3RfaXN2YWxp ZCAoKmF0dHIsIFBUSFJFQURfQVRUUl9NQUdJQykpDQ0KICAgIHsNDQogICAg ICBkZWxldGUgKCphdHRyKTsNDQogICAgICAqYXR0ciA9IE5VTEw7DQ0KICAg ICAgcmV0dXJuIEVBR0FJTjsNDQogICAgfQ0NCiAgcmV0dXJuIDA7DQ0KfQ0N Cg0NCmludA0NCl9fcHRocmVhZF9hdHRyX2dldGluaGVyaXRzY2hlZCAoY29u c3QgcHRocmVhZF9hdHRyX3QgKiBhdHRyLA0NCgkJCQlpbnQgKmluaGVyaXRz Y2hlZCkNDQp7DQ0KICBpZiAoIXZlcmlmeWFibGVfb2JqZWN0X2lzdmFsaWQg KCphdHRyLCBQVEhSRUFEX0FUVFJfTUFHSUMpKQ0NCiAgICByZXR1cm4gRUlO VkFMOw0NCiAgKmluaGVyaXRzY2hlZCA9ICgqYXR0ciktPmluaGVyaXRzY2hl ZDsNDQogIHJldHVybiAwOw0NCn0NDQoNDQppbnQNDQpfX3B0aHJlYWRfYXR0 cl9nZXRzY2hlZHBhcmFtIChjb25zdCBwdGhyZWFkX2F0dHJfdCAqIGF0dHIs DQ0KCQkJICAgICAgc3RydWN0IHNjaGVkX3BhcmFtICpwYXJhbSkNDQp7DQ0K ICBpZiAoIXZlcmlmeWFibGVfb2JqZWN0X2lzdmFsaWQgKCphdHRyLCBQVEhS RUFEX0FUVFJfTUFHSUMpKQ0NCiAgICByZXR1cm4gRUlOVkFMOw0NCiAgKnBh cmFtID0gKCphdHRyKS0+c2NoZWRwYXJhbTsNDQogIHJldHVybiAwOw0NCn0N DQoNDQovKiBGcm9tIGEgcHVyZSBjb2RlIHBvaW50IG9mIHZpZXcsIHRoaXMg c2hvdWxkIGNhbGwgYSBoZWxwZXIgaW4gc2NoZWQuY2MsDQ0KICogdG8gYWxs b3cgZm9yIHNvbWVvbmUgYWRkaW5nIHNjaGVkdWxlciBwb2xpY3kgY2hhbmdl cyB0byB3aW4zMiBpbiB0aGUgZnV0dXJlLg0NCiAqIEhvd2V2ZXIgdGhhdCdz IGV4dHJlbWVseSB1bmxpa2VseSwgc28gc2hvcnQgYW5kIHN3ZWV0IHdpbGwg ZG8gdXMNDQogKi8NDQppbnQNDQpfX3B0aHJlYWRfYXR0cl9nZXRzY2hlZHBv bGljeSAoY29uc3QgcHRocmVhZF9hdHRyX3QgKiBhdHRyLCBpbnQgKnBvbGlj eSkNDQp7DQ0KICBpZiAoIXZlcmlmeWFibGVfb2JqZWN0X2lzdmFsaWQgKCph dHRyLCBQVEhSRUFEX0FUVFJfTUFHSUMpKQ0NCiAgICByZXR1cm4gRUlOVkFM Ow0NCiAgKnBvbGljeSA9IFNDSEVEX0ZJRk87DQ0KICByZXR1cm4gMDsNDQp9 DQ0KDQ0KDQ0KaW50DQ0KX19wdGhyZWFkX2F0dHJfZ2V0c2NvcGUgKGNvbnN0 IHB0aHJlYWRfYXR0cl90ICogYXR0ciwgaW50ICpjb250ZW50aW9uc2NvcGUp DQ0Kew0NCiAgaWYgKCF2ZXJpZnlhYmxlX29iamVjdF9pc3ZhbGlkICgqYXR0 ciwgUFRIUkVBRF9BVFRSX01BR0lDKSkNDQogICAgcmV0dXJuIEVJTlZBTDsN DQogICpjb250ZW50aW9uc2NvcGUgPSAoKmF0dHIpLT5jb250ZW50aW9uc2Nv cGU7DQ0KICByZXR1cm4gMDsNDQp9DQ0KDQ0KaW50DQ0KX19wdGhyZWFkX2F0 dHJfc2V0ZGV0YWNoc3RhdGUgKHB0aHJlYWRfYXR0cl90ICogYXR0ciwgaW50 IGRldGFjaHN0YXRlKQ0NCnsNDQogIGlmICghdmVyaWZ5YWJsZV9vYmplY3Rf aXN2YWxpZCAoKmF0dHIsIFBUSFJFQURfQVRUUl9NQUdJQykpDQ0KICAgIHJl dHVybiBFSU5WQUw7DQ0KICBpZiAoZGV0YWNoc3RhdGUgPCAwIHx8IGRldGFj aHN0YXRlID4gMSkNDQogICAgcmV0dXJuIEVJTlZBTDsNDQogICgqYXR0cikt PmpvaW5hYmxlID0gZGV0YWNoc3RhdGU7DQ0KICByZXR1cm4gMDsNDQp9DQ0K DQ0KaW50DQ0KX19wdGhyZWFkX2F0dHJfZ2V0ZGV0YWNoc3RhdGUgKGNvbnN0 IHB0aHJlYWRfYXR0cl90ICogYXR0ciwgaW50ICpkZXRhY2hzdGF0ZSkNDQp7 DQ0KICBpZiAoIXZlcmlmeWFibGVfb2JqZWN0X2lzdmFsaWQgKCphdHRyLCBQ VEhSRUFEX0FUVFJfTUFHSUMpKQ0NCiAgICByZXR1cm4gRUlOVkFMOw0NCiAg KmRldGFjaHN0YXRlID0gKCphdHRyKS0+am9pbmFibGU7DQ0KICByZXR1cm4g MDsNDQp9DQ0KDQ0KaW50DQ0KX19wdGhyZWFkX2F0dHJfc2V0aW5oZXJpdHNj aGVkIChwdGhyZWFkX2F0dHJfdCAqIGF0dHIsIGludCBpbmhlcml0c2NoZWQp DQ0Kew0NCiAgaWYgKCF2ZXJpZnlhYmxlX29iamVjdF9pc3ZhbGlkICgqYXR0 ciwgUFRIUkVBRF9BVFRSX01BR0lDKSkNDQogICAgcmV0dXJuIEVJTlZBTDsN DQogIGlmIChpbmhlcml0c2NoZWQgIT0gUFRIUkVBRF9JTkhFUklUX1NDSEVE DQ0KICAgICAgJiYgaW5oZXJpdHNjaGVkICE9IFBUSFJFQURfRVhQTElDSVRf U0NIRUQpDQ0KICAgIHJldHVybiBFTk9UU1VQOw0NCiAgKCphdHRyKS0+aW5o ZXJpdHNjaGVkID0gaW5oZXJpdHNjaGVkOw0NCiAgcmV0dXJuIDA7DQ0KfQ0N Cg0NCmludA0NCl9fcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0gKHB0aHJl YWRfYXR0cl90ICogYXR0ciwNDQoJCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2No ZWRfcGFyYW0gKnBhcmFtKQ0NCnsNDQogIGlmICghdmVyaWZ5YWJsZV9vYmpl Y3RfaXN2YWxpZCAoKmF0dHIsIFBUSFJFQURfQVRUUl9NQUdJQykpDQ0KICAg IHJldHVybiBFSU5WQUw7DQ0KICBpZiAoIXZhbGlkX3NjaGVkX3BhcmFtZXRl cnMgKHBhcmFtKSkNDQogICAgcmV0dXJuIEVOT1RTVVA7DQ0KICAoKmF0dHIp LT5zY2hlZHBhcmFtID0gKnBhcmFtOw0NCiAgcmV0dXJuIDA7DQ0KfQ0NCg0N Ci8qIFNlZSBfX3B0aHJlYWRfYXR0cl9nZXRzY2hlZHBvbGljeSBmb3Igc29t ZSBub3RlcyAqLw0NCmludA0NCl9fcHRocmVhZF9hdHRyX3NldHNjaGVkcG9s aWN5IChwdGhyZWFkX2F0dHJfdCAqIGF0dHIsIGludCBwb2xpY3kpDQ0Kew0N CiAgaWYgKCF2ZXJpZnlhYmxlX29iamVjdF9pc3ZhbGlkICgqYXR0ciwgUFRI UkVBRF9BVFRSX01BR0lDKSkNDQogICAgcmV0dXJuIEVJTlZBTDsNDQogIGlm IChwb2xpY3kgIT0gU0NIRURfRklGTykNDQogICAgcmV0dXJuIEVOT1RTVVA7 DQ0KICByZXR1cm4gMDsNDQp9DQ0KDQ0KaW50DQ0KX19wdGhyZWFkX2F0dHJf c2V0c2NvcGUgKHB0aHJlYWRfYXR0cl90ICogYXR0ciwgaW50IGNvbnRlbnRp b25zY29wZSkNDQp7DQ0KICBpZiAoIXZlcmlmeWFibGVfb2JqZWN0X2lzdmFs aWQgKCphdHRyLCBQVEhSRUFEX0FUVFJfTUFHSUMpKQ0NCiAgICByZXR1cm4g RUlOVkFMOw0NCiAgaWYgKGNvbnRlbnRpb25zY29wZSAhPSBQVEhSRUFEX1ND T1BFX1NZU1RFTQ0NCiAgICAgICYmIGNvbnRlbnRpb25zY29wZSAhPSBQVEhS RUFEX1NDT1BFX1BST0NFU1MpDQ0KICAgIHJldHVybiBFSU5WQUw7DQ0KICAv KiBJbiBmdXR1cmUsIHdlIG1heSBiZSBhYmxlIHRvIHN1cHBvcnQgc3lzdGVt IHNjb3BlIGJ5IGVzY2FsYXRpbmcgdGhlIHRocmVhZA0NCiAgICogcHJpb3Jp dHkgdG8gZXhjZWVkIHRoZSBwcmlvcml0eSBjbGFzcy4gRm9yIG5vdyB3ZSBv bmx5IHN1cHBvcnQgUFJPQ0VTUyBzY29wZS4gKi8NDQogIGlmIChjb250ZW50 aW9uc2NvcGUgIT0gUFRIUkVBRF9TQ09QRV9QUk9DRVNTKQ0NCiAgICByZXR1 cm4gRU5PVFNVUDsNDQogICgqYXR0ciktPmNvbnRlbnRpb25zY29wZSA9IGNv bnRlbnRpb25zY29wZTsNDQogIHJldHVybiAwOw0NCn0NDQoNDQppbnQNDQpf X3B0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUgKHB0aHJlYWRfYXR0cl90ICog YXR0ciwgc2l6ZV90IHNpemUpDQ0Kew0NCiAgaWYgKCF2ZXJpZnlhYmxlX29i amVjdF9pc3ZhbGlkICgqYXR0ciwgUFRIUkVBRF9BVFRSX01BR0lDKSkNDQog ICAgcmV0dXJuIEVJTlZBTDsNDQogICgqYXR0ciktPnN0YWNrc2l6ZSA9IHNp emU7DQ0KICByZXR1cm4gMDsNDQp9DQ0KDQ0KaW50DQ0KX19wdGhyZWFkX2F0 dHJfZ2V0c3RhY2tzaXplIChjb25zdCBwdGhyZWFkX2F0dHJfdCAqIGF0dHIs IHNpemVfdCAqIHNpemUpDQ0Kew0NCiAgaWYgKCF2ZXJpZnlhYmxlX29iamVj dF9pc3ZhbGlkICgqYXR0ciwgUFRIUkVBRF9BVFRSX01BR0lDKSkNDQogICAg cmV0dXJuIEVJTlZBTDsNDQogICpzaXplID0gKCphdHRyKS0+c3RhY2tzaXpl Ow0NCiAgcmV0dXJuIDA7DQ0KfQ0NCg0NCmludA0NCl9fcHRocmVhZF9hdHRy X2Rlc3Ryb3kgKHB0aHJlYWRfYXR0cl90ICogYXR0cikNDQp7DQ0KICBpZiAo IXZlcmlmeWFibGVfb2JqZWN0X2lzdmFsaWQgKCphdHRyLCBQVEhSRUFEX0FU VFJfTUFHSUMpKQ0NCiAgICByZXR1cm4gRUlOVkFMOw0NCiAgZGVsZXRlICgq YXR0cik7DQ0KICAqYXR0ciA9IE5VTEw7DQ0KICByZXR1cm4gMDsNDQp9DQ0K DQ0Kdm9pZA0NCl9fcHRocmVhZF9leGl0ICh2b2lkICp2YWx1ZV9wdHIpDQ0K ew0NCiAgY2xhc3MgcHRocmVhZCAqdGhyZWFkID0gX19wdGhyZWFkX3NlbGYg KCk7DQ0KDQ0KICBNVF9JTlRFUkZBQ0UtPmRlc3RydWN0b3JzLkl0ZXJhdGVO dWxsICgpOw0NCg0NCiAgdGhyZWFkLT5yZXR1cm5fcHRyID0gdmFsdWVfcHRy Ow0NCiAgaWYgKEludGVybG9ja2VkRGVjcmVtZW50ICgmTVRfSU5URVJGQUNF LT50aHJlYWRjb3VudCkgPT0gMCkNDQogICAgZXhpdCAoMCk7DQ0KICBlbHNl DQ0KICAgIEV4aXRUaHJlYWQgKDApOw0NCn0NDQoNDQppbnQNDQpfX3B0aHJl YWRfam9pbiAocHRocmVhZF90ICogdGhyZWFkLCB2b2lkICoqcmV0dXJuX3Zh bCkNDQp7DQ0KICAvKiBGSVhNRTogd2FpdCBvbiB0aGUgdGhyZWFkIGNhbmNl bGxhdGlvbiBldmVudCBhcyB3ZWxsIC0gd2UgYXJlIGEgY2FuY2VsbGF0aW9u IHBvaW50Ki8NDQogIGlmICghdmVyaWZ5YWJsZV9vYmplY3RfaXN2YWxpZCAo KnRocmVhZCwgUFRIUkVBRF9NQUdJQykpDQ0KICAgIHJldHVybiBFU1JDSDsN DQoNDQogIGlmICgoKnRocmVhZCktPmF0dHIuam9pbmFibGUgPT0gUFRIUkVB RF9DUkVBVEVfREVUQUNIRUQpDQ0KICAgIHsNDQogICAgICBpZiAocmV0dXJu X3ZhbCkNDQoJKnJldHVybl92YWwgPSBOVUxMOw0NCiAgICAgIHJldHVybiBF SU5WQUw7DQ0KICAgIH0NDQogIGVsc2UNDQogICAgew0NCiAgICAgICgqdGhy ZWFkKS0+YXR0ci5qb2luYWJsZSA9IFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVE Ow0NCiAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QgKCgqdGhyZWFkKS0+d2lu MzJfb2JqX2lkLCBJTkZJTklURSk7DQ0KICAgICAgaWYgKHJldHVybl92YWwp DQ0KCSpyZXR1cm5fdmFsID0gKCp0aHJlYWQpLT5yZXR1cm5fcHRyOw0NCiAg ICB9CS8qIEVuZCBpZiAqLw0NCg0NCiAgcHRocmVhZF90ZXN0Y2FuY2VsICgp Ow0NCg0NCiAgcmV0dXJuIDA7DQ0KfQ0NCg0NCmludA0NCl9fcHRocmVhZF9k ZXRhY2ggKHB0aHJlYWRfdCAqIHRocmVhZCkNDQp7DQ0KICBpZiAoIXZlcmlm eWFibGVfb2JqZWN0X2lzdmFsaWQgKCp0aHJlYWQsIFBUSFJFQURfTUFHSUMp KQ0NCiAgICByZXR1cm4gRVNSQ0g7DQ0KDQ0KICBpZiAoKCp0aHJlYWQpLT5h dHRyLmpvaW5hYmxlID09IFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEKQ0NCiAg ICB7DQ0KICAgICAgKCp0aHJlYWQpLT5yZXR1cm5fcHRyID0gTlVMTDsNDQog ICAgICByZXR1cm4gRUlOVkFMOw0NCiAgICB9DQ0KDQ0KICAoKnRocmVhZCkt PmF0dHIuam9pbmFibGUgPSBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRDsNDQog IHJldHVybiAwOw0NCn0NDQoNDQppbnQNDQpfX3B0aHJlYWRfc3VzcGVuZCAo cHRocmVhZF90ICogdGhyZWFkKQ0NCnsNDQogIGlmICghdmVyaWZ5YWJsZV9v YmplY3RfaXN2YWxpZCAoKnRocmVhZCwgUFRIUkVBRF9NQUdJQykpDQ0KICAg IHJldHVybiBFU1JDSDsNDQoNDQogIGlmICgoKnRocmVhZCktPnN1c3BlbmRl ZCA9PSBmYWxzZSkNDQogICAgew0NCiAgICAgICgqdGhyZWFkKS0+c3VzcGVu ZGVkID0gdHJ1ZTsNDQogICAgICBTdXNwZW5kVGhyZWFkICgoKnRocmVhZCkt PndpbjMyX29ial9pZCk7DQ0KICAgIH0NDQoNDQogIHJldHVybiAwOw0NCn0N DQoNDQoNDQppbnQNDQpfX3B0aHJlYWRfY29udGludWUgKHB0aHJlYWRfdCAq IHRocmVhZCkNDQp7DQ0KICBpZiAoIXZlcmlmeWFibGVfb2JqZWN0X2lzdmFs aWQgKCp0aHJlYWQsIFBUSFJFQURfTUFHSUMpKQ0NCiAgICByZXR1cm4gRVNS Q0g7DQ0KDQ0KICBpZiAoKCp0aHJlYWQpLT5zdXNwZW5kZWQgPT0gdHJ1ZSkN DQogICAgUmVzdW1lVGhyZWFkICgoKnRocmVhZCktPndpbjMyX29ial9pZCk7 DQ0KICAoKnRocmVhZCktPnN1c3BlbmRlZCA9IGZhbHNlOw0NCg0NCiAgcmV0 dXJuIDA7DQ0KfQ0NCg0NCi8qIHByb3ZpZGVkIGZvciBzb3VyY2UgbGV2ZWwg Y29tcGF0YWJpbGl0eS4NDQogKiBTZWUgaHR0cDovL3d3dy5vcGVuZ3JvdXAu b3JnL29ubGluZXB1YnMvMDA3OTA4Nzk5L3hzaC9wdGhyZWFkX2dldGNvbmN1 cnJlbmN5Lmh0bWwNDQogKi8NDQppbnQNDQpfX3B0aHJlYWRfZ2V0Y29uY3Vy cmVuY3kgKHZvaWQpDQ0Kew0NCiAgcmV0dXJuIE1UX0lOVEVSRkFDRS0+Y29u Y3VycmVuY3k7DQ0KfQ0NCg0NCi8qIGtlZXAgdGhpcyBpbiBzeW5jIHdpdGgg c2NoZWQuY2MgKi8NDQppbnQNDQpfX3B0aHJlYWRfZ2V0c2NoZWRwYXJhbSAo cHRocmVhZF90IHRocmVhZCwgaW50ICpwb2xpY3ksDQ0KCQkJIHN0cnVjdCBz Y2hlZF9wYXJhbSAqcGFyYW0pDQ0Kew0NCiAgaWYgKCF2ZXJpZnlhYmxlX29i amVjdF9pc3ZhbGlkICh0aHJlYWQsIFBUSFJFQURfTUFHSUMpKQ0NCiAgICBy ZXR1cm4gRVNSQ0g7DQ0KICAqcG9saWN5ID0gU0NIRURfRklGTzsNDQogIC8q IHdlIGRvbid0IHJldHVybiB0aGUgY3VycmVudCBlZmZlY3RpdmUgcHJpb3Jp dHksIHdlIHJldHVybiB0aGUgY3VycmVudCByZXF1ZXN0ZWQNDQogICAqIHBy aW9yaXR5ICovDQ0KICAqcGFyYW0gPSB0aHJlYWQtPmF0dHIuc2NoZWRwYXJh bTsNDQogIHJldHVybiAwOw0NCn0NDQoNDQoNDQp1bnNpZ25lZCBsb25nDQ0K X19wdGhyZWFkX2dldHNlcXVlbmNlX25wIChwdGhyZWFkX3QgKiB0aHJlYWQp DQ0Kew0NCiAgaWYgKCF2ZXJpZnlhYmxlX29iamVjdF9pc3ZhbGlkICgqdGhy ZWFkLCBQVEhSRUFEX01BR0lDKSkNDQogICAgcmV0dXJuIEVJTlZBTDsNDQog IHJldHVybiAoKnRocmVhZCktPkdldFRocmVhZElkICgpOw0NCn0NDQoNDQov KiBUaHJlYWQgU3BlY2lmaWNEYXRhICovDQ0KaW50DQ0KX19wdGhyZWFkX2tl eV9jcmVhdGUgKHB0aHJlYWRfa2V5X3QgKiBrZXksIHZvaWQgKCpkZXN0cnVj dG9yKSAodm9pZCAqKSkNDQp7DQ0KICAvKiBUaGUgb3Blbmdyb3VwIGRvY3Mg ZG9uJ3QgZGVmaW5lIGlmIHdlIHNob3VsZCBjaGVjayB0aGlzIG9yIG5vdCwN DQogICAqIGJ1dCBjcmVhdGlvbiBpcyByZWxhdGl2ZWx5IHJhcmUuLg0NCiAg ICovDQ0KICBpZiAodmVyaWZ5YWJsZV9vYmplY3RfaXN2YWxpZCAoKmtleSwg UFRIUkVBRF9LRVlfTUFHSUMpKQ0NCiAgICByZXR1cm4gRUJVU1k7DQ0KDQ0K ICAqa2V5ID0gbmV3IHB0aHJlYWRfa2V5IChkZXN0cnVjdG9yKTsNDQoNDQog IGlmICghdmVyaWZ5YWJsZV9vYmplY3RfaXN2YWxpZCAoKmtleSwgUFRIUkVB RF9LRVlfTUFHSUMpKQ0NCiAgICB7DQ0KICAgICAgZGVsZXRlICgqa2V5KTsN DQogICAgICAqa2V5ID0gTlVMTDsNDQogICAgICByZXR1cm4gRUFHQUlOOw0N CiAgICB9DQ0KICByZXR1cm4gMDsNDQp9DQ0KDQ0KaW50DQ0KX19wdGhyZWFk X2tleV9kZWxldGUgKHB0aHJlYWRfa2V5X3Qga2V5KQ0NCnsNDQogIGlmICgh dmVyaWZ5YWJsZV9vYmplY3RfaXN2YWxpZCAoa2V5LCBQVEhSRUFEX0tFWV9N QUdJQykpDQ0KICAgIHJldHVybiBFSU5WQUw7DQ0KDQ0KICBkZWxldGUgKGtl eSk7DQ0KICByZXR1cm4gMDsNDQp9DQ0KDQ0KLyogcHJvdmlkZWQgZm9yIHNv dXJjZSBsZXZlbCBjb21wYXRhYmlsaXR5Lg0NCiAqIFNlZSBodHRwOi8vd3d3 Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDg3OTkveHNoL3B0aHJl YWRfZ2V0Y29uY3VycmVuY3kuaHRtbA0NCiAqLw0NCmludA0NCl9fcHRocmVh ZF9zZXRjb25jdXJyZW5jeSAoaW50IG5ld19sZXZlbCkNDQp7DQ0KICBpZiAo bmV3X2xldmVsIDwgMCkNDQogICAgcmV0dXJuIEVJTlZBTDsNDQogIE1UX0lO VEVSRkFDRS0+Y29uY3VycmVuY3kgPSBuZXdfbGV2ZWw7DQ0KICByZXR1cm4g MDsNDQp9DQ0KDQ0KLyoga2VlcCBzeW5jcm9uaXNlZCB3aXRoIHNjaGVkLmNj ICovDQ0KaW50DQ0KX19wdGhyZWFkX3NldHNjaGVkcGFyYW0gKHB0aHJlYWRf dCB0aHJlYWQsIGludCBwb2xpY3ksDQ0KCQkJIGNvbnN0IHN0cnVjdCBzY2hl ZF9wYXJhbSAqcGFyYW0pDQ0Kew0NCiAgaWYgKCF2ZXJpZnlhYmxlX29iamVj dF9pc3ZhbGlkICh0aHJlYWQsIFBUSFJFQURfTUFHSUMpKQ0NCiAgICByZXR1 cm4gRVNSQ0g7DQ0KICBpZiAocG9saWN5ICE9IFNDSEVEX0ZJRk8pDQ0KICAg IHJldHVybiBFTk9UU1VQOw0NCiAgaWYgKCFwYXJhbSkNDQogICAgcmV0dXJu IEVJTlZBTDsNDQogIGludCBydiA9DQ0KICAgIHNjaGVkX3NldF90aHJlYWRf cHJpb3JpdHkgKHRocmVhZC0+d2luMzJfb2JqX2lkLCBwYXJhbS0+c2NoZWRf cHJpb3JpdHkpOw0NCiAgaWYgKCFydikNDQogICAgdGhyZWFkLT5hdHRyLnNj aGVkcGFyYW0uc2NoZWRfcHJpb3JpdHkgPSBwYXJhbS0+c2NoZWRfcHJpb3Jp dHk7DQ0KICByZXR1cm4gcnY7DQ0KfQ0NCg0NCg0NCmludA0NCl9fcHRocmVh ZF9zZXRzcGVjaWZpYyAocHRocmVhZF9rZXlfdCBrZXksIGNvbnN0IHZvaWQg KnZhbHVlKQ0NCnsNDQogIGlmICghdmVyaWZ5YWJsZV9vYmplY3RfaXN2YWxp ZCAoa2V5LCBQVEhSRUFEX0tFWV9NQUdJQykpDQ0KICAgIHJldHVybiBFSU5W QUw7DQ0KICAoa2V5KS0+c2V0ICh2YWx1ZSk7DQ0KICByZXR1cm4gMDsNDQp9 DQ0KDQ0Kdm9pZCAqDQ0KX19wdGhyZWFkX2dldHNwZWNpZmljIChwdGhyZWFk X2tleV90IGtleSkNDQp7DQ0KICBpZiAoIXZlcmlmeWFibGVfb2JqZWN0X2lz dmFsaWQgKGtleSwgUFRIUkVBRF9LRVlfTUFHSUMpKQ0NCiAgICByZXR1cm4g TlVMTDsNDQoNDQogIHJldHVybiAoa2V5KS0+Z2V0ICgpOw0NCg0NCn0NDQoN DQovKiBUaHJlYWQgc3luY2hyb25pc2F0aW9uICovDQ0KDQ0KaW50DQ0KX19w dGhyZWFkX2NvbmRfZGVzdHJveSAocHRocmVhZF9jb25kX3QgKiBjb25kKQ0N CnsNDQogIGlmICghdmVyaWZ5YWJsZV9vYmplY3RfaXN2YWxpZCAoKmNvbmQs IFBUSFJFQURfQ09ORF9NQUdJQykpDQ0KICAgIHJldHVybiBFSU5WQUw7DQ0K DQ0KICAvKiByZWFkcyBhcmUgYXRvbWljICovDQ0KICBpZiAoKCpjb25kKS0+ d2FpdGluZykNDQogICAgcmV0dXJuIEVCVVNZOw0NCg0NCiAgZGVsZXRlICgq Y29uZCk7DQ0KICAqY29uZCA9IE5VTEw7DQ0KDQ0KICByZXR1cm4gMDsNDQp9 DQ0KDQ0KaW50DQ0KX19wdGhyZWFkX2NvbmRfaW5pdCAocHRocmVhZF9jb25k X3QgKiBjb25kLCBjb25zdCBwdGhyZWFkX2NvbmRhdHRyX3QgKiBhdHRyKQ0N CnsNDQogIGlmIChhdHRyICYmICF2ZXJpZnlhYmxlX29iamVjdF9pc3ZhbGlk ICgqYXR0ciwgUFRIUkVBRF9DT05EQVRUUl9NQUdJQykpDQ0KICAgIHJldHVy biBFSU5WQUw7DQ0KDQ0KICBpZiAodmVyaWZ5YWJsZV9vYmplY3RfaXN2YWxp ZCAoKmNvbmQsIFBUSFJFQURfQ09ORF9NQUdJQykpDQ0KICAgIHJldHVybiBF QlVTWTsNDQoNDQogICpjb25kID0gbmV3IHB0aHJlYWRfY29uZCAoYXR0ciA/ ICgqYXR0cikgOiBOVUxMKTsNDQoNDQogIGlmICghdmVyaWZ5YWJsZV9vYmpl Y3RfaXN2YWxpZCAoKmNvbmQsIFBUSFJFQURfQ09ORF9NQUdJQykpDQ0KICAg IHsNDQogICAgICBkZWxldGUgKCpjb25kKTsNDQogICAgICAqY29uZCA9IE5V TEw7DQ0KICAgICAgcmV0dXJuIEVBR0FJTjsNDQogICAgfQ0NCg0NCiAgcmV0 dXJuIDA7DQ0KfQ0NCg0NCmludA0NCl9fcHRocmVhZF9jb25kX2Jyb2FkY2Fz dCAocHRocmVhZF9jb25kX3QgKiBjb25kKQ0NCnsNDQogIGlmICghdmVyaWZ5 YWJsZV9vYmplY3RfaXN2YWxpZCAoKmNvbmQsIFBUSFJFQURfQ09ORF9NQUdJ QykpDQ0KICAgIHJldHVybiBFSU5WQUw7DQ0KDQ0KICAoKmNvbmQpLT5Ccm9h ZENhc3QgKCk7DQ0KDQ0KICByZXR1cm4gMDsNDQp9DQ0KDQ0KaW50DQ0KX19w dGhyZWFkX2NvbmRfc2lnbmFsIChwdGhyZWFkX2NvbmRfdCAqIGNvbmQpDQ0K ew0NCiAgaWYgKCF2ZXJpZnlhYmxlX29iamVjdF9pc3ZhbGlkICgqY29uZCwg UFRIUkVBRF9DT05EX01BR0lDKSkNDQogICAgcmV0dXJuIEVJTlZBTDsNDQoN DQogICgqY29uZCktPlNpZ25hbCAoKTsNDQoNDQogIHJldHVybiAwOw0NCn0N DQoNDQovLyBGSVhNRTogcHNoYXJlZCBtdXRleHMgaGF2ZSB0aGUgY29uZCBj b3VudCBpbiB0aGUgc2hhcmVkIG1lbW9yeSBhcmVhLg0NCi8vIFdlIG5lZWQg dG8gYWNjb21vZGF0ZSB0aGF0Lg0NCmludA0NCl9fcHRocmVhZF9jb25kX3Rp bWVkd2FpdCAocHRocmVhZF9jb25kX3QgKiBjb25kLCBwdGhyZWFkX211dGV4 X3QgKiBtdXRleCwNDQoJCQkgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqYWJz dGltZSkNDQp7DQ0KLy8gYW5kIHllcyBjb25kX2FjY2VzcyBoZXJlIGlzIHN0 aWxsIG9wZW4gdG8gYSByYWNlLiAod2UgaW5jcmVtZW50LCBjb250ZXh0IHN3 YXAsDQ0KLy8gYnJvYWRjYXN0IG9jY3VycyAtICB3ZSBtaXNzIHRoZSBicm9h ZGNhc3QuIHRoZSBmdW5jdGlvbnMgYXJlbid0IHNwbGl0IHByb3Blcmx5Lg0N CiAgaW50IHJ2Ow0NCiAgaWYgKCFhYnN0aW1lKQ0NCiAgICByZXR1cm4gRUlO VkFMOw0NCiAgcHRocmVhZF9tdXRleCAqKnRoZW11dGV4ID0gTlVMTDsNDQog IGlmICgqbXV0ZXggPT0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUikNDQog ICAgX19wdGhyZWFkX211dGV4X2luaXQgKG11dGV4LCBOVUxMKTsNDQogIGlm ICgoKChwc2hhcmVkX211dGV4ICopKG11dGV4KSktPmZsYWdzICYgU1lTX0JB U0UgPT0gU1lTX0JBU0UpKQ0NCiAgICAvLyBhIHBzaGFyZWQgbXV0ZXgNDQog ICAgdGhlbXV0ZXggPSBfX3B0aHJlYWRfbXV0ZXhfZ2V0cHNoYXJlZCAobXV0 ZXgpOw0NCiAgZWxzZQ0NCiAgICB0aGVtdXRleCA9IG11dGV4Ow0NCg0NCiAg aWYgKCF2ZXJpZnlhYmxlX29iamVjdF9pc3ZhbGlkICgqdGhlbXV0ZXgsIFBU SFJFQURfTVVURVhfTUFHSUMpKQ0NCiAgICByZXR1cm4gRUlOVkFMOw0NCiAg aWYgKCF2ZXJpZnlhYmxlX29iamVjdF9pc3ZhbGlkICgqY29uZCwgUFRIUkVB RF9DT05EX01BR0lDKSkNDQogICAgcmV0dXJuIEVJTlZBTDsNDQogIHN0cnVj dCB0aW1lYiBjdXJyU3lzVGltZTsNDQogIGxvbmcgd2FpdGxlbmd0aDsNDQog IGZ0aW1lKCZjdXJyU3lzVGltZSk7DQ0KICB3YWl0bGVuZ3RoID0gKGFic3Rp bWUtPnR2X3NlYyAtIGN1cnJTeXNUaW1lLnRpbWUpICogMTAwMDsNDQogIGlm ICh3YWl0bGVuZ3RoIDwgMCkNDQogICAgcmV0dXJuIEVUSU1FRE9VVDsNDQoN DQogIC8qIGlmIHRoZSBjb25kIHZhcmlhYmxlIGlzIGJsb2NrZWQsIHRoZW4g dGhlIGFib3ZlIHRpbWVyIHRlc3QgbWF5YmUgd3JvbmcuICpzaHJ1ZyogKi8N DQogIGlmIChwdGhyZWFkX211dGV4X2xvY2sgKCYoKmNvbmQpLT5jb25kX2Fj Y2VzcykpDQ0KICAgIHN5c3RlbV9wcmludGYgKCJGYWlsZWQgdG8gbG9jayBj b25kaXRpb24gdmFyaWFibGUgYWNjZXNzIG11dGV4LCB0aGlzICUwcFxuIiwg KmNvbmQpOw0NCg0NCiAgaWYgKCgqY29uZCktPndhaXRpbmcpDQ0KICAgIGlm ICgoKmNvbmQpLT5tdXRleCAmJiAoKCpjb25kKS0+bXV0ZXggIT0gKCp0aGVt dXRleCkpKQ0NCiAgICAgIHsNDQoJaWYgKHB0aHJlYWRfbXV0ZXhfdW5sb2Nr ICgmKCpjb25kKS0+Y29uZF9hY2Nlc3MpKQ0NCgkgIHN5c3RlbV9wcmludGYg KCJGYWlsZWQgdG8gdW5sb2NrIGNvbmRpdGlvbiB2YXJpYWJsZSBhY2Nlc3Mg bXV0ZXgsIHRoaXMgJTBwXG4iLCAqY29uZCk7DQ0KCXJldHVybiBFSU5WQUw7 DQ0KICAgICAgfQ0NCiAgSW50ZXJsb2NrZWRJbmNyZW1lbnQgKCYoKCpjb25k KS0+d2FpdGluZykpOw0NCg0NCiAgKCpjb25kKS0+bXV0ZXggPSAoKnRoZW11 dGV4KTsNDQogIEludGVybG9ja2VkSW5jcmVtZW50ICgmKCgqdGhlbXV0ZXgp LT5jb25kd2FpdHMpKTsNDQogIGlmIChwdGhyZWFkX211dGV4X3VubG9jayAo JigqY29uZCktPmNvbmRfYWNjZXNzKSkNDQogICAgc3lzdGVtX3ByaW50ZiAo IkZhaWxlZCB0byB1bmxvY2sgY29uZGl0aW9uIHZhcmlhYmxlIGFjY2VzcyBt dXRleCwgdGhpcyAlMHBcbiIsICpjb25kKTsNDQogIHJ2ID0gKCpjb25kKS0+ VGltZWRXYWl0ICh3YWl0bGVuZ3RoKTsNDQogICgqY29uZCktPm11dGV4LT5M b2NrICgpOw0NCiAgaWYgKHB0aHJlYWRfbXV0ZXhfbG9jayAoJigqY29uZCkt PmNvbmRfYWNjZXNzKSkNDQogICAgc3lzdGVtX3ByaW50ZiAoIkZhaWxlZCB0 byBsb2NrIGNvbmRpdGlvbiB2YXJpYWJsZSBhY2Nlc3MgbXV0ZXgsIHRoaXMg JTBwXG4iLCAqY29uZCk7DQ0KICBpZiAoSW50ZXJsb2NrZWREZWNyZW1lbnQg KCYoKCpjb25kKS0+d2FpdGluZykpID09IDApDQ0KICAgICgqY29uZCktPm11 dGV4ID0gTlVMTDsNDQogIEludGVybG9ja2VkRGVjcmVtZW50ICgmKCgqdGhl bXV0ZXgpLT5jb25kd2FpdHMpKTsNDQogIGlmIChwdGhyZWFkX211dGV4X3Vu bG9jayAoJigqY29uZCktPmNvbmRfYWNjZXNzKSkNDQogICAgc3lzdGVtX3By aW50ZiAoIkZhaWxlZCB0byB1bmxvY2sgY29uZGl0aW9uIHZhcmlhYmxlIGFj Y2VzcyBtdXRleCwgdGhpcyAlMHBcbiIsICpjb25kKTsNDQoNDQogIHJldHVy biBydjsNDQp9DQ0KDQ0KaW50DQ0KX19wdGhyZWFkX2NvbmRfd2FpdCAocHRo cmVhZF9jb25kX3QgKiBjb25kLCBwdGhyZWFkX211dGV4X3QgKiBtdXRleCkN DQp7DQ0KLy8gc2VlIGNvbmRfdGltZWR3YWl0IGZvciBub3Rlcw0NCiAgaW50 IHJ2Ow0NCiAgcHRocmVhZF9tdXRleF90ICp0aGVtdXRleCA9IG11dGV4Ow0N CiAgaWYgKCptdXRleCA9PSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSKQ0N CiAgICBfX3B0aHJlYWRfbXV0ZXhfaW5pdCAobXV0ZXgsIE5VTEwpOw0NCiAg aWYgKCgoKHBzaGFyZWRfbXV0ZXggKikobXV0ZXgpKS0+ZmxhZ3MgJiBTWVNf QkFTRSA9PSBTWVNfQkFTRSkpDQ0KICAgIC8vIGEgcHNoYXJlZCBtdXRleA0N CiAgICB0aGVtdXRleCA9IF9fcHRocmVhZF9tdXRleF9nZXRwc2hhcmVkICht dXRleCk7DQ0KICBlbHNlDQ0KICAgIHRoZW11dGV4ID0gbXV0ZXg7DQ0KICBp ZiAoIXZlcmlmeWFibGVfb2JqZWN0X2lzdmFsaWQgKCp0aGVtdXRleCwgUFRI UkVBRF9NVVRFWF9NQUdJQykpDQ0KICAgIHJldHVybiBFSU5WQUw7DQ0KICBp ZiAoIXZlcmlmeWFibGVfb2JqZWN0X2lzdmFsaWQgKCpjb25kLCBQVEhSRUFE X0NPTkRfTUFHSUMpKQ0NCiAgICByZXR1cm4gRUlOVkFMOw0NCg0NCiAgaWYg KHB0aHJlYWRfbXV0ZXhfbG9jayAoJigqY29uZCktPmNvbmRfYWNjZXNzKSkN DQogICAgc3lzdGVtX3ByaW50ZiAoIkZhaWxlZCB0byBsb2NrIGNvbmRpdGlv biB2YXJpYWJsZSBhY2Nlc3MgbXV0ZXgsIHRoaXMgJTBwXG4iLCAqY29uZCk7 DQ0KDQ0KICBpZiAoKCpjb25kKS0+d2FpdGluZykNDQogICAgaWYgKCgqY29u ZCktPm11dGV4ICYmICgoKmNvbmQpLT5tdXRleCAhPSAoKnRoZW11dGV4KSkp DQ0KICAgICAgew0NCglpZiAocHRocmVhZF9tdXRleF91bmxvY2sgKCYoKmNv bmQpLT5jb25kX2FjY2VzcykpDQ0KCSAgc3lzdGVtX3ByaW50ZiAoIkZhaWxl ZCB0byB1bmxvY2sgY29uZGl0aW9uIHZhcmlhYmxlIGFjY2VzcyBtdXRleCwg dGhpcyAlMHBcbiIsICpjb25kKTsNDQoJcmV0dXJuIEVJTlZBTDsNDQogICAg ICB9DQ0KICBJbnRlcmxvY2tlZEluY3JlbWVudCAoJigoKmNvbmQpLT53YWl0 aW5nKSk7DQ0KDQ0KICAoKmNvbmQpLT5tdXRleCA9ICgqdGhlbXV0ZXgpOw0N CiAgSW50ZXJsb2NrZWRJbmNyZW1lbnQgKCYoKCp0aGVtdXRleCktPmNvbmR3 YWl0cykpOw0NCiAgaWYgKHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmKCpjb25k KS0+Y29uZF9hY2Nlc3MpKQ0NCiAgICBzeXN0ZW1fcHJpbnRmICgiRmFpbGVk IHRvIHVubG9jayBjb25kaXRpb24gdmFyaWFibGUgYWNjZXNzIG11dGV4LCB0 aGlzICUwcFxuIiwgKmNvbmQpOw0NCiAgcnYgPSAoKmNvbmQpLT5UaW1lZFdh aXQgKElORklOSVRFKTsNDQogICgqY29uZCktPm11dGV4LT5Mb2NrICgpOw0N CiAgaWYgKHB0aHJlYWRfbXV0ZXhfbG9jayAoJigqY29uZCktPmNvbmRfYWNj ZXNzKSkNDQogICAgc3lzdGVtX3ByaW50ZiAoIkZhaWxlZCB0byBsb2NrIGNv bmRpdGlvbiB2YXJpYWJsZSBhY2Nlc3MgbXV0ZXgsIHRoaXMgJTBwXG4iLCAq Y29uZCk7DQ0KICBpZiAoSW50ZXJsb2NrZWREZWNyZW1lbnQgKCYoKCpjb25k KS0+d2FpdGluZykpID09IDApDQ0KICAgICgqY29uZCktPm11dGV4ID0gTlVM TDsNDQogIEludGVybG9ja2VkRGVjcmVtZW50ICgmKCgqdGhlbXV0ZXgpLT5j b25kd2FpdHMpKTsNDQogIGlmIChwdGhyZWFkX211dGV4X3VubG9jayAoJigq Y29uZCktPmNvbmRfYWNjZXNzKSkNDQogICAgc3lzdGVtX3ByaW50ZiAoIkZh aWxlZCB0byB1bmxvY2sgY29uZGl0aW9uIHZhcmlhYmxlIGFjY2VzcyBtdXRl eCwgdGhpcyAlMHBcbiIsICpjb25kKTsNDQogIHJldHVybiBydjsNDQp9DQ0K DQ0KaW50DQ0KX19wdGhyZWFkX2NvbmRhdHRyX2luaXQgKHB0aHJlYWRfY29u ZGF0dHJfdCAqIGNvbmRhdHRyKQ0NCnsNDQogICpjb25kYXR0ciA9IG5ldyBw dGhyZWFkX2NvbmRhdHRyOw0NCiAgaWYgKCF2ZXJpZnlhYmxlX29iamVjdF9p c3ZhbGlkICgqY29uZGF0dHIsIFBUSFJFQURfQ09OREFUVFJfTUFHSUMpKQ0N CiAgICB7DQ0KICAgICAgZGVsZXRlICgqY29uZGF0dHIpOw0NCiAgICAgICpj b25kYXR0ciA9IE5VTEw7DQ0KICAgICAgcmV0dXJuIEVBR0FJTjsNDQogICAg fQ0NCiAgcmV0dXJuIDA7DQ0KfQ0NCg0NCmludA0NCl9fcHRocmVhZF9jb25k YXR0cl9nZXRwc2hhcmVkIChjb25zdCBwdGhyZWFkX2NvbmRhdHRyX3QgKiBh dHRyLCBpbnQgKnBzaGFyZWQpDQ0Kew0NCiAgaWYgKCF2ZXJpZnlhYmxlX29i amVjdF9pc3ZhbGlkICgqYXR0ciwgUFRIUkVBRF9DT05EQVRUUl9NQUdJQykp DQ0KICAgIHJldHVybiBFSU5WQUw7DQ0KICAqcHNoYXJlZCA9ICgqYXR0cikt PnNoYXJlZDsNDQogIHJldHVybiAwOw0NCn0NDQoNDQppbnQNDQpfX3B0aHJl YWRfY29uZGF0dHJfc2V0cHNoYXJlZCAocHRocmVhZF9jb25kYXR0cl90ICog YXR0ciwgaW50IHBzaGFyZWQpDQ0Kew0NCiAgaWYgKCF2ZXJpZnlhYmxlX29i amVjdF9pc3ZhbGlkICgqYXR0ciwgUFRIUkVBRF9DT05EQVRUUl9NQUdJQykp DQ0KICAgIHJldHVybiBFSU5WQUw7DQ0KICBpZiAoKHBzaGFyZWQgPCAwKSB8 fCAocHNoYXJlZCA+IDEpKQ0NCiAgICByZXR1cm4gRUlOVkFMOw0NCiAgLyog c2hhcmVkIGNvbmQgdmFycyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCAqLw0N CiAgaWYgKHBzaGFyZWQgIT0gUFRIUkVBRF9QUk9DRVNTX1BSSVZBVEUpDQ0K ICAgIHJldHVybiBFSU5WQUw7DQ0KICAoKmF0dHIpLT5zaGFyZWQgPSBwc2hh cmVkOw0NCiAgcmV0dXJuIDA7DQ0KfQ0NCg0NCmludA0NCl9fcHRocmVhZF9j b25kYXR0cl9kZXN0cm95IChwdGhyZWFkX2NvbmRhdHRyX3QgKiBjb25kYXR0 cikNDQp7DQ0KICBpZiAoIXZlcmlmeWFibGVfb2JqZWN0X2lzdmFsaWQgKCpj b25kYXR0ciwgUFRIUkVBRF9DT05EQVRUUl9NQUdJQykpDQ0KICAgIHJldHVy biBFSU5WQUw7DQ0KICBkZWxldGUgKCpjb25kYXR0cik7DQ0KICAqY29uZGF0 dHIgPSBOVUxMOw0NCiAgcmV0dXJuIDA7DQ0KfQ0NCg0NCi8qIFRocmVhZCBz aWduYWwgKi8NDQppbnQNDQpfX3B0aHJlYWRfa2lsbCAocHRocmVhZF90IHRo cmVhZCwgaW50IHNpZykNDQp7DQ0KLy8gbG9jayBteXNlbGYsIGZvciB0aGUg dXNlIG9mIHRocmVhZDJzaWduYWwNDQogIC8vIHR3byBkaWZmZXIga2lsbHMg bWlnaHQgY2xhc2g6IEZJWE1FDQ0KDQ0KICBpZiAoIXZlcmlmeWFibGVfb2Jq ZWN0X2lzdmFsaWQgKHRocmVhZCwgUFRIUkVBRF9NQUdJQykpDQ0KICAgIHJl dHVybiBFSU5WQUw7DQ0KDQ0KICBpZiAodGhyZWFkLT5zaWdzKQ0NCiAgICBt eXNlbGYtPnNldHRocmVhZDJzaWduYWwgKHRocmVhZCk7DQ0KDQ0KICBpbnQg cnZhbCA9IF9raWxsIChteXNlbGYtPnBpZCwgc2lnKTsNDQoNDQogIC8vIHVu bG9jayBteXNlbGYNDQogIHJldHVybiBydmFsOw0NCn0NDQoNDQppbnQNDQpf X3B0aHJlYWRfc2lnbWFzayAoaW50IG9wZXJhdGlvbiwgY29uc3Qgc2lnc2V0 X3QgKiBzZXQsIHNpZ3NldF90ICogb2xkX3NldCkNDQp7DQ0KICBwdGhyZWFk ICp0aHJlYWQgPSBfX3B0aHJlYWRfc2VsZiAoKTsNDQoNDQogIC8vIGxvY2sg dGhpcyBteXNlbGYsIGZvciB0aGUgdXNlIG9mIHRocmVhZDJzaWduYWwNDQog IC8vIHR3byBkaWZmZXJ0IGtpbGxzIG1pZ2h0IGNsYXNoOiBGSVhNRQ0NCg0N CiAgaWYgKHRocmVhZC0+c2lncykNDQogICAgbXlzZWxmLT5zZXR0aHJlYWQy c2lnbmFsICh0aHJlYWQpOw0NCg0NCiAgaW50IHJ2YWwgPSBzaWdwcm9jbWFz ayAob3BlcmF0aW9uLCBzZXQsIG9sZF9zZXQpOw0NCg0NCiAgLy8gdW5sb2Nr IHRoaXMgbXlzZWxmDQ0KDQ0KICByZXR1cm4gcnZhbDsNDQp9DQ0KDQ0KLyog IElEICovDQ0KcHRocmVhZF90DQ0KX19wdGhyZWFkX3NlbGYgKCkNDQp7DQ0K ICByZXR1cm4gKHB0aHJlYWQgKikgVGxzR2V0VmFsdWUgKE1UX0lOVEVSRkFD RS0+dGhyZWFkX3NlbGZfZHdUbHNJbmRleCk7DQ0KfQ0NCg0NCmludA0NCl9f cHRocmVhZF9lcXVhbCAocHRocmVhZF90ICogdDEsIHB0aHJlYWRfdCAqIHQy KQ0NCnsNDQogIHJldHVybiAoKnQxIC0gKnQyKTsNDQp9DQ0KDQ0KLyogTXV0 ZXhlcyAgKi8NDQoNDQovKiBGSVhNRTogdGhlcmUncyBhIHBvdGVudGlhbCBy YWNlIHdpdGggUFRIUkVBRF9NVVRFWF9JTklUQUxJWkVSOg0NCiAqIHRoZSBt dXRleCBpcyBub3QgYWN0dWFsbHkgaW5pdGVkIHVudGlsIHRoZSBmaXJzdCB1 c2UuDQ0KICogU28gdHdvIHRocmVhZHMgdHJ5aW5nIHRvIGxvY2svdHJ5bG9j ayBtYXkgY29sbGlkZS4NDQogKiBTb2x1dGlvbjogd2UgbmVlZCBhIGdsb2Jh bCBtdXRleCBvbiBtdXRleCBjcmVhdGlvbiwgb3IgcG9zc2libHkgc2ltcGx5 DQ0KICogb24gYWxsIGNvbnN0cnVjdG9ycyB0aGF0IGFsbG93IElOSVRJQUxJ WkVSIG1hY3Jvcy4NDQogKiB0aGUgbG9jayBzaG91bGQgYmUgdmVyeSBzbWFs bDogb25seSBhcm91bmQgdGhlIGluaXQgcm91dGluZSwgbm90DQ0KICogZXZl cnkgdGVzdCwgb3IgYWxsIG11dGV4IGFjY2VzcyB3aWxsIGJlIHN5bmNocm9u aXNlZC4NDQogKi8NDQoNDQppbnQNDQpfX3B0aHJlYWRfbXV0ZXhfaW5pdCAo cHRocmVhZF9tdXRleF90ICogbXV0ZXgsDQ0KCQkgICAgICBjb25zdCBwdGhy ZWFkX211dGV4YXR0cl90ICogYXR0cikNDQp7DQ0KICBpZiAoKCgocHNoYXJl ZF9tdXRleCAqKShtdXRleCkpLT5mbGFncyAmIFNZU19CQVNFID09IFNZU19C QVNFKSkNDQogICAgLy8gYSBwc2hhcmVkIG11dGV4DQ0KICAgIHJldHVybiBF QlVTWTsNDQogIGlmIChhdHRyICYmICF2ZXJpZnlhYmxlX29iamVjdF9pc3Zh bGlkICgqYXR0ciwgUFRIUkVBRF9NVVRFWEFUVFJfTUFHSUMpKQ0NCiAgICBy ZXR1cm4gRUlOVkFMOw0NCg0NCiAgaWYgKHZlcmlmeWFibGVfb2JqZWN0X2lz dmFsaWQgKCptdXRleCwgUFRIUkVBRF9NVVRFWF9NQUdJQykpDQ0KICAgIHJl dHVybiBFQlVTWTsNDQoNDQogIGlmIChhdHRyICYmICgqYXR0ciktPnBzaGFy ZWQgPT0gUFRIUkVBRF9QUk9DRVNTX1NIQVJFRCkNDQogICAgew0NCiAgICAg IHB0aHJlYWRfbXV0ZXhfdCB0aHJvd2F3YXkgPSBuZXcgcHRocmVhZF9tdXRl eCAobXV0ZXgsICgqYXR0cikpOw0NCiAgICAgIG11dGV4ID0gX19wdGhyZWFk X211dGV4X2dldHBzaGFyZWQgKChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgp Ow0NCg0NCiAgICAgIGlmICghdmVyaWZ5YWJsZV9vYmplY3RfaXN2YWxpZCAo Km11dGV4LCBQVEhSRUFEX01VVEVYX01BR0lDKSkNDQoJew0NCgkgIGRlbGV0 ZSB0aHJvd2F3YXk7DQ0KCSAgKm11dGV4ID0gTlVMTDsNDQoJICByZXR1cm4g RUFHQUlOOw0NCgl9DQ0KICAgICAgcmV0dXJuIDA7DQ0KICAgIH0NDQogICpt dXRleCA9IG5ldyBwdGhyZWFkX211dGV4IChhdHRyID8gKCphdHRyKSA6IE5V TEwpOw0NCiAgaWYgKCF2ZXJpZnlhYmxlX29iamVjdF9pc3ZhbGlkICgqbXV0 ZXgsIFBUSFJFQURfTVVURVhfTUFHSUMpKQ0NCiAgICB7DQ0KICAgICAgZGVs ZXRlICgqbXV0ZXgpOw0NCiAgICAgICptdXRleCA9IE5VTEw7DQ0KICAgICAg cmV0dXJuIEVBR0FJTjsNDQogICAgfQ0NCiAgcmV0dXJuIDA7DQ0KfQ0NCg0N CmludA0NCl9fcHRocmVhZF9tdXRleF9nZXRwcmlvY2VpbGluZyAoY29uc3Qg cHRocmVhZF9tdXRleF90ICogbXV0ZXgsDQ0KCQkJCWludCAqcHJpb2NlaWxp bmcpDQ0Kew0NCiAgcHRocmVhZF9tdXRleF90ICp0aGVtdXRleD0ocHRocmVh ZF9tdXRleF90ICopIG11dGV4Ow0NCiAgaWYgKCptdXRleCA9PSBQVEhSRUFE X01VVEVYX0lOSVRJQUxJWkVSKQ0NCiAgICBfX3B0aHJlYWRfbXV0ZXhfaW5p dCAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleCwgTlVMTCk7DQ0KICBpZiAo KCgocHNoYXJlZF9tdXRleCAqKShtdXRleCkpLT5mbGFncyAmIFNZU19CQVNF ID09IFNZU19CQVNFKSkNDQogICAgLy8gYSBwc2hhcmVkIG11dGV4DQ0KICAg IHRoZW11dGV4ID0gX19wdGhyZWFkX211dGV4X2dldHBzaGFyZWQgKChwdGhy ZWFkX211dGV4X3QgKikgbXV0ZXgpOw0NCiAgaWYgKCF2ZXJpZnlhYmxlX29i amVjdF9pc3ZhbGlkICgqdGhlbXV0ZXgsIFBUSFJFQURfTVVURVhfTUFHSUMp KQ0NCiAgICByZXR1cm4gRUlOVkFMOw0NCiAgLyogV2UgZG9uJ3QgZGVmaW5l IF9QT1NJWF9USFJFQURfUFJJT19QUk9URUNUIGJlY2F1c2Ugd2UgZG8ndCBj dXJyZW50bHkgc3VwcG9ydA0NCiAgICogbXV0ZXggcHJpb3JpdGllcy4NDQog ICAqDQ0KICAgKiBXZSBjYW4gc3VwcG9ydCBtdXRleCBwcmlvcml0aWVzIGlu IHRoZSBmdXR1cmUgdGhvdWdoOg0NCiAgICogU3RvcmUgYSBwcmlvcml0eSB3 aXRoIGVhY2ggbXV0ZXguDQ0KICAgKiBXaGVuIHRoZSBtdXRleCBpcyBvcHRh aW5lZCwgc2V0IHRoZSB0aHJlYWQgcHJpb3JpdHkgYXMgYXBwcm9wcmlhdGUN DQogICAqIFdoZW4gdGhlIG11dGV4IGlzIHJlbGVhc2VkLCByZXNldCB0aGUg dGhyZSBwcmlvcml0eS4NDQogICAqLw0NCiAgcmV0dXJuIEVOT1NZUzsNDQp9 DQ0KDQ0KaW50DQ0KX19wdGhyZWFkX211dGV4X2xvY2sgKHB0aHJlYWRfbXV0 ZXhfdCAqIG11dGV4KQ0NCnsNDQogIHB0aHJlYWRfbXV0ZXhfdCAqdGhlbXV0 ZXggPSBtdXRleDsNDQogIGlmICgqbXV0ZXggPT0gUFRIUkVBRF9NVVRFWF9J TklUSUFMSVpFUikNDQogICAgX19wdGhyZWFkX211dGV4X2luaXQgKG11dGV4 LCBOVUxMKTsNDQogIGlmICgoKChwc2hhcmVkX211dGV4ICopKG11dGV4KSkt PmZsYWdzICYgU1lTX0JBU0UpID09IFNZU19CQVNFKQ0NCiAgICAvLyBhIHBz aGFyZWQgbXV0ZXgNDQogICAgdGhlbXV0ZXggPSBfX3B0aHJlYWRfbXV0ZXhf Z2V0cHNoYXJlZCAobXV0ZXgpOw0NCiAgaWYgKCF2ZXJpZnlhYmxlX29iamVj dF9pc3ZhbGlkICgqdGhlbXV0ZXgsIFBUSFJFQURfTVVURVhfTUFHSUMpKQ0N CiAgICByZXR1cm4gRUlOVkFMOw0NCiAgKCp0aGVtdXRleCktPkxvY2sgKCk7 DQ0KICByZXR1cm4gMDsNDQp9DQ0KDQ0KaW50DQ0KX19wdGhyZWFkX211dGV4 X3RyeWxvY2sgKHB0aHJlYWRfbXV0ZXhfdCAqIG11dGV4KQ0NCnsNDQogIHB0 aHJlYWRfbXV0ZXhfdCAqdGhlbXV0ZXggPSBtdXRleDsNDQogIGlmICgqbXV0 ZXggPT0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUikNDQogICAgX19wdGhy ZWFkX211dGV4X2luaXQgKG11dGV4LCBOVUxMKTsNDQogIGlmICgoKChwc2hh cmVkX211dGV4ICopKG11dGV4KSktPmZsYWdzICYgU1lTX0JBU0UpID09IFNZ U19CQVNFKQ0NCiAgICAvLyBhIHBzaGFyZWQgbXV0ZXgNDQogICAgdGhlbXV0 ZXggPSBfX3B0aHJlYWRfbXV0ZXhfZ2V0cHNoYXJlZCAobXV0ZXgpOw0NCiAg aWYgKCF2ZXJpZnlhYmxlX29iamVjdF9pc3ZhbGlkICgqdGhlbXV0ZXgsIFBU SFJFQURfTVVURVhfTUFHSUMpKQ0NCiAgICByZXR1cm4gRUlOVkFMOw0NCiAg aWYgKCgqdGhlbXV0ZXgpLT5UcnlMb2NrICgpID09IFdBSVRfVElNRU9VVCkN DQogICAgcmV0dXJuIEVCVVNZOw0NCiAgcmV0dXJuIDA7DQ0KfQ0NCg0NCmlu dA0NCl9fcHRocmVhZF9tdXRleF91bmxvY2sgKHB0aHJlYWRfbXV0ZXhfdCAq IG11dGV4KQ0NCnsNDQogIGlmICgqbXV0ZXggPT0gUFRIUkVBRF9NVVRFWF9J TklUSUFMSVpFUikNDQogICAgX19wdGhyZWFkX211dGV4X2luaXQgKG11dGV4 LCBOVUxMKTsNDQogIGlmICgoKChwc2hhcmVkX211dGV4ICopKG11dGV4KSkt PmZsYWdzICYgU1lTX0JBU0UpID09IFNZU19CQVNFKQ0NCiAgICAvLyBhIHBz aGFyZWQgbXV0ZXgNDQogICAgbXV0ZXggPSBfX3B0aHJlYWRfbXV0ZXhfZ2V0 cHNoYXJlZCAobXV0ZXgpOw0NCiAgaWYgKCF2ZXJpZnlhYmxlX29iamVjdF9p c3ZhbGlkICgqbXV0ZXgsIFBUSFJFQURfTVVURVhfTUFHSUMpKQ0NCiAgICBy ZXR1cm4gRUlOVkFMOw0NCiAgKCptdXRleCktPlVuTG9jayAoKTsNDQogIHJl dHVybiAwOw0NCn0NDQoNDQppbnQNDQpfX3B0aHJlYWRfbXV0ZXhfZGVzdHJv eSAocHRocmVhZF9tdXRleF90ICogbXV0ZXgpDQ0Kew0NCiAgaWYgKCptdXRl eCA9PSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSKQ0NCiAgICByZXR1cm4g MDsNDQogIGlmICgoKChwc2hhcmVkX211dGV4ICopKG11dGV4KSktPmZsYWdz ICYgU1lTX0JBU0UpID09IFNZU19CQVNFKQ0NCiAgICAvLyBhIHBzaGFyZWQg bXV0ZXgNDQogICAgbXV0ZXggPSBfX3B0aHJlYWRfbXV0ZXhfZ2V0cHNoYXJl ZCAobXV0ZXgpOw0NCiAgaWYgKCF2ZXJpZnlhYmxlX29iamVjdF9pc3ZhbGlk ICgqbXV0ZXgsIFBUSFJFQURfTVVURVhfTUFHSUMpKQ0NCiAgICByZXR1cm4g RUlOVkFMOw0NCg0NCiAgLyogcmVhZGluZyBhIHdvcmQgaXMgYXRvbWljICov DQ0KICBpZiAoKCptdXRleCktPmNvbmR3YWl0cykNDQogICAgcmV0dXJuIEVC VVNZOw0NCg0NCiAgZGVsZXRlICgqbXV0ZXgpOw0NCiAgKm11dGV4ID0gTlVM TDsNDQogIHJldHVybiAwOw0NCn0NDQoNDQppbnQNDQpfX3B0aHJlYWRfbXV0 ZXhfc2V0cHJpb2NlaWxpbmcgKHB0aHJlYWRfbXV0ZXhfdCAqIG11dGV4LCBp bnQgcHJpb2NlaWxpbmcsDQ0KCQkJCWludCAqb2xkX2NlaWxpbmcpDQ0Kew0N CiAgcHRocmVhZF9tdXRleF90ICp0aGVtdXRleCA9IG11dGV4Ow0NCiAgaWYg KCptdXRleCA9PSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSKQ0NCiAgICBf X3B0aHJlYWRfbXV0ZXhfaW5pdCAobXV0ZXgsIE5VTEwpOw0NCiAgaWYgKCgo KHBzaGFyZWRfbXV0ZXggKikobXV0ZXgpKS0+ZmxhZ3MgJiBTWVNfQkFTRSA9 PSBTWVNfQkFTRSkpDQ0KICAgIC8vIGEgcHNoYXJlZCBtdXRleA0NCiAgICB0 aGVtdXRleCA9IF9fcHRocmVhZF9tdXRleF9nZXRwc2hhcmVkIChtdXRleCk7 DQ0KICBpZiAoIXZlcmlmeWFibGVfb2JqZWN0X2lzdmFsaWQgKCp0aGVtdXRl eCwgUFRIUkVBRF9NVVRFWF9NQUdJQykpDQ0KICAgIHJldHVybiBFSU5WQUw7 DQ0KICByZXR1cm4gRU5PU1lTOw0NCn0NDQoNDQovKiBXaW4zMiBkb2Vzbid0 IHN1cHBvcnQgbXV0ZXggcHJpb3JpdGllcyAtIHNlZSBfX3B0aHJlYWRfbXV0 ZXhfZ2V0cHJpb2NlaWxpbmcNDQogKiBmb3IgbW9yZSBkZXRhaWwgKi8NDQpp bnQNDQpfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldHByb3RvY29sIChjb25zdCBw dGhyZWFkX211dGV4YXR0cl90ICogYXR0ciwNDQoJCQkJIGludCAqcHJvdG9j b2wpDQ0Kew0NCiAgaWYgKCF2ZXJpZnlhYmxlX29iamVjdF9pc3ZhbGlkICgq YXR0ciwgUFRIUkVBRF9NVVRFWF9NQUdJQykpDQ0KICAgIHJldHVybiBFSU5W QUw7DQ0KICByZXR1cm4gRU5PU1lTOw0NCn0NDQoNDQppbnQNDQpfX3B0aHJl YWRfbXV0ZXhhdHRyX2dldHBzaGFyZWQgKGNvbnN0IHB0aHJlYWRfbXV0ZXhh dHRyX3QgKiBhdHRyLA0NCgkJCQlpbnQgKnBzaGFyZWQpDQ0Kew0NCiAgaWYg KCF2ZXJpZnlhYmxlX29iamVjdF9pc3ZhbGlkICgqYXR0ciwgUFRIUkVBRF9N VVRFWF9NQUdJQykpDQ0KICAgIHJldHVybiBFSU5WQUw7DQ0KICAqcHNoYXJl ZCA9ICgqYXR0ciktPnBzaGFyZWQ7DQ0KICByZXR1cm4gMDsNDQp9DQ0KDQ0K LyogV2luMzIgbXV0ZXgncyBhcmUgZXF1aXZhbGVudCB0byBwb3NpeCBSRUNV UlNJVkUgbXV0ZXhzLg0NCiAqIFdlIG5lZWQgdG8gcHV0IGdsdWUgaW4gcGxh Y2UgdG8gc3VwcG9ydCBvdGhlciB0eXBlcyBvZiBtdXRleCdzLiBXZSBtYXAN DQogKiBQVEhSRUFEX01VVEVYX0RFRkFVTFQgdG8gUFRIUkVBRF9NVVRFWF9S RUNVUlNJVkUgYW5kIHJldHVybiBFSU5WQUwgZm9yIG90aGVyIHR5cGVzLg0N CiAqLw0NCmludA0NCl9fcHRocmVhZF9tdXRleGF0dHJfZ2V0dHlwZSAoY29u c3QgcHRocmVhZF9tdXRleGF0dHJfdCAqIGF0dHIsIGludCAqdHlwZSkNDQp7 DQ0KICBpZiAoIXZlcmlmeWFibGVfb2JqZWN0X2lzdmFsaWQgKCphdHRyLCBQ VEhSRUFEX01VVEVYX01BR0lDKSkNDQogICAgcmV0dXJuIEVJTlZBTDsNDQog ICp0eXBlID0gKCphdHRyKS0+bXV0ZXh0eXBlOw0NCiAgcmV0dXJuIDA7DQ0K fQ0NCg0NCi8qIEN1cnJlbnRseSBwdGhyZWFkX211dGV4X2luaXQgaWdub3Jl cyB0aGUgYXR0ciB2YXJpYWJsZSwgdGhpcyBpcyBiZWNhdXNlDQ0KICogbm9u ZSBvZiB0aGUgdmFyaWFibGVzIGhhdmUgYW55IGltcGFjdCBvbiBpdCdzIGJl aGF2aW91ci4NDQogKg0NCiAqIEZJWE1FOiB3cml0ZSBhbmQgdGVzdCBwcm9j ZXNzIHNoYXJlZCBtdXRleCdzLg0NCiAqLw0NCmludA0NCl9fcHRocmVhZF9t dXRleGF0dHJfaW5pdCAocHRocmVhZF9tdXRleGF0dHJfdCAqIGF0dHIpDQ0K ew0NCiAgaWYgKHZlcmlmeWFibGVfb2JqZWN0X2lzdmFsaWQgKCphdHRyLCBQ VEhSRUFEX01VVEVYQVRUUl9NQUdJQykpDQ0KICAgIHJldHVybiBFQlVTWTsN DQoNDQogICphdHRyID0gbmV3IHB0aHJlYWRfbXV0ZXhhdHRyICgpOw0NCiAg aWYgKCF2ZXJpZnlhYmxlX29iamVjdF9pc3ZhbGlkICgqYXR0ciwgUFRIUkVB RF9NVVRFWEFUVFJfTUFHSUMpKQ0NCiAgICB7DQ0KICAgICAgZGVsZXRlICgq YXR0cik7DQ0KICAgICAgKmF0dHIgPSBOVUxMOw0NCiAgICAgIHJldHVybiBF Tk9NRU07DQ0KICAgIH0NDQogIHJldHVybiAwOw0NCn0NDQoNDQppbnQNDQpf X3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kgKHB0aHJlYWRfbXV0ZXhhdHRy X3QgKiBhdHRyKQ0NCnsNDQogIGlmICghdmVyaWZ5YWJsZV9vYmplY3RfaXN2 YWxpZCAoKmF0dHIsIFBUSFJFQURfTVVURVhBVFRSX01BR0lDKSkNDQogICAg cmV0dXJuIEVJTlZBTDsNDQogIGRlbGV0ZSAoKmF0dHIpOw0NCiAgKmF0dHIg PSBOVUxMOw0NCiAgcmV0dXJuIDA7DQ0KfQ0NCg0NCg0NCi8qIFdpbjMyIGRv ZXNuJ3Qgc3VwcG9ydCBtdXRleCBwcmlvcml0aWVzICovDQ0KaW50DQ0KX19w dGhyZWFkX211dGV4YXR0cl9zZXRwcm90b2NvbCAocHRocmVhZF9tdXRleGF0 dHJfdCAqIGF0dHIsIGludCBwcm90b2NvbCkNDQp7DQ0KICBpZiAoIXZlcmlm eWFibGVfb2JqZWN0X2lzdmFsaWQgKCphdHRyLCBQVEhSRUFEX01VVEVYQVRU Ul9NQUdJQykpDQ0KICAgIHJldHVybiBFSU5WQUw7DQ0KICByZXR1cm4gRU5P U1lTOw0NCn0NDQoNDQovKiBXaW4zMiBkb2Vzbid0IHN1cHBvcnQgbXV0ZXgg cHJpb3JpdGllcyAqLw0NCmludA0NCl9fcHRocmVhZF9tdXRleGF0dHJfc2V0 cHJpb2NlaWxpbmcgKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKiBhdHRyLA0NCgkJ CQkgICAgaW50IHByaW9jZWlsaW5nKQ0NCnsNDQogIGlmICghdmVyaWZ5YWJs ZV9vYmplY3RfaXN2YWxpZCAoKmF0dHIsIFBUSFJFQURfTVVURVhBVFRSX01B R0lDKSkNDQogICAgcmV0dXJuIEVJTlZBTDsNDQogIHJldHVybiBFTk9TWVM7 DQ0KfQ0NCg0NCmludA0NCl9fcHRocmVhZF9tdXRleGF0dHJfZ2V0cHJpb2Nl aWxpbmcgKGNvbnN0IHB0aHJlYWRfbXV0ZXhhdHRyX3QgKiBhdHRyLA0NCgkJ CQkgICAgaW50ICpwcmlvY2VpbGluZykNDQp7DQ0KICBpZiAoIXZlcmlmeWFi bGVfb2JqZWN0X2lzdmFsaWQgKCphdHRyLCBQVEhSRUFEX01VVEVYQVRUUl9N QUdJQykpDQ0KICAgIHJldHVybiBFSU5WQUw7DQ0KICByZXR1cm4gRU5PU1lT Ow0NCn0NDQoNDQppbnQNDQpfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHBzaGFy ZWQgKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKiBhdHRyLCBpbnQgcHNoYXJlZCkN DQp7DQ0KICBpZiAoIXZlcmlmeWFibGVfb2JqZWN0X2lzdmFsaWQgKCphdHRy LCBQVEhSRUFEX01VVEVYQVRUUl9NQUdJQykpDQ0KICAgIHJldHVybiBFSU5W QUw7DQ0KICAvKiB3ZSBkb24ndCB1c2UgcHNoYXJlZCBmb3IgYW55dGhpbmcg YXMgeWV0LiBXZSBuZWVkIHRvIHRlc3QgUFJPQ0VTU19TSEFSRUQNDQogICAq IGZ1bmN0aW9uYWxpdHkNDQogICAqLw0NCiAgaWYgKHBzaGFyZWQgIT0gUFRI UkVBRF9QUk9DRVNTX1BSSVZBVEUgJiYgcHNoYXJlZCAhPSBQVEhSRUFEX1BS T0NFU1NfU0hBUkVEKQ0NCiAgICByZXR1cm4gRUlOVkFMOw0NCiAgKCphdHRy KS0+cHNoYXJlZCA9IHBzaGFyZWQ7DQ0KICByZXR1cm4gMDsNDQp9DQ0KDQ0K Lyogc2VlIF9fcHRocmVhZF9tdXRleF9nZXR0eXBlICovDQ0KaW50DQ0KX19w dGhyZWFkX211dGV4YXR0cl9zZXR0eXBlIChwdGhyZWFkX211dGV4YXR0cl90 ICogYXR0ciwgaW50IHR5cGUpDQ0Kew0NCiAgaWYgKCF2ZXJpZnlhYmxlX29i amVjdF9pc3ZhbGlkICgqYXR0ciwgUFRIUkVBRF9NVVRFWEFUVFJfTUFHSUMp KQ0NCiAgICByZXR1cm4gRUlOVkFMOw0NCiAgaWYgKHR5cGUgIT0gUFRIUkVB RF9NVVRFWF9SRUNVUlNJVkUpDQ0KICAgIHJldHVybiBFSU5WQUw7DQ0KICAo KmF0dHIpLT5tdXRleHR5cGUgPSB0eXBlOw0NCiAgcmV0dXJuIDA7DQ0KfQ0N Cg0NCi8qIFNlbWFwaG9yZXMgKi8NDQppbnQNDQpfX3NlbV9pbml0IChzZW1f dCAqIHNlbSwgaW50IHBzaGFyZWQsIHVuc2lnbmVkIGludCB2YWx1ZSkNDQp7 DQ0KICAvKiBvcGVuZ3JvdXAgY2FsbHMgdGhpcyB1bmRlZmluZWQgKi8NDQog IGlmICh2ZXJpZnlhYmxlX29iamVjdF9pc3ZhbGlkICgqc2VtLCBTRU1fTUFH SUMpKQ0NCiAgICByZXR1cm4gRUJVU1k7DQ0KDQ0KICBpZiAodmFsdWUgPiBT RU1fVkFMVUVfTUFYKQ0NCiAgICByZXR1cm4gRUlOVkFMOw0NCg0NCiAgKnNl bSA9IG5ldyBzZW1hcGhvcmUgKHBzaGFyZWQsIHZhbHVlKTsNDQoNDQogIGlm ICghdmVyaWZ5YWJsZV9vYmplY3RfaXN2YWxpZCAoKnNlbSwgU0VNX01BR0lD KSkNDQogICAgew0NCiAgICAgIGRlbGV0ZSAoKnNlbSk7DQ0KICAgICAgKnNl bSA9IE5VTEw7DQ0KICAgICAgcmV0dXJuIEVBR0FJTjsNDQogICAgfQ0NCiAg cmV0dXJuIDA7DQ0KfQ0NCg0NCmludA0NCl9fc2VtX2Rlc3Ryb3kgKHNlbV90 ICogc2VtKQ0NCnsNDQogIGlmICghdmVyaWZ5YWJsZV9vYmplY3RfaXN2YWxp ZCAoKnNlbSwgU0VNX01BR0lDKSkNDQogICAgcmV0dXJuIEVJTlZBTDsNDQoN DQogIC8qIEZJWE1FIC0gbmV3IGZlYXR1cmUgLSB0ZXN0IGZvciBidXN5IGFn YWluc3QgdGhyZWFkcy4uLiAqLw0NCg0NCiAgZGVsZXRlICgqc2VtKTsNDQog ICpzZW0gPSBOVUxMOw0NCiAgcmV0dXJuIDA7DQ0KfQ0NCg0NCmludA0NCl9f c2VtX3dhaXQgKHNlbV90ICogc2VtKQ0NCnsNDQogIGlmICghdmVyaWZ5YWJs ZV9vYmplY3RfaXN2YWxpZCAoKnNlbSwgU0VNX01BR0lDKSkNDQogICAgcmV0 dXJuIEVJTlZBTDsNDQoNDQogICgqc2VtKS0+V2FpdCAoKTsNDQogIHJldHVy biAwOw0NCn0NDQoNDQppbnQNDQpfX3NlbV90cnl3YWl0IChzZW1fdCAqIHNl bSkNDQp7DQ0KICBpZiAoIXZlcmlmeWFibGVfb2JqZWN0X2lzdmFsaWQgKCpz ZW0sIFNFTV9NQUdJQykpDQ0KICAgIHJldHVybiBFSU5WQUw7DQ0KDQ0KICBy ZXR1cm4gKCpzZW0pLT5UcnlXYWl0ICgpOw0NCn0NDQoNDQppbnQNDQpfX3Nl bV9wb3N0IChzZW1fdCAqIHNlbSkNDQp7DQ0KICBpZiAoIXZlcmlmeWFibGVf b2JqZWN0X2lzdmFsaWQgKCpzZW0sIFNFTV9NQUdJQykpDQ0KICAgIHJldHVy biBFSU5WQUw7DQ0KDQ0KICAoKnNlbSktPlBvc3QgKCk7DQ0KICByZXR1cm4g MDsNDQp9DQ0KDQ0KI2VuZGlmIC8vIE1UX1NBRkUNDQo= --42006283-6672078-995055028=:6237 Content-Type: text/plain; charset=us-ascii -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Bug reporting: http://cygwin.com/bugs.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/ --42006283-6672078-995055028=:6237--
webmaster | delorie software privacy |
Copyright © 2019 by DJ Delorie | Updated Jul 2019 |