From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 149B84652E for ; Sun, 21 May 2023 13:05:15 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7CA3868C17E; Sun, 21 May 2023 16:03:51 +0300 (EEST) Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 579AA68C163 for ; Sun, 21 May 2023 16:03:48 +0300 (EEST) Received: by mail-pf1-f181.google.com with SMTP id d2e1a72fcca58-64d3fbb8c1cso2106566b3a.3 for ; Sun, 21 May 2023 06:03:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1684674226; x=1687266226; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=1lRmsq1V9gKOTqdK1bT4cLagNHzvsjR7+QsllGM/6oE=; b=Ja0H0v4I8LeSIIHbz0fIxg6P+JrOf440eN/oofRKq+vjKCQot8YcOHuckXWDRiR2ez j5MiDIKXiGKzEJL82UwmPwf71e9hPJZDhJOEDj3DX2MOuDer8n6f3KxhezIez/Y2C2HG WlQF3BCG6v2EWWOKjIQV1EccV/FYWGfxHQr6qeaOKiRFFe1DW8uUgxGfOmxUjvQPeyZq CXMYhKK36agzkk0kXRGKe8IkKF18in3VCb5Z3D6JNczPnfW+THStfYqqaErIpmKOB7Ia zkuW5nDu6g1ZiG2ojhDfbnfWboG9WM8sNrHPB8ewVwOX+8MtXz+bqxSnMOWFzngVoxDG A9XA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684674226; x=1687266226; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=1lRmsq1V9gKOTqdK1bT4cLagNHzvsjR7+QsllGM/6oE=; b=PaeKvJDODla37/PDxE4ecpG2rfGJMNymoeSxEBNiX9/7scbuti77PbhiwVTPSTUh6L Gn9Texo/vRIYlQ33XlfV0oU6wVQ9R45FFjysPPAJRrTj2rQ0QFdA7pEKC4uFteGhNxsH n0n02ZFB1GYqD+mkEqXaDJU3nELT+kB4sD3p5pNMXpOSQu+E2K6Y2I7oX0BB/Wm/h0OU zzmodT6o8enob3k6oeiEg8IvUCnxEPeHMod5w17I2eM/2gi6T9AQo69sWBpbWeUTh5b2 lsLO142F+7nShof4n+1J9wBz5tRnWvWhIlj+AHGtR7/gpGiNbTi6IXuUkFCMrN488NPM 0+sg== X-Gm-Message-State: AC+VfDxHu5neOErBs4PXtysr/Zcup0TESwtXmxrS7OldqctetmBMcoro qAiPn8OmXJI43NQuSyD70T7E/TVrqyUvcA== X-Google-Smtp-Source: ACHHUZ5Wl43//Glsm0S4QAa1o2hLas9JjQcBT8euvFHo8TCfPsVAFQziJFE/RVKr3VO5BSqfDkK6qQ== X-Received: by 2002:a05:6a20:1590:b0:101:8b:43a5 with SMTP id h16-20020a056a20159000b00101008b43a5mr9287974pzj.8.1684674224489; Sun, 21 May 2023 06:03:44 -0700 (PDT) Received: from NuoMi.localdomain ([112.64.8.97]) by smtp.gmail.com with ESMTPSA id t9-20020aa79389000000b0064d45eea573sm1671872pfe.41.2023.05.21.06.03.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 21 May 2023 06:03:44 -0700 (PDT) From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Sun, 21 May 2023 21:03:14 +0800 Message-Id: <20230521130319.13813-10-nuomi2021@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230521130319.13813-1-nuomi2021@gmail.com> References: <20230521130319.13813-1-nuomi2021@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 09/14] vvcdec: add intra prediction X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Nuo Mi Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: LS0tCiBsaWJhdmNvZGVjL3Z2Yy9NYWtlZmlsZSAgICAgICAgICAgICB8ICAgIDMgKy0KIGxpYmF2 Y29kZWMvdnZjL3Z2Y19jdHUuYyAgICAgICAgICAgIHwgICA0MCArKwogbGliYXZjb2RlYy92dmMv dnZjX2N0dS5oICAgICAgICAgICAgfCAgICAyICsKIGxpYmF2Y29kZWMvdnZjL3Z2Y19pbnRyYS5j ICAgICAgICAgIHwgIDc2MyArKysrKysrKysrKysrKysrKysrKwogbGliYXZjb2RlYy92dmMvdnZj X2ludHJhLmggICAgICAgICAgfCAgIDQ5ICsrCiBsaWJhdmNvZGVjL3Z2Yy92dmNfaW50cmFfdGVt cGxhdGUuYyB8IDEwMTggKysrKysrKysrKysrKysrKysrKysrKysrKysrCiA2IGZpbGVzIGNoYW5n ZWQsIDE4NzQgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQogY3JlYXRlIG1vZGUgMTAwNjQ0 IGxpYmF2Y29kZWMvdnZjL3Z2Y19pbnRyYS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgbGliYXZjb2Rl Yy92dmMvdnZjX2ludHJhLmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWJhdmNvZGVjL3Z2Yy92dmNf aW50cmFfdGVtcGxhdGUuYwoKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdnZjL01ha2VmaWxlIGIv bGliYXZjb2RlYy92dmMvTWFrZWZpbGUKaW5kZXggZDUzNmE2YjFlYS4uOWQ5NWExNTQyNCAxMDA2 NDQKLS0tIGEvbGliYXZjb2RlYy92dmMvTWFrZWZpbGUKKysrIGIvbGliYXZjb2RlYy92dmMvTWFr ZWZpbGUKQEAgLTEwLDQgKzEwLDUgQEAgT0JKUy0kKENPTkZJR19WVkNfREVDT0RFUikgICAgICAg ICAgKz0gIHZ2Yy92dmNkZWMubyAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB2dmMvdnZjX212cy5vICAgICAgICAgICBcCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgdnZjL3Z2Y19jdHUubyAgICAgICAgICAgXAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ2Yy92dmNfaW50ZXIubyAgICAg ICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dmMvdnZjX2l0 eF8xZC5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnZjL3Z2Y19p dHhfMWQubyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHZ2Yy92dmNfaW50cmEubwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92dmMvdnZjX2N0dS5jIGIv bGliYXZjb2RlYy92dmMvdnZjX2N0dS5jCmluZGV4IDRlNmU1ODI3MTguLmE1ZmI3ODhmNmUgMTAw NjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdnZjL3Z2Y19jdHUuYworKysgYi9saWJhdmNvZGVjL3Z2Yy92 dmNfY3R1LmMKQEAgLTI1LDYgKzI1LDM1IEBACiAjaW5jbHVkZSAidnZjX2RhdGEuaCIKICNpbmNs dWRlICJ2dmNfbXZzLmgiCiAKK3ZvaWQgZmZfdnZjX2RlY29kZV9uZWlnaGJvdXIoVlZDTG9jYWxD b250ZXh0ICpsYywgY29uc3QgaW50IHhfY3RiLCBjb25zdCBpbnQgeV9jdGIsCisgICAgY29uc3Qg aW50IHJ4LCBjb25zdCBpbnQgcnksIGNvbnN0IGludCBycykKK3sKKyAgICBWVkNGcmFtZUNvbnRl eHQgKmZjID0gbGMtPmZjOworICAgIGNvbnN0IGludCBjdGJfc2l6ZSAgICAgICAgID0gZmMtPnBz LnNwcy0+Y3RiX3NpemVfeTsKKworICAgIGxjLT5lbmRfb2ZfdGlsZXNfeCA9IGZjLT5wcy5zcHMt PndpZHRoOworICAgIGxjLT5lbmRfb2ZfdGlsZXNfeSA9IGZjLT5wcy5zcHMtPmhlaWdodDsKKyAg ICBpZiAoZmMtPnBzLnBwcy0+Y3RiX3RvX2NvbF9iZFtyeF0gIT0gZmMtPnBzLnBwcy0+Y3RiX3Rv X2NvbF9iZFtyeCArIDFdKQorICAgICAgICBsYy0+ZW5kX29mX3RpbGVzX3ggPSBGRk1JTih4X2N0 YiArIGN0Yl9zaXplLCBsYy0+ZW5kX29mX3RpbGVzX3gpOworICAgIGlmIChmYy0+cHMucHBzLT5j dGJfdG9fcm93X2JkW3J5XSAhPSBmYy0+cHMucHBzLT5jdGJfdG9fcm93X2JkW3J5ICsgMV0pCisg ICAgICAgIGxjLT5lbmRfb2ZfdGlsZXNfeSA9IEZGTUlOKHlfY3RiICsgY3RiX3NpemUsIGxjLT5l bmRfb2ZfdGlsZXNfeSk7CisKKyAgICBsYy0+Ym91bmRhcnlfZmxhZ3MgPSAwOworICAgIGlmIChy eCA+IDAgJiYgZmMtPnBzLnBwcy0+Y3RiX3RvX2NvbF9iZFtyeF0gIT0gZmMtPnBzLnBwcy0+Y3Ri X3RvX2NvbF9iZFtyeCAtIDFdKQorICAgICAgICBsYy0+Ym91bmRhcnlfZmxhZ3MgfD0gQk9VTkRB UllfTEVGVF9USUxFOworICAgIGlmIChyeCA+IDAgJiYgZmMtPnRhYi5zbGljZV9pZHhbcnNdICE9 IGZjLT50YWIuc2xpY2VfaWR4W3JzIC0gMV0pCisgICAgICAgIGxjLT5ib3VuZGFyeV9mbGFncyB8 PSBCT1VOREFSWV9MRUZUX1NMSUNFOworICAgIGlmIChyeSA+IDAgJiYgZmMtPnBzLnBwcy0+Y3Ri X3RvX3Jvd19iZFtyeV0gIT0gZmMtPnBzLnBwcy0+Y3RiX3RvX3Jvd19iZFtyeSAtIDFdKQorICAg ICAgICBsYy0+Ym91bmRhcnlfZmxhZ3MgfD0gQk9VTkRBUllfVVBQRVJfVElMRTsKKyAgICBpZiAo cnkgPiAwICYmIGZjLT50YWIuc2xpY2VfaWR4W3JzXSAhPSBmYy0+dGFiLnNsaWNlX2lkeFtycyAt IGZjLT5wcy5wcHMtPmN0Yl93aWR0aF0pCisgICAgICAgIGxjLT5ib3VuZGFyeV9mbGFncyB8PSBC T1VOREFSWV9VUFBFUl9TTElDRTsKKyAgICBsYy0+Y3RiX2xlZnRfZmxhZyA9IHJ4ID4gMCAmJiAh KGxjLT5ib3VuZGFyeV9mbGFncyAmIEJPVU5EQVJZX0xFRlRfVElMRSk7CisgICAgbGMtPmN0Yl91 cF9mbGFnICAgPSByeSA+IDAgJiYgIShsYy0+Ym91bmRhcnlfZmxhZ3MgJiBCT1VOREFSWV9VUFBF Ul9USUxFKSAmJiAhKGxjLT5ib3VuZGFyeV9mbGFncyAmIEJPVU5EQVJZX1VQUEVSX1NMSUNFKTsK KyAgICBsYy0+Y3RiX3VwX3JpZ2h0X2ZsYWcgPSBsYy0+Y3RiX3VwX2ZsYWcgJiYgKGZjLT5wcy5w cHMtPmN0Yl90b19jb2xfYmRbcnhdID09IGZjLT5wcy5wcHMtPmN0Yl90b19jb2xfYmRbcnggKyAx XSkgJiYKKyAgICAgICAgKGZjLT5wcy5wcHMtPmN0Yl90b19yb3dfYmRbcnldID09IGZjLT5wcy5w cHMtPmN0Yl90b19yb3dfYmRbcnkgLSAxXSk7CisgICAgbGMtPmN0Yl91cF9sZWZ0X2ZsYWcgPSBs Yy0+Y3RiX2xlZnRfZmxhZyAmJiBsYy0+Y3RiX3VwX2ZsYWc7Cit9CisKIHZvaWQgZmZfdnZjX3Nl dF9uZWlnaGJvdXJfYXZhaWxhYmxlKFZWQ0xvY2FsQ29udGV4dCAqbGMsCiAgICAgY29uc3QgaW50 IHgwLCBjb25zdCBpbnQgeTAsIGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCkKIHsKQEAgLTM5LDMg KzY4LDE0IEBAIHZvaWQgZmZfdnZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKFZWQ0xvY2FsQ29u dGV4dCAqbGMsCiAgICAgICAgICAgICAoeDBiICsgdyA9PSAxIDw8IGxvZzJfY3RiX3NpemUpID8g bGMtPmN0Yl91cF9yaWdodF9mbGFnICYmICF5MGIgOiBsYy0+bmEuY2FuZF91cDsKICAgICBsYy0+ bmEuY2FuZF91cF9yaWdodCA9IGxjLT5uYS5jYW5kX3VwX3JpZ2h0X3NhcCAmJiAoeDAgKyB3KSA8 IGxjLT5lbmRfb2ZfdGlsZXNfeDsKIH0KKwordm9pZCBmZl92dmNfY3R1X2ZyZWVfY3VzKENUVSAq Y3R1KQoreworICAgIHdoaWxlIChjdHUtPmN1cykgeworICAgICAgICBDb2RpbmdVbml0ICpjdSAg ICAgID0gY3R1LT5jdXM7CisgICAgICAgIEFWQnVmZmVyUmVmICpidWYgICAgPSBjdS0+YnVmOwor CisgICAgICAgIGN0dS0+Y3VzID0gY3R1LT5jdXMtPm5leHQ7CisgICAgICAgIGF2X2J1ZmZlcl91 bnJlZigmYnVmKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Z2Yy92dmNfY3R1 LmggYi9saWJhdmNvZGVjL3Z2Yy92dmNfY3R1LmgKaW5kZXggMDJjNzU3NTU5ZS4uOTJhNGZjZDUz OSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92dmMvdnZjX2N0dS5oCisrKyBiL2xpYmF2Y29kZWMv dnZjL3Z2Y19jdHUuaApAQCAtMzg4LDQgKzM4OCw2IEBAIHN0cnVjdCBBTEZQYXJhbXMgewogCiAv L3V0aWxzCiB2b2lkIGZmX3Z2Y19zZXRfbmVpZ2hib3VyX2F2YWlsYWJsZShWVkNMb2NhbENvbnRl eHQgKmxjLCBpbnQgeDAsIGludCB5MCwgaW50IHcsIGludCBoKTsKK3ZvaWQgZmZfdnZjX2RlY29k ZV9uZWlnaGJvdXIoVlZDTG9jYWxDb250ZXh0ICpsYywgaW50IHhfY3RiLCBpbnQgeV9jdGIsIGlu dCByeCwgaW50IHJ5LCBpbnQgcnMpOwordm9pZCBmZl92dmNfY3R1X2ZyZWVfY3VzKENUVSAqY3R1 KTsKICNlbmRpZiAvLyBBVkNPREVDX1ZWQ19DVFVfSApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92 dmMvdnZjX2ludHJhLmMgYi9saWJhdmNvZGVjL3Z2Yy92dmNfaW50cmEuYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi5lYzViZThmZWY1Ci0tLSAvZGV2L251bGwKKysrIGIv bGliYXZjb2RlYy92dmMvdnZjX2ludHJhLmMKQEAgLTAsMCArMSw3NjMgQEAKKy8qCisgKiBWVkMg aW50cmEgcHJlZGljdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBOdW8gTWkKKyAqCisg KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29m dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVy IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2 ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp dCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhh dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBM aWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3 YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y LCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInZ2Y19kYXRhLmgi CisjaW5jbHVkZSAidnZjX2ludGVyLmgiCisjaW5jbHVkZSAidnZjX2ludHJhLmgiCisjaW5jbHVk ZSAidnZjX2l0eF8xZC5oIgorCitzdGF0aWMgaW50IGlzX2NjbG0oZW51bSBJbnRyYVByZWRNb2Rl IG1vZGUpCit7CisgICAgcmV0dXJuIG1vZGUgPT0gSU5UUkFfTFRfQ0NMTSB8fCBtb2RlID09IElO VFJBX0xfQ0NMTSB8fCBtb2RlID09IElOVFJBX1RfQ0NMTTsKK30KKworc3RhdGljIGludCBkZXJp dmVfaWxmbnN0X3ByZWRfbW9kZV9pbnRyYShjb25zdCBWVkNMb2NhbENvbnRleHQgKmxjLCBjb25z dCBUcmFuc2Zvcm1CbG9jayAqdGIpCit7CisgICAgY29uc3QgVlZDRnJhbWVDb250ZXh0ICpmYyA9 IGxjLT5mYzsKKyAgICBjb25zdCBWVkNTUFMgKnNwcyA9IGZjLT5wcy5zcHM7CisgICAgY29uc3Qg Q29kaW5nVW5pdCAqY3UgICAgICAgICAgPSBsYy0+Y3U7CisgICAgY29uc3QgaW50IHhfdGIgICAg ICAgICAgICAgICAgPSB0Yi0+eDAgPj4gZmMtPnBzLnNwcy0+bWluX2NiX2xvZzJfc2l6ZV95Owor ICAgIGNvbnN0IGludCB5X3RiICAgICAgICAgICAgICAgID0gdGItPnkwID4+IGZjLT5wcy5zcHMt Pm1pbl9jYl9sb2cyX3NpemVfeTsKKyAgICBjb25zdCBpbnQgeF9jICAgICAgICAgICAgICAgICA9 ICh0Yi0+eDAgKyAodGItPnRiX3dpZHRoIDw8IHNwcy0+aHNoaWZ0WzFdID4+IDEpICkgPj4gZmMt PnBzLnNwcy0+bWluX2NiX2xvZzJfc2l6ZV95OworICAgIGNvbnN0IGludCB5X2MgICAgICAgICAg ICAgICAgID0gKHRiLT55MCArICh0Yi0+dGJfaGVpZ2h0IDw8IHNwcy0+dnNoaWZ0WzFdID4+IDEp KSA+PiBmYy0+cHMuc3BzLT5taW5fY2JfbG9nMl9zaXplX3k7CisgICAgY29uc3QgaW50IG1pbl9j Yl93aWR0aCAgICAgICAgPSBmYy0+cHMucHBzLT5taW5fY2Jfd2lkdGg7CisgICAgY29uc3QgaW50 IGludHJhX21pcF9mbGFnICAgICAgPSBTQU1QTEVfQ1RCKGZjLT50YWIuaW1mLCB4X3RiLCB5X3Ri KTsKKyAgICBpbnQgcHJlZF9tb2RlX2ludHJhID0gdGItPmNfaWR4ID09IDAgPyBjdS0+aW50cmFf cHJlZF9tb2RlX3kgOiBjdS0+aW50cmFfcHJlZF9tb2RlX2M7CisgICAgaWYgKGludHJhX21pcF9m bGFnICYmICF0Yi0+Y19pZHgpIHsKKyAgICAgICAgcHJlZF9tb2RlX2ludHJhID0gSU5UUkFfUExB TkFSOworICAgIH0gZWxzZSBpZiAoaXNfY2NsbShwcmVkX21vZGVfaW50cmEpKSB7CisgICAgICAg IGludCBpbnRyYV9taXBfZmxhZ19jID0gU0FNUExFX0NUQihmYy0+dGFiLmltZiwgeF9jLCB5X2Mp OworICAgICAgICBpbnQgY3VfcHJlZF9tb2RlID0gU0FNUExFX0NUQihmYy0+dGFiLmNwbVswXSwg eF9jLCB5X2MpOworICAgICAgICBpZiAoaW50cmFfbWlwX2ZsYWdfYykgeworICAgICAgICAgICAg cHJlZF9tb2RlX2ludHJhID0gSU5UUkFfUExBTkFSOworICAgICAgICB9IGVsc2UgaWYgKGN1X3By ZWRfbW9kZSA9PSBNT0RFX0lCQyB8fCBjdV9wcmVkX21vZGUgPT0gTU9ERV9QTFQpIHsKKyAgICAg ICAgICAgIHByZWRfbW9kZV9pbnRyYSA9IElOVFJBX0RDOworICAgICAgICB9IGVsc2UgeworICAg ICAgICAgICAgcHJlZF9tb2RlX2ludHJhID0gU0FNUExFX0NUQihmYy0+dGFiLmlwbSwgeF9jLCB5 X2MpOworICAgICAgICB9CisgICAgfQorICAgIHByZWRfbW9kZV9pbnRyYSA9IGZmX3Z2Y193aWRl X2FuZ2xlX21vZGVfbWFwcGluZyhjdSwgdGItPnRiX3dpZHRoLCB0Yi0+dGJfaGVpZ2h0LCB0Yi0+ Y19pZHgsIHByZWRfbW9kZV9pbnRyYSk7CisKKyAgICByZXR1cm4gcHJlZF9tb2RlX2ludHJhOwor fQorCisvLzguNy40IFRyYW5zZm9ybWF0aW9uIHByb2Nlc3MgZm9yIHNjYWxlZCB0cmFuc2Zvcm0g Y29lZmZpY2llbnRzCitzdGF0aWMgdm9pZCBpbGZuc3RfdHJhbnNmb3JtKGNvbnN0IFZWQ0xvY2Fs Q29udGV4dCAqbGMsIFRyYW5zZm9ybUJsb2NrICp0YikKK3sKKyAgICBjb25zdCBDb2RpbmdVbml0 ICpjdSAgICAgICAgPSBsYy0+Y3U7CisgICAgY29uc3QgaW50IHcgICAgICAgICAgICAgICAgID0g dGItPnRiX3dpZHRoOworICAgIGNvbnN0IGludCBoICAgICAgICAgICAgICAgICA9IHRiLT50Yl9o ZWlnaHQ7CisgICAgY29uc3QgaW50IG5fbGZuc3Rfb3V0X3NpemUgID0gKHcgPj0gOCAmJiBoID49 IDgpID8gNDggOiAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBuTGZuc3RPdXRTaXpl CisgICAgY29uc3QgaW50IGxvZzJfbGZuc3Rfc2l6ZSAgID0gKHcgPj0gOCAmJiBoID49IDgpID8g MyA6IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBsb2cyTGZuc3RTaXplCisgICAg Y29uc3QgaW50IG5fbGZuc3Rfc2l6ZSAgICAgID0gMSA8PCBsb2cyX2xmbnN0X3NpemU7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBuTGZuc3RTaXplCisgICAgY29uc3QgaW50 IG5vbl96ZXJvX3NpemUgICAgID0gKCh3ID09IDggJiYgaCA9PSA4KSB8fCAodyA9PSA0ICYmIGgg PT0gNCkpID8gOCA6IDE2OyAgLy8vPCBub25aZXJvU2l6ZQorICAgIGNvbnN0IGludCBwcmVkX21v ZGVfaW50cmEgICA9IGRlcml2ZV9pbGZuc3RfcHJlZF9tb2RlX2ludHJhKGxjLCB0Yik7CisgICAg Y29uc3QgaW50IHRyYW5zcG9zZSAgICAgICAgID0gcHJlZF9tb2RlX2ludHJhID4gMzQ7CisgICAg aW50IHVbMTZdLCB2WzQ4XTsKKworICAgIGZvciAoaW50IHggPSAwOyB4IDwgbm9uX3plcm9fc2l6 ZTsgeCsrKSB7CisgICAgICAgIGludCB4YyA9IGZmX3Z2Y19kaWFnX3NjYW5feFsyXVsyXVt4XTsK KyAgICAgICAgaW50IHljID0gZmZfdnZjX2RpYWdfc2Nhbl95WzJdWzJdW3hdOworICAgICAgICB1 W3hdID0gdGItPmNvZWZmc1t3ICogeWMgKyB4Y107CisgICAgfQorICAgIGZmX3Z2Y19pbnZfbGZu c3RfMWQodiwgdSwgbm9uX3plcm9fc2l6ZSwgbl9sZm5zdF9vdXRfc2l6ZSwgcHJlZF9tb2RlX2lu dHJhLCBjdS0+bGZuc3RfaWR4KTsKKyAgICBpZiAodHJhbnNwb3NlKSB7CisgICAgICAgIGludCAq ZHN0ID0gdGItPmNvZWZmczsKKyAgICAgICAgY29uc3QgaW50ICpzcmMgPSB2OworICAgICAgICBp ZiAobl9sZm5zdF9zaXplID09IDQpIHsKKyAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwg NDsgeSsrKSB7CisgICAgICAgICAgICAgICAgZHN0WzBdID0gc3JjWzBdOworICAgICAgICAgICAg ICAgIGRzdFsxXSA9IHNyY1s0XTsKKyAgICAgICAgICAgICAgICBkc3RbMl0gPSBzcmNbOF07Cisg ICAgICAgICAgICAgICAgZHN0WzNdID0gc3JjWzEyXTsKKyAgICAgICAgICAgICAgICBzcmMrKzsK KyAgICAgICAgICAgICAgICBkc3QgKz0gdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNl IHsKKyAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgODsgeSsrKSB7CisgICAgICAgICAg ICAgICAgZHN0WzBdID0gc3JjWzBdOworICAgICAgICAgICAgICAgIGRzdFsxXSA9IHNyY1s4XTsK KyAgICAgICAgICAgICAgICBkc3RbMl0gPSBzcmNbMTZdOworICAgICAgICAgICAgICAgIGRzdFsz XSA9IHNyY1syNF07CisgICAgICAgICAgICAgICAgaWYgKHkgPCA0KSB7CisgICAgICAgICAgICAg ICAgICAgIGRzdFs0XSA9IHNyY1szMl07CisgICAgICAgICAgICAgICAgICAgIGRzdFs1XSA9IHNy Y1szNl07CisgICAgICAgICAgICAgICAgICAgIGRzdFs2XSA9IHNyY1s0MF07CisgICAgICAgICAg ICAgICAgICAgIGRzdFs3XSA9IHNyY1s0NF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg ICAgICAgIHNyYysrOworICAgICAgICAgICAgICAgIGRzdCArPSB3OworICAgICAgICAgICAgfQor ICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgKmRzdCA9IHRiLT5jb2VmZnM7 CisgICAgICAgIGNvbnN0IGludCAqc3JjID0gdjsKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkg PCBuX2xmbnN0X3NpemU7IHkrKykgeworICAgICAgICAgICAgaW50IHNpemUgPSAoeSA8IDQpID8g bl9sZm5zdF9zaXplIDogNDsKKyAgICAgICAgICAgIG1lbWNweShkc3QsIHNyYywgc2l6ZSAqIHNp emVvZihpbnQpKTsKKyAgICAgICAgICAgIHNyYyArPSBzaXplOworICAgICAgICAgICAgZHN0ICs9 IHc7CisgICAgICAgIH0KKyAgICB9CisgICAgdGItPm1heF9zY2FuX3ggPSBuX2xmbnN0X3NpemUg LSAxOworICAgIHRiLT5tYXhfc2Nhbl95ID0gbl9sZm5zdF9zaXplIC0gMTsKK30KKworLy9wYXJ0 IG9mIDguNy40IFRyYW5zZm9ybWF0aW9uIHByb2Nlc3MgZm9yIHNjYWxlZCB0cmFuc2Zvcm0gY29l ZmZpY2llbnRzCitzdGF0aWMgdm9pZCBkZXJpdmVfdHJhbnNmb3JtX3R5cGUoY29uc3QgVlZDRnJh bWVDb250ZXh0ICpmYywgY29uc3QgVlZDTG9jYWxDb250ZXh0ICpsYywgY29uc3QgVHJhbnNmb3Jt QmxvY2sgKnRiLCBlbnVtIFR4VHlwZSAqdHJoLCBlbnVtIFR4VHlwZSAqdHJ2KQoreworICAgIGNv bnN0IENvZGluZ1VuaXQgKmN1ID0gbGMtPmN1OworICAgIHN0YXRpYyBjb25zdCBlbnVtIFR4VHlw ZSBtdHNfdG9fdHJoW10gPSB7RENUMiwgRFNUNywgRENUOCwgRFNUNywgRENUOH07CisgICAgc3Rh dGljIGNvbnN0IGVudW0gVHhUeXBlIG10c190b190cnZbXSA9IHtEQ1QyLCBEU1Q3LCBEU1Q3LCBE Q1Q4LCBEQ1Q4fTsKKyAgICBjb25zdCBWVkNTUFMgKnNwcyAgICAgICA9IGZjLT5wcy5zcHM7Cisg ICAgaW50IGltcGxpY2l0X210c19lbmFibGVkID0gMDsKKyAgICBpZiAodGItPmNfaWR4IHx8IChj dS0+aXNwX3NwbGl0X3R5cGUgIT0gSVNQX05PX1NQTElUICYmIGN1LT5sZm5zdF9pZHgpKSB7Cisg ICAgICAgICp0cmggPSAqdHJ2ID0gRENUMjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg IGlmIChzcHMtPm10c19lbmFibGVkX2ZsYWcpIHsKKyAgICAgICAgaWYgKGN1LT5pc3Bfc3BsaXRf dHlwZSAhPSBJU1BfTk9fU1BMSVQgfHwKKyAgICAgICAgICAgIChjdS0+c2J0X2ZsYWcgJiYgRkZN QVgodGItPnRiX3dpZHRoLCB0Yi0+dGJfaGVpZ2h0KSA8PSAzMikgfHwKKyAgICAgICAgICAgICgh c3BzLT5leHBsaWNpdF9tdHNfaW50cmFfZW5hYmxlZF9mbGFnICYmIGN1LT5wcmVkX21vZGUgPT0g TU9ERV9JTlRSQSAmJgorICAgICAgICAgICAgIWN1LT5sZm5zdF9pZHggJiYgIWN1LT5pbnRyYV9t aXBfZmxhZykpIHsKKyAgICAgICAgICAgIGltcGxpY2l0X210c19lbmFibGVkID0gMTsKKyAgICAg ICAgfQorICAgIH0KKyAgICBpZiAoaW1wbGljaXRfbXRzX2VuYWJsZWQpIHsKKyAgICAgICAgY29u c3QgaW50IHcgPSB0Yi0+dGJfd2lkdGg7CisgICAgICAgIGNvbnN0IGludCBoID0gdGItPnRiX2hl aWdodDsKKyAgICAgICAgaWYgKGN1LT5zYnRfZmxhZykgeworICAgICAgICAgICAgKnRyaCA9IChj dS0+c2J0X2hvcml6b250YWxfZmxhZyAgfHwgY3UtPnNidF9wb3NfZmxhZykgPyBEU1Q3IDogRENU ODsKKyAgICAgICAgICAgICp0cnYgPSAoIWN1LT5zYnRfaG9yaXpvbnRhbF9mbGFnIHx8IGN1LT5z YnRfcG9zX2ZsYWcpID8gRFNUNyA6IERDVDg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg ICAqdHJoID0gKHcgPj0gNCAmJiB3IDw9IDE2KSA/IERTVDcgOiBEQ1QyOworICAgICAgICAgICAg KnRydiA9IChoID49IDQgJiYgaCA8PSAxNikgPyBEU1Q3IDogRENUMjsKKyAgICAgICAgfQorICAg ICAgICByZXR1cm47CisgICAgfQorICAgICp0cmggPSBtdHNfdG9fdHJoW2N1LT5tdHNfaWR4XTsK KyAgICAqdHJ2ID0gbXRzX3RvX3RydltjdS0+bXRzX2lkeF07Cit9CisKK3N0YXRpYyB2b2lkIGFk ZF9yZXNpZHVhbF9mb3Jfam9pbnRfY29kaW5nX2Nocm9tYShWVkNMb2NhbENvbnRleHQgKmxjLAor ICAgIGNvbnN0IFRyYW5zZm9ybVVuaXQgKnR1LCBUcmFuc2Zvcm1CbG9jayAqdGIsIGNvbnN0IGlu dCBjaHJvbWFfc2NhbGUpCit7CisgICAgY29uc3QgVlZDRnJhbWVDb250ZXh0ICpmYyAgPSBsYy0+ ZmM7CisgICAgY29uc3QgQ29kaW5nVW5pdCAqY3UgPSBsYy0+Y3U7CisgICAgY29uc3QgaW50IGNf c2lnbiA9IDEgLSAyICogZmMtPnBzLnBoLT5qb2ludF9jYmNyX3NpZ25fZmxhZzsKKyAgICBjb25z dCBpbnQgc2hpZnQgID0gdHUtPmNvZGVkX2ZsYWdbMV0gXiB0dS0+Y29kZWRfZmxhZ1syXTsKKyAg ICBjb25zdCBpbnQgY19pZHggID0gMSArIHR1LT5jb2RlZF9mbGFnWzFdOworICAgIGNvbnN0IHB0 cmRpZmZfdCBzdHJpZGUgPSBmYy0+ZnJhbWUtPmxpbmVzaXplW2NfaWR4XTsKKyAgICBjb25zdCBp bnQgaHMgPSBmYy0+cHMuc3BzLT5oc2hpZnRbY19pZHhdOworICAgIGNvbnN0IGludCB2cyA9IGZj LT5wcy5zcHMtPnZzaGlmdFtjX2lkeF07CisgICAgdWludDhfdCAqZHN0ID0gJmZjLT5mcmFtZS0+ ZGF0YVtjX2lkeF1bKHRiLT55MCA+PiB2cykgKiBzdHJpZGUgKworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKCh0Yi0+eDAgPj4gaHMpIDw8IGZjLT5wcy5zcHMtPnBp eGVsX3NoaWZ0KV07CisgICAgaWYgKGNocm9tYV9zY2FsZSkgeworICAgICAgICBmYy0+dnZjZHNw Lml0eC5wcmVkX3Jlc2lkdWFsX2pvaW50KHRiLT5jb2VmZnMsIHRiLT50Yl93aWR0aCwgdGItPnRi X2hlaWdodCwgY19zaWduLCBzaGlmdCk7CisgICAgICAgIGZjLT52dmNkc3AuaW50cmEubG1jc19z Y2FsZV9jaHJvbWEobGMsIHRiLT5jb2VmZnMsIHRiLT5jb2VmZnMsIHRiLT50Yl93aWR0aCwgdGIt PnRiX2hlaWdodCwgY3UtPngwLCBjdS0+eTApOworICAgICAgICBmYy0+dnZjZHNwLml0eC5hZGRf cmVzaWR1YWwoZHN0LCB0Yi0+Y29lZmZzLCB0Yi0+dGJfd2lkdGgsIHRiLT50Yl9oZWlnaHQsIHN0 cmlkZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmMtPnZ2Y2RzcC5pdHguYWRkX3Jlc2lkdWFs X2pvaW50KGRzdCwgdGItPmNvZWZmcywgdGItPnRiX3dpZHRoLCB0Yi0+dGJfaGVpZ2h0LCBzdHJp ZGUsIGNfc2lnbiwgc2hpZnQpOworICAgIH0KK30KKworc3RhdGljIGludCBhZGRfcmVjb25zdHJ1 Y3RlZF9hcmVhKFZWQ0xvY2FsQ29udGV4dCAqbGMsIGNvbnN0IGludCBjaF90eXBlLCBjb25zdCBp bnQgeDAsIGNvbnN0IGludCB5MCwgY29uc3QgaW50IHcsIGNvbnN0IGludCBoKQoreworICAgIGNv bnN0IFZWQ1NQUyAqc3BzICAgICAgID0gbGMtPmZjLT5wcy5zcHM7CisgICAgY29uc3QgaW50IGhz ID0gc3BzLT5oc2hpZnRbY2hfdHlwZV07CisgICAgY29uc3QgaW50IHZzID0gc3BzLT52c2hpZnRb Y2hfdHlwZV07CisgICAgUmVjb25zdHJ1Y3RlZEFyZWEgKmE7CisKKyAgICBpZiAobGMtPm51bV9y YXNbY2hfdHlwZV0gPj0gRkZfQVJSQVlfRUxFTVMobGMtPnJhc1tjaF90eXBlXSkpCisgICAgICAg IHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgYSA9ICZsYy0+cmFzW2NoX3R5cGVd W2xjLT5udW1fcmFzW2NoX3R5cGVdXTsKKyAgICBhLT54ID0geDAgPj4gaHM7CisgICAgYS0+eSA9 IHkwID4+IHZzOworICAgIGEtPncgPSB3ID4+IGhzOworICAgIGEtPmggPSBoID4+IHZzOworICAg IGxjLT5udW1fcmFzW2NoX3R5cGVdKys7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZv aWQgYWRkX3R1X2FyZWEoY29uc3QgVHJhbnNmb3JtVW5pdCAqdHUsIGludCAqeDAsIGludCAqeTAs IGludCAqdywgaW50ICpoKQoreworICAgICp4MCA9IHR1LT54MDsKKyAgICAqeTAgPSB0dS0+eTA7 CisgICAgKncgPSB0dS0+d2lkdGg7CisgICAgKmggPSB0dS0+aGVpZ2h0OworfQorCisjZGVmaW5l IE1JTl9JU1BfUFJFRF9XSURUSCA0CitzdGF0aWMgaW50IGdldF9sdW1hX3ByZWRpY3RfdW5pdChj b25zdCBDb2RpbmdVbml0ICpjdSwgY29uc3QgVHJhbnNmb3JtVW5pdCAqdHUsIGNvbnN0IGludCBp ZHgsIGludCAqeDAsIGludCAqeTAsIGludCAqdywgaW50ICpoKQoreworICAgIGludCBoYXNfbHVt YSA9IDE7CisgICAgYWRkX3R1X2FyZWEodHUsIHgwLCB5MCwgdywgaCk7CisgICAgaWYgKGN1LT5p c3Bfc3BsaXRfdHlwZSA9PSBJU1BfVkVSX1NQTElUICYmIHR1LT53aWR0aCA8IE1JTl9JU1BfUFJF RF9XSURUSCkgeworICAgICAgICAqdyA9IE1JTl9JU1BfUFJFRF9XSURUSDsKKyAgICAgICAgaGFz X2x1bWEgPSAhKGlkeCAlIChNSU5fSVNQX1BSRURfV0lEVEggLyB0dS0+d2lkdGgpKTsKKyAgICB9 CisgICAgcmV0dXJuIGhhc19sdW1hOworfQorCitzdGF0aWMgaW50IGdldF9jaHJvbWFfcHJlZGlj dF91bml0KGNvbnN0IENvZGluZ1VuaXQgKmN1LCBjb25zdCBUcmFuc2Zvcm1Vbml0ICp0dSwgY29u c3QgaW50IGlkeCwgaW50ICp4MCwgaW50ICp5MCwgaW50ICp3LCBpbnQgKmgpCit7CisgICAgaWYg KGN1LT5pc3Bfc3BsaXRfdHlwZSA9PSBJU1BfTk9fU1BMSVQpIHsKKyAgICAgICAgYWRkX3R1X2Fy ZWEodHUsIHgwLCB5MCwgdywgaCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAo aWR4ID09IGN1LT5udW1faW50cmFfc3VicGFydGl0aW9ucyAtIDEpIHsKKyAgICAgICAgKngwID0g Y3UtPngwOworICAgICAgICAqeTAgPSBjdS0+eTA7CisgICAgICAgICp3ID0gY3UtPmNiX3dpZHRo OworICAgICAgICAqaCA9IGN1LT5jYl9oZWlnaHQ7CisgICAgICAgIHJldHVybiAxOworICAgIH0K KyAgICByZXR1cm4gMDsKK30KKworLy84LjQuNS4xIEdlbmVyYWwgZGVjb2RpbmcgcHJvY2VzcyBm b3IgaW50cmEgYmxvY2tzCitzdGF0aWMgdm9pZCBwcmVkaWN0X2ludHJhKFZWQ0xvY2FsQ29udGV4 dCAqbGMsIGNvbnN0IFRyYW5zZm9ybVVuaXQgKnR1LCBjb25zdCBpbnQgaWR4LCBjb25zdCBpbnQg dGFyZ2V0X2NoX3R5cGUpCit7CisgICAgY29uc3QgVlZDRnJhbWVDb250ZXh0ICpmYyAgICAgICAg ID0gbGMtPmZjOworICAgIGNvbnN0IENvZGluZ1VuaXQgKmN1ICAgICAgICA9IGxjLT5jdTsKKyAg ICBjb25zdCBWVkNUcmVlVHlwZSB0cmVlX3R5cGUgPSBjdS0+dHJlZV90eXBlOworICAgIGludCB4 MCwgeTAsIHcsIGg7CisgICAgaWYgKGN1LT5wcmVkX21vZGUgIT0gTU9ERV9JTlRSQSkgeworICAg ICAgICBhZGRfcmVjb25zdHJ1Y3RlZF9hcmVhKGxjLCB0YXJnZXRfY2hfdHlwZSwgdHUtPngwLCB0 dS0+eTAsIHR1LT53aWR0aCwgdHUtPmhlaWdodCk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cisg ICAgaWYgKCF0YXJnZXRfY2hfdHlwZSAmJiB0cmVlX3R5cGUgIT0gRFVBTF9UUkVFX0NIUk9NQSkg eworICAgICAgICBpZiAoZ2V0X2x1bWFfcHJlZGljdF91bml0KGN1LCB0dSwgaWR4LCAmeDAsICZ5 MCwgJncsICZoKSkgeworICAgICAgICAgICAgZmZfdnZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxl KGxjLCB4MCwgeTAsIHcsIGgpOworICAgICAgICAgICAgZmMtPnZ2Y2RzcC5pbnRyYS5pbnRyYV9w cmVkKGxjLCB4MCwgeTAsIHcsIGgsIDApOworICAgICAgICAgICAgYWRkX3JlY29uc3RydWN0ZWRf YXJlYShsYywgMCwgeDAsIHkwLCB3LCBoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodGFy Z2V0X2NoX3R5cGUgJiYgdHJlZV90eXBlICE9IERVQUxfVFJFRV9MVU1BKSB7CisgICAgICAgIGlm IChnZXRfY2hyb21hX3ByZWRpY3RfdW5pdChjdSwgdHUsIGlkeCwgJngwLCAmeTAsICZ3LCAmaCkp eworICAgICAgICAgICAgZmZfdnZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKGxjLCB4MCwgeTAs IHcsIGgpOworICAgICAgICAgICAgaWYgKGlzX2NjbG0oY3UtPmludHJhX3ByZWRfbW9kZV9jKSkg eworICAgICAgICAgICAgICAgIGZjLT52dmNkc3AuaW50cmEuaW50cmFfY2NsbV9wcmVkKGxjLCB4 MCwgeTAsIHcsIGgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmYy0+ dnZjZHNwLmludHJhLmludHJhX3ByZWQobGMsIHgwLCB5MCwgdywgaCwgMSk7CisgICAgICAgICAg ICAgICAgZmMtPnZ2Y2RzcC5pbnRyYS5pbnRyYV9wcmVkKGxjLCB4MCwgeTAsIHcsIGgsIDIpOwor ICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkX3JlY29uc3RydWN0ZWRfYXJlYShsYywgMSwg eDAsIHkwLCB3LCBoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgc2NhbGVf Y2xpcChpbnQgKmNvZWZmLCBjb25zdCBpbnQgbnp3LCBjb25zdCBpbnQgdywgY29uc3QgaW50IGgs IGNvbnN0IGludCBzaGlmdCkKK3sKKyAgICBjb25zdCBpbnQgYWRkID0gMSA8PCAoc2hpZnQgLSAx KTsKKyAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBpbnQgKnAgPSBj b2VmZiArIHkgKiB3OworICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IG56dzsgeCsrKSB7Cisg ICAgICAgICAgICAqcCA9IGF2X2NsaXBfaW50MTYoKCpwICsgYWRkKSA+PiBzaGlmdCk7CisgICAg ICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KHAsIDAsIHNpemVvZigqcCkg KiAodyAtIG56dykpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2NhbGUoaW50ICpvdXQsIGNv bnN0IGludCAqaW4sIGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCwgY29uc3QgaW50IHNoaWZ0KQor eworICAgIGNvbnN0IGludCBhZGQgPSAxIDw8IChzaGlmdCAtIDEpOworICAgIGZvciAoaW50IHkg PSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7 CisgICAgICAgICAgICBpbnQgKm8gPSBvdXQgKyB5ICogdyArIHg7CisgICAgICAgICAgICBjb25z dCBpbnQgKmkgPSBpbiArIHkgKiB3ICsgeDsKKyAgICAgICAgICAgICpvID0gKCppICsgYWRkKSA+ PiBzaGlmdDsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gcGFydCBvZiA4LjcuMyBTY2FsaW5n IHByb2Nlc3MgZm9yIHRyYW5zZm9ybSBjb2VmZmljaWVudHMKK3N0YXRpYyB2b2lkIGRlcml2ZV9x cChjb25zdCBWVkNMb2NhbENvbnRleHQgKmxjLCBjb25zdCBUcmFuc2Zvcm1Vbml0ICp0dSwgVHJh bnNmb3JtQmxvY2sgKnRiKQoreworICAgIGNvbnN0IFZWQ1NQUyAqc3BzICAgICAgICAgICA9IGxj LT5mYy0+cHMuc3BzOworICAgIGNvbnN0IFZWQ1NIICpzaCAgICAgICAgICAgICA9ICZsYy0+c2Mt PnNoOworICAgIGNvbnN0IENvZGluZ1VuaXQgKmN1ICAgICAgICA9IGxjLT5jdTsKKyAgICBpbnQg cXAsIHFwX2FjdF9vZmZzZXQ7CisKKyAgICBpZiAodGItPmNfaWR4ID09IDApIHsKKyAgICAgICAg Ly9maXggbWUKKyAgICAgICAgcXAgPSBjdS0+cXBbTFVNQV0gKyBzcHMtPnFwX2JkX29mZnNldDsK KyAgICAgICAgcXBfYWN0X29mZnNldCA9IGN1LT5hY3RfZW5hYmxlZF9mbGFnID8gLTUgOiAwOwor ICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCBpc19qY2JjciA9IHR1LT5qb2ludF9jYmNy X3Jlc2lkdWFsX2ZsYWcgJiYgdHUtPmNvZGVkX2ZsYWdbQ0JdICYmIHR1LT5jb2RlZF9mbGFnW0NS XTsKKyAgICAgICAgY29uc3QgaW50IGlkeCA9IGlzX2pjYmNyID8gSkNCQ1IgOiB0Yi0+Y19pZHg7 CisgICAgICAgIHFwID0gY3UtPnFwW2lkeF07CisgICAgICAgIHFwX2FjdF9vZmZzZXQgPSBjdS0+ YWN0X2VuYWJsZWRfZmxhZyA/IDEgOiAwOworICAgIH0KKyAgICBpZiAodGItPnRzKSB7CisgICAg ICAgIGNvbnN0IGludCBxcF9wcmltZV90c19taW4gPSA0ICsgNiAqIHNwcy0+bWluX3FwX3ByaW1l X3RzOworCisgICAgICAgIHRiLT5xcCA9IGF2X2NsaXAocXAgKyBxcF9hY3Rfb2Zmc2V0LCBxcF9w cmltZV90c19taW4sIDYzICsgc3BzLT5xcF9iZF9vZmZzZXQpOworICAgICAgICB0Yi0+cmVjdF9u b25fdHNfZmxhZyA9IDA7CisgICAgICAgIHRiLT5iZF9zaGlmdCA9IDEwOworICAgIH0gZWxzZSB7 CisgICAgICAgIGNvbnN0IGludCBsb2dfc3VtID0gdGItPmxvZzJfdGJfd2lkdGggKyB0Yi0+bG9n Ml90Yl9oZWlnaHQ7CisgICAgICAgIGNvbnN0IGludCByZWN0X25vbl90c19mbGFnID0gbG9nX3N1 bSAmIDE7CisKKyAgICAgICAgdGItPnFwID0gYXZfY2xpcChxcCArIHFwX2FjdF9vZmZzZXQsIDAs IDYzICsgc3BzLT5xcF9iZF9vZmZzZXQpOworICAgICAgICB0Yi0+cmVjdF9ub25fdHNfZmxhZyA9 IHJlY3Rfbm9uX3RzX2ZsYWc7CisgICAgICAgIHRiLT5iZF9zaGlmdCA9IHNwcy0+Yml0X2RlcHRo ICsgcmVjdF9ub25fdHNfZmxhZyArIChsb2dfc3VtIC8gMikgLSA1ICsgc2gtPmRlcF9xdWFudF91 c2VkX2ZsYWc7CisgICAgfQorICAgIHRiLT5iZF9vZmZzZXQgPSAoMSA8PCB0Yi0+YmRfc2hpZnQp ID4+IDE7Cit9CisKKy8vOC43LjMgU2NhbGluZyBwcm9jZXNzIGZvciB0cmFuc2Zvcm0gY29lZmZp Y2llbnRzCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZGVyaXZlX3NjYWxlKGNvbnN0IFRy YW5zZm9ybUJsb2NrICp0YiwgY29uc3QgaW50IHNoX2RlcF9xdWFudF91c2VkX2ZsYWcpCit7Cisg ICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgcmVtNls2MyArIDIgKiA2ICsgMV0gPSB7CisgICAgICAg IDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsIDAs IDEsIDIsCisgICAgICAgIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQs IDUsIDAsIDEsIDIsIDMsIDQsIDUsCisgICAgICAgIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIs IDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMsCisgICAgICAgIDQsIDUsIDAs IDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IHVp bnQ4X3QgZGl2Nls2MyArIDIgKiA2ICsgMV0gPSB7CisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAs IDEsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDMsICAzLCAgMywKKyAgICAgICAg MywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgNSwgNSwgNiwgNiwgNiwgNiwg IDYsICA2LAorICAgICAgICA3LCA3LCA3LCA3LCA3LCA3LCA4LCA4LCA4LCA4LCA4LCA4LCA5LCA5 LCA5LCA5LCA5LCA5LCAxMCwgMTAsIDEwLCAxMCwKKyAgICAgICAgMTAsIDEwLCAxMSwgMTEsIDEx LCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMgorICAgIH07CisKKyAgICBjb25zdCBzdGF0aWMg aW50IGxldmVsX3NjYWxlWzJdWzZdID0geworICAgICAgICB7IDQwLCA0NSwgNTEsIDU3LCA2NCwg NzIgfSwKKyAgICAgICAgeyA1NywgNjQsIDcyLCA4MCwgOTAsIDEwMiB9CisgICAgfTsKKyAgICBj b25zdCBpbnQgYWRkaW4gPSBzaF9kZXBfcXVhbnRfdXNlZF9mbGFnICYmICF0Yi0+dHM7CisgICAg Y29uc3QgaW50IHFwICAgID0gdGItPnFwICsgYWRkaW47CisKKyAgICByZXR1cm4gbGV2ZWxfc2Nh bGVbdGItPnJlY3Rfbm9uX3RzX2ZsYWddW3JlbTZbcXBdXSA8PCBkaXY2W3FwXTsKK30KKworLy84 LjcuMyBTY2FsaW5nIHByb2Nlc3MgZm9yIHRyYW5zZm9ybSBjb2VmZmljaWVudHMKK3N0YXRpYyBj b25zdCB1aW50OF90KiBkZXJpdmVfc2NhbGVfbShjb25zdCBWVkNMb2NhbENvbnRleHQgKmxjLCBj b25zdCBUcmFuc2Zvcm1CbG9jayAqdGIsIHVpbnQ4X3QgKnNjYWxlX20pCit7CisgICAgLy9UYWJs ZSAzOCDigJMgU3BlY2lmaWNhdGlvbiBvZiB0aGUgc2NhbGluZyBtYXRyaXggaWRlbnRpZmllciB2 YXJpYWJsZSBpZCBhY2NvcmRpbmcgdG8gcHJlZE1vZGUsIGNJZHgsIG5UYlcsIGFuZCBuVGJICisg ICAgY29uc3QgaW50IGlkc1syXVszXVs2XSA9IHsKKyAgICAgICAgeworICAgICAgICAgICAgeyAg MCwgIDIsICA4LCAxNCwgMjAsIDI2IH0sCisgICAgICAgICAgICB7ICAwLCAgMywgIDksIDE1LCAy MSwgMjEgfSwKKyAgICAgICAgICAgIHsgIDAsICA0LCAxMCwgMTYsIDIyLCAyMiB9CisgICAgICAg IH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgIDAsICA1LCAxMSwgMTcsIDIzLCAyNyB9LAor ICAgICAgICAgICAgeyAgMCwgIDYsIDEyLCAxOCwgMjQsIDI0IH0sCisgICAgICAgICAgICB7ICAx LCAgNywgMTMsIDE5LCAyNSwgMjUgfSwKKyAgICAgICAgfQorICAgIH07CisgICAgY29uc3QgVlZD RnJhbWVQYXJhbVNldHMgKnBzID0gJmxjLT5mYy0+cHM7CisgICAgY29uc3QgVlZDU1BTICpzcHMg ICAgICAgICAgID0gcHMtPnNwczsKKyAgICBjb25zdCBWVkNTSCAqc2ggICAgICAgICAgICAgPSAm bGMtPnNjLT5zaDsKKyAgICBjb25zdCBDb2RpbmdVbml0ICpjdSAgICAgICAgPSBsYy0+Y3U7Cisg ICAgY29uc3QgQVZCdWZmZXJSZWYgKnJlZjsKKyAgICBjb25zdCBWVkNTY2FsaW5nTGlzdCAqc2w7 CisgICAgY29uc3QgaW50IGlkID0gaWRzW2N1LT5wcmVkX21vZGUgIT0gTU9ERV9JTlRSQV1bdGIt PmNfaWR4XVtGRk1BWCh0Yi0+bG9nMl90Yl9oZWlnaHQsIHRiLT5sb2cyX3RiX3dpZHRoKSAtIDFd OworICAgIGNvbnN0IGludCBsb2cyX21hdHJpeF9zaXplID0gKGlkIDwgMikgPyAxIDogKGlkIDwg OCkgPyAyIDogMzsKKyAgICB1aW50OF90ICpwID0gc2NhbGVfbTsKKworICAgIGF2X2Fzc2VydDAo IXNwcy0+c2NhbGluZ19tYXRyaXhfZm9yX2FsdGVybmF0aXZlX2NvbG91cl9zcGFjZV9kaXNhYmxl ZF9mbGFnKTsKKworICAgIGlmICghc2gtPmV4cGxpY2l0X3NjYWxpbmdfbGlzdF91c2VkX2ZsYWcg fHwgdGItPnRzIHx8CisgICAgICAgIHNwcy0+c2NhbGluZ19tYXRyaXhfZm9yX2xmbnN0X2Rpc2Fi bGVkX2ZsYWcgJiYgY3UtPmFwcGx5X2xmbnN0X2ZsYWdbdGItPmNfaWR4XSkKKyAgICAgICAgcmV0 dXJuIGZmX3Z2Y19kZWZhdWx0X3NjYWxlX207CisKKyAgICByZWYgPSBwcy0+c2NhbGluZ19saXN0 W3BzLT5waC0+c2NhbGluZ19saXN0X2Fwc19pZF07CisgICAgaWYgKCFyZWYgfHwgIXJlZi0+ZGF0 YSkgeworICAgICAgICBhdl9sb2cobGMtPmZjLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJidWc6 IG5vIHNjYWxpbmcgbGlzdCBhcHMsIGlkID0gJWQiLCBwcy0+cGgtPnNjYWxpbmdfbGlzdF9hcHNf aWQpOworICAgICAgICByZXR1cm4gZmZfdnZjX2RlZmF1bHRfc2NhbGVfbTsKKyAgICB9CisKKyAg ICBzbCA9IChjb25zdCBWVkNTY2FsaW5nTGlzdCAqKXJlZi0+ZGF0YTsKKyAgICBmb3IgKGludCB5 ID0gdGItPm1pbl9zY2FuX3k7IHkgPD0gdGItPm1heF9zY2FuX3k7IHkrKykgeworICAgICAgICBj b25zdCBpbnQgb2ZmID0geSA8PCBsb2cyX21hdHJpeF9zaXplID4+IHRiLT5sb2cyX3RiX2hlaWdo dCA8PCBsb2cyX21hdHJpeF9zaXplOworICAgICAgICBjb25zdCB1aW50OF90ICptID0gJnNsLT5z Y2FsaW5nX21hdHJpeF9yZWNbaWRdW29mZl07CisKKyAgICAgICAgZm9yIChpbnQgeCA9IHRiLT5t aW5fc2Nhbl94OyB4IDw9IHRiLT5tYXhfc2Nhbl94OyB4KyspCisgICAgICAgICAgICAqcCsrID0g bVt4IDw8IGxvZzJfbWF0cml4X3NpemUgPj4gdGItPmxvZzJfdGJfd2lkdGhdOworICAgIH0KKyAg ICBpZiAoaWQgPj0gU0xfU1RBUlRfMTZ4MTYgJiYgIXRiLT5taW5fc2Nhbl94ICYmICF0Yi0+bWlu X3NjYW5feSkKKyAgICAgICAgKnNjYWxlX20gPSBzbC0+c2NhbGluZ19tYXRyaXhfZGNfcmVjW2lk IC0gU0xfU1RBUlRfMTZ4MTZdOworCisgICAgcmV0dXJuIHNjYWxlX207Cit9CisKKy8vOC43LjMg U2NhbGluZyBwcm9jZXNzIGZvciB0cmFuc2Zvcm0gY29lZmZpY2llbnRzCitzdGF0aWMgYXZfYWx3 YXlzX2lubGluZSBpbnQgc2NhbGVfY29lZmYoY29uc3QgVHJhbnNmb3JtQmxvY2sgKnRiLCBpbnQg Y29lZmYsIGNvbnN0IGludCBzY2FsZSwgY29uc3QgaW50IHNjYWxlX20pCit7CisgICAgY29lZmYg PSAoY29lZmYgKiBzY2FsZSAqIHNjYWxlX20gKyB0Yi0+YmRfb2Zmc2V0KSA+PiB0Yi0+YmRfc2hp ZnQ7CisgICAgY29lZmYgPSBhdl9jbGlwKGNvZWZmLCAtKDE8PDE1KSwgKDE8PDE1KSAtIDEpOwor ICAgIHJldHVybiBjb2VmZjsKK30KKworc3RhdGljIHZvaWQgZGVxdWFudChjb25zdCBWVkNMb2Nh bENvbnRleHQgKmxjLCBjb25zdCBUcmFuc2Zvcm1Vbml0ICp0dSwgVHJhbnNmb3JtQmxvY2sgKnRi KQoreworICAgIHVpbnQ4X3QgdG1wW01BWF9UQl9TSVpFICogTUFYX1RCX1NJWkVdOworICAgIGNv bnN0IFZWQ1NIICpzaCAgICAgICAgID0gJmxjLT5zYy0+c2g7CisgICAgY29uc3QgdWludDhfdCAq c2NhbGVfbSAgPSBkZXJpdmVfc2NhbGVfbShsYywgdGIsIHRtcCk7CisgICAgaW50IHNjYWxlOwor CisgICAgZGVyaXZlX3FwKGxjLCB0dSwgdGIpOworICAgIHNjYWxlID0gZGVyaXZlX3NjYWxlKHRi LCBzaC0+ZGVwX3F1YW50X3VzZWRfZmxhZyk7CisKKyAgICBmb3IgKGludCB5ID0gdGItPm1pbl9z Y2FuX3k7IHkgPD0gdGItPm1heF9zY2FuX3k7IHkrKykgeworICAgICAgICBmb3IgKGludCB4ID0g dGItPm1pbl9zY2FuX3g7IHggPD0gdGItPm1heF9zY2FuX3g7IHgrKykgeworICAgICAgICAgICAg aW50ICpjb2VmZiA9IHRiLT5jb2VmZnMgKyB5ICogdGItPnRiX3dpZHRoICsgeDsKKworICAgICAg ICAgICAgaWYgKCpjb2VmZikKKyAgICAgICAgICAgICAgICAqY29lZmYgPSBzY2FsZV9jb2VmZih0 YiwgKmNvZWZmLCBzY2FsZSwgKnNjYWxlX20pOworICAgICAgICAgICAgc2NhbGVfbSsrOworICAg ICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBpdHhfMmQoY29uc3QgVlZDRnJhbWVDb250 ZXh0ICpmYywgVHJhbnNmb3JtQmxvY2sgKnRiLCBjb25zdCBlbnVtIFR4VHlwZSB0cmgsIGNvbnN0 IGVudW0gVHhUeXBlIHRydiwgaW50ICp0ZW1wKQoreworICAgIGNvbnN0IFZWQ1NQUyAqc3BzICAg PSBmYy0+cHMuc3BzOworICAgIGNvbnN0IGludCB3ICAgICAgICAgPSB0Yi0+dGJfd2lkdGg7Cisg ICAgY29uc3QgaW50IGggICAgICAgICA9IHRiLT50Yl9oZWlnaHQ7CisgICAgY29uc3QgaW50IG56 dyAgICAgICA9IHRiLT5tYXhfc2Nhbl94ICsgMTsKKworICAgIGZvciAoaW50IHggPSAwOyB4IDwg bnp3OyB4KyspCisgICAgICAgIGZjLT52dmNkc3AuaXR4Lml0eFt0cnZdW3RiLT5sb2cyX3RiX2hl aWdodCAtIDFdKHRlbXAgKyB4LCB3LCB0Yi0+Y29lZmZzICsgeCwgdyk7CisgICAgc2NhbGVfY2xp cCh0ZW1wLCBuencsIHcsIGgsIDcpOworCisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5Kysp CisgICAgICAgIGZjLT52dmNkc3AuaXR4Lml0eFt0cmhdW3RiLT5sb2cyX3RiX3dpZHRoIC0gMV0o dGItPmNvZWZmcyArIHkgKiB3LCAxLCB0ZW1wICsgeSAqIHcsIDEpOworICAgIHNjYWxlKHRiLT5j b2VmZnMsIHRiLT5jb2VmZnMsIHcsIGgsIDIwIC0gc3BzLT5iaXRfZGVwdGgpOworfQorCitzdGF0 aWMgdm9pZCBpdHhfMWQoY29uc3QgVlZDRnJhbWVDb250ZXh0ICpmYywgVHJhbnNmb3JtQmxvY2sg KnRiLCBjb25zdCBlbnVtIFR4VHlwZSB0cmgsIGNvbnN0IGVudW0gVHhUeXBlIHRydiwgaW50ICAq dGVtcCkKK3sKKyAgICBjb25zdCBWVkNTUFMgKnNwcyAgID0gZmMtPnBzLnNwczsKKyAgICBjb25z dCBpbnQgdyAgICAgICAgID0gdGItPnRiX3dpZHRoOworICAgIGNvbnN0IGludCBoICAgICAgICAg PSB0Yi0+dGJfaGVpZ2h0OworCisgICAgaWYgKHcgPiAxKQorICAgICAgICBmYy0+dnZjZHNwLml0 eC5pdHhbdHJoXVt0Yi0+bG9nMl90Yl93aWR0aCAtIDFdKHRlbXAsIDEsIHRiLT5jb2VmZnMsIDEp OworICAgIGVsc2UKKyAgICAgICAgZmMtPnZ2Y2RzcC5pdHguaXR4W3Rydl1bdGItPmxvZzJfdGJf aGVpZ2h0IC0gMV0odGVtcCwgMSwgdGItPmNvZWZmcywgMSk7CisgICAgc2NhbGUodGItPmNvZWZm cywgdGVtcCwgdywgaCwgMjEgLSBzcHMtPmJpdF9kZXB0aCk7Cit9CisKK3N0YXRpYyB2b2lkIHRy YW5zZm9ybV9iZHBjbShUcmFuc2Zvcm1CbG9jayAqdGIsIGNvbnN0IFZWQ0xvY2FsQ29udGV4dCAq bGMsIGNvbnN0IENvZGluZ1VuaXQgKmN1KQoreworICAgIGNvbnN0IEludHJhUHJlZE1vZGUgbW9k ZSA9IHRiLT5jX2lkeCA/IGN1LT5pbnRyYV9wcmVkX21vZGVfYyA6IGN1LT5pbnRyYV9wcmVkX21v ZGVfeTsKKyAgICBjb25zdCBpbnQgdmVydGljYWwgICAgICAgPSBtb2RlID09IElOVFJBX1ZFUlQ7 CisgICAgbGMtPmZjLT52dmNkc3AuaXR4LnRyYW5zZm9ybV9iZHBjbSh0Yi0+Y29lZmZzLCB0Yi0+ dGJfd2lkdGgsIHRiLT50Yl9oZWlnaHQsIHZlcnRpY2FsLCAxNSk7CisgICAgaWYgKHZlcnRpY2Fs KQorICAgICAgICB0Yi0+bWF4X3NjYW5feSA9IHRiLT50Yl9oZWlnaHQgLSAxOworICAgIGVsc2UK KyAgICAgICAgdGItPm1heF9zY2FuX3ggPSB0Yi0+dGJfd2lkdGggLSAxOworfQorCitzdGF0aWMg dm9pZCBpdHJhbnNmb3JtKFZWQ0xvY2FsQ29udGV4dCAqbGMsIFRyYW5zZm9ybVVuaXQgKnR1LCBj b25zdCBpbnQgdHVfaWR4LCBjb25zdCBpbnQgdGFyZ2V0X2NoX3R5cGUpCit7CisgICAgY29uc3Qg VlZDRnJhbWVDb250ZXh0ICpmYyAgID0gbGMtPmZjOworICAgIGNvbnN0IFZWQ1NQUyAqc3BzICAg ICAgICAgICA9IGZjLT5wcy5zcHM7CisgICAgY29uc3QgVlZDU0ggKnNoICAgICAgICAgICAgID0g JmxjLT5zYy0+c2g7CisgICAgY29uc3QgQ29kaW5nVW5pdCAqY3UgICAgICAgID0gbGMtPmN1Owor ICAgIGNvbnN0IGludCBwcyAgICAgICAgICAgICAgICA9IGZjLT5wcy5zcHMtPnBpeGVsX3NoaWZ0 OworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgaW50LCB0ZW1wKVtNQVhfVEJfU0laRSAqIE1BWF9U Ql9TSVpFXTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHUtPm5iX3RiczsgaSsrKSB7Cisg ICAgICAgIFRyYW5zZm9ybUJsb2NrICp0YiAgPSAmdHUtPnRic1tpXTsKKyAgICAgICAgY29uc3Qg aW50IGNfaWR4ICAgICA9IHRiLT5jX2lkeDsKKyAgICAgICAgY29uc3QgaW50IGNoX3R5cGUgICA9 IGNfaWR4ID4gMDsKKworICAgICAgICBpZiAoY2hfdHlwZSA9PSB0YXJnZXRfY2hfdHlwZSAmJiB0 Yi0+aGFzX2NvZWZmcykgeworICAgICAgICAgICAgY29uc3QgaW50IHcgICAgICAgICAgICAgPSB0 Yi0+dGJfd2lkdGg7CisgICAgICAgICAgICBjb25zdCBpbnQgaCAgICAgICAgICAgICA9IHRiLT50 Yl9oZWlnaHQ7CisgICAgICAgICAgICBjb25zdCBpbnQgY2hyb21hX3NjYWxlICA9IGNoX3R5cGUg JiYgc2gtPmxtY3NfdXNlZF9mbGFnICYmIGZjLT5wcy5waC0+Y2hyb21hX3Jlc2lkdWFsX3NjYWxl X2ZsYWcgJiYgKHcgKiBoID4gNCk7CisgICAgICAgICAgICBjb25zdCBwdHJkaWZmX3Qgc3RyaWRl ICA9IGZjLT5mcmFtZS0+bGluZXNpemVbY19pZHhdOworICAgICAgICAgICAgY29uc3QgaW50IGhz ICAgICAgICAgICAgPSBzcHMtPmhzaGlmdFtjX2lkeF07CisgICAgICAgICAgICBjb25zdCBpbnQg dnMgICAgICAgICAgICA9IHNwcy0+dnNoaWZ0W2NfaWR4XTsKKyAgICAgICAgICAgIHVpbnQ4X3Qg KmRzdCAgICAgICAgICAgID0gJmZjLT5mcmFtZS0+ZGF0YVtjX2lkeF1bKHRiLT55MCA+PiB2cykg KiBzdHJpZGUgKyAoKHRiLT54MCA+PiBocykgPDwgcHMpXTsKKworICAgICAgICAgICAgaWYgKGN1 LT5iZHBjbV9mbGFnW3RiLT5jX2lkeF0pCisgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2JkcGNt KHRiLCBsYywgY3UpOworICAgICAgICAgICAgZGVxdWFudChsYywgdHUsIHRiKTsKKyAgICAgICAg ICAgIGlmICghdGItPnRzKSB7CisgICAgICAgICAgICAgICAgZW51bSBUeFR5cGUgdHJoLCB0cnY7 CisKKyAgICAgICAgICAgICAgICBpZiAoY3UtPmFwcGx5X2xmbnN0X2ZsYWdbY19pZHhdKQorICAg ICAgICAgICAgICAgICAgICBpbGZuc3RfdHJhbnNmb3JtKGxjLCB0Yik7CisgICAgICAgICAgICAg ICAgZGVyaXZlX3RyYW5zZm9ybV90eXBlKGZjLCBsYywgdGIsICZ0cmgsICZ0cnYpOworICAgICAg ICAgICAgICAgIGlmICh3ID4gMSAmJiBoID4gMSkKKyAgICAgICAgICAgICAgICAgICAgaXR4XzJk KGZjLCB0YiwgdHJoLCB0cnYsIHRlbXApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAg ICAgICAgICAgICAgaXR4XzFkKGZjLCB0YiwgdHJoLCB0cnYsIHRlbXApOworICAgICAgICAgICAg fQorCisgICAgICAgICAgICBpZiAoY2hyb21hX3NjYWxlKQorICAgICAgICAgICAgICAgIGZjLT52 dmNkc3AuaW50cmEubG1jc19zY2FsZV9jaHJvbWEobGMsIHRlbXAsIHRiLT5jb2VmZnMsIHcsIGgs IGN1LT54MCwgY3UtPnkwKTsKKyAgICAgICAgICAgIGZjLT52dmNkc3AuaXR4LmFkZF9yZXNpZHVh bChkc3QsIGNocm9tYV9zY2FsZSA/IHRlbXAgOiB0Yi0+Y29lZmZzLCB3LCBoLCBzdHJpZGUpOwor CisgICAgICAgICAgICBpZiAodHUtPmpvaW50X2NiY3JfcmVzaWR1YWxfZmxhZyAmJiB0Yi0+Y19p ZHgpCisgICAgICAgICAgICAgICAgYWRkX3Jlc2lkdWFsX2Zvcl9qb2ludF9jb2RpbmdfY2hyb21h KGxjLCB0dSwgdGIsIGNocm9tYV9zY2FsZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRp YyBpbnQgcmVjb25zdHJ1Y3QoVlZDTG9jYWxDb250ZXh0ICpsYykKK3sKKyAgICBWVkNGcmFtZUNv bnRleHQgKmZjID0gbGMtPmZjOworICAgIENvZGluZ1VuaXQgKmN1ICAgICAgPSBsYy0+Y3U7Cisg ICAgY29uc3QgaW50IHN0YXJ0ICAgICA9IGN1LT50cmVlX3R5cGUgPT0gRFVBTF9UUkVFX0NIUk9N QTsKKyAgICBjb25zdCBpbnQgZW5kICAgICAgID0gZmMtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9p ZGMgJiYgKGN1LT50cmVlX3R5cGUgIT0gRFVBTF9UUkVFX0xVTUEpOworCisgICAgZm9yIChpbnQg Y2hfdHlwZSA9IHN0YXJ0OyBjaF90eXBlIDw9IGVuZDsgY2hfdHlwZSsrKSB7CisgICAgICAgIGZv ciAoaW50IGkgPSAwOyBpIDwgY3UtPm51bV90dXM7IGkrKykgeworICAgICAgICAgICAgVHJhbnNm b3JtVW5pdCAqdHUgPSAmY3UtPnR1c1tpXTsKKworICAgICAgICAgICAgcHJlZGljdF9pbnRyYShs YywgdHUsIGksIGNoX3R5cGUpOworICAgICAgICAgICAgaXRyYW5zZm9ybShsYywgdHUsIGksIGNo X3R5cGUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgZmZfdnZj X3JlY29uc3RydWN0KFZWQ0xvY2FsQ29udGV4dCAqbGMsIGNvbnN0IGludCBycywgY29uc3QgaW50 IHJ4LCBjb25zdCBpbnQgcnkpCit7CisgICAgY29uc3QgVlZDRnJhbWVDb250ZXh0ICpmYyAgID0g bGMtPmZjOworICAgIGNvbnN0IFZWQ1NQUyAqc3BzICAgICAgICAgICA9IGZjLT5wcy5zcHM7Cisg ICAgY29uc3QgaW50IHhfY3RiICAgICAgICAgICAgID0gcnggPDwgc3BzLT5jdGJfbG9nMl9zaXpl X3k7CisgICAgY29uc3QgaW50IHlfY3RiICAgICAgICAgICAgID0gcnkgPDwgc3BzLT5jdGJfbG9n Ml9zaXplX3k7CisgICAgQ1RVICpjdHUgICAgICAgICAgICAgICAgICAgID0gZmMtPnRhYi5jdHVz ICsgcnM7CisgICAgQ29kaW5nVW5pdCAqY3UgICAgICAgICAgICAgID0gY3R1LT5jdXM7CisgICAg aW50IHJldCAgICAgICAgICAgICAgICAgICAgID0gMDsKKworICAgIGxjLT5udW1fcmFzWzBdID0g bGMtPm51bV9yYXNbMV0gPSAwOworICAgIGxjLT5sbWNzLnhfdnBkdSA9IC0xOworICAgIGxjLT5s bWNzLnlfdnBkdSA9IC0xOworICAgIGZmX3Z2Y19kZWNvZGVfbmVpZ2hib3VyKGxjLCB4X2N0Yiwg eV9jdGIsIHJ4LCByeSwgcnMpOworICAgIHdoaWxlIChjdSkgeworICAgICAgICBsYy0+Y3UgPSBj dTsKKworICAgICAgICBpZiAoY3UtPmNpaXBfZmxhZykKKyAgICAgICAgICAgIGZmX3Z2Y19wcmVk aWN0X2NpaXAobGMpOworICAgICAgICBpZiAoY3UtPmNvZGVkX2ZsYWcpIHsKKyAgICAgICAgICAg IHJldCA9IHJlY29uc3RydWN0KGxjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFk ZF9yZWNvbnN0cnVjdGVkX2FyZWEobGMsIExVTUEsIGN1LT54MCwgY3UtPnkwLCBjdS0+Y2Jfd2lk dGgsIGN1LT5jYl9oZWlnaHQpOworICAgICAgICAgICAgYWRkX3JlY29uc3RydWN0ZWRfYXJlYShs YywgQ0hST01BLCBjdS0+eDAsIGN1LT55MCwgY3UtPmNiX3dpZHRoLCBjdS0+Y2JfaGVpZ2h0KTsK KyAgICAgICAgfQorICAgICAgICBjdSA9IGN1LT5uZXh0OworICAgIH0KKyAgICBmZl92dmNfY3R1 X2ZyZWVfY3VzKGN0dSk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGZmX3Z2Y19nZXRfbWlw X3NpemVfaWQoY29uc3QgaW50IHcsIGNvbnN0IGludCBoKQoreworICAgIGlmICh3ID09IDQgJiYg aCA9PSA0KQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoKHcgPT0gNCB8fCBoID09IDQpIHx8 ICh3ID09IDggJiYgaCA9PSA4KSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDI7Cit9 CisKK2ludCBmZl92dmNfbnNjYWxlX2Rlcml2ZShjb25zdCBpbnQgdywgY29uc3QgaW50IGgsIGNv bnN0IGludCBtb2RlKQoreworICAgIGludCBzaWRlX3NpemUsIG5zY2FsZTsKKyAgICBhdl9hc3Nl cnQwKG1vZGUgPCBJTlRSQV9MVF9DQ0xNICYmICEobW9kZSA+IElOVFJBX0hPUlogJiYgbW9kZSA8 IElOVFJBX1ZFUlQpKTsKKyAgICBpZiAobW9kZSA9PSBJTlRSQV9QTEFOQVIgfHwgbW9kZSA9PSBJ TlRSQV9EQyB8fAorICAgICAgICBtb2RlID09IElOVFJBX0hPUlogfHwgbW9kZSA9PSBJTlRSQV9W RVJUKSB7CisgICAgICAgIG5zY2FsZSA9IChhdl9sb2cyKHcpICsgYXZfbG9nMihoKSAtIDIpID4+ IDI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgaW50IGludHJhX3ByZWRfYW5nbGUgPSBm Zl92dmNfaW50cmFfcHJlZF9hbmdsZV9kZXJpdmUobW9kZSk7CisgICAgICAgIGNvbnN0IGludCBp bnZfYW5nbGUgICAgICAgID0gZmZfdnZjX2ludHJhX2ludl9hbmdsZV9kZXJpdmUoaW50cmFfcHJl ZF9hbmdsZSk7CisgICAgICAgIGlmIChtb2RlID49IElOVFJBX1ZFUlQpCisgICAgICAgICAgICBz aWRlX3NpemUgPSBoOworICAgICAgICBpZiAobW9kZSA8PSBJTlRSQV9IT1JaKQorICAgICAgICAg ICAgc2lkZV9zaXplID0gdzsKKyAgICAgICAgbnNjYWxlID0gRkZNSU4oMiwgYXZfbG9nMihzaWRl X3NpemUpIC0gYXZfbG9nMigzICogaW52X2FuZ2xlIC0gMikgKyA4KTsKKyAgICB9CisgICAgcmV0 dXJuIG5zY2FsZTsKK30KKworaW50IGZmX3Z2Y19uZWVkX3BkcGMoY29uc3QgaW50IHcsIGNvbnN0 IGludCBoLCBjb25zdCB1aW50OF90IGJkcGNtX2ZsYWcsIGNvbnN0IGludCBtb2RlLCBjb25zdCBp bnQgcmVmX2lkeCkKK3sKKyAgICBhdl9hc3NlcnQwKG1vZGUgPCBJTlRSQV9MVF9DQ0xNKTsKKyAg ICBpZiAoKHcgPj0gNCAmJiBoID49IDQpICYmICFyZWZfaWR4ICYmICFiZHBjbV9mbGFnKSB7Cisg ICAgICAgIGludCBuc2NhbGU7CisgICAgICAgIGlmIChtb2RlID09IElOVFJBX1BMQU5BUiB8fCBt b2RlID09IElOVFJBX0RDIHx8CisgICAgICAgICAgICBtb2RlID09IElOVFJBX0hPUlogfHwgbW9k ZSA9PSBJTlRSQV9WRVJUKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGlmIChtb2Rl ID4gSU5UUkFfSE9SWiAmJiBtb2RlIDwgSU5UUkFfVkVSVCkKKyAgICAgICAgICAgIHJldHVybiAw OworICAgICAgICBuc2NhbGUgPSBmZl92dmNfbnNjYWxlX2Rlcml2ZSh3LCBoLCBtb2RlKTsKKyAg ICAgICAgcmV0dXJuIG5zY2FsZSA+PSAwOworCisgICAgfQorICAgIHJldHVybiAwOworfQorCitz dGF0aWMgY29uc3QgUmVjb25zdHJ1Y3RlZEFyZWEqIGdldF9yZWNvbnN0cnVjdGVkX2FyZWEoY29u c3QgVlZDTG9jYWxDb250ZXh0ICpsYywgY29uc3QgaW50IHgsIGNvbnN0IGludCB5LCBjb25zdCBp bnQgY19pZHgpCit7CisgICAgY29uc3QgaW50IGNoX3R5cGUgPSBjX2lkeCA+IDA7CisgICAgZm9y IChpbnQgaSA9IGxjLT5udW1fcmFzW2NoX3R5cGVdIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAg ICAgY29uc3QgUmVjb25zdHJ1Y3RlZEFyZWEqIGEgPSAmbGMtPnJhc1tjaF90eXBlXVtpXTsKKyAg ICAgICAgY29uc3QgaW50IHIgPSAoYS0+eCArIGEtPncpOworICAgICAgICBjb25zdCBpbnQgYiA9 IChhLT55ICsgYS0+aCk7CisgICAgICAgIGlmIChhLT54IDw9IHggJiYgeCA8IHIgJiYgYS0+eSA8 PSB5ICYmIHkgPCBiKQorICAgICAgICAgICAgcmV0dXJuIGE7CisKKyAgICAgICAgLy9pdCdzIHRv byBmYXIgYXdheSwgbm8gbmVlZCBjaGVjayBpdDsKKyAgICAgICAgaWYgKHggPj0gciAmJiB5ID49 IGIpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2lu dCBmZl92dmNfZ2V0X3RvcF9hdmFpbGFibGUoY29uc3QgVlZDTG9jYWxDb250ZXh0ICpsYywgY29u c3QgaW50IHgsIGNvbnN0IGludCB5LCBpbnQgdGFyZ2V0X3NpemUsIGNvbnN0IGludCBjX2lkeCkK K3sKKyAgICBjb25zdCBWVkNGcmFtZUNvbnRleHQgKmZjID0gbGMtPmZjOworICAgIGNvbnN0IFZW Q1NQUyAqc3BzID0gZmMtPnBzLnNwczsKKyAgICBjb25zdCBpbnQgaHMgPSBzcHMtPmhzaGlmdFtj X2lkeF07CisgICAgY29uc3QgaW50IHZzID0gc3BzLT52c2hpZnRbY19pZHhdOworICAgIGNvbnN0 IGludCBsb2cyX2N0Yl9zaXplX3YgICA9IHNwcy0+Y3RiX2xvZzJfc2l6ZV95IC0gdnM7CisgICAg Y29uc3QgaW50IGVuZF9vZl9jdGJfeCAgICAgID0gKChsYy0+Y3UtPngwID4+IHNwcy0+Y3RiX2xv ZzJfc2l6ZV95KSArIDEpIDw8IHNwcy0+Y3RiX2xvZzJfc2l6ZV95OworICAgIGNvbnN0IGludCB5 MGIgICAgICAgICAgICAgICA9IGF2X21vZF91aW50cDIoeSwgbG9nMl9jdGJfc2l6ZV92KTsKKyAg ICBjb25zdCBpbnQgbWF4X3ggICAgICAgICAgICAgPSBGRk1JTihmYy0+cHMucHBzLT53aWR0aCwg ZW5kX29mX2N0Yl94KSA+PiBoczsKKyAgICBjb25zdCBSZWNvbnN0cnVjdGVkQXJlYSAqYTsKKyAg ICBpbnQgcHggPSB4OworCisgICAgaWYgKCF5MGIpIHsKKyAgICAgICAgaWYgKCFsYy0+Y3RiX3Vw X2ZsYWcpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgdGFyZ2V0X3NpemUgPSBGRk1J Tih0YXJnZXRfc2l6ZSwgKGxjLT5lbmRfb2ZfdGlsZXNfeCA+PiBocykgLSB4KTsKKyAgICAgICAg aWYgKHNwcy0+ZW50cm9weV9jb2Rpbmdfc3luY19lbmFibGVkX2ZsYWcpCisgICAgICAgICAgICB0 YXJnZXRfc2l6ZSA9IEZGTUlOKHRhcmdldF9zaXplLCAoZW5kX29mX2N0Yl94ID4+IGhzKSAtIHgp OworICAgICAgICByZXR1cm4gdGFyZ2V0X3NpemU7CisgICAgfQorCisgICAgdGFyZ2V0X3NpemUg PSBGRk1BWCgwLCBGRk1JTih0YXJnZXRfc2l6ZSwgbWF4X3ggLSB4KSk7CisgICAgd2hpbGUgKHRh cmdldF9zaXplID4gMCAmJiAoYSA9IGdldF9yZWNvbnN0cnVjdGVkX2FyZWEobGMsIHB4LCB5IC0g MSwgY19pZHgpKSkgeworICAgICAgICBjb25zdCBpbnQgc3ogPSBGRk1JTih0YXJnZXRfc2l6ZSwg YS0+eCArIGEtPncgLSBweCk7CisgICAgICAgIHB4ICs9IHN6OworICAgICAgICB0YXJnZXRfc2l6 ZSAtPSBzejsKKyAgICB9CisgICAgcmV0dXJuIHB4IC0geDsKK30KKworaW50IGZmX3Z2Y19nZXRf bGVmdF9hdmFpbGFibGUoY29uc3QgVlZDTG9jYWxDb250ZXh0ICpsYywgY29uc3QgaW50IHgsIGNv bnN0IGludCB5LCBpbnQgdGFyZ2V0X3NpemUsIGNvbnN0IGludCBjX2lkeCkKK3sKKyAgICBjb25z dCBWVkNGcmFtZUNvbnRleHQgKmZjID0gbGMtPmZjOworICAgIGNvbnN0IFZWQ1NQUyAqc3BzID0g ZmMtPnBzLnNwczsKKyAgICBjb25zdCBpbnQgaHMgPSBzcHMtPmhzaGlmdFtjX2lkeF07CisgICAg Y29uc3QgaW50IHZzID0gc3BzLT52c2hpZnRbY19pZHhdOworICAgIGNvbnN0IGludCBsb2cyX2N0 Yl9zaXplX2ggICA9ICBzcHMtPmN0Yl9sb2cyX3NpemVfeSAtIGhzOworICAgIGNvbnN0IGludCB4 MGIgICAgICAgICAgICAgICA9IGF2X21vZF91aW50cDIoeCwgbG9nMl9jdGJfc2l6ZV9oKTsKKyAg ICBjb25zdCBpbnQgZW5kX29mX2N0Yl95ICAgICAgPSAoKGxjLT5jdS0+eTAgPj4gc3BzLT5jdGJf bG9nMl9zaXplX3kpICsgMSkgPDwgc3BzLT5jdGJfbG9nMl9zaXplX3k7CisgICAgY29uc3QgaW50 IG1heF95ICAgICAgICAgICAgID0gRkZNSU4oZmMtPnBzLnBwcy0+aGVpZ2h0LCBlbmRfb2ZfY3Ri X3kpID4+IHZzOworICAgIGNvbnN0IFJlY29uc3RydWN0ZWRBcmVhICphOworICAgIGludCAgcHkg PSB5OworCisgICAgaWYgKCF4MGIgJiYgIWxjLT5jdGJfbGVmdF9mbGFnKQorICAgICAgICByZXR1 cm4gMDsKKworICAgIHRhcmdldF9zaXplID0gRkZNQVgoMCwgRkZNSU4odGFyZ2V0X3NpemUsIG1h eF95IC0geSkpOworICAgIGlmICgheDBiKQorICAgICAgICByZXR1cm4gdGFyZ2V0X3NpemU7CisK KyAgICB3aGlsZSAodGFyZ2V0X3NpemUgPiAwICYmIChhID0gZ2V0X3JlY29uc3RydWN0ZWRfYXJl YShsYywgeCAtIDEsIHB5LCBjX2lkeCkpKSB7CisgICAgICAgIGNvbnN0IGludCBzeiA9IEZGTUlO KHRhcmdldF9zaXplLCBhLT55ICsgYS0+aCAtIHB5KTsKKyAgICAgICAgcHkgKz0gc3o7CisgICAg ICAgIHRhcmdldF9zaXplIC09IHN6OworICAgIH0KKyAgICByZXR1cm4gcHkgLSB5OworfQorCitz dGF0aWMgaW50IGxlc3MoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICByZXR1 cm4gKihjb25zdCBpbnQqKWEgLSAqKGNvbnN0IGludCopYjsKK30KKworaW50IGZmX3Z2Y19yZWZf ZmlsdGVyX2ZsYWdfZGVyaXZlKGNvbnN0IGludCBtb2RlKQoreworICAgIHN0YXRpYyBjb25zdCBp bnQgbW9kZXNbXSA9IHsgLTE0LCAtMTIsIC0xMCwgLTYsIElOVFJBX1BMQU5BUiwgMiwgMzQsIDY2 LCA3MiwgNzYsIDc4LCA4MH07CisgICAgcmV0dXJuIGJzZWFyY2goJm1vZGUsIG1vZGVzLCBGRl9B UlJBWV9FTEVNUyhtb2RlcyksIHNpemVvZihpbnQpLCBsZXNzKSAhPSBOVUxMOworfQorCitpbnQg ZmZfdnZjX2ludHJhX3ByZWRfYW5nbGVfZGVyaXZlKGNvbnN0IGludCBwcmVkX21vZGUpCit7Cisg ICAgc3RhdGljIGNvbnN0IGludCBhbmdsZXNbXSA9IHsKKyAgICAgICAgICAwLCAgIDEsICAgMiwg ICAzLCAgIDQsICAgNiwgICA4LCAgMTAsICAxMiwgIDE0LCAgMTYsICAxOCwgIDIwLCAgMjMsICAy NiwgMjksCisgICAgICAgICAzMiwgIDM1LCAgMzksICA0NSwgIDUxLCAgNTcsICA2NCwgIDczLCAg ODYsIDEwMiwgMTI4LCAxNzEsIDI1NiwgMzQxLCA1MTIKKyAgICB9OworICAgIGludCBzaWduID0g MSwgaWR4LCBpbnRyYV9wcmVkX2FuZ2xlOworICAgIGlmIChwcmVkX21vZGUgPiBJTlRSQV9ESUFH KSB7CisgICAgICAgIGlkeCA9IHByZWRfbW9kZSAtIElOVFJBX1ZFUlQ7CisgICAgfSBlbHNlIGlm IChwcmVkX21vZGUgPiAwKSB7CisgICAgICAgIGlkeCA9IElOVFJBX0hPUlogLSBwcmVkX21vZGU7 CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWR4ID0gSU5UUkFfSE9SWiAtIDIgLSBwcmVkX21vZGU7 CisgICAgfQorICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgIGlkeCA9IC1pZHg7CisgICAgICAg IHNpZ24gPSAtMTsKKyAgICB9CisgICAgaW50cmFfcHJlZF9hbmdsZSA9IHNpZ24gKiBhbmdsZXNb aWR4XTsKKyAgICByZXR1cm4gaW50cmFfcHJlZF9hbmdsZTsKK30KKworI2RlZmluZSBST1VORChm KSAoaW50KShmIDwgMCA/IC0oLWYgKyAwLjUpIDogKGYgKyAwLjUpKQoraW50IGZmX3Z2Y19pbnRy YV9pbnZfYW5nbGVfZGVyaXZlKGNvbnN0IGludCBpbnRyYV9wcmVkX2FuZ2xlKQoreworICAgIGZs b2F0IGludl9hbmdsZTsKKyAgICBhdl9hc3NlcnQwKGludHJhX3ByZWRfYW5nbGUpOworICAgIGlu dl9hbmdsZSA9IDMyICogNTEyLjAgLyBpbnRyYV9wcmVkX2FuZ2xlOworICAgIHJldHVybiBST1VO RChpbnZfYW5nbGUpOworfQorCisvLzguNC41LjIuNyBXaWRlIGFuZ2xlIGludHJhIHByZWRpY3Rp b24gbW9kZSBtYXBwaW5nIHByb2NlcworaW50IGZmX3Z2Y193aWRlX2FuZ2xlX21vZGVfbWFwcGlu Zyhjb25zdCBDb2RpbmdVbml0ICpjdSwKKyAgICBjb25zdCBpbnQgdGJfd2lkdGgsIGNvbnN0IGlu dCB0Yl9oZWlnaHQsIGNvbnN0IGludCBjX2lkeCwgaW50IHByZWRfbW9kZV9pbnRyYSkKK3sKKyAg ICBpbnQgbncsIG5oLCB3aF9yYXRpbywgbWluLCBtYXg7CisKKyAgICBpZiAoY3UtPmlzcF9zcGxp dF90eXBlID09IElTUF9OT19TUExJVCB8fCBjX2lkeCkgeworICAgICAgICBudyA9IHRiX3dpZHRo OworICAgICAgICBuaCA9IHRiX2hlaWdodDsKKyAgICB9IGVsc2UgeworICAgICAgICBudyA9IGN1 LT5jYl93aWR0aDsKKyAgICAgICAgbmggPSBjdS0+Y2JfaGVpZ2h0OworICAgIH0KKyAgICB3aF9y YXRpbyAgICA9IEZGQUJTKGZmX2xvZzIobncpIC0gZmZfbG9nMihuaCkpOworICAgIG1heCAgICAg ICAgID0gKHdoX3JhdGlvID4gMSkgPyAoOCAgKyAyICogd2hfcmF0aW8pIDogODsKKyAgICBtaW4g ICAgICAgICA9ICh3aF9yYXRpbyA+IDEpID8gKDYwIC0gMiAqIHdoX3JhdGlvKSA6IDYwOworCisg ICAgaWYgKG53ID4gbmggJiYgcHJlZF9tb2RlX2ludHJhID49MiAmJiBwcmVkX21vZGVfaW50cmEg PCBtYXgpCisgICAgICAgIHByZWRfbW9kZV9pbnRyYSArPSA2NTsKKyAgICBlbHNlIGlmIChuaCA+ IG53ICYmIHByZWRfbW9kZV9pbnRyYSA8PSA2NiAmJiBwcmVkX21vZGVfaW50cmEgPiBtaW4pCisg ICAgICAgIHByZWRfbW9kZV9pbnRyYSAtPSA2NzsKKyAgICByZXR1cm4gcHJlZF9tb2RlX2ludHJh OworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92dmMvdnZjX2ludHJhLmggYi9saWJhdmNvZGVj L3Z2Yy92dmNfaW50cmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi4x MmQwZGFlODAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy92dmMvdnZjX2ludHJhLmgK QEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIFZWQyBpbnRyYSBwcmVkaWN0aW9uCisgKgorICogQ29w eXJpZ2h0IChDKSAyMDIxIE51byBNaQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBl Zy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg aXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2Vy IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBv ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBk aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJ VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK KyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g IFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk ZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlm IG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUx IEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EK KyAqLworI2lmbmRlZiBBVkNPREVDX1ZWQ19JTlRSQV9ICisjZGVmaW5lIEFWQ09ERUNfVlZDX0lO VFJBX0gKKworI2luY2x1ZGUgInZ2Y19jdHUuaCIKKworLyoqCisgKiByZWNvbnN0cnVjdCBhIENU VQorICogQHBhcmFtIGxjIGxvY2FsIGNvbnRleHQgZm9yIENUVQorICogQHBhcmFtIHJzIHJhc3Rl ciBvcmRlciBmb3IgdGhlIENUVS4KKyAqIEBwYXJhbSByeCByYXN0ZXIgb3JkZXIgeCBmb3IgdGhl IENUVS4KKyAqIEBwYXJhbSByeSByYXN0ZXIgb3JkZXIgeSBmb3IgdGhlIENUVS4KKyAqIEByZXR1 cm4gQVZFUlJPUgorICovCitpbnQgZmZfdnZjX3JlY29uc3RydWN0KFZWQ0xvY2FsQ29udGV4dCAq bGMsIGNvbnN0IGludCBycywgY29uc3QgaW50IHJ4LCBjb25zdCBpbnQgcnkpOworCisvL3V0aWxz IGZvciB2dmNfaW50cmFfdGVtcGxhdGUKK2ludCBmZl92dmNfZ2V0X3RvcF9hdmFpbGFibGUoY29u c3QgVlZDTG9jYWxDb250ZXh0ICpsYywgaW50IHgwLCBpbnQgeTAsIGludCB0YXJnZXRfc2l6ZSwg aW50IGNfaWR4KTsKK2ludCBmZl92dmNfZ2V0X2xlZnRfYXZhaWxhYmxlKGNvbnN0IFZWQ0xvY2Fs Q29udGV4dCAqbGMsIGludCB4MCwgaW50IHkwLCBpbnQgdGFyZ2V0X3NpemUsIGludCBjX2lkeCk7 CitpbnQgZmZfdnZjX2dldF9taXBfc2l6ZV9pZChpbnQgdywgaW50IGgpOworaW50IGZmX3Z2Y19u ZWVkX3BkcGMoaW50IHcsIGludCBoLCB1aW50OF90IGJkcGNtX2ZsYWcsIGludCBtb2RlLCBpbnQg cmVmX2lkeCk7CitpbnQgZmZfdnZjX25zY2FsZV9kZXJpdmUoaW50IHcsIGludCBoLCBpbnQgbW9k ZSk7CitpbnQgZmZfdnZjX3JlZl9maWx0ZXJfZmxhZ19kZXJpdmUoaW50IG1vZGUpOworaW50IGZm X3Z2Y19pbnRyYV9wcmVkX2FuZ2xlX2Rlcml2ZShpbnQgcHJlZF9tb2RlKTsKK2ludCBmZl92dmNf aW50cmFfaW52X2FuZ2xlX2Rlcml2ZShpbnQgcHJlZF9tb2RlKTsKK2ludCBmZl92dmNfd2lkZV9h bmdsZV9tb2RlX21hcHBpbmcoY29uc3QgQ29kaW5nVW5pdCAqY3UsCisgICAgaW50IHRiX3dpZHRo LCBpbnQgdGJfaGVpZ2h0LCBpbnQgY19pZHgsIGludCBwcmVkX21vZGVfaW50cmEpOworCisjZW5k aWYgLy8gQVZDT0RFQ19WVkNfSU5UUkFfSApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92dmMvdnZj X2ludHJhX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL3Z2Yy92dmNfaW50cmFfdGVtcGxhdGUuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi5mNGU0MmJmNzk5Ci0tLSAvZGV2 L251bGwKKysrIGIvbGliYXZjb2RlYy92dmMvdnZjX2ludHJhX3RlbXBsYXRlLmMKQEAgLTAsMCAr MSwxMDE4IEBACisvKgorICogVlZDIGludHJhIHByZWRpY3Rpb24gRFNQCisgKgorICogQ29weXJp Z2h0IChDKSAyMDIxLTIwMjMgTnVvbWkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1w ZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl IGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3Nl ciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwg b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMg ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBX SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m CisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu ICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg ZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH TlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBp ZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1 MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNB CisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYml0X2RlcHRoX3RlbXBsYXRlLmMiCisKKyNp bmNsdWRlICJ2dmNfZGF0YS5oIgorI2luY2x1ZGUgInZ2Y19pbnRyYS5oIgorCisjZGVmaW5lIFBP Uyh4LCB5KSBzcmNbKHgpICsgc3RyaWRlICogKHkpXQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGlu ZSB2b2lkIEZVTkMoY2NsbV9saW5lYXJfcHJlZCkoVlZDRnJhbWVDb250ZXh0ICpmYywgY29uc3Qg aW50IHgwLCBjb25zdCBpbnQgeTAsCisgICAgY29uc3QgaW50IHcsIGNvbnN0IGludCBoLCBjb25z dCBwaXhlbCogcGRzeSwgY29uc3QgaW50ICphLCBjb25zdCBpbnQgKmIsIGNvbnN0IGludCAqaykK K3sKKyAgICBjb25zdCBWVkNTUFMgKnNwcyA9IGZjLT5wcy5zcHM7CisgICAgZm9yIChpbnQgaSA9 IDA7IGkgPCBWVkNfTUFYX1NBTVBMRV9BUlJBWVMgLSAxOyBpKyspIHsKKyAgICAgICAgY29uc3Qg aW50IGNfaWR4ID0gaSArIDE7CisgICAgICAgIGNvbnN0IGludCB4ID0geDAgPj4gc3BzLT5oc2hp ZnRbY19pZHhdOworICAgICAgICBjb25zdCBpbnQgeSA9IHkwID4+IHNwcy0+dnNoaWZ0W2NfaWR4 XTsKKyAgICAgICAgY29uc3QgcHRyZGlmZl90IHN0cmlkZSA9IGZjLT5mcmFtZS0+bGluZXNpemVb Y19pZHhdIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICAgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopZmMt PmZyYW1lLT5kYXRhW2NfaWR4XSArIHggKyB5ICogc3RyaWRlOworICAgICAgICBmb3IgKGludCB5 ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4 KyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgZHN5ID0gcGRzeVt5ICogdyArIHhdOwor ICAgICAgICAgICAgICAgIGNvbnN0IGludCBwcmVkID0gKChkc3kgKiBhW2ldKSA+PiBrW2ldKSAr IGJbaV07CisgICAgICAgICAgICAgICAgUE9TKHgsIHkpID0gQ0xJUChwcmVkKTsKKyAgICAgICAg ICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworI2RlZmluZSBNQVhfUElDS19QT1MgNAorI2Rl ZmluZSBUT1AgIDAKKyNkZWZpbmUgTEVGVCAxCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZv aWQgRlVOQyhjY2xtX2dldF9wYXJhbXNfZGVmYXVsdCkoaW50ICphLCBpbnQgKmIsIGludCAqaykK K3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBhW2ldID0ga1tp XSA9IDA7CisgICAgICAgIGJbaV0gPSAxIDw8IChCSVRfREVQVEggLSAxKTsKKyAgICB9Cit9CisK K3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBGVU5DKGNjbG1fZ2V0X3NlbGVjdF9wb3MpKGNv bnN0IFZWQ0xvY2FsQ29udGV4dCAqbGMsCisgICAgY29uc3QgaW50IHgsIGNvbnN0IGludCB5LCBj b25zdCBpbnQgdywgY29uc3QgaW50IGgsIGNvbnN0IGludCBhdmFpbF90LCBjb25zdCBpbnQgYXZh aWxfbCwKKyAgICBpbnQgY250WzJdLCBpbnQgcG9zWzJdW01BWF9QSUNLX1BPU10pCit7CisgICAg Y29uc3QgZW51bSBJbnRyYVByZWRNb2RlIG1vZGUgPSBsYy0+Y3UtPmludHJhX3ByZWRfbW9kZV9j OworICAgIGNvbnN0IGludCBudW1faXM0ID0gIWF2YWlsX3QgfHwgIWF2YWlsX2wgfHwgbW9kZSAh PSBJTlRSQV9MVF9DQ0xNOworICAgIGludCBudW1fc2FtcFsyXTsKKworICAgIGlmIChtb2RlID09 IElOVFJBX0xUX0NDTE0pIHsKKyAgICAgICAgbnVtX3NhbXBbVE9QXSAgPSBhdmFpbF90ID8gdyA6 IDA7CisgICAgICAgIG51bV9zYW1wW0xFRlRdID0gYXZhaWxfbCA/IGggOiAwOworICAgIH0gZWxz ZSB7CisgICAgICAgIG51bV9zYW1wW1RPUF0gPSAoYXZhaWxfdCAmJiBtb2RlID09IElOVFJBX1Rf Q0NMTSkgPyBmZl92dmNfZ2V0X3RvcF9hdmFpbGFibGUobGMsICB4LCB5LCB3ICsgRkZNSU4odywg aCksIDEpIDogMDsKKyAgICAgICAgbnVtX3NhbXBbTEVGVF0gPSAoYXZhaWxfbCAmJiBtb2RlID09 IElOVFJBX0xfQ0NMTSkgPyBmZl92dmNfZ2V0X2xlZnRfYXZhaWxhYmxlKGxjLCB4LCB5LCBoICsg RkZNSU4odywgaCksIDEpIDogMDsKKyAgICB9CisgICAgaWYgKCFudW1fc2FtcFtUT1BdICYmICFu dW1fc2FtcFtMRUZUXSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZm9yIChpbnQg aSA9IFRPUDsgaSA8PSBMRUZUOyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IHN0YXJ0ID0gbnVt X3NhbXBbaV0gPj4gKDIgKyBudW1faXM0KTsKKyAgICAgICAgY29uc3QgaW50IHN0ZXAgID0gRkZN QVgoMSwgbnVtX3NhbXBbaV0gPj4gKDEgKyBudW1faXM0KSkgOworICAgICAgICBjbnRbaV0gPSBG Rk1JTihudW1fc2FtcFtpXSwgKDEgKyBudW1faXM0KSA8PCAxKTsKKyAgICAgICAgZm9yIChpbnQg YyA9IDA7IGMgPCBjbnRbaV07IGMrKykKKyAgICAgICAgICAgIHBvc1tpXVtjXSA9IHN0YXJ0ICsg YyAqIHN0ZXA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lu bGluZSB2b2lkIEZVTkMoY2NsbV9zZWxlY3RfbHVtYV80NDQpKGNvbnN0IHBpeGVsICpzcmMsIGNv bnN0IGludCBzdGVwLAorICAgIGNvbnN0IGludCBjbnQsIGNvbnN0IGludCBwb3NbTUFYX1BJQ0tf UE9TXSwgIHBpeGVsICpzZWxfbHVtYSkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNudDsg aSsrKQorICAgICAgICBzZWxfbHVtYVtpXSA9IHNyY1twb3NbaV0gKiBzdGVwXTsKK30KKworc3Rh dGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBGVU5DKGNjbG1fc2VsZWN0X2x1bWEpKGNvbnN0IFZW Q0ZyYW1lQ29udGV4dCAqZmMsCisgICAgY29uc3QgaW50IHgwLCBjb25zdCBpbnQgeTAsIGNvbnN0 IGludCBhdmFpbF90LCBjb25zdCBpbnQgYXZhaWxfbCwgY29uc3QgaW50IGNudFsyXSwgY29uc3Qg aW50IHBvc1syXVtNQVhfUElDS19QT1NdLAorICAgIHBpeGVsICpzZWxfbHVtYSkKK3sKKyAgICBj b25zdCBWVkNTUFMgKnNwcyA9IGZjLT5wcy5zcHM7CisKKyAgICBjb25zdCBpbnQgYl9jdHVfYm91 bmRhcnkgPSAhYXZfbW9kX3VpbnRwMih5MCwgc3BzLT5jdGJfbG9nMl9zaXplX3kpOworICAgIGNv bnN0IGludCBocyA9IHNwcy0+aHNoaWZ0WzFdOworICAgIGNvbnN0IGludCB2cyA9IHNwcy0+dnNo aWZ0WzFdOworICAgIGNvbnN0IHB0cmRpZmZfdCBzdHJpZGUgPSBmYy0+ZnJhbWUtPmxpbmVzaXpl WzBdIC8gc2l6ZW9mKHBpeGVsKTsKKworICAgIGlmICghaHMgJiYgIXZzKSB7CisgICAgICAgIGNv bnN0IHBpeGVsKiBzcmMgPSAocGl4ZWwqKWZjLT5mcmFtZS0+ZGF0YVswXSArIHgwICsgeTAgKiBz dHJpZGU7CisgICAgICAgIEZVTkMoY2NsbV9zZWxlY3RfbHVtYV80NDQpKHNyYyAtIGF2YWlsX3Qg KiBzdHJpZGUsIDEsIGNudFtUT1BdLCBwb3NbVE9QXSwgc2VsX2x1bWEpOworICAgICAgICBGVU5D KGNjbG1fc2VsZWN0X2x1bWFfNDQ0KShzcmMgLSBhdmFpbF9sLCBzdHJpZGUsIGNudFtMRUZUXSwg cG9zW0xFRlRdLCBzZWxfbHVtYSArIGNudFtUT1BdKTsKKyAgICB9IGVsc2UgeworICAgICAgICAv LyB0b3AKKyAgICAgICAgaWYgKHZzICYmICFiX2N0dV9ib3VuZGFyeSkgeworICAgICAgICAgICAg Y29uc3QgcGl4ZWwgKnNvdXJjZSA9IChwaXhlbCAqKWZjLT5mcmFtZS0+ZGF0YVswXSArIHgwICsg KHkwIC0gMikgKiBzdHJpZGU7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNudFtU T1BdOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgeCA9IHBvc1tUT1BdW2ldIDw8 IGhzOworICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsICpzcmMgPSBzb3VyY2UgKyB4OworICAg ICAgICAgICAgICAgIGNvbnN0IGludCBoYXNfbGVmdCA9IHggfHwgYXZhaWxfbDsKKyAgICAgICAg ICAgICAgICBjb25zdCBwaXhlbCBsID0gaGFzX2xlZnQgPyBQT1MoLTEsIDApIDogUE9TKDAsIDAp OworICAgICAgICAgICAgICAgIGlmIChzcHMtPmNocm9tYV92ZXJ0aWNhbF9jb2xsb2NhdGVkX2Zs YWcpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsX2x1bWFbaV0gPSAoUE9TKDAsIC0xKSArIGwg KyA0ICogUE9TKDAsIDApICsgUE9TKDEsIDApICsgUE9TKDAsIDEpICsgNCkgPj4gMzsKKyAgICAg ICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCBsMSA9 IGhhc19sZWZ0ID8gUE9TKC0xLCAxKSA6IFBPUygwLCAxKTsKKyAgICAgICAgICAgICAgICAgICAg c2VsX2x1bWFbaV0gPSAobCArIGwxICsgMiAqIChQT1MoMCwgMCkgKyBQT1MoMCwgMSkpICsgUE9T KDEsIDApICsgUE9TKDEsIDEpICsgNCkgPj4gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg ICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBwaXhlbCAqc291cmNl ID0gKHBpeGVsKilmYy0+ZnJhbWUtPmRhdGFbMF0gKyB4MCArICh5MCAtIDEpICogc3RyaWRlOwor ICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbnRbVE9QXTsgaSsrKSB7CisgICAgICAg ICAgICAgICAgY29uc3QgaW50IHggPSBwb3NbVE9QXVtpXSA8PCBoczsKKyAgICAgICAgICAgICAg ICBjb25zdCBwaXhlbCAqc3JjID0gc291cmNlICsgeDsKKyAgICAgICAgICAgICAgICBjb25zdCBp bnQgaGFzX2xlZnQgPSB4IHx8IGF2YWlsX2w7CisgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwg bCA9IGhhc19sZWZ0ID8gUE9TKC0xLCAwKSA6IFBPUygwLCAwKTsKKyAgICAgICAgICAgICAgICBz ZWxfbHVtYVtpXSA9IChsICsgMiAqIFBPUygwLCAwKSArIFBPUygxLCAwKSArIDIpID4+IDI7Cisg ICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBsZWZ0CisgICAgICAgIHsKKyAg ICAgICAgICAgIGNvbnN0IHBpeGVsICpsZWZ0OworICAgICAgICAgICAgY29uc3QgcGl4ZWwgKnNv dXJjZSA9IChwaXhlbCAqKWZjLT5mcmFtZS0+ZGF0YVswXSArIHgwICsgeTAgKiBzdHJpZGUgLSAo MSArIGhzKSAqIGF2YWlsX2w7CisgICAgICAgICAgICBsZWZ0ID0gc291cmNlIC0gYXZhaWxfbDsK KworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbnRbTEVGVF07IGkrKykgeworICAg ICAgICAgICAgICAgIGNvbnN0IGludCB5ID0gcG9zW0xFRlRdW2ldIDw8IHZzOworICAgICAgICAg ICAgICAgIGNvbnN0IGludCBvZmZzZXQgPSB5ICogc3RyaWRlOworICAgICAgICAgICAgICAgIGNv bnN0IHBpeGVsICpsICAgPSBsZWZ0ICsgb2Zmc2V0OworICAgICAgICAgICAgICAgIGNvbnN0IHBp eGVsICpzcmMgPSBzb3VyY2UgKyBvZmZzZXQ7CisgICAgICAgICAgICAgICAgcGl4ZWwgcHJlZDsK KyAgICAgICAgICAgICAgICBpZiAoIXZzKSB7CisgICAgICAgICAgICAgICAgICAgIHByZWQgPSAo KmwgKyAyICogUE9TKDAsIDApICsgUE9TKDEsIDApICsgMikgPj4gMjsKKyAgICAgICAgICAgICAg ICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3BzLT5jaHJvbWFfdmVydGljYWxf Y29sbG9jYXRlZF9mbGFnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaGFz X3RvcCA9IHkgfHwgYXZhaWxfdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVs IHQgPSBoYXNfdG9wID8gUE9TKDAsIC0xKSA6IFBPUygwLCAwKTsKKyAgICAgICAgICAgICAgICAg ICAgICAgIHByZWQgPSAoKmwgKyB0ICsgNCAqIFBPUygwLCAwKSArIFBPUygxLCAwKSArIFBPUygw LCAxKSArIDQpID4+IDM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg ICAgICAgICAgICAgICBwcmVkID0gKCpsICsgKihsICsgc3RyaWRlKSArIDIgKiBQT1MoMCwgMCkg KyAyICogUE9TKDAsIDEpICsgUE9TKDEsIDApICsgUE9TKDEsIDEpICsgNCkgPj4gMzsKKyAgICAg ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWxf bHVtYVtpICsgY250W1RPUF1dID0gcHJlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAg IH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBGVU5DKGNjbG1fc2VsZWN0X2No cm9tYSkoY29uc3QgVlZDRnJhbWVDb250ZXh0ICpmYywKKyAgICBjb25zdCBpbnQgeCwgY29uc3Qg aW50IHksIGNvbnN0IGludCBjbnRbMl0sIGNvbnN0IGludCBwb3NbMl1bTUFYX1BJQ0tfUE9TXSwK KyAgICBwaXhlbCBzZWxbXVtNQVhfUElDS19QT1MgKiAyXSkKK3sKKyAgICBmb3IgKGludCBjX2lk eCA9IDE7IGNfaWR4IDwgVlZDX01BWF9TQU1QTEVfQVJSQVlTOyBjX2lkeCsrKSB7CisgICAgICAg IGNvbnN0IHB0cmRpZmZfdCBzdHJpZGUgPSBmYy0+ZnJhbWUtPmxpbmVzaXplW2NfaWR4XSAvIHNp emVvZihwaXhlbCk7CisKKyAgICAgICAgLy90b3AKKyAgICAgICAgY29uc3QgcGl4ZWwgKnNyYyA9 IChwaXhlbCopZmMtPmZyYW1lLT5kYXRhW2NfaWR4XSArIHggKyAoeSAtIDEpKiBzdHJpZGU7Cisg ICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY250W1RPUF07IGkrKykgeworICAgICAgICAgICAg c2VsW2NfaWR4XVtpXSA9IHNyY1twb3NbVE9QXVtpXV07CisgICAgICAgIH0KKworICAgICAgICAv L2xlZnQKKyAgICAgICAgc3JjID0gKHBpeGVsKilmYy0+ZnJhbWUtPmRhdGFbY19pZHhdICsgeCAt IDEgKyB5ICogc3RyaWRlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNudFtMRUZUXTsg aSsrKSB7CisgICAgICAgICAgICBzZWxbY19pZHhdW2kgKyBjbnRbVE9QXV0gPSBzcmNbcG9zW0xF RlRdW2ldICogc3RyaWRlXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5 c19pbmxpbmUgaW50IEZVTkMoY2NsbV9zZWxlY3Rfc2FtcGxlcykoY29uc3QgVlZDTG9jYWxDb250 ZXh0ICpsYywKKyAgICBjb25zdCBpbnQgeDAsIGNvbnN0IGludCB5MCwgY29uc3QgaW50IHcsIGNv bnN0IGludCBoLCBjb25zdCBpbnQgYXZhaWxfdCwgY29uc3QgaW50IGF2YWlsX2wsCisgICAgcGl4 ZWwgc2VsW11bTUFYX1BJQ0tfUE9TICogMl0pCit7CisgICAgY29uc3QgVlZDRnJhbWVDb250ZXh0 ICpmYyA9IGxjLT5mYzsKKyAgICBjb25zdCBWVkNTUFMgKnNwcyAgID0gZmMtPnBzLnNwczsKKyAg ICBjb25zdCBpbnQgeCAgPSB4MCA+PiBzcHMtPmhzaGlmdFsxXTsKKyAgICBjb25zdCBpbnQgeSAg PSB5MCA+PiBzcHMtPnZzaGlmdFsxXTsKKyAgICBpbnQgY250WzJdLCBwb3NbMl1bTUFYX1BJQ0tf UE9TXTsKKworICAgIGlmICghRlVOQyhjY2xtX2dldF9zZWxlY3RfcG9zKShsYywgeCwgeSwgdywg aCwgYXZhaWxfdCwgYXZhaWxfbCwgY250LCBwb3MpKQorICAgICAgICByZXR1cm4gMDsKKworICAg IEZVTkMoY2NsbV9zZWxlY3RfbHVtYSkoZmMsIHgwLCB5MCwgYXZhaWxfdCwgYXZhaWxfbCwgY250 LCBwb3MsIHNlbFtMVU1BXSk7CisgICAgRlVOQyhjY2xtX3NlbGVjdF9jaHJvbWEpKGZjLCB4LCB5 LCBjbnQsIHBvcywgc2VsKTsKKworICAgIGlmIChjbnRbVE9QXSArIGNudFtMRUZUXSA9PSAyKSB7 CisgICAgICAgIGZvciAoaW50IGNfaWR4ID0gMDsgY19pZHggPCBWVkNfTUFYX1NBTVBMRV9BUlJB WVM7IGNfaWR4KyspIHsKKyAgICAgICAgICAgIHNlbFtjX2lkeF1bM10gPSBzZWxbY19pZHhdWzBd OworICAgICAgICAgICAgc2VsW2NfaWR4XVsyXSA9IHNlbFtjX2lkeF1bMV07CisgICAgICAgICAg ICBzZWxbY19pZHhdWzBdID0gc2VsW2NfaWR4XVsxXTsKKyAgICAgICAgICAgIHNlbFtjX2lkeF1b MV0gPSBzZWxbY19pZHhdWzNdOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOworfQor CitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEZVTkMoY2NsbV9nZXRfbWluX21heCkoCisg ICAgY29uc3QgcGl4ZWwgc2VsW11bTUFYX1BJQ0tfUE9TICogMl0sIGludCAqbWluLCBpbnQgKm1h eCkKK3sKKyAgICBpbnQgbWluX2dycF9pZHhbXSA9IHsgMCwgMiB9OworICAgIGludCBtYXhfZ3Jw X2lkeFtdID0geyAxLCAzIH07CisKKyAgICBpZiAoc2VsW0xVTUFdW21pbl9ncnBfaWR4WzBdXSA+ IHNlbFtMVU1BXVttaW5fZ3JwX2lkeFsxXV0pCisgICAgICAgIEZGU1dBUChpbnQsIG1pbl9ncnBf aWR4WzBdLCBtaW5fZ3JwX2lkeFsxXSk7CisgICAgaWYgKHNlbFtMVU1BXVttYXhfZ3JwX2lkeFsw XV0gPiBzZWxbTFVNQV1bbWF4X2dycF9pZHhbMV1dKQorICAgICAgICBGRlNXQVAoaW50LCBtYXhf Z3JwX2lkeFswXSwgbWF4X2dycF9pZHhbMV0pOworICAgIGlmIChzZWxbTFVNQV1bbWluX2dycF9p ZHhbMF1dID4gc2VsW0xVTUFdW21heF9ncnBfaWR4WzFdXSkgeworICAgICAgICBGRlNXQVAoaW50 LCBtaW5fZ3JwX2lkeFswXSwgbWF4X2dycF9pZHhbMF0pOworICAgICAgICBGRlNXQVAoaW50LCBt aW5fZ3JwX2lkeFsxXSwgbWF4X2dycF9pZHhbMV0pOworICAgIH0KKyAgICBpZiAoc2VsW0xVTUFd W21pbl9ncnBfaWR4WzFdXSA+IHNlbFtMVU1BXVttYXhfZ3JwX2lkeFswXV0pCisgICAgICAgIEZG U1dBUChpbnQsIG1pbl9ncnBfaWR4WzFdLCBtYXhfZ3JwX2lkeFswXSk7CisgICAgZm9yIChpbnQg Y19pZHggPSAwOyBjX2lkeCA8IFZWQ19NQVhfU0FNUExFX0FSUkFZUzsgY19pZHgrKykgeworICAg ICAgICBtYXhbY19pZHhdID0gKHNlbFtjX2lkeF1bbWF4X2dycF9pZHhbMF1dICsgc2VsW2NfaWR4 XVttYXhfZ3JwX2lkeFsxXV0gKyAxKSA+PiAxOworICAgICAgICBtaW5bY19pZHhdID0gKHNlbFtj X2lkeF1bbWluX2dycF9pZHhbMF1dICsgc2VsW2NfaWR4XVttaW5fZ3JwX2lkeFsxXV0gKyAxKSA+ PiAxOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBGVU5DKGNjbG1f Z2V0X3BhcmFtcykoY29uc3QgVlZDTG9jYWxDb250ZXh0ICpsYywKKyAgICBjb25zdCBpbnQgeDAs IGNvbnN0IGludCB5MCwgY29uc3QgaW50IHcsIGNvbnN0IGludCBoLCBjb25zdCBpbnQgYXZhaWxf dCwgY29uc3QgaW50IGF2YWlsX2wsCisgICAgaW50ICphLCBpbnQgKmIsIGludCAqaykKK3sKKyAg ICBwaXhlbCBzZWxbVlZDX01BWF9TQU1QTEVfQVJSQVlTXVtNQVhfUElDS19QT1MgKiAyXTsKKyAg ICBpbnQgbWF4W1ZWQ19NQVhfU0FNUExFX0FSUkFZU10sIG1pbltWVkNfTUFYX1NBTVBMRV9BUlJB WVNdOworICAgIGludCBkaWZmOworCisgICAgaWYgKCFGVU5DKGNjbG1fc2VsZWN0X3NhbXBsZXMp KGxjLCB4MCwgeTAsIHcsIGgsIGF2YWlsX3QsIGF2YWlsX2wsIHNlbCkpIHsKKyAgICAgICAgRlVO QyhjY2xtX2dldF9wYXJhbXNfZGVmYXVsdCkoYSwgYiwgayk7CisgICAgICAgIHJldHVybjsKKyAg ICB9CisKKyAgICBGVU5DKGNjbG1fZ2V0X21pbl9tYXgpKHNlbCwgbWluLCBtYXgpOworCisgICAg ZGlmZiA9IG1heFtMVU1BXSAtIG1pbltMVU1BXTsKKyAgICBpZiAoZGlmZiA9PSAwKSB7CisgICAg ICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBhW2ldID0ga1tp XSA9IDA7CisgICAgICAgICAgICBiW2ldID0gbWluW2kgKyAxXTsKKyAgICAgICAgfQorICAgICAg ICByZXR1cm47CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAg ICAgIGNvbnN0IHN0YXRpYyBpbnQgZGl2X3NpZ190YWJsZVtdID0gezAsIDcsIDYsIDUsIDUsIDQs IDQsIDMsIDMsIDIsIDIsIDEsIDEsIDEsIDEsIDB9OworICAgICAgICBjb25zdCBpbnQgZGlmZmMg PSBtYXhbaSArIDFdIC0gbWluW2kgKyAxXTsKKyAgICAgICAgaW50ICB4ID0gYXZfbG9nMihkaWZm KTsKKyAgICAgICAgaW50ICB5LCB2LCBzaWduLCBhZGQ7CisgICAgICAgIGNvbnN0IGludCBub3Jt X2RpZmYgPSAoKGRpZmYgPDwgNCkgPj4geCkgJiAxNTsKKyAgICAgICAgeCArPSAobm9ybV9kaWZm KSA/IDEgOiAwOworICAgICAgICB5ID0gYWJzKGRpZmZjKSA+IDAgPyBhdl9sb2cyKGFicyhkaWZm YykpICsgMSA6IDA7CisgICAgICAgIHYgPSBkaXZfc2lnX3RhYmxlW25vcm1fZGlmZl0gfCA4Owor ICAgICAgICBhZGQgPSAoMSA8PCB5ID4+IDEpOworICAgICAgICBhW2ldID0gKGRpZmZjICogdiAr IGFkZCkgPj4geTsKKyAgICAgICAga1tpXSA9IEZGTUFYKDEsIDMgKyB4IC15KTsKKyAgICAgICAg c2lnbiA9IGFbaV0gPCAwID8gLTEgOiAoYVtpXSA+IDApOworICAgICAgICBhW2ldID0gKCgzICsg eCAtIHkpIDwgMSkgPyAgc2lnbiAqIDE1IDogYVtpXTsKKyAgICAgICAgYltpXSA9IG1pbltpICsg MV0gLSAoKGFbaV0gKiBtaW5bMF0pID4+IGtbaV0pOworICAgIH0KKworfQorCisjdW5kZWYgVE9Q CisjdW5kZWYgTEVGVAorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEZVTkMoY2NsbV9n ZXRfbHVtYV9yZWNfcGl4ZWxzKShjb25zdCBWVkNGcmFtZUNvbnRleHQgKmZjLAorICAgIGNvbnN0 IGludCB4MCwgY29uc3QgaW50IHkwLCBjb25zdCBpbnQgdywgY29uc3QgaW50IGgsIGNvbnN0IGlu dCBhdmFpbF90LCBjb25zdCBpbnQgYXZhaWxfbCwKKyAgICBwaXhlbCAqcGRzeSkKK3sKKyAgICBj b25zdCBpbnQgaHMgICAgICAgICAgICA9IGZjLT5wcy5zcHMtPmhzaGlmdFsxXTsKKyAgICBjb25z dCBpbnQgdnMgICAgICAgICAgICA9IGZjLT5wcy5zcHMtPnZzaGlmdFsxXTsKKyAgICBjb25zdCBw dHJkaWZmX3Qgc3RyaWRlICA9IGZjLT5mcmFtZS0+bGluZXNpemVbMF0gLyBzaXplb2YocGl4ZWwp OworICAgIGNvbnN0IHBpeGVsICpzb3VyY2UgICAgID0gKHBpeGVsKilmYy0+ZnJhbWUtPmRhdGFb MF0gKyB4MCArIHkwICogc3RyaWRlOworICAgIGNvbnN0IHBpeGVsICpsZWZ0ICAgICAgID0gc291 cmNlIC0gYXZhaWxfbDsKKyAgICBjb25zdCBwaXhlbCAqdG9wICAgICAgICA9IHNvdXJjZSAtIGF2 YWlsX3QgKiBzdHJpZGU7CisKKyAgICBjb25zdCBWVkNTUFMgKnNwcyA9IGZjLT5wcy5zcHM7Cisg ICAgaWYgKCFocyAmJiAhdnMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoOyBpKysp CisgICAgICAgICAgICBtZW1jcHkocGRzeSArIGkgKiB3LCBzb3VyY2UgKyBpICogc3RyaWRlLCB3 ICogc2l6ZW9mKHBpeGVsKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChpbnQg aSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgY29uc3QgcGl4ZWwgKnNyYyAgPSBzb3VyY2U7 CisgICAgICAgIGNvbnN0IHBpeGVsICpsID0gbGVmdDsKKyAgICAgICAgY29uc3QgcGl4ZWwgKnQg PSB0b3A7CisgICAgICAgIGlmICghdnMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBq IDwgdzsgaisrKSB7CisgICAgICAgICAgICAgICAgcGl4ZWwgcHJlZCAgPSAoKmwgKyAyICogUE9T KDAsIDApICsgUE9TKDEsIDApICsgMikgPj4gMjsKKyAgICAgICAgICAgICAgICBwZHN5W2kgKiB3 ICsgal0gPSBwcmVkOworICAgICAgICAgICAgICAgIHNyYyArPSAyOworICAgICAgICAgICAgICAg IGwgPSBzcmMgLSAxOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAg ICAgICBpZiAoc3BzLT5jaHJvbWFfdmVydGljYWxfY29sbG9jYXRlZF9mbGFnKSAgeworICAgICAg ICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdzsgaisrKSB7CisgICAgICAgICAgICAgICAg ICAgIHBpeGVsIHByZWQgID0gKCpsICsgKnQgKyA0ICogUE9TKDAsIDApICsgUE9TKDEsIDApICsg UE9TKDAsIDEpICsgNCkgPj4gMzsKKyAgICAgICAgICAgICAgICAgICAgcGRzeVtpICogdyArIGpd ID0gcHJlZDsKKyAgICAgICAgICAgICAgICAgICAgc3JjICs9IDI7CisgICAgICAgICAgICAgICAg ICAgIHQgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgbCA9IHNyYyAtIDE7CisgICAgICAgICAg ICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBq ID0gMDsgaiA8IHc7IGorKykgeworICAgICAgICAgICAgICAgICAgICBwaXhlbCBwcmVkICA9ICgq bCArICoobCArIHN0cmlkZSkgKyAyICogUE9TKDAsIDApICsgMiAqIFBPUygwLCAxKSArIFBPUygx LCAwKSArIFBPUygxLCAxKSArIDQpID4+IDM7CisKKyAgICAgICAgICAgICAgICAgICAgcGRzeVtp ICogdyArIGpdID0gcHJlZDsKKyAgICAgICAgICAgICAgICAgICAgc3JjICs9IDI7CisgICAgICAg ICAgICAgICAgICAgIGwgPSBzcmMgLSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg IH0KKyAgICAgICAgfQorICAgICAgICBzb3VyY2UgKz0gKHN0cmlkZSA8PCB2cyk7CisgICAgICAg IGxlZnQgICArPSAoc3RyaWRlIDw8IHZzKTsKKyAgICAgICAgdG9wICAgID0gc291cmNlIC0gc3Ry aWRlOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBGVU5DKGNjbG1f cHJlZF9kZWZhdWx0KShWVkNGcmFtZUNvbnRleHQgKmZjLAorICAgIGNvbnN0IGludCB4LCBjb25z dCBpbnQgeSwgY29uc3QgaW50IHcsIGNvbnN0IGludCBoLCBjb25zdCBpbnQgYXZhaWxfdCwgY29u c3QgaW50IGF2YWlsX2wpCit7CisgICAgZm9yIChpbnQgY19pZHggPSAxOyBjX2lkeCA8IFZWQ19N QVhfU0FNUExFX0FSUkFZUzsgY19pZHgrKykgeworICAgICAgICBjb25zdCBwdHJkaWZmX3Qgc3Ry aWRlID0gZmMtPmZyYW1lLT5saW5lc2l6ZVtjX2lkeF0gLyBzaXplb2YocGl4ZWwpOworICAgICAg ICBwaXhlbCAqZHN0ID0gKHBpeGVsKilmYy0+ZnJhbWUtPmRhdGFbY19pZHhdICsgeCArIHkgKiBz dHJpZGU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgICAg ICBmb3IgKGludCBqID0gMDsgaiA8IHc7IGorKykgeworICAgICAgICAgICAgICAgIGRzdFtqXSA9 IDEgPDwgKEJJVF9ERVBUSCAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0ICs9 IHN0cmlkZTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy84LjQuNS4yLjE0IFNwZWNpZmljYXRp b24gb2YgSU5UUkFfTFRfQ0NMTSwgSU5UUkFfTF9DQ0xNIGFuZCBJTlRSQV9UX0NDTE0gaW50cmEg cHJlZGljdGlvbiBtb2RlCitzdGF0aWMgdm9pZCBGVU5DKGludHJhX2NjbG1fcHJlZCkoY29uc3Qg VlZDTG9jYWxDb250ZXh0ICpsYywgY29uc3QgaW50IHgwLCBjb25zdCBpbnQgeTAsCisgICAgY29u c3QgaW50IHdpZHRoLCBjb25zdCBpbnQgaGVpZ2h0KQoreworICAgIFZWQ0ZyYW1lQ29udGV4dCAq ZmMgICAgID0gbGMtPmZjOworICAgIGNvbnN0IFZWQ1NQUyAqc3BzID0gZmMtPnBzLnNwczsKKyAg ICBjb25zdCBpbnQgYXZhaWxfdCA9IGZmX3Z2Y19nZXRfdG9wX2F2YWlsYWJsZShsYywgeDAsIHkw LCAxLCAwKTsKKyAgICBjb25zdCBpbnQgYXZhaWxfbCA9IGZmX3Z2Y19nZXRfbGVmdF9hdmFpbGFi bGUobGMsIHgwLCB5MCwgMSwgMCk7CisgICAgY29uc3QgaW50IGhzID0gc3BzLT5oc2hpZnRbMV07 CisgICAgY29uc3QgaW50IHZzID0gc3BzLT52c2hpZnRbMV07CisgICAgY29uc3QgaW50IHggID0g eDAgPj4gaHM7CisgICAgY29uc3QgaW50IHkgID0geTAgPj4gdnM7CisgICAgY29uc3QgaW50IHcg ID0gd2lkdGggPj4gaHM7CisgICAgY29uc3QgaW50IGggID0gaGVpZ2h0ID4+IHZzOworICAgIGlu dCBhWzJdLCBiWzJdLCBrWzJdOworCisgICAgcGl4ZWwgZHN5W01BWF9UQl9TSVpFICogTUFYX1RC X1NJWkVdOworICAgIGlmICghYXZhaWxfdCAmJiAhYXZhaWxfbCkgeworICAgICAgICBGVU5DKGNj bG1fcHJlZF9kZWZhdWx0KShmYywgeCwgeSwgdywgaCwgYXZhaWxfdCwgYXZhaWxfbCk7CisgICAg ICAgIHJldHVybjsKKyAgICB9CisgICAgRlVOQyhjY2xtX2dldF9sdW1hX3JlY19waXhlbHMpKGZj LCB4MCwgeTAsIHcsIGgsIGF2YWlsX3QsIGF2YWlsX2wsIGRzeSk7CisgICAgRlVOQyhjY2xtX2dl dF9wYXJhbXMpIChsYywgeDAsIHkwLCB3LCBoLCBhdmFpbF90LCBhdmFpbF9sLCBhLCBiLCBrKTsK KyAgICBGVU5DKGNjbG1fbGluZWFyX3ByZWQpKGZjLCB4MCwgeTAsIHcsIGgsIGRzeSwgYSwgYiwg ayk7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhsbWNzX3N1bV9zYW1wbGVzKShjb25zdCBwaXhlbCAq c3RhcnQsIHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IGludCBhdmFpbCwgY29uc3QgaW50IHRhcmdl dF9zaXplKQoreworICAgIGNvbnN0IGludCBzaXplID0gRkZNSU4oYXZhaWwsIHRhcmdldF9zaXpl KTsKKyAgICBpbnQgc3VtID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykg eworICAgICAgICBzdW0gKz0gKnN0YXJ0OworICAgICAgICBzdGFydCArPSBzdHJpZGU7CisgICAg fQorICAgIHN1bSArPSAqKHN0YXJ0IC0gc3RyaWRlKSAqICh0YXJnZXRfc2l6ZSAtIHNpemUpOwor ICAgIHJldHVybiBzdW07Cit9CisKKy8vIDguNy41LjMgUGljdHVyZSByZWNvbnN0cnVjdGlvbiB3 aXRoIGx1bWEgZGVwZW5kZW50IGNocm9tYSByZXNpZHVhbCBzY2FsaW5nIHByb2Nlc3MgZm9yIGNo cm9tYSBzYW1wbGVzCitzdGF0aWMgaW50IEZVTkMobG1jc19kZXJpdmVfY2hyb21hX3NjYWxlKShW VkNMb2NhbENvbnRleHQgKmxjLCBjb25zdCBpbnQgeDAsIGNvbnN0IGludCB5MCkKK3sKKyAgICBW VkNGcmFtZUNvbnRleHQgKmZjID0gbGMtPmZjOworICAgIGNvbnN0IFZWQ1BIICpwaCAgICAgPSBm Yy0+cHMucGg7CisgICAgY29uc3QgaW50IHNpemVfeSA9IEZGTUlOKGZjLT5wcy5zcHMtPmN0Yl9z aXplX3ksIDY0KTsKKworICAgIGNvbnN0IGludCB4ID0geDAgJiB+KHNpemVfeSAtIDEpOworICAg IGNvbnN0IGludCB5ID0geTAgJiB+KHNpemVfeSAtIDEpOworICAgIGlmIChsYy0+bG1jcy54X3Zw ZHUgIT0geCB8fCBsYy0+bG1jcy55X3ZwZHUgIT0geSkgeworICAgICAgICBpbnQgY250ID0gMCwg bHVtYSA9IDAsIGk7CisgICAgICAgIGNvbnN0IHBpeGVsICpzcmMgPSAoY29uc3QgcGl4ZWwgKiko ZmMtPmZyYW1lLT5kYXRhW0xVTUFdICsgeSAqIGZjLT5mcmFtZS0+bGluZXNpemVbTFVNQV0gKyAo eCA8PCBmYy0+cHMuc3BzLT5waXhlbF9zaGlmdCkpOworICAgICAgICBjb25zdCBwdHJkaWZmX3Qg c3RyaWRlID0gZmMtPmZyYW1lLT5saW5lc2l6ZVtMVU1BXSAvIHNpemVvZihwaXhlbCk7CisgICAg ICAgIGNvbnN0IGludCBhdmFpbF90ID0gZmZfdnZjX2dldF90b3BfYXZhaWxhYmxlIChsYywgeCwg eSwgMSwgMCk7CisgICAgICAgIGNvbnN0IGludCBhdmFpbF9sID0gZmZfdnZjX2dldF9sZWZ0X2F2 YWlsYWJsZShsYywgeCwgeSwgMSwgMCk7CisgICAgICAgIGlmIChhdmFpbF9sKSB7CisgICAgICAg ICAgICBsdW1hICs9IEZVTkMobG1jc19zdW1fc2FtcGxlcykoc3JjIC0gMSwgc3RyaWRlLCBmYy0+ cHMucHBzLT5oZWlnaHQgLSB5LCBzaXplX3kpOworICAgICAgICAgICAgY250ID0gc2l6ZV95Owor ICAgICAgICB9CisgICAgICAgIGlmIChhdmFpbF90KSB7CisgICAgICAgICAgICBsdW1hICs9IEZV TkMobG1jc19zdW1fc2FtcGxlcykoc3JjIC0gc3RyaWRlLCAxLCBmYy0+cHMucHBzLT53aWR0aCAt IHgsIHNpemVfeSk7CisgICAgICAgICAgICBjbnQgKz0gc2l6ZV95OworICAgICAgICB9CisgICAg ICAgIGlmIChjbnQpCisgICAgICAgICAgICBsdW1hID0gKGx1bWEgKyAoY250ID4+IDEpKSA+PiBh dl9sb2cyKGNudCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGx1bWEgPSAxIDw8IChCSVRf REVQVEggLSAxKTsKKworICAgICAgICBmb3IgKGkgPSBwaC0+bG1jc19taW5fYmluX2lkeDsgaSA8 PSBwaC0+bG1jc19tYXhfYmluX2lkeDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobHVtYSA8IHBo LT5sbWNzX3Bpdm90W2kgKyAxXSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor ICAgICAgICBpID0gRkZNSU4oaSwgTE1DU19NQVhfQklOX1NJWkUgLSAxKTsKKworICAgICAgICBs Yy0+bG1jcy5jaHJvbWFfc2NhbGUgPSBwaC0+bG1jc19jaHJvbWFfc2NhbGVfY29lZmZbaV07Cisg ICAgICAgIGxjLT5sbWNzLnhfdnBkdSA9IHg7CisgICAgICAgIGxjLT5sbWNzLnlfdnBkdSA9IHk7 CisgICAgfQorICAgIHJldHVybiBsYy0+bG1jcy5jaHJvbWFfc2NhbGU7Cit9CisKKy8vIDguNy41 LjMgUGljdHVyZSByZWNvbnN0cnVjdGlvbiB3aXRoIGx1bWEgZGVwZW5kZW50IGNocm9tYSByZXNp ZHVhbCBzY2FsaW5nIHByb2Nlc3MgZm9yIGNocm9tYSBzYW1wbGVzCitzdGF0aWMgdm9pZCBGVU5D KGxtY3Nfc2NhbGVfY2hyb21hKShWVkNMb2NhbENvbnRleHQgKmxjLCBpbnQgKmRzdCwgY29uc3Qg aW50ICpjb2VmZiwKKyAgICBjb25zdCBpbnQgd2lkdGgsIGNvbnN0IGludCBoZWlnaHQsIGNvbnN0 IGludCB4MF9jdSwgY29uc3QgaW50IHkwX2N1KQoreworICAgIGNvbnN0IGludCBjaHJvbWFfc2Nh bGUgPSBGVU5DKGxtY3NfZGVyaXZlX2Nocm9tYV9zY2FsZSkobGMsIHgwX2N1LCB5MF9jdSk7CisK KyAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoaW50 IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgY29uc3QgaW50IGMgPSBhdl9j bGlwX2ludHAyKCpjb2VmZiwgQklUX0RFUFRIKTsKKworICAgICAgICAgICAgaWYgKGMgPiAwKQor ICAgICAgICAgICAgICAgICpkc3QgPSAoYyAqIGNocm9tYV9zY2FsZSArICgxIDw8IDEwKSkgPj4g MTE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKmRzdCA9IC0oKC1jICogY2hy b21hX3NjYWxlICsgKDEgPDwgMTApKSA+PiAxMSk7CisgICAgICAgICAgICBjb2VmZisrOworICAg ICAgICAgICAgZHN0Kys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNf aW5saW5lIHZvaWQgRlVOQyhyZWZfZmlsdGVyKShjb25zdCBwaXhlbCAqbGVmdCwgY29uc3QgcGl4 ZWwgKnRvcCwKKyAgICBwaXhlbCAqZmlsdGVyZWRfbGVmdCwgcGl4ZWwgKmZpbHRlcmVkX3RvcCwg Y29uc3QgaW50IGxlZnRfc2l6ZSwgY29uc3QgaW50IHRvcF9zaXplLAorICAgIGNvbnN0IGludCB1 bmZpbHRlcl9sYXN0X29uZSkKK3sKKyAgICBmaWx0ZXJlZF9sZWZ0Wy0xXSA9IGZpbHRlcmVkX3Rv cFstMV0gPSAobGVmdFswXSArICAyICogbGVmdFstMV0gKyB0b3BbMF0gKyAyICkgPj4gMjsKKyAg ICBmb3IgKGludCBpID0gMDsgaSA8IGxlZnRfc2l6ZSAtIHVuZmlsdGVyX2xhc3Rfb25lOyBpKysp IHsKKyAgICAgICAgZmlsdGVyZWRfbGVmdFtpXSA9IChsZWZ0W2ktIDFdICsgMiAqIGxlZnRbaV0g KyBsZWZ0W2kgKyAxXSArIDIpID4+IDI7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwg dG9wX3NpemUgLSB1bmZpbHRlcl9sYXN0X29uZTsgaSsrKSB7CisgICAgICAgIGZpbHRlcmVkX3Rv cFtpXSA9ICh0b3BbaS0xXSArIDIgKiB0b3BbaV0gKyB0b3BbaSArIDFdICsgMikgPj4gMjsKKyAg ICB9CisgICAgaWYgKHVuZmlsdGVyX2xhc3Rfb25lKSB7CisgICAgICAgIGZpbHRlcmVkX3RvcFt0 b3Bfc2l6ZSAtIDFdID0gdG9wW3RvcF9zaXplIC0gMV07CisgICAgICAgIGZpbHRlcmVkX2xlZnRb bGVmdF9zaXplIC0gMV0gPSBsZWZ0W2xlZnRfc2l6ZSAtIDFdOworICAgIH0KK30KKworc3RhdGlj IGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBGVU5DKHByZXBhcmVfaW50cmFfZWRnZV9wYXJhbXMpKGNv bnN0IFZWQ0xvY2FsQ29udGV4dCAqbGMsCisgICAgSW50cmFFZGdlUGFyYW1zKiBlZGdlLCBjb25z dCBwaXhlbCAqc3JjLCBjb25zdCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgIGNvbnN0IGludCB4LCBp bnQgeSwgaW50IHcsIGludCBoLCBpbnQgY19pZHgsIGNvbnN0IGludCBpc19pbnRyYV9taXAsCisg ICAgY29uc3QgaW50IG1vZGUsIGNvbnN0IGludCByZWZfaWR4LCBjb25zdCBpbnQgbmVlZF9wZHBj KQoreworI2RlZmluZSBFWFRFTkQocHRyLCB2YWwsIGxlbikgICAgICAgICBcCitkbyB7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgKGxlbik7 IGkrKykgICAgICAgXAorICAgICAgICAqKHB0ciArIGkpID0gdmFsOyAgICAgICAgICAgICBcCit9 IHdoaWxlICgwKQorICAgIGNvbnN0IENvZGluZ1VuaXQgKmN1ID0gbGMtPmN1OworICAgIGNvbnN0 IGludCByZWZfZmlsdGVyX2ZsYWcgPSBpc19pbnRyYV9taXAgPyAwIDogZmZfdnZjX3JlZl9maWx0 ZXJfZmxhZ19kZXJpdmUobW9kZSk7CisgICAgY29uc3QgaW50IGZpbHRlcl9mbGFnID0gIXJlZl9p ZHggJiYgdyAqIGggPiAzMiAmJiAhY19pZHggJiYKKyAgICAgICAgY3UtPmlzcF9zcGxpdF90eXBl ID09IElTUF9OT19TUExJVCAmJiByZWZfZmlsdGVyX2ZsYWc7CisgICAgaW50IGNhbmRfdXBfbGVm dCAgICAgID0gbGMtPm5hLmNhbmRfdXBfbGVmdDsKKyAgICBwaXhlbCAgKmxlZnQgICAgICAgICAg PSAocGl4ZWwqKWVkZ2UtPmxlZnRfYXJyYXkgKyBNQVhfVEJfU0laRSArIDM7CisgICAgcGl4ZWwg ICp0b3AgICAgICAgICAgID0gKHBpeGVsKillZGdlLT50b3BfYXJyYXkgICsgTUFYX1RCX1NJWkUg KyAzOworICAgIHBpeGVsICAqZmlsdGVyZWRfbGVmdCA9IChwaXhlbCopZWRnZS0+ZmlsdGVyZWRf bGVmdF9hcnJheSArIE1BWF9UQl9TSVpFICsgMzsKKyAgICBwaXhlbCAgKmZpbHRlcmVkX3RvcCAg PSAocGl4ZWwqKWVkZ2UtPmZpbHRlcmVkX3RvcF9hcnJheSAgKyBNQVhfVEJfU0laRSArIDM7Cisg ICAgY29uc3QgaW50IHJlZl9saW5lID0gcmVmX2lkeCA9PSAzID8gLTQgOiAoLTEgLSByZWZfaWR4 KTsKKyAgICBpbnQgbGVmdF9zaXplLCB0b3Bfc2l6ZSwgdW5maWx0ZXJfbGVmdF9zaXplLCB1bmZp bHRlcl90b3Bfc2l6ZTsKKyAgICBpbnQgbGVmdF9hdmFpbGFibGUsIHRvcF9hdmFpbGFibGU7Cisg ICAgaW50IHJlZncsIHJlZmg7CisgICAgaW50IGludHJhX3ByZWRfYW5nbGUsIGludl9hbmdsZTsK KyAgICBpbnQgaTsKKworICAgIGlmIChpc19pbnRyYV9taXAgfHwgbW9kZSA9PSBJTlRSQV9QTEFO QVIpIHsKKyAgICAgICAgbGVmdF9zaXplID0gaCArIDE7CisgICAgICAgIHRvcF9zaXplICA9IHcg KyAxOworICAgICAgICB1bmZpbHRlcl9sZWZ0X3NpemUgPSBsZWZ0X3NpemUgKyBmaWx0ZXJfZmxh ZzsKKyAgICAgICAgdW5maWx0ZXJfdG9wX3NpemUgID0gdG9wX3NpemUgICsgZmlsdGVyX2ZsYWc7 CisgICAgfSBlbHNlIGlmIChtb2RlID09IElOVFJBX0RDKSB7CisgICAgICAgIHVuZmlsdGVyX2xl ZnRfc2l6ZSA9IGxlZnRfc2l6ZSA9IGg7CisgICAgICAgIHVuZmlsdGVyX3RvcF9zaXplID0gdG9w X3NpemUgID0gdzsKKyAgICB9IGVsc2UgaWYgKG1vZGUgPT0gSU5UUkFfVkVSVCkgeworICAgICAg ICAvL3dlIG1heSBuZWVkIDEgcGl4ZWwgdG8gcHJlZGljdCB0aGUgdG9wIGxlZnQuCisgICAgICAg IHVuZmlsdGVyX2xlZnRfc2l6ZSA9IGxlZnRfc2l6ZSA9IG5lZWRfcGRwYyA/IGggOiAxOworICAg ICAgICB1bmZpbHRlcl90b3Bfc2l6ZSA9IHRvcF9zaXplICA9IHc7CisgICAgfSBlbHNlIGlmICht b2RlID09IElOVFJBX0hPUlopIHsKKyAgICAgICAgdW5maWx0ZXJfbGVmdF9zaXplID0gbGVmdF9z aXplID0gaDsKKyAgICAgICAgLy9ldmVuIG5lZWRfcGRwYyA9PSAwLCB3ZSBtYXkgbmVlZCAxIHBp eGVsIHRvIHByZWRpY3QgdGhlIHRvcCBsZWZ0LgorICAgICAgICB1bmZpbHRlcl90b3Bfc2l6ZSA9 IHRvcF9zaXplID0gbmVlZF9wZHBjID8gdyA6IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYg KGN1LT5pc3Bfc3BsaXRfdHlwZSA9PSBJU1BfTk9fU1BMSVQgfHwgY19pZHgpIHsKKyAgICAgICAg ICAgIHJlZncgPSB3ICogMjsKKyAgICAgICAgICAgIHJlZmggPSBoICogMjsKKyAgICAgICAgfSBl bHNlIHsKKyAgICAgICAgICAgIHJlZncgPSBjdS0+Y2Jfd2lkdGggKyB3OworICAgICAgICAgICAg cmVmaCA9IGN1LT5jYl9oZWlnaHQgKyBoOworICAgICAgICB9CisgICAgICAgIGludHJhX3ByZWRf YW5nbGUgPSBmZl92dmNfaW50cmFfcHJlZF9hbmdsZV9kZXJpdmUobW9kZSk7CisgICAgICAgIGlu dl9hbmdsZSA9IGZmX3Z2Y19pbnRyYV9pbnZfYW5nbGVfZGVyaXZlKGludHJhX3ByZWRfYW5nbGUp OworICAgICAgICB1bmZpbHRlcl90b3Bfc2l6ZSA9IHRvcF9zaXplICA9IHJlZnc7CisgICAgICAg IHVuZmlsdGVyX2xlZnRfc2l6ZSA9IGxlZnRfc2l6ZSA9IHJlZmg7CisgICAgfQorCisgICAgbGVm dF9hdmFpbGFibGUgPSBmZl92dmNfZ2V0X2xlZnRfYXZhaWxhYmxlKGxjLCB4LCB5LCB1bmZpbHRl cl9sZWZ0X3NpemUsIGNfaWR4KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVmdF9hdmFpbGFibGU7 IGkrKykKKyAgICAgICAgbGVmdFtpXSA9IFBPUyhyZWZfbGluZSwgaSk7CisKKyAgICB0b3BfYXZh aWxhYmxlID0gZmZfdnZjX2dldF90b3BfYXZhaWxhYmxlKGxjLCB4LCB5LCB1bmZpbHRlcl90b3Bf c2l6ZSwgY19pZHgpOworICAgIG1lbWNweSh0b3AsIHNyYyArIHJlZl9saW5lICogc3RyaWRlLCB0 b3BfYXZhaWxhYmxlICogc2l6ZW9mKHBpeGVsKSk7CisKKyAgICBmb3IgKGludCBpID0gLTE7IGkg Pj0gcmVmX2xpbmU7IGktLSkgeworICAgICAgICBpZiAoY2FuZF91cF9sZWZ0KSB7CisgICAgICAg ICAgICBsZWZ0W2ldID0gUE9TKHJlZl9saW5lLCBpKTsKKyAgICAgICAgICAgIHRvcFtpXSAgPSBQ T1MoaSwgcmVmX2xpbmUpOworICAgICAgICB9IGVsc2UgaWYgKGxlZnRfYXZhaWxhYmxlKSB7Cisg ICAgICAgICAgICBsZWZ0W2ldID0gdG9wW2ldID0gbGVmdFswXTsKKyAgICAgICAgfSBlbHNlIGlm ICh0b3BfYXZhaWxhYmxlKSB7CisgICAgICAgICAgICBsZWZ0W2ldID0gdG9wW2ldID0gdG9wWzBd OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGVmdFtpXSA9IHRvcFtpXSA9IDEgPDwg KEJJVF9ERVBUSCAtIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgRVhURU5EKHRvcCArIHRv cF9hdmFpbGFibGUsIHRvcFt0b3BfYXZhaWxhYmxlLTFdLCB1bmZpbHRlcl90b3Bfc2l6ZSAtIHRv cF9hdmFpbGFibGUpOworICAgIEVYVEVORChsZWZ0ICsgbGVmdF9hdmFpbGFibGUsIGxlZnRbbGVm dF9hdmFpbGFibGUtMV0sIHVuZmlsdGVyX2xlZnRfc2l6ZSAtIGxlZnRfYXZhaWxhYmxlKTsKKwor ICAgIGlmIChyZWZfZmlsdGVyX2ZsYWcpIHsKKyAgICAgICAgaWYgKCFyZWZfaWR4ICYmIHcgKiBo ID4gMzIgJiYgIWNfaWR4ICYmIGN1LT5pc3Bfc3BsaXRfdHlwZSA9PSBJU1BfTk9fU1BMSVQgKSB7 CisgICAgICAgICAgICBjb25zdCBpbnQgdW5maWx0ZXJfbGFzdF9vbmUgPSBsZWZ0X3NpemUgPT0g dW5maWx0ZXJfbGVmdF9zaXplOworICAgICAgICAgICAgRlVOQyhyZWZfZmlsdGVyKShsZWZ0LCB0 b3AsIGZpbHRlcmVkX2xlZnQsIGZpbHRlcmVkX3RvcCwgdW5maWx0ZXJfbGVmdF9zaXplLCB1bmZp bHRlcl90b3Bfc2l6ZSwgdW5maWx0ZXJfbGFzdF9vbmUpOworICAgICAgICAgICAgbGVmdCA9IGZp bHRlcmVkX2xlZnQ7CisgICAgICAgICAgICB0b3AgID0gZmlsdGVyZWRfdG9wOworICAgICAgICB9 CisgICAgfQorICAgIGlmICghaXNfaW50cmFfbWlwICYmIG1vZGUgIT0gSU5UUkFfUExBTkFSICYm IG1vZGUgIT0gSU5UUkFfREMpIHsKKyAgICAgICAgaWYgKHJlZl9maWx0ZXJfZmxhZyB8fCByZWZf aWR4IHx8IGN1LT5pc3Bfc3BsaXRfdHlwZSAhPSBJU1BfTk9fU1BMSVQpIHsKKyAgICAgICAgICAg IGVkZ2UtPmZpbHRlcl9mbGFnID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNv bnN0IGludCBtaW5fZGlzdF92ZXJfaG9yID0gRkZNSU4oYWJzKG1vZGUgLSA1MCksIGFicyhtb2Rl IC0gMTgpKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBpbnRyYV9ob3JfdmVyX2Rpc3RfdGhyZXNb XSA9IHsyNCwgMTQsIDIsIDAsIDB9OworICAgICAgICAgICAgY29uc3QgaW50IG50YnMgPSAoYXZf bG9nMih3KSArIGF2X2xvZzIoaCkpID4+IDE7CisgICAgICAgICAgICBlZGdlLT5maWx0ZXJfZmxh ZyA9IG1pbl9kaXN0X3Zlcl9ob3IgPiBpbnRyYV9ob3JfdmVyX2Rpc3RfdGhyZXNbbnRicyAtIDJd OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1vZGUgIT0gSU5UUkFfVkVSVCAmJiBtb2RlICE9 IElOVFJBX0hPUlopIHsKKyAgICAgICAgICAgIGlmIChtb2RlID49IElOVFJBX0RJQUcpIHsKKyAg ICAgICAgICAgICAgICBpZiAoaW50cmFfcHJlZF9hbmdsZSA8IDApIHsKKyAgICAgICAgICAgICAg ICAgICAgcGl4ZWwgKnAgPSB0b3AgLSAocmVmX2lkeCArIDEpOworICAgICAgICAgICAgICAgICAg ICBmb3IgKGludCB4ID0gLWg7IHggPCAwOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAg IGNvbnN0IGludCBpZHggPSAtMSAtIHJlZl9pZHggKyBGRk1JTigoeCppbnZfYW5nbGUgKyAyNTYp ID4+IDksIGgpOworICAgICAgICAgICAgICAgICAgICAgICAgcFt4XSA9IGxlZnRbaWR4XTsKKyAg ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg ICAgICAgICAgIGZvciAoaW50IGkgPSByZWZ3OyBpIDw9IHJlZncgKyBGRk1BWCgxLCB3L2gpICog cmVmX2lkeCArIDE7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvcFtpXSA9IHRvcFty ZWZ3IC0gMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAg ICAgICAgICAgICBpZiAoaW50cmFfcHJlZF9hbmdsZSA8IDApIHsKKyAgICAgICAgICAgICAgICAg ICAgcGl4ZWwgKnAgPSBsZWZ0IC0gKHJlZl9pZHggKyAxKTsKKyAgICAgICAgICAgICAgICAgICAg Zm9yIChpbnQgeCA9IC13OyB4IDwgMDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBj b25zdCBpbnQgaWR4ID0gLTEgLSByZWZfaWR4ICsgRkZNSU4oKHgqaW52X2FuZ2xlICsgMjU2KSA+ PiA5LCB3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBbeF0gPSB0b3BbaWR4XTsKKyAgICAg ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAg ICAgICAgIGZvciAoaW50IGkgPSByZWZoOyBpIDw9IHJlZmggKyBGRk1BWCgxLCBoL3cpICogcmVm X2lkeCArIDE7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRbaV0gPSBsZWZ0W3Jl ZmggLSAxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAg ICB9CisgICAgZWRnZS0+bGVmdCA9ICh1aW50OF90KilsZWZ0OworICAgIGVkZ2UtPnRvcCAgPSAo dWludDhfdCopdG9wOworfQorCisvLzguNC4xIEdlbmVyYWwgZGVjb2RpbmcgcHJvY2VzcyBmb3Ig Y29kaW5nIHVuaXRzIGNvZGVkIGluIGludHJhIHByZWRpY3Rpb24gbW9kZQorc3RhdGljIHZvaWQg RlVOQyhpbnRyYV9wcmVkKShjb25zdCBWVkNMb2NhbENvbnRleHQgKmxjLCBpbnQgeDAsIGludCB5 MCwKKyAgICBjb25zdCBpbnQgd2lkdGgsIGNvbnN0IGludCBoZWlnaHQsIGludCBjX2lkeCkKK3sK KyAgICBWVkNGcmFtZUNvbnRleHQgKmZjICAgICA9IGxjLT5mYzsKKyAgICBjb25zdCBWVkNTUFMg KnNwcyA9IGZjLT5wcy5zcHM7CisgICAgY29uc3QgVlZDUFBTICpwcHMgPSBmYy0+cHMucHBzOwor ICAgIGNvbnN0IENvZGluZ1VuaXQgKmN1ID0gbGMtPmN1OworICAgIGNvbnN0IGludCBsb2cyX21p bl9jYl9zaXplICAgID0gc3BzLT5taW5fY2JfbG9nMl9zaXplX3k7CisgICAgY29uc3QgaW50IG1p bl9jYl93aWR0aCAgICAgICAgPSBwcHMtPm1pbl9jYl93aWR0aDsKKyAgICBjb25zdCBpbnQgeF9j YiAgICAgICAgICAgICAgICA9IHgwID4+IGxvZzJfbWluX2NiX3NpemU7CisgICAgY29uc3QgaW50 IHlfY2IgICAgICAgICAgICAgICAgPSB5MCA+PiBsb2cyX21pbl9jYl9zaXplOworCisgICAgY29u c3QgaW50IGhzaGlmdCA9IGZjLT5wcy5zcHMtPmhzaGlmdFtjX2lkeF07CisgICAgY29uc3QgaW50 IHZzaGlmdCA9IGZjLT5wcy5zcHMtPnZzaGlmdFtjX2lkeF07CisgICAgY29uc3QgaW50IHggPSB4 MCA+PiBoc2hpZnQ7CisgICAgY29uc3QgaW50IHkgPSB5MCA+PiB2c2hpZnQ7CisgICAgY29uc3Qg aW50IHcgPSB3aWR0aCA+PiBoc2hpZnQ7CisgICAgY29uc3QgaW50IGggPSBoZWlnaHQgPj4gdnNo aWZ0OworICAgIGNvbnN0IHB0cmRpZmZfdCBzdHJpZGUgPSBmYy0+ZnJhbWUtPmxpbmVzaXplW2Nf aWR4XSAvIHNpemVvZihwaXhlbCk7CisKKyAgICBjb25zdCBpbnQgcHJlZF9tb2RlID0gY19pZHgg PyBjdS0+aW50cmFfcHJlZF9tb2RlX2MgOiBjdS0+aW50cmFfcHJlZF9tb2RlX3k7CisgICAgY29u c3QgaW50IG1vZGUgPSBmZl92dmNfd2lkZV9hbmdsZV9tb2RlX21hcHBpbmcoY3UsIHcsIGgsIGNf aWR4LCBwcmVkX21vZGUpOworCisgICAgY29uc3QgaW50IGludHJhX21pcF9mbGFnICA9IFNBTVBM RV9DVEIoZmMtPnRhYi5pbWYsIHhfY2IsIHlfY2IpOworICAgIGNvbnN0IGludCBpc19pbnRyYV9t aXAgICAgPSBpbnRyYV9taXBfZmxhZyAmJiAoIWNfaWR4IHx8IGN1LT5taXBfY2hyb21hX2RpcmVj dF9mbGFnKTsKKyAgICBjb25zdCBpbnQgcmVmX2lkeCA9IGNfaWR4ID8gMCA6IGN1LT5pbnRyYV9s dW1hX3JlZl9pZHg7CisgICAgY29uc3QgaW50IG5lZWRfcGRwYyA9IGZmX3Z2Y19uZWVkX3BkcGMo dywgaCwgY3UtPmJkcGNtX2ZsYWdbY19pZHhdLCBtb2RlLCByZWZfaWR4KTsKKworCisgICAgcGl4 ZWwgKnNyYyA9IChwaXhlbCopZmMtPmZyYW1lLT5kYXRhW2NfaWR4XSArIHggKyB5ICogc3RyaWRl OworICAgIEludHJhRWRnZVBhcmFtcyBlZGdlOworCisgICAgRlVOQyhwcmVwYXJlX2ludHJhX2Vk Z2VfcGFyYW1zKShsYywgJmVkZ2UsIHNyYywgc3RyaWRlLCB4LCB5LCB3LCBoLCBjX2lkeCwgaXNf aW50cmFfbWlwLCBtb2RlLCByZWZfaWR4LCBuZWVkX3BkcGMpOworCisgICAgaWYgKGlzX2ludHJh X21pcCkgeworICAgICAgICBpbnQgaW50cmFfbWlwX3RyYW5zcG9zZWRfZmxhZyA9IFNBTVBMRV9D VEIoZmMtPnRhYi5pbXRmLCB4X2NiLCB5X2NiKTsKKyAgICAgICAgaW50IGludHJhX21pcF9tb2Rl ID0gU0FNUExFX0NUQihmYy0+dGFiLmltbSwgeF9jYiwgeV9jYik7CisKKyAgICAgICAgZmMtPnZ2 Y2RzcC5pbnRyYS5wcmVkX21pcCgodWludDhfdCAqKXNyYywgZWRnZS50b3AsIGVkZ2UubGVmdCwK KyAgICAgICAgICAgICAgICAgICAgICAgIHcsIGgsIHN0cmlkZSwgaW50cmFfbWlwX21vZGUsIGlu dHJhX21pcF90cmFuc3Bvc2VkX2ZsYWcpOworICAgIH0gZWxzZSBpZiAobW9kZSA9PSBJTlRSQV9Q TEFOQVIpIHsKKyAgICAgICAgZmMtPnZ2Y2RzcC5pbnRyYS5wcmVkX3BsYW5hcigodWludDhfdCAq KXNyYywgZWRnZS50b3AsIGVkZ2UubGVmdCwgdywgaCwgc3RyaWRlKTsKKyAgICB9IGVsc2UgaWYg KG1vZGUgPT0gSU5UUkFfREMpIHsKKyAgICAgICAgZmMtPnZ2Y2RzcC5pbnRyYS5wcmVkX2RjKCh1 aW50OF90ICopc3JjLCBlZGdlLnRvcCwgZWRnZS5sZWZ0LCB3LCBoLCBzdHJpZGUpOworICAgIH0g ZWxzZSBpZiAobW9kZSA9PSBJTlRSQV9WRVJUKSB7CisgICAgICAgIGZjLT52dmNkc3AuaW50cmEu cHJlZF92KCh1aW50OF90ICopc3JjLCBlZGdlLnRvcCwgdywgaCwgc3RyaWRlKTsKKyAgICB9IGVs c2UgaWYgKG1vZGUgPT0gSU5UUkFfSE9SWikgeworICAgICAgICBmYy0+dnZjZHNwLmludHJhLnBy ZWRfaCgodWludDhfdCAqKXNyYywgZWRnZS5sZWZ0LCB3LCBoLCBzdHJpZGUpOworICAgIH0gZWxz ZSB7CisgICAgICAgIGlmIChtb2RlID49IElOVFJBX0RJQUcpIHsKKyAgICAgICAgICAgIGZjLT52 dmNkc3AuaW50cmEucHJlZF9hbmd1bGFyX3YoKHVpbnQ4X3QgKilzcmMsIGVkZ2UudG9wLCBlZGdl LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywgaCwgc3RyaWRlLCBj X2lkeCwgbW9kZSwgcmVmX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBl ZGdlLmZpbHRlcl9mbGFnLCBuZWVkX3BkcGMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg ICAgZmMtPnZ2Y2RzcC5pbnRyYS5wcmVkX2FuZ3VsYXJfaCgodWludDhfdCAqKXNyYywgZWRnZS50 b3AsIGVkZ2UubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LCBoLCBz dHJpZGUsIGNfaWR4LCBtb2RlLCByZWZfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGVkZ2UuZmlsdGVyX2ZsYWcsIG5lZWRfcGRwYyk7CisgICAgICAgIH0KKyAgICB9Cisg ICAgaWYgKG5lZWRfcGRwYykgeworICAgICAgICAvLzguNC41LjIuMTUgUG9zaXRpb24tZGVwZW5k ZW50IGludHJhIHByZWRpY3Rpb24gc2FtcGxlIGZpbHRlcmluZyBwcm9jZXNzCisgICAgICAgIGlm ICghaXNfaW50cmFfbWlwICYmIChtb2RlID09IElOVFJBX1BMQU5BUiB8fCBtb2RlID09IElOVFJB X0RDIHx8CisgICAgICAgICAgICBtb2RlID09IElOVFJBX1ZFUlQgfHwgbW9kZSA9PSBJTlRSQV9I T1JaKSkgeworICAgICAgICAgICAgY29uc3QgaW50IHNjYWxlID0gKGF2X2xvZzIodykgKyBhdl9s b2cyKGgpIC0gMikgPj4gMjsKKyAgICAgICAgICAgIGNvbnN0IHBpeGVsICpsZWZ0ID0gKHBpeGVs KillZGdlLmxlZnQ7CisgICAgICAgICAgICBjb25zdCBwaXhlbCAqdG9wICA9IChwaXhlbCopZWRn ZS50b3A7CisgICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAg ICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICAgICAg ICAgIGludCBsLCB0LCB3bCwgd3QsIHByZWQ7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsIHZh bDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT0gSU5UUkFfUExBTkFSIHx8IG1vZGUg PT0gSU5UUkFfREMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGwgID0gbGVmdFt5XTsKKyAg ICAgICAgICAgICAgICAgICAgICAgIHQgPSB0b3BbeF07CisgICAgICAgICAgICAgICAgICAgICAg ICB3bCA9IDMyID4+IEZGTUlOKCh4IDw8IDEpID4+IHNjYWxlLCAzMSk7CisgICAgICAgICAgICAg ICAgICAgICAgICB3dCA9IDMyID4+IEZGTUlOKCh5IDw8IDEpID4+IHNjYWxlLCAzMSk7CisgICAg ICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsICA9IGxl ZnRbeV0gLSBsZWZ0Wy0xXSArIFBPUyh4LHkpOworICAgICAgICAgICAgICAgICAgICAgICAgdCA9 IHRvcFt4XSAtIHRvcFstMV0gKyBQT1MoeCx5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHds ID0gKG1vZGUgPT0gSU5UUkFfVkVSVCkgPyAgKDMyID4+IEZGTUlOKCh4IDw8IDEpID4+IHNjYWxl LCAzMSkpIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHd0ID0gKG1vZGUgPT0gSU5UUkFf SE9SWikgPyAgKDMyID4+IEZGTUlOKCh5IDw8IDEpID4+IHNjYWxlLCAzMSkpIDogMDsKKyAgICAg ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YWwgPSBQT1MoeCwgeSk7Cisg ICAgICAgICAgICAgICAgICAgIHByZWQgID0gdmFsICsgKCh3bCAqIChsIC0gdmFsKSArIHd0ICog KHQgLSB2YWwpICsgMzIpID4+IDYpOworICAgICAgICAgICAgICAgICAgICBQT1MoeCwgeSkgPSBD TElQKHByZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor ICAgIH0KK30KKworLy84LjQuNS4yLjExIFNwZWNpZmljYXRpb24gb2YgSU5UUkFfUExBTkFSIGlu dHJhIHByZWRpY3Rpb24gbW9kZQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBGVU5DKHBy ZWRfcGxhbmFyKSh1aW50OF90ICpfc3JjLCBjb25zdCB1aW50OF90ICpfdG9wLAorICAgIGNvbnN0 IHVpbnQ4X3QgKl9sZWZ0LCBjb25zdCBpbnQgdywgY29uc3QgaW50IGgsIGNvbnN0IHB0cmRpZmZf dCBzdHJpZGUpCit7CisgICAgaW50IHgsIHk7CisgICAgcGl4ZWwgKnNyYyAgICAgICAgPSAocGl4 ZWwgKilfc3JjOworICAgIGNvbnN0IHBpeGVsICp0b3AgID0gKGNvbnN0IHBpeGVsICopX3RvcDsK KyAgICBjb25zdCBwaXhlbCAqbGVmdCA9IChjb25zdCBwaXhlbCAqKV9sZWZ0OworICAgIGNvbnN0 IGludCBsb2d3ICA9IGF2X2xvZzIodyk7CisgICAgY29uc3QgaW50IGxvZ2ggID0gYXZfbG9nMiho KTsKKyAgICBjb25zdCBpbnQgc2l6ZSAgPSAgdyAqIGg7CisgICAgY29uc3QgaW50IHNoaWZ0ID0g KGxvZ3cgKyBsb2doICsgMSk7CisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAg ICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgcHJlZF92 ID0gKChoIC0gMSAtIHkpICogdG9wW3hdICArICh5ICsgMSkgKiBsZWZ0W2hdKSA8PCBsb2d3Owor ICAgICAgICAgICAgY29uc3QgaW50IHByZWRfaCA9ICgodyAtIDEgLSB4KSAqIGxlZnRbeV0gKyAo eCArIDEpICogdG9wW3ddKSA8PCBsb2doOworICAgICAgICAgICAgY29uc3QgaW50IHByZWQgPSAo cHJlZF92ICsgcHJlZF9oICsgc2l6ZSkgPj4gc2hpZnQ7CisgICAgICAgICAgICBQT1MoeCwgeSkg PSBwcmVkOworICAgICAgICB9CisgICAgfQorfQorCisvLzguNC41LjIuMyBNSVAgYm91bmRhcnkg c2FtcGxlIGRvd25zYW1wbGluZyBwcm9jZXNzCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lk IEZVTkMobWlwX2Rvd25zYW1wbGluZykoaW50ICpyZWR1Y2VkLCBjb25zdCBpbnQgYm91bmRhcnlf c2l6ZSwKKyAgICBjb25zdCBwaXhlbCAqcmVmLCBjb25zdCBpbnQgbl90Yl9zKQoreworICAgIGNv bnN0IGludCBiX2R3biA9IG5fdGJfcyAvIGJvdW5kYXJ5X3NpemU7CisgICAgY29uc3QgaW50IGxv ZzIgPSBhdl9sb2cyKGJfZHduKTsKKworICAgIGlmIChib3VuZGFyeV9zaXplID09IG5fdGJfcykg eworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5fdGJfczsgaSsrKQorICAgICAgICAgICAg cmVkdWNlZFtpXSA9IHJlZltpXTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGlu dCBpID0gMDsgaSA8IGJvdW5kYXJ5X3NpemU7IGkrKykgeworICAgICAgICBpbnQgcjsKKyAgICAg ICAgciA9ICpyZWYrKzsKKyAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBiX2R3bjsgaisrKQor ICAgICAgICAgICAgciArPSAqcmVmKys7CisgICAgICAgIHJlZHVjZWRbaV0gPSAociArICgxIDw8 IChsb2cyIC0gMSkpKSA+PiBsb2cyOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxp bmUgdm9pZCBGVU5DKG1pcF9yZWR1Y2VkX3ByZWQpKHBpeGVsICpzcmMsIGNvbnN0IHB0cmRpZmZf dCBzdHJpZGUsCisgICAgY29uc3QgaW50IHVwX2hvciwgY29uc3QgaW50IHVwX3ZlciwgY29uc3Qg aW50IHByZWRfc2l6ZSwgY29uc3QgaW50ICpyZWR1Y2VkLCBjb25zdCBpbnQgcmVkdWNlZF9zaXpl LAorICAgIGNvbnN0IGludCBvdywgY29uc3QgaW50IHRlbXAwLCBjb25zdCB1aW50OF90ICptYXRy aXgsIGludCBpc190cmFuc3Bvc2VkKQoreworICAgIHNyYyA9ICZQT1ModXBfaG9yIC0gMSwgdXBf dmVyIC0gMSk7CisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBwcmVkX3NpemU7IHkrKykgeworICAg ICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHByZWRfc2l6ZTsgeCsrKSB7CisgICAgICAgICAgICBp bnQgcHJlZCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZHVjZWRfc2l6 ZTsgaSsrKQorICAgICAgICAgICAgICAgIHByZWQgKz0gcmVkdWNlZFtpXSAqIG1hdHJpeFtpXTsK KyAgICAgICAgICAgIG1hdHJpeCArPSByZWR1Y2VkX3NpemU7CisgICAgICAgICAgICBwcmVkID0g KChwcmVkICsgb3cpID4+IDYpICsgdGVtcDA7CisgICAgICAgICAgICBwcmVkID0gYXZfY2xpcChw cmVkLCAwLCAoMTw8QklUX0RFUFRIKSAtIDEpOworICAgICAgICAgICAgaWYgKGlzX3RyYW5zcG9z ZWQpCisgICAgICAgICAgICAgICAgUE9TKHkgKiB1cF9ob3IsIHggKiB1cF92ZXIpID0gcHJlZDsK KyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQT1MoeCAqIHVwX2hvciwgeSAqIHVw X3ZlcikgPSBwcmVkOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lu bGluZSB2b2lkIEZVTkMobWlwX3Vwc2FtcGxpbmdfMWQpKHBpeGVsICpkc3QsIGNvbnN0IGludCBk c3Rfc3RlcCwgY29uc3QgaW50IGRzdF9zdHJpZGUsIGNvbnN0IGludCBkc3RfaGVpZ2h0LCBjb25z dCBpbnQgZmFjdG9yLAorICAgIGNvbnN0IHBpeGVsICpib3VuZGFyeSwgY29uc3QgaW50IGJvdW5k YXJ5X3N0ZXAsICBjb25zdCBpbnQgcHJlZF9zaXplKQoreworCisgICAgZm9yIChpbnQgaSA9IDA7 IGkgPCBkc3RfaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgY29uc3QgcGl4ZWwgKmJlZm9yZSA9IGJv dW5kYXJ5OworICAgICAgICBjb25zdCBwaXhlbCAqYWZ0ZXIgID0gZHN0IC0gZHN0X3N0ZXA7Cisg ICAgICAgIHBpeGVsICpkID0gZHN0OworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHByZWRf c2l6ZTsgaisrKSB7CisgICAgICAgICAgICBhZnRlciArPSBkc3Rfc3RlcCAqIGZhY3RvcjsKKyAg ICAgICAgICAgIGZvciAoaW50IGsgPSAxOyBrIDwgZmFjdG9yOyBrKyspIHsKKyAgICAgICAgICAg ICAgICBpbnQgbWlkID0gKGZhY3RvciAtIGspICogKCpiZWZvcmUpICsgayAqICgqYWZ0ZXIpOwor ICAgICAgICAgICAgICAgICpkID0gKG1pZCArIGZhY3RvciAvIDIpIC8gZmFjdG9yOworICAgICAg ICAgICAgICAgIGQgKz0gZHN0X3N0ZXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiZWZv cmUgPSBhZnRlcjsKKyAgICAgICAgICAgIGQgKz0gZHN0X3N0ZXA7CisgICAgICAgIH0KKyAgICAg ICAgYm91bmRhcnkgKz0gYm91bmRhcnlfc3RlcDsKKyAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7 CisgICAgfQorfQorCisvLzguNC41LjIuMiBNYXRyaXgtYmFzZWQgaW50cmEgc2FtcGxlIHByZWRp Y3Rpb24KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgRlVOQyhwcmVkX21pcCkodWludDhf dCAqX3NyYywgY29uc3QgdWludDhfdCAqX3RvcCwKKyAgICBjb25zdCB1aW50OF90ICpfbGVmdCwg Y29uc3QgaW50IHcsIGNvbnN0IGludCBoLCBjb25zdCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgIGlu dCBtb2RlX2lkLCBpbnQgaXNfdHJhbnNwb3NlZCkKK3sKKyAgICBwaXhlbCAqc3JjICAgICAgICA9 IChwaXhlbCAqKV9zcmM7CisgICAgY29uc3QgcGl4ZWwgKnRvcCAgPSAoY29uc3QgcGl4ZWwgKilf dG9wOworICAgIGNvbnN0IHBpeGVsICpsZWZ0ID0gKGNvbnN0IHBpeGVsICopX2xlZnQ7CisKKyAg ICBjb25zdCBpbnQgc2l6ZV9pZCA9IGZmX3Z2Y19nZXRfbWlwX3NpemVfaWQodywgaCk7CisgICAg c3RhdGljIGNvbnN0IGludCBib3VuZGFyeV9zaXplc1tdID0gezIsIDQsIDR9OworICAgIHN0YXRp YyBjb25zdCBpbnQgcHJlZF9zaXplc1tdID0gezQsIDQsIDh9OworICAgIGNvbnN0IGludCBib3Vu ZGFyeV9zaXplID0gYm91bmRhcnlfc2l6ZXNbc2l6ZV9pZF07CisgICAgY29uc3QgaW50IHByZWRf c2l6ZSAgICAgPSBwcmVkX3NpemVzW3NpemVfaWRdOworICAgIGNvbnN0IGludCBpbl9zaXplID0g MiAqIGJvdW5kYXJ5X3NpemUgLSAoKHNpemVfaWQgPT0gMikgPyAxIDogMCk7CisgICAgY29uc3Qg dWludDhfdCAqbWF0cml4ID0gZmZfdnZjX2dldF9taXBfbWF0cml4KHNpemVfaWQsIG1vZGVfaWQp OworICAgIGNvbnN0IGludCB1cF9ob3IgPSB3IC8gcHJlZF9zaXplOworICAgIGNvbnN0IGludCB1 cF92ZXIgPSBoIC8gcHJlZF9zaXplOworCisgICAgaW50IHJlZHVjZWRbMTZdOworICAgIGludCAq cmVkX3QgID0gcmVkdWNlZDsKKyAgICBpbnQgKnJlZF9sICA9IHJlZHVjZWQgKyBib3VuZGFyeV9z aXplOworICAgIGludCBvZmYgPSAxLCBvdyA9IDA7CisgICAgaW50IHRlbXAwOworCisgICAgaWYg KGlzX3RyYW5zcG9zZWQpIHsKKyAgICAgICAgRkZTV0FQKGludCosIHJlZF90LCByZWRfbCk7Cisg ICAgfQorICAgIEZVTkMobWlwX2Rvd25zYW1wbGluZykocmVkX3QsIGJvdW5kYXJ5X3NpemUsIHRv cCwgdyk7CisgICAgRlVOQyhtaXBfZG93bnNhbXBsaW5nKShyZWRfbCwgYm91bmRhcnlfc2l6ZSwg bGVmdCwgaCk7CisKKyAgICB0ZW1wMCA9IHJlZHVjZWRbMF07CisgICAgaWYgKHNpemVfaWQgIT0g MikgeworICAgICAgICBvZmYgPSAwOworICAgICAgICBvdyA9ICgxIDw8IChCSVRfREVQVEggLSAx KSkgLSB0ZW1wMDsKKyAgICB9IGVsc2UgeworICAgICAgICBvdyA9IHJlZHVjZWRbMV0gLSB0ZW1w MDsKKyAgICB9CisgICAgcmVkdWNlZFswXSA9IG93OworICAgIGZvciAoaW50IGkgPSAxOyBpIDwg aW5fc2l6ZTsgaSsrKSB7CisgICAgICAgIHJlZHVjZWRbaV0gPSByZWR1Y2VkW2kgKyBvZmZdIC0g dGVtcDA7CisgICAgICAgIG93ICs9IHJlZHVjZWRbaV07CisgICAgfQorICAgIG93ID0gMzIgLSAz MiAqIG93OworCisgICAgRlVOQyhtaXBfcmVkdWNlZF9wcmVkKShzcmMsIHN0cmlkZSwgdXBfaG9y LCB1cF92ZXIsIHByZWRfc2l6ZSwgcmVkdWNlZCwgaW5fc2l6ZSwgb3csIHRlbXAwLCBtYXRyaXgs IGlzX3RyYW5zcG9zZWQpOworICAgIGlmICh1cF9ob3IgPiAxIHx8IHVwX3ZlciA+IDEpIHsKKyAg ICAgICAgaWYgKHVwX2hvciA+IDEpCisgICAgICAgICAgICBGVU5DKG1pcF91cHNhbXBsaW5nXzFk KSgmUE9TKDAsIHVwX3ZlciAtIDEpLCAxLCB1cF92ZXIgKiBzdHJpZGUsIHByZWRfc2l6ZSwgdXBf aG9yLCBsZWZ0ICsgdXBfdmVyIC0gMSwgdXBfdmVyLCBwcmVkX3NpemUpOworICAgICAgICBpZiAo dXBfdmVyID4gMSkKKyAgICAgICAgICAgIEZVTkMobWlwX3Vwc2FtcGxpbmdfMWQpKHNyYywgc3Ry aWRlLCAxLCB3LCB1cF92ZXIsIHRvcCwgMSwgcHJlZF9zaXplKTsKKyAgICB9Cit9CisKK3N0YXRp YyBhdl9hbHdheXNfaW5saW5lIHBpeGVsIEZVTkMocHJlZF9kY192YWwpKGNvbnN0IHBpeGVsICp0 b3AsIGNvbnN0IHBpeGVsICpsZWZ0LAorICAgIGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCkKK3sK KyAgICBwaXhlbCBkY192YWw7CisgICAgaW50IHN1bSA9IDA7CisgICAgdW5zaWduZWQgaW50IG9m ZnNldCA9ICh3ID09IGgpID8gKHcgPDwgMSkgOiBGRk1BWCh3LCBoKTsKKyAgICBjb25zdCBpbnQg c2hpZnQgPSBhdl9sb2cyKG9mZnNldCk7CisgICAgb2Zmc2V0ID4+PSAxOworICAgIGlmICh3ID49 IGgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3OyBpKyspCisgICAgICAgICAgICBz dW0gKz0gdG9wW2ldOworICAgIH0KKyAgICBpZiAodyA8PSBoKSB7CisgICAgICAgIGZvciAoaW50 IGkgPSAwOyBpIDwgaDsgaSsrKQorICAgICAgICAgICAgc3VtICs9IGxlZnRbaV07CisgICAgfQor ICAgIGRjX3ZhbCA9IChzdW0gKyBvZmZzZXQpID4+IHNoaWZ0OworICAgIHJldHVybiBkY192YWw7 Cit9CisKKy8vOC40LjUuMi4xMiBTcGVjaWZpY2F0aW9uIG9mIElOVFJBX0RDIGludHJhIHByZWRp Y3Rpb24gbW9kZQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBGVU5DKHByZWRfZGMpKHVp bnQ4X3QgKl9zcmMsIGNvbnN0IHVpbnQ4X3QgKl90b3AsCisgICAgY29uc3QgdWludDhfdCAqX2xl ZnQsIGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCwgY29uc3QgcHRyZGlmZl90IHN0cmlkZSkKK3sK KyAgICBpbnQgeCwgeTsKKyAgICBwaXhlbCAqc3JjICAgICAgICAgID0gKHBpeGVsICopX3NyYzsK KyAgICBjb25zdCBwaXhlbCAqdG9wICAgID0gKGNvbnN0IHBpeGVsICopX3RvcDsKKyAgICBjb25z dCBwaXhlbCAqbGVmdCAgID0gKGNvbnN0IHBpeGVsICopX2xlZnQ7CisgICAgY29uc3QgcGl4ZWwg ZGMgICAgICA9IEZVTkMocHJlZF9kY192YWwpKHRvcCwgbGVmdCwgdywgaCk7CisgICAgY29uc3Qg cGl4ZWw0IGEgICAgICA9IFBJWEVMX1NQTEFUX1g0KGRjKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwg aDsgeSsrKSB7CisgICAgICAgIHBpeGVsICpzID0gc3JjOworICAgICAgICBmb3IgKHggPSAwOyB4 IDwgdzsgeCArPSA0KSB7CisgICAgICAgICAgICBBVl9XTjRQKHMsIGEpOworICAgICAgICAgICAg cyArPSA0OworICAgICAgICB9CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgfQorfQorCitz dGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEZVTkMocHJlZF92KSh1aW50OF90ICpfc3JjLCBj b25zdCB1aW50OF90ICpfdG9wLAorICAgIGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCwgY29uc3Qg cHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBwaXhlbCAqc3JjICAgICAgICAgID0gKHBpeGVsICop X3NyYzsKKyAgICBjb25zdCBwaXhlbCAqdG9wICAgID0gKGNvbnN0IHBpeGVsICopX3RvcDsKKyAg ICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBtZW1jcHkoc3JjLCB0b3As IHNpemVvZihwaXhlbCkgICogdyk7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgfQorfQor CitzdGF0aWMgdm9pZCBGVU5DKHByZWRfaCkodWludDhfdCAqX3NyYywgY29uc3QgdWludDhfdCAq X2xlZnQsIGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCwKKyAgICBjb25zdCBwdHJkaWZmX3Qgc3Ry aWRlKQoreworICAgIHBpeGVsICpzcmMgICAgICAgICAgPSAocGl4ZWwgKilfc3JjOworICAgIGNv bnN0IHBpeGVsICpsZWZ0ICAgID0gKGNvbnN0IHBpeGVsICopX2xlZnQ7CisgICAgZm9yIChpbnQg eSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgY29uc3QgcGl4ZWw0IGEgPSBQSVhFTF9TUExB VF9YNChsZWZ0W3ldKTsKKyAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4ICs9IDQpIHsK KyAgICAgICAgICAgIEFWX1dONFAoJlBPUyh4LCB5KSwgYSk7CisgICAgICAgIH0KKyAgICB9Cit9 CisKKy8vOC40LjUuMi4xMyBTcGVjaWZpY2F0aW9uIG9mIElOVFJBX0FOR1VMQVIyLi5JTlRSQV9B TkdVTEFSNjYgaW50cmEgcHJlZGljdGlvbiBtb2Rlcworc3RhdGljIHZvaWQgRlVOQyhwcmVkX2Fu Z3VsYXJfdikodWludDhfdCAqX3NyYywgY29uc3QgdWludDhfdCAqX3RvcCwgY29uc3QgdWludDhf dCAqX2xlZnQsCisgICAgY29uc3QgaW50IHcsIGNvbnN0IGludCBoLCBjb25zdCBwdHJkaWZmX3Qg c3RyaWRlLCBjb25zdCBpbnQgY19pZHgsIGNvbnN0IGludCBtb2RlLAorICAgIGNvbnN0IGludCBy ZWZfaWR4LCBjb25zdCBpbnQgZmlsdGVyX2ZsYWcsIGNvbnN0IGludCBuZWVkX3BkcGMpCit7Cisg ICAgcGl4ZWwgKnNyYyAgICAgICAgICA9IChwaXhlbCAqKV9zcmM7CisgICAgY29uc3QgcGl4ZWwg KmxlZnQgICA9IChjb25zdCBwaXhlbCAqKV9sZWZ0OworICAgIGNvbnN0IHBpeGVsICp0b3AgICAg PSAoY29uc3QgcGl4ZWwgKilfdG9wIC0gKDEgKyByZWZfaWR4KTsKKyAgICBjb25zdCBpbnQgaW50 cmFfcHJlZF9hbmdsZSA9IGZmX3Z2Y19pbnRyYV9wcmVkX2FuZ2xlX2Rlcml2ZShtb2RlKTsKKyAg ICBpbnQgcG9zID0gKDEgKyByZWZfaWR4KSAqIGludHJhX3ByZWRfYW5nbGU7CisgICAgY29uc3Qg aW50IGRwID0gaW50cmFfcHJlZF9hbmdsZTsKKyAgICBjb25zdCBpbnQgaXNfbHVtYSA9ICFjX2lk eDsKKyAgICBpbnQgbnNjYWxlLCBpbnZfYW5nbGU7CisKKyAgICBpZiAobmVlZF9wZHBjKSB7Cisg ICAgICAgIGludl9hbmdsZSA9IGZmX3Z2Y19pbnRyYV9pbnZfYW5nbGVfZGVyaXZlKGludHJhX3By ZWRfYW5nbGUpOworICAgICAgICBuc2NhbGUgPSBmZl92dmNfbnNjYWxlX2Rlcml2ZSh3LCBoLCBt b2RlKTsKKyAgICB9CisKKyAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAg ICBjb25zdCBpbnQgaWR4ICAgPSAocG9zID4+IDUpICsgcmVmX2lkeDsKKyAgICAgICAgY29uc3Qg aW50IGZhY3QgPSBwb3MgJiAzMTsKKyAgICAgICAgaWYgKCFmYWN0ICYmICghaXNfbHVtYSB8fCAh ZmlsdGVyX2ZsYWcpKSB7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykg eworICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsICpwID0gdG9wICsgeCArIGlkeCArIDE7Cisg ICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgcHJlZCA9IHBbMF07CisgICAgICAgICAgICAgICAg UE9TKHgsIHkpID0gcHJlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAg ICAgICAgIGlmICghY19pZHgpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QqIGYgPSBm aWx0ZXJfZmxhZyA/IGZmX3Z2Y19maWx0ZXJfZ1tmYWN0XSA6IGZmX3Z2Y19maWx0ZXJfY1tmYWN0 XTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAg ICAgICAgICAgICAgICBjb25zdCBwaXhlbCAqcCA9IHRvcCArIHggKyBpZHg7CisgICAgICAgICAg ICAgICAgICAgIGNvbnN0IGludCBwcmVkID0gKHBbMF0gKiBmWzBdICsgcFsxXSAqIGZbMV0gKwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBbMl0gKiBmWzJdICsgcFsz XSAqIGZbM10gKyAzMikgPj4gNjsKKyAgICAgICAgICAgICAgICAgICAgUE9TKHgsIHkpID0gYXZf Y2xpcF9waXhlbChwcmVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2Ug eworICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAg ICAgICAgICAgICAgIGNvbnN0IHBpeGVsICpwID0gdG9wICsgeCArIGlkeCArIDE7CisgICAgICAg ICAgICAgICAgICAgIGNvbnN0IHBpeGVsIHByZWQgPSAoKDMyIC0gZmFjdCkgKiBwWzBdICsgZmFj dCAqIHBbMV0gKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgUE9TKHgsIHkpID0gcHJl ZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAg aWYgKG5lZWRfcGRwYykgeworICAgICAgICAgICAgaW50IGludl9hbmdsZV9zdW0gPSAyNTYgKyBp bnZfYW5nbGU7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IEZGTUlOKHcsIDMgPDwg bnNjYWxlKTsgeCsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgbCAgID0gbGVmdFt5 ICsgKGludl9hbmdsZV9zdW0gPj4gOSldOworICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsIHZh bCA9IFBPUyh4LCB5KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgd2wgICAgPSAzMiA+PiAo KHggPDwgMSkgPj4gbnNjYWxlKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgcHJlZCAgPSB2 YWwgKyAoKChsIC0gdmFsKSAqIHdsICsgMzIpID4+IDYpOworICAgICAgICAgICAgICAgIFBPUyh4 LCB5KSA9IENMSVAocHJlZCk7CisgICAgICAgICAgICAgICAgaW52X2FuZ2xlX3N1bSArPSBpbnZf YW5nbGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcG9zICs9IGRwOworICAg IH0KK30KKworLy84LjQuNS4yLjEzIFNwZWNpZmljYXRpb24gb2YgSU5UUkFfQU5HVUxBUjIuLklO VFJBX0FOR1VMQVI2NiBpbnRyYSBwcmVkaWN0aW9uIG1vZGVzCitzdGF0aWMgdm9pZCBGVU5DKHBy ZWRfYW5ndWxhcl9oKSh1aW50OF90ICpfc3JjLCBjb25zdCB1aW50OF90ICpfdG9wLCBjb25zdCB1 aW50OF90ICpfbGVmdCwKKyAgICBjb25zdCBpbnQgdywgY29uc3QgaW50IGgsIGNvbnN0IHB0cmRp ZmZfdCBzdHJpZGUsIGNvbnN0IGludCBjX2lkeCwgY29uc3QgaW50IG1vZGUsCisgICAgY29uc3Qg aW50IHJlZl9pZHgsIGNvbnN0IGludCBmaWx0ZXJfZmxhZywgY29uc3QgaW50IG5lZWRfcGRwYykK K3sKKyAgICBwaXhlbCAqc3JjICAgICAgICAgID0gKHBpeGVsICopX3NyYzsKKyAgICBjb25zdCBw aXhlbCAqbGVmdCAgID0gKGNvbnN0IHBpeGVsICopX2xlZnQgLSAoMSArIHJlZl9pZHgpOworICAg IGNvbnN0IHBpeGVsICp0b3AgICAgPSAoY29uc3QgcGl4ZWwgKilfdG9wOworICAgIGNvbnN0IGlu dCBpc19sdW1hID0gIWNfaWR4OworICAgIGNvbnN0IGludCBpbnRyYV9wcmVkX2FuZ2xlID0gZmZf dnZjX2ludHJhX3ByZWRfYW5nbGVfZGVyaXZlKG1vZGUpOworICAgIGNvbnN0IGludCBkcCA9IGlu dHJhX3ByZWRfYW5nbGU7CisgICAgaW50IG5zY2FsZSA9IDAsIGludl9hbmdsZSwgaW52X2FuZ2xl X3N1bTsKKworICAgIGlmIChuZWVkX3BkcGMpIHsKKyAgICAgICAgaW52X2FuZ2xlID0gZmZfdnZj X2ludHJhX2ludl9hbmdsZV9kZXJpdmUoaW50cmFfcHJlZF9hbmdsZSk7CisgICAgICAgIGludl9h bmdsZV9zdW0gPSAyNTYgKyBpbnZfYW5nbGU7CisgICAgICAgIG5zY2FsZSA9IGZmX3Z2Y19uc2Nh bGVfZGVyaXZlKHcsIGgsIG1vZGUpOworICAgIH0KKworICAgIGZvciAoaW50IHkgPSAwOyB5IDwg aDsgeSsrKSB7CisgICAgICAgIGludCBwb3MgPSAoMSArIHJlZl9pZHgpICogaW50cmFfcHJlZF9h bmdsZTsKKyAgICAgICAgaW50IHd0OworICAgICAgICBpZiAobmVlZF9wZHBjKQorICAgICAgICAg ICAgd3QgPSAoMzIgPj4gKCh5ICogMikgPj4gbnNjYWxlKSk7CisKKyAgICAgICAgZm9yIChpbnQg eCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBpZHggID0gKHBvcyA+ PiA1KSArIHJlZl9pZHg7CisgICAgICAgICAgICBjb25zdCBpbnQgZmFjdCA9IHBvcyAmIDMxOwor ICAgICAgICAgICAgY29uc3QgcGl4ZWwgKnAgPSBsZWZ0ICsgeSArIGlkeDsKKyAgICAgICAgICAg IGludCBwcmVkOworICAgICAgICAgICAgaWYgKCFmYWN0ICYmICghaXNfbHVtYSB8fCAhZmlsdGVy X2ZsYWcpKSB7CisgICAgICAgICAgICAgICAgcHJlZCA9IHBbMV07CisgICAgICAgICAgICB9IGVs c2UgeworICAgICAgICAgICAgICAgIGlmICghY19pZHgpIHsKKyAgICAgICAgICAgICAgICAgICAg Y29uc3QgaW50OF90KiBmID0gZmlsdGVyX2ZsYWcgPyBmZl92dmNfZmlsdGVyX2dbZmFjdF0gOiBm Zl92dmNfZmlsdGVyX2NbZmFjdF0gOworICAgICAgICAgICAgICAgICAgICBwcmVkID0gKHBbMF0g KiBmWzBdICsgcFsxXSAqIGZbMV0gKyBwWzJdICogZlsyXSArIHBbM10gKiBmWzNdICsgMzIpID4+ IDY7CisgICAgICAgICAgICAgICAgICAgIHByZWQgPSBDTElQKHByZWQpOworICAgICAgICAgICAg ICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByZWQgPSAoKDMyIC0gZmFjdCkgKiBw WzFdICsgZmFjdCAqIHBbMl0gKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg ICAgICB9CisgICAgICAgICAgICBpZiAobmVlZF9wZHBjKSB7CisgICAgICAgICAgICAgICAgaWYg KHkgPCAoMyA8PCBuc2NhbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsIHQg PSB0b3BbeCArIChpbnZfYW5nbGVfc3VtID4+IDkpXTsKKyAgICAgICAgICAgICAgICAgICAgcHJl ZCA9IENMSVAocHJlZCArICgoKHQgLSBwcmVkKSAqIHd0ICsgMzIpID4+IDYpKTsKKyAgICAgICAg ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQT1MoeCwgeSkgPSBwcmVkOwor ICAgICAgICAgICAgcG9zICs9IGRwOworICAgICAgICB9CisgICAgICAgIGlmIChuZWVkX3BkcGMp CisgICAgICAgICAgICBpbnZfYW5nbGVfc3VtICs9IGludl9hbmdsZTsKKyAgICB9Cit9CisKK3N0 YXRpYyB2b2lkIEZVTkMoZmZfdnZjX2ludHJhX2RzcF9pbml0KShWVkNJbnRyYURTUENvbnRleHQg KmNvbnN0IGludHJhKQoreworICAgIGludHJhLT5sbWNzX3NjYWxlX2Nocm9tYSAgPSBGVU5DKGxt Y3Nfc2NhbGVfY2hyb21hKTsKKyAgICBpbnRyYS0+aW50cmFfY2NsbV9wcmVkICAgID0gRlVOQyhp bnRyYV9jY2xtX3ByZWQpOworICAgIGludHJhLT5pbnRyYV9wcmVkICAgICAgICAgPSBGVU5DKGlu dHJhX3ByZWQpOworICAgIGludHJhLT5wcmVkX3BsYW5hciAgICAgICAgPSBGVU5DKHByZWRfcGxh bmFyKTsKKyAgICBpbnRyYS0+cHJlZF9taXAgICAgICAgICAgID0gRlVOQyhwcmVkX21pcCk7Cisg ICAgaW50cmEtPnByZWRfZGMgICAgICAgICAgICA9IEZVTkMocHJlZF9kYyk7CisgICAgaW50cmEt PnByZWRfdiAgICAgICAgICAgICA9IEZVTkMocHJlZF92KTsKKyAgICBpbnRyYS0+cHJlZF9oICAg ICAgICAgICAgID0gRlVOQyhwcmVkX2gpOworICAgIGludHJhLT5wcmVkX2FuZ3VsYXJfdiAgICAg PSBGVU5DKHByZWRfYW5ndWxhcl92KTsKKyAgICBpbnRyYS0+cHJlZF9hbmd1bGFyX2ggICAgID0g RlVOQyhwcmVkX2FuZ3VsYXJfaCk7Cit9Ci0tIAoyLjI1LjEKCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCmZmbXBlZy1kZXZlbCBtYWlsaW5nIGxpc3QKZmZt cGVnLWRldmVsQGZmbXBlZy5vcmcKaHR0cHM6Ly9mZm1wZWcub3JnL21haWxtYW4vbGlzdGluZm8v ZmZtcGVnLWRldmVsCgpUbyB1bnN1YnNjcmliZSwgdmlzaXQgbGluayBhYm92ZSwgb3IgZW1haWwK ZmZtcGVnLWRldmVsLXJlcXVlc3RAZmZtcGVnLm9yZyB3aXRoIHN1YmplY3QgInVuc3Vic2NyaWJl Ii4K