From owner-freebsd-net@FreeBSD.ORG Wed Mar 25 14:54:43 2015 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id EB15BE00 for ; Wed, 25 Mar 2015 14:54:43 +0000 (UTC) Received: from mx141.netapp.com (mx141.netapp.com [216.240.21.12]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) (Client CN "mx141.netapp.com", Issuer "VeriSign Class 3 International Server CA - G3" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id B9FEAF69 for ; Wed, 25 Mar 2015 14:54:43 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.11,465,1422950400"; d="diff'?scan'208";a="32508761" Received: from hioexcmbx02-prd.hq.netapp.com ([10.122.105.35]) by mx141-out.netapp.com with ESMTP; 25 Mar 2015 07:49:21 -0700 Received: from HIOEXCMBX05-PRD.hq.netapp.com (10.122.105.38) by hioexcmbx02-prd.hq.netapp.com (10.122.105.35) with Microsoft SMTP Server (TLS) id 15.0.995.29; Wed, 25 Mar 2015 07:49:21 -0700 Received: from HIOEXCMBX05-PRD.hq.netapp.com ([::1]) by hioexcmbx05-prd.hq.netapp.com ([fe80::29f7:3e3f:78c5:a0bc%21]) with mapi id 15.00.0995.031; Wed, 25 Mar 2015 07:49:21 -0700 From: "Scheffenegger, Richard" To: "freebsd-net@freebsd.org" Subject: TCP SACK improvements (RFC6675 rescue retransmission and lost retransmission detection) Thread-Topic: TCP SACK improvements (RFC6675 rescue retransmission and lost retransmission detection) Thread-Index: AdBnCsqvL19uko8LSm+1SaVA1edBAg== Date: Wed, 25 Mar 2015 14:49:20 +0000 Message-ID: <046c2d4c51964cb698d0d27f1b8d0451@hioexcmbx05-prd.hq.netapp.com> Accept-Language: de-AT, en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-originating-ip: [10.120.60.34] Content-Type: multipart/mixed; boundary="_002_046c2d4c51964cb698d0d27f1b8d0451hioexcmbx05prdhqnetappc_" MIME-Version: 1.0 X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Mar 2015 14:54:44 -0000 --_002_046c2d4c51964cb698d0d27f1b8d0451hioexcmbx05prdhqnetappc_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi, I hope this is the correct forum to ask for help improving a rather crude p= atch to introduce RFC6675 Rescue Retransmissions and efficient Lost Retrans= mission Detection. Note that this is not a full implementation of the RFC66= 75. The patch that I have is against 8.0, but I believe the SACK scoreboard has= not really changed and thus should be applicable still. One outstanding issue of that patch is the missing interaction with the con= gestion control part, when retransmitting a lost retransmission (that shoul= d reduce cwnd once per cycle). Also, the implementation is not very efficient, as more traversals of the s= coreboard are done checking the elegibility of prior holes to be in need of= being retransmitted once more... Best regards, Richard Scheffenegger --_002_046c2d4c51964cb698d0d27f1b8d0451hioexcmbx05prdhqnetappc_ Content-Type: application/octet-stream; name="sack5-freebsd8.0-release.diff" Content-Description: sack5-freebsd8.0-release.diff Content-Disposition: attachment; filename="sack5-freebsd8.0-release.diff"; size=6825; creation-date="Tue, 05 Oct 2010 14:20:26 GMT"; modification-date="Wed, 25 Mar 2015 13:00:00 GMT" Content-Transfer-Encoding: base64 LS0tIC4uL25ldGluZXQub3JpZy90Y3Bfc2Fjay5jICAyMDEwLTA5LTEwIDIzOjM5OjI1LjAwMDAw MDAwMCArMDIwMA0KKysrIC4uL25ldGluZXQvdGNwX3NhY2suYyAyMDEwLTA5LTIzIDIwOjM3OjA0 LjAwMDAwMDAwMCArMDIwMA0KQEAgLTM0MCwxMCArMzQwLDUyIEBADQogIC8qIEZyZWUgdGhpcyBT QUNLIGhvbGUuICovDQogIHRjcF9zYWNraG9sZV9mcmVlKHRwLCBob2xlKTsNCiB9DQogDQogLyoN CisgKiBDYWxjdWxhdGUgdGhlIHNlcXVlbmNlIG51bWJlciwgd2hpY2ggd2hlbiBTQUNLZWQgd2ls bCBpbmRpY2F0ZSBhIA0KKyAqIGxvc3QgcmV0cmFuc21pc3Npb24uDQorICovDQordGNwX3NlcQ0K K3RjcF9zYWNrX2RvbmVieShpbnQgYnl0ZXMsIHN0cnVjdCB0Y3BjYiAqdHAsIHN0cnVjdCBzYWNr aG9sZSAqcCkNCit7DQorICAgIHdoaWxlICgocCAhPSBOVUxMKSAmJiAoYnl0ZXMgPj0gMCkpIHsN CisgICAgICAgIHAgPSBUQUlMUV9ORVhUKHAsIHNjYmxpbmspOw0KKyAgICAgICAgaWYgKHAgIT0g TlVMTCkgew0KKyAgICAgICAgICAgIGJ5dGVzIC09IChwLT5lbmQgLSBwLT5zdGFydCk7DQorICAg ICAgICAgICAgaWYgKChieXRlcyA+PSAwKSAmJiAvLyBSRkM2Njc1ICJyZXNjdWUgcmV0cmFuc21p c3Npb24iDQorICAgICAgICAgICAgICAgIChUQUlMUV9ORVhUKHAsIHNjYmxpbmspID09IE5VTEwp KQ0KKyAgICAgICAgICAgICAgICAgYnl0ZXMgPSAtbWluKHAtPmVuZCAtIHAtPnN0YXJ0LCB0cC0+ dF9tYXhzZWcpOyAgDQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKHAgPT0gTlVMTCkgew0K KyAgICAgICAgcmV0dXJuIHRwLT5zbmRfbnh0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcmV0 dXJuIChwLT5lbmQgKyBieXRlcyk7DQorICAgIH0NCit9DQorDQorLyoNCisgKiBDaGVjayB3ZXRo ZXIgYSBnaXZlbiBzZXF1ZW5jZSBudW1iZXIgaGFzIGJlZW4gU0FDS2VkIG9yIG5vdC4NCisgKi8N CitpbnQNCit0Y3Bfc2Fja19pc2hvbGUodGNwX3NlcSBzZXEsIHN0cnVjdCB0Y3BjYiAqdHAsIHN0 cnVjdCBzYWNraG9sZSAqcCkNCit7DQorICAgIGludCBiID0gMDsNCisgICAgaWYgKFNFUV9HRVEo c2VxLCB0cC0+c25kX2ZhY2spKSB7DQorIHJldHVybiAxOw0KKyAgICB9DQorICAgIHdoaWxlIChw ICE9IE5VTEwpIHsNCisgaWYgKFNFUV9MVChzZXEsIHAtPnN0YXJ0KSkNCisgICAgIGJyZWFrOw0K KyBpZiAoU0VRX0dFUShzZXEsIHAtPnN0YXJ0KSAmJg0KKyAgIFNFUV9MVChzZXEsIHAtPmVuZCkp IHsNCisgICAgIGIgPSAxOw0KKyAgICAgYnJlYWs7DQorIH0NCisgcCA9IFRBSUxRX05FWFQocCwg c2NibGluayk7DQorICAgIH0NCisgICAgcmV0dXJuIGI7DQorfQ0KKw0KKy8qDQogICogUHJvY2Vz cyBjdW11bGF0aXZlIEFDSyBhbmQgdGhlIFRDUCBTQUNLIG9wdGlvbiB0byB1cGRhdGUgdGhlIHNj b3JlYm9hcmQuDQogICogdHAtPnNuZF9ob2xlcyBpcyBhbiBvcmRlcmVkIGxpc3Qgb2YgaG9sZXMg KG9sZGVzdCB0byBuZXdlc3QsIGluIHRlcm1zIG9mDQogICogdGhlIHNlcXVlbmNlIHNwYWNlKS4N CiAgKi8NCiB2b2lkDQpAQCAtNDgwLDExICs1MjIsMTUgQEANCiAgICAgICAqIHByZXZpb3VzIGhv bGUuDQogICAgICAgKi8NCiAgICAgIGN1ciA9IFRBSUxRX1BSRVYoY3VyLCBzYWNraG9sZV9oZWFk LCBzY2JsaW5rKTsNCiAgICAgIGNvbnRpbnVlOw0KICAgIH0NCi0gICB0cC0+c2Fja2hpbnQuc2Fj a19ieXRlc19yZXhtaXQgLT0gKGN1ci0+cnhtaXQgLSBjdXItPnN0YXJ0KTsNCisgICAvKioqKioN CisgICAgKiBsb3N0IGFnYWluDQorICAgICoqKioqLw0KKyAgIHRwLT5zYWNraGludC5zYWNrX2J5 dGVzX3JleG1pdCAtPSAoDQorICAgICBTRVFfTUlOKGN1ci0+cnhtaXQsIGN1ci0+ZW5kKSAtIGN1 ci0+c3RhcnQpOw0KICAgIEtBU1NFUlQodHAtPnNhY2toaW50LnNhY2tfYnl0ZXNfcmV4bWl0ID49 IDAsDQogICAgICAgICgic2Fja2hpbnQgYnl0ZXMgcnR4ID49IDAiKSk7DQogICAgaWYgKFNFUV9M RVEoc2Jsa3AtPnN0YXJ0LCBjdXItPnN0YXJ0KSkgew0KICAgICAgLyogRGF0YSBhY2tzIGF0IGxl YXN0IHRoZSBiZWdpbm5pbmcgb2YgaG9sZS4gKi8NCiAgICAgIGlmIChTRVFfR0VRKHNibGtwLT5l bmQsIGN1ci0+ZW5kKSkgew0KQEAgLTUwNiwxMSArNTUyLDE3IEBADQogICAgfSBlbHNlIHsNCiAg ICAgIC8qIERhdGEgYWNrcyBhdCBsZWFzdCB0aGUgZW5kIG9mIGhvbGUuICovDQogICAgICBpZiAo U0VRX0dFUShzYmxrcC0+ZW5kLCBjdXItPmVuZCkpIHsNCiAgICAgICAgLyogTW92ZSBlbmQgb2Yg aG9sZSBiYWNrd2FyZC4gKi8NCiAgICAgICAgY3VyLT5lbmQgPSBzYmxrcC0+c3RhcnQ7DQotICAg ICAgIGN1ci0+cnhtaXQgPSBTRVFfTUlOKGN1ci0+cnhtaXQsIGN1ci0+ZW5kKTsNCisgICAgICAg LyoqKioqDQorICAgICAgICAqIGxvc3QgYWdhaW4NCisgICAgICAgICoqKioqLw0KKyAgICAgICBp ZiAoU0VRX0dFUShjdXItPnJ4bWl0LCBjdXItPmVuZCkpIHsNCisgICAgICAgICAgIGN1ci0+cnht aXQgPSB0Y3Bfc2Fja19kb25lYnkoDQorICAgICAgICAgdGNwcmV4bXR0aHJlc2ggKiB0cC0+dF9t YXhzZWcsIHRwLCBjdXIpOw0KKyAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICAvKg0K ICAgICAgICAgKiBBQ0tzIHNvbWUgZGF0YSBpbiBtaWRkbGUgb2YgYSBob2xlOyBuZWVkDQogICAg ICAgICAqIHRvIHNwbGl0IGN1cnJlbnQgaG9sZQ0KICAgICAgICAgKi8NCkBAIC01MjIsMjYgKzU3 NCw0NyBAQA0KICAgICAgICAgICAgdHAtPnNhY2toaW50LnNhY2tfYnl0ZXNfcmV4bWl0DQogICAg ICAgICAgICAgICAgKz0gKHRlbXAtPnJ4bWl0DQogICAgICAgICAgICAgICAgLSB0ZW1wLT5zdGFy dCk7DQogICAgICAgICAgfQ0KICAgICAgICAgIGN1ci0+ZW5kID0gc2Jsa3AtPnN0YXJ0Ow0KLSAg ICAgICAgIGN1ci0+cnhtaXQgPSBTRVFfTUlOKGN1ci0+cnhtaXQsDQotICAgICAgICAgICAgIGN1 ci0+ZW5kKTsNCisgICAgICAgICAvKioqKioNCisgICAgICAgICAgKiBsb3N0IGFnYWluDQorICAg ICAgICAgICoqKioqLw0KKyAgICAgICAgIGlmIChTRVFfR0VRKGN1ci0+cnhtaXQsIGN1ci0+ZW5k KSkgew0KKyAgICAgICAgICAgICBjdXItPnJ4bWl0ID0gdGNwX3NhY2tfZG9uZWJ5KA0KKyAgICAg ICAgICAgdGNwcmV4bXR0aHJlc2ggKiB0cC0+dF9tYXhzZWcsIHRwLCBjdXIpOw0KIw0KIw0KIw0K KyAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCi0gICB0cC0+c2Fja2hpbnQu c2Fja19ieXRlc19yZXhtaXQgKz0gKGN1ci0+cnhtaXQgLSBjdXItPnN0YXJ0KTsNCisgICAvKioq KioNCisgICAgKiBsb3N0IGFnYWluDQorICAgICoqKioqLw0KKyAgIHRwLT5zYWNraGludC5zYWNr X2J5dGVzX3JleG1pdCArPSANCisgICAgIChTRVFfTUlOKGN1ci0+cnhtaXQsIGN1ci0+ZW5kKSAt IGN1ci0+c3RhcnQpOw0KICAgIC8qDQogICAgICogVGVzdGluZyBzYmxrcC0+c3RhcnQgYWdhaW5z dCBjdXItPnN0YXJ0IHRlbGxzIHVzIHdoZXRoZXINCiAgICAgKiB3ZSdyZSBkb25lIHdpdGggdGhl IHNhY2sgYmxvY2sgb3IgdGhlIHNhY2sgaG9sZS4NCiAgICAgKiBBY2NvcmRpbmdseSwgd2UgYWR2 YW5jZSBvbmUgb3IgdGhlIG90aGVyLg0KICAgICAqLw0KICAgIGlmIChTRVFfTEVRKHNibGtwLT5z dGFydCwgY3VyLT5zdGFydCkpDQogICAgICBjdXIgPSBUQUlMUV9QUkVWKGN1ciwgc2Fja2hvbGVf aGVhZCwgc2NibGluayk7DQogICAgZWxzZQ0KICAgICAgc2Jsa3AtLTsNCiAgfQ0KKyAvKioqKioN CisgICogbG9zdCBhZ2Fpbg0KKyAgKioqKiovDQorIGlmICgodGVtcCA9IHRwLT5zYWNraGludC5u ZXh0aG9sZSkgIT0gTlVMTCkgew0KKyAgICAgZG8gew0KKyAgIGlmICghKHRjcF9zYWNrX2lzaG9s ZSh0ZW1wLT5yeG1pdCwgdHAsIHRlbXApKSkgew0KKyAgICAgICB0ZW1wLT5yeG1pdCA9IHRlbXAt PnN0YXJ0Ow0KKyAgICAgICB0cC0+c2Fja2hpbnQubmV4dGhvbGUgPSB0ZW1wOw0KKyAgICAgICAv L1RDUFNUQVRfSU5DKHRjcHNfc2Fja19yZXhtaXRfbG9zdCk7DQorICAgfQ0KKyAgICAgfSB3aGls ZSAoKHRlbXAgPSBUQUlMUV9QUkVWKHRlbXAsIHNhY2tob2xlX2hlYWQsIHNjYmxpbmspKSAhPSBO VUxMKTsNCisgfQ0KIH0NCiANCiAvKg0KICAqIEZyZWUgYWxsIFNBQ0sgaG9sZXMgdG8gY2xlYXIg dGhlIHNjb3JlYm9hcmQuDQogICovDQotLS0gLi4vbmV0aW5ldC5vcmlnL3RjcF92YXIuaCAyMDEw LTA5LTEwIDIzOjM5OjI1LjAwMDAwMDAwMCArMDIwMA0KKysrIC4uL25ldGluZXQvdGNwX3Zhci5o ICAyMDEwLTA5LTE5IDIwOjU5OjQyLjAwMDAwMDAwMCArMDIwMA0KQEAgLTM2LDEwICszNiwxMiBA QA0KICNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPg0KIA0KICNpZmRlZiBfS0VSTkVMDQogI2luY2x1 ZGUgPG5ldC92bmV0Lmg+DQogDQorc3RhdGljIGNvbnN0IGludCB0Y3ByZXhtdHRocmVzaCA9IDM7 DQorDQogLyoNCiAgKiBLZXJuZWwgdmFyaWFibGVzIGZvciB0Y3AuDQogICovDQogVk5FVF9ERUNM QVJFKGludCwgdGNwX2RvX3JmYzEzMjMpOw0KIFZORVRfREVDTEFSRShpbnQsIHRjcF9yZWFzc19x c2l6ZSk7DQpAQCAtNDU3LDEwICs0NTksMTEgQEANCiANCiAgLyogU0FDSyByZWxhdGVkIHN0YXRz ICovDQogIHVfbG9uZyAgdGNwc19zYWNrX3JlY292ZXJ5X2VwaXNvZGU7IC8qIFNBQ0sgcmVjb3Zl cnkgZXBpc29kZXMgKi8NCiAgdV9sb25nICB0Y3BzX3NhY2tfcmV4bWl0czsgICAgICAvKiBTQUNL IHJleG1pdCBzZWdtZW50cyAgICovDQogIHVfbG9uZyAgdGNwc19zYWNrX3JleG1pdF9ieXRlczsg ICAgIC8qIFNBQ0sgcmV4bWl0IGJ5dGVzICAgICAgKi8NCisvLyB1X2xvbmcgIHRjcHNfc2Fja19y ZXhtaXRfbG9zdDsgICAgICAvKiBTQUNLIGxvc3QgcmV4bWl0IHNlZ21lbnRzICovDQogIHVfbG9u ZyAgdGNwc19zYWNrX3Jjdl9ibG9ja3M7ICAgICAvKiBTQUNLIGJsb2NrcyAob3B0aW9ucykgcmVj ZWl2ZWQgKi8NCiAgdV9sb25nICB0Y3BzX3NhY2tfc2VuZF9ibG9ja3M7ICAgICAgLyogU0FDSyBi bG9ja3MgKG9wdGlvbnMpIHNlbnQgICAgICovDQogIHVfbG9uZyAgdGNwc19zYWNrX3Nib3ZlcmZs b3c7ICAgICAgIC8qIHRpbWVzIHNjb3JlYm9hcmQgb3ZlcmZsb3dlZCAqLw0KICANCiAgLyogRUNO IHJlbGF0ZWQgc3RhdHMgKi8NCkBAIC02OTksMTAgKzcwMiwxMiBAQA0KIGV4dGVybiBzdHJ1Y3Qg cHJfdXNycmVxcyB0Y3BfdXNycmVxczsNCiBleHRlcm4gdV9sb25nIHRjcF9zZW5kc3BhY2U7DQog ZXh0ZXJuIHVfbG9uZyB0Y3BfcmVjdnNwYWNlOw0KIHRjcF9zZXEgdGNwX25ld19pc24oc3RydWN0 IHRjcGNiICopOw0KIA0KK3RjcF9zZXEgICB0Y3Bfc2Fja19kb25lYnkoaW50LCBzdHJ1Y3QgdGNw Y2IgKiwgc3RydWN0IHNhY2tob2xlICopOw0KK2ludCAgIHRjcF9zYWNrX2lzaG9sZSh0Y3Bfc2Vx LCBzdHJ1Y3QgdGNwY2IgKiwgc3RydWN0IHNhY2tob2xlICopOw0KIHZvaWQgIHRjcF9zYWNrX2Rv YWNrKHN0cnVjdCB0Y3BjYiAqLCBzdHJ1Y3QgdGNwb3B0ICosIHRjcF9zZXEpOw0KIHZvaWQgIHRj cF91cGRhdGVfc2Fja19saXN0KHN0cnVjdCB0Y3BjYiAqdHAsIHRjcF9zZXEgcmN2X2xhc3RzdGFy dCwgdGNwX3NlcSByY3ZfbGFzdGVuZCk7DQogdm9pZCAgdGNwX2NsZWFuX3NhY2tyZXBvcnQoc3Ry dWN0IHRjcGNiICp0cCk7DQogdm9pZCAgdGNwX3NhY2tfYWRqdXN0KHN0cnVjdCB0Y3BjYiAqdHAp Ow0KIHN0cnVjdCBzYWNraG9sZSAqdGNwX3NhY2tfb3V0cHV0KHN0cnVjdCB0Y3BjYiAqdHAsIGlu dCAqc2Fja19ieXRlc19yZXhtdCk7DQotLS0gLi4vbmV0aW5ldC5vcmlnL3RjcF9pbnB1dC5jIDIw MTAtMDktMTEgMjI6Mzg6NTMuMDAwMDAwMDAwICswMjAwDQorKysgLi4vbmV0aW5ldC90Y3BfaW5w dXQuYyAgMjAxMC0wOS0xNSAxOTowODo0MS4wMDAwMDAwMDAgKzAyMDANCkBAIC05NCwxMiArOTQs MTAgQEANCiANCiAjaW5jbHVkZSA8bWFjaGluZS9pbl9ja3N1bS5oPg0KIA0KICNpbmNsdWRlIDxz ZWN1cml0eS9tYWMvbWFjX2ZyYW1ld29yay5oPg0KIA0KLXN0YXRpYyBjb25zdCBpbnQgdGNwcmV4 bXR0aHJlc2ggPSAzOw0KLQ0KIFZORVRfREVGSU5FKHN0cnVjdCB0Y3BzdGF0LCB0Y3BzdGF0KTsN CiBWTkVUX0RFRklORShpbnQsIGJsYWNraG9sZSk7DQogVk5FVF9ERUZJTkUoaW50LCB0Y3BfZGVs YWNrX2VuYWJsZWQpOw0KIFZORVRfREVGSU5FKGludCwgZHJvcF9zeW5maW4pOw0KIFZORVRfREVG SU5FKGludCwgdGNwX2RvX3JmYzMwNDIpOw0KLS0tIC4uL25ldGluZXQub3JpZy90Y3Bfb3V0cHV0 LmMgIDIwMTAtMDktMTAgMjM6Mzk6MjUuMDAwMDAwMDAwICswMjAwDQorKysgLi4vbmV0aW5ldC90 Y3Bfb3V0cHV0LmMgMjAxMC0wOS0xNSAxOTowMzo1OS4wMDAwMDAwMDAgKzAyMDANCkBAIC05NTEs MTAgKzk1MSwxNyBAQA0KICAgIGVsc2UNCiAgICAgIHRoLT50aF9zZXEgPSBodG9ubCh0cC0+c25k X21heCk7DQogIH0gZWxzZSB7DQogICAgdGgtPnRoX3NlcSA9IGh0b25sKHAtPnJ4bWl0KTsNCiAg ICBwLT5yeG1pdCArPSBsZW47DQorICAgLyoqKioqDQorICAgICogbG9zdCBhZ2Fpbg0KKyAgICAq KioqKi8NCisgICBpZiAoU0VRX0dFUShwLT5yeG1pdCwgcC0+ZW5kKSkgew0KKyAgICAgICBwLT5y eG1pdCA9IHRjcF9zYWNrX2RvbmVieSgNCisgICAgIHRjcHJleG10dGhyZXNoICogdHAtPnRfbWF4 c2VnLCB0cCwgcCk7DQorICAgfQ0KICAgIHRwLT5zYWNraGludC5zYWNrX2J5dGVzX3JleG1pdCAr PSBsZW47DQogIH0NCiAgdGgtPnRoX2FjayA9IGh0b25sKHRwLT5yY3Zfbnh0KTsNCiAgaWYgKG9w dGxlbikgew0KICAgIGJjb3B5KG9wdCwgdGggKyAxLCBvcHRsZW4pOw0K --_002_046c2d4c51964cb698d0d27f1b8d0451hioexcmbx05prdhqnetappc_--