From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A791DC433F5 for ; Wed, 4 May 2022 00:18:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244561AbiEDAWY (ORCPT ); Tue, 3 May 2022 20:22:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55140 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244566AbiEDAWW (ORCPT ); Tue, 3 May 2022 20:22:22 -0400 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2BE244338C for ; Tue, 3 May 2022 17:18:45 -0700 (PDT) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-2f4dee8688cso31637b3.16 for ; Tue, 03 May 2022 17:18:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc:content-transfer-encoding; bh=3ystt2sBKsPANJIeRlt5KsQj0jKBfsi5eq5UWIBZAUE=; b=h4oP+MzhDFBME5weR8X5Y1WwKDZDW0hqhD+fD2GD63KNq2qZ/MxGXuI5315eARGDCW RkFROGzBygdq0moCSfxvsxdM1TSG4cG37Bn1bJXSuvUBbOqzYAvEz382nFHwbK0lcEx8 rzeyzptDv7RFwQpu5+14yOPZd03Sgb9BikM5ex6LFvJMACw0LyyHJL/VpG1gw4dmPqFn fnr815jSVTYHG641dvqX2MSx8LNpG2/F98aZoQE2qFb3KJZvJ0YCY3cAkfheASb7qZ0G jW0Nq52RGNXEGTeLEOogARTzNtVmI6cJF3Dr+0Cwm2BtIY2GRePmUiZxNDxC2U0IZoKh Z5PA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc:content-transfer-encoding; bh=3ystt2sBKsPANJIeRlt5KsQj0jKBfsi5eq5UWIBZAUE=; b=6vntUDVoqQJY5t7+9U1JpuiEO8+Qy9aELXZKs2Lqlt4AmV2SPPzvmaAIqBPXwpHmgA c8uhz/LeLYdIGmk+onMoxfymaG8vkqKejy0mdGPlz6rHBTe7Ztgh96FQ6Y1Og4SUj83R nKjvJKZ6Y557a3tXGfJkUoHpJiWbikVOiz3fm3ExHC7u0pmDn8FDeyPuLGwNYmv5Rlr4 ZXBoSiJOULa8Ss1tAWPyJNAzZFkgI4IJglQwlkoHYN4k/Xo0HdL1PYAGpSw+nyM9i7Dx BRkDyUGv5ho/MnhfknX6AN8cEdWU+XA4YD6p/ExUzXWBvW9fjfSwHG8tvzNN6Hde0Z/5 p3vg== X-Gm-Message-State: AOAM5338sG+EELaHyqZXcb2iNUyfTQi8tQ/vp/XGVDqf+IULqBH2RrlP VePW/wKzzQi+XrCAZrP82Ov1NIdLRYy+/ese/3I1Y0yCEjw21XKASSSaozSzwFptyUAXNz889ze QXGH1KxsbbHPx5M8VkXOgI8Ey+CELYWWaZxRxDA6BY6Bm9BqYzT9foh6sxSTrvXURu4k= X-Google-Smtp-Source: ABdhPJzzt0oWK+oOzYapTrfkx0Rysra+IMiORo5BmIHzqEFzviQ+r9SQoKFR9mmwMvMGeZKNoUaXm4mnEg== X-Received: from nhuck.c.googlers.com ([fda3:e722:ac3:cc00:14:4d90:c0a8:39cc]) (user=nhuck job=sendgmr) by 2002:a25:d90c:0:b0:648:dbec:5391 with SMTP id q12-20020a25d90c000000b00648dbec5391mr17143606ybg.309.1651623524254; Tue, 03 May 2022 17:18:44 -0700 (PDT) Date: Wed, 4 May 2022 00:18:17 +0000 In-Reply-To: <20220504001823.2483834-1-nhuck@google.com> Message-Id: <20220504001823.2483834-4-nhuck@google.com> Mime-Version: 1.0 References: <20220504001823.2483834-1-nhuck@google.com> X-Mailer: git-send-email 2.36.0.464.gb9c8b46e94-goog Subject: [PATCH v6 3/9] crypto: hctr2 - Add HCTR2 support From: Nathan Huckleberry To: linux-crypto@vger.kernel.org Cc: linux-fscrypt@vger.kernel.org, Herbert Xu , "David S. Miller" , linux-arm-kernel@lists.infradead.org, Paul Crowley , Eric Biggers , Sami Tolvanen , Ard Biesheuvel , Nathan Huckleberry , Eric Biggers Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org Add support for HCTR2 as a template. HCTR2 is a length-preserving encryption mode that is efficient on processors with instructions to accelerate AES and carryless multiplication, e.g. x86 processors with AES-NI and CLMUL, and ARM processors with the ARMv8 Crypto Extensions. As a length-preserving encryption mode, HCTR2 is suitable for applications such as storage encryption where ciphertext expansion is not possible, and thus authenticated encryption cannot be used. Currently, such applications usually use XTS, or in some cases Adiantum. XTS has the disadvantage that it is a narrow-block mode: a bitflip will only change 16 bytes in the resulting ciphertext or plaintext. This reveals more information to an attacker than necessary. HCTR2 is a wide-block mode, so it provides a stronger security property: a bitflip will change the entire message. HCTR2 is somewhat similar to Adiantum, which is also a wide-block mode. However, HCTR2 is designed to take advantage of existing crypto instructions, while Adiantum targets devices without such hardware support. Adiantum is also designed with longer messages in mind, while HCTR2 is designed to be efficient even on short messages. HCTR2 requires POLYVAL and XCTR as components. More information on HCTR2 can be found here: "Length-preserving encryption with HCTR2": https://eprint.iacr.org/2021/1441.pdf Signed-off-by: Nathan Huckleberry Reviewed-by: Ard Biesheuvel Reviewed-by: Eric Biggers --- crypto/Kconfig | 11 + crypto/Makefile | 1 + crypto/hctr2.c | 581 ++++++++++++++++++++++++++++++++++++++++ crypto/tcrypt.c | 5 + crypto/testmgr.c | 8 + crypto/testmgr.h | 672 +++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 1278 insertions(+) create mode 100644 crypto/hctr2.c diff --git a/crypto/Kconfig b/crypto/Kconfig index 00139845d76d..0dedba74db4a 100644 --- a/crypto/Kconfig +++ b/crypto/Kconfig @@ -532,6 +532,17 @@ config CRYPTO_ADIANTUM =20 If unsure, say N. =20 +config CRYPTO_HCTR2 + tristate "HCTR2 support" + select CRYPTO_XCTR + select CRYPTO_POLYVAL + select CRYPTO_MANAGER + help + HCTR2 is a length-preserving encryption mode for storage encryption tha= t + is efficient on processors with instructions to accelerate AES and + carryless multiplication, e.g. x86 processors with AES-NI and CLMUL, an= d + ARM processors with the ARMv8 crypto extensions. + config CRYPTO_ESSIV tristate "ESSIV support for block encryption" select CRYPTO_AUTHENC diff --git a/crypto/Makefile b/crypto/Makefile index 561f901a91d4..2dca9dbdede6 100644 --- a/crypto/Makefile +++ b/crypto/Makefile @@ -94,6 +94,7 @@ obj-$(CONFIG_CRYPTO_LRW) +=3D lrw.o obj-$(CONFIG_CRYPTO_XTS) +=3D xts.o obj-$(CONFIG_CRYPTO_CTR) +=3D ctr.o obj-$(CONFIG_CRYPTO_XCTR) +=3D xctr.o +obj-$(CONFIG_CRYPTO_HCTR2) +=3D hctr2.o obj-$(CONFIG_CRYPTO_KEYWRAP) +=3D keywrap.o obj-$(CONFIG_CRYPTO_ADIANTUM) +=3D adiantum.o obj-$(CONFIG_CRYPTO_NHPOLY1305) +=3D nhpoly1305.o diff --git a/crypto/hctr2.c b/crypto/hctr2.c new file mode 100644 index 000000000000..7d00a3bcb667 --- /dev/null +++ b/crypto/hctr2.c @@ -0,0 +1,581 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * HCTR2 length-preserving encryption mode + * + * Copyright 2021 Google LLC + */ + + +/* + * HCTR2 is a length-preserving encryption mode that is efficient on + * processors with instructions to accelerate AES and carryless + * multiplication, e.g. x86 processors with AES-NI and CLMUL, and ARM + * processors with the ARMv8 crypto extensions. + * + * For more details, see the paper: "Length-preserving encryption with HCT= R2" + * (https://eprint.iacr.org/2021/1441.pdf) + */ + +#include +#include +#include +#include +#include +#include + +#define BLOCKCIPHER_BLOCK_SIZE 16 + +/* + * The specification allows variable-length tweaks, but Linux's crypto API + * currently only allows algorithms to support a single length. The "natu= ral" + * tweak length for HCTR2 is 16, since that fits into one POLYVAL block fo= r + * the best performance. But longer tweaks are useful for fscrypt, to avo= id + * needing to derive per-file keys. So instead we use two blocks, or 32 b= ytes. + */ +#define TWEAK_SIZE 32 + +struct hctr2_instance_ctx { + struct crypto_cipher_spawn blockcipher_spawn; + struct crypto_skcipher_spawn xctr_spawn; + struct crypto_shash_spawn polyval_spawn; +}; + +struct hctr2_tfm_ctx { + struct crypto_cipher *blockcipher; + struct crypto_skcipher *xctr; + struct crypto_shash *polyval; + u8 L[BLOCKCIPHER_BLOCK_SIZE]; + int hashed_tweak_offset; + /* + * This struct is allocated with extra space for two exported hash + * states. Since the hash state size is not known at compile-time, we + * can't add these to the struct directly. + * + * hashed_tweaklen_divisible; + * hashed_tweaklen_remainder; + */ +}; + +struct hctr2_request_ctx { + u8 first_block[BLOCKCIPHER_BLOCK_SIZE]; + u8 xctr_iv[BLOCKCIPHER_BLOCK_SIZE]; + struct scatterlist *bulk_part_dst; + struct scatterlist *bulk_part_src; + struct scatterlist sg_src[2]; + struct scatterlist sg_dst[2]; + /* + * Sub-request sizes are unknown at compile-time, so they need to go + * after the members with known sizes. + */ + union { + struct shash_desc hash_desc; + struct skcipher_request xctr_req; + } u; + /* + * This struct is allocated with extra space for one exported hash + * state. Since the hash state size is not known at compile-time, we + * can't add it to the struct directly. + * + * hashed_tweak; + */ +}; + +static inline u8 *hctr2_hashed_tweaklen(const struct hctr2_tfm_ctx *tctx, + bool has_remainder) +{ + u8 *p =3D (u8 *)tctx + sizeof(*tctx); + + if (has_remainder) /* For messages not a multiple of block length */ + p +=3D crypto_shash_statesize(tctx->polyval); + return p; +} + +static inline u8 *hctr2_hashed_tweak(const struct hctr2_tfm_ctx *tctx, + struct hctr2_request_ctx *rctx) +{ + return (u8 *)rctx + tctx->hashed_tweak_offset; +} + +/* + * The input data for each HCTR2 hash step begins with a 16-byte block tha= t + * contains the tweak length and a flag that indicates whether the input i= s evenly + * divisible into blocks. Since this implementation only supports one twe= ak + * length, we precompute the two hash states resulting from hashing the tw= o + * possible values of this initial block. This reduces by one block the a= mount of + * data that needs to be hashed for each encryption/decryption + * + * These precomputed hashes are stored in hctr2_tfm_ctx. + */ +static int hctr2_hash_tweaklen(struct hctr2_tfm_ctx *tctx, bool has_remain= der) +{ + SHASH_DESC_ON_STACK(shash, tfm->polyval); + __le64 tweak_length_block[2]; + int err; + + shash->tfm =3D tctx->polyval; + memset(tweak_length_block, 0, sizeof(tweak_length_block)); + + tweak_length_block[0] =3D cpu_to_le64(TWEAK_SIZE * 8 * 2 + 2 + has_remain= der); + err =3D crypto_shash_init(shash); + if (err) + return err; + err =3D crypto_shash_update(shash, (u8 *)tweak_length_block, + POLYVAL_BLOCK_SIZE); + if (err) + return err; + return crypto_shash_export(shash, hctr2_hashed_tweaklen(tctx, has_remaind= er)); +} + +static int hctr2_setkey(struct crypto_skcipher *tfm, const u8 *key, + unsigned int keylen) +{ + struct hctr2_tfm_ctx *tctx =3D crypto_skcipher_ctx(tfm); + u8 hbar[BLOCKCIPHER_BLOCK_SIZE]; + int err; + + crypto_cipher_clear_flags(tctx->blockcipher, CRYPTO_TFM_REQ_MASK); + crypto_cipher_set_flags(tctx->blockcipher, + crypto_skcipher_get_flags(tfm) & + CRYPTO_TFM_REQ_MASK); + err =3D crypto_cipher_setkey(tctx->blockcipher, key, keylen); + if (err) + return err; + + crypto_skcipher_clear_flags(tctx->xctr, CRYPTO_TFM_REQ_MASK); + crypto_skcipher_set_flags(tctx->xctr, + crypto_skcipher_get_flags(tfm) & + CRYPTO_TFM_REQ_MASK); + err =3D crypto_skcipher_setkey(tctx->xctr, key, keylen); + if (err) + return err; + + memset(hbar, 0, sizeof(hbar)); + crypto_cipher_encrypt_one(tctx->blockcipher, hbar, hbar); + + memset(tctx->L, 0, sizeof(tctx->L)); + tctx->L[0] =3D 0x01; + crypto_cipher_encrypt_one(tctx->blockcipher, tctx->L, tctx->L); + + crypto_shash_clear_flags(tctx->polyval, CRYPTO_TFM_REQ_MASK); + crypto_shash_set_flags(tctx->polyval, crypto_skcipher_get_flags(tfm) & + CRYPTO_TFM_REQ_MASK); + err =3D crypto_shash_setkey(tctx->polyval, hbar, BLOCKCIPHER_BLOCK_SIZE); + if (err) + return err; + memzero_explicit(hbar, sizeof(hbar)); + + return hctr2_hash_tweaklen(tctx, true) ?: hctr2_hash_tweaklen(tctx, false= ); +} + +static int hctr2_hash_tweak(struct skcipher_request *req) +{ + struct crypto_skcipher *tfm =3D crypto_skcipher_reqtfm(req); + const struct hctr2_tfm_ctx *tctx =3D crypto_skcipher_ctx(tfm); + struct hctr2_request_ctx *rctx =3D skcipher_request_ctx(req); + struct shash_desc *hash_desc =3D &rctx->u.hash_desc; + int err; + bool has_remainder =3D req->cryptlen % POLYVAL_BLOCK_SIZE; + + hash_desc->tfm =3D tctx->polyval; + err =3D crypto_shash_import(hash_desc, hctr2_hashed_tweaklen(tctx, has_re= mainder)); + if (err) + return err; + err =3D crypto_shash_update(hash_desc, req->iv, TWEAK_SIZE); + if (err) + return err; + + // Store the hashed tweak, since we need it when computing both + // H(T || N) and H(T || V). + return crypto_shash_export(hash_desc, hctr2_hashed_tweak(tctx, rctx)); +} + +static int hctr2_hash_message(struct skcipher_request *req, + struct scatterlist *sgl, + u8 digest[POLYVAL_DIGEST_SIZE]) +{ + static const u8 padding[BLOCKCIPHER_BLOCK_SIZE] =3D { 0x1 }; + struct hctr2_request_ctx *rctx =3D skcipher_request_ctx(req); + struct shash_desc *hash_desc =3D &rctx->u.hash_desc; + const unsigned int bulk_len =3D req->cryptlen - BLOCKCIPHER_BLOCK_SIZE; + struct sg_mapping_iter miter; + unsigned int remainder =3D bulk_len % BLOCKCIPHER_BLOCK_SIZE; + int i; + int err =3D 0; + int n =3D 0; + + sg_miter_start(&miter, sgl, sg_nents(sgl), + SG_MITER_FROM_SG | SG_MITER_ATOMIC); + for (i =3D 0; i < bulk_len; i +=3D n) { + sg_miter_next(&miter); + n =3D min_t(unsigned int, miter.length, bulk_len - i); + err =3D crypto_shash_update(hash_desc, miter.addr, n); + if (err) + break; + } + sg_miter_stop(&miter); + + if (err) + return err; + + if (remainder) { + err =3D crypto_shash_update(hash_desc, padding, + BLOCKCIPHER_BLOCK_SIZE - remainder); + if (err) + return err; + } + return crypto_shash_final(hash_desc, digest); +} + +static int hctr2_finish(struct skcipher_request *req) +{ + struct crypto_skcipher *tfm =3D crypto_skcipher_reqtfm(req); + const struct hctr2_tfm_ctx *tctx =3D crypto_skcipher_ctx(tfm); + struct hctr2_request_ctx *rctx =3D skcipher_request_ctx(req); + u8 digest[POLYVAL_DIGEST_SIZE]; + struct shash_desc *hash_desc =3D &rctx->u.hash_desc; + int err; + + // U =3D UU ^ H(T || V) + // or M =3D MM ^ H(T || N) + hash_desc->tfm =3D tctx->polyval; + err =3D crypto_shash_import(hash_desc, hctr2_hashed_tweak(tctx, rctx)); + if (err) + return err; + err =3D hctr2_hash_message(req, rctx->bulk_part_dst, digest); + if (err) + return err; + crypto_xor(rctx->first_block, digest, BLOCKCIPHER_BLOCK_SIZE); + + // Copy U (or M) into dst scatterlist + scatterwalk_map_and_copy(rctx->first_block, req->dst, + 0, BLOCKCIPHER_BLOCK_SIZE, 1); + return 0; +} + +static void hctr2_xctr_done(struct crypto_async_request *areq, + int err) +{ + struct skcipher_request *req =3D areq->data; + + if (!err) + err =3D hctr2_finish(req); + + skcipher_request_complete(req, err); +} + +static int hctr2_crypt(struct skcipher_request *req, bool enc) +{ + struct crypto_skcipher *tfm =3D crypto_skcipher_reqtfm(req); + const struct hctr2_tfm_ctx *tctx =3D crypto_skcipher_ctx(tfm); + struct hctr2_request_ctx *rctx =3D skcipher_request_ctx(req); + u8 digest[POLYVAL_DIGEST_SIZE]; + int bulk_len =3D req->cryptlen - BLOCKCIPHER_BLOCK_SIZE; + int err; + + // Requests must be at least one block + if (req->cryptlen < BLOCKCIPHER_BLOCK_SIZE) + return -EINVAL; + + // Copy M (or U) into a temporary buffer + scatterwalk_map_and_copy(rctx->first_block, req->src, + 0, BLOCKCIPHER_BLOCK_SIZE, 0); + + // Create scatterlists for N and V + rctx->bulk_part_src =3D scatterwalk_ffwd(rctx->sg_src, req->src, + BLOCKCIPHER_BLOCK_SIZE); + rctx->bulk_part_dst =3D scatterwalk_ffwd(rctx->sg_dst, req->dst, + BLOCKCIPHER_BLOCK_SIZE); + + // MM =3D M ^ H(T || N) + // or UU =3D U ^ H(T || V) + err =3D hctr2_hash_tweak(req); + if (err) + return err; + err =3D hctr2_hash_message(req, rctx->bulk_part_src, digest); + if (err) + return err; + crypto_xor(digest, rctx->first_block, BLOCKCIPHER_BLOCK_SIZE); + + // UU =3D E(MM) + // or MM =3D D(UU) + if (enc) + crypto_cipher_encrypt_one(tctx->blockcipher, rctx->first_block, + digest); + else + crypto_cipher_decrypt_one(tctx->blockcipher, rctx->first_block, + digest); + + // S =3D MM ^ UU ^ L + crypto_xor(digest, rctx->first_block, BLOCKCIPHER_BLOCK_SIZE); + crypto_xor_cpy(rctx->xctr_iv, digest, tctx->L, BLOCKCIPHER_BLOCK_SIZE); + + // V =3D XCTR(S, N) + // or N =3D XCTR(S, V) + skcipher_request_set_tfm(&rctx->u.xctr_req, tctx->xctr); + skcipher_request_set_crypt(&rctx->u.xctr_req, rctx->bulk_part_src, + rctx->bulk_part_dst, bulk_len, + rctx->xctr_iv); + skcipher_request_set_callback(&rctx->u.xctr_req, + req->base.flags, + hctr2_xctr_done, req); + return crypto_skcipher_encrypt(&rctx->u.xctr_req) ?: + hctr2_finish(req); +} + +static int hctr2_encrypt(struct skcipher_request *req) +{ + return hctr2_crypt(req, true); +} + +static int hctr2_decrypt(struct skcipher_request *req) +{ + return hctr2_crypt(req, false); +} + +static int hctr2_init_tfm(struct crypto_skcipher *tfm) +{ + struct skcipher_instance *inst =3D skcipher_alg_instance(tfm); + struct hctr2_instance_ctx *ictx =3D skcipher_instance_ctx(inst); + struct hctr2_tfm_ctx *tctx =3D crypto_skcipher_ctx(tfm); + struct crypto_skcipher *xctr; + struct crypto_cipher *blockcipher; + struct crypto_shash *polyval; + unsigned int subreq_size; + int err; + + xctr =3D crypto_spawn_skcipher(&ictx->xctr_spawn); + if (IS_ERR(xctr)) + return PTR_ERR(xctr); + + blockcipher =3D crypto_spawn_cipher(&ictx->blockcipher_spawn); + if (IS_ERR(blockcipher)) { + err =3D PTR_ERR(blockcipher); + goto err_free_xctr; + } + + polyval =3D crypto_spawn_shash(&ictx->polyval_spawn); + if (IS_ERR(polyval)) { + err =3D PTR_ERR(polyval); + goto err_free_blockcipher; + } + + tctx->xctr =3D xctr; + tctx->blockcipher =3D blockcipher; + tctx->polyval =3D polyval; + + BUILD_BUG_ON(offsetofend(struct hctr2_request_ctx, u) !=3D + sizeof(struct hctr2_request_ctx)); + subreq_size =3D max(sizeof_field(struct hctr2_request_ctx, u.hash_desc) + + crypto_shash_descsize(polyval), + sizeof_field(struct hctr2_request_ctx, u.xctr_req) + + crypto_skcipher_reqsize(xctr)); + + tctx->hashed_tweak_offset =3D offsetof(struct hctr2_request_ctx, u) + + subreq_size; + crypto_skcipher_set_reqsize(tfm, tctx->hashed_tweak_offset + + crypto_shash_statesize(polyval)); + return 0; + +err_free_blockcipher: + crypto_free_cipher(blockcipher); +err_free_xctr: + crypto_free_skcipher(xctr); + return err; +} + +static void hctr2_exit_tfm(struct crypto_skcipher *tfm) +{ + struct hctr2_tfm_ctx *tctx =3D crypto_skcipher_ctx(tfm); + + crypto_free_cipher(tctx->blockcipher); + crypto_free_skcipher(tctx->xctr); + crypto_free_shash(tctx->polyval); +} + +static void hctr2_free_instance(struct skcipher_instance *inst) +{ + struct hctr2_instance_ctx *ictx =3D skcipher_instance_ctx(inst); + + crypto_drop_cipher(&ictx->blockcipher_spawn); + crypto_drop_skcipher(&ictx->xctr_spawn); + crypto_drop_shash(&ictx->polyval_spawn); + kfree(inst); +} + +static int hctr2_create_common(struct crypto_template *tmpl, + struct rtattr **tb, + const char *xctr_name, + const char *polyval_name) +{ + u32 mask; + struct skcipher_instance *inst; + struct hctr2_instance_ctx *ictx; + struct skcipher_alg *xctr_alg; + struct crypto_alg *blockcipher_alg; + struct shash_alg *polyval_alg; + char blockcipher_name[CRYPTO_MAX_ALG_NAME]; + int len; + int err; + + err =3D crypto_check_attr_type(tb, CRYPTO_ALG_TYPE_SKCIPHER, &mask); + if (err) + return err; + + inst =3D kzalloc(sizeof(*inst) + sizeof(*ictx), GFP_KERNEL); + if (!inst) + return -ENOMEM; + ictx =3D skcipher_instance_ctx(inst); + + /* Stream cipher, xctr(block_cipher) */ + err =3D crypto_grab_skcipher(&ictx->xctr_spawn, + skcipher_crypto_instance(inst), + xctr_name, 0, mask); + if (err) + goto err_free_inst; + xctr_alg =3D crypto_spawn_skcipher_alg(&ictx->xctr_spawn); + + err =3D -EINVAL; + if (strncmp(xctr_alg->base.cra_name, "xctr(", 5)) + goto err_free_inst; + len =3D strscpy(blockcipher_name, xctr_alg->base.cra_name + 5, + sizeof(blockcipher_name)); + if (len < 1) + goto err_free_inst; + if (blockcipher_name[len - 1] !=3D ')') + goto err_free_inst; + blockcipher_name[len - 1] =3D 0; + + /* Block cipher, e.g. "aes" */ + err =3D crypto_grab_cipher(&ictx->blockcipher_spawn, + skcipher_crypto_instance(inst), + blockcipher_name, 0, mask); + if (err) + goto err_free_inst; + blockcipher_alg =3D crypto_spawn_cipher_alg(&ictx->blockcipher_spawn); + + /* Require blocksize of 16 bytes */ + err =3D -EINVAL; + if (blockcipher_alg->cra_blocksize !=3D BLOCKCIPHER_BLOCK_SIZE) + goto err_free_inst; + + /* Polyval =CE=B5-=E2=88=86U hash function */ + err =3D crypto_grab_shash(&ictx->polyval_spawn, + skcipher_crypto_instance(inst), + polyval_name, 0, mask); + if (err) + goto err_free_inst; + polyval_alg =3D crypto_spawn_shash_alg(&ictx->polyval_spawn); + + /* Ensure Polyval is being used */ + err =3D -EINVAL; + if (strcmp(polyval_alg->base.cra_name, "polyval") !=3D 0) + goto err_free_inst; + + /* Instance fields */ + + err =3D -ENAMETOOLONG; + if (snprintf(inst->alg.base.cra_name, CRYPTO_MAX_ALG_NAME, "hctr2(%s)", + blockcipher_alg->cra_name) >=3D CRYPTO_MAX_ALG_NAME) + goto err_free_inst; + if (snprintf(inst->alg.base.cra_driver_name, CRYPTO_MAX_ALG_NAME, + "hctr2_base(%s,%s)", + xctr_alg->base.cra_driver_name, + polyval_alg->base.cra_driver_name) >=3D CRYPTO_MAX_ALG_NAME) + goto err_free_inst; + + inst->alg.base.cra_blocksize =3D BLOCKCIPHER_BLOCK_SIZE; + inst->alg.base.cra_ctxsize =3D sizeof(struct hctr2_tfm_ctx) + + polyval_alg->statesize * 2; + inst->alg.base.cra_alignmask =3D xctr_alg->base.cra_alignmask | + polyval_alg->base.cra_alignmask; + /* + * The hash function is called twice, so it is weighted higher than the + * xctr and blockcipher. + */ + inst->alg.base.cra_priority =3D (2 * xctr_alg->base.cra_priority + + 4 * polyval_alg->base.cra_priority + + blockcipher_alg->cra_priority) / 7; + + inst->alg.setkey =3D hctr2_setkey; + inst->alg.encrypt =3D hctr2_encrypt; + inst->alg.decrypt =3D hctr2_decrypt; + inst->alg.init =3D hctr2_init_tfm; + inst->alg.exit =3D hctr2_exit_tfm; + inst->alg.min_keysize =3D crypto_skcipher_alg_min_keysize(xctr_alg); + inst->alg.max_keysize =3D crypto_skcipher_alg_max_keysize(xctr_alg); + inst->alg.ivsize =3D TWEAK_SIZE; + + inst->free =3D hctr2_free_instance; + + err =3D skcipher_register_instance(tmpl, inst); + if (err) { +err_free_inst: + hctr2_free_instance(inst); + } + return err; +} + +static int hctr2_create_base(struct crypto_template *tmpl, struct rtattr *= *tb) +{ + const char *xctr_name; + const char *polyval_name; + + xctr_name =3D crypto_attr_alg_name(tb[1]); + if (IS_ERR(xctr_name)) + return PTR_ERR(xctr_name); + + polyval_name =3D crypto_attr_alg_name(tb[2]); + if (IS_ERR(polyval_name)) + return PTR_ERR(polyval_name); + + return hctr2_create_common(tmpl, tb, xctr_name, polyval_name); +} + +static int hctr2_create(struct crypto_template *tmpl, struct rtattr **tb) +{ + const char *blockcipher_name; + char xctr_name[CRYPTO_MAX_ALG_NAME]; + + blockcipher_name =3D crypto_attr_alg_name(tb[1]); + if (IS_ERR(blockcipher_name)) + return PTR_ERR(blockcipher_name); + + if (snprintf(xctr_name, CRYPTO_MAX_ALG_NAME, "xctr(%s)", + blockcipher_name) >=3D CRYPTO_MAX_ALG_NAME) + return -ENAMETOOLONG; + + return hctr2_create_common(tmpl, tb, xctr_name, "polyval"); +} + +static struct crypto_template hctr2_tmpls[] =3D { + { + /* hctr2_base(xctr_name, polyval_name) */ + .name =3D "hctr2_base", + .create =3D hctr2_create_base, + .module =3D THIS_MODULE, + }, { + /* hctr2(blockcipher_name) */ + .name =3D "hctr2", + .create =3D hctr2_create, + .module =3D THIS_MODULE, + } +}; + +static int __init hctr2_module_init(void) +{ + return crypto_register_templates(hctr2_tmpls, ARRAY_SIZE(hctr2_tmpls)); +} + +static void __exit hctr2_module_exit(void) +{ + return crypto_unregister_templates(hctr2_tmpls, + ARRAY_SIZE(hctr2_tmpls)); +} + +subsys_initcall(hctr2_module_init); +module_exit(hctr2_module_exit); + +MODULE_DESCRIPTION("HCTR2 length-preserving encryption mode"); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS_CRYPTO("hctr2"); +MODULE_IMPORT_NS(CRYPTO_INTERNAL); diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c index dd9cf216029b..336598da8eac 100644 --- a/crypto/tcrypt.c +++ b/crypto/tcrypt.c @@ -2191,6 +2191,11 @@ static int do_test(const char *alg, u32 type, u32 ma= sk, int m, u32 num_mb) 16, 16, aead_speed_template_19, num_mb); break; =20 + case 226: + test_cipher_speed("hctr2(aes)", ENCRYPT, sec, NULL, + 0, speed_template_32); + break; + case 300: if (alg) { test_hash_speed(alg, sec, generic_hash_speed_template); diff --git a/crypto/testmgr.c b/crypto/testmgr.c index d807b200edf6..3244b7e5aa7e 100644 --- a/crypto/testmgr.c +++ b/crypto/testmgr.c @@ -5030,6 +5030,14 @@ static const struct alg_test_desc alg_test_descs[] = =3D { .suite =3D { .hash =3D __VECS(ghash_tv_template) } + }, { + .alg =3D "hctr2(aes)", + .generic_driver =3D + "hctr2_base(xctr(aes-generic),polyval-generic)", + .test =3D alg_test_skcipher, + .suite =3D { + .cipher =3D __VECS(aes_hctr2_tv_template) + } }, { .alg =3D "hmac(md5)", .test =3D alg_test_hash, diff --git a/crypto/testmgr.h b/crypto/testmgr.h index c581e5405916..13c70dde2f89 100644 --- a/crypto/testmgr.h +++ b/crypto/testmgr.h @@ -35100,4 +35100,676 @@ static const struct hash_testvec polyval_tv_templ= ate[] =3D { =20 }; =20 +/* + * Test vectors generated using https://github.com/google/hctr2 + */ +static const struct cipher_testvec aes_hctr2_tv_template[] =3D { + { + .key =3D "\xe1\x15\x66\x3c\x8d\xc6\x3a\xff" + "\xef\x41\xd7\x47\xa2\xcc\x8a\xba", + .iv =3D "\xc3\xbe\x2a\xcb\xb5\x39\x86\xf1" + "\x91\xad\x6c\xf4\xde\x74\x45\x63" + "\x5c\x7a\xd5\xcc\x8b\x76\xef\x0e" + "\xcf\x2c\x60\x69\x37\xfd\x07\x96", + .ptext =3D "\x65\x75\xae\xd3\xe2\xbc\x43\x5c" + "\xb3\x1a\xd8\x05\xc3\xd0\x56\x29", + .ctext =3D "\x11\x91\xea\x74\x58\xcc\xd5\xa2" + "\xd0\x55\x9e\x3d\xfe\x7f\xc8\xfe", + .klen =3D 16, + .len =3D 16, + }, + { + .key =3D "\xe7\xd1\x77\x48\x76\x0b\xcd\x34" + "\x2a\x2d\xe7\x74\xca\x11\x9c\xae", + .iv =3D "\x71\x1c\x49\x62\xd9\x5b\x50\x5e" + "\x68\x87\xbc\xf6\x89\xff\xed\x30" + "\xe4\xe5\xbd\xb6\x10\x4f\x9f\x66" + "\x28\x06\x5a\xf4\x27\x35\xcd\xe5", + .ptext =3D "\x87\x03\x8f\x06\xa8\x61\x54\xda" + "\x01\x45\xd4\x01\xef\x4a\x22\xcf" + "\x78\x15\x9f\xbd\x64\xbd\x2c\xb9" + "\x40\x1d\x72\xae\x53\x63\xa5", + .ctext =3D "\x4e\xa1\x05\x27\xb8\x45\xe4\xa1" + "\xbb\x30\xb4\xa6\x12\x74\x63\xd6" + "\x17\xc9\xcc\x2f\x18\x64\xe0\x06" + "\x0a\xa0\xff\x72\x10\x7b\x22", + .klen =3D 16, + .len =3D 31, + }, + { + .key =3D "\x59\x65\x3b\x1d\x43\x5e\xc0\xae" + "\xb8\x9d\x9b\xdd\x22\x03\xbf\xca", + .iv =3D "\xec\x95\xfa\x5a\xcf\x5e\xd2\x93" + "\xa3\xb5\xe5\xbe\xf3\x01\x7b\x01" + "\xd1\xca\x6c\x06\x82\xf0\xbd\x67" + "\xd9\x6c\xa4\xdc\xb4\x38\x0f\x74", + .ptext =3D "\x45\xdf\x75\x87\xbc\x72\xce\x55" + "\xc9\xfa\xcb\xfc\x9f\x40\x82\x2b" + "\xc6\x4f\x4f\x5b\x8b\x3b\x6d\x67" + "\xa6\x93\x62\x89\x8c\x19\xf4\xe3" + "\x08\x92\x9c\xc9\x47\x2c\x6e\xd0" + "\xa3\x02\x2b\xdb\x2c\xf2\x8d\x46" + "\xcd\xb0\x9d\x26\x63\x4c\x40\x6b" + "\x79\x43\xe5\xce\x42\xa8\xec\x3b" + "\x5b\xd0\xea\xa4\xe6\xdb\x66\x55" + "\x7a\x76\xec\xab\x7d\x2a\x2b\xbd" + "\xa9\xab\x22\x64\x1a\xa1\xae\x84" + "\x86\x79\x67\xe9\xb2\x50\xbe\x12" + "\x2f\xb2\x14\xf0\xdb\x71\xd8\xa7" + "\x41\x8a\x88\xa0\x6a\x6e\x9d\x2a" + "\xfa\x11\x37\x40\x32\x09\x4c\x47" + "\x41\x07\x31\x85\x3d\xa8\xf7\x64", + .ctext =3D "\x2d\x4b\x9f\x93\xca\x5a\x48\x26" + "\x01\xcc\x54\xe4\x31\x50\x12\xf0" + "\x49\xff\x59\x42\x68\xbd\x87\x8f" + "\x9e\x62\x96\xcd\xb9\x24\x57\xa4" + "\x0b\x7b\xf5\x2e\x0e\xa8\x65\x07" + "\xab\x05\xd5\xca\xe7\x9c\x6c\x34" + "\x5d\x42\x34\xa4\x62\xe9\x75\x48" + "\x3d\x9e\x8f\xfa\x42\xe9\x75\x08" + "\x4e\x54\x91\x2b\xbd\x11\x0f\x8e" + "\xf0\x82\xf5\x24\xf1\xc4\xfc\xae" + "\x42\x54\x7f\xce\x15\xa8\xb2\x33" + "\xc0\x86\xb6\x2b\xe8\x44\xce\x1f" + "\x68\x57\x66\x94\x6e\xad\xeb\xf3" + "\x30\xf8\x11\xbd\x60\x00\xc6\xd5" + "\x4c\x81\xf1\x20\x2b\x4a\x5b\x99" + "\x79\x3b\xc9\x5c\x74\x23\xe6\x5d", + .klen =3D 16, + .len =3D 128, + }, + { + .key =3D "\x3e\x08\x5d\x64\x6c\x98\xec\xec" + "\x70\x0e\x0d\xa1\x41\x20\x99\x82", + .iv =3D "\x11\xb7\x77\x91\x0d\x99\xd9\x8d" + "\x35\x3a\xf7\x14\x6b\x09\x37\xe5" + "\xad\x51\xf6\xc3\x96\x4b\x64\x56" + "\xa8\xbd\x81\xcc\xbe\x94\xaf\xe4", + .ptext =3D "\xff\x8d\xb9\xc0\xe3\x69\xb3\xb2" + "\x8b\x11\x26\xb3\x11\xec\xfb\xb9" + "\x9c\xc1\x71\xd6\xe3\x26\x0e\xe0" + "\x68\x40\x60\xb9\x3a\x63\x56\x8a" + "\x9e\xc1\xf0\x10\xb1\x64\x32\x70" + "\xf8\xcd\xc6\xc4\x49\x4c\xe1\xce" + "\xf3\xe1\x03\xf8\x35\xae\xe0\x5e" + "\xef\x5f\xbc\x41\x75\x26\x13\xcc" + "\x37\x85\xdf\xc0\x5d\xa6\x47\x98" + "\xf1\x97\x52\x58\x04\xe6\xb5\x01" + "\xc0\xb8\x17\x6d\x74\xbd\x9a\xdf" + "\xa4\x37\x94\x86\xb0\x13\x83\x28" + "\xc9\xa2\x07\x3f\xb5\xb2\x72\x40" + "\x0e\x60\xdf\x57\x07\xb7\x2c\x66" + "\x10\x3f\x8d\xdd\x30\x0a\x47\xd5" + "\xe8\x9d\xfb\xa1\xaf\x53\xd7\x05" + "\xc7\xd2\xba\xe7\x2c\xa0\xbf\xb8" + "\xd1\x93\xe7\x41\x82\xa3\x41\x3a" + "\xaf\x12\xd6\xf8\x34\xda\x92\x46" + "\xad\xa2\x2f\xf6\x7e\x46\x96\xd8" + "\x03\xf3\x49\x64\xde\xd8\x06\x8b" + "\xa0\xbc\x63\x35\x38\xb6\x6b\xda" + "\x5b\x50\x3f\x13\xa5\x84\x1b\x1b" + "\x66\x89\x95\xb7\xc2\x16\x3c\xe9" + "\x24\xb0\x8c\x6f\x49\xef\xf7\x28" + "\x6a\x24\xfd\xbe\x25\xe2\xb4\x90" + "\x77\x44\x08\xb8\xda\xd2\xde\x2c" + "\xa0\x57\x45\x57\x29\x47\x6b\x89" + "\x4a\xf6\xa7\x2a\xc3\x9e\x7b\xc8" + "\xfd\x9f\x89\xab\xee\x6d\xa3\xb4" + "\x23\x90\x7a\xe9\x89\xa0\xc7\xb3" + "\x17\x41\x87\x91\xfc\x97\x42", + .ctext =3D "\xfc\x9b\x96\x66\xc4\x82\x2a\x4a" + "\xb1\x24\xba\xc7\x78\x5f\x79\xc1" + "\x57\x2e\x47\x29\x4d\x7b\xd2\x9a" + "\xbd\xc6\xc1\x26\x7b\x8e\x3f\x5d" + "\xd4\xb4\x9f\x6a\x02\x24\x4a\xad" + "\x0c\x00\x1b\xdf\x92\xc5\x8a\xe1" + "\x77\x79\xcc\xd5\x20\xbf\x83\xf4" + "\x4b\xad\x11\xbf\xdb\x47\x65\x70" + "\x43\xf3\x65\xdf\xb7\xdc\xb2\xb9" + "\xaa\x3f\xb3\xdf\x79\x69\x0d\xa0" + "\x86\x1c\xba\x48\x0b\x01\xc1\x88" + "\xdf\x03\xb1\x06\x3c\x1d\x56\xa1" + "\x8e\x98\xc1\xa6\x95\xa2\x5b\x72" + "\x76\x59\xd2\x26\x25\xcd\xef\x7c" + "\xc9\x60\xea\x43\xd1\x12\x8a\x8a" + "\x63\x12\x78\xcb\x2f\x88\x1e\x88" + "\x78\x59\xde\xba\x4d\x2c\x78\x61" + "\x75\x37\x54\xfd\x80\xc7\x5e\x98" + "\xcf\x14\x62\x8e\xfb\x72\xee\x4d" + "\x9f\xaf\x8b\x09\xe5\x21\x0a\x91" + "\x8f\x88\x87\xd5\xb1\x84\xab\x18" + "\x08\x57\xed\x72\x35\xa6\x0e\xc6" + "\xff\xcb\xfe\x2c\x48\x39\x14\x44" + "\xba\x59\x32\x3a\x2d\xc4\x5f\xcb" + "\xbe\x68\x8e\x7b\xee\x21\xa4\x32" + "\x11\xa0\x99\xfd\x90\xde\x59\x43" + "\xeb\xed\xd5\x87\x68\x46\xc6\xde" + "\x0b\x07\x17\x59\x6a\xab\xca\x15" + "\x65\x02\x01\xb6\x71\x8c\x3b\xaa" + "\x18\x3b\x30\xae\x38\x5b\x2c\x74" + "\xd4\xee\x4a\xfc\xf7\x1b\x09\xd4" + "\xda\x8b\x1d\x5d\x6f\x21\x6c", + .klen =3D 16, + .len =3D 255, + }, + { + .key =3D "\x24\xf6\xe1\x62\xe5\xaf\x99\xda" + "\x84\xec\x41\xb0\xa3\x0b\xd5\xa8" + "\xa0\x3e\x7b\xa6\xdd\x6c\x8f\xa8", + .iv =3D "\x7f\x80\x24\x62\x32\xdd\xab\x66" + "\xf2\x87\x29\x24\xec\xd2\x4b\x9f" + "\x0c\x33\x52\xd9\xe0\xcc\x6e\xe4" + "\x90\x85\x43\x97\xc4\x62\x14\x33", + .ptext =3D "\xef\x58\xe7\x7f\xa9\xd9\xb8\xd7" + "\xa2\x91\x97\x07\x27\x9e\xba\xe8" + "\xaa", + .ctext =3D "\xd7\xc3\x81\x91\xf2\x40\x17\x73" + "\x3e\x3b\x1c\x2a\x8e\x11\x9c\x17" + "\xf1", + .klen =3D 24, + .len =3D 17, + }, + { + .key =3D "\xbf\xaf\xd7\x67\x8c\x47\xcf\x21" + "\x8a\xa5\xdd\x32\x25\x47\xbe\x4f" + "\xf1\x3a\x0b\xa6\xaa\x2d\xcf\x09", + .iv =3D "\xd9\xe8\xf0\x92\x4e\xfc\x1d\xf2" + "\x81\x37\x7c\x8f\xf1\x59\x09\x20" + "\xf4\x46\x51\x86\x4f\x54\x8b\x32" + "\x58\xd1\x99\x8b\x8c\x03\xeb\x5d", + .ptext =3D "\xcd\x64\x90\xf9\x7c\xe5\x0e\x5a" + "\x75\xe7\x8e\x39\x86\xec\x20\x43" + "\x8a\x49\x09\x15\x47\xf4\x3c\x89" + "\x21\xeb\xcf\x4e\xcf\x91\xb5\x40" + "\xcd\xe5\x4d\x5c\x6f\xf2\xd2\x80" + "\xfa\xab\xb3\x76\x9f\x7f\x84\x0a", + .ctext =3D "\x44\x98\x64\x15\xb7\x0b\x80\xa3" + "\xb9\xca\x23\xff\x3b\x0b\x68\x74" + "\xbb\x3e\x20\x19\x9f\x28\x71\x2a" + "\x48\x3c\x7c\xe2\xef\xb5\x10\xac" + "\x82\x9f\xcd\x08\x8f\x6b\x16\x6f" + "\xc3\xbb\x07\xfb\x3c\xb0\x1b\x27", + .klen =3D 24, + .len =3D 48, + }, + { + .key =3D "\xb8\x35\xa2\x5f\x86\xbb\x82\x99" + "\x27\xeb\x01\x3f\x92\xaf\x80\x24" + "\x4c\x66\xa2\x89\xff\x2e\xa2\x25", + .iv =3D "\x0a\x1d\x96\xd3\xe0\xe8\x0c\x9b" + "\x9d\x6f\x21\x97\xc2\x17\xdb\x39" + "\x3f\xd8\x64\x48\x80\x04\xee\x43" + "\x02\xce\x88\xe2\x81\x81\x5f\x81", + .ptext =3D "\xb8\xf9\x16\x8b\x25\x68\xd0\x9c" + "\xd2\x28\xac\xa8\x79\xc2\x30\xc1" + "\x31\xde\x1c\x37\x1b\xa2\xb5\xe6" + "\xf0\xd0\xf8\x9c\x7f\xc6\x46\x07" + "\x5c\xc3\x06\xe4\xf0\x02\xec\xf8" + "\x59\x7c\xc2\x5d\xf8\x0c\x21\xae" + "\x9e\x82\xb1\x1a\x5f\x78\x44\x15" + "\x00\xa7\x2e\x52\xc5\x98\x98\x35" + "\x03\xae\xd0\x8e\x07\x57\xe2\x5a" + "\x17\xbf\x52\x40\x54\x5b\x74\xe5" + "\x2d\x35\xaf\x9e\x37\xf7\x7e\x4a" + "\x8c\x9e\xa1\xdc\x40\xb4\x5b\x36" + "\xdc\x3a\x68\xe6\xb7\x35\x0b\x8a" + "\x90\xec\x74\x8f\x09\x9a\x7f\x02" + "\x4d\x03\x46\x35\x62\xb1\xbd\x08" + "\x3f\x54\x2a\x10\x0b\xdc\x69\xaf" + "\x25\x3a\x0c\x5f\xe0\x51\xe7\x11" + "\xb7\x00\xab\xbb\x9a\xb0\xdc\x4d" + "\xc3\x7d\x1a\x6e\xd1\x09\x52\xbd" + "\x6b\x43\x55\x22\x3a\x78\x14\x7d" + "\x79\xfd\x8d\xfc\x9b\x1d\x0f\xa2" + "\xc7\xb9\xf8\x87\xd5\x96\x50\x61" + "\xa7\x5e\x1e\x57\x97\xe0\xad\x2f" + "\x93\xe6\xe8\x83\xec\x85\x26\x5e" + "\xd9\x2a\x15\xe0\xe9\x09\x25\xa1" + "\x77\x2b\x88\xdc\xa4\xa5\x48\xb6" + "\xf7\xcc\xa6\xa9\xba\xf3\x42\x5c" + "\x70\x9d\xe9\x29\xc1\xf1\x33\xdd" + "\x56\x48\x17\x86\x14\x51\x5c\x10" + "\xab\xfd\xd3\x26\x8c\x21\xf5\x93" + "\x1b\xeb\x47\x97\x73\xbb\x88\x10" + "\xf3\xfe\xf5\xde\xf3\x2e\x05\x46" + "\x1c\x0d\xa3\x10\x48\x9c\x71\x16" + "\x78\x33\x4d\x0a\x74\x3b\xe9\x34" + "\x0b\xa7\x0e\x9e\x61\xe9\xe9\xfd" + "\x85\xa0\xcb\x19\xfd\x7c\x33\xe3" + "\x0e\xce\xc2\x6f\x9d\xa4\x2d\x77" + "\xfd\xad\xee\x5e\x08\x3e\xd7\xf5" + "\xfb\xc3\xd7\x93\x96\x08\x96\xca" + "\x58\x81\x16\x9b\x98\x0a\xe2\xef" + "\x7f\xda\x40\xe4\x1f\x46\x9e\x67" + "\x2b\x84\xcb\x42\xc4\xd6\x6a\xcf" + "\x2d\xb2\x33\xc0\x56\xb3\x35\x6f" + "\x29\x36\x8f\x6a\x5b\xec\xd5\x4f" + "\xa0\x70\xff\xb6\x5b\xde\x6a\x93" + "\x20\x3c\xe2\x76\x7a\xef\x3c\x79" + "\x31\x65\xce\x3a\x0e\xd0\xbe\xa8" + "\x21\x95\xc7\x2b\x62\x8e\x67\xdd" + "\x20\x79\xe4\xe5\x01\x15\xc0\xec" + "\x0f\xd9\x23\xc8\xca\xdf\xd4\x7d" + "\x1d\xf8\x64\x4f\x56\xb1\x83\xa7" + "\x43\xbe\xfc\xcf\xc2\x8c\x33\xda" + "\x36\xd0\x52\xef\x9e\x9e\x88\xf4" + "\xa8\x21\x0f\xaa\xee\x8d\xa0\x24" + "\x4d\xcb\xb1\x72\x07\xf0\xc2\x06" + "\x60\x65\x85\x84\x2c\x60\xcf\x61" + "\xe7\x56\x43\x5b\x2b\x50\x74\xfa" + "\xdb\x4e\xea\x88\xd4\xb3\x83\x8f" + "\x6f\x97\x4b\x57\x7a\x64\x64\xae" + "\x0a\x37\x66\xc5\x03\xad\xb5\xf9" + "\x08\xb0\x3a\x74\xde\x97\x51\xff" + "\x48\x4f\x5c\xa4\xf8\x7a\xb4\x05" + "\x27\x70\x52\x86\x1b\x78\xfc\x18" + "\x06\x27\xa9\x62\xf7\xda\xd2\x8e", + .ctext =3D "\x3b\xe1\xdb\xb3\xc5\x9a\xde\x69" + "\x58\x05\xcc\xeb\x02\x51\x78\x4a" + "\xac\x28\xe9\xed\xd1\xc9\x15\x7d" + "\x33\x7d\xc1\x47\x12\x41\x11\xf8" + "\x4a\x2c\xb7\xa3\x41\xbe\x59\xf7" + "\x22\xdb\x2c\xda\x9c\x00\x61\x9b" + "\x73\xb3\x0b\x84\x2b\xc1\xf3\x80" + "\x84\xeb\x19\x60\x80\x09\xe1\xcd" + "\x16\x3a\x20\x23\xc4\x82\x4f\xba" + "\x3b\x8e\x55\xd7\xa9\x0b\x75\xd0" + "\xda\xce\xd2\xee\x7e\x4b\x7f\x65" + "\x4d\x28\xc5\xd3\x15\x2c\x40\x96" + "\x52\xd4\x18\x61\x2b\xe7\x83\xec" + "\x89\x62\x9c\x4c\x50\xe6\xe2\xbb" + "\x25\xa1\x0f\xa7\xb0\xb4\xb2\xde" + "\x54\x20\xae\xa3\x56\xa5\x26\x4c" + "\xd5\xcc\xe5\xcb\x28\x44\xb1\xef" + "\x67\x2e\x93\x6d\x00\x88\x83\x9a" + "\xf2\x1c\x48\x38\xec\x1a\x24\x90" + "\x73\x0a\xdb\xe8\xce\x95\x7a\x2c" + "\x8c\xe9\xb7\x07\x1d\xb3\xa3\x20" + "\xbe\xad\x61\x84\xac\xde\x76\xb5" + "\xa6\x28\x29\x47\x63\xc4\xfc\x13" + "\x3f\x71\xfb\x58\x37\x34\x82\xed" + "\x9e\x05\x19\x1f\xc1\x67\xc1\xab" + "\xf5\xfd\x7c\xea\xfa\xa4\xf8\x0a" + "\xac\x4c\x92\xdf\x65\x73\xd7\xdb" + "\xed\x2c\xe0\x84\x5f\x57\x8c\x76" + "\x3e\x05\xc0\xc3\x68\x96\x95\x0b" + "\x88\x97\xfe\x2e\x99\xd5\xc2\xb9" + "\x53\x9f\xf3\x32\x10\x1f\x1f\x5d" + "\xdf\x21\x95\x70\x91\xe8\xa1\x3e" + "\x19\x3e\xb6\x0b\xa8\xdb\xf8\xd4" + "\x54\x27\xb8\xab\x5d\x78\x0c\xe6" + "\xb7\x08\xee\xa4\xb6\x6b\xeb\x5a" + "\x89\x69\x2b\xbd\xd4\x21\x5b\xbf" + "\x79\xbb\x0f\xff\xdb\x23\x9a\xeb" + "\x8d\xf2\xc4\x39\xb4\x90\x77\x6f" + "\x68\xe2\xb8\xf3\xf1\x65\x4f\xd5" + "\x24\x80\x06\xaf\x7c\x8d\x15\x0c" + "\xfd\x56\xe5\xe3\x01\xa5\xf7\x1c" + "\x31\xd6\xa2\x01\x1e\x59\xf9\xa9" + "\x42\xd5\xc2\x34\xda\x25\xde\xc6" + "\x5d\x38\xef\xd1\x4c\xc1\xd9\x1b" + "\x98\xfd\xcd\x57\x6f\xfd\x46\x91" + "\x90\x3d\x52\x2b\x2c\x7d\xcf\x71" + "\xcf\xd1\x77\x23\x71\x36\xb1\xce" + "\xc7\x5d\xf0\x5b\x44\x3d\x43\x71" + "\xac\xb8\xa0\x6a\xea\x89\x5c\xff" + "\x81\x73\xd4\x83\xd1\xc9\xe9\xe2" + "\xa8\xa6\x0f\x36\xe6\xaa\x57\xd4" + "\x27\xd2\xc9\xda\x94\x02\x1f\xfb" + "\xe1\xa1\x07\xbe\xe1\x1b\x15\x94" + "\x1e\xac\x2f\x57\xbb\x41\x22\xaf" + "\x60\x5e\xcc\x66\xcb\x16\x62\xab" + "\xb8\x7c\x99\xf4\x84\x93\x0c\xc2" + "\xa2\x49\xe4\xfd\x17\x55\xe1\xa6" + "\x8d\x5b\xc6\x1b\xc8\xac\xec\x11" + "\x33\xcf\xb0\xe8\xc7\x28\x4f\xb2" + "\x5c\xa6\xe2\x71\xab\x80\x0a\xa7" + "\x5c\x59\x50\x9f\x7a\x32\xb7\xe5" + "\x24\x9a\x8e\x25\x21\x2e\xb7\x18" + "\xd0\xf2\xe7\x27\x6f\xda\xc1\x00" + "\xd9\xa6\x03\x59\xac\x4b\xcb\xba", + .klen =3D 24, + .len =3D 512, + }, + { + .key =3D "\x9e\xeb\xb2\x49\x3c\x1c\xf5\xf4" + "\x6a\x99\xc2\xc4\xdf\xb1\xf4\xdd" + "\x75\x20\x57\xea\x2c\x4f\xcd\xb2" + "\xa5\x3d\x7b\x49\x1e\xab\xfd\x0f", + .iv =3D "\xdf\x63\xd4\xab\xd2\x49\xf3\xd8" + "\x33\x81\x37\x60\x7d\xfa\x73\x08" + "\xd8\x49\x6d\x80\xe8\x2f\x62\x54" + "\xeb\x0e\xa9\x39\x5b\x45\x7f\x8a", + .ptext =3D "\x67\xc9\xf2\x30\x84\x41\x8e\x43" + "\xfb\xf3\xb3\x3e\x79\x36\x7f\xe8", + .ctext =3D "\x27\x38\x78\x47\x16\xd9\x71\x35" + "\x2e\x7e\xdd\x7e\x43\x3c\xb8\x40", + .klen =3D 32, + .len =3D 16, + }, + { + .key =3D "\x93\xfa\x7e\xe2\x0e\x67\xc4\x39" + "\xe7\xca\x47\x95\x68\x9d\x5e\x5a" + "\x7c\x26\x19\xab\xc6\xca\x6a\x4c" + "\x45\xa6\x96\x42\xae\x6c\xff\xe7", + .iv =3D "\xea\x82\x47\x95\x3b\x22\xa1\x3a" + "\x6a\xca\x24\x4c\x50\x7e\x23\xcd" + "\x0e\x50\xe5\x41\xb6\x65\x29\xd8" + "\x30\x23\x00\xd2\x54\xa7\xd6\x56", + .ptext =3D "\xdb\x1f\x1f\xec\xad\x83\x6e\x5d" + "\x19\xa5\xf6\x3b\xb4\x93\x5a\x57" + "\x6f", + .ctext =3D "\xf1\x46\x6e\x9d\xb3\x01\xf0\x6b" + "\xc2\xac\x57\x88\x48\x6d\x40\x72" + "\x68", + .klen =3D 32, + .len =3D 17, + }, + { + .key =3D "\x36\x2b\x57\x97\xf8\x5d\xcd\x99" + "\x5f\x1a\x5a\x44\x1d\x92\x0f\x27" + "\xcc\x16\xd7\x2b\x85\x63\x99\xd3" + "\xba\x96\xa1\xdb\xd2\x60\x68\xda", + .iv =3D "\xef\x58\x69\xb1\x2c\x5e\x9a\x47" + "\x24\xc1\xb1\x69\xe1\x12\x93\x8f" + "\x43\x3d\x6d\x00\xdb\x5e\xd8\xd9" + "\x12\x9a\xfe\xd9\xff\x2d\xaa\xc4", + .ptext =3D "\x5e\xa8\x68\x19\x85\x98\x12\x23" + "\x26\x0a\xcc\xdb\x0a\x04\xb9\xdf" + "\x4d\xb3\x48\x7b\xb0\xe3\xc8\x19" + "\x43\x5a\x46\x06\x94\x2d\xf2", + .ctext =3D "\xdb\xfd\xc8\x03\xd0\xec\xc1\xfe" + "\xbd\x64\x37\xb8\x82\x43\x62\x4e" + "\x7e\x54\xa3\xe2\x24\xa7\x27\xe8" + "\xa4\xd5\xb3\x6c\xb2\x26\xb4", + .klen =3D 32, + .len =3D 31, + }, + { + .key =3D "\x03\x65\x03\x6e\x4d\xe6\xe8\x4e" + "\x8b\xbe\x22\x19\x48\x31\xee\xd9" + "\xa0\x91\x21\xbe\x62\x89\xde\x78" + "\xd9\xb0\x36\xa3\x3c\xce\x43\xd5", + .iv =3D "\xa9\xc3\x4b\xe7\x0f\xfc\x6d\xbf" + "\x56\x27\x21\x1c\xfc\xd6\x04\x10" + "\x5f\x43\xe2\x30\x35\x29\x6c\x10" + "\x90\xf1\xbf\x61\xed\x0f\x8a\x91", + .ptext =3D "\x07\xaa\x02\x26\xb4\x98\x11\x5e" + "\x33\x41\x21\x51\x51\x63\x2c\x72" + "\x00\xab\x32\xa7\x1c\xc8\x3c\x9c" + "\x25\x0e\x8b\x9a\xdf\x85\xed\x2d" + "\xf4\xf2\xbc\x55\xca\x92\x6d\x22" + "\xfd\x22\x3b\x42\x4c\x0b\x74\xec", + .ctext =3D "\x7b\xb1\x43\x6d\xd8\x72\x6c\xf6" + "\x67\x6a\x00\xc4\xf1\xf0\xf5\xa4" + "\xfc\x60\x91\xab\x46\x0b\x15\xfc" + "\xd7\xc1\x28\x15\xa1\xfc\xf7\x68" + "\x8e\xcc\x27\x62\x00\x64\x56\x72" + "\xa6\x17\xd7\x3f\x67\x80\x10\x58", + .klen =3D 32, + .len =3D 48, + }, + { + .key =3D "\xa5\x28\x24\x34\x1a\x3c\xd8\xf7" + "\x05\x91\x8f\xee\x85\x1f\x35\x7f" + "\x80\x3d\xfc\x9b\x94\xf6\xfc\x9e" + "\x19\x09\x00\xa9\x04\x31\x4f\x11", + .iv =3D "\xa1\xba\x49\x95\xff\x34\x6d\xb8" + "\xcd\x87\x5d\x5e\xfd\xea\x85\xdb" + "\x8a\x7b\x5e\xb2\x5d\x57\xdd\x62" + "\xac\xa9\x8c\x41\x42\x94\x75\xb7", + .ptext =3D "\x69\xb4\xe8\x8c\x37\xe8\x67\x82" + "\xf1\xec\x5d\x04\xe5\x14\x91\x13" + "\xdf\xf2\x87\x1b\x69\x81\x1d\x71" + "\x70\x9e\x9c\x3b\xde\x49\x70\x11" + "\xa0\xa3\xdb\x0d\x54\x4f\x66\x69" + "\xd7\xdb\x80\xa7\x70\x92\x68\xce" + "\x81\x04\x2c\xc6\xab\xae\xe5\x60" + "\x15\xe9\x6f\xef\xaa\x8f\xa7\xa7" + "\x63\x8f\xf2\xf0\x77\xf1\xa8\xea" + "\xe1\xb7\x1f\x9e\xab\x9e\x4b\x3f" + "\x07\x87\x5b\x6f\xcd\xa8\xaf\xb9" + "\xfa\x70\x0b\x52\xb8\xa8\xa7\x9e" + "\x07\x5f\xa6\x0e\xb3\x9b\x79\x13" + "\x79\xc3\x3e\x8d\x1c\x2c\x68\xc8" + "\x51\x1d\x3c\x7b\x7d\x79\x77\x2a" + "\x56\x65\xc5\x54\x23\x28\xb0\x03", + .ctext =3D "\xeb\xf9\x98\x86\x3c\x40\x9f\x16" + "\x84\x01\xf9\x06\x0f\xeb\x3c\xa9" + "\x4c\xa4\x8e\x5d\xc3\x8d\xe5\xd3" + "\xae\xa6\xe6\xcc\xd6\x2d\x37\x4f" + "\x99\xc8\xa3\x21\x46\xb8\x69\xf2" + "\xe3\x14\x89\xd7\xb9\xf5\x9e\x4e" + "\x07\x93\x6f\x78\x8e\x6b\xea\x8f" + "\xfb\x43\xb8\x3e\x9b\x4c\x1d\x7e" + "\x20\x9a\xc5\x87\xee\xaf\xf6\xf9" + "\x46\xc5\x18\x8a\xe8\x69\xe7\x96" + "\x52\x55\x5f\x00\x1e\x1a\xdc\xcc" + "\x13\xa5\xee\xff\x4b\x27\xca\xdc" + "\x10\xa6\x48\x76\x98\x43\x94\xa3" + "\xc7\xe2\xc9\x65\x9b\x08\x14\x26" + "\x1d\x68\xfb\x15\x0a\x33\x49\x84" + "\x84\x33\x5a\x1b\x24\x46\x31\x92", + .klen =3D 32, + .len =3D 128, + }, + { + .key =3D "\x36\x45\x11\xa2\x98\x5f\x96\x7c" + "\xc6\xb4\x94\x31\x0a\x67\x09\x32" + "\x6c\x6f\x6f\x00\xf0\x17\xcb\xac" + "\xa5\xa9\x47\x9e\x2e\x85\x2f\xfa", + .iv =3D "\x28\x88\xaa\x9b\x59\x3b\x1e\x97" + "\x82\xe5\x5c\x9e\x6d\x14\x11\x19" + "\x6e\x38\x8f\xd5\x40\x2b\xca\xf9" + "\x7b\x4c\xe4\xa3\xd0\xd2\x8a\x13", + .ptext =3D "\x95\xd2\xf7\x71\x1b\xca\xa5\x86" + "\xd9\x48\x01\x93\x2f\x79\x55\x29" + "\x71\x13\x15\x0e\xe6\x12\xbc\x4d" + "\x8a\x31\xe3\x40\x2a\xc6\x5e\x0d" + "\x68\xbb\x4a\x62\x8d\xc7\x45\x77" + "\xd2\xb8\xc7\x1d\xf1\xd2\x5d\x97" + "\xcf\xac\x52\xe5\x32\x77\xb6\xda" + "\x30\x85\xcf\x2b\x98\xe9\xaa\x34" + "\x62\xb5\x23\x9e\xb7\xa6\xd4\xe0" + "\xb4\x58\x18\x8c\x4d\xde\x4d\x01" + "\x83\x89\x24\xca\xfb\x11\xd4\x82" + "\x30\x7a\x81\x35\xa0\xb4\xd4\xb6" + "\x84\xea\x47\x91\x8c\x19\x86\x25" + "\xa6\x06\x8d\x78\xe6\xed\x87\xeb" + "\xda\xea\x73\x7c\xbf\x66\xb8\x72" + "\xe3\x0a\xb8\x0c\xcb\x1a\x73\xf1" + "\xa7\xca\x0a\xde\x57\x2b\xbd\x2b" + "\xeb\x8b\x24\x38\x22\xd3\x0e\x1f" + "\x17\xa0\x84\x98\x31\x77\xfd\x34" + "\x6a\x4e\x3d\x84\x4c\x0e\xfb\xed" + "\xc8\x2a\x51\xfa\xd8\x73\x21\x8a" + "\xdb\xb5\xfe\x1f\xee\xc4\xe8\x65" + "\x54\x84\xdd\x96\x6d\xfd\xd3\x31" + "\x77\x36\x52\x6b\x80\x4f\x9e\xb4" + "\xa2\x55\xbf\x66\x41\x49\x4e\x87" + "\xa7\x0c\xca\xe7\xa5\xc5\xf6\x6f" + "\x27\x56\xe2\x48\x22\xdd\x5f\x59" + "\x3c\xf1\x9f\x83\xe5\x2d\xfb\x71" + "\xad\xd1\xae\x1b\x20\x5c\x47\xb7" + "\x3b\xd3\x14\xce\x81\x42\xb1\x0a" + "\xf0\x49\xfa\xc2\xe7\x86\xbf\xcd" + "\xb0\x95\x9f\x8f\x79\x41\x54", + .ctext =3D "\xf6\x57\x51\xc4\x25\x61\x2d\xfa" + "\xd6\xd9\x3f\x9a\x81\x51\xdd\x8e" + "\x3d\xe7\xaa\x2d\xb1\xda\xc8\xa6" + "\x9d\xaa\x3c\xab\x62\xf2\x80\xc3" + "\x2c\xe7\x58\x72\x1d\x44\xc5\x28" + "\x7f\xb4\xf9\xbc\x9c\xb2\xab\x8e" + "\xfa\xd1\x4d\x72\xd9\x79\xf5\xa0" + "\x24\x3e\x90\x25\x31\x14\x38\x45" + "\x59\xc8\xf6\xe2\xc6\xf6\xc1\xa7" + "\xb2\xf8\xa7\xa9\x2b\x6f\x12\x3a" + "\xb0\x81\xa4\x08\x57\x59\xb1\x56" + "\x4c\x8f\x18\x55\x33\x5f\xd6\x6a" + "\xc6\xa0\x4b\xd6\x6b\x64\x3e\x9e" + "\xfd\x66\x16\xe2\xdb\xeb\x5f\xb3" + "\x50\x50\x3e\xde\x8d\x72\x76\x01" + "\xbe\xcc\xc9\x52\x09\x2d\x8d\xe7" + "\xd6\xc3\x66\xdb\x36\x08\xd1\x77" + "\xc8\x73\x46\x26\x24\x29\xbf\x68" + "\x2d\x2a\x99\x43\x56\x55\xe4\x93" + "\xaf\xae\x4d\xe7\x55\x4a\xc0\x45" + "\x26\xeb\x3b\x12\x90\x7c\xdc\xd1" + "\xd5\x6f\x0a\xd0\xa9\xd7\x4b\x89" + "\x0b\x07\xd8\x86\xad\xa1\xc4\x69" + "\x1f\x5e\x8b\xc4\x9e\x91\x41\x25" + "\x56\x98\x69\x78\x3a\x9e\xae\x91" + "\xd8\xd9\xfa\xfb\xff\x81\x25\x09" + "\xfc\xed\x2d\x87\xbc\x04\x62\x97" + "\x35\xe1\x26\xc2\x46\x1c\xcf\xd7" + "\x14\xed\x02\x09\xa5\xb2\xb6\xaa" + "\x27\x4e\x61\xb3\x71\x6b\x47\x16" + "\xb7\xe8\xd4\xaf\x52\xeb\x6a\x6b" + "\xdb\x4c\x65\x21\x9e\x1c\x36", + .klen =3D 32, + .len =3D 255, + }, + { + .key =3D "\xd3\x81\x72\x18\x23\xff\x6f\x4a" + "\x25\x74\x29\x0d\x51\x8a\x0e\x13" + "\xc1\x53\x5d\x30\x8d\xee\x75\x0d" + "\x14\xd6\x69\xc9\x15\xa9\x0c\x60", + .iv =3D "\x65\x9b\xd4\xa8\x7d\x29\x1d\xf4" + "\xc4\xd6\x9b\x6a\x28\xab\x64\xe2" + "\x62\x81\x97\xc5\x81\xaa\xf9\x44" + "\xc1\x72\x59\x82\xaf\x16\xc8\x2c", + .ptext =3D "\xc7\x6b\x52\x6a\x10\xf0\xcc\x09" + "\xc1\x12\x1d\x6d\x21\xa6\x78\xf5" + "\x05\xa3\x69\x60\x91\x36\x98\x57" + "\xba\x0c\x14\xcc\xf3\x2d\x73\x03" + "\xc6\xb2\x5f\xc8\x16\x27\x37\x5d" + "\xd0\x0b\x87\xb2\x50\x94\x7b\x58" + "\x04\xf4\xe0\x7f\x6e\x57\x8e\xc9" + "\x41\x84\xc1\xb1\x7e\x4b\x91\x12" + "\x3a\x8b\x5d\x50\x82\x7b\xcb\xd9" + "\x9a\xd9\x4e\x18\x06\x23\x9e\xd4" + "\xa5\x20\x98\xef\xb5\xda\xe5\xc0" + "\x8a\x6a\x83\x77\x15\x84\x1e\xae" + "\x78\x94\x9d\xdf\xb7\xd1\xea\x67" + "\xaa\xb0\x14\x15\xfa\x67\x21\x84" + "\xd3\x41\x2a\xce\xba\x4b\x4a\xe8" + "\x95\x62\xa9\x55\xf0\x80\xad\xbd" + "\xab\xaf\xdd\x4f\xa5\x7c\x13\x36" + "\xed\x5e\x4f\x72\xad\x4b\xf1\xd0" + "\x88\x4e\xec\x2c\x88\x10\x5e\xea" + "\x12\xc0\x16\x01\x29\xa3\xa0\x55" + "\xaa\x68\xf3\xe9\x9d\x3b\x0d\x3b" + "\x6d\xec\xf8\xa0\x2d\xf0\x90\x8d" + "\x1c\xe2\x88\xd4\x24\x71\xf9\xb3" + "\xc1\x9f\xc5\xd6\x76\x70\xc5\x2e" + "\x9c\xac\xdb\x90\xbd\x83\x72\xba" + "\x6e\xb5\xa5\x53\x83\xa9\xa5\xbf" + "\x7d\x06\x0e\x3c\x2a\xd2\x04\xb5" + "\x1e\x19\x38\x09\x16\xd2\x82\x1f" + "\x75\x18\x56\xb8\x96\x0b\xa6\xf9" + "\xcf\x62\xd9\x32\x5d\xa9\xd7\x1d" + "\xec\xe4\xdf\x1b\xbe\xf1\x36\xee" + "\xe3\x7b\xb5\x2f\xee\xf8\x53\x3d" + "\x6a\xb7\x70\xa9\xfc\x9c\x57\x25" + "\xf2\x89\x10\xd3\xb8\xa8\x8c\x30" + "\xae\x23\x4f\x0e\x13\x66\x4f\xe1" + "\xb6\xc0\xe4\xf8\xef\x93\xbd\x6e" + "\x15\x85\x6b\xe3\x60\x81\x1d\x68" + "\xd7\x31\x87\x89\x09\xab\xd5\x96" + "\x1d\xf3\x6d\x67\x80\xca\x07\x31" + "\x5d\xa7\xe4\xfb\x3e\xf2\x9b\x33" + "\x52\x18\xc8\x30\xfe\x2d\xca\x1e" + "\x79\x92\x7a\x60\x5c\xb6\x58\x87" + "\xa4\x36\xa2\x67\x92\x8b\xa4\xb7" + "\xf1\x86\xdf\xdc\xc0\x7e\x8f\x63" + "\xd2\xa2\xdc\x78\xeb\x4f\xd8\x96" + "\x47\xca\xb8\x91\xf9\xf7\x94\x21" + "\x5f\x9a\x9f\x5b\xb8\x40\x41\x4b" + "\x66\x69\x6a\x72\xd0\xcb\x70\xb7" + "\x93\xb5\x37\x96\x05\x37\x4f\xe5" + "\x8c\xa7\x5a\x4e\x8b\xb7\x84\xea" + "\xc7\xfc\x19\x6e\x1f\x5a\xa1\xac" + "\x18\x7d\x52\x3b\xb3\x34\x62\x99" + "\xe4\x9e\x31\x04\x3f\xc0\x8d\x84" + "\x17\x7c\x25\x48\x52\x67\x11\x27" + "\x67\xbb\x5a\x85\xca\x56\xb2\x5c" + "\xe6\xec\xd5\x96\x3d\x15\xfc\xfb" + "\x22\x25\xf4\x13\xe5\x93\x4b\x9a" + "\x77\xf1\x52\x18\xfa\x16\x5e\x49" + "\x03\x45\xa8\x08\xfa\xb3\x41\x92" + "\x79\x50\x33\xca\xd0\xd7\x42\x55" + "\xc3\x9a\x0c\x4e\xd9\xa4\x3c\x86" + "\x80\x9f\x53\xd1\xa4\x2e\xd1\xbc" + "\xf1\x54\x6e\x93\xa4\x65\x99\x8e" + "\xdf\x29\xc0\x64\x63\x07\xbb\xea", + .ctext =3D "\x9f\x72\x87\xc7\x17\xfb\x20\x15" + "\x65\xb3\x55\xa8\x1c\x8e\x52\x32" + "\xb1\x82\x8d\xbf\xb5\x9f\x10\x0a" + "\xe8\x0c\x70\x62\xef\x89\xb6\x1f" + "\x73\xcc\xe4\xcc\x7a\x3a\x75\x4a" + "\x26\xe7\xf5\xd7\x7b\x17\x39\x2d" + "\xd2\x27\x6e\xf9\x2f\x9e\xe2\xf6" + "\xfa\x16\xc2\xf2\x49\x26\xa7\x5b" + "\xe7\xca\x25\x0e\x45\xa0\x34\xc2" + "\x9a\x37\x79\x7e\x7c\x58\x18\x94" + "\x10\xa8\x7c\x48\xa9\xd7\x63\x89" + "\x9e\x61\x4d\x26\x34\xd9\xf0\xb1" + "\x2d\x17\x2c\x6f\x7c\x35\x0e\xbe" + "\x77\x71\x7c\x17\x5b\xab\x70\xdb" + "\x2f\x54\x0f\xa9\xc8\xf4\xf5\xab" + "\x52\x04\x3a\xb8\x03\xa7\xfd\x57" + "\x45\x5e\xbc\x77\xe1\xee\x79\x8c" + "\x58\x7b\x1f\xf7\x75\xde\x68\x17" + "\x98\x85\x8a\x18\x5c\xd2\x39\x78" + "\x7a\x6f\x26\x6e\xe1\x13\x91\xdd" + "\xdf\x0e\x6e\x67\xcc\x51\x53\xd8" + "\x17\x5e\xce\xa7\xe4\xaf\xfa\xf3" + "\x4f\x9f\x01\x9b\x04\xe7\xfc\xf9" + "\x6a\xdc\x1d\x0c\x9a\xaa\x3a\x7a" + "\x73\x03\xdf\xbf\x3b\x82\xbe\xb0" + "\xb4\xa4\xcf\x07\xd7\xde\x71\x25" + "\xc5\x10\xee\x0a\x15\x96\x8b\x4f" + "\xfe\xb8\x28\xbd\x4a\xcd\xeb\x9f" + "\x5d\x00\xc1\xee\xe8\x16\x44\xec" + "\xe9\x7b\xd6\x85\x17\x29\xcf\x58" + "\x20\xab\xf7\xce\x6b\xe7\x71\x7d" + "\x4f\xa8\xb0\xe9\x7d\x70\xd6\x0b" + "\x2e\x20\xb1\x1a\x63\x37\xaa\x2c" + "\x94\xee\xd5\xf6\x58\x2a\xf4\x7a" + "\x4c\xba\xf5\xe9\x3c\x6f\x95\x13" + "\x5f\x96\x81\x5b\xb5\x62\xf2\xd7" + "\x8d\xbe\xa1\x31\x51\xe6\xfe\xc9" + "\x07\x7d\x0f\x00\x3a\x66\x8c\x4b" + "\x94\xaa\xe5\x56\xde\xcd\x74\xa7" + "\x48\x67\x6f\xed\xc9\x6a\xef\xaf" + "\x9a\xb7\xae\x60\xfa\xc0\x37\x39" + "\xa5\x25\xe5\x22\xea\x82\x55\x68" + "\x3e\x30\xc3\x5a\xb6\x29\x73\x7a" + "\xb6\xfb\x34\xee\x51\x7c\x54\xe5" + "\x01\x4d\x72\x25\x32\x4a\xa3\x68" + "\x80\x9a\x89\xc5\x11\x66\x4c\x8c" + "\x44\x50\xbe\xd7\xa0\xee\xa6\xbb" + "\x92\x0c\xe6\xd7\x83\x51\xb1\x69" + "\x63\x40\xf3\xf4\x92\x84\xc4\x38" + "\x29\xfb\xb4\x84\xa0\x19\x75\x16" + "\x60\xbf\x0a\x9c\x89\xee\xad\xb4" + "\x43\xf9\x71\x39\x45\x7c\x24\x83" + "\x30\xbb\xee\x28\xb0\x86\x7b\xec" + "\x93\xc1\xbf\xb9\x97\x1b\x96\xef" + "\xee\x58\x35\x61\x12\x19\xda\x25" + "\x77\xe5\x80\x1a\x31\x27\x9b\xe4" + "\xda\x8b\x7e\x51\x4d\xcb\x01\x19" + "\x4f\xdc\x92\x1a\x17\xd5\x6b\xf4" + "\x50\xe3\x06\xe4\x76\x9f\x65\x00" + "\xbd\x7a\xe2\x64\x26\xf2\xe4\x7e" + "\x40\xf2\x80\xab\x62\xd5\xef\x23" + "\x8b\xfb\x6f\x24\x6e\x9b\x66\x0e" + "\xf4\x1c\x24\x1e\x1d\x26\x95\x09" + "\x94\x3c\xb2\xb6\x02\xa7\xd9\x9a", + .klen =3D 32, + .len =3D 512, + }, + +}; + #endif /* _CRYPTO_TESTMGR_H */ --=20 2.36.0.464.gb9c8b46e94-goog From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 095B8C433F5 for ; Wed, 4 May 2022 00:20:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:From:Subject:References: Mime-Version:Message-Id:In-Reply-To:Date:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=WwzN3RQ6JqfNeTylr5OjVGYXzXdyuNIhdPGS6vqV28o=; b=xK2uOxL1UMMI4fq3AkcpCcJiYN Z8+KZ6lmquzfni1kDQmIZSAywPdBXHQOgN+vfDseUlRgarjN0M6nrL2VDxrwWBz4V/IX4PaIk193Y NFsm6Z4+9dHK5Wnx/T7DsbUccvRsekFwp25FJSwQSsBrDYK2VhZTjISjfQYgy4M7ftuLgMc48E2SH n92yvcHUt/CPO5effMpSqfda7gezqP+Tu2/6ESgV2p6+yQh9OfSPDvXX9zo4J64Zdrl1YrtyWtaQL jSXxrPSW/hX1h2bI7gFqoh1JhkIqcIMbGdWY5NJ38hYhfQfX6fus2k+Nk9YcWtiPPH3qhr/U7P9TL m0ClTq+Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nm2jb-0089a1-MT; Wed, 04 May 2022 00:19:15 +0000 Received: from mail-yb1-xb49.google.com ([2607:f8b0:4864:20::b49]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nm2j7-0089OE-Et for linux-arm-kernel@lists.infradead.org; Wed, 04 May 2022 00:18:51 +0000 Received: by mail-yb1-xb49.google.com with SMTP id w133-20020a25c78b000000b0064847b10a22so16929112ybe.18 for ; Tue, 03 May 2022 17:18:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc:content-transfer-encoding; bh=3ystt2sBKsPANJIeRlt5KsQj0jKBfsi5eq5UWIBZAUE=; b=h4oP+MzhDFBME5weR8X5Y1WwKDZDW0hqhD+fD2GD63KNq2qZ/MxGXuI5315eARGDCW RkFROGzBygdq0moCSfxvsxdM1TSG4cG37Bn1bJXSuvUBbOqzYAvEz382nFHwbK0lcEx8 rzeyzptDv7RFwQpu5+14yOPZd03Sgb9BikM5ex6LFvJMACw0LyyHJL/VpG1gw4dmPqFn fnr815jSVTYHG641dvqX2MSx8LNpG2/F98aZoQE2qFb3KJZvJ0YCY3cAkfheASb7qZ0G jW0Nq52RGNXEGTeLEOogARTzNtVmI6cJF3Dr+0Cwm2BtIY2GRePmUiZxNDxC2U0IZoKh Z5PA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc:content-transfer-encoding; bh=3ystt2sBKsPANJIeRlt5KsQj0jKBfsi5eq5UWIBZAUE=; b=whDzb4NkgRdaNfyTTJNfQWd9CQvMCOoXc1PJhKHMm5lRQ4DAq4xyqAFIFToJkoDR6/ T9aGxxZ75OD2lZNUxuFKueBL1tK3AOMDl0LDW5skCqBqFM8lsdOBACvhvZ7sBNdr2lRq A/hgPTVes68H7X8ZC/um8SdzikayXhSM+X1lJtM83vwSYyXA+HSnMY+aDhvlrQfcCw9l dhJZbVvRn4VPOeowHU0Dw0KL83/Y3fIuxgiEq3R4czaIbyoCdHvYgklY3JCc2nI9XxUW pJ70nfQdMUGBBbqmuXZYqnN0DXKvesyw7sHUVQ0nW6Z61NhB3h9ZqWwuPEDe7qbN/vXA 874A== X-Gm-Message-State: AOAM531SeEvQdvoJWcQKnyfVc/iO8T79FITmemqjZZ82xeUiuwaYImkh 8xEjng3Kt4Dfvp94cAxy9r1zimZBZg== X-Google-Smtp-Source: ABdhPJzzt0oWK+oOzYapTrfkx0Rysra+IMiORo5BmIHzqEFzviQ+r9SQoKFR9mmwMvMGeZKNoUaXm4mnEg== X-Received: from nhuck.c.googlers.com ([fda3:e722:ac3:cc00:14:4d90:c0a8:39cc]) (user=nhuck job=sendgmr) by 2002:a25:d90c:0:b0:648:dbec:5391 with SMTP id q12-20020a25d90c000000b00648dbec5391mr17143606ybg.309.1651623524254; Tue, 03 May 2022 17:18:44 -0700 (PDT) Date: Wed, 4 May 2022 00:18:17 +0000 In-Reply-To: <20220504001823.2483834-1-nhuck@google.com> Message-Id: <20220504001823.2483834-4-nhuck@google.com> Mime-Version: 1.0 References: <20220504001823.2483834-1-nhuck@google.com> X-Mailer: git-send-email 2.36.0.464.gb9c8b46e94-goog Subject: [PATCH v6 3/9] crypto: hctr2 - Add HCTR2 support From: Nathan Huckleberry To: linux-crypto@vger.kernel.org Cc: linux-fscrypt@vger.kernel.org, Herbert Xu , "David S. Miller" , linux-arm-kernel@lists.infradead.org, Paul Crowley , Eric Biggers , Sami Tolvanen , Ard Biesheuvel , Nathan Huckleberry , Eric Biggers X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220503_171845_565931_F2B2A5D3 X-CRM114-Status: GOOD ( 30.11 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org QWRkIHN1cHBvcnQgZm9yIEhDVFIyIGFzIGEgdGVtcGxhdGUuICBIQ1RSMiBpcyBhIGxlbmd0aC1w cmVzZXJ2aW5nCmVuY3J5cHRpb24gbW9kZSB0aGF0IGlzIGVmZmljaWVudCBvbiBwcm9jZXNzb3Jz IHdpdGggaW5zdHJ1Y3Rpb25zIHRvCmFjY2VsZXJhdGUgQUVTIGFuZCBjYXJyeWxlc3MgbXVsdGlw bGljYXRpb24sIGUuZy4geDg2IHByb2Nlc3NvcnMgd2l0aApBRVMtTkkgYW5kIENMTVVMLCBhbmQg QVJNIHByb2Nlc3NvcnMgd2l0aCB0aGUgQVJNdjggQ3J5cHRvIEV4dGVuc2lvbnMuCgpBcyBhIGxl bmd0aC1wcmVzZXJ2aW5nIGVuY3J5cHRpb24gbW9kZSwgSENUUjIgaXMgc3VpdGFibGUgZm9yCmFw cGxpY2F0aW9ucyBzdWNoIGFzIHN0b3JhZ2UgZW5jcnlwdGlvbiB3aGVyZSBjaXBoZXJ0ZXh0IGV4 cGFuc2lvbiBpcwpub3QgcG9zc2libGUsIGFuZCB0aHVzIGF1dGhlbnRpY2F0ZWQgZW5jcnlwdGlv biBjYW5ub3QgYmUgdXNlZC4KQ3VycmVudGx5LCBzdWNoIGFwcGxpY2F0aW9ucyB1c3VhbGx5IHVz ZSBYVFMsIG9yIGluIHNvbWUgY2FzZXMgQWRpYW50dW0uClhUUyBoYXMgdGhlIGRpc2FkdmFudGFn ZSB0aGF0IGl0IGlzIGEgbmFycm93LWJsb2NrIG1vZGU6IGEgYml0ZmxpcCB3aWxsCm9ubHkgY2hh bmdlIDE2IGJ5dGVzIGluIHRoZSByZXN1bHRpbmcgY2lwaGVydGV4dCBvciBwbGFpbnRleHQuICBU aGlzCnJldmVhbHMgbW9yZSBpbmZvcm1hdGlvbiB0byBhbiBhdHRhY2tlciB0aGFuIG5lY2Vzc2Fy eS4KCkhDVFIyIGlzIGEgd2lkZS1ibG9jayBtb2RlLCBzbyBpdCBwcm92aWRlcyBhIHN0cm9uZ2Vy IHNlY3VyaXR5IHByb3BlcnR5OgphIGJpdGZsaXAgd2lsbCBjaGFuZ2UgdGhlIGVudGlyZSBtZXNz YWdlLiAgSENUUjIgaXMgc29tZXdoYXQgc2ltaWxhciB0bwpBZGlhbnR1bSwgd2hpY2ggaXMgYWxz byBhIHdpZGUtYmxvY2sgbW9kZS4gIEhvd2V2ZXIsIEhDVFIyIGlzIGRlc2lnbmVkCnRvIHRha2Ug YWR2YW50YWdlIG9mIGV4aXN0aW5nIGNyeXB0byBpbnN0cnVjdGlvbnMsIHdoaWxlIEFkaWFudHVt CnRhcmdldHMgZGV2aWNlcyB3aXRob3V0IHN1Y2ggaGFyZHdhcmUgc3VwcG9ydC4gIEFkaWFudHVt IGlzIGFsc28KZGVzaWduZWQgd2l0aCBsb25nZXIgbWVzc2FnZXMgaW4gbWluZCwgd2hpbGUgSENU UjIgaXMgZGVzaWduZWQgdG8gYmUKZWZmaWNpZW50IGV2ZW4gb24gc2hvcnQgbWVzc2FnZXMuCgpI Q1RSMiByZXF1aXJlcyBQT0xZVkFMIGFuZCBYQ1RSIGFzIGNvbXBvbmVudHMuICBNb3JlIGluZm9y bWF0aW9uIG9uCkhDVFIyIGNhbiBiZSBmb3VuZCBoZXJlOiAiTGVuZ3RoLXByZXNlcnZpbmcgZW5j cnlwdGlvbiB3aXRoIEhDVFIyIjoKaHR0cHM6Ly9lcHJpbnQuaWFjci5vcmcvMjAyMS8xNDQxLnBk ZgoKU2lnbmVkLW9mZi1ieTogTmF0aGFuIEh1Y2tsZWJlcnJ5IDxuaHVja0Bnb29nbGUuY29tPgpS ZXZpZXdlZC1ieTogQXJkIEJpZXNoZXV2ZWwgPGFyZGJAa2VybmVsLm9yZz4KUmV2aWV3ZWQtYnk6 IEVyaWMgQmlnZ2VycyA8ZWJpZ2dlcnNAZ29vZ2xlLmNvbT4KLS0tCiBjcnlwdG8vS2NvbmZpZyAg IHwgIDExICsKIGNyeXB0by9NYWtlZmlsZSAgfCAgIDEgKwogY3J5cHRvL2hjdHIyLmMgICB8IDU4 MSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBjcnlwdG8vdGNyeXB0 LmMgIHwgICA1ICsKIGNyeXB0by90ZXN0bWdyLmMgfCAgIDggKwogY3J5cHRvL3Rlc3RtZ3IuaCB8 IDY3MiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogNiBm aWxlcyBjaGFuZ2VkLCAxMjc4IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBjcnlw dG8vaGN0cjIuYwoKZGlmZiAtLWdpdCBhL2NyeXB0by9LY29uZmlnIGIvY3J5cHRvL0tjb25maWcK aW5kZXggMDAxMzk4NDVkNzZkLi4wZGVkYmE3NGRiNGEgMTAwNjQ0Ci0tLSBhL2NyeXB0by9LY29u ZmlnCisrKyBiL2NyeXB0by9LY29uZmlnCkBAIC01MzIsNiArNTMyLDE3IEBAIGNvbmZpZyBDUllQ VE9fQURJQU5UVU0KIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIENSWVBUT19IQ1RS MgorCXRyaXN0YXRlICJIQ1RSMiBzdXBwb3J0IgorCXNlbGVjdCBDUllQVE9fWENUUgorCXNlbGVj dCBDUllQVE9fUE9MWVZBTAorCXNlbGVjdCBDUllQVE9fTUFOQUdFUgorCWhlbHAKKwkgIEhDVFIy IGlzIGEgbGVuZ3RoLXByZXNlcnZpbmcgZW5jcnlwdGlvbiBtb2RlIGZvciBzdG9yYWdlIGVuY3J5 cHRpb24gdGhhdAorCSAgaXMgZWZmaWNpZW50IG9uIHByb2Nlc3NvcnMgd2l0aCBpbnN0cnVjdGlv bnMgdG8gYWNjZWxlcmF0ZSBBRVMgYW5kCisJICBjYXJyeWxlc3MgbXVsdGlwbGljYXRpb24sIGUu Zy4geDg2IHByb2Nlc3NvcnMgd2l0aCBBRVMtTkkgYW5kIENMTVVMLCBhbmQKKwkgIEFSTSBwcm9j ZXNzb3JzIHdpdGggdGhlIEFSTXY4IGNyeXB0byBleHRlbnNpb25zLgorCiBjb25maWcgQ1JZUFRP X0VTU0lWCiAJdHJpc3RhdGUgIkVTU0lWIHN1cHBvcnQgZm9yIGJsb2NrIGVuY3J5cHRpb24iCiAJ c2VsZWN0IENSWVBUT19BVVRIRU5DCmRpZmYgLS1naXQgYS9jcnlwdG8vTWFrZWZpbGUgYi9jcnlw dG8vTWFrZWZpbGUKaW5kZXggNTYxZjkwMWE5MWQ0Li4yZGNhOWRiZGVkZTYgMTAwNjQ0Ci0tLSBh L2NyeXB0by9NYWtlZmlsZQorKysgYi9jcnlwdG8vTWFrZWZpbGUKQEAgLTk0LDYgKzk0LDcgQEAg b2JqLSQoQ09ORklHX0NSWVBUT19MUlcpICs9IGxydy5vCiBvYmotJChDT05GSUdfQ1JZUFRPX1hU UykgKz0geHRzLm8KIG9iai0kKENPTkZJR19DUllQVE9fQ1RSKSArPSBjdHIubwogb2JqLSQoQ09O RklHX0NSWVBUT19YQ1RSKSArPSB4Y3RyLm8KK29iai0kKENPTkZJR19DUllQVE9fSENUUjIpICs9 IGhjdHIyLm8KIG9iai0kKENPTkZJR19DUllQVE9fS0VZV1JBUCkgKz0ga2V5d3JhcC5vCiBvYmot JChDT05GSUdfQ1JZUFRPX0FESUFOVFVNKSArPSBhZGlhbnR1bS5vCiBvYmotJChDT05GSUdfQ1JZ UFRPX05IUE9MWTEzMDUpICs9IG5ocG9seTEzMDUubwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2hjdHIy LmMgYi9jcnlwdG8vaGN0cjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw MDAuLjdkMDBhM2JjYjY2NwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9oY3RyMi5jCkBAIC0w LDAgKzEsNTgxIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAq IEhDVFIyIGxlbmd0aC1wcmVzZXJ2aW5nIGVuY3J5cHRpb24gbW9kZQorICoKKyAqIENvcHlyaWdo dCAyMDIxIEdvb2dsZSBMTEMKKyAqLworCisKKy8qCisgKiBIQ1RSMiBpcyBhIGxlbmd0aC1wcmVz ZXJ2aW5nIGVuY3J5cHRpb24gbW9kZSB0aGF0IGlzIGVmZmljaWVudCBvbgorICogcHJvY2Vzc29y cyB3aXRoIGluc3RydWN0aW9ucyB0byBhY2NlbGVyYXRlIEFFUyBhbmQgY2FycnlsZXNzCisgKiBt dWx0aXBsaWNhdGlvbiwgZS5nLiB4ODYgcHJvY2Vzc29ycyB3aXRoIEFFUy1OSSBhbmQgQ0xNVUws IGFuZCBBUk0KKyAqIHByb2Nlc3NvcnMgd2l0aCB0aGUgQVJNdjggY3J5cHRvIGV4dGVuc2lvbnMu CisgKgorICogRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBwYXBlcjogIkxlbmd0aC1wcmVzZXJ2 aW5nIGVuY3J5cHRpb24gd2l0aCBIQ1RSMiIKKyAqIChodHRwczovL2VwcmludC5pYWNyLm9yZy8y MDIxLzE0NDEucGRmKQorICovCisKKyNpbmNsdWRlIDxjcnlwdG8vaW50ZXJuYWwvY2lwaGVyLmg+ CisjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2hhc2guaD4KKyNpbmNsdWRlIDxjcnlwdG8vaW50 ZXJuYWwvc2tjaXBoZXIuaD4KKyNpbmNsdWRlIDxjcnlwdG8vcG9seXZhbC5oPgorI2luY2x1ZGUg PGNyeXB0by9zY2F0dGVyd2Fsay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjZGVm aW5lIEJMT0NLQ0lQSEVSX0JMT0NLX1NJWkUJCTE2CisKKy8qCisgKiBUaGUgc3BlY2lmaWNhdGlv biBhbGxvd3MgdmFyaWFibGUtbGVuZ3RoIHR3ZWFrcywgYnV0IExpbnV4J3MgY3J5cHRvIEFQSQor ICogY3VycmVudGx5IG9ubHkgYWxsb3dzIGFsZ29yaXRobXMgdG8gc3VwcG9ydCBhIHNpbmdsZSBs ZW5ndGguICBUaGUgIm5hdHVyYWwiCisgKiB0d2VhayBsZW5ndGggZm9yIEhDVFIyIGlzIDE2LCBz aW5jZSB0aGF0IGZpdHMgaW50byBvbmUgUE9MWVZBTCBibG9jayBmb3IKKyAqIHRoZSBiZXN0IHBl cmZvcm1hbmNlLiAgQnV0IGxvbmdlciB0d2Vha3MgYXJlIHVzZWZ1bCBmb3IgZnNjcnlwdCwgdG8g YXZvaWQKKyAqIG5lZWRpbmcgdG8gZGVyaXZlIHBlci1maWxlIGtleXMuICBTbyBpbnN0ZWFkIHdl IHVzZSB0d28gYmxvY2tzLCBvciAzMiBieXRlcy4KKyAqLworI2RlZmluZSBUV0VBS19TSVpFCQkz MgorCitzdHJ1Y3QgaGN0cjJfaW5zdGFuY2VfY3R4IHsKKwlzdHJ1Y3QgY3J5cHRvX2NpcGhlcl9z cGF3biBibG9ja2NpcGhlcl9zcGF3bjsKKwlzdHJ1Y3QgY3J5cHRvX3NrY2lwaGVyX3NwYXduIHhj dHJfc3Bhd247CisJc3RydWN0IGNyeXB0b19zaGFzaF9zcGF3biBwb2x5dmFsX3NwYXduOworfTsK Kworc3RydWN0IGhjdHIyX3RmbV9jdHggeworCXN0cnVjdCBjcnlwdG9fY2lwaGVyICpibG9ja2Np cGhlcjsKKwlzdHJ1Y3QgY3J5cHRvX3NrY2lwaGVyICp4Y3RyOworCXN0cnVjdCBjcnlwdG9fc2hh c2ggKnBvbHl2YWw7CisJdTggTFtCTE9DS0NJUEhFUl9CTE9DS19TSVpFXTsKKwlpbnQgaGFzaGVk X3R3ZWFrX29mZnNldDsKKwkvKgorCSAqIFRoaXMgc3RydWN0IGlzIGFsbG9jYXRlZCB3aXRoIGV4 dHJhIHNwYWNlIGZvciB0d28gZXhwb3J0ZWQgaGFzaAorCSAqIHN0YXRlcy4gIFNpbmNlIHRoZSBo YXNoIHN0YXRlIHNpemUgaXMgbm90IGtub3duIGF0IGNvbXBpbGUtdGltZSwgd2UKKwkgKiBjYW4n dCBhZGQgdGhlc2UgdG8gdGhlIHN0cnVjdCBkaXJlY3RseS4KKwkgKgorCSAqIGhhc2hlZF90d2Vh a2xlbl9kaXZpc2libGU7CisJICogaGFzaGVkX3R3ZWFrbGVuX3JlbWFpbmRlcjsKKwkgKi8KK307 CisKK3N0cnVjdCBoY3RyMl9yZXF1ZXN0X2N0eCB7CisJdTggZmlyc3RfYmxvY2tbQkxPQ0tDSVBI RVJfQkxPQ0tfU0laRV07CisJdTggeGN0cl9pdltCTE9DS0NJUEhFUl9CTE9DS19TSVpFXTsKKwlz dHJ1Y3Qgc2NhdHRlcmxpc3QgKmJ1bGtfcGFydF9kc3Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpi dWxrX3BhcnRfc3JjOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ19zcmNbMl07CisJc3RydWN0IHNj YXR0ZXJsaXN0IHNnX2RzdFsyXTsKKwkvKgorCSAqIFN1Yi1yZXF1ZXN0IHNpemVzIGFyZSB1bmtu b3duIGF0IGNvbXBpbGUtdGltZSwgc28gdGhleSBuZWVkIHRvIGdvCisJICogYWZ0ZXIgdGhlIG1l bWJlcnMgd2l0aCBrbm93biBzaXplcy4KKwkgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBzaGFzaF9k ZXNjIGhhc2hfZGVzYzsKKwkJc3RydWN0IHNrY2lwaGVyX3JlcXVlc3QgeGN0cl9yZXE7CisJfSB1 OworCS8qCisJICogVGhpcyBzdHJ1Y3QgaXMgYWxsb2NhdGVkIHdpdGggZXh0cmEgc3BhY2UgZm9y IG9uZSBleHBvcnRlZCBoYXNoCisJICogc3RhdGUuICBTaW5jZSB0aGUgaGFzaCBzdGF0ZSBzaXpl IGlzIG5vdCBrbm93biBhdCBjb21waWxlLXRpbWUsIHdlCisJICogY2FuJ3QgYWRkIGl0IHRvIHRo ZSBzdHJ1Y3QgZGlyZWN0bHkuCisJICoKKwkgKiBoYXNoZWRfdHdlYWs7CisJICovCit9OworCitz dGF0aWMgaW5saW5lIHU4ICpoY3RyMl9oYXNoZWRfdHdlYWtsZW4oY29uc3Qgc3RydWN0IGhjdHIy X3RmbV9jdHggKnRjdHgsCisJCQkJCWJvb2wgaGFzX3JlbWFpbmRlcikKK3sKKwl1OCAqcCA9ICh1 OCAqKXRjdHggKyBzaXplb2YoKnRjdHgpOworCisJaWYgKGhhc19yZW1haW5kZXIpIC8qIEZvciBt ZXNzYWdlcyBub3QgYSBtdWx0aXBsZSBvZiBibG9jayBsZW5ndGggKi8KKwkJcCArPSBjcnlwdG9f c2hhc2hfc3RhdGVzaXplKHRjdHgtPnBvbHl2YWwpOworCXJldHVybiBwOworfQorCitzdGF0aWMg aW5saW5lIHU4ICpoY3RyMl9oYXNoZWRfdHdlYWsoY29uc3Qgc3RydWN0IGhjdHIyX3RmbV9jdHgg KnRjdHgsCisJCQkJICAgICBzdHJ1Y3QgaGN0cjJfcmVxdWVzdF9jdHggKnJjdHgpCit7CisJcmV0 dXJuICh1OCAqKXJjdHggKyB0Y3R4LT5oYXNoZWRfdHdlYWtfb2Zmc2V0OworfQorCisvKgorICog VGhlIGlucHV0IGRhdGEgZm9yIGVhY2ggSENUUjIgaGFzaCBzdGVwIGJlZ2lucyB3aXRoIGEgMTYt Ynl0ZSBibG9jayB0aGF0CisgKiBjb250YWlucyB0aGUgdHdlYWsgbGVuZ3RoIGFuZCBhIGZsYWcg dGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5wdXQgaXMgZXZlbmx5CisgKiBkaXZpc2libGUg aW50byBibG9ja3MuICBTaW5jZSB0aGlzIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgb25l IHR3ZWFrCisgKiBsZW5ndGgsIHdlIHByZWNvbXB1dGUgdGhlIHR3byBoYXNoIHN0YXRlcyByZXN1 bHRpbmcgZnJvbSBoYXNoaW5nIHRoZSB0d28KKyAqIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGlzIGlu aXRpYWwgYmxvY2suICBUaGlzIHJlZHVjZXMgYnkgb25lIGJsb2NrIHRoZSBhbW91bnQgb2YKKyAq IGRhdGEgdGhhdCBuZWVkcyB0byBiZSBoYXNoZWQgZm9yIGVhY2ggZW5jcnlwdGlvbi9kZWNyeXB0 aW9uCisgKgorICogVGhlc2UgcHJlY29tcHV0ZWQgaGFzaGVzIGFyZSBzdG9yZWQgaW4gaGN0cjJf dGZtX2N0eC4KKyAqLworc3RhdGljIGludCBoY3RyMl9oYXNoX3R3ZWFrbGVuKHN0cnVjdCBoY3Ry Ml90Zm1fY3R4ICp0Y3R4LCBib29sIGhhc19yZW1haW5kZXIpCit7CisJU0hBU0hfREVTQ19PTl9T VEFDSyhzaGFzaCwgdGZtLT5wb2x5dmFsKTsKKwlfX2xlNjQgdHdlYWtfbGVuZ3RoX2Jsb2NrWzJd OworCWludCBlcnI7CisKKwlzaGFzaC0+dGZtID0gdGN0eC0+cG9seXZhbDsKKwltZW1zZXQodHdl YWtfbGVuZ3RoX2Jsb2NrLCAwLCBzaXplb2YodHdlYWtfbGVuZ3RoX2Jsb2NrKSk7CisKKwl0d2Vh a19sZW5ndGhfYmxvY2tbMF0gPSBjcHVfdG9fbGU2NChUV0VBS19TSVpFICogOCAqIDIgKyAyICsg aGFzX3JlbWFpbmRlcik7CisJZXJyID0gY3J5cHRvX3NoYXNoX2luaXQoc2hhc2gpOworCWlmIChl cnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gY3J5cHRvX3NoYXNoX3VwZGF0ZShzaGFzaCwgKHU4 ICopdHdlYWtfbGVuZ3RoX2Jsb2NrLAorCQkJCSAgUE9MWVZBTF9CTE9DS19TSVpFKTsKKwlpZiAo ZXJyKQorCQlyZXR1cm4gZXJyOworCXJldHVybiBjcnlwdG9fc2hhc2hfZXhwb3J0KHNoYXNoLCBo Y3RyMl9oYXNoZWRfdHdlYWtsZW4odGN0eCwgaGFzX3JlbWFpbmRlcikpOworfQorCitzdGF0aWMg aW50IGhjdHIyX3NldGtleShzdHJ1Y3QgY3J5cHRvX3NrY2lwaGVyICp0Zm0sIGNvbnN0IHU4ICpr ZXksCisJCQl1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCXN0cnVjdCBoY3RyMl90Zm1fY3R4ICp0 Y3R4ID0gY3J5cHRvX3NrY2lwaGVyX2N0eCh0Zm0pOworCXU4IGhiYXJbQkxPQ0tDSVBIRVJfQkxP Q0tfU0laRV07CisJaW50IGVycjsKKworCWNyeXB0b19jaXBoZXJfY2xlYXJfZmxhZ3ModGN0eC0+ YmxvY2tjaXBoZXIsIENSWVBUT19URk1fUkVRX01BU0spOworCWNyeXB0b19jaXBoZXJfc2V0X2Zs YWdzKHRjdHgtPmJsb2NrY2lwaGVyLAorCQkJCWNyeXB0b19za2NpcGhlcl9nZXRfZmxhZ3ModGZt KSAmCisJCQkJQ1JZUFRPX1RGTV9SRVFfTUFTSyk7CisJZXJyID0gY3J5cHRvX2NpcGhlcl9zZXRr ZXkodGN0eC0+YmxvY2tjaXBoZXIsIGtleSwga2V5bGVuKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4g ZXJyOworCisJY3J5cHRvX3NrY2lwaGVyX2NsZWFyX2ZsYWdzKHRjdHgtPnhjdHIsIENSWVBUT19U Rk1fUkVRX01BU0spOworCWNyeXB0b19za2NpcGhlcl9zZXRfZmxhZ3ModGN0eC0+eGN0ciwKKwkJ CQkgIGNyeXB0b19za2NpcGhlcl9nZXRfZmxhZ3ModGZtKSAmCisJCQkJICBDUllQVE9fVEZNX1JF UV9NQVNLKTsKKwllcnIgPSBjcnlwdG9fc2tjaXBoZXJfc2V0a2V5KHRjdHgtPnhjdHIsIGtleSwg a2V5bGVuKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbWVtc2V0KGhiYXIsIDAsIHNp emVvZihoYmFyKSk7CisJY3J5cHRvX2NpcGhlcl9lbmNyeXB0X29uZSh0Y3R4LT5ibG9ja2NpcGhl ciwgaGJhciwgaGJhcik7CisKKwltZW1zZXQodGN0eC0+TCwgMCwgc2l6ZW9mKHRjdHgtPkwpKTsK Kwl0Y3R4LT5MWzBdID0gMHgwMTsKKwljcnlwdG9fY2lwaGVyX2VuY3J5cHRfb25lKHRjdHgtPmJs b2NrY2lwaGVyLCB0Y3R4LT5MLCB0Y3R4LT5MKTsKKworCWNyeXB0b19zaGFzaF9jbGVhcl9mbGFn cyh0Y3R4LT5wb2x5dmFsLCBDUllQVE9fVEZNX1JFUV9NQVNLKTsKKwljcnlwdG9fc2hhc2hfc2V0 X2ZsYWdzKHRjdHgtPnBvbHl2YWwsIGNyeXB0b19za2NpcGhlcl9nZXRfZmxhZ3ModGZtKSAmCisJ CQkgICAgICAgQ1JZUFRPX1RGTV9SRVFfTUFTSyk7CisJZXJyID0gY3J5cHRvX3NoYXNoX3NldGtl eSh0Y3R4LT5wb2x5dmFsLCBoYmFyLCBCTE9DS0NJUEhFUl9CTE9DS19TSVpFKTsKKwlpZiAoZXJy KQorCQlyZXR1cm4gZXJyOworCW1lbXplcm9fZXhwbGljaXQoaGJhciwgc2l6ZW9mKGhiYXIpKTsK KworCXJldHVybiBoY3RyMl9oYXNoX3R3ZWFrbGVuKHRjdHgsIHRydWUpID86IGhjdHIyX2hhc2hf dHdlYWtsZW4odGN0eCwgZmFsc2UpOworfQorCitzdGF0aWMgaW50IGhjdHIyX2hhc2hfdHdlYWso c3RydWN0IHNrY2lwaGVyX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgY3J5cHRvX3NrY2lwaGVy ICp0Zm0gPSBjcnlwdG9fc2tjaXBoZXJfcmVxdGZtKHJlcSk7CisJY29uc3Qgc3RydWN0IGhjdHIy X3RmbV9jdHggKnRjdHggPSBjcnlwdG9fc2tjaXBoZXJfY3R4KHRmbSk7CisJc3RydWN0IGhjdHIy X3JlcXVlc3RfY3R4ICpyY3R4ID0gc2tjaXBoZXJfcmVxdWVzdF9jdHgocmVxKTsKKwlzdHJ1Y3Qg c2hhc2hfZGVzYyAqaGFzaF9kZXNjID0gJnJjdHgtPnUuaGFzaF9kZXNjOworCWludCBlcnI7CisJ Ym9vbCBoYXNfcmVtYWluZGVyID0gcmVxLT5jcnlwdGxlbiAlIFBPTFlWQUxfQkxPQ0tfU0laRTsK KworCWhhc2hfZGVzYy0+dGZtID0gdGN0eC0+cG9seXZhbDsKKwllcnIgPSBjcnlwdG9fc2hhc2hf aW1wb3J0KGhhc2hfZGVzYywgaGN0cjJfaGFzaGVkX3R3ZWFrbGVuKHRjdHgsIGhhc19yZW1haW5k ZXIpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWVyciA9IGNyeXB0b19zaGFzaF91cGRh dGUoaGFzaF9kZXNjLCByZXEtPml2LCBUV0VBS19TSVpFKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4g ZXJyOworCisJLy8gU3RvcmUgdGhlIGhhc2hlZCB0d2Vhaywgc2luY2Ugd2UgbmVlZCBpdCB3aGVu IGNvbXB1dGluZyBib3RoCisJLy8gSChUIHx8IE4pIGFuZCBIKFQgfHwgVikuCisJcmV0dXJuIGNy eXB0b19zaGFzaF9leHBvcnQoaGFzaF9kZXNjLCBoY3RyMl9oYXNoZWRfdHdlYWsodGN0eCwgcmN0 eCkpOworfQorCitzdGF0aWMgaW50IGhjdHIyX2hhc2hfbWVzc2FnZShzdHJ1Y3Qgc2tjaXBoZXJf cmVxdWVzdCAqcmVxLAorCQkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCisJCQkgICAg ICB1OCBkaWdlc3RbUE9MWVZBTF9ESUdFU1RfU0laRV0pCit7CisJc3RhdGljIGNvbnN0IHU4IHBh ZGRpbmdbQkxPQ0tDSVBIRVJfQkxPQ0tfU0laRV0gPSB7IDB4MSB9OworCXN0cnVjdCBoY3RyMl9y ZXF1ZXN0X2N0eCAqcmN0eCA9IHNrY2lwaGVyX3JlcXVlc3RfY3R4KHJlcSk7CisJc3RydWN0IHNo YXNoX2Rlc2MgKmhhc2hfZGVzYyA9ICZyY3R4LT51Lmhhc2hfZGVzYzsKKwljb25zdCB1bnNpZ25l ZCBpbnQgYnVsa19sZW4gPSByZXEtPmNyeXB0bGVuIC0gQkxPQ0tDSVBIRVJfQkxPQ0tfU0laRTsK KwlzdHJ1Y3Qgc2dfbWFwcGluZ19pdGVyIG1pdGVyOworCXVuc2lnbmVkIGludCByZW1haW5kZXIg PSBidWxrX2xlbiAlIEJMT0NLQ0lQSEVSX0JMT0NLX1NJWkU7CisJaW50IGk7CisJaW50IGVyciA9 IDA7CisJaW50IG4gPSAwOworCisJc2dfbWl0ZXJfc3RhcnQoJm1pdGVyLCBzZ2wsIHNnX25lbnRz KHNnbCksCisJCSAgICAgICBTR19NSVRFUl9GUk9NX1NHIHwgU0dfTUlURVJfQVRPTUlDKTsKKwlm b3IgKGkgPSAwOyBpIDwgYnVsa19sZW47IGkgKz0gbikgeworCQlzZ19taXRlcl9uZXh0KCZtaXRl cik7CisJCW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIG1pdGVyLmxlbmd0aCwgYnVsa19sZW4gLSBp KTsKKwkJZXJyID0gY3J5cHRvX3NoYXNoX3VwZGF0ZShoYXNoX2Rlc2MsIG1pdGVyLmFkZHIsIG4p OworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJfQorCXNnX21pdGVyX3N0b3AoJm1pdGVyKTsKKwor CWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAocmVtYWluZGVyKSB7CisJCWVyciA9IGNy eXB0b19zaGFzaF91cGRhdGUoaGFzaF9kZXNjLCBwYWRkaW5nLAorCQkJCQkgIEJMT0NLQ0lQSEVS X0JMT0NLX1NJWkUgLSByZW1haW5kZXIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9 CisJcmV0dXJuIGNyeXB0b19zaGFzaF9maW5hbChoYXNoX2Rlc2MsIGRpZ2VzdCk7Cit9CisKK3N0 YXRpYyBpbnQgaGN0cjJfZmluaXNoKHN0cnVjdCBza2NpcGhlcl9yZXF1ZXN0ICpyZXEpCit7CisJ c3RydWN0IGNyeXB0b19za2NpcGhlciAqdGZtID0gY3J5cHRvX3NrY2lwaGVyX3JlcXRmbShyZXEp OworCWNvbnN0IHN0cnVjdCBoY3RyMl90Zm1fY3R4ICp0Y3R4ID0gY3J5cHRvX3NrY2lwaGVyX2N0 eCh0Zm0pOworCXN0cnVjdCBoY3RyMl9yZXF1ZXN0X2N0eCAqcmN0eCA9IHNrY2lwaGVyX3JlcXVl c3RfY3R4KHJlcSk7CisJdTggZGlnZXN0W1BPTFlWQUxfRElHRVNUX1NJWkVdOworCXN0cnVjdCBz aGFzaF9kZXNjICpoYXNoX2Rlc2MgPSAmcmN0eC0+dS5oYXNoX2Rlc2M7CisJaW50IGVycjsKKwor CS8vIFUgPSBVVSBeIEgoVCB8fCBWKQorCS8vIG9yIE0gPSBNTSBeIEgoVCB8fCBOKQorCWhhc2hf ZGVzYy0+dGZtID0gdGN0eC0+cG9seXZhbDsKKwllcnIgPSBjcnlwdG9fc2hhc2hfaW1wb3J0KGhh c2hfZGVzYywgaGN0cjJfaGFzaGVkX3R3ZWFrKHRjdHgsIHJjdHgpKTsKKwlpZiAoZXJyKQorCQly ZXR1cm4gZXJyOworCWVyciA9IGhjdHIyX2hhc2hfbWVzc2FnZShyZXEsIHJjdHgtPmJ1bGtfcGFy dF9kc3QsIGRpZ2VzdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwljcnlwdG9feG9yKHJj dHgtPmZpcnN0X2Jsb2NrLCBkaWdlc3QsIEJMT0NLQ0lQSEVSX0JMT0NLX1NJWkUpOworCisJLy8g Q29weSBVIChvciBNKSBpbnRvIGRzdCBzY2F0dGVybGlzdAorCXNjYXR0ZXJ3YWxrX21hcF9hbmRf Y29weShyY3R4LT5maXJzdF9ibG9jaywgcmVxLT5kc3QsCisJCQkJIDAsIEJMT0NLQ0lQSEVSX0JM T0NLX1NJWkUsIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoY3RyMl94Y3RyX2Rv bmUoc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICphcmVxLAorCQkJCSAgICBpbnQgZXJyKQor eworCXN0cnVjdCBza2NpcGhlcl9yZXF1ZXN0ICpyZXEgPSBhcmVxLT5kYXRhOworCisJaWYgKCFl cnIpCisJCWVyciA9IGhjdHIyX2ZpbmlzaChyZXEpOworCisJc2tjaXBoZXJfcmVxdWVzdF9jb21w bGV0ZShyZXEsIGVycik7Cit9CisKK3N0YXRpYyBpbnQgaGN0cjJfY3J5cHQoc3RydWN0IHNrY2lw aGVyX3JlcXVlc3QgKnJlcSwgYm9vbCBlbmMpCit7CisJc3RydWN0IGNyeXB0b19za2NpcGhlciAq dGZtID0gY3J5cHRvX3NrY2lwaGVyX3JlcXRmbShyZXEpOworCWNvbnN0IHN0cnVjdCBoY3RyMl90 Zm1fY3R4ICp0Y3R4ID0gY3J5cHRvX3NrY2lwaGVyX2N0eCh0Zm0pOworCXN0cnVjdCBoY3RyMl9y ZXF1ZXN0X2N0eCAqcmN0eCA9IHNrY2lwaGVyX3JlcXVlc3RfY3R4KHJlcSk7CisJdTggZGlnZXN0 W1BPTFlWQUxfRElHRVNUX1NJWkVdOworCWludCBidWxrX2xlbiA9IHJlcS0+Y3J5cHRsZW4gLSBC TE9DS0NJUEhFUl9CTE9DS19TSVpFOworCWludCBlcnI7CisKKwkvLyBSZXF1ZXN0cyBtdXN0IGJl IGF0IGxlYXN0IG9uZSBibG9jaworCWlmIChyZXEtPmNyeXB0bGVuIDwgQkxPQ0tDSVBIRVJfQkxP Q0tfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvLyBDb3B5IE0gKG9yIFUpIGludG8gYSB0 ZW1wb3JhcnkgYnVmZmVyCisJc2NhdHRlcndhbGtfbWFwX2FuZF9jb3B5KHJjdHgtPmZpcnN0X2Js b2NrLCByZXEtPnNyYywKKwkJCQkgMCwgQkxPQ0tDSVBIRVJfQkxPQ0tfU0laRSwgMCk7CisKKwkv LyBDcmVhdGUgc2NhdHRlcmxpc3RzIGZvciBOIGFuZCBWCisJcmN0eC0+YnVsa19wYXJ0X3NyYyA9 IHNjYXR0ZXJ3YWxrX2Zmd2QocmN0eC0+c2dfc3JjLCByZXEtPnNyYywKKwkJCQkJICAgICAgIEJM T0NLQ0lQSEVSX0JMT0NLX1NJWkUpOworCXJjdHgtPmJ1bGtfcGFydF9kc3QgPSBzY2F0dGVyd2Fs a19mZndkKHJjdHgtPnNnX2RzdCwgcmVxLT5kc3QsCisJCQkJCSAgICAgICBCTE9DS0NJUEhFUl9C TE9DS19TSVpFKTsKKworCS8vIE1NID0gTSBeIEgoVCB8fCBOKQorCS8vIG9yIFVVID0gVSBeIEgo VCB8fCBWKQorCWVyciA9IGhjdHIyX2hhc2hfdHdlYWsocmVxKTsKKwlpZiAoZXJyKQorCQlyZXR1 cm4gZXJyOworCWVyciA9IGhjdHIyX2hhc2hfbWVzc2FnZShyZXEsIHJjdHgtPmJ1bGtfcGFydF9z cmMsIGRpZ2VzdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwljcnlwdG9feG9yKGRpZ2Vz dCwgcmN0eC0+Zmlyc3RfYmxvY2ssIEJMT0NLQ0lQSEVSX0JMT0NLX1NJWkUpOworCisJLy8gVVUg PSBFKE1NKQorCS8vIG9yIE1NID0gRChVVSkKKwlpZiAoZW5jKQorCQljcnlwdG9fY2lwaGVyX2Vu Y3J5cHRfb25lKHRjdHgtPmJsb2NrY2lwaGVyLCByY3R4LT5maXJzdF9ibG9jaywKKwkJCQkJICBk aWdlc3QpOworCWVsc2UKKwkJY3J5cHRvX2NpcGhlcl9kZWNyeXB0X29uZSh0Y3R4LT5ibG9ja2Np cGhlciwgcmN0eC0+Zmlyc3RfYmxvY2ssCisJCQkJCSAgZGlnZXN0KTsKKworCS8vIFMgPSBNTSBe IFVVIF4gTAorCWNyeXB0b194b3IoZGlnZXN0LCByY3R4LT5maXJzdF9ibG9jaywgQkxPQ0tDSVBI RVJfQkxPQ0tfU0laRSk7CisJY3J5cHRvX3hvcl9jcHkocmN0eC0+eGN0cl9pdiwgZGlnZXN0LCB0 Y3R4LT5MLCBCTE9DS0NJUEhFUl9CTE9DS19TSVpFKTsKKworCS8vIFYgPSBYQ1RSKFMsIE4pCisJ Ly8gb3IgTiA9IFhDVFIoUywgVikKKwlza2NpcGhlcl9yZXF1ZXN0X3NldF90Zm0oJnJjdHgtPnUu eGN0cl9yZXEsIHRjdHgtPnhjdHIpOworCXNrY2lwaGVyX3JlcXVlc3Rfc2V0X2NyeXB0KCZyY3R4 LT51LnhjdHJfcmVxLCByY3R4LT5idWxrX3BhcnRfc3JjLAorCQkJCSAgIHJjdHgtPmJ1bGtfcGFy dF9kc3QsIGJ1bGtfbGVuLAorCQkJCSAgIHJjdHgtPnhjdHJfaXYpOworCXNrY2lwaGVyX3JlcXVl c3Rfc2V0X2NhbGxiYWNrKCZyY3R4LT51LnhjdHJfcmVxLAorCQkJCSAgICAgIHJlcS0+YmFzZS5m bGFncywKKwkJCQkgICAgICBoY3RyMl94Y3RyX2RvbmUsIHJlcSk7CisJcmV0dXJuIGNyeXB0b19z a2NpcGhlcl9lbmNyeXB0KCZyY3R4LT51LnhjdHJfcmVxKSA/OgorCQloY3RyMl9maW5pc2gocmVx KTsKK30KKworc3RhdGljIGludCBoY3RyMl9lbmNyeXB0KHN0cnVjdCBza2NpcGhlcl9yZXF1ZXN0 ICpyZXEpCit7CisJcmV0dXJuIGhjdHIyX2NyeXB0KHJlcSwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBp bnQgaGN0cjJfZGVjcnlwdChzdHJ1Y3Qgc2tjaXBoZXJfcmVxdWVzdCAqcmVxKQoreworCXJldHVy biBoY3RyMl9jcnlwdChyZXEsIGZhbHNlKTsKK30KKworc3RhdGljIGludCBoY3RyMl9pbml0X3Rm bShzdHJ1Y3QgY3J5cHRvX3NrY2lwaGVyICp0Zm0pCit7CisJc3RydWN0IHNrY2lwaGVyX2luc3Rh bmNlICppbnN0ID0gc2tjaXBoZXJfYWxnX2luc3RhbmNlKHRmbSk7CisJc3RydWN0IGhjdHIyX2lu c3RhbmNlX2N0eCAqaWN0eCA9IHNrY2lwaGVyX2luc3RhbmNlX2N0eChpbnN0KTsKKwlzdHJ1Y3Qg aGN0cjJfdGZtX2N0eCAqdGN0eCA9IGNyeXB0b19za2NpcGhlcl9jdHgodGZtKTsKKwlzdHJ1Y3Qg Y3J5cHRvX3NrY2lwaGVyICp4Y3RyOworCXN0cnVjdCBjcnlwdG9fY2lwaGVyICpibG9ja2NpcGhl cjsKKwlzdHJ1Y3QgY3J5cHRvX3NoYXNoICpwb2x5dmFsOworCXVuc2lnbmVkIGludCBzdWJyZXFf c2l6ZTsKKwlpbnQgZXJyOworCisJeGN0ciA9IGNyeXB0b19zcGF3bl9za2NpcGhlcigmaWN0eC0+ eGN0cl9zcGF3bik7CisJaWYgKElTX0VSUih4Y3RyKSkKKwkJcmV0dXJuIFBUUl9FUlIoeGN0cik7 CisKKwlibG9ja2NpcGhlciA9IGNyeXB0b19zcGF3bl9jaXBoZXIoJmljdHgtPmJsb2NrY2lwaGVy X3NwYXduKTsKKwlpZiAoSVNfRVJSKGJsb2NrY2lwaGVyKSkgeworCQllcnIgPSBQVFJfRVJSKGJs b2NrY2lwaGVyKTsKKwkJZ290byBlcnJfZnJlZV94Y3RyOworCX0KKworCXBvbHl2YWwgPSBjcnlw dG9fc3Bhd25fc2hhc2goJmljdHgtPnBvbHl2YWxfc3Bhd24pOworCWlmIChJU19FUlIocG9seXZh bCkpIHsKKwkJZXJyID0gUFRSX0VSUihwb2x5dmFsKTsKKwkJZ290byBlcnJfZnJlZV9ibG9ja2Np cGhlcjsKKwl9CisKKwl0Y3R4LT54Y3RyID0geGN0cjsKKwl0Y3R4LT5ibG9ja2NpcGhlciA9IGJs b2NrY2lwaGVyOworCXRjdHgtPnBvbHl2YWwgPSBwb2x5dmFsOworCisJQlVJTERfQlVHX09OKG9m ZnNldG9mZW5kKHN0cnVjdCBoY3RyMl9yZXF1ZXN0X2N0eCwgdSkgIT0KKwkJCQkgc2l6ZW9mKHN0 cnVjdCBoY3RyMl9yZXF1ZXN0X2N0eCkpOworCXN1YnJlcV9zaXplID0gbWF4KHNpemVvZl9maWVs ZChzdHJ1Y3QgaGN0cjJfcmVxdWVzdF9jdHgsIHUuaGFzaF9kZXNjKSArCisJCQkgIGNyeXB0b19z aGFzaF9kZXNjc2l6ZShwb2x5dmFsKSwKKwkJCSAgc2l6ZW9mX2ZpZWxkKHN0cnVjdCBoY3RyMl9y ZXF1ZXN0X2N0eCwgdS54Y3RyX3JlcSkgKworCQkJICBjcnlwdG9fc2tjaXBoZXJfcmVxc2l6ZSh4 Y3RyKSk7CisKKwl0Y3R4LT5oYXNoZWRfdHdlYWtfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGhj dHIyX3JlcXVlc3RfY3R4LCB1KSArCisJCQkJICAgIHN1YnJlcV9zaXplOworCWNyeXB0b19za2Np cGhlcl9zZXRfcmVxc2l6ZSh0Zm0sIHRjdHgtPmhhc2hlZF90d2Vha19vZmZzZXQgKworCQkJCSAg ICBjcnlwdG9fc2hhc2hfc3RhdGVzaXplKHBvbHl2YWwpKTsKKwlyZXR1cm4gMDsKKworZXJyX2Zy ZWVfYmxvY2tjaXBoZXI6CisJY3J5cHRvX2ZyZWVfY2lwaGVyKGJsb2NrY2lwaGVyKTsKK2Vycl9m cmVlX3hjdHI6CisJY3J5cHRvX2ZyZWVfc2tjaXBoZXIoeGN0cik7CisJcmV0dXJuIGVycjsKK30K Kworc3RhdGljIHZvaWQgaGN0cjJfZXhpdF90Zm0oc3RydWN0IGNyeXB0b19za2NpcGhlciAqdGZt KQoreworCXN0cnVjdCBoY3RyMl90Zm1fY3R4ICp0Y3R4ID0gY3J5cHRvX3NrY2lwaGVyX2N0eCh0 Zm0pOworCisJY3J5cHRvX2ZyZWVfY2lwaGVyKHRjdHgtPmJsb2NrY2lwaGVyKTsKKwljcnlwdG9f ZnJlZV9za2NpcGhlcih0Y3R4LT54Y3RyKTsKKwljcnlwdG9fZnJlZV9zaGFzaCh0Y3R4LT5wb2x5 dmFsKTsKK30KKworc3RhdGljIHZvaWQgaGN0cjJfZnJlZV9pbnN0YW5jZShzdHJ1Y3Qgc2tjaXBo ZXJfaW5zdGFuY2UgKmluc3QpCit7CisJc3RydWN0IGhjdHIyX2luc3RhbmNlX2N0eCAqaWN0eCA9 IHNrY2lwaGVyX2luc3RhbmNlX2N0eChpbnN0KTsKKworCWNyeXB0b19kcm9wX2NpcGhlcigmaWN0 eC0+YmxvY2tjaXBoZXJfc3Bhd24pOworCWNyeXB0b19kcm9wX3NrY2lwaGVyKCZpY3R4LT54Y3Ry X3NwYXduKTsKKwljcnlwdG9fZHJvcF9zaGFzaCgmaWN0eC0+cG9seXZhbF9zcGF3bik7CisJa2Zy ZWUoaW5zdCk7Cit9CisKK3N0YXRpYyBpbnQgaGN0cjJfY3JlYXRlX2NvbW1vbihzdHJ1Y3QgY3J5 cHRvX3RlbXBsYXRlICp0bXBsLAorCQkJICAgICAgIHN0cnVjdCBydGF0dHIgKip0YiwKKwkJCSAg ICAgICBjb25zdCBjaGFyICp4Y3RyX25hbWUsCisJCQkgICAgICAgY29uc3QgY2hhciAqcG9seXZh bF9uYW1lKQoreworCXUzMiBtYXNrOworCXN0cnVjdCBza2NpcGhlcl9pbnN0YW5jZSAqaW5zdDsK KwlzdHJ1Y3QgaGN0cjJfaW5zdGFuY2VfY3R4ICppY3R4OworCXN0cnVjdCBza2NpcGhlcl9hbGcg KnhjdHJfYWxnOworCXN0cnVjdCBjcnlwdG9fYWxnICpibG9ja2NpcGhlcl9hbGc7CisJc3RydWN0 IHNoYXNoX2FsZyAqcG9seXZhbF9hbGc7CisJY2hhciBibG9ja2NpcGhlcl9uYW1lW0NSWVBUT19N QVhfQUxHX05BTUVdOworCWludCBsZW47CisJaW50IGVycjsKKworCWVyciA9IGNyeXB0b19jaGVj a19hdHRyX3R5cGUodGIsIENSWVBUT19BTEdfVFlQRV9TS0NJUEhFUiwgJm1hc2spOworCWlmIChl cnIpCisJCXJldHVybiBlcnI7CisKKwlpbnN0ID0ga3phbGxvYyhzaXplb2YoKmluc3QpICsgc2l6 ZW9mKCppY3R4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbnN0KQorCQlyZXR1cm4gLUVOT01FTTsK KwlpY3R4ID0gc2tjaXBoZXJfaW5zdGFuY2VfY3R4KGluc3QpOworCisJLyogU3RyZWFtIGNpcGhl ciwgeGN0cihibG9ja19jaXBoZXIpICovCisJZXJyID0gY3J5cHRvX2dyYWJfc2tjaXBoZXIoJmlj dHgtPnhjdHJfc3Bhd24sCisJCQkJICAgc2tjaXBoZXJfY3J5cHRvX2luc3RhbmNlKGluc3QpLAor CQkJCSAgIHhjdHJfbmFtZSwgMCwgbWFzayk7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV9p bnN0OworCXhjdHJfYWxnID0gY3J5cHRvX3NwYXduX3NrY2lwaGVyX2FsZygmaWN0eC0+eGN0cl9z cGF3bik7CisKKwllcnIgPSAtRUlOVkFMOworCWlmIChzdHJuY21wKHhjdHJfYWxnLT5iYXNlLmNy YV9uYW1lLCAieGN0cigiLCA1KSkKKwkJZ290byBlcnJfZnJlZV9pbnN0OworCWxlbiA9IHN0cnNj cHkoYmxvY2tjaXBoZXJfbmFtZSwgeGN0cl9hbGctPmJhc2UuY3JhX25hbWUgKyA1LAorCQkgICAg ICBzaXplb2YoYmxvY2tjaXBoZXJfbmFtZSkpOworCWlmIChsZW4gPCAxKQorCQlnb3RvIGVycl9m cmVlX2luc3Q7CisJaWYgKGJsb2NrY2lwaGVyX25hbWVbbGVuIC0gMV0gIT0gJyknKQorCQlnb3Rv IGVycl9mcmVlX2luc3Q7CisJYmxvY2tjaXBoZXJfbmFtZVtsZW4gLSAxXSA9IDA7CisKKwkvKiBC bG9jayBjaXBoZXIsIGUuZy4gImFlcyIgKi8KKwllcnIgPSBjcnlwdG9fZ3JhYl9jaXBoZXIoJmlj dHgtPmJsb2NrY2lwaGVyX3NwYXduLAorCQkJCSBza2NpcGhlcl9jcnlwdG9faW5zdGFuY2UoaW5z dCksCisJCQkJIGJsb2NrY2lwaGVyX25hbWUsIDAsIG1hc2spOworCWlmIChlcnIpCisJCWdvdG8g ZXJyX2ZyZWVfaW5zdDsKKwlibG9ja2NpcGhlcl9hbGcgPSBjcnlwdG9fc3Bhd25fY2lwaGVyX2Fs ZygmaWN0eC0+YmxvY2tjaXBoZXJfc3Bhd24pOworCisJLyogUmVxdWlyZSBibG9ja3NpemUgb2Yg MTYgYnl0ZXMgKi8KKwllcnIgPSAtRUlOVkFMOworCWlmIChibG9ja2NpcGhlcl9hbGctPmNyYV9i bG9ja3NpemUgIT0gQkxPQ0tDSVBIRVJfQkxPQ0tfU0laRSkKKwkJZ290byBlcnJfZnJlZV9pbnN0 OworCisJLyogUG9seXZhbCDOtS3iiIZVIGhhc2ggZnVuY3Rpb24gKi8KKwllcnIgPSBjcnlwdG9f Z3JhYl9zaGFzaCgmaWN0eC0+cG9seXZhbF9zcGF3biwKKwkJCQlza2NpcGhlcl9jcnlwdG9faW5z dGFuY2UoaW5zdCksCisJCQkJcG9seXZhbF9uYW1lLCAwLCBtYXNrKTsKKwlpZiAoZXJyKQorCQln b3RvIGVycl9mcmVlX2luc3Q7CisJcG9seXZhbF9hbGcgPSBjcnlwdG9fc3Bhd25fc2hhc2hfYWxn KCZpY3R4LT5wb2x5dmFsX3NwYXduKTsKKworCS8qIEVuc3VyZSBQb2x5dmFsIGlzIGJlaW5nIHVz ZWQgKi8KKwllcnIgPSAtRUlOVkFMOworCWlmIChzdHJjbXAocG9seXZhbF9hbGctPmJhc2UuY3Jh X25hbWUsICJwb2x5dmFsIikgIT0gMCkKKwkJZ290byBlcnJfZnJlZV9pbnN0OworCisJLyogSW5z dGFuY2UgZmllbGRzICovCisKKwllcnIgPSAtRU5BTUVUT09MT05HOworCWlmIChzbnByaW50Zihp bnN0LT5hbGcuYmFzZS5jcmFfbmFtZSwgQ1JZUFRPX01BWF9BTEdfTkFNRSwgImhjdHIyKCVzKSIs CisJCSAgICAgYmxvY2tjaXBoZXJfYWxnLT5jcmFfbmFtZSkgPj0gQ1JZUFRPX01BWF9BTEdfTkFN RSkKKwkJZ290byBlcnJfZnJlZV9pbnN0OworCWlmIChzbnByaW50ZihpbnN0LT5hbGcuYmFzZS5j cmFfZHJpdmVyX25hbWUsIENSWVBUT19NQVhfQUxHX05BTUUsCisJCSAgICAgImhjdHIyX2Jhc2Uo JXMsJXMpIiwKKwkJICAgICB4Y3RyX2FsZy0+YmFzZS5jcmFfZHJpdmVyX25hbWUsCisJCSAgICAg cG9seXZhbF9hbGctPmJhc2UuY3JhX2RyaXZlcl9uYW1lKSA+PSBDUllQVE9fTUFYX0FMR19OQU1F KQorCQlnb3RvIGVycl9mcmVlX2luc3Q7CisKKwlpbnN0LT5hbGcuYmFzZS5jcmFfYmxvY2tzaXpl ID0gQkxPQ0tDSVBIRVJfQkxPQ0tfU0laRTsKKwlpbnN0LT5hbGcuYmFzZS5jcmFfY3R4c2l6ZSA9 IHNpemVvZihzdHJ1Y3QgaGN0cjJfdGZtX2N0eCkgKworCQkJCSAgICAgcG9seXZhbF9hbGctPnN0 YXRlc2l6ZSAqIDI7CisJaW5zdC0+YWxnLmJhc2UuY3JhX2FsaWdubWFzayA9IHhjdHJfYWxnLT5i YXNlLmNyYV9hbGlnbm1hc2sgfAorCQkJCSAgICAgICBwb2x5dmFsX2FsZy0+YmFzZS5jcmFfYWxp Z25tYXNrOworCS8qCisJICogVGhlIGhhc2ggZnVuY3Rpb24gaXMgY2FsbGVkIHR3aWNlLCBzbyBp dCBpcyB3ZWlnaHRlZCBoaWdoZXIgdGhhbiB0aGUKKwkgKiB4Y3RyIGFuZCBibG9ja2NpcGhlci4K KwkgKi8KKwlpbnN0LT5hbGcuYmFzZS5jcmFfcHJpb3JpdHkgPSAoMiAqIHhjdHJfYWxnLT5iYXNl LmNyYV9wcmlvcml0eSArCisJCQkJICAgICAgIDQgKiBwb2x5dmFsX2FsZy0+YmFzZS5jcmFfcHJp b3JpdHkgKworCQkJCSAgICAgICBibG9ja2NpcGhlcl9hbGctPmNyYV9wcmlvcml0eSkgLyA3Owor CisJaW5zdC0+YWxnLnNldGtleSA9IGhjdHIyX3NldGtleTsKKwlpbnN0LT5hbGcuZW5jcnlwdCA9 IGhjdHIyX2VuY3J5cHQ7CisJaW5zdC0+YWxnLmRlY3J5cHQgPSBoY3RyMl9kZWNyeXB0OworCWlu c3QtPmFsZy5pbml0ID0gaGN0cjJfaW5pdF90Zm07CisJaW5zdC0+YWxnLmV4aXQgPSBoY3RyMl9l eGl0X3RmbTsKKwlpbnN0LT5hbGcubWluX2tleXNpemUgPSBjcnlwdG9fc2tjaXBoZXJfYWxnX21p bl9rZXlzaXplKHhjdHJfYWxnKTsKKwlpbnN0LT5hbGcubWF4X2tleXNpemUgPSBjcnlwdG9fc2tj aXBoZXJfYWxnX21heF9rZXlzaXplKHhjdHJfYWxnKTsKKwlpbnN0LT5hbGcuaXZzaXplID0gVFdF QUtfU0laRTsKKworCWluc3QtPmZyZWUgPSBoY3RyMl9mcmVlX2luc3RhbmNlOworCisJZXJyID0g c2tjaXBoZXJfcmVnaXN0ZXJfaW5zdGFuY2UodG1wbCwgaW5zdCk7CisJaWYgKGVycikgeworZXJy X2ZyZWVfaW5zdDoKKwkJaGN0cjJfZnJlZV9pbnN0YW5jZShpbnN0KTsKKwl9CisJcmV0dXJuIGVy cjsKK30KKworc3RhdGljIGludCBoY3RyMl9jcmVhdGVfYmFzZShzdHJ1Y3QgY3J5cHRvX3RlbXBs YXRlICp0bXBsLCBzdHJ1Y3QgcnRhdHRyICoqdGIpCit7CisJY29uc3QgY2hhciAqeGN0cl9uYW1l OworCWNvbnN0IGNoYXIgKnBvbHl2YWxfbmFtZTsKKworCXhjdHJfbmFtZSA9IGNyeXB0b19hdHRy X2FsZ19uYW1lKHRiWzFdKTsKKwlpZiAoSVNfRVJSKHhjdHJfbmFtZSkpCisJCXJldHVybiBQVFJf RVJSKHhjdHJfbmFtZSk7CisKKwlwb2x5dmFsX25hbWUgPSBjcnlwdG9fYXR0cl9hbGdfbmFtZSh0 YlsyXSk7CisJaWYgKElTX0VSUihwb2x5dmFsX25hbWUpKQorCQlyZXR1cm4gUFRSX0VSUihwb2x5 dmFsX25hbWUpOworCisJcmV0dXJuIGhjdHIyX2NyZWF0ZV9jb21tb24odG1wbCwgdGIsIHhjdHJf bmFtZSwgcG9seXZhbF9uYW1lKTsKK30KKworc3RhdGljIGludCBoY3RyMl9jcmVhdGUoc3RydWN0 IGNyeXB0b190ZW1wbGF0ZSAqdG1wbCwgc3RydWN0IHJ0YXR0ciAqKnRiKQoreworCWNvbnN0IGNo YXIgKmJsb2NrY2lwaGVyX25hbWU7CisJY2hhciB4Y3RyX25hbWVbQ1JZUFRPX01BWF9BTEdfTkFN RV07CisKKwlibG9ja2NpcGhlcl9uYW1lID0gY3J5cHRvX2F0dHJfYWxnX25hbWUodGJbMV0pOwor CWlmIChJU19FUlIoYmxvY2tjaXBoZXJfbmFtZSkpCisJCXJldHVybiBQVFJfRVJSKGJsb2NrY2lw aGVyX25hbWUpOworCisJaWYgKHNucHJpbnRmKHhjdHJfbmFtZSwgQ1JZUFRPX01BWF9BTEdfTkFN RSwgInhjdHIoJXMpIiwKKwkJICAgIGJsb2NrY2lwaGVyX25hbWUpID49IENSWVBUT19NQVhfQUxH X05BTUUpCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJcmV0dXJuIGhjdHIyX2NyZWF0ZV9j b21tb24odG1wbCwgdGIsIHhjdHJfbmFtZSwgInBvbHl2YWwiKTsKK30KKworc3RhdGljIHN0cnVj dCBjcnlwdG9fdGVtcGxhdGUgaGN0cjJfdG1wbHNbXSA9IHsKKwl7CisJCS8qIGhjdHIyX2Jhc2Uo eGN0cl9uYW1lLCBwb2x5dmFsX25hbWUpICovCisJCS5uYW1lID0gImhjdHIyX2Jhc2UiLAorCQku Y3JlYXRlID0gaGN0cjJfY3JlYXRlX2Jhc2UsCisJCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKKwl9 LCB7CisJCS8qIGhjdHIyKGJsb2NrY2lwaGVyX25hbWUpICovCisJCS5uYW1lID0gImhjdHIyIiwK KwkJLmNyZWF0ZSA9IGhjdHIyX2NyZWF0ZSwKKwkJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAorCX0K K307CisKK3N0YXRpYyBpbnQgX19pbml0IGhjdHIyX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0 dXJuIGNyeXB0b19yZWdpc3Rlcl90ZW1wbGF0ZXMoaGN0cjJfdG1wbHMsIEFSUkFZX1NJWkUoaGN0 cjJfdG1wbHMpKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGhjdHIyX21vZHVsZV9leGl0KHZv aWQpCit7CisJcmV0dXJuIGNyeXB0b191bnJlZ2lzdGVyX3RlbXBsYXRlcyhoY3RyMl90bXBscywK KwkJCQkJICAgQVJSQVlfU0laRShoY3RyMl90bXBscykpOworfQorCitzdWJzeXNfaW5pdGNhbGwo aGN0cjJfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoaGN0cjJfbW9kdWxlX2V4aXQpOworCitN T0RVTEVfREVTQ1JJUFRJT04oIkhDVFIyIGxlbmd0aC1wcmVzZXJ2aW5nIGVuY3J5cHRpb24gbW9k ZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTX0NSWVBUTygiaGN0 cjIiKTsKK01PRFVMRV9JTVBPUlRfTlMoQ1JZUFRPX0lOVEVSTkFMKTsKZGlmZiAtLWdpdCBhL2Ny eXB0by90Y3J5cHQuYyBiL2NyeXB0by90Y3J5cHQuYwppbmRleCBkZDljZjIxNjAyOWIuLjMzNjU5 OGRhOGVhYyAxMDA2NDQKLS0tIGEvY3J5cHRvL3RjcnlwdC5jCisrKyBiL2NyeXB0by90Y3J5cHQu YwpAQCAtMjE5MSw2ICsyMTkxLDExIEBAIHN0YXRpYyBpbnQgZG9fdGVzdChjb25zdCBjaGFyICph bGcsIHUzMiB0eXBlLCB1MzIgbWFzaywgaW50IG0sIHUzMiBudW1fbWIpCiAJCQkJICAgMTYsIDE2 LCBhZWFkX3NwZWVkX3RlbXBsYXRlXzE5LCBudW1fbWIpOwogCQlicmVhazsKIAorCWNhc2UgMjI2 OgorCQl0ZXN0X2NpcGhlcl9zcGVlZCgiaGN0cjIoYWVzKSIsIEVOQ1JZUFQsIHNlYywgTlVMTCwK KwkJCQkgIDAsIHNwZWVkX3RlbXBsYXRlXzMyKTsKKwkJYnJlYWs7CisKIAljYXNlIDMwMDoKIAkJ aWYgKGFsZykgewogCQkJdGVzdF9oYXNoX3NwZWVkKGFsZywgc2VjLCBnZW5lcmljX2hhc2hfc3Bl ZWRfdGVtcGxhdGUpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3Rlc3RtZ3IuYyBiL2NyeXB0by90ZXN0 bWdyLmMKaW5kZXggZDgwN2IyMDBlZGY2Li4zMjQ0YjdlNWFhN2UgMTAwNjQ0Ci0tLSBhL2NyeXB0 by90ZXN0bWdyLmMKKysrIGIvY3J5cHRvL3Rlc3RtZ3IuYwpAQCAtNTAzMCw2ICs1MDMwLDE0IEBA IHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxnX3Rlc3RfZGVzYyBhbGdfdGVzdF9kZXNjc1tdID0gewog CQkuc3VpdGUgPSB7CiAJCQkuaGFzaCA9IF9fVkVDUyhnaGFzaF90dl90ZW1wbGF0ZSkKIAkJfQor CX0sIHsKKwkJLmFsZyA9ICJoY3RyMihhZXMpIiwKKwkJLmdlbmVyaWNfZHJpdmVyID0KKwkJICAg ICJoY3RyMl9iYXNlKHhjdHIoYWVzLWdlbmVyaWMpLHBvbHl2YWwtZ2VuZXJpYykiLAorCQkudGVz dCA9IGFsZ190ZXN0X3NrY2lwaGVyLAorCQkuc3VpdGUgPSB7CisJCQkuY2lwaGVyID0gX19WRUNT KGFlc19oY3RyMl90dl90ZW1wbGF0ZSkKKwkJfQogCX0sIHsKIAkJLmFsZyA9ICJobWFjKG1kNSki LAogCQkudGVzdCA9IGFsZ190ZXN0X2hhc2gsCmRpZmYgLS1naXQgYS9jcnlwdG8vdGVzdG1nci5o IGIvY3J5cHRvL3Rlc3RtZ3IuaAppbmRleCBjNTgxZTU0MDU5MTYuLjEzYzcwZGRlMmY4OSAxMDA2 NDQKLS0tIGEvY3J5cHRvL3Rlc3RtZ3IuaAorKysgYi9jcnlwdG8vdGVzdG1nci5oCkBAIC0zNTEw MCw0ICszNTEwMCw2NzYgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBoYXNoX3Rlc3R2ZWMgcG9seXZh bF90dl90ZW1wbGF0ZVtdID0gewogCiB9OwogCisvKgorICogVGVzdCB2ZWN0b3JzIGdlbmVyYXRl ZCB1c2luZyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2hjdHIyCisgKi8KK3N0YXRpYyBjb25z dCBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgYWVzX2hjdHIyX3R2X3RlbXBsYXRlW10gPSB7CisJewor CQkua2V5CT0gIlx4ZTFceDE1XHg2Nlx4M2NceDhkXHhjNlx4M2FceGZmIgorCQkJICAiXHhlZlx4 NDFceGQ3XHg0N1x4YTJceGNjXHg4YVx4YmEiLAorCQkuaXYJPSAiXHhjM1x4YmVceDJhXHhjYlx4 YjVceDM5XHg4Nlx4ZjEiCisJCQkgICJceDkxXHhhZFx4NmNceGY0XHhkZVx4NzRceDQ1XHg2MyIK KwkJCSAgIlx4NWNceDdhXHhkNVx4Y2NceDhiXHg3Nlx4ZWZceDBlIgorCQkJICAiXHhjZlx4MmNc eDYwXHg2OVx4MzdceGZkXHgwN1x4OTYiLAorCQkucHRleHQJPSAiXHg2NVx4NzVceGFlXHhkM1x4 ZTJceGJjXHg0M1x4NWMiCisJCQkgICJceGIzXHgxYVx4ZDhceDA1XHhjM1x4ZDBceDU2XHgyOSIs CisJCS5jdGV4dAk9ICJceDExXHg5MVx4ZWFceDc0XHg1OFx4Y2NceGQ1XHhhMiIKKwkJCSAgIlx4 ZDBceDU1XHg5ZVx4M2RceGZlXHg3Zlx4YzhceGZlIiwKKwkJLmtsZW4JPSAxNiwKKwkJLmxlbgk9 IDE2LAorCX0sCisJeworCQkua2V5CT0gIlx4ZTdceGQxXHg3N1x4NDhceDc2XHgwYlx4Y2RceDM0 IgorCQkJICAiXHgyYVx4MmRceGU3XHg3NFx4Y2FceDExXHg5Y1x4YWUiLAorCQkuaXYJPSAiXHg3 MVx4MWNceDQ5XHg2Mlx4ZDlceDViXHg1MFx4NWUiCisJCQkgICJceDY4XHg4N1x4YmNceGY2XHg4 OVx4ZmZceGVkXHgzMCIKKwkJCSAgIlx4ZTRceGU1XHhiZFx4YjZceDEwXHg0Zlx4OWZceDY2Igor CQkJICAiXHgyOFx4MDZceDVhXHhmNFx4MjdceDM1XHhjZFx4ZTUiLAorCQkucHRleHQJPSAiXHg4 N1x4MDNceDhmXHgwNlx4YThceDYxXHg1NFx4ZGEiCisJCQkgICJceDAxXHg0NVx4ZDRceDAxXHhl Zlx4NGFceDIyXHhjZiIKKwkJCSAgIlx4NzhceDE1XHg5Zlx4YmRceDY0XHhiZFx4MmNceGI5Igor CQkJICAiXHg0MFx4MWRceDcyXHhhZVx4NTNceDYzXHhhNSIsCisJCS5jdGV4dAk9ICJceDRlXHhh MVx4MDVceDI3XHhiOFx4NDVceGU0XHhhMSIKKwkJCSAgIlx4YmJceDMwXHhiNFx4YTZceDEyXHg3 NFx4NjNceGQ2IgorCQkJICAiXHgxN1x4YzlceGNjXHgyZlx4MThceDY0XHhlMFx4MDYiCisJCQkg ICJceDBhXHhhMFx4ZmZceDcyXHgxMFx4N2JceDIyIiwKKwkJLmtsZW4JPSAxNiwKKwkJLmxlbgk9 IDMxLAorCX0sCisJeworCQkua2V5CT0gIlx4NTlceDY1XHgzYlx4MWRceDQzXHg1ZVx4YzBceGFl IgorCQkJICAiXHhiOFx4OWRceDliXHhkZFx4MjJceDAzXHhiZlx4Y2EiLAorCQkuaXYJPSAiXHhl Y1x4OTVceGZhXHg1YVx4Y2ZceDVlXHhkMlx4OTMiCisJCQkgICJceGEzXHhiNVx4ZTVceGJlXHhm M1x4MDFceDdiXHgwMSIKKwkJCSAgIlx4ZDFceGNhXHg2Y1x4MDZceDgyXHhmMFx4YmRceDY3Igor CQkJICAiXHhkOVx4NmNceGE0XHhkY1x4YjRceDM4XHgwZlx4NzQiLAorCQkucHRleHQJPSAiXHg0 NVx4ZGZceDc1XHg4N1x4YmNceDcyXHhjZVx4NTUiCisJCQkgICJceGM5XHhmYVx4Y2JceGZjXHg5 Zlx4NDBceDgyXHgyYiIKKwkJCSAgIlx4YzZceDRmXHg0Zlx4NWJceDhiXHgzYlx4NmRceDY3Igor CQkJICAiXHhhNlx4OTNceDYyXHg4OVx4OGNceDE5XHhmNFx4ZTMiCisJCQkgICJceDA4XHg5Mlx4 OWNceGM5XHg0N1x4MmNceDZlXHhkMCIKKwkJCSAgIlx4YTNceDAyXHgyYlx4ZGJceDJjXHhmMlx4 OGRceDQ2IgorCQkJICAiXHhjZFx4YjBceDlkXHgyNlx4NjNceDRjXHg0MFx4NmIiCisJCQkgICJc eDc5XHg0M1x4ZTVceGNlXHg0Mlx4YThceGVjXHgzYiIKKwkJCSAgIlx4NWJceGQwXHhlYVx4YTRc eGU2XHhkYlx4NjZceDU1IgorCQkJICAiXHg3YVx4NzZceGVjXHhhYlx4N2RceDJhXHgyYlx4YmQi CisJCQkgICJceGE5XHhhYlx4MjJceDY0XHgxYVx4YTFceGFlXHg4NCIKKwkJCSAgIlx4ODZceDc5 XHg2N1x4ZTlceGIyXHg1MFx4YmVceDEyIgorCQkJICAiXHgyZlx4YjJceDE0XHhmMFx4ZGJceDcx XHhkOFx4YTciCisJCQkgICJceDQxXHg4YVx4ODhceGEwXHg2YVx4NmVceDlkXHgyYSIKKwkJCSAg Ilx4ZmFceDExXHgzN1x4NDBceDMyXHgwOVx4NGNceDQ3IgorCQkJICAiXHg0MVx4MDdceDMxXHg4 NVx4M2RceGE4XHhmN1x4NjQiLAorCQkuY3RleHQJPSAiXHgyZFx4NGJceDlmXHg5M1x4Y2FceDVh XHg0OFx4MjYiCisJCQkgICJceDAxXHhjY1x4NTRceGU0XHgzMVx4NTBceDEyXHhmMCIKKwkJCSAg Ilx4NDlceGZmXHg1OVx4NDJceDY4XHhiZFx4ODdceDhmIgorCQkJICAiXHg5ZVx4NjJceDk2XHhj ZFx4YjlceDI0XHg1N1x4YTQiCisJCQkgICJceDBiXHg3Ylx4ZjVceDJlXHgwZVx4YThceDY1XHgw NyIKKwkJCSAgIlx4YWJceDA1XHhkNVx4Y2FceGU3XHg5Y1x4NmNceDM0IgorCQkJICAiXHg1ZFx4 NDJceDM0XHhhNFx4NjJceGU5XHg3NVx4NDgiCisJCQkgICJceDNkXHg5ZVx4OGZceGZhXHg0Mlx4 ZTlceDc1XHgwOCIKKwkJCSAgIlx4NGVceDU0XHg5MVx4MmJceGJkXHgxMVx4MGZceDhlIgorCQkJ ICAiXHhmMFx4ODJceGY1XHgyNFx4ZjFceGM0XHhmY1x4YWUiCisJCQkgICJceDQyXHg1NFx4N2Zc eGNlXHgxNVx4YThceGIyXHgzMyIKKwkJCSAgIlx4YzBceDg2XHhiNlx4MmJceGU4XHg0NFx4Y2Vc eDFmIgorCQkJICAiXHg2OFx4NTdceDY2XHg5NFx4NmVceGFkXHhlYlx4ZjMiCisJCQkgICJceDMw XHhmOFx4MTFceGJkXHg2MFx4MDBceGM2XHhkNSIKKwkJCSAgIlx4NGNceDgxXHhmMVx4MjBceDJi XHg0YVx4NWJceDk5IgorCQkJICAiXHg3OVx4M2JceGM5XHg1Y1x4NzRceDIzXHhlNlx4NWQiLAor CQkua2xlbgk9IDE2LAorCQkubGVuCT0gMTI4LAorCX0sCisJeworCQkua2V5CT0gIlx4M2VceDA4 XHg1ZFx4NjRceDZjXHg5OFx4ZWNceGVjIgorCQkJICAiXHg3MFx4MGVceDBkXHhhMVx4NDFceDIw XHg5OVx4ODIiLAorCQkuaXYJPSAiXHgxMVx4YjdceDc3XHg5MVx4MGRceDk5XHhkOVx4OGQiCisJ CQkgICJceDM1XHgzYVx4ZjdceDE0XHg2Ylx4MDlceDM3XHhlNSIKKwkJCSAgIlx4YWRceDUxXHhm Nlx4YzNceDk2XHg0Ylx4NjRceDU2IgorCQkJICAiXHhhOFx4YmRceDgxXHhjY1x4YmVceDk0XHhh Zlx4ZTQiLAorCQkucHRleHQJPSAiXHhmZlx4OGRceGI5XHhjMFx4ZTNceDY5XHhiM1x4YjIiCisJ CQkgICJceDhiXHgxMVx4MjZceGIzXHgxMVx4ZWNceGZiXHhiOSIKKwkJCSAgIlx4OWNceGMxXHg3 MVx4ZDZceGUzXHgyNlx4MGVceGUwIgorCQkJICAiXHg2OFx4NDBceDYwXHhiOVx4M2FceDYzXHg1 Nlx4OGEiCisJCQkgICJceDllXHhjMVx4ZjBceDEwXHhiMVx4NjRceDMyXHg3MCIKKwkJCSAgIlx4 ZjhceGNkXHhjNlx4YzRceDQ5XHg0Y1x4ZTFceGNlIgorCQkJICAiXHhmM1x4ZTFceDAzXHhmOFx4 MzVceGFlXHhlMFx4NWUiCisJCQkgICJceGVmXHg1Zlx4YmNceDQxXHg3NVx4MjZceDEzXHhjYyIK KwkJCSAgIlx4MzdceDg1XHhkZlx4YzBceDVkXHhhNlx4NDdceDk4IgorCQkJICAiXHhmMVx4OTdc eDUyXHg1OFx4MDRceGU2XHhiNVx4MDEiCisJCQkgICJceGMwXHhiOFx4MTdceDZkXHg3NFx4YmRc eDlhXHhkZiIKKwkJCSAgIlx4YTRceDM3XHg5NFx4ODZceGIwXHgxM1x4ODNceDI4IgorCQkJICAi XHhjOVx4YTJceDA3XHgzZlx4YjVceGIyXHg3Mlx4NDAiCisJCQkgICJceDBlXHg2MFx4ZGZceDU3 XHgwN1x4YjdceDJjXHg2NiIKKwkJCSAgIlx4MTBceDNmXHg4ZFx4ZGRceDMwXHgwYVx4NDdceGQ1 IgorCQkJICAiXHhlOFx4OWRceGZiXHhhMVx4YWZceDUzXHhkN1x4MDUiCisJCQkgICJceGM3XHhk Mlx4YmFceGU3XHgyY1x4YTBceGJmXHhiOCIKKwkJCSAgIlx4ZDFceDkzXHhlN1x4NDFceDgyXHhh M1x4NDFceDNhIgorCQkJICAiXHhhZlx4MTJceGQ2XHhmOFx4MzRceGRhXHg5Mlx4NDYiCisJCQkg ICJceGFkXHhhMlx4MmZceGY2XHg3ZVx4NDZceDk2XHhkOCIKKwkJCSAgIlx4MDNceGYzXHg0OVx4 NjRceGRlXHhkOFx4MDZceDhiIgorCQkJICAiXHhhMFx4YmNceDYzXHgzNVx4MzhceGI2XHg2Ylx4 ZGEiCisJCQkgICJceDViXHg1MFx4M2ZceDEzXHhhNVx4ODRceDFiXHgxYiIKKwkJCSAgIlx4NjZc eDg5XHg5NVx4YjdceGMyXHgxNlx4M2NceGU5IgorCQkJICAiXHgyNFx4YjBceDhjXHg2Zlx4NDlc eGVmXHhmN1x4MjgiCisJCQkgICJceDZhXHgyNFx4ZmRceGJlXHgyNVx4ZTJceGI0XHg5MCIKKwkJ CSAgIlx4NzdceDQ0XHgwOFx4YjhceGRhXHhkMlx4ZGVceDJjIgorCQkJICAiXHhhMFx4NTdceDQ1 XHg1N1x4MjlceDQ3XHg2Ylx4ODkiCisJCQkgICJceDRhXHhmNlx4YTdceDJhXHhjM1x4OWVceDdi XHhjOCIKKwkJCSAgIlx4ZmRceDlmXHg4OVx4YWJceGVlXHg2ZFx4YTNceGI0IgorCQkJICAiXHgy M1x4OTBceDdhXHhlOVx4ODlceGEwXHhjN1x4YjMiCisJCQkgICJceDE3XHg0MVx4ODdceDkxXHhm Y1x4OTdceDQyIiwKKwkJLmN0ZXh0CT0gIlx4ZmNceDliXHg5Nlx4NjZceGM0XHg4Mlx4MmFceDRh IgorCQkJICAiXHhiMVx4MjRceGJhXHhjN1x4NzhceDVmXHg3OVx4YzEiCisJCQkgICJceDU3XHgy ZVx4NDdceDI5XHg0ZFx4N2JceGQyXHg5YSIKKwkJCSAgIlx4YmRceGM2XHhjMVx4MjZceDdiXHg4 ZVx4M2ZceDVkIgorCQkJICAiXHhkNFx4YjRceDlmXHg2YVx4MDJceDI0XHg0YVx4YWQiCisJCQkg ICJceDBjXHgwMFx4MWJceGRmXHg5Mlx4YzVceDhhXHhlMSIKKwkJCSAgIlx4NzdceDc5XHhjY1x4 ZDVceDIwXHhiZlx4ODNceGY0IgorCQkJICAiXHg0Ylx4YWRceDExXHhiZlx4ZGJceDQ3XHg2NVx4 NzAiCisJCQkgICJceDQzXHhmM1x4NjVceGRmXHhiN1x4ZGNceGIyXHhiOSIKKwkJCSAgIlx4YWFc eDNmXHhiM1x4ZGZceDc5XHg2OVx4MGRceGEwIgorCQkJICAiXHg4Nlx4MWNceGJhXHg0OFx4MGJc eDAxXHhjMVx4ODgiCisJCQkgICJceGRmXHgwM1x4YjFceDA2XHgzY1x4MWRceDU2XHhhMSIKKwkJ CSAgIlx4OGVceDk4XHhjMVx4YTZceDk1XHhhMlx4NWJceDcyIgorCQkJICAiXHg3Nlx4NTlceGQy XHgyNlx4MjVceGNkXHhlZlx4N2MiCisJCQkgICJceGM5XHg2MFx4ZWFceDQzXHhkMVx4MTJceDhh XHg4YSIKKwkJCSAgIlx4NjNceDEyXHg3OFx4Y2JceDJmXHg4OFx4MWVceDg4IgorCQkJICAiXHg3 OFx4NTlceGRlXHhiYVx4NGRceDJjXHg3OFx4NjEiCisJCQkgICJceDc1XHgzN1x4NTRceGZkXHg4 MFx4YzdceDVlXHg5OCIKKwkJCSAgIlx4Y2ZceDE0XHg2Mlx4OGVceGZiXHg3Mlx4ZWVceDRkIgor CQkJICAiXHg5Zlx4YWZceDhiXHgwOVx4ZTVceDIxXHgwYVx4OTEiCisJCQkgICJceDhmXHg4OFx4 ODdceGQ1XHhiMVx4ODRceGFiXHgxOCIKKwkJCSAgIlx4MDhceDU3XHhlZFx4NzJceDM1XHhhNlx4 MGVceGM2IgorCQkJICAiXHhmZlx4Y2JceGZlXHgyY1x4NDhceDM5XHgxNFx4NDQiCisJCQkgICJc eGJhXHg1OVx4MzJceDNhXHgyZFx4YzRceDVmXHhjYiIKKwkJCSAgIlx4YmVceDY4XHg4ZVx4N2Jc eGVlXHgyMVx4YTRceDMyIgorCQkJICAiXHgxMVx4YTBceDk5XHhmZFx4OTBceGRlXHg1OVx4NDMi CisJCQkgICJceGViXHhlZFx4ZDVceDg3XHg2OFx4NDZceGM2XHhkZSIKKwkJCSAgIlx4MGJceDA3 XHgxN1x4NTlceDZhXHhhYlx4Y2FceDE1IgorCQkJICAiXHg2NVx4MDJceDAxXHhiNlx4NzFceDhj XHgzYlx4YWEiCisJCQkgICJceDE4XHgzYlx4MzBceGFlXHgzOFx4NWJceDJjXHg3NCIKKwkJCSAg Ilx4ZDRceGVlXHg0YVx4ZmNceGY3XHgxYlx4MDlceGQ0IgorCQkJICAiXHhkYVx4OGJceDFkXHg1 ZFx4NmZceDIxXHg2YyIsCisJCS5rbGVuCT0gMTYsCisJCS5sZW4JPSAyNTUsCisJfSwKKwl7CisJ CS5rZXkJPSAiXHgyNFx4ZjZceGUxXHg2Mlx4ZTVceGFmXHg5OVx4ZGEiCisJCQkgICJceDg0XHhl Y1x4NDFceGIwXHhhM1x4MGJceGQ1XHhhOCIKKwkJCSAgIlx4YTBceDNlXHg3Ylx4YTZceGRkXHg2 Y1x4OGZceGE4IiwKKwkJLml2CT0gIlx4N2ZceDgwXHgyNFx4NjJceDMyXHhkZFx4YWJceDY2Igor CQkJICAiXHhmMlx4ODdceDI5XHgyNFx4ZWNceGQyXHg0Ylx4OWYiCisJCQkgICJceDBjXHgzM1x4 NTJceGQ5XHhlMFx4Y2NceDZlXHhlNCIKKwkJCSAgIlx4OTBceDg1XHg0M1x4OTdceGM0XHg2Mlx4 MTRceDMzIiwKKwkJLnB0ZXh0CT0gIlx4ZWZceDU4XHhlN1x4N2ZceGE5XHhkOVx4YjhceGQ3Igor CQkJICAiXHhhMlx4OTFceDk3XHgwN1x4MjdceDllXHhiYVx4ZTgiCisJCQkgICJceGFhIiwKKwkJ LmN0ZXh0CT0gIlx4ZDdceGMzXHg4MVx4OTFceGYyXHg0MFx4MTdceDczIgorCQkJICAiXHgzZVx4 M2JceDFjXHgyYVx4OGVceDExXHg5Y1x4MTciCisJCQkgICJceGYxIiwKKwkJLmtsZW4JPSAyNCwK KwkJLmxlbgk9IDE3LAorCX0sCisJeworCQkua2V5CT0gIlx4YmZceGFmXHhkN1x4NjdceDhjXHg0 N1x4Y2ZceDIxIgorCQkJICAiXHg4YVx4YTVceGRkXHgzMlx4MjVceDQ3XHhiZVx4NGYiCisJCQkg ICJceGYxXHgzYVx4MGJceGE2XHhhYVx4MmRceGNmXHgwOSIsCisJCS5pdgk9ICJceGQ5XHhlOFx4 ZjBceDkyXHg0ZVx4ZmNceDFkXHhmMiIKKwkJCSAgIlx4ODFceDM3XHg3Y1x4OGZceGYxXHg1OVx4 MDlceDIwIgorCQkJICAiXHhmNFx4NDZceDUxXHg4Nlx4NGZceDU0XHg4Ylx4MzIiCisJCQkgICJc eDU4XHhkMVx4OTlceDhiXHg4Y1x4MDNceGViXHg1ZCIsCisJCS5wdGV4dAk9ICJceGNkXHg2NFx4 OTBceGY5XHg3Y1x4ZTVceDBlXHg1YSIKKwkJCSAgIlx4NzVceGU3XHg4ZVx4MzlceDg2XHhlY1x4 MjBceDQzIgorCQkJICAiXHg4YVx4NDlceDA5XHgxNVx4NDdceGY0XHgzY1x4ODkiCisJCQkgICJc eDIxXHhlYlx4Y2ZceDRlXHhjZlx4OTFceGI1XHg0MCIKKwkJCSAgIlx4Y2RceGU1XHg0ZFx4NWNc eDZmXHhmMlx4ZDJceDgwIgorCQkJICAiXHhmYVx4YWJceGIzXHg3Nlx4OWZceDdmXHg4NFx4MGEi LAorCQkuY3RleHQJPSAiXHg0NFx4OThceDY0XHgxNVx4YjdceDBiXHg4MFx4YTMiCisJCQkgICJc eGI5XHhjYVx4MjNceGZmXHgzYlx4MGJceDY4XHg3NCIKKwkJCSAgIlx4YmJceDNlXHgyMFx4MTlc eDlmXHgyOFx4NzFceDJhIgorCQkJICAiXHg0OFx4M2NceDdjXHhlMlx4ZWZceGI1XHgxMFx4YWMi CisJCQkgICJceDgyXHg5Zlx4Y2RceDA4XHg4Zlx4NmJceDE2XHg2ZiIKKwkJCSAgIlx4YzNceGJi XHgwN1x4ZmJceDNjXHhiMFx4MWJceDI3IiwKKwkJLmtsZW4JPSAyNCwKKwkJLmxlbgk9IDQ4LAor CX0sCisJeworCQkua2V5CT0gIlx4YjhceDM1XHhhMlx4NWZceDg2XHhiYlx4ODJceDk5IgorCQkJ ICAiXHgyN1x4ZWJceDAxXHgzZlx4OTJceGFmXHg4MFx4MjQiCisJCQkgICJceDRjXHg2Nlx4YTJc eDg5XHhmZlx4MmVceGEyXHgyNSIsCisJCS5pdgk9ICJceDBhXHgxZFx4OTZceGQzXHhlMFx4ZThc eDBjXHg5YiIKKwkJCSAgIlx4OWRceDZmXHgyMVx4OTdceGMyXHgxN1x4ZGJceDM5IgorCQkJICAi XHgzZlx4ZDhceDY0XHg0OFx4ODBceDA0XHhlZVx4NDMiCisJCQkgICJceDAyXHhjZVx4ODhceGUy XHg4MVx4ODFceDVmXHg4MSIsCisJCS5wdGV4dAk9ICJceGI4XHhmOVx4MTZceDhiXHgyNVx4Njhc eGQwXHg5YyIKKwkJCSAgIlx4ZDJceDI4XHhhY1x4YThceDc5XHhjMlx4MzBceGMxIgorCQkJICAi XHgzMVx4ZGVceDFjXHgzN1x4MWJceGEyXHhiNVx4ZTYiCisJCQkgICJceGYwXHhkMFx4ZjhceDlj XHg3Zlx4YzZceDQ2XHgwNyIKKwkJCSAgIlx4NWNceGMzXHgwNlx4ZTRceGYwXHgwMlx4ZWNceGY4 IgorCQkJICAiXHg1OVx4N2NceGMyXHg1ZFx4ZjhceDBjXHgyMVx4YWUiCisJCQkgICJceDllXHg4 Mlx4YjFceDFhXHg1Zlx4NzhceDQ0XHgxNSIKKwkJCSAgIlx4MDBceGE3XHgyZVx4NTJceGM1XHg5 OFx4OThceDM1IgorCQkJICAiXHgwM1x4YWVceGQwXHg4ZVx4MDdceDU3XHhlMlx4NWEiCisJCQkg ICJceDE3XHhiZlx4NTJceDQwXHg1NFx4NWJceDc0XHhlNSIKKwkJCSAgIlx4MmRceDM1XHhhZlx4 OWVceDM3XHhmN1x4N2VceDRhIgorCQkJICAiXHg4Y1x4OWVceGExXHhkY1x4NDBceGI0XHg1Ylx4 MzYiCisJCQkgICJceGRjXHgzYVx4NjhceGU2XHhiN1x4MzVceDBiXHg4YSIKKwkJCSAgIlx4OTBc eGVjXHg3NFx4OGZceDA5XHg5YVx4N2ZceDAyIgorCQkJICAiXHg0ZFx4MDNceDQ2XHgzNVx4NjJc eGIxXHhiZFx4MDgiCisJCQkgICJceDNmXHg1NFx4MmFceDEwXHgwYlx4ZGNceDY5XHhhZiIKKwkJ CSAgIlx4MjVceDNhXHgwY1x4NWZceGUwXHg1MVx4ZTdceDExIgorCQkJICAiXHhiN1x4MDBceGFi XHhiYlx4OWFceGIwXHhkY1x4NGQiCisJCQkgICJceGMzXHg3ZFx4MWFceDZlXHhkMVx4MDlceDUy XHhiZCIKKwkJCSAgIlx4NmJceDQzXHg1NVx4MjJceDNhXHg3OFx4MTRceDdkIgorCQkJICAiXHg3 OVx4ZmRceDhkXHhmY1x4OWJceDFkXHgwZlx4YTIiCisJCQkgICJceGM3XHhiOVx4ZjhceDg3XHhk NVx4OTZceDUwXHg2MSIKKwkJCSAgIlx4YTdceDVlXHgxZVx4NTdceDk3XHhlMFx4YWRceDJmIgor CQkJICAiXHg5M1x4ZTZceGU4XHg4M1x4ZWNceDg1XHgyNlx4NWUiCisJCQkgICJceGQ5XHgyYVx4 MTVceGUwXHhlOVx4MDlceDI1XHhhMSIKKwkJCSAgIlx4NzdceDJiXHg4OFx4ZGNceGE0XHhhNVx4 NDhceGI2IgorCQkJICAiXHhmN1x4Y2NceGE2XHhhOVx4YmFceGYzXHg0Mlx4NWMiCisJCQkgICJc eDcwXHg5ZFx4ZTlceDI5XHhjMVx4ZjFceDMzXHhkZCIKKwkJCSAgIlx4NTZceDQ4XHgxN1x4ODZc eDE0XHg1MVx4NWNceDEwIgorCQkJICAiXHhhYlx4ZmRceGQzXHgyNlx4OGNceDIxXHhmNVx4OTMi CisJCQkgICJceDFiXHhlYlx4NDdceDk3XHg3M1x4YmJceDg4XHgxMCIKKwkJCSAgIlx4ZjNceGZl XHhmNVx4ZGVceGYzXHgyZVx4MDVceDQ2IgorCQkJICAiXHgxY1x4MGRceGEzXHgxMFx4NDhceDlj XHg3MVx4MTYiCisJCQkgICJceDc4XHgzM1x4NGRceDBhXHg3NFx4M2JceGU5XHgzNCIKKwkJCSAg Ilx4MGJceGE3XHgwZVx4OWVceDYxXHhlOVx4ZTlceGZkIgorCQkJICAiXHg4NVx4YTBceGNiXHgx OVx4ZmRceDdjXHgzM1x4ZTMiCisJCQkgICJceDBlXHhjZVx4YzJceDZmXHg5ZFx4YTRceDJkXHg3 NyIKKwkJCSAgIlx4ZmRceGFkXHhlZVx4NWVceDA4XHgzZVx4ZDdceGY1IgorCQkJICAiXHhmYlx4 YzNceGQ3XHg5M1x4OTZceDA4XHg5Nlx4Y2EiCisJCQkgICJceDU4XHg4MVx4MTZceDliXHg5OFx4 MGFceGUyXHhlZiIKKwkJCSAgIlx4N2ZceGRhXHg0MFx4ZTRceDFmXHg0Nlx4OWVceDY3IgorCQkJ ICAiXHgyYlx4ODRceGNiXHg0Mlx4YzRceGQ2XHg2YVx4Y2YiCisJCQkgICJceDJkXHhiMlx4MzNc eGMwXHg1Nlx4YjNceDM1XHg2ZiIKKwkJCSAgIlx4MjlceDM2XHg4Zlx4NmFceDViXHhlY1x4ZDVc eDRmIgorCQkJICAiXHhhMFx4NzBceGZmXHhiNlx4NWJceGRlXHg2YVx4OTMiCisJCQkgICJceDIw XHgzY1x4ZTJceDc2XHg3YVx4ZWZceDNjXHg3OSIKKwkJCSAgIlx4MzFceDY1XHhjZVx4M2FceDBl XHhkMFx4YmVceGE4IgorCQkJICAiXHgyMVx4OTVceGM3XHgyYlx4NjJceDhlXHg2N1x4ZGQiCisJ CQkgICJceDIwXHg3OVx4ZTRceGU1XHgwMVx4MTVceGMwXHhlYyIKKwkJCSAgIlx4MGZceGQ5XHgy M1x4YzhceGNhXHhkZlx4ZDRceDdkIgorCQkJICAiXHgxZFx4ZjhceDY0XHg0Zlx4NTZceGIxXHg4 M1x4YTciCisJCQkgICJceDQzXHhiZVx4ZmNceGNmXHhjMlx4OGNceDMzXHhkYSIKKwkJCSAgIlx4 MzZceGQwXHg1Mlx4ZWZceDllXHg5ZVx4ODhceGY0IgorCQkJICAiXHhhOFx4MjFceDBmXHhhYVx4 ZWVceDhkXHhhMFx4MjQiCisJCQkgICJceDRkXHhjYlx4YjFceDcyXHgwN1x4ZjBceGMyXHgwNiIK KwkJCSAgIlx4NjBceDY1XHg4NVx4ODRceDJjXHg2MFx4Y2ZceDYxIgorCQkJICAiXHhlN1x4NTZc eDQzXHg1Ylx4MmJceDUwXHg3NFx4ZmEiCisJCQkgICJceGRiXHg0ZVx4ZWFceDg4XHhkNFx4YjNc eDgzXHg4ZiIKKwkJCSAgIlx4NmZceDk3XHg0Ylx4NTdceDdhXHg2NFx4NjRceGFlIgorCQkJICAi XHgwYVx4MzdceDY2XHhjNVx4MDNceGFkXHhiNVx4ZjkiCisJCQkgICJceDA4XHhiMFx4M2FceDc0 XHhkZVx4OTdceDUxXHhmZiIKKwkJCSAgIlx4NDhceDRmXHg1Y1x4YTRceGY4XHg3YVx4YjRceDA1 IgorCQkJICAiXHgyN1x4NzBceDUyXHg4Nlx4MWJceDc4XHhmY1x4MTgiCisJCQkgICJceDA2XHgy N1x4YTlceDYyXHhmN1x4ZGFceGQyXHg4ZSIsCisJCS5jdGV4dAk9ICJceDNiXHhlMVx4ZGJceGIz XHhjNVx4OWFceGRlXHg2OSIKKwkJCSAgIlx4NThceDA1XHhjY1x4ZWJceDAyXHg1MVx4NzhceDRh IgorCQkJICAiXHhhY1x4MjhceGU5XHhlZFx4ZDFceGM5XHgxNVx4N2QiCisJCQkgICJceDMzXHg3 ZFx4YzFceDQ3XHgxMlx4NDFceDExXHhmOCIKKwkJCSAgIlx4NGFceDJjXHhiN1x4YTNceDQxXHhi ZVx4NTlceGY3IgorCQkJICAiXHgyMlx4ZGJceDJjXHhkYVx4OWNceDAwXHg2MVx4OWIiCisJCQkg ICJceDczXHhiM1x4MGJceDg0XHgyYlx4YzFceGYzXHg4MCIKKwkJCSAgIlx4ODRceGViXHgxOVx4 NjBceDgwXHgwOVx4ZTFceGNkIgorCQkJICAiXHgxNlx4M2FceDIwXHgyM1x4YzRceDgyXHg0Zlx4 YmEiCisJCQkgICJceDNiXHg4ZVx4NTVceGQ3XHhhOVx4MGJceDc1XHhkMCIKKwkJCSAgIlx4ZGFc eGNlXHhkMlx4ZWVceDdlXHg0Ylx4N2ZceDY1IgorCQkJICAiXHg0ZFx4MjhceGM1XHhkM1x4MTVc eDJjXHg0MFx4OTYiCisJCQkgICJceDUyXHhkNFx4MThceDYxXHgyYlx4ZTdceDgzXHhlYyIKKwkJ CSAgIlx4ODlceDYyXHg5Y1x4NGNceDUwXHhlNlx4ZTJceGJiIgorCQkJICAiXHgyNVx4YTFceDBm XHhhN1x4YjBceGI0XHhiMlx4ZGUiCisJCQkgICJceDU0XHgyMFx4YWVceGEzXHg1Nlx4YTVceDI2 XHg0YyIKKwkJCSAgIlx4ZDVceGNjXHhlNVx4Y2JceDI4XHg0NFx4YjFceGVmIgorCQkJICAiXHg2 N1x4MmVceDkzXHg2ZFx4MDBceDg4XHg4M1x4OWEiCisJCQkgICJceGYyXHgxY1x4NDhceDM4XHhl Y1x4MWFceDI0XHg5MCIKKwkJCSAgIlx4NzNceDBhXHhkYlx4ZThceGNlXHg5NVx4N2FceDJjIgor CQkJICAiXHg4Y1x4ZTlceGI3XHgwN1x4MWRceGIzXHhhM1x4MjAiCisJCQkgICJceGJlXHhhZFx4 NjFceDg0XHhhY1x4ZGVceDc2XHhiNSIKKwkJCSAgIlx4YTZceDI4XHgyOVx4NDdceDYzXHhjNFx4 ZmNceDEzIgorCQkJICAiXHgzZlx4NzFceGZiXHg1OFx4MzdceDM0XHg4Mlx4ZWQiCisJCQkgICJc eDllXHgwNVx4MTlceDFmXHhjMVx4NjdceGMxXHhhYiIKKwkJCSAgIlx4ZjVceGZkXHg3Y1x4ZWFc eGZhXHhhNFx4ZjhceDBhIgorCQkJICAiXHhhY1x4NGNceDkyXHhkZlx4NjVceDczXHhkN1x4ZGIi CisJCQkgICJceGVkXHgyY1x4ZTBceDg0XHg1Zlx4NTdceDhjXHg3NiIKKwkJCSAgIlx4M2VceDA1 XHhjMFx4YzNceDY4XHg5Nlx4OTVceDBiIgorCQkJICAiXHg4OFx4OTdceGZlXHgyZVx4OTlceGQ1 XHhjMlx4YjkiCisJCQkgICJceDUzXHg5Zlx4ZjNceDMyXHgxMFx4MWZceDFmXHg1ZCIKKwkJCSAg Ilx4ZGZceDIxXHg5NVx4NzBceDkxXHhlOFx4YTFceDNlIgorCQkJICAiXHgxOVx4M2VceGI2XHgw Ylx4YThceGRiXHhmOFx4ZDQiCisJCQkgICJceDU0XHgyN1x4YjhceGFiXHg1ZFx4NzhceDBjXHhl NiIKKwkJCSAgIlx4YjdceDA4XHhlZVx4YTRceGI2XHg2Ylx4ZWJceDVhIgorCQkJICAiXHg4OVx4 NjlceDJiXHhiZFx4ZDRceDIxXHg1Ylx4YmYiCisJCQkgICJceDc5XHhiYlx4MGZceGZmXHhkYlx4 MjNceDlhXHhlYiIKKwkJCSAgIlx4OGRceGYyXHhjNFx4MzlceGI0XHg5MFx4NzdceDZmIgorCQkJ ICAiXHg2OFx4ZTJceGI4XHhmM1x4ZjFceDY1XHg0Zlx4ZDUiCisJCQkgICJceDI0XHg4MFx4MDZc eGFmXHg3Y1x4OGRceDE1XHgwYyIKKwkJCSAgIlx4ZmRceDU2XHhlNVx4ZTNceDAxXHhhNVx4Zjdc eDFjIgorCQkJICAiXHgzMVx4ZDZceGEyXHgwMVx4MWVceDU5XHhmOVx4YTkiCisJCQkgICJceDQy XHhkNVx4YzJceDM0XHhkYVx4MjVceGRlXHhjNiIKKwkJCSAgIlx4NWRceDM4XHhlZlx4ZDFceDRj XHhjMVx4ZDlceDFiIgorCQkJICAiXHg5OFx4ZmRceGNkXHg1N1x4NmZceGZkXHg0Nlx4OTEiCisJ CQkgICJceDkwXHgzZFx4NTJceDJiXHgyY1x4N2RceGNmXHg3MSIKKwkJCSAgIlx4Y2ZceGQxXHg3 N1x4MjNceDcxXHgzNlx4YjFceGNlIgorCQkJICAiXHhjN1x4NWRceGYwXHg1Ylx4NDRceDNkXHg0 M1x4NzEiCisJCQkgICJceGFjXHhiOFx4YTBceDZhXHhlYVx4ODlceDVjXHhmZiIKKwkJCSAgIlx4 ODFceDczXHhkNFx4ODNceGQxXHhjOVx4ZTlceGUyIgorCQkJICAiXHhhOFx4YTZceDBmXHgzNlx4 ZTZceGFhXHg1N1x4ZDQiCisJCQkgICJceDI3XHhkMlx4YzlceGRhXHg5NFx4MDJceDFmXHhmYiIK KwkJCSAgIlx4ZTFceGExXHgwN1x4YmVceGUxXHgxYlx4MTVceDk0IgorCQkJICAiXHgxZVx4YWNc eDJmXHg1N1x4YmJceDQxXHgyMlx4YWYiCisJCQkgICJceDYwXHg1ZVx4Y2NceDY2XHhjYlx4MTZc eDYyXHhhYiIKKwkJCSAgIlx4YjhceDdjXHg5OVx4ZjRceDg0XHg5M1x4MGNceGMyIgorCQkJICAi XHhhMlx4NDlceGU0XHhmZFx4MTdceDU1XHhlMVx4YTYiCisJCQkgICJceDhkXHg1Ylx4YzZceDFi XHhjOFx4YWNceGVjXHgxMSIKKwkJCSAgIlx4MzNceGNmXHhiMFx4ZThceGM3XHgyOFx4NGZceGIy IgorCQkJICAiXHg1Y1x4YTZceGUyXHg3MVx4YWJceDgwXHgwYVx4YTciCisJCQkgICJceDVjXHg1 OVx4NTBceDlmXHg3YVx4MzJceGI3XHhlNSIKKwkJCSAgIlx4MjRceDlhXHg4ZVx4MjVceDIxXHgy ZVx4YjdceDE4IgorCQkJICAiXHhkMFx4ZjJceGU3XHgyN1x4NmZceGRhXHhjMVx4MDAiCisJCQkg ICJceGQ5XHhhNlx4MDNceDU5XHhhY1x4NGJceGNiXHhiYSIsCisJCS5rbGVuCT0gMjQsCisJCS5s ZW4JPSA1MTIsCisJfSwKKwl7CisJCS5rZXkJPSAiXHg5ZVx4ZWJceGIyXHg0OVx4M2NceDFjXHhm NVx4ZjQiCisJCQkgICJceDZhXHg5OVx4YzJceGM0XHhkZlx4YjFceGY0XHhkZCIKKwkJCSAgIlx4 NzVceDIwXHg1N1x4ZWFceDJjXHg0Zlx4Y2RceGIyIgorCQkJICAiXHhhNVx4M2RceDdiXHg0OVx4 MWVceGFiXHhmZFx4MGYiLAorCQkuaXYJPSAiXHhkZlx4NjNceGQ0XHhhYlx4ZDJceDQ5XHhmM1x4 ZDgiCisJCQkgICJceDMzXHg4MVx4MzdceDYwXHg3ZFx4ZmFceDczXHgwOCIKKwkJCSAgIlx4ZDhc eDQ5XHg2ZFx4ODBceGU4XHgyZlx4NjJceDU0IgorCQkJICAiXHhlYlx4MGVceGE5XHgzOVx4NWJc eDQ1XHg3Zlx4OGEiLAorCQkucHRleHQJPSAiXHg2N1x4YzlceGYyXHgzMFx4ODRceDQxXHg4ZVx4 NDMiCisJCQkgICJceGZiXHhmM1x4YjNceDNlXHg3OVx4MzZceDdmXHhlOCIsCisJCS5jdGV4dAk9 ICJceDI3XHgzOFx4NzhceDQ3XHgxNlx4ZDlceDcxXHgzNSIKKwkJCSAgIlx4MmVceDdlXHhkZFx4 N2VceDQzXHgzY1x4YjhceDQwIiwKKwkJLmtsZW4JPSAzMiwKKwkJLmxlbgk9IDE2LAorCX0sCisJ eworCQkua2V5CT0gIlx4OTNceGZhXHg3ZVx4ZTJceDBlXHg2N1x4YzRceDM5IgorCQkJICAiXHhl N1x4Y2FceDQ3XHg5NVx4NjhceDlkXHg1ZVx4NWEiCisJCQkgICJceDdjXHgyNlx4MTlceGFiXHhj Nlx4Y2FceDZhXHg0YyIKKwkJCSAgIlx4NDVceGE2XHg5Nlx4NDJceGFlXHg2Y1x4ZmZceGU3IiwK KwkJLml2CT0gIlx4ZWFceDgyXHg0N1x4OTVceDNiXHgyMlx4YTFceDNhIgorCQkJICAiXHg2YVx4 Y2FceDI0XHg0Y1x4NTBceDdlXHgyM1x4Y2QiCisJCQkgICJceDBlXHg1MFx4ZTVceDQxXHhiNlx4 NjVceDI5XHhkOCIKKwkJCSAgIlx4MzBceDIzXHgwMFx4ZDJceDU0XHhhN1x4ZDZceDU2IiwKKwkJ LnB0ZXh0CT0gIlx4ZGJceDFmXHgxZlx4ZWNceGFkXHg4M1x4NmVceDVkIgorCQkJICAiXHgxOVx4 YTVceGY2XHgzYlx4YjRceDkzXHg1YVx4NTciCisJCQkgICJceDZmIiwKKwkJLmN0ZXh0CT0gIlx4 ZjFceDQ2XHg2ZVx4OWRceGIzXHgwMVx4ZjBceDZiIgorCQkJICAiXHhjMlx4YWNceDU3XHg4OFx4 NDhceDZkXHg0MFx4NzIiCisJCQkgICJceDY4IiwKKwkJLmtsZW4JPSAzMiwKKwkJLmxlbgk9IDE3 LAorCX0sCisJeworCQkua2V5CT0gIlx4MzZceDJiXHg1N1x4OTdceGY4XHg1ZFx4Y2RceDk5Igor CQkJICAiXHg1Zlx4MWFceDVhXHg0NFx4MWRceDkyXHgwZlx4MjciCisJCQkgICJceGNjXHgxNlx4 ZDdceDJiXHg4NVx4NjNceDk5XHhkMyIKKwkJCSAgIlx4YmFceDk2XHhhMVx4ZGJceGQyXHg2MFx4 NjhceGRhIiwKKwkJLml2CT0gIlx4ZWZceDU4XHg2OVx4YjFceDJjXHg1ZVx4OWFceDQ3IgorCQkJ ICAiXHgyNFx4YzFceGIxXHg2OVx4ZTFceDEyXHg5M1x4OGYiCisJCQkgICJceDQzXHgzZFx4NmRc eDAwXHhkYlx4NWVceGQ4XHhkOSIKKwkJCSAgIlx4MTJceDlhXHhmZVx4ZDlceGZmXHgyZFx4YWFc eGM0IiwKKwkJLnB0ZXh0CT0gIlx4NWVceGE4XHg2OFx4MTlceDg1XHg5OFx4MTJceDIzIgorCQkJ ICAiXHgyNlx4MGFceGNjXHhkYlx4MGFceDA0XHhiOVx4ZGYiCisJCQkgICJceDRkXHhiM1x4NDhc eDdiXHhiMFx4ZTNceGM4XHgxOSIKKwkJCSAgIlx4NDNceDVhXHg0Nlx4MDZceDk0XHgyZFx4ZjIi LAorCQkuY3RleHQJPSAiXHhkYlx4ZmRceGM4XHgwM1x4ZDBceGVjXHhjMVx4ZmUiCisJCQkgICJc eGJkXHg2NFx4MzdceGI4XHg4Mlx4NDNceDYyXHg0ZSIKKwkJCSAgIlx4N2VceDU0XHhhM1x4ZTJc eDI0XHhhN1x4MjdceGU4IgorCQkJICAiXHhhNFx4ZDVceGIzXHg2Y1x4YjJceDI2XHhiNCIsCisJ CS5rbGVuCT0gMzIsCisJCS5sZW4JPSAzMSwKKwl9LAorCXsKKwkJLmtleQk9ICJceDAzXHg2NVx4 MDNceDZlXHg0ZFx4ZTZceGU4XHg0ZSIKKwkJCSAgIlx4OGJceGJlXHgyMlx4MTlceDQ4XHgzMVx4 ZWVceGQ5IgorCQkJICAiXHhhMFx4OTFceDIxXHhiZVx4NjJceDg5XHhkZVx4NzgiCisJCQkgICJc eGQ5XHhiMFx4MzZceGEzXHgzY1x4Y2VceDQzXHhkNSIsCisJCS5pdgk9ICJceGE5XHhjM1x4NGJc eGU3XHgwZlx4ZmNceDZkXHhiZiIKKwkJCSAgIlx4NTZceDI3XHgyMVx4MWNceGZjXHhkNlx4MDRc eDEwIgorCQkJICAiXHg1Zlx4NDNceGUyXHgzMFx4MzVceDI5XHg2Y1x4MTAiCisJCQkgICJceDkw XHhmMVx4YmZceDYxXHhlZFx4MGZceDhhXHg5MSIsCisJCS5wdGV4dAk9ICJceDA3XHhhYVx4MDJc eDI2XHhiNFx4OThceDExXHg1ZSIKKwkJCSAgIlx4MzNceDQxXHgyMVx4NTFceDUxXHg2M1x4MmNc eDcyIgorCQkJICAiXHgwMFx4YWJceDMyXHhhN1x4MWNceGM4XHgzY1x4OWMiCisJCQkgICJceDI1 XHgwZVx4OGJceDlhXHhkZlx4ODVceGVkXHgyZCIKKwkJCSAgIlx4ZjRceGYyXHhiY1x4NTVceGNh XHg5Mlx4NmRceDIyIgorCQkJICAiXHhmZFx4MjJceDNiXHg0Mlx4NGNceDBiXHg3NFx4ZWMiLAor CQkuY3RleHQJPSAiXHg3Ylx4YjFceDQzXHg2ZFx4ZDhceDcyXHg2Y1x4ZjYiCisJCQkgICJceDY3 XHg2YVx4MDBceGM0XHhmMVx4ZjBceGY1XHhhNCIKKwkJCSAgIlx4ZmNceDYwXHg5MVx4YWJceDQ2 XHgwYlx4MTVceGZjIgorCQkJICAiXHhkN1x4YzFceDI4XHgxNVx4YTFceGZjXHhmN1x4NjgiCisJ CQkgICJceDhlXHhjY1x4MjdceDYyXHgwMFx4NjRceDU2XHg3MiIKKwkJCSAgIlx4YTZceDE3XHhk N1x4M2ZceDY3XHg4MFx4MTBceDU4IiwKKwkJLmtsZW4JPSAzMiwKKwkJLmxlbgk9IDQ4LAorCX0s CisJeworCQkua2V5CT0gIlx4YTVceDI4XHgyNFx4MzRceDFhXHgzY1x4ZDhceGY3IgorCQkJICAi XHgwNVx4OTFceDhmXHhlZVx4ODVceDFmXHgzNVx4N2YiCisJCQkgICJceDgwXHgzZFx4ZmNceDli XHg5NFx4ZjZceGZjXHg5ZSIKKwkJCSAgIlx4MTlceDA5XHgwMFx4YTlceDA0XHgzMVx4NGZceDEx IiwKKwkJLml2CT0gIlx4YTFceGJhXHg0OVx4OTVceGZmXHgzNFx4NmRceGI4IgorCQkJICAiXHhj ZFx4ODdceDVkXHg1ZVx4ZmRceGVhXHg4NVx4ZGIiCisJCQkgICJceDhhXHg3Ylx4NWVceGIyXHg1 ZFx4NTdceGRkXHg2MiIKKwkJCSAgIlx4YWNceGE5XHg4Y1x4NDFceDQyXHg5NFx4NzVceGI3IiwK KwkJLnB0ZXh0CT0gIlx4NjlceGI0XHhlOFx4OGNceDM3XHhlOFx4NjdceDgyIgorCQkJICAiXHhm MVx4ZWNceDVkXHgwNFx4ZTVceDE0XHg5MVx4MTMiCisJCQkgICJceGRmXHhmMlx4ODdceDFiXHg2 OVx4ODFceDFkXHg3MSIKKwkJCSAgIlx4NzBceDllXHg5Y1x4M2JceGRlXHg0OVx4NzBceDExIgor CQkJICAiXHhhMFx4YTNceGRiXHgwZFx4NTRceDRmXHg2Nlx4NjkiCisJCQkgICJceGQ3XHhkYlx4 ODBceGE3XHg3MFx4OTJceDY4XHhjZSIKKwkJCSAgIlx4ODFceDA0XHgyY1x4YzZceGFiXHhhZVx4 ZTVceDYwIgorCQkJICAiXHgxNVx4ZTlceDZmXHhlZlx4YWFceDhmXHhhN1x4YTciCisJCQkgICJc eDYzXHg4Zlx4ZjJceGYwXHg3N1x4ZjFceGE4XHhlYSIKKwkJCSAgIlx4ZTFceGI3XHgxZlx4OWVc eGFiXHg5ZVx4NGJceDNmIgorCQkJICAiXHgwN1x4ODdceDViXHg2Zlx4Y2RceGE4XHhhZlx4Yjki CisJCQkgICJceGZhXHg3MFx4MGJceDUyXHhiOFx4YThceGE3XHg5ZSIKKwkJCSAgIlx4MDdceDVm XHhhNlx4MGVceGIzXHg5Ylx4NzlceDEzIgorCQkJICAiXHg3OVx4YzNceDNlXHg4ZFx4MWNceDJj XHg2OFx4YzgiCisJCQkgICJceDUxXHgxZFx4M2NceDdiXHg3ZFx4NzlceDc3XHgyYSIKKwkJCSAg Ilx4NTZceDY1XHhjNVx4NTRceDIzXHgyOFx4YjBceDAzIiwKKwkJLmN0ZXh0CT0gIlx4ZWJceGY5 XHg5OFx4ODZceDNjXHg0MFx4OWZceDE2IgorCQkJICAiXHg4NFx4MDFceGY5XHgwNlx4MGZceGVi XHgzY1x4YTkiCisJCQkgICJceDRjXHhhNFx4OGVceDVkXHhjM1x4OGRceGU1XHhkMyIKKwkJCSAg Ilx4YWVceGE2XHhlNlx4Y2NceGQ2XHgyZFx4MzdceDRmIgorCQkJICAiXHg5OVx4YzhceGEzXHgy MVx4NDZceGI4XHg2OVx4ZjIiCisJCQkgICJceGUzXHgxNFx4ODlceGQ3XHhiOVx4ZjVceDllXHg0 ZSIKKwkJCSAgIlx4MDdceDkzXHg2Zlx4NzhceDhlXHg2Ylx4ZWFceDhmIgorCQkJICAiXHhmYlx4 NDNceGI4XHgzZVx4OWJceDRjXHgxZFx4N2UiCisJCQkgICJceDIwXHg5YVx4YzVceDg3XHhlZVx4 YWZceGY2XHhmOSIKKwkJCSAgIlx4NDZceGM1XHgxOFx4OGFceGU4XHg2OVx4ZTdceDk2IgorCQkJ ICAiXHg1Mlx4NTVceDVmXHgwMFx4MWVceDFhXHhkY1x4Y2MiCisJCQkgICJceDEzXHhhNVx4ZWVc eGZmXHg0Ylx4MjdceGNhXHhkYyIKKwkJCSAgIlx4MTBceGE2XHg0OFx4NzZceDk4XHg0M1x4OTRc eGEzIgorCQkJICAiXHhjN1x4ZTJceGM5XHg2NVx4OWJceDA4XHgxNFx4MjYiCisJCQkgICJceDFk XHg2OFx4ZmJceDE1XHgwYVx4MzNceDQ5XHg4NCIKKwkJCSAgIlx4ODRceDMzXHg1YVx4MWJceDI0 XHg0Nlx4MzFceDkyIiwKKwkJLmtsZW4JPSAzMiwKKwkJLmxlbgk9IDEyOCwKKwl9LAorCXsKKwkJ LmtleQk9ICJceDM2XHg0NVx4MTFceGEyXHg5OFx4NWZceDk2XHg3YyIKKwkJCSAgIlx4YzZceGI0 XHg5NFx4MzFceDBhXHg2N1x4MDlceDMyIgorCQkJICAiXHg2Y1x4NmZceDZmXHgwMFx4ZjBceDE3 XHhjYlx4YWMiCisJCQkgICJceGE1XHhhOVx4NDdceDllXHgyZVx4ODVceDJmXHhmYSIsCisJCS5p dgk9ICJceDI4XHg4OFx4YWFceDliXHg1OVx4M2JceDFlXHg5NyIKKwkJCSAgIlx4ODJceGU1XHg1 Y1x4OWVceDZkXHgxNFx4MTFceDE5IgorCQkJICAiXHg2ZVx4MzhceDhmXHhkNVx4NDBceDJiXHhj YVx4ZjkiCisJCQkgICJceDdiXHg0Y1x4ZTRceGEzXHhkMFx4ZDJceDhhXHgxMyIsCisJCS5wdGV4 dAk9ICJceDk1XHhkMlx4ZjdceDcxXHgxYlx4Y2FceGE1XHg4NiIKKwkJCSAgIlx4ZDlceDQ4XHgw MVx4OTNceDJmXHg3OVx4NTVceDI5IgorCQkJICAiXHg3MVx4MTNceDE1XHgwZVx4ZTZceDEyXHhi Y1x4NGQiCisJCQkgICJceDhhXHgzMVx4ZTNceDQwXHgyYVx4YzZceDVlXHgwZCIKKwkJCSAgIlx4 NjhceGJiXHg0YVx4NjJceDhkXHhjN1x4NDVceDc3IgorCQkJICAiXHhkMlx4YjhceGM3XHgxZFx4 ZjFceGQyXHg1ZFx4OTciCisJCQkgICJceGNmXHhhY1x4NTJceGU1XHgzMlx4NzdceGI2XHhkYSIK KwkJCSAgIlx4MzBceDg1XHhjZlx4MmJceDk4XHhlOVx4YWFceDM0IgorCQkJICAiXHg2Mlx4YjVc eDIzXHg5ZVx4YjdceGE2XHhkNFx4ZTAiCisJCQkgICJceGI0XHg1OFx4MThceDhjXHg0ZFx4ZGVc eDRkXHgwMSIKKwkJCSAgIlx4ODNceDg5XHgyNFx4Y2FceGZiXHgxMVx4ZDRceDgyIgorCQkJICAi XHgzMFx4N2FceDgxXHgzNVx4YTBceGI0XHhkNFx4YjYiCisJCQkgICJceDg0XHhlYVx4NDdceDkx XHg4Y1x4MTlceDg2XHgyNSIKKwkJCSAgIlx4YTZceDA2XHg4ZFx4NzhceGU2XHhlZFx4ODdceGVi IgorCQkJICAiXHhkYVx4ZWFceDczXHg3Y1x4YmZceDY2XHhiOFx4NzIiCisJCQkgICJceGUzXHgw YVx4YjhceDBjXHhjYlx4MWFceDczXHhmMSIKKwkJCSAgIlx4YTdceGNhXHgwYVx4ZGVceDU3XHgy Ylx4YmRceDJiIgorCQkJICAiXHhlYlx4OGJceDI0XHgzOFx4MjJceGQzXHgwZVx4MWYiCisJCQkg ICJceDE3XHhhMFx4ODRceDk4XHgzMVx4NzdceGZkXHgzNCIKKwkJCSAgIlx4NmFceDRlXHgzZFx4 ODRceDRjXHgwZVx4ZmJceGVkIgorCQkJICAiXHhjOFx4MmFceDUxXHhmYVx4ZDhceDczXHgyMVx4 OGEiCisJCQkgICJceGRiXHhiNVx4ZmVceDFmXHhlZVx4YzRceGU4XHg2NSIKKwkJCSAgIlx4NTRc eDg0XHhkZFx4OTZceDZkXHhmZFx4ZDNceDMxIgorCQkJICAiXHg3N1x4MzZceDUyXHg2Ylx4ODBc eDRmXHg5ZVx4YjQiCisJCQkgICJceGEyXHg1NVx4YmZceDY2XHg0MVx4NDlceDRlXHg4NyIKKwkJ CSAgIlx4YTdceDBjXHhjYVx4ZTdceGE1XHhjNVx4ZjZceDZmIgorCQkJICAiXHgyN1x4NTZceGUy XHg0OFx4MjJceGRkXHg1Zlx4NTkiCisJCQkgICJceDNjXHhmMVx4OWZceDgzXHhlNVx4MmRceGZi XHg3MSIKKwkJCSAgIlx4YWRceGQxXHhhZVx4MWJceDIwXHg1Y1x4NDdceGI3IgorCQkJICAiXHgz Ylx4ZDNceDE0XHhjZVx4ODFceDQyXHhiMVx4MGEiCisJCQkgICJceGYwXHg0OVx4ZmFceGMyXHhl N1x4ODZceGJmXHhjZCIKKwkJCSAgIlx4YjBceDk1XHg5Zlx4OGZceDc5XHg0MVx4NTQiLAorCQku Y3RleHQJPSAiXHhmNlx4NTdceDUxXHhjNFx4MjVceDYxXHgyZFx4ZmEiCisJCQkgICJceGQ2XHhk OVx4M2ZceDlhXHg4MVx4NTFceGRkXHg4ZSIKKwkJCSAgIlx4M2RceGU3XHhhYVx4MmRceGIxXHhk YVx4YzhceGE2IgorCQkJICAiXHg5ZFx4YWFceDNjXHhhYlx4NjJceGYyXHg4MFx4YzMiCisJCQkg ICJceDJjXHhlN1x4NThceDcyXHgxZFx4NDRceGM1XHgyOCIKKwkJCSAgIlx4N2ZceGI0XHhmOVx4 YmNceDljXHhiMlx4YWJceDhlIgorCQkJICAiXHhmYVx4ZDFceDRkXHg3Mlx4ZDlceDc5XHhmNVx4 YTAiCisJCQkgICJceDI0XHgzZVx4OTBceDI1XHgzMVx4MTRceDM4XHg0NSIKKwkJCSAgIlx4NTlc eGM4XHhmNlx4ZTJceGM2XHhmNlx4YzFceGE3IgorCQkJICAiXHhiMlx4ZjhceGE3XHhhOVx4MmJc eDZmXHgxMlx4M2EiCisJCQkgICJceGIwXHg4MVx4YTRceDA4XHg1N1x4NTlceGIxXHg1NiIKKwkJ CSAgIlx4NGNceDhmXHgxOFx4NTVceDMzXHg1Zlx4ZDZceDZhIgorCQkJICAiXHhjNlx4YTBceDRi XHhkNlx4NmJceDY0XHgzZVx4OWUiCisJCQkgICJceGZkXHg2Nlx4MTZceGUyXHhkYlx4ZWJceDVm XHhiMyIKKwkJCSAgIlx4NTBceDUwXHgzZVx4ZGVceDhkXHg3Mlx4NzZceDAxIgorCQkJICAiXHhi ZVx4Y2NceGM5XHg1Mlx4MDlceDJkXHg4ZFx4ZTciCisJCQkgICJceGQ2XHhjM1x4NjZceGRiXHgz Nlx4MDhceGQxXHg3NyIKKwkJCSAgIlx4YzhceDczXHg0Nlx4MjZceDI0XHgyOVx4YmZceDY4Igor CQkJICAiXHgyZFx4MmFceDk5XHg0M1x4NTZceDU1XHhlNFx4OTMiCisJCQkgICJceGFmXHhhZVx4 NGRceGU3XHg1NVx4NGFceGMwXHg0NSIKKwkJCSAgIlx4MjZceGViXHgzYlx4MTJceDkwXHg3Y1x4 ZGNceGQxIgorCQkJICAiXHhkNVx4NmZceDBhXHhkMFx4YTlceGQ3XHg0Ylx4ODkiCisJCQkgICJc eDBiXHgwN1x4ZDhceDg2XHhhZFx4YTFceGM0XHg2OSIKKwkJCSAgIlx4MWZceDVlXHg4Ylx4YzRc eDllXHg5MVx4NDFceDI1IgorCQkJICAiXHg1Nlx4OThceDY5XHg3OFx4M2FceDllXHhhZVx4OTEi CisJCQkgICJceGQ4XHhkOVx4ZmFceGZiXHhmZlx4ODFceDI1XHgwOSIKKwkJCSAgIlx4ZmNceGVk XHgyZFx4ODdceGJjXHgwNFx4NjJceDk3IgorCQkJICAiXHgzNVx4ZTFceDI2XHhjMlx4NDZceDFj XHhjZlx4ZDciCisJCQkgICJceDE0XHhlZFx4MDJceDA5XHhhNVx4YjJceGI2XHhhYSIKKwkJCSAg Ilx4MjdceDRlXHg2MVx4YjNceDcxXHg2Ylx4NDdceDE2IgorCQkJICAiXHhiN1x4ZThceGQ0XHhh Zlx4NTJceGViXHg2YVx4NmIiCisJCQkgICJceGRiXHg0Y1x4NjVceDIxXHg5ZVx4MWNceDM2IiwK KwkJLmtsZW4JPSAzMiwKKwkJLmxlbgk9IDI1NSwKKwl9LAorCXsKKwkJLmtleQk9ICJceGQzXHg4 MVx4NzJceDE4XHgyM1x4ZmZceDZmXHg0YSIKKwkJCSAgIlx4MjVceDc0XHgyOVx4MGRceDUxXHg4 YVx4MGVceDEzIgorCQkJICAiXHhjMVx4NTNceDVkXHgzMFx4OGRceGVlXHg3NVx4MGQiCisJCQkg ICJceDE0XHhkNlx4NjlceGM5XHgxNVx4YTlceDBjXHg2MCIsCisJCS5pdgk9ICJceDY1XHg5Ylx4 ZDRceGE4XHg3ZFx4MjlceDFkXHhmNCIKKwkJCSAgIlx4YzRceGQ2XHg5Ylx4NmFceDI4XHhhYlx4 NjRceGUyIgorCQkJICAiXHg2Mlx4ODFceDk3XHhjNVx4ODFceGFhXHhmOVx4NDQiCisJCQkgICJc eGMxXHg3Mlx4NTlceDgyXHhhZlx4MTZceGM4XHgyYyIsCisJCS5wdGV4dAk9ICJceGM3XHg2Ylx4 NTJceDZhXHgxMFx4ZjBceGNjXHgwOSIKKwkJCSAgIlx4YzFceDEyXHgxZFx4NmRceDIxXHhhNlx4 NzhceGY1IgorCQkJICAiXHgwNVx4YTNceDY5XHg2MFx4OTFceDM2XHg5OFx4NTciCisJCQkgICJc eGJhXHgwY1x4MTRceGNjXHhmM1x4MmRceDczXHgwMyIKKwkJCSAgIlx4YzZceGIyXHg1Zlx4Yzhc eDE2XHgyN1x4MzdceDVkIgorCQkJICAiXHhkMFx4MGJceDg3XHhiMlx4NTBceDk0XHg3Ylx4NTgi CisJCQkgICJceDA0XHhmNFx4ZTBceDdmXHg2ZVx4NTdceDhlXHhjOSIKKwkJCSAgIlx4NDFceDg0 XHhjMVx4YjFceDdlXHg0Ylx4OTFceDEyIgorCQkJICAiXHgzYVx4OGJceDVkXHg1MFx4ODJceDdi XHhjYlx4ZDkiCisJCQkgICJceDlhXHhkOVx4NGVceDE4XHgwNlx4MjNceDllXHhkNCIKKwkJCSAg Ilx4YTVceDIwXHg5OFx4ZWZceGI1XHhkYVx4ZTVceGMwIgorCQkJICAiXHg4YVx4NmFceDgzXHg3 N1x4MTVceDg0XHgxZVx4YWUiCisJCQkgICJceDc4XHg5NFx4OWRceGRmXHhiN1x4ZDFceGVhXHg2 NyIKKwkJCSAgIlx4YWFceGIwXHgxNFx4MTVceGZhXHg2N1x4MjFceDg0IgorCQkJICAiXHhkM1x4 NDFceDJhXHhjZVx4YmFceDRiXHg0YVx4ZTgiCisJCQkgICJceDk1XHg2Mlx4YTlceDU1XHhmMFx4 ODBceGFkXHhiZCIKKwkJCSAgIlx4YWJceGFmXHhkZFx4NGZceGE1XHg3Y1x4MTNceDM2IgorCQkJ ICAiXHhlZFx4NWVceDRmXHg3Mlx4YWRceDRiXHhmMVx4ZDAiCisJCQkgICJceDg4XHg0ZVx4ZWNc eDJjXHg4OFx4MTBceDVlXHhlYSIKKwkJCSAgIlx4MTJceGMwXHgxNlx4MDFceDI5XHhhM1x4YTBc eDU1IgorCQkJICAiXHhhYVx4NjhceGYzXHhlOVx4OWRceDNiXHgwZFx4M2IiCisJCQkgICJceDZk XHhlY1x4ZjhceGEwXHgyZFx4ZjBceDkwXHg4ZCIKKwkJCSAgIlx4MWNceGUyXHg4OFx4ZDRceDI0 XHg3MVx4ZjlceGIzIgorCQkJICAiXHhjMVx4OWZceGM1XHhkNlx4NzZceDcwXHhjNVx4MmUiCisJ CQkgICJceDljXHhhY1x4ZGJceDkwXHhiZFx4ODNceDcyXHhiYSIKKwkJCSAgIlx4NmVceGI1XHhh NVx4NTNceDgzXHhhOVx4YTVceGJmIgorCQkJICAiXHg3ZFx4MDZceDBlXHgzY1x4MmFceGQyXHgw NFx4YjUiCisJCQkgICJceDFlXHgxOVx4MzhceDA5XHgxNlx4ZDJceDgyXHgxZiIKKwkJCSAgIlx4 NzVceDE4XHg1Nlx4YjhceDk2XHgwYlx4YTZceGY5IgorCQkJICAiXHhjZlx4NjJceGQ5XHgzMlx4 NWRceGE5XHhkN1x4MWQiCisJCQkgICJceGVjXHhlNFx4ZGZceDFiXHhiZVx4ZjFceDM2XHhlZSIK KwkJCSAgIlx4ZTNceDdiXHhiNVx4MmZceGVlXHhmOFx4NTNceDNkIgorCQkJICAiXHg2YVx4Yjdc eDcwXHhhOVx4ZmNceDljXHg1N1x4MjUiCisJCQkgICJceGYyXHg4OVx4MTBceGQzXHhiOFx4YThc eDhjXHgzMCIKKwkJCSAgIlx4YWVceDIzXHg0Zlx4MGVceDEzXHg2Nlx4NGZceGUxIgorCQkJICAi XHhiNlx4YzBceGU0XHhmOFx4ZWZceDkzXHhiZFx4NmUiCisJCQkgICJceDE1XHg4NVx4NmJceGUz XHg2MFx4ODFceDFkXHg2OCIKKwkJCSAgIlx4ZDdceDMxXHg4N1x4ODlceDA5XHhhYlx4ZDVceDk2 IgorCQkJICAiXHgxZFx4ZjNceDZkXHg2N1x4ODBceGNhXHgwN1x4MzEiCisJCQkgICJceDVkXHhh N1x4ZTRceGZiXHgzZVx4ZjJceDliXHgzMyIKKwkJCSAgIlx4NTJceDE4XHhjOFx4MzBceGZlXHgy ZFx4Y2FceDFlIgorCQkJICAiXHg3OVx4OTJceDdhXHg2MFx4NWNceGI2XHg1OFx4ODciCisJCQkg ICJceGE0XHgzNlx4YTJceDY3XHg5Mlx4OGJceGE0XHhiNyIKKwkJCSAgIlx4ZjFceDg2XHhkZlx4 ZGNceGMwXHg3ZVx4OGZceDYzIgorCQkJICAiXHhkMlx4YTJceGRjXHg3OFx4ZWJceDRmXHhkOFx4 OTYiCisJCQkgICJceDQ3XHhjYVx4YjhceDkxXHhmOVx4ZjdceDk0XHgyMSIKKwkJCSAgIlx4NWZc eDlhXHg5Zlx4NWJceGI4XHg0MFx4NDFceDRiIgorCQkJICAiXHg2Nlx4NjlceDZhXHg3Mlx4ZDBc eGNiXHg3MFx4YjciCisJCQkgICJceDkzXHhiNVx4MzdceDk2XHgwNVx4MzdceDRmXHhlNSIKKwkJ CSAgIlx4OGNceGE3XHg1YVx4NGVceDhiXHhiN1x4ODRceGVhIgorCQkJICAiXHhjN1x4ZmNceDE5 XHg2ZVx4MWZceDVhXHhhMVx4YWMiCisJCQkgICJceDE4XHg3ZFx4NTJceDNiXHhiM1x4MzRceDYy XHg5OSIKKwkJCSAgIlx4ZTRceDllXHgzMVx4MDRceDNmXHhjMFx4OGRceDg0IgorCQkJICAiXHgx N1x4N2NceDI1XHg0OFx4NTJceDY3XHgxMVx4MjciCisJCQkgICJceDY3XHhiYlx4NWFceDg1XHhj YVx4NTZceGIyXHg1YyIKKwkJCSAgIlx4ZTZceGVjXHhkNVx4OTZceDNkXHgxNVx4ZmNceGZiIgor CQkJICAiXHgyMlx4MjVceGY0XHgxM1x4ZTVceDkzXHg0Ylx4OWEiCisJCQkgICJceDc3XHhmMVx4 NTJceDE4XHhmYVx4MTZceDVlXHg0OSIKKwkJCSAgIlx4MDNceDQ1XHhhOFx4MDhceGZhXHhiM1x4 NDFceDkyIgorCQkJICAiXHg3OVx4NTBceDMzXHhjYVx4ZDBceGQ3XHg0Mlx4NTUiCisJCQkgICJc eGMzXHg5YVx4MGNceDRlXHhkOVx4YTRceDNjXHg4NiIKKwkJCSAgIlx4ODBceDlmXHg1M1x4ZDFc eGE0XHgyZVx4ZDFceGJjIgorCQkJICAiXHhmMVx4NTRceDZlXHg5M1x4YTRceDY1XHg5OVx4OGUi CisJCQkgICJceGRmXHgyOVx4YzBceDY0XHg2M1x4MDdceGJiXHhlYSIsCisJCS5jdGV4dAk9ICJc eDlmXHg3Mlx4ODdceGM3XHgxN1x4ZmJceDIwXHgxNSIKKwkJCSAgIlx4NjVceGIzXHg1NVx4YThc eDFjXHg4ZVx4NTJceDMyIgorCQkJICAiXHhiMVx4ODJceDhkXHhiZlx4YjVceDlmXHgxMFx4MGEi CisJCQkgICJceGU4XHgwY1x4NzBceDYyXHhlZlx4ODlceGI2XHgxZiIKKwkJCSAgIlx4NzNceGNj XHhlNFx4Y2NceDdhXHgzYVx4NzVceDRhIgorCQkJICAiXHgyNlx4ZTdceGY1XHhkN1x4N2JceDE3 XHgzOVx4MmQiCisJCQkgICJceGQyXHgyN1x4NmVceGY5XHgyZlx4OWVceGUyXHhmNiIKKwkJCSAg Ilx4ZmFceDE2XHhjMlx4ZjJceDQ5XHgyNlx4YTdceDViIgorCQkJICAiXHhlN1x4Y2FceDI1XHgw ZVx4NDVceGEwXHgzNFx4YzIiCisJCQkgICJceDlhXHgzN1x4NzlceDdlXHg3Y1x4NThceDE4XHg5 NCIKKwkJCSAgIlx4MTBceGE4XHg3Y1x4NDhceGE5XHhkN1x4NjNceDg5IgorCQkJICAiXHg5ZVx4 NjFceDRkXHgyNlx4MzRceGQ5XHhmMFx4YjEiCisJCQkgICJceDJkXHgxN1x4MmNceDZmXHg3Y1x4 MzVceDBlXHhiZSIKKwkJCSAgIlx4NzdceDcxXHg3Y1x4MTdceDViXHhhYlx4NzBceGRiIgorCQkJ ICAiXHgyZlx4NTRceDBmXHhhOVx4YzhceGY0XHhmNVx4YWIiCisJCQkgICJceDUyXHgwNFx4M2Fc eGI4XHgwM1x4YTdceGZkXHg1NyIKKwkJCSAgIlx4NDVceDVlXHhiY1x4NzdceGUxXHhlZVx4Nzlc eDhjIgorCQkJICAiXHg1OFx4N2JceDFmXHhmN1x4NzVceGRlXHg2OFx4MTciCisJCQkgICJceDk4 XHg4NVx4OGFceDE4XHg1Y1x4ZDJceDM5XHg3OCIKKwkJCSAgIlx4N2FceDZmXHgyNlx4NmVceGUx XHgxM1x4OTFceGRkIgorCQkJICAiXHhkZlx4MGVceDZlXHg2N1x4Y2NceDUxXHg1M1x4ZDgiCisJ CQkgICJceDE3XHg1ZVx4Y2VceGE3XHhlNFx4YWZceGZhXHhmMyIKKwkJCSAgIlx4NGZceDlmXHgw MVx4OWJceDA0XHhlN1x4ZmNceGY5IgorCQkJICAiXHg2YVx4ZGNceDFkXHgwY1x4OWFceGFhXHgz YVx4N2EiCisJCQkgICJceDczXHgwM1x4ZGZceGJmXHgzYlx4ODJceGJlXHhiMCIKKwkJCSAgIlx4 YjRceGE0XHhjZlx4MDdceGQ3XHhkZVx4NzFceDI1IgorCQkJICAiXHhjNVx4MTBceGVlXHgwYVx4 MTVceDk2XHg4Ylx4NGYiCisJCQkgICJceGZlXHhiOFx4MjhceGJkXHg0YVx4Y2RceGViXHg5ZiIK KwkJCSAgIlx4NWRceDAwXHhjMVx4ZWVceGU4XHgxNlx4NDRceGVjIgorCQkJICAiXHhlOVx4N2Jc eGQ2XHg4NVx4MTdceDI5XHhjZlx4NTgiCisJCQkgICJceDIwXHhhYlx4ZjdceGNlXHg2Ylx4ZTdc eDcxXHg3ZCIKKwkJCSAgIlx4NGZceGE4XHhiMFx4ZTlceDdkXHg3MFx4ZDZceDBiIgorCQkJICAi XHgyZVx4MjBceGIxXHgxYVx4NjNceDM3XHhhYVx4MmMiCisJCQkgICJceDk0XHhlZVx4ZDVceGY2 XHg1OFx4MmFceGY0XHg3YSIKKwkJCSAgIlx4NGNceGJhXHhmNVx4ZTlceDNjXHg2Zlx4OTVceDEz IgorCQkJICAiXHg1Zlx4OTZceDgxXHg1Ylx4YjVceDYyXHhmMlx4ZDciCisJCQkgICJceDhkXHhi ZVx4YTFceDMxXHg1MVx4ZTZceGZlXHhjOSIKKwkJCSAgIlx4MDdceDdkXHgwZlx4MDBceDNhXHg2 Nlx4OGNceDRiIgorCQkJICAiXHg5NFx4YWFceGU1XHg1Nlx4ZGVceGNkXHg3NFx4YTciCisJCQkg ICJceDQ4XHg2N1x4NmZceGVkXHhjOVx4NmFceGVmXHhhZiIKKwkJCSAgIlx4OWFceGI3XHhhZVx4 NjBceGZhXHhjMFx4MzdceDM5IgorCQkJICAiXHhhNVx4MjVceGU1XHgyMlx4ZWFceDgyXHg1NVx4 NjgiCisJCQkgICJceDNlXHgzMFx4YzNceDVhXHhiNlx4MjlceDczXHg3YSIKKwkJCSAgIlx4YjZc eGZiXHgzNFx4ZWVceDUxXHg3Y1x4NTRceGU1IgorCQkJICAiXHgwMVx4NGRceDcyXHgyNVx4MzJc eDRhXHhhM1x4NjgiCisJCQkgICJceDgwXHg5YVx4ODlceGM1XHgxMVx4NjZceDRjXHg4YyIKKwkJ CSAgIlx4NDRceDUwXHhiZVx4ZDdceGEwXHhlZVx4YTZceGJiIgorCQkJICAiXHg5Mlx4MGNceGU2 XHhkN1x4ODNceDUxXHhiMVx4NjkiCisJCQkgICJceDYzXHg0MFx4ZjNceGY0XHg5Mlx4ODRceGM0 XHgzOCIKKwkJCSAgIlx4MjlceGZiXHhiNFx4ODRceGEwXHgxOVx4NzVceDE2IgorCQkJICAiXHg2 MFx4YmZceDBhXHg5Y1x4ODlceGVlXHhhZFx4YjQiCisJCQkgICJceDQzXHhmOVx4NzFceDM5XHg0 NVx4N2NceDI0XHg4MyIKKwkJCSAgIlx4MzBceGJiXHhlZVx4MjhceGIwXHg4Nlx4N2JceGVjIgor CQkJICAiXHg5M1x4YzFceGJmXHhiOVx4OTdceDFiXHg5Nlx4ZWYiCisJCQkgICJceGVlXHg1OFx4 MzVceDYxXHgxMlx4MTlceGRhXHgyNSIKKwkJCSAgIlx4NzdceGU1XHg4MFx4MWFceDMxXHgyN1x4 OWJceGU0IgorCQkJICAiXHhkYVx4OGJceDdlXHg1MVx4NGRceGNiXHgwMVx4MTkiCisJCQkgICJc eDRmXHhkY1x4OTJceDFhXHgxN1x4ZDVceDZiXHhmNCIKKwkJCSAgIlx4NTBceGUzXHgwNlx4ZTRc eDc2XHg5Zlx4NjVceDAwIgorCQkJICAiXHhiZFx4N2FceGUyXHg2NFx4MjZceGYyXHhlNFx4N2Ui CisJCQkgICJceDQwXHhmMlx4ODBceGFiXHg2Mlx4ZDVceGVmXHgyMyIKKwkJCSAgIlx4OGJceGZi XHg2Zlx4MjRceDZlXHg5Ylx4NjZceDBlIgorCQkJICAiXHhmNFx4MWNceDI0XHgxZVx4MWRceDI2 XHg5NVx4MDkiCisJCQkgICJceDk0XHgzY1x4YjJceGI2XHgwMlx4YTdceGQ5XHg5YSIsCisJCS5r bGVuCT0gMzIsCisJCS5sZW4JPSA1MTIsCisJfSwKKworfTsKKwogI2VuZGlmCS8qIF9DUllQVE9f VEVTVE1HUl9IICovCi0tIAoyLjM2LjAuNDY0LmdiOWM4YjQ2ZTk0LWdvb2cKCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1h aWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xp c3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==