From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 39297 invoked by alias); 27 Feb 2020 10:35:11 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 11634 invoked by uid 89); 27 Feb 2020 10:33:13 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.0 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LOTSOFHASH,MISSING_MID autolearn=ham version=3.3.1 spammy=UD:arm.com X-HELO: foss.arm.com Received: from foss.arm.com (HELO foss.arm.com) (217.140.110.172) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 27 Feb 2020 10:33:02 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 3259B1FB; Thu, 27 Feb 2020 02:33:01 -0800 (PST) Received: from e121093-lin.cambridge.arm.com (e121093-lin.cambridge.arm.com [10.2.78.84]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 674033F881; Thu, 27 Feb 2020 02:33:00 -0800 (PST) Content-Type: multipart/mixed; boundary="===============4542924355783240075==" MIME-Version: 1.0 From: Mihail Ionescu Date: Thu, 27 Feb 2020 10:35:00 -0000 To: gcc-patches@gcc.gnu.org Cc: Richard.Earnshaw@arm.com, Kyrylo.Tkachov@arm.com Subject: [GCC][PATCH][ARM] Add vreinterpret, vdup, vget and vset bfloat16 intrinsic Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2020-02/txt/msg01537.txt.bz2 Message-ID: <20200227103500.9ssIHSIhoJnFlXXjlG2A1KSow4r_zx3BkHIUdggSwKo@z> Hi, This patch adds support for the bf16 vector create, get, set, duplicate and reinterpret intrinsics. ACLE documents are at https://developer.arm.com/docs/101028/latest ISA documents are at https://developer.arm.com/docs/ddi0596/latest Regression tested on arm-none-eabi. gcc/ChangeLog: 2020-02-27 Mihail Ionescu * (__ARM_NUM_LANES, __arm_lane, __arm_lane_q): Move to the beginning of the file. (vcreate_bf16, vcombine_bf16): New. (vdup_n_bf16, vdupq_n_bf16): New. (vdup_lane_bf16, vdup_laneq_bf16): New. (vdupq_lane_bf16, vdupq_laneq_bf16): New. (vduph_lane_bf16, vduph_laneq_bf16): New. (vset_lane_bf16, vsetq_lane_bf16): New. (vget_lane_bf16, vgetq_lane_bf16): New. (vget_high_bf16, vget_low_bf16): New. (vreinterpret_bf16_u8, vreinterpretq_bf16_u8): New. (vreinterpret_bf16_u16, vreinterpretq_bf16_u16): New. (vreinterpret_bf16_u32, vreinterpretq_bf16_u32): New. (vreinterpret_bf16_u64, vreinterpretq_bf16_u64): New. (vreinterpret_bf16_s8, vreinterpretq_bf16_s8): New. (vreinterpret_bf16_s16, vreinterpretq_bf16_s16): New. (vreinterpret_bf16_s32, vreinterpretq_bf16_s32): New. (vreinterpret_bf16_s64, vreinterpretq_bf16_s64): New. (vreinterpret_bf16_p8, vreinterpretq_bf16_p8): New. (vreinterpret_bf16_p16, vreinterpretq_bf16_p16): New. (vreinterpret_bf16_p64, vreinterpretq_bf16_p64): New. (vreinterpret_bf16_f32, vreinterpretq_bf16_f32): New. (vreinterpret_bf16_f64, vreinterpretq_bf16_f64): New. (vreinterpretq_bf16_p128): New. (vreinterpret_s8_bf16, vreinterpretq_s8_bf16): New. (vreinterpret_s16_bf16, vreinterpretq_s16_bf16): New. (vreinterpret_s32_bf16, vreinterpretq_s32_bf16): New. (vreinterpret_s64_bf16, vreinterpretq_s64_bf16): New. (vreinterpret_u8_bf16, vreinterpretq_u8_bf16): New. (vreinterpret_u16_bf16, vreinterpretq_u16_bf16): New. (vreinterpret_u32_bf16, vreinterpretq_u32_bf16): New. (vreinterpret_u64_bf16, vreinterpretq_u64_bf16): New. (vreinterpret_p8_bf16, vreinterpretq_p8_bf16): New. (vreinterpret_p16_bf16, vreinterpretq_p16_bf16): New. (vreinterpret_p64_bf16, vreinterpretq_p64_bf16): New. (vreinterpret_f32_bf16, vreinterpretq_f32_bf16): New. (vreinterpretq_p128_bf16): New. * config/arm/arm_neon_builtins.def (VDX): Add V4BF. (V_elem): Likewise. (V_elem_l): Likewise. (VD_LANE): Likewise. (VQX) Add V8BF. (V_DOUBLE): Likewise. (VDQX): Add V4BF and V8BF. (V_two_elem, V_three_elem, V_four_elem): Likewise. (V_reg): Likewise. (V_HALF): Likewise. (V_double_vector_mode): Likewise. (V_cmp_result): Likewise. (V_uf_sclr): Likewise. (V_sz_elem): Likewise. (Is_d_reg): Likewise. (V_mode_nunits): Likewise. * config/arm/neon.md (neon_vdup_lane): Enable for BFloat. gcc/testsuite/ChangeLog: 2020-02-27 Mihail Ionescu * gcc.target/arm/bf16_dup.c: New test. * gcc.target/arm/bf16_reinterpret.c: Likewise. Is it ok for trunk? Regards, Mihail ############### Attachment also inlined for ease of reply ############### diff --git a/gcc/config/arm/arm_neon.h b/gcc/config/arm/arm_neon.h index 09297831cdcd6e695843c17b7724c114f3a129fe..5901a8f1fb84f204ae95f0ccc97bf5ae944c482c 100644 --- a/gcc/config/arm/arm_neon.h +++ b/gcc/config/arm/arm_neon.h @@ -42,6 +42,15 @@ extern "C" { #include #include +#ifdef __ARM_BIG_ENDIAN +#define __ARM_NUM_LANES(__v) (sizeof (__v) / sizeof (__v[0])) +#define __arm_lane(__vec, __idx) (__idx ^ (__ARM_NUM_LANES(__vec) - 1)) +#define __arm_laneq(__vec, __idx) (__idx ^ (__ARM_NUM_LANES(__vec)/2 - 1)) +#else +#define __arm_lane(__vec, __idx) __idx +#define __arm_laneq(__vec, __idx) __idx +#endif + typedef __simd64_int8_t int8x8_t; typedef __simd64_int16_t int16x4_t; typedef __simd64_int32_t int32x2_t; @@ -6147,14 +6156,6 @@ vget_lane_s32 (int32x2_t __a, const int __b) /* For big-endian, GCC's vector indices are reversed within each 64 bits compared to the architectural lane indices used by Neon intrinsics. */ -#ifdef __ARM_BIG_ENDIAN -#define __ARM_NUM_LANES(__v) (sizeof (__v) / sizeof (__v[0])) -#define __arm_lane(__vec, __idx) (__idx ^ (__ARM_NUM_LANES(__vec) - 1)) -#define __arm_laneq(__vec, __idx) (__idx ^ (__ARM_NUM_LANES(__vec)/2 - 1)) -#else -#define __arm_lane(__vec, __idx) __idx -#define __arm_laneq(__vec, __idx) __idx -#endif #define vget_lane_f16(__v, __idx) \ __extension__ \ @@ -14476,6 +14477,15 @@ vreinterpret_p16_u32 (uint32x2_t __a) #if defined (__ARM_FP16_FORMAT_IEEE) || defined (__ARM_FP16_FORMAT_ALTERNATIVE) __extension__ extern __inline float16x4_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_f16_bf16 (bfloat16x4_t __a) +{ + return (float16x4_t) __a; +} +#endif + +#if defined (__ARM_FP16_FORMAT_IEEE) || defined (__ARM_FP16_FORMAT_ALTERNATIVE) +__extension__ extern __inline float16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vreinterpret_f16_p8 (poly8x8_t __a) { return (float16x4_t) __a; @@ -15688,6 +15698,15 @@ vreinterpretq_f16_p16 (poly16x8_t __a) #if defined (__ARM_FP16_FORMAT_IEEE) || defined (__ARM_FP16_FORMAT_ALTERNATIVE) __extension__ extern __inline float16x8_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_f16_bf16 (bfloat16x8_t __a) +{ + return (float16x8_t) __a; +} +#endif + +#if defined (__ARM_FP16_FORMAT_IEEE) || defined (__ARM_FP16_FORMAT_ALTERNATIVE) +__extension__ extern __inline float16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vreinterpretq_f16_f32 (float32x4_t __a) { return (float16x8_t) __a; @@ -18750,6 +18769,492 @@ vcmlaq_rot270_laneq_f32 (float32x4_t __r, float32x4_t __a, float32x4_t __b, #pragma GCC push_options #pragma GCC target ("arch=armv8.2-a+bf16") +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vcreate_bf16 (uint64_t __a) +{ + return (bfloat16x4_t) __a; +} + +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vdup_n_bf16 (bfloat16_t __a) +{ + return __builtin_neon_vdup_nv4bf (__a); +} + +__extension__ extern __inline bfloat16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vdupq_n_bf16 (bfloat16_t __a) +{ + return __builtin_neon_vdup_nv8bf (__a); +} + +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vdup_lane_bf16 (bfloat16x4_t __a, const int __b) +{ + return __builtin_neon_vdup_lanev4bf (__a, __b); +} + +__extension__ extern __inline bfloat16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vdupq_lane_bf16 (bfloat16x4_t __a, const int __b) +{ + return __builtin_neon_vdup_lanev8bf (__a, __b); +} + +#define vset_lane_bf16(__e, __v, __idx) \ + __extension__ \ + ({ \ + bfloat16_t __elem = (__e); \ + bfloat16x4_t __vec = (__v); \ + __builtin_arm_lane_check (4, __idx); \ + __vec[__arm_lane(__vec, __idx)] = __elem; \ + __vec; \ + }) + +#define vsetq_lane_bf16(__e, __v, __idx) \ + __extension__ \ + ({ \ + bfloat16_t __elem = (__e); \ + bfloat16x8_t __vec = (__v); \ + __builtin_arm_lane_check (8, __idx); \ + __vec[__arm_laneq(__vec, __idx)] = __elem; \ + __vec; \ + }) + +#define vget_lane_bf16(__v, __idx) \ + __extension__ \ + ({ \ + bfloat16x4_t __vec = (__v); \ + __builtin_arm_lane_check (4, __idx); \ + bfloat16_t __res = __vec[__arm_lane(__vec, __idx)]; \ + __res; \ + }) + +#define vgetq_lane_bf16(__v, __idx) \ + __extension__ \ + ({ \ + bfloat16x8_t __vec = (__v); \ + __builtin_arm_lane_check (8, __idx); \ + bfloat16_t __res = __vec[__arm_laneq(__vec, __idx)]; \ + __res; \ + }) + +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vdup_laneq_bf16 (bfloat16x8_t __a, const int __b) +{ + return vdup_n_bf16( vgetq_lane_bf16 (__a, __b)); +} + +__extension__ extern __inline bfloat16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vdupq_laneq_bf16 (bfloat16x8_t __a, const int __b) +{ + return vdupq_n_bf16( vgetq_lane_bf16 (__a, __b)); +} + +__extension__ extern __inline bfloat16_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vduph_lane_bf16 (bfloat16x4_t __a, const int __b) +{ + return vget_lane_bf16 (__a, __b); +} + +__extension__ extern __inline bfloat16_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vduph_laneq_bf16 (bfloat16x8_t __a, const int __b) +{ + return vgetq_lane_bf16 (__a, __b); +} + +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vget_high_bf16 (bfloat16x8_t __a) +{ + return __builtin_neon_vget_highv8bf (__a); +} + +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vget_low_bf16 (bfloat16x8_t __a) +{ + return __builtin_neon_vget_lowv8bf (__a); +} + +__extension__ extern __inline bfloat16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vcombine_bf16 (bfloat16x4_t __a, bfloat16x4_t __b) +{ + return __builtin_neon_vcombinev4bf (__a, __b); +} + +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_bf16_u8 (uint8x8_t __a) +{ + return (bfloat16x4_t)__a; +} + +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_bf16_u16 (uint16x4_t __a) +{ + return (bfloat16x4_t)__a; +} + +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_bf16_u32 (uint32x2_t __a) +{ + return (bfloat16x4_t)__a; +} + +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_bf16_u64 (uint64x1_t __a) +{ + return (bfloat16x4_t)__a; +} + +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_bf16_s8 (int8x8_t __a) +{ + return (bfloat16x4_t)__a; +} + +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_bf16_s16 (int16x4_t __a) +{ + return (bfloat16x4_t)__a; +} + +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_bf16_s32 (int32x2_t __a) +{ + return (bfloat16x4_t)__a; +} + +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_bf16_s64 (int64x1_t __a) +{ + return (bfloat16x4_t)__a; +} + +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_bf16_p8 (poly8x8_t __a) +{ + return (bfloat16x4_t)__a; +} + +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_bf16_p16 (poly16x4_t __a) +{ + return (bfloat16x4_t)__a; +} + +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_bf16_p64 (poly64x1_t __a) +{ + return (bfloat16x4_t)__a; +} + +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_bf16_f16 (float16x4_t __a) +{ + return (bfloat16x4_t)__a; +} + +__extension__ extern __inline bfloat16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_bf16_f32 (float32x2_t __a) +{ + return (bfloat16x4_t)__a; +} + +__extension__ extern __inline bfloat16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_bf16_u8 (uint8x16_t __a) +{ + return (bfloat16x8_t)__a; +} + +__extension__ extern __inline bfloat16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_bf16_u16 (uint16x8_t __a) +{ + return (bfloat16x8_t)__a; +} + +__extension__ extern __inline bfloat16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_bf16_u32 (uint32x4_t __a) +{ + return (bfloat16x8_t)__a; +} + +__extension__ extern __inline bfloat16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_bf16_u64 (uint64x2_t __a) +{ + return (bfloat16x8_t)__a; +} + +__extension__ extern __inline bfloat16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_bf16_s8 (int8x16_t __a) +{ + return (bfloat16x8_t)__a; +} + +__extension__ extern __inline bfloat16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_bf16_s16 (int16x8_t __a) +{ + return (bfloat16x8_t)__a; +} + +__extension__ extern __inline bfloat16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_bf16_s32 (int32x4_t __a) +{ + return (bfloat16x8_t)__a; +} + +__extension__ extern __inline bfloat16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_bf16_s64 (int64x2_t __a) +{ + return (bfloat16x8_t)__a; +} + +__extension__ extern __inline bfloat16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_bf16_p8 (poly8x16_t __a) +{ + return (bfloat16x8_t)__a; +} + +__extension__ extern __inline bfloat16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_bf16_p16 (poly16x8_t __a) +{ + return (bfloat16x8_t)__a; +} + +__extension__ extern __inline bfloat16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_bf16_p64 (poly64x2_t __a) +{ + return (bfloat16x8_t)__a; +} + +__extension__ extern __inline bfloat16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_bf16_p128 (poly128_t __a) +{ + return (bfloat16x8_t)__a; +} + +__extension__ extern __inline bfloat16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_bf16_f16 (float16x8_t __a) +{ + return (bfloat16x8_t)__a; +} + +__extension__ extern __inline bfloat16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_bf16_f32 (float32x4_t __a) +{ + return (bfloat16x8_t)__a; +} + +__extension__ extern __inline int8x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_s8_bf16 (bfloat16x4_t __a) +{ + return (int8x8_t)__a; +} + +__extension__ extern __inline int16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_s16_bf16 (bfloat16x4_t __a) +{ + return (int16x4_t)__a; +} + +__extension__ extern __inline int32x2_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_s32_bf16 (bfloat16x4_t __a) +{ + return (int32x2_t)__a; +} + +__extension__ extern __inline int64x1_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_s64_bf16 (bfloat16x4_t __a) +{ + return (int64x1_t)__a; +} + +__extension__ extern __inline uint8x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_u8_bf16 (bfloat16x4_t __a) +{ + return (uint8x8_t)__a; +} + +__extension__ extern __inline uint16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_u16_bf16 (bfloat16x4_t __a) +{ + return (uint16x4_t)__a; +} + +__extension__ extern __inline uint32x2_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_u32_bf16 (bfloat16x4_t __a) +{ + return (uint32x2_t)__a; +} + +__extension__ extern __inline uint64x1_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_u64_bf16 (bfloat16x4_t __a) +{ + return (uint64x1_t)__a; +} + +__extension__ extern __inline float32x2_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_f32_bf16 (bfloat16x4_t __a) +{ + return (float32x2_t)__a; +} + +__extension__ extern __inline poly8x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_p8_bf16 (bfloat16x4_t __a) +{ + return (poly8x8_t)__a; +} + +__extension__ extern __inline poly16x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_p16_bf16 (bfloat16x4_t __a) +{ + return (poly16x4_t)__a; +} + +__extension__ extern __inline poly64x1_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpret_p64_bf16 (bfloat16x4_t __a) +{ + return (poly64x1_t)__a; +} + +__extension__ extern __inline int8x16_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_s8_bf16 (bfloat16x8_t __a) +{ + return (int8x16_t)__a; +} + +__extension__ extern __inline int16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_s16_bf16 (bfloat16x8_t __a) +{ + return (int16x8_t)__a; +} + +__extension__ extern __inline int32x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_s32_bf16 (bfloat16x8_t __a) +{ + return (int32x4_t)__a; +} + +__extension__ extern __inline int64x2_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_s64_bf16 (bfloat16x8_t __a) +{ + return (int64x2_t)__a; +} + +__extension__ extern __inline uint8x16_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_u8_bf16 (bfloat16x8_t __a) +{ + return (uint8x16_t)__a; +} + +__extension__ extern __inline uint16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_u16_bf16 (bfloat16x8_t __a) +{ + return (uint16x8_t)__a; +} + +__extension__ extern __inline uint32x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_u32_bf16 (bfloat16x8_t __a) +{ + return (uint32x4_t)__a; +} + +__extension__ extern __inline uint64x2_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_u64_bf16 (bfloat16x8_t __a) +{ + return (uint64x2_t)__a; +} + +__extension__ extern __inline float32x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_f32_bf16 (bfloat16x8_t __a) +{ + return (float32x4_t)__a; +} + +__extension__ extern __inline poly8x16_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_p8_bf16 (bfloat16x8_t __a) +{ + return (poly8x16_t)__a; +} + +__extension__ extern __inline poly16x8_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_p16_bf16 (bfloat16x8_t __a) +{ + return (poly16x8_t)__a; +} + +__extension__ extern __inline poly64x2_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_p64_bf16 (bfloat16x8_t __a) +{ + return (poly64x2_t)__a; +} + +__extension__ extern __inline poly128_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vreinterpretq_p128_bf16 (bfloat16x8_t __a) +{ + return (poly128_t)__a; +} + __extension__ extern __inline float32x2_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vbfdot_f32 (float32x2_t __r, bfloat16x4_t __a, bfloat16x4_t __b) diff --git a/gcc/config/arm/arm_neon_builtins.def b/gcc/config/arm/arm_neon_builtins.def index 85aeaecf0dc7579f511d0979708635ed65399614..bf28b24b108a081a023aa76f70d4da8bc0cc2d7e 100644 --- a/gcc/config/arm/arm_neon_builtins.def +++ b/gcc/config/arm/arm_neon_builtins.def @@ -221,13 +221,13 @@ VAR10 (SETLANE, vset_lane, VAR5 (UNOP, vcreate, v8qi, v4hi, v2si, v2sf, di) VAR10 (UNOP, vdup_n, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) -VAR2 (UNOP, vdup_n, v8hf, v4hf) +VAR4 (UNOP, vdup_n, v8hf, v4hf, v8bf, v4bf) VAR10 (GETLANE, vdup_lane, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) -VAR2 (GETLANE, vdup_lane, v8hf, v4hf) -VAR6 (COMBINE, vcombine, v8qi, v4hi, v4hf, v2si, v2sf, di) -VAR6 (UNOP, vget_high, v16qi, v8hi, v8hf, v4si, v4sf, v2di) -VAR6 (UNOP, vget_low, v16qi, v8hi, v8hf, v4si, v4sf, v2di) +VAR4 (GETLANE, vdup_lane, v8hf, v4hf, v8bf, v4bf) +VAR7 (COMBINE, vcombine, v8qi, v4hi, v4hf, v2si, v2sf, di, v4bf) +VAR7 (UNOP, vget_high, v16qi, v8hi, v8hf, v8bf, v4si, v4sf, v2di) +VAR7 (UNOP, vget_low, v16qi, v8hi, v8hf, v8bf, v4si, v4sf, v2di) VAR3 (UNOP, vmovn, v8hi, v4si, v2di) VAR3 (UNOP, vqmovns, v8hi, v4si, v2di) VAR3 (UNOP, vqmovnu, v8hi, v4si, v2di) @@ -376,4 +376,4 @@ VAR2 (MAC_LANE_PAIR, vcmlaq_lane270, v4sf, v8hf) VAR2 (TERNOP, vbfdot, v2sf, v4sf) VAR2 (MAC_LANE_PAIR, vbfdot_lanev4bf, v2sf, v4sf) -VAR2 (MAC_LANE_PAIR, vbfdot_lanev8bf, v2sf, v4sf) \ No newline at end of file +VAR2 (MAC_LANE_PAIR, vbfdot_lanev8bf, v2sf, v4sf) diff --git a/gcc/config/arm/iterators.md b/gcc/config/arm/iterators.md index cf5bfb4c77a7be0400bada8c517b877537f4d2c6..1b6aada0d0879a7f521bf868ad2c19166962fff2 100644 --- a/gcc/config/arm/iterators.md +++ b/gcc/config/arm/iterators.md @@ -82,14 +82,14 @@ (define_mode_iterator VD_RE [V8QI V4HI V2SI V2SF DI]) ;; Double-width vector modes plus 64-bit elements. -(define_mode_iterator VDX [V8QI V4HI V4HF V2SI V2SF DI]) +(define_mode_iterator VDX [V8QI V4HI V4HF V4BF V2SI V2SF DI]) ;; Double-width vector modes plus 64-bit elements, ;; with V4BFmode added, suitable for moves. (define_mode_iterator VDXMOV [V8QI V4HI V4HF V4BF V2SI V2SF DI]) ;; Double-width vector modes, with V4HF - for vldN_lane and vstN_lane. -(define_mode_iterator VD_LANE [V8QI V4HI V4HF V2SI V2SF]) +(define_mode_iterator VD_LANE [V8QI V4HI V4HF V4BF V2SI V2SF]) ;; Double-width vector modes without floating-point elements. (define_mode_iterator VDI [V8QI V4HI V2SI]) @@ -104,7 +104,7 @@ (define_mode_iterator VQ_HS [V8HI V8HF V4SI V4SF]) ;; Quad-width vector modes plus 64-bit elements. -(define_mode_iterator VQX [V16QI V8HI V8HF V4SI V4SF V2DI]) +(define_mode_iterator VQX [V16QI V8HI V8HF V8BF V4SI V4SF V2DI]) ;; Quad-width vector modes without floating-point elements. (define_mode_iterator VQI [V16QI V8HI V4SI]) @@ -153,7 +153,7 @@ ;; Vector modes, including 64-bit integer elements. (define_mode_iterator VDQX [V8QI V16QI V4HI V8HI V2SI V4SI - V4HF V8HF V2SF V4SF DI V2DI]) + V4HF V8HF V4BF V8BF V2SF V4SF DI V2DI]) ;; Vector modes including 64-bit integer elements, but no floats. (define_mode_iterator VDQIX [V8QI V16QI V4HI V8HI V2SI V4SI DI V2DI]) @@ -518,6 +518,7 @@ (define_mode_attr V_elem [(V8QI "QI") (V16QI "QI") (V4HI "HI") (V8HI "HI") (V4HF "HF") (V8HF "HF") + (V4BF "BF") (V8BF "BF") (V2SI "SI") (V4SI "SI") (V2SF "SF") (V4SF "SF") (DI "DI") (V2DI "DI")]) @@ -526,6 +527,7 @@ (define_mode_attr V_elem_l [(V8QI "qi") (V16QI "qi") (V4HI "hi") (V8HI "hi") (V4HF "hf") (V8HF "hf") + (V4BF "bf") (V8BF "bf") (V2SI "si") (V4SI "si") (V2SF "sf") (V4SF "sf") (DI "di") (V2DI "di")]) @@ -543,6 +545,7 @@ (define_mode_attr V_two_elem [(V8QI "HI") (V16QI "HI") (V4HI "SI") (V8HI "SI") (V4HF "SF") (V8HF "SF") + (V4BF "BF") (V8BF "BF") (V2SI "V2SI") (V4SI "V2SI") (V2SF "V2SF") (V4SF "V2SF") (DI "V2DI") (V2DI "V2DI")]) @@ -563,6 +566,7 @@ (define_mode_attr V_three_elem [(V8QI "BLK") (V16QI "BLK") (V4HI "BLK") (V8HI "BLK") (V4HF "BLK") (V8HF "BLK") + (V4BF "BLK") (V8BF "BLK") (V2SI "BLK") (V4SI "BLK") (V2SF "BLK") (V4SF "BLK") (DI "EI") (V2DI "EI")]) @@ -571,6 +575,7 @@ (define_mode_attr V_four_elem [(V8QI "SI") (V16QI "SI") (V4HI "V4HI") (V8HI "V4HI") (V4HF "V4HF") (V8HF "V4HF") + (V4BF "V4BF") (V8BF "V4BF") (V2SI "V4SI") (V4SI "V4SI") (V2SF "V4SF") (V4SF "V4SF") (DI "OI") (V2DI "OI")]) @@ -579,6 +584,7 @@ (define_mode_attr V_reg [(V8QI "P") (V16QI "q") (V4HI "P") (V8HI "q") (V4HF "P") (V8HF "q") + (V4BF "P") (V8BF "q") (V2SI "P") (V4SI "q") (V2SF "P") (V4SF "q") (DI "P") (V2DI "q") @@ -609,7 +615,8 @@ (define_mode_attr V_HALF [(V16QI "V8QI") (V8HI "V4HI") (V8HF "V4HF") (V4SI "V2SI") (V4SF "V2SF") (V2DF "DF") - (V2DI "DI") (V4HF "HF")]) + (V2DI "DI") (V4HF "HF") + (V4BF "BF") (V8BF "V4BF")]) ;; Same, but lower-case. (define_mode_attr V_half [(V16QI "v8qi") (V8HI "v4hi") @@ -620,7 +627,7 @@ (define_mode_attr V_DOUBLE [(V8QI "V16QI") (V4HI "V8HI") (V2SI "V4SI") (V4HF "V8HF") (V2SF "V4SF") (DF "V2DF") - (DI "V2DI")]) + (DI "V2DI") (V4BF "V8BF")]) ;; Same, but lower-case. (define_mode_attr V_double [(V8QI "v16qi") (V4HI "v8hi") @@ -639,6 +646,7 @@ (V4SI "V2SI") (V4SF "V2SF") (V8QI "V8QI") (V4HI "V4HI") (V2SI "V2SI") (V2SF "V2SF") + (V8BF "V4BF") (V4BF "V4BF") (V8HF "V4HF") (V4HF "V4HF")]) ;; Mode of result of comparison operations (and bit-select operand 1). @@ -646,6 +654,7 @@ (V4HI "V4HI") (V8HI "V8HI") (V2SI "V2SI") (V4SI "V4SI") (V4HF "V4HI") (V8HF "V8HI") + (V4BF "V4HI") (V8BF "V8HI") (V2SF "V2SI") (V4SF "V4SI") (DI "DI") (V2DI "V2DI")]) @@ -687,6 +696,7 @@ (V4HI "u16") (V8HI "u16") (V2SI "32") (V4SI "32") (V4HF "u16") (V8HF "u16") + (V4BF "u16") (V8BF "u16") (V2SF "32") (V4SF "32")]) (define_mode_attr V_sz_elem [(V8QI "8") (V16QI "8") @@ -694,6 +704,7 @@ (V2SI "32") (V4SI "32") (DI "64") (V2DI "64") (V4HF "16") (V8HF "16") + (V4BF "16") (V8BF "16") (V2SF "32") (V4SF "32")]) (define_mode_attr V_elem_ch [(V8QI "b") (V16QI "b") @@ -764,10 +775,12 @@ (V2SI "true") (V4SI "false") (V2SF "true") (V4SF "false") (DI "true") (V2DI "false") + (V4BF "true") (V8BF "false") (V4HF "true") (V8HF "false")]) (define_mode_attr V_mode_nunits [(V8QI "8") (V16QI "16") (V4HF "4") (V8HF "8") + (V4BF "4") (V8BF "8") (V4HI "4") (V8HI "8") (V2SI "2") (V4SI "4") (V2SF "2") (V4SF "4") diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md index 21701b34fcd2c86bfd310904c7ceca0ce9fb047e..e732600719e2c0df35e1ec0a4ed1cb235dc25726 100644 --- a/gcc/config/arm/neon.md +++ b/gcc/config/arm/neon.md @@ -3704,6 +3704,22 @@ if (BYTES_BIG_ENDIAN) [(set_attr "type" "neon_from_gp_q")] ) +(define_insn "neon_vdup_nv4bf" + [(set (match_operand:V4BF 0 "s_register_operand" "=w") + (vec_duplicate:V4BF (match_operand:BF 1 "s_register_operand" "r")))] + "TARGET_NEON" + "vdup.16\t%P0, %1" + [(set_attr "type" "neon_from_gp")] +) + +(define_insn "neon_vdup_nv8bf" + [(set (match_operand:V8BF 0 "s_register_operand" "=w") + (vec_duplicate:V8BF (match_operand:BF 1 "s_register_operand" "r")))] + "TARGET_NEON" + "vdup.16\t%q0, %1" + [(set_attr "type" "neon_from_gp_q")] +) + (define_insn "neon_vdup_n" [(set (match_operand:V32 0 "s_register_operand" "=w,w") (vec_duplicate:V32 (match_operand: 1 "s_register_operand" "r,t")))] @@ -3737,7 +3753,7 @@ if (BYTES_BIG_ENDIAN) (define_insn "neon_vdup_lane_internal" [(set (match_operand:VDQW 0 "s_register_operand" "=w") - (vec_duplicate:VDQW + (vec_duplicate:VDQW (vec_select: (match_operand: 1 "s_register_operand" "w") (parallel [(match_operand:SI 2 "immediate_operand" "i")]))))] @@ -3758,12 +3774,12 @@ if (BYTES_BIG_ENDIAN) ) (define_insn "neon_vdup_lane_internal" - [(set (match_operand:VH 0 "s_register_operand" "=w") - (vec_duplicate:VH + [(set (match_operand:VHFBF 0 "s_register_operand" "=w") + (vec_duplicate:VHFBF (vec_select: (match_operand: 1 "s_register_operand" "w") (parallel [(match_operand:SI 2 "immediate_operand" "i")]))))] - "TARGET_NEON && TARGET_FP16" + "TARGET_NEON && (TARGET_FP16 || TARGET_BF16_SIMD)" { if (BYTES_BIG_ENDIAN) { @@ -3799,10 +3815,10 @@ if (BYTES_BIG_ENDIAN) }) (define_expand "neon_vdup_lane" - [(match_operand:VH 0 "s_register_operand") + [(match_operand:VHFBF 0 "s_register_operand") (match_operand: 1 "s_register_operand") (match_operand:SI 2 "immediate_operand")] - "TARGET_NEON && TARGET_FP16" + "TARGET_NEON && (TARGET_FP16 || TARGET_BF16_SIMD)" { if (BYTES_BIG_ENDIAN) { @@ -6599,4 +6615,4 @@ if (BYTES_BIG_ENDIAN) } } [(set_attr "type" "neon_dot")] -) \ No newline at end of file +) diff --git a/gcc/testsuite/gcc.target/arm/bf16_dup.c b/gcc/testsuite/gcc.target/arm/bf16_dup.c new file mode 100644 index 0000000000000000000000000000000000000000..82dff25fc6e244a1d930375a1e3505e9173e53dc --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/bf16_dup.c @@ -0,0 +1,94 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-march=armv8.2-a+bf16+fp16 -mfloat-abi=softfp" } */ + +#include "arm_neon.h" + +float32x2_t +test_vbfdot_vcreate (float32x2_t r, uint64_t a, uint64_t b) +{ + bfloat16x4_t _a = vcreate_bf16(a); + bfloat16x4_t _b = vcreate_bf16(b); + + return vbfdot_f32 (r, _a, _b); +} +/* { dg-final { scan-assembler {vdot.bf16\td[0-9]+, d[0-9]+, d[0-9]+} } } */ + +bfloat16x8_t test_vcombine_bf16 (bfloat16x4_t a, bfloat16x4_t b) +{ + return vcombine_bf16 (a, b); +} + +bfloat16x4_t test_vget_high_bf16 (bfloat16x8_t a) +{ + return vget_high_bf16 (a); +} + +bfloat16x4_t test_vget_low_bf16 (bfloat16x8_t a) +{ + return vget_low_bf16 (a); +} + +bfloat16_t test_vget_lane_bf16 (bfloat16x4_t a) +{ + return vget_lane_bf16 (a, 1); +} + +bfloat16_t test_vgetq_lane_bf16 (bfloat16x8_t a) +{ + return vgetq_lane_bf16 (a, 7); +} + +bfloat16x4_t test_vset_lane_bf16 (bfloat16_t a, bfloat16x4_t b) +{ + return vset_lane_bf16 (a, b, 1); +} + +bfloat16x8_t test_vsetq_lane_bf16 (bfloat16_t a, bfloat16x8_t b) +{ + return vsetq_lane_bf16 (a, b, 7); +} + +bfloat16x4_t vdup_test (bfloat16_t a) +{ + return vdup_n_bf16 (a); +} +/* { dg-final { scan-assembler {vdup\.16\td[0-9]+, r[0-9]+} } } */ + +bfloat16x8_t vdupq_test (bfloat16_t a) +{ + return vdupq_n_bf16 (a); +} +/* { dg-final { scan-assembler {vdup\.16\tq[0-9]+, r[0-9]+} } } */ + + +bfloat16x4_t test_vdup_lane_bf16 (bfloat16x4_t a) +{ + return vdup_lane_bf16 (a, 1); +} +/* { dg-final { scan-assembler-times {vdup\.16\td[0-9]+, d[0-9]+\[1\]} 1 } } */ + +bfloat16x8_t test_vdupq_lane_bf16 (bfloat16x4_t a) +{ + return vdupq_lane_bf16 (a, 1); +} +/* { dg-final { scan-assembler-times {vdup\.16\tq[0-9]+, d[0-9]+\[1\]} 1 } } */ + +bfloat16x4_t test_vdup_laneq_bf16 (bfloat16x8_t a) +{ + return vdup_laneq_bf16 (a, 3); +} + +bfloat16x8_t test_vdupq_laneq_bf16 (bfloat16x8_t a) +{ + return vdupq_laneq_bf16 (a, 3); +} + +bfloat16_t test_vduph_lane_bf16 (bfloat16x4_t a) +{ + return vduph_lane_bf16 (a, 1); +} + +bfloat16_t test_vduph_laneq_bf16 (bfloat16x8_t a) +{ + return vduph_laneq_bf16 (a, 7); +} diff --git a/gcc/testsuite/gcc.target/arm/bf16_reinterpret.c b/gcc/testsuite/gcc.target/arm/bf16_reinterpret.c new file mode 100644 index 0000000000000000000000000000000000000000..e7d30a95fbc3ceaf4a92057a10e6be4a34e1957c --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/bf16_reinterpret.c @@ -0,0 +1,435 @@ +/* { dg-do assemble { target { arm*-*-* } } } */ +/* { dg-require-effective-target arm_v8_2a_bf16_neon_ok } */ +/* { dg-add-options arm_v8_2a_bf16_neon } */ +/* { dg-additional-options "-save-temps -march=armv8.2-a+fp16+bf16 -mfloat-abi=hard -mfpu=crypto-neon-fp-armv8" } */ + +#include + +float32x2_t +test_vbfdot_f32_s8 (float32x2_t r, int8x8_t a, int8x8_t b) +{ + bfloat16x4_t _a = vreinterpret_bf16_s8(a); + bfloat16x4_t _b = vreinterpret_bf16_s8(b); + + return vbfdot_f32 (r, _a, _b); +} + +float32x2_t +test_vbfdot_f32_s16 (float32x2_t r, int16x4_t a, int16x4_t b) +{ + bfloat16x4_t _a = vreinterpret_bf16_s16(a); + bfloat16x4_t _b = vreinterpret_bf16_s16(b); + + return vbfdot_f32 (r, _a, _b); +} + +float32x2_t +test_vbfdot_f32_s32 (float32x2_t r, int32x2_t a, int32x2_t b) +{ + bfloat16x4_t _a = vreinterpret_bf16_s32(a); + bfloat16x4_t _b = vreinterpret_bf16_s32(b); + + return vbfdot_f32 (r, _a, _b); +} + +float32x2_t +test_vbfdot_f32_s64 (float32x2_t r, int64x1_t a, int64x1_t b) +{ + bfloat16x4_t _a = vreinterpret_bf16_s64(a); + bfloat16x4_t _b = vreinterpret_bf16_s64(b); + + return vbfdot_f32 (r, _a, _b); +} + +float32x2_t +test_vbfdot_f32_u8 (float32x2_t r, uint8x8_t a, uint8x8_t b) +{ + bfloat16x4_t _a = vreinterpret_bf16_u8(a); + bfloat16x4_t _b = vreinterpret_bf16_u8(b); + + return vbfdot_f32 (r, _a, _b); +} + +float32x2_t +test_vbfdot_f32_u16 (float32x2_t r, uint16x4_t a, uint16x4_t b) +{ + bfloat16x4_t _a = vreinterpret_bf16_u16(a); + bfloat16x4_t _b = vreinterpret_bf16_u16(b); + + return vbfdot_f32 (r, _a, _b); +} + +float32x2_t +test_vbfdot_f32_u32 (float32x2_t r, uint32x2_t a, uint32x2_t b) +{ + bfloat16x4_t _a = vreinterpret_bf16_u32(a); + bfloat16x4_t _b = vreinterpret_bf16_u32(b); + + return vbfdot_f32 (r, _a, _b); +} + +float32x2_t +test_vbfdot_f32_u64 (float32x2_t r, uint64x1_t a, uint64x1_t b) +{ + bfloat16x4_t _a = vreinterpret_bf16_u64(a); + bfloat16x4_t _b = vreinterpret_bf16_u64(b); + + return vbfdot_f32 (r, _a, _b); +} + +float32x2_t +test_vbfdot_f32_p8 (float32x2_t r, poly8x8_t a, poly8x8_t b) +{ + bfloat16x4_t _a = vreinterpret_bf16_p8(a); + bfloat16x4_t _b = vreinterpret_bf16_p8(b); + + return vbfdot_f32 (r, _a, _b); +} + +float32x2_t +test_vbfdot_f32_p16 (float32x2_t r, poly16x4_t a, poly16x4_t b) +{ + bfloat16x4_t _a = vreinterpret_bf16_p16(a); + bfloat16x4_t _b = vreinterpret_bf16_p16(b); + + return vbfdot_f32 (r, _a, _b); +} + +float32x2_t +test_vbfdot_f32_p64 (float32x2_t r, poly64x1_t a, poly64x1_t b) +{ + bfloat16x4_t _a = vreinterpret_bf16_p64(a); + bfloat16x4_t _b = vreinterpret_bf16_p64(b); + + return vbfdot_f32 (r, _a, _b); +} + +float32x2_t +test_vbfdot_f32_f16 (float32x2_t r, float16x4_t a, float16x4_t b) +{ + bfloat16x4_t _a = vreinterpret_bf16_f16(a); + bfloat16x4_t _b = vreinterpret_bf16_f16(b); + + return vbfdot_f32 (r, _a, _b); +} + +float32x2_t +test_vbfdot_f32_f32 (float32x2_t r, float32x2_t a, float32x2_t b) +{ + bfloat16x4_t _a = vreinterpret_bf16_f32(a); + bfloat16x4_t _b = vreinterpret_bf16_f32(b); + + return vbfdot_f32 (r, _a, _b); +} + +float32x4_t +test_vbfdotq_f32_s8 (float32x4_t r, int8x16_t a, int8x16_t b) +{ + bfloat16x8_t _a = vreinterpretq_bf16_s8(a); + bfloat16x8_t _b = vreinterpretq_bf16_s8(b); + + return vbfdotq_f32 (r, _a, _b); +} + +float32x4_t +test_vbfdotq_f32_s16 (float32x4_t r, int16x8_t a, int16x8_t b) +{ + bfloat16x8_t _a = vreinterpretq_bf16_s16(a); + bfloat16x8_t _b = vreinterpretq_bf16_s16(b); + + return vbfdotq_f32 (r, _a, _b); +} + +float32x4_t +test_vbfdotq_f32_s32 (float32x4_t r, int32x4_t a, int32x4_t b) +{ + bfloat16x8_t _a = vreinterpretq_bf16_s32(a); + bfloat16x8_t _b = vreinterpretq_bf16_s32(b); + + return vbfdotq_f32 (r, _a, _b); +} + +float32x4_t +test_vbfdotq_f32_s64 (float32x4_t r, int64x2_t a, int64x2_t b) +{ + bfloat16x8_t _a = vreinterpretq_bf16_s64(a); + bfloat16x8_t _b = vreinterpretq_bf16_s64(b); + + return vbfdotq_f32 (r, _a, _b); +} + +float32x4_t +test_vbfdotq_f32_u8 (float32x4_t r, uint8x16_t a, uint8x16_t b) +{ + bfloat16x8_t _a = vreinterpretq_bf16_u8(a); + bfloat16x8_t _b = vreinterpretq_bf16_u8(b); + + return vbfdotq_f32 (r, _a, _b); +} + +float32x4_t +test_vbfdotq_f32_u16 (float32x4_t r, uint16x8_t a, uint16x8_t b) +{ + bfloat16x8_t _a = vreinterpretq_bf16_u16(a); + bfloat16x8_t _b = vreinterpretq_bf16_u16(b); + + return vbfdotq_f32 (r, _a, _b); +} + +float32x4_t +test_vbfdotq_f32_u32 (float32x4_t r, uint32x4_t a, uint32x4_t b) +{ + bfloat16x8_t _a = vreinterpretq_bf16_u32(a); + bfloat16x8_t _b = vreinterpretq_bf16_u32(b); + + return vbfdotq_f32 (r, _a, _b); +} + +float32x4_t +test_vbfdotq_f32_u64 (float32x4_t r, uint64x2_t a, uint64x2_t b) +{ + bfloat16x8_t _a = vreinterpretq_bf16_u64(a); + bfloat16x8_t _b = vreinterpretq_bf16_u64(b); + + return vbfdotq_f32 (r, _a, _b); +} + +float32x4_t +test_vbfdotq_f32_p8 (float32x4_t r, poly8x16_t a, poly8x16_t b) +{ + bfloat16x8_t _a = vreinterpretq_bf16_p8(a); + bfloat16x8_t _b = vreinterpretq_bf16_p8(b); + + return vbfdotq_f32 (r, _a, _b); +} + +float32x4_t +test_vbfdotq_f32_p16 (float32x4_t r, poly16x8_t a, poly16x8_t b) +{ + bfloat16x8_t _a = vreinterpretq_bf16_p16(a); + bfloat16x8_t _b = vreinterpretq_bf16_p16(b); + + return vbfdotq_f32 (r, _a, _b); +} + +float32x4_t +test_vbfdotq_f32_p64 (float32x4_t r, poly64x2_t a, poly64x2_t b) +{ + bfloat16x8_t _a = vreinterpretq_bf16_p64(a); + bfloat16x8_t _b = vreinterpretq_bf16_p64(b); + + return vbfdotq_f32 (r, _a, _b); +} + +float32x4_t +test_vbfdotq_f32_p128 (float32x4_t r, poly128_t a, poly128_t b) +{ + bfloat16x8_t _a = vreinterpretq_bf16_p128(a); + bfloat16x8_t _b = vreinterpretq_bf16_p128(b); + + return vbfdotq_f32 (r, _a, _b); +} + +float32x4_t +test_vbfdotq_f32_f16 (float32x4_t r, float16x8_t a, float16x8_t b) +{ + bfloat16x8_t _a = vreinterpretq_bf16_f16(a); + bfloat16x8_t _b = vreinterpretq_bf16_f16(b); + + return vbfdotq_f32 (r, _a, _b); +} + +float32x4_t +test_vbfdotq_f32_f32 (float32x4_t r, float32x4_t a, float32x4_t b) +{ + bfloat16x8_t _a = vreinterpretq_bf16_f32(a); + bfloat16x8_t _b = vreinterpretq_bf16_f32(b); + + return vbfdotq_f32 (r, _a, _b); +} + +/* { dg-final { scan-assembler-times {\tvdot.bf16\td[0-9]+, d[0-9]+, d[0-9]+\n} 13 } } */ +/* { dg-final { scan-assembler-times {\tvdot.bf16\tq[0-9]+, q[0-9]+, q[0-9]+\n} 14 } } */ + +int8x8_t test_vreinterpret_s8_bf16 (bfloat16x4_t a, int8x8_t b) +{ + int8x8_t _a = vreinterpret_s8_bf16 (a); + return vadd_s8 (_a, b); +} + +int16x4_t test_vreinterpret_s16_bf16 (bfloat16x4_t a, int16x4_t b) +{ + int16x4_t _a = vreinterpret_s16_bf16 (a); + return vadd_s16 (_a, b); +} + +int32x2_t test_vreinterpret_s32_bf16 (bfloat16x4_t a, int32x2_t b) +{ + int32x2_t _a = vreinterpret_s32_bf16 (a); + return vadd_s32 (_a, b); +} + +int64x1_t test_vreinterpret_s64_bf16 (bfloat16x4_t a, int64x1_t b) +{ + int64x1_t _a = vreinterpret_s64_bf16 (a); + return vrshl_s64 (_a, b); +} + +uint8x8_t test_vreinterpret_u8_bf16 (bfloat16x4_t a, uint8x8_t b) +{ + uint8x8_t _a = vreinterpret_u8_bf16 (a); + return vadd_u8 (_a, b); +} + +uint16x4_t test_vreinterpret_u16_bf16 (bfloat16x4_t a, uint16x4_t b) +{ + uint16x4_t _a = vreinterpret_u16_bf16 (a); + return vadd_u16 (_a, b); +} + +uint32x2_t test_vreinterpret_u32_bf16 (bfloat16x4_t a, uint32x2_t b) +{ + uint32x2_t _a = vreinterpret_u32_bf16 (a); + return vadd_u32 (_a, b); +} + +uint64x1_t test_vreinterpret_u64_bf16 (bfloat16x4_t a, int64x1_t b) +{ + uint64x1_t _a = vreinterpret_u64_bf16 (a); + return vrshl_u64 (_a, b); +} + +poly8x8x2_t test_vreinterpret_p8_bf16 (bfloat16x4_t a, poly8x8_t b) +{ + poly8x8_t _a = vreinterpret_p8_bf16 (a); + return vzip_p8 (_a, b); +} + +poly16x4x2_t test_vreinterpret_p16_bf16 (bfloat16x4_t a, poly16x4_t b) +{ + poly16x4_t _a = vreinterpret_p16_bf16 (a); + return vzip_p16 (_a, b); +} + +poly64x1_t test_vreinterpret_p64_bf16 (bfloat16x4_t a, poly64x1_t b) +{ + poly64x1_t _a = vreinterpret_p64_bf16 (a); + return vsli_n_p64 (_a, b, 3); +} + +float32x2_t test_vreinterpret_f32_bf16 (bfloat16x4_t a, float32x2_t b) +{ + float32x2_t _a = vreinterpret_f32_bf16 (a); + return vsub_f32 (_a, b); +} + +int8x16_t test_vreinterpretq_s8_bf16 (bfloat16x8_t a, int8x16_t b) +{ + int8x16_t _a = vreinterpretq_s8_bf16 (a); + return vaddq_s8 (_a, b); +} + +int16x8_t test_vreinterpretq_s16_bf16 (bfloat16x8_t a, int16x8_t b) +{ + int16x8_t _a = vreinterpretq_s16_bf16 (a); + return vaddq_s16 (_a, b); +} + +int32x4_t test_vreinterpretq_s32_bf16 (bfloat16x8_t a, int32x4_t b) +{ + int32x4_t _a = vreinterpretq_s32_bf16 (a); + return vaddq_s32 (_a, b); +} + +int64x2_t test_vreinterpretq_s64_bf16 (bfloat16x8_t a, int64x2_t b) +{ + int64x2_t _a = vreinterpretq_s64_bf16 (a); + return vaddq_s64 (_a, b); +} + +uint8x16_t test_vreinterpretq_u8_bf16 (bfloat16x8_t a, uint8x16_t b) +{ + uint8x16_t _a = vreinterpretq_u8_bf16 (a); + return vaddq_u8 (_a, b); +} + +uint16x8_t test_vreinterpretq_u16_bf16 (bfloat16x8_t a, uint16x8_t b) +{ + uint16x8_t _a = vreinterpretq_u16_bf16 (a); + return vaddq_u16 (_a, b); +} + +uint32x4_t test_vreinterpretq_u32_bf16 (bfloat16x8_t a, uint32x4_t b) +{ + uint32x4_t _a = vreinterpretq_u32_bf16 (a); + return vaddq_u32 (_a, b); +} + +uint64x2_t test_vreinterpretq_u64_bf16 (bfloat16x8_t a, uint64x2_t b) +{ + uint64x2_t _a = vreinterpretq_u64_bf16 (a); + return vaddq_u64 (_a, b); +} + +poly8x16x2_t test_vreinterpretq_p8_bf16 (bfloat16x8_t a, poly8x16_t b) +{ + poly8x16_t _a = vreinterpretq_p8_bf16 (a); + return vzipq_p8 (_a, b); +} + +poly16x8x2_t test_vreinterpretq_p16_bf16 (bfloat16x8_t a, poly16x8_t b) +{ + poly16x8_t _a = vreinterpretq_p16_bf16 (a); + return vzipq_p16 (_a, b); +} + +poly64x2_t test_vreinterpretq_p64_bf16 (bfloat16x8_t a, poly64x2_t b) +{ + poly64x2_t _a = vreinterpretq_p64_bf16 (a); + return vsliq_n_p64 (_a, b, 3); +} + +poly128_t test_vreinterpretq_p128_bf16 (bfloat16x8_t a, poly16x8_t b) +{ + poly128_t _a = vreinterpretq_p128_bf16 (a); + return _a; +} + +float32x4_t test_vreinterpretq_f32_bf16 (bfloat16x8_t a, float32x4_t b) +{ + float32x4_t _a = vreinterpretq_f32_bf16 (a); + return vsubq_f32 (_a, b); +} + +float16x4_t test_vreinterpret_f16_bf16 (bfloat16x4_t a) +{ + return vreinterpret_f16_bf16 (a); +} + +float16x8_t test_vreinterpretq_f16_bf16 (bfloat16x8_t a) +{ + return vreinterpretq_f16_bf16 (a); +} + +/* { dg-final { scan-assembler-times {\tvadd.i8\td[0-9]+, d[0-9]+, d[0-9]+\n} 2 } } */ +/* { dg-final { scan-assembler-times {\tvadd.i16\td[0-9]+, d[0-9]+, d[0-9]+\n} 2 } } */ +/* { dg-final { scan-assembler-times {\tvadd.i32\td[0-9]+, d[0-9]+, d[0-9]+\n} 2 } } */ + +/* { dg-final { scan-assembler-times {\tvadd.i8\tq[0-9]+, q[0-9]+, q[0-9]+\n} 2 } } */ +/* { dg-final { scan-assembler-times {\tvadd.i16\tq[0-9]+, q[0-9]+, q[0-9]+\n} 2 } } */ +/* { dg-final { scan-assembler-times {\tvadd.i32\tq[0-9]+, q[0-9]+, q[0-9]+\n} 2 } } */ +/* { dg-final { scan-assembler-times {\tvadd.i64\tq[0-9]+, q[0-9]+, q[0-9]+\n} 2 } } */ + +/* { dg-final { scan-assembler {\tvsub.f32\td[0-9]+, d[0-9]+, d[0-9]+\n} } } */ +/* { dg-final { scan-assembler {\tvsub.f32\tq[0-9]+, q[0-9]+, q[0-9]+\n} } } */ + +/* { dg-final { scan-assembler {\tvzip.8\td[0-9]+, d[0-9]+\n} } } */ +/* { dg-final { scan-assembler {\tvzip.16\td[0-9]+, d[0-9]+\n} } } */ +/* { dg-final { scan-assembler {\tvzip.8\tq[0-9]+, q[0-9]+\n} } } */ +/* { dg-final { scan-assembler {\tvzip.16\tq[0-9]+, q[0-9]+\n} } } */ + +/* { dg-final { scan-assembler {\tvrshl.s64\td[0-9]+, d[0-9]+, d[0-9]+\n} } } */ +/* { dg-final { scan-assembler {\tvrshl.u64\td[0-9]+, d[0-9]+, d[0-9]+\n} } } */ + +/* { dg-final { scan-assembler {\tvsli.64\td[0-9]+, d[0-9]+, #3\n} } } */ +/* { dg-final { scan-assembler {\tvsli.64\tq[0-9]+, q[0-9]+, #3\n} } } */ --===============4542924355783240075== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Disposition: attachment; filename="diff.patch" Content-Transfer-Encoding: base64 Content-length: 55376 ZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYXJtL2FybV9uZW9uLmggYi9nY2Mv Y29uZmlnL2FybS9hcm1fbmVvbi5oCmluZGV4IDA5Mjk3ODMxY2RjZDZlNjk1 ODQzYzE3Yjc3MjRjMTE0ZjNhMTI5ZmUuLjU5MDFhOGYxZmI4NGYyMDRhZTk1 ZjBjY2M5N2JmNWFlOTQ0YzQ4MmMgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcv YXJtL2FybV9uZW9uLmgKKysrIGIvZ2NjL2NvbmZpZy9hcm0vYXJtX25lb24u aApAQCAtNDIsNiArNDIsMTUgQEAgZXh0ZXJuICJDIiB7CiAjaW5jbHVkZSA8 YXJtX2JmMTYuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAorI2lmZGVmIF9f QVJNX0JJR19FTkRJQU4KKyNkZWZpbmUgX19BUk1fTlVNX0xBTkVTKF9fdikg KHNpemVvZiAoX192KSAvIHNpemVvZiAoX192WzBdKSkKKyNkZWZpbmUgX19h cm1fbGFuZShfX3ZlYywgX19pZHgpIChfX2lkeCBeIChfX0FSTV9OVU1fTEFO RVMoX192ZWMpIC0gMSkpCisjZGVmaW5lIF9fYXJtX2xhbmVxKF9fdmVjLCBf X2lkeCkgKF9faWR4IF4gKF9fQVJNX05VTV9MQU5FUyhfX3ZlYykvMiAtIDEp KQorI2Vsc2UKKyNkZWZpbmUgX19hcm1fbGFuZShfX3ZlYywgX19pZHgpIF9f aWR4CisjZGVmaW5lIF9fYXJtX2xhbmVxKF9fdmVjLCBfX2lkeCkgX19pZHgK KyNlbmRpZgorCiB0eXBlZGVmIF9fc2ltZDY0X2ludDhfdCBpbnQ4eDhfdDsK IHR5cGVkZWYgX19zaW1kNjRfaW50MTZfdCBpbnQxNng0X3Q7CiB0eXBlZGVm IF9fc2ltZDY0X2ludDMyX3QgaW50MzJ4Ml90OwpAQCAtNjE0NywxNCArNjE1 Niw2IEBAIHZnZXRfbGFuZV9zMzIgKGludDMyeDJfdCBfX2EsIGNvbnN0IGlu dCBfX2IpCiAgIC8qIEZvciBiaWctZW5kaWFuLCBHQ0MncyB2ZWN0b3IgaW5k aWNlcyBhcmUgcmV2ZXJzZWQgd2l0aGluIGVhY2ggNjQKICAgICAgYml0cyBj b21wYXJlZCB0byB0aGUgYXJjaGl0ZWN0dXJhbCBsYW5lIGluZGljZXMgdXNl ZCBieSBOZW9uCiAgICAgIGludHJpbnNpY3MuICAqLwotI2lmZGVmIF9fQVJN X0JJR19FTkRJQU4KLSNkZWZpbmUgX19BUk1fTlVNX0xBTkVTKF9fdikgKHNp emVvZiAoX192KSAvIHNpemVvZiAoX192WzBdKSkKLSNkZWZpbmUgX19hcm1f bGFuZShfX3ZlYywgX19pZHgpIChfX2lkeCBeIChfX0FSTV9OVU1fTEFORVMo X192ZWMpIC0gMSkpCi0jZGVmaW5lIF9fYXJtX2xhbmVxKF9fdmVjLCBfX2lk eCkgKF9faWR4IF4gKF9fQVJNX05VTV9MQU5FUyhfX3ZlYykvMiAtIDEpKQot I2Vsc2UKLSNkZWZpbmUgX19hcm1fbGFuZShfX3ZlYywgX19pZHgpIF9faWR4 Ci0jZGVmaW5lIF9fYXJtX2xhbmVxKF9fdmVjLCBfX2lkeCkgX19pZHgKLSNl bmRpZgogCiAjZGVmaW5lIHZnZXRfbGFuZV9mMTYoX192LCBfX2lkeCkJCQlc CiAgIF9fZXh0ZW5zaW9uX18JCQkJCQlcCkBAIC0xNDQ3Niw2ICsxNDQ3Nywx NSBAQCB2cmVpbnRlcnByZXRfcDE2X3UzMiAodWludDMyeDJfdCBfX2EpCiAj aWYgZGVmaW5lZCAoX19BUk1fRlAxNl9GT1JNQVRfSUVFRSkgfHwgZGVmaW5l ZCAoX19BUk1fRlAxNl9GT1JNQVRfQUxURVJOQVRJVkUpCiBfX2V4dGVuc2lv bl9fIGV4dGVybiBfX2lubGluZSBmbG9hdDE2eDRfdAogX19hdHRyaWJ1dGVf XyAgKChfX2Fsd2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0 aWZpY2lhbF9fKSkKK3ZyZWludGVycHJldF9mMTZfYmYxNiAoYmZsb2F0MTZ4 NF90IF9fYSkKK3sKKyAgcmV0dXJuIChmbG9hdDE2eDRfdCkgX19hOworfQor I2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0FSTV9GUDE2X0ZPUk1BVF9JRUVF KSB8fCBkZWZpbmVkIChfX0FSTV9GUDE2X0ZPUk1BVF9BTFRFUk5BVElWRSkK K19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIGZsb2F0MTZ4NF90Citf X2F0dHJpYnV0ZV9fICAoKF9fYWx3YXlzX2lubGluZV9fLCBfX2dudV9pbmxp bmVfXywgX19hcnRpZmljaWFsX18pKQogdnJlaW50ZXJwcmV0X2YxNl9wOCAo cG9seTh4OF90IF9fYSkKIHsKICAgcmV0dXJuIChmbG9hdDE2eDRfdCkgX19h OwpAQCAtMTU2ODgsNiArMTU2OTgsMTUgQEAgdnJlaW50ZXJwcmV0cV9mMTZf cDE2IChwb2x5MTZ4OF90IF9fYSkKICNpZiBkZWZpbmVkIChfX0FSTV9GUDE2 X0ZPUk1BVF9JRUVFKSB8fCBkZWZpbmVkIChfX0FSTV9GUDE2X0ZPUk1BVF9B TFRFUk5BVElWRSkKIF9fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIGZs b2F0MTZ4OF90CiBfX2F0dHJpYnV0ZV9fICAoKF9fYWx3YXlzX2lubGluZV9f LCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQordnJlaW50ZXJw cmV0cV9mMTZfYmYxNiAoYmZsb2F0MTZ4OF90IF9fYSkKK3sKKyAgcmV0dXJu IChmbG9hdDE2eDhfdCkgX19hOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVk IChfX0FSTV9GUDE2X0ZPUk1BVF9JRUVFKSB8fCBkZWZpbmVkIChfX0FSTV9G UDE2X0ZPUk1BVF9BTFRFUk5BVElWRSkKK19fZXh0ZW5zaW9uX18gZXh0ZXJu IF9faW5saW5lIGZsb2F0MTZ4OF90CitfX2F0dHJpYnV0ZV9fICAoKF9fYWx3 YXlzX2lubGluZV9fLCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFsX18p KQogdnJlaW50ZXJwcmV0cV9mMTZfZjMyIChmbG9hdDMyeDRfdCBfX2EpCiB7 CiAgIHJldHVybiAoZmxvYXQxNng4X3QpIF9fYTsKQEAgLTE4NzUwLDYgKzE4 NzY5LDQ5MiBAQCB2Y21sYXFfcm90MjcwX2xhbmVxX2YzMiAoZmxvYXQzMng0 X3QgX19yLCBmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYiwKICNw cmFnbWEgR0NDIHB1c2hfb3B0aW9ucwogI3ByYWdtYSBHQ0MgdGFyZ2V0ICgi YXJjaD1hcm12OC4yLWErYmYxNiIpCiAKK19fZXh0ZW5zaW9uX18gZXh0ZXJu IF9faW5saW5lIGJmbG9hdDE2eDRfdAorX19hdHRyaWJ1dGVfXyAgKChfX2Fs d2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9f KSkKK3ZjcmVhdGVfYmYxNiAodWludDY0X3QgX19hKQoreworICByZXR1cm4g KGJmbG9hdDE2eDRfdCkgX19hOworfQorCitfX2V4dGVuc2lvbl9fIGV4dGVy biBfX2lubGluZSBiZmxvYXQxNng0X3QKK19fYXR0cmlidXRlX18gICgoX19h bHdheXNfaW5saW5lX18sIF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNpYWxf XykpCit2ZHVwX25fYmYxNiAoYmZsb2F0MTZfdCBfX2EpCit7CisgIHJldHVy biBfX2J1aWx0aW5fbmVvbl92ZHVwX252NGJmIChfX2EpOworfQorCitfX2V4 dGVuc2lvbl9fIGV4dGVybiBfX2lubGluZSBiZmxvYXQxNng4X3QKK19fYXR0 cmlidXRlX18gICgoX19hbHdheXNfaW5saW5lX18sIF9fZ251X2lubGluZV9f LCBfX2FydGlmaWNpYWxfXykpCit2ZHVwcV9uX2JmMTYgKGJmbG9hdDE2X3Qg X19hKQoreworICByZXR1cm4gX19idWlsdGluX25lb25fdmR1cF9udjhiZiAo X19hKTsKK30KKworX19leHRlbnNpb25fXyBleHRlcm4gX19pbmxpbmUgYmZs b2F0MTZ4NF90CitfX2F0dHJpYnV0ZV9fICAoKF9fYWx3YXlzX2lubGluZV9f LCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQordmR1cF9sYW5l X2JmMTYgKGJmbG9hdDE2eDRfdCBfX2EsIGNvbnN0IGludCBfX2IpCit7Cisg IHJldHVybiBfX2J1aWx0aW5fbmVvbl92ZHVwX2xhbmV2NGJmIChfX2EsIF9f Yik7Cit9CisKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIGJmbG9h dDE2eDhfdAorX19hdHRyaWJ1dGVfXyAgKChfX2Fsd2F5c19pbmxpbmVfXywg X19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK3ZkdXBxX2xhbmVf YmYxNiAoYmZsb2F0MTZ4NF90IF9fYSwgY29uc3QgaW50IF9fYikKK3sKKyAg cmV0dXJuIF9fYnVpbHRpbl9uZW9uX3ZkdXBfbGFuZXY4YmYgKF9fYSwgX19i KTsKK30KKworI2RlZmluZSB2c2V0X2xhbmVfYmYxNihfX2UsIF9fdiwgX19p ZHgpCQlcCisgIF9fZXh0ZW5zaW9uX18JCQkJCVwKKyAgKHsJCQkJCQlcCisg ICAgYmZsb2F0MTZfdCBfX2VsZW0gPSAoX19lKTsJCQlcCisgICAgYmZsb2F0 MTZ4NF90IF9fdmVjID0gKF9fdik7CQkJXAorICAgIF9fYnVpbHRpbl9hcm1f bGFuZV9jaGVjayAoNCwgX19pZHgpOwlcCisgICAgX192ZWNbX19hcm1fbGFu ZShfX3ZlYywgX19pZHgpXSA9IF9fZWxlbTsJXAorICAgIF9fdmVjOwkJCQkJ XAorICB9KQorCisjZGVmaW5lIHZzZXRxX2xhbmVfYmYxNihfX2UsIF9fdiwg X19pZHgpCQlcCisgIF9fZXh0ZW5zaW9uX18JCQkJCVwKKyAgKHsJCQkJCQlc CisgICAgYmZsb2F0MTZfdCBfX2VsZW0gPSAoX19lKTsJCQlcCisgICAgYmZs b2F0MTZ4OF90IF9fdmVjID0gKF9fdik7CQkJXAorICAgIF9fYnVpbHRpbl9h cm1fbGFuZV9jaGVjayAoOCwgX19pZHgpOwlcCisgICAgX192ZWNbX19hcm1f bGFuZXEoX192ZWMsIF9faWR4KV0gPSBfX2VsZW07CVwKKyAgICBfX3ZlYzsJ CQkJCVwKKyAgfSkKKworI2RlZmluZSB2Z2V0X2xhbmVfYmYxNihfX3YsIF9f aWR4KQkJCVwKKyAgX19leHRlbnNpb25fXwkJCQkJCVwKKyAgKHsJCQkJCQkJ XAorICAgIGJmbG9hdDE2eDRfdCBfX3ZlYyA9IChfX3YpOwkJCQlcCisgICAg X19idWlsdGluX2FybV9sYW5lX2NoZWNrICg0LCBfX2lkeCk7CQlcCisgICAg YmZsb2F0MTZfdCBfX3JlcyA9IF9fdmVjW19fYXJtX2xhbmUoX192ZWMsIF9f aWR4KV07CVwKKyAgICBfX3JlczsJCQkJCQlcCisgIH0pCisKKyNkZWZpbmUg dmdldHFfbGFuZV9iZjE2KF9fdiwgX19pZHgpCQkJXAorICBfX2V4dGVuc2lv bl9fCQkJCQkJXAorICAoewkJCQkJCQlcCisgICAgYmZsb2F0MTZ4OF90IF9f dmVjID0gKF9fdik7CQkJCVwKKyAgICBfX2J1aWx0aW5fYXJtX2xhbmVfY2hl Y2sgKDgsIF9faWR4KTsJCVwKKyAgICBiZmxvYXQxNl90IF9fcmVzID0gX192 ZWNbX19hcm1fbGFuZXEoX192ZWMsIF9faWR4KV07CVwKKyAgICBfX3JlczsJ CQkJCQlcCisgIH0pCisKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5l IGJmbG9hdDE2eDRfdAorX19hdHRyaWJ1dGVfXyAgKChfX2Fsd2F5c19pbmxp bmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK3ZkdXBf bGFuZXFfYmYxNiAoYmZsb2F0MTZ4OF90IF9fYSwgY29uc3QgaW50IF9fYikK K3sKKyAgcmV0dXJuIHZkdXBfbl9iZjE2KCB2Z2V0cV9sYW5lX2JmMTYgKF9f YSwgX19iKSk7Cit9CisKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5l IGJmbG9hdDE2eDhfdAorX19hdHRyaWJ1dGVfXyAgKChfX2Fsd2F5c19pbmxp bmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK3ZkdXBx X2xhbmVxX2JmMTYgKGJmbG9hdDE2eDhfdCBfX2EsIGNvbnN0IGludCBfX2Ip Cit7CisgIHJldHVybiB2ZHVwcV9uX2JmMTYoIHZnZXRxX2xhbmVfYmYxNiAo X19hLCBfX2IpKTsKK30KKworX19leHRlbnNpb25fXyBleHRlcm4gX19pbmxp bmUgYmZsb2F0MTZfdAorX19hdHRyaWJ1dGVfXyAgKChfX2Fsd2F5c19pbmxp bmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK3ZkdXBo X2xhbmVfYmYxNiAoYmZsb2F0MTZ4NF90IF9fYSwgY29uc3QgaW50IF9fYikK K3sKKyAgcmV0dXJuIHZnZXRfbGFuZV9iZjE2IChfX2EsIF9fYik7Cit9CisK K19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIGJmbG9hdDE2X3QKK19f YXR0cmlidXRlX18gICgoX19hbHdheXNfaW5saW5lX18sIF9fZ251X2lubGlu ZV9fLCBfX2FydGlmaWNpYWxfXykpCit2ZHVwaF9sYW5lcV9iZjE2IChiZmxv YXQxNng4X3QgX19hLCBjb25zdCBpbnQgX19iKQoreworICByZXR1cm4gdmdl dHFfbGFuZV9iZjE2IChfX2EsIF9fYik7Cit9CisKK19fZXh0ZW5zaW9uX18g ZXh0ZXJuIF9faW5saW5lIGJmbG9hdDE2eDRfdAorX19hdHRyaWJ1dGVfXyAg KChfX2Fsd2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZp Y2lhbF9fKSkKK3ZnZXRfaGlnaF9iZjE2IChiZmxvYXQxNng4X3QgX19hKQor eworICByZXR1cm4gX19idWlsdGluX25lb25fdmdldF9oaWdodjhiZiAoX19h KTsKK30KKworX19leHRlbnNpb25fXyBleHRlcm4gX19pbmxpbmUgYmZsb2F0 MTZ4NF90CitfX2F0dHJpYnV0ZV9fICAoKF9fYWx3YXlzX2lubGluZV9fLCBf X2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQordmdldF9sb3dfYmYx NiAoYmZsb2F0MTZ4OF90IF9fYSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9u ZW9uX3ZnZXRfbG93djhiZiAoX19hKTsKK30KKworX19leHRlbnNpb25fXyBl eHRlcm4gX19pbmxpbmUgYmZsb2F0MTZ4OF90CitfX2F0dHJpYnV0ZV9fICAo KF9fYWx3YXlzX2lubGluZV9fLCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmlj aWFsX18pKQordmNvbWJpbmVfYmYxNiAoYmZsb2F0MTZ4NF90IF9fYSwgYmZs b2F0MTZ4NF90IF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9uZW9uX3Zj b21iaW5ldjRiZiAoX19hLCBfX2IpOworfQorCitfX2V4dGVuc2lvbl9fIGV4 dGVybiBfX2lubGluZSBiZmxvYXQxNng0X3QKK19fYXR0cmlidXRlX18gICgo X19hbHdheXNfaW5saW5lX18sIF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNp YWxfXykpCit2cmVpbnRlcnByZXRfYmYxNl91OCAodWludDh4OF90IF9fYSkK K3sKKyAgcmV0dXJuIChiZmxvYXQxNng0X3QpX19hOworfQorCitfX2V4dGVu c2lvbl9fIGV4dGVybiBfX2lubGluZSBiZmxvYXQxNng0X3QKK19fYXR0cmli dXRlX18gICgoX19hbHdheXNfaW5saW5lX18sIF9fZ251X2lubGluZV9fLCBf X2FydGlmaWNpYWxfXykpCit2cmVpbnRlcnByZXRfYmYxNl91MTYgKHVpbnQx Nng0X3QgX19hKQoreworICByZXR1cm4gKGJmbG9hdDE2eDRfdClfX2E7Cit9 CisKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIGJmbG9hdDE2eDRf dAorX19hdHRyaWJ1dGVfXyAgKChfX2Fsd2F5c19pbmxpbmVfXywgX19nbnVf aW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK3ZyZWludGVycHJldF9iZjE2 X3UzMiAodWludDMyeDJfdCBfX2EpCit7CisgIHJldHVybiAoYmZsb2F0MTZ4 NF90KV9fYTsKK30KKworX19leHRlbnNpb25fXyBleHRlcm4gX19pbmxpbmUg YmZsb2F0MTZ4NF90CitfX2F0dHJpYnV0ZV9fICAoKF9fYWx3YXlzX2lubGlu ZV9fLCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQordnJlaW50 ZXJwcmV0X2JmMTZfdTY0ICh1aW50NjR4MV90IF9fYSkKK3sKKyAgcmV0dXJu IChiZmxvYXQxNng0X3QpX19hOworfQorCitfX2V4dGVuc2lvbl9fIGV4dGVy biBfX2lubGluZSBiZmxvYXQxNng0X3QKK19fYXR0cmlidXRlX18gICgoX19h bHdheXNfaW5saW5lX18sIF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNpYWxf XykpCit2cmVpbnRlcnByZXRfYmYxNl9zOCAoaW50OHg4X3QgX19hKQorewor ICByZXR1cm4gKGJmbG9hdDE2eDRfdClfX2E7Cit9CisKK19fZXh0ZW5zaW9u X18gZXh0ZXJuIF9faW5saW5lIGJmbG9hdDE2eDRfdAorX19hdHRyaWJ1dGVf XyAgKChfX2Fsd2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0 aWZpY2lhbF9fKSkKK3ZyZWludGVycHJldF9iZjE2X3MxNiAoaW50MTZ4NF90 IF9fYSkKK3sKKyAgcmV0dXJuIChiZmxvYXQxNng0X3QpX19hOworfQorCitf X2V4dGVuc2lvbl9fIGV4dGVybiBfX2lubGluZSBiZmxvYXQxNng0X3QKK19f YXR0cmlidXRlX18gICgoX19hbHdheXNfaW5saW5lX18sIF9fZ251X2lubGlu ZV9fLCBfX2FydGlmaWNpYWxfXykpCit2cmVpbnRlcnByZXRfYmYxNl9zMzIg KGludDMyeDJfdCBfX2EpCit7CisgIHJldHVybiAoYmZsb2F0MTZ4NF90KV9f YTsKK30KKworX19leHRlbnNpb25fXyBleHRlcm4gX19pbmxpbmUgYmZsb2F0 MTZ4NF90CitfX2F0dHJpYnV0ZV9fICAoKF9fYWx3YXlzX2lubGluZV9fLCBf X2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQordnJlaW50ZXJwcmV0 X2JmMTZfczY0IChpbnQ2NHgxX3QgX19hKQoreworICByZXR1cm4gKGJmbG9h dDE2eDRfdClfX2E7Cit9CisKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5s aW5lIGJmbG9hdDE2eDRfdAorX19hdHRyaWJ1dGVfXyAgKChfX2Fsd2F5c19p bmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK3Zy ZWludGVycHJldF9iZjE2X3A4IChwb2x5OHg4X3QgX19hKQoreworICByZXR1 cm4gKGJmbG9hdDE2eDRfdClfX2E7Cit9CisKK19fZXh0ZW5zaW9uX18gZXh0 ZXJuIF9faW5saW5lIGJmbG9hdDE2eDRfdAorX19hdHRyaWJ1dGVfXyAgKChf X2Fsd2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lh bF9fKSkKK3ZyZWludGVycHJldF9iZjE2X3AxNiAocG9seTE2eDRfdCBfX2Ep Cit7CisgIHJldHVybiAoYmZsb2F0MTZ4NF90KV9fYTsKK30KKworX19leHRl bnNpb25fXyBleHRlcm4gX19pbmxpbmUgYmZsb2F0MTZ4NF90CitfX2F0dHJp YnV0ZV9fICAoKF9fYWx3YXlzX2lubGluZV9fLCBfX2dudV9pbmxpbmVfXywg X19hcnRpZmljaWFsX18pKQordnJlaW50ZXJwcmV0X2JmMTZfcDY0IChwb2x5 NjR4MV90IF9fYSkKK3sKKyAgcmV0dXJuIChiZmxvYXQxNng0X3QpX19hOwor fQorCitfX2V4dGVuc2lvbl9fIGV4dGVybiBfX2lubGluZSBiZmxvYXQxNng0 X3QKK19fYXR0cmlidXRlX18gICgoX19hbHdheXNfaW5saW5lX18sIF9fZ251 X2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCit2cmVpbnRlcnByZXRfYmYx Nl9mMTYgKGZsb2F0MTZ4NF90IF9fYSkKK3sKKyAgcmV0dXJuIChiZmxvYXQx Nng0X3QpX19hOworfQorCitfX2V4dGVuc2lvbl9fIGV4dGVybiBfX2lubGlu ZSBiZmxvYXQxNng0X3QKK19fYXR0cmlidXRlX18gICgoX19hbHdheXNfaW5s aW5lX18sIF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCit2cmVp bnRlcnByZXRfYmYxNl9mMzIgKGZsb2F0MzJ4Ml90IF9fYSkKK3sKKyAgcmV0 dXJuIChiZmxvYXQxNng0X3QpX19hOworfQorCitfX2V4dGVuc2lvbl9fIGV4 dGVybiBfX2lubGluZSBiZmxvYXQxNng4X3QKK19fYXR0cmlidXRlX18gICgo X19hbHdheXNfaW5saW5lX18sIF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNp YWxfXykpCit2cmVpbnRlcnByZXRxX2JmMTZfdTggKHVpbnQ4eDE2X3QgX19h KQoreworICByZXR1cm4gKGJmbG9hdDE2eDhfdClfX2E7Cit9CisKK19fZXh0 ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIGJmbG9hdDE2eDhfdAorX19hdHRy aWJ1dGVfXyAgKChfX2Fsd2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5lX18s IF9fYXJ0aWZpY2lhbF9fKSkKK3ZyZWludGVycHJldHFfYmYxNl91MTYgKHVp bnQxNng4X3QgX19hKQoreworICByZXR1cm4gKGJmbG9hdDE2eDhfdClfX2E7 Cit9CisKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIGJmbG9hdDE2 eDhfdAorX19hdHRyaWJ1dGVfXyAgKChfX2Fsd2F5c19pbmxpbmVfXywgX19n bnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK3ZyZWludGVycHJldHFf YmYxNl91MzIgKHVpbnQzMng0X3QgX19hKQoreworICByZXR1cm4gKGJmbG9h dDE2eDhfdClfX2E7Cit9CisKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5s aW5lIGJmbG9hdDE2eDhfdAorX19hdHRyaWJ1dGVfXyAgKChfX2Fsd2F5c19p bmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK3Zy ZWludGVycHJldHFfYmYxNl91NjQgKHVpbnQ2NHgyX3QgX19hKQoreworICBy ZXR1cm4gKGJmbG9hdDE2eDhfdClfX2E7Cit9CisKK19fZXh0ZW5zaW9uX18g ZXh0ZXJuIF9faW5saW5lIGJmbG9hdDE2eDhfdAorX19hdHRyaWJ1dGVfXyAg KChfX2Fsd2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZp Y2lhbF9fKSkKK3ZyZWludGVycHJldHFfYmYxNl9zOCAoaW50OHgxNl90IF9f YSkKK3sKKyAgcmV0dXJuIChiZmxvYXQxNng4X3QpX19hOworfQorCitfX2V4 dGVuc2lvbl9fIGV4dGVybiBfX2lubGluZSBiZmxvYXQxNng4X3QKK19fYXR0 cmlidXRlX18gICgoX19hbHdheXNfaW5saW5lX18sIF9fZ251X2lubGluZV9f LCBfX2FydGlmaWNpYWxfXykpCit2cmVpbnRlcnByZXRxX2JmMTZfczE2IChp bnQxNng4X3QgX19hKQoreworICByZXR1cm4gKGJmbG9hdDE2eDhfdClfX2E7 Cit9CisKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIGJmbG9hdDE2 eDhfdAorX19hdHRyaWJ1dGVfXyAgKChfX2Fsd2F5c19pbmxpbmVfXywgX19n bnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK3ZyZWludGVycHJldHFf YmYxNl9zMzIgKGludDMyeDRfdCBfX2EpCit7CisgIHJldHVybiAoYmZsb2F0 MTZ4OF90KV9fYTsKK30KKworX19leHRlbnNpb25fXyBleHRlcm4gX19pbmxp bmUgYmZsb2F0MTZ4OF90CitfX2F0dHJpYnV0ZV9fICAoKF9fYWx3YXlzX2lu bGluZV9fLCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQordnJl aW50ZXJwcmV0cV9iZjE2X3M2NCAoaW50NjR4Ml90IF9fYSkKK3sKKyAgcmV0 dXJuIChiZmxvYXQxNng4X3QpX19hOworfQorCitfX2V4dGVuc2lvbl9fIGV4 dGVybiBfX2lubGluZSBiZmxvYXQxNng4X3QKK19fYXR0cmlidXRlX18gICgo X19hbHdheXNfaW5saW5lX18sIF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNp YWxfXykpCit2cmVpbnRlcnByZXRxX2JmMTZfcDggKHBvbHk4eDE2X3QgX19h KQoreworICByZXR1cm4gKGJmbG9hdDE2eDhfdClfX2E7Cit9CisKK19fZXh0 ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIGJmbG9hdDE2eDhfdAorX19hdHRy aWJ1dGVfXyAgKChfX2Fsd2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5lX18s IF9fYXJ0aWZpY2lhbF9fKSkKK3ZyZWludGVycHJldHFfYmYxNl9wMTYgKHBv bHkxNng4X3QgX19hKQoreworICByZXR1cm4gKGJmbG9hdDE2eDhfdClfX2E7 Cit9CisKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIGJmbG9hdDE2 eDhfdAorX19hdHRyaWJ1dGVfXyAgKChfX2Fsd2F5c19pbmxpbmVfXywgX19n bnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK3ZyZWludGVycHJldHFf YmYxNl9wNjQgKHBvbHk2NHgyX3QgX19hKQoreworICByZXR1cm4gKGJmbG9h dDE2eDhfdClfX2E7Cit9CisKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5s aW5lIGJmbG9hdDE2eDhfdAorX19hdHRyaWJ1dGVfXyAgKChfX2Fsd2F5c19p bmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK3Zy ZWludGVycHJldHFfYmYxNl9wMTI4IChwb2x5MTI4X3QgX19hKQoreworICBy ZXR1cm4gKGJmbG9hdDE2eDhfdClfX2E7Cit9CisKK19fZXh0ZW5zaW9uX18g ZXh0ZXJuIF9faW5saW5lIGJmbG9hdDE2eDhfdAorX19hdHRyaWJ1dGVfXyAg KChfX2Fsd2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZp Y2lhbF9fKSkKK3ZyZWludGVycHJldHFfYmYxNl9mMTYgKGZsb2F0MTZ4OF90 IF9fYSkKK3sKKyAgcmV0dXJuIChiZmxvYXQxNng4X3QpX19hOworfQorCitf X2V4dGVuc2lvbl9fIGV4dGVybiBfX2lubGluZSBiZmxvYXQxNng4X3QKK19f YXR0cmlidXRlX18gICgoX19hbHdheXNfaW5saW5lX18sIF9fZ251X2lubGlu ZV9fLCBfX2FydGlmaWNpYWxfXykpCit2cmVpbnRlcnByZXRxX2JmMTZfZjMy IChmbG9hdDMyeDRfdCBfX2EpCit7CisgIHJldHVybiAoYmZsb2F0MTZ4OF90 KV9fYTsKK30KKworX19leHRlbnNpb25fXyBleHRlcm4gX19pbmxpbmUgaW50 OHg4X3QKK19fYXR0cmlidXRlX18gICgoX19hbHdheXNfaW5saW5lX18sIF9f Z251X2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCit2cmVpbnRlcnByZXRf czhfYmYxNiAoYmZsb2F0MTZ4NF90IF9fYSkKK3sKKyAgcmV0dXJuIChpbnQ4 eDhfdClfX2E7Cit9CisKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5l IGludDE2eDRfdAorX19hdHRyaWJ1dGVfXyAgKChfX2Fsd2F5c19pbmxpbmVf XywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK3ZyZWludGVy cHJldF9zMTZfYmYxNiAoYmZsb2F0MTZ4NF90IF9fYSkKK3sKKyAgcmV0dXJu IChpbnQxNng0X3QpX19hOworfQorCitfX2V4dGVuc2lvbl9fIGV4dGVybiBf X2lubGluZSBpbnQzMngyX3QKK19fYXR0cmlidXRlX18gICgoX19hbHdheXNf aW5saW5lX18sIF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCit2 cmVpbnRlcnByZXRfczMyX2JmMTYgKGJmbG9hdDE2eDRfdCBfX2EpCit7Cisg IHJldHVybiAoaW50MzJ4Ml90KV9fYTsKK30KKworX19leHRlbnNpb25fXyBl eHRlcm4gX19pbmxpbmUgaW50NjR4MV90CitfX2F0dHJpYnV0ZV9fICAoKF9f YWx3YXlzX2lubGluZV9fLCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFs X18pKQordnJlaW50ZXJwcmV0X3M2NF9iZjE2IChiZmxvYXQxNng0X3QgX19h KQoreworICByZXR1cm4gKGludDY0eDFfdClfX2E7Cit9CisKK19fZXh0ZW5z aW9uX18gZXh0ZXJuIF9faW5saW5lIHVpbnQ4eDhfdAorX19hdHRyaWJ1dGVf XyAgKChfX2Fsd2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0 aWZpY2lhbF9fKSkKK3ZyZWludGVycHJldF91OF9iZjE2IChiZmxvYXQxNng0 X3QgX19hKQoreworICByZXR1cm4gKHVpbnQ4eDhfdClfX2E7Cit9CisKK19f ZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIHVpbnQxNng0X3QKK19fYXR0 cmlidXRlX18gICgoX19hbHdheXNfaW5saW5lX18sIF9fZ251X2lubGluZV9f LCBfX2FydGlmaWNpYWxfXykpCit2cmVpbnRlcnByZXRfdTE2X2JmMTYgKGJm bG9hdDE2eDRfdCBfX2EpCit7CisgIHJldHVybiAodWludDE2eDRfdClfX2E7 Cit9CisKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIHVpbnQzMngy X3QKK19fYXR0cmlidXRlX18gICgoX19hbHdheXNfaW5saW5lX18sIF9fZ251 X2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCit2cmVpbnRlcnByZXRfdTMy X2JmMTYgKGJmbG9hdDE2eDRfdCBfX2EpCit7CisgIHJldHVybiAodWludDMy eDJfdClfX2E7Cit9CisKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5l IHVpbnQ2NHgxX3QKK19fYXR0cmlidXRlX18gICgoX19hbHdheXNfaW5saW5l X18sIF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCit2cmVpbnRl cnByZXRfdTY0X2JmMTYgKGJmbG9hdDE2eDRfdCBfX2EpCit7CisgIHJldHVy biAodWludDY0eDFfdClfX2E7Cit9CisKK19fZXh0ZW5zaW9uX18gZXh0ZXJu IF9faW5saW5lIGZsb2F0MzJ4Ml90CitfX2F0dHJpYnV0ZV9fICAoKF9fYWx3 YXlzX2lubGluZV9fLCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFsX18p KQordnJlaW50ZXJwcmV0X2YzMl9iZjE2IChiZmxvYXQxNng0X3QgX19hKQor eworICByZXR1cm4gKGZsb2F0MzJ4Ml90KV9fYTsKK30KKworX19leHRlbnNp b25fXyBleHRlcm4gX19pbmxpbmUgcG9seTh4OF90CitfX2F0dHJpYnV0ZV9f ICAoKF9fYWx3YXlzX2lubGluZV9fLCBfX2dudV9pbmxpbmVfXywgX19hcnRp ZmljaWFsX18pKQordnJlaW50ZXJwcmV0X3A4X2JmMTYgKGJmbG9hdDE2eDRf dCBfX2EpCit7CisgIHJldHVybiAocG9seTh4OF90KV9fYTsKK30KKworX19l eHRlbnNpb25fXyBleHRlcm4gX19pbmxpbmUgcG9seTE2eDRfdAorX19hdHRy aWJ1dGVfXyAgKChfX2Fsd2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5lX18s IF9fYXJ0aWZpY2lhbF9fKSkKK3ZyZWludGVycHJldF9wMTZfYmYxNiAoYmZs b2F0MTZ4NF90IF9fYSkKK3sKKyAgcmV0dXJuIChwb2x5MTZ4NF90KV9fYTsK K30KKworX19leHRlbnNpb25fXyBleHRlcm4gX19pbmxpbmUgcG9seTY0eDFf dAorX19hdHRyaWJ1dGVfXyAgKChfX2Fsd2F5c19pbmxpbmVfXywgX19nbnVf aW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK3ZyZWludGVycHJldF9wNjRf YmYxNiAoYmZsb2F0MTZ4NF90IF9fYSkKK3sKKyAgcmV0dXJuIChwb2x5NjR4 MV90KV9fYTsKK30KKworX19leHRlbnNpb25fXyBleHRlcm4gX19pbmxpbmUg aW50OHgxNl90CitfX2F0dHJpYnV0ZV9fICAoKF9fYWx3YXlzX2lubGluZV9f LCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQordnJlaW50ZXJw cmV0cV9zOF9iZjE2IChiZmxvYXQxNng4X3QgX19hKQoreworICByZXR1cm4g KGludDh4MTZfdClfX2E7Cit9CisKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9f aW5saW5lIGludDE2eDhfdAorX19hdHRyaWJ1dGVfXyAgKChfX2Fsd2F5c19p bmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK3Zy ZWludGVycHJldHFfczE2X2JmMTYgKGJmbG9hdDE2eDhfdCBfX2EpCit7Cisg IHJldHVybiAoaW50MTZ4OF90KV9fYTsKK30KKworX19leHRlbnNpb25fXyBl eHRlcm4gX19pbmxpbmUgaW50MzJ4NF90CitfX2F0dHJpYnV0ZV9fICAoKF9f YWx3YXlzX2lubGluZV9fLCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFs X18pKQordnJlaW50ZXJwcmV0cV9zMzJfYmYxNiAoYmZsb2F0MTZ4OF90IF9f YSkKK3sKKyAgcmV0dXJuIChpbnQzMng0X3QpX19hOworfQorCitfX2V4dGVu c2lvbl9fIGV4dGVybiBfX2lubGluZSBpbnQ2NHgyX3QKK19fYXR0cmlidXRl X18gICgoX19hbHdheXNfaW5saW5lX18sIF9fZ251X2lubGluZV9fLCBfX2Fy dGlmaWNpYWxfXykpCit2cmVpbnRlcnByZXRxX3M2NF9iZjE2IChiZmxvYXQx Nng4X3QgX19hKQoreworICByZXR1cm4gKGludDY0eDJfdClfX2E7Cit9CisK K19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIHVpbnQ4eDE2X3QKK19f YXR0cmlidXRlX18gICgoX19hbHdheXNfaW5saW5lX18sIF9fZ251X2lubGlu ZV9fLCBfX2FydGlmaWNpYWxfXykpCit2cmVpbnRlcnByZXRxX3U4X2JmMTYg KGJmbG9hdDE2eDhfdCBfX2EpCit7CisgIHJldHVybiAodWludDh4MTZfdClf X2E7Cit9CisKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIHVpbnQx Nng4X3QKK19fYXR0cmlidXRlX18gICgoX19hbHdheXNfaW5saW5lX18sIF9f Z251X2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCit2cmVpbnRlcnByZXRx X3UxNl9iZjE2IChiZmxvYXQxNng4X3QgX19hKQoreworICByZXR1cm4gKHVp bnQxNng4X3QpX19hOworfQorCitfX2V4dGVuc2lvbl9fIGV4dGVybiBfX2lu bGluZSB1aW50MzJ4NF90CitfX2F0dHJpYnV0ZV9fICAoKF9fYWx3YXlzX2lu bGluZV9fLCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQordnJl aW50ZXJwcmV0cV91MzJfYmYxNiAoYmZsb2F0MTZ4OF90IF9fYSkKK3sKKyAg cmV0dXJuICh1aW50MzJ4NF90KV9fYTsKK30KKworX19leHRlbnNpb25fXyBl eHRlcm4gX19pbmxpbmUgdWludDY0eDJfdAorX19hdHRyaWJ1dGVfXyAgKChf X2Fsd2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lh bF9fKSkKK3ZyZWludGVycHJldHFfdTY0X2JmMTYgKGJmbG9hdDE2eDhfdCBf X2EpCit7CisgIHJldHVybiAodWludDY0eDJfdClfX2E7Cit9CisKK19fZXh0 ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIGZsb2F0MzJ4NF90CitfX2F0dHJp YnV0ZV9fICAoKF9fYWx3YXlzX2lubGluZV9fLCBfX2dudV9pbmxpbmVfXywg X19hcnRpZmljaWFsX18pKQordnJlaW50ZXJwcmV0cV9mMzJfYmYxNiAoYmZs b2F0MTZ4OF90IF9fYSkKK3sKKyAgcmV0dXJuIChmbG9hdDMyeDRfdClfX2E7 Cit9CisKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIHBvbHk4eDE2 X3QKK19fYXR0cmlidXRlX18gICgoX19hbHdheXNfaW5saW5lX18sIF9fZ251 X2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCit2cmVpbnRlcnByZXRxX3A4 X2JmMTYgKGJmbG9hdDE2eDhfdCBfX2EpCit7CisgIHJldHVybiAocG9seTh4 MTZfdClfX2E7Cit9CisKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5l IHBvbHkxNng4X3QKK19fYXR0cmlidXRlX18gICgoX19hbHdheXNfaW5saW5l X18sIF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCit2cmVpbnRl cnByZXRxX3AxNl9iZjE2IChiZmxvYXQxNng4X3QgX19hKQoreworICByZXR1 cm4gKHBvbHkxNng4X3QpX19hOworfQorCitfX2V4dGVuc2lvbl9fIGV4dGVy biBfX2lubGluZSBwb2x5NjR4Ml90CitfX2F0dHJpYnV0ZV9fICAoKF9fYWx3 YXlzX2lubGluZV9fLCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFsX18p KQordnJlaW50ZXJwcmV0cV9wNjRfYmYxNiAoYmZsb2F0MTZ4OF90IF9fYSkK K3sKKyAgcmV0dXJuIChwb2x5NjR4Ml90KV9fYTsKK30KKworX19leHRlbnNp b25fXyBleHRlcm4gX19pbmxpbmUgcG9seTEyOF90CitfX2F0dHJpYnV0ZV9f ICAoKF9fYWx3YXlzX2lubGluZV9fLCBfX2dudV9pbmxpbmVfXywgX19hcnRp ZmljaWFsX18pKQordnJlaW50ZXJwcmV0cV9wMTI4X2JmMTYgKGJmbG9hdDE2 eDhfdCBfX2EpCit7CisgIHJldHVybiAocG9seTEyOF90KV9fYTsKK30KKwog X19leHRlbnNpb25fXyBleHRlcm4gX19pbmxpbmUgZmxvYXQzMngyX3QKIF9f YXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5l X18sIF9fYXJ0aWZpY2lhbF9fKSkKIHZiZmRvdF9mMzIgKGZsb2F0MzJ4Ml90 IF9fciwgYmZsb2F0MTZ4NF90IF9fYSwgYmZsb2F0MTZ4NF90IF9fYikKZGlm ZiAtLWdpdCBhL2djYy9jb25maWcvYXJtL2FybV9uZW9uX2J1aWx0aW5zLmRl ZiBiL2djYy9jb25maWcvYXJtL2FybV9uZW9uX2J1aWx0aW5zLmRlZgppbmRl eCA4NWFlYWVjZjBkYzc1NzlmNTExZDA5Nzk3MDg2MzVlZDY1Mzk5NjE0Li5i ZjI4YjI0YjEwOGEwODFhMDIzYWE3NmY3MGQ0ZGE4YmMwY2MyZDdlIDEwMDY0 NAotLS0gYS9nY2MvY29uZmlnL2FybS9hcm1fbmVvbl9idWlsdGlucy5kZWYK KysrIGIvZ2NjL2NvbmZpZy9hcm0vYXJtX25lb25fYnVpbHRpbnMuZGVmCkBA IC0yMjEsMTMgKzIyMSwxMyBAQCBWQVIxMCAoU0VUTEFORSwgdnNldF9sYW5l LAogVkFSNSAoVU5PUCwgdmNyZWF0ZSwgdjhxaSwgdjRoaSwgdjJzaSwgdjJz ZiwgZGkpCiBWQVIxMCAoVU5PUCwgdmR1cF9uLAogCSB2OHFpLCB2NGhpLCB2 MnNpLCB2MnNmLCBkaSwgdjE2cWksIHY4aGksIHY0c2ksIHY0c2YsIHYyZGkp Ci1WQVIyIChVTk9QLCB2ZHVwX24sIHY4aGYsIHY0aGYpCitWQVI0IChVTk9Q LCB2ZHVwX24sIHY4aGYsIHY0aGYsIHY4YmYsIHY0YmYpCiBWQVIxMCAoR0VU TEFORSwgdmR1cF9sYW5lLAogCSB2OHFpLCB2NGhpLCB2MnNpLCB2MnNmLCBk aSwgdjE2cWksIHY4aGksIHY0c2ksIHY0c2YsIHYyZGkpCi1WQVIyIChHRVRM QU5FLCB2ZHVwX2xhbmUsIHY4aGYsIHY0aGYpCi1WQVI2IChDT01CSU5FLCB2 Y29tYmluZSwgdjhxaSwgdjRoaSwgdjRoZiwgdjJzaSwgdjJzZiwgZGkpCi1W QVI2IChVTk9QLCB2Z2V0X2hpZ2gsIHYxNnFpLCB2OGhpLCB2OGhmLCB2NHNp LCB2NHNmLCB2MmRpKQotVkFSNiAoVU5PUCwgdmdldF9sb3csIHYxNnFpLCB2 OGhpLCB2OGhmLCB2NHNpLCB2NHNmLCB2MmRpKQorVkFSNCAoR0VUTEFORSwg dmR1cF9sYW5lLCB2OGhmLCB2NGhmLCB2OGJmLCB2NGJmKQorVkFSNyAoQ09N QklORSwgdmNvbWJpbmUsIHY4cWksIHY0aGksIHY0aGYsIHYyc2ksIHYyc2Ys IGRpLCB2NGJmKQorVkFSNyAoVU5PUCwgdmdldF9oaWdoLCB2MTZxaSwgdjho aSwgdjhoZiwgdjhiZiwgdjRzaSwgdjRzZiwgdjJkaSkKK1ZBUjcgKFVOT1As IHZnZXRfbG93LCB2MTZxaSwgdjhoaSwgdjhoZiwgdjhiZiwgdjRzaSwgdjRz ZiwgdjJkaSkKIFZBUjMgKFVOT1AsIHZtb3ZuLCB2OGhpLCB2NHNpLCB2MmRp KQogVkFSMyAoVU5PUCwgdnFtb3ZucywgdjhoaSwgdjRzaSwgdjJkaSkKIFZB UjMgKFVOT1AsIHZxbW92bnUsIHY4aGksIHY0c2ksIHYyZGkpCkBAIC0zNzYs NCArMzc2LDQgQEAgVkFSMiAoTUFDX0xBTkVfUEFJUiwgdmNtbGFxX2xhbmUy NzAsIHY0c2YsIHY4aGYpCiAKIFZBUjIgKFRFUk5PUCwgdmJmZG90LCB2MnNm LCB2NHNmKQogVkFSMiAoTUFDX0xBTkVfUEFJUiwgdmJmZG90X2xhbmV2NGJm LCB2MnNmLCB2NHNmKQotVkFSMiAoTUFDX0xBTkVfUEFJUiwgdmJmZG90X2xh bmV2OGJmLCB2MnNmLCB2NHNmKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZp bGUKK1ZBUjIgKE1BQ19MQU5FX1BBSVIsIHZiZmRvdF9sYW5ldjhiZiwgdjJz ZiwgdjRzZikKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYXJtL2l0ZXJhdG9y cy5tZCBiL2djYy9jb25maWcvYXJtL2l0ZXJhdG9ycy5tZAppbmRleCBjZjVi ZmI0Yzc3YTdiZTA0MDBiYWRhOGM1MTdiODc3NTM3ZjRkMmM2Li4xYjZhYWRh MGQwODc5YTdmNTIxYmY4NjhhZDJjMTkxNjY5NjJmZmYyIDEwMDY0NAotLS0g YS9nY2MvY29uZmlnL2FybS9pdGVyYXRvcnMubWQKKysrIGIvZ2NjL2NvbmZp Zy9hcm0vaXRlcmF0b3JzLm1kCkBAIC04MiwxNCArODIsMTQgQEAKIChkZWZp bmVfbW9kZV9pdGVyYXRvciBWRF9SRSBbVjhRSSBWNEhJIFYyU0kgVjJTRiBE SV0pCiAKIDs7IERvdWJsZS13aWR0aCB2ZWN0b3IgbW9kZXMgcGx1cyA2NC1i aXQgZWxlbWVudHMuCi0oZGVmaW5lX21vZGVfaXRlcmF0b3IgVkRYIFtWOFFJ IFY0SEkgVjRIRiBWMlNJIFYyU0YgREldKQorKGRlZmluZV9tb2RlX2l0ZXJh dG9yIFZEWCBbVjhRSSBWNEhJIFY0SEYgVjRCRiBWMlNJIFYyU0YgREldKQog CiA7OyBEb3VibGUtd2lkdGggdmVjdG9yIG1vZGVzIHBsdXMgNjQtYml0IGVs ZW1lbnRzLAogOzsgd2l0aCBWNEJGbW9kZSBhZGRlZCwgc3VpdGFibGUgZm9y IG1vdmVzLgogKGRlZmluZV9tb2RlX2l0ZXJhdG9yIFZEWE1PViBbVjhRSSBW NEhJIFY0SEYgVjRCRiBWMlNJIFYyU0YgREldKQogCiA7OyBEb3VibGUtd2lk dGggdmVjdG9yIG1vZGVzLCB3aXRoIFY0SEYgLSBmb3IgdmxkTl9sYW5lIGFu ZCB2c3ROX2xhbmUuCi0oZGVmaW5lX21vZGVfaXRlcmF0b3IgVkRfTEFORSBb VjhRSSBWNEhJIFY0SEYgVjJTSSBWMlNGXSkKKyhkZWZpbmVfbW9kZV9pdGVy YXRvciBWRF9MQU5FIFtWOFFJIFY0SEkgVjRIRiBWNEJGIFYyU0kgVjJTRl0p CiAKIDs7IERvdWJsZS13aWR0aCB2ZWN0b3IgbW9kZXMgd2l0aG91dCBmbG9h dGluZy1wb2ludCBlbGVtZW50cy4KIChkZWZpbmVfbW9kZV9pdGVyYXRvciBW REkgW1Y4UUkgVjRISSBWMlNJXSkKQEAgLTEwNCw3ICsxMDQsNyBAQAogKGRl ZmluZV9tb2RlX2l0ZXJhdG9yIFZRX0hTIFtWOEhJIFY4SEYgVjRTSSBWNFNG XSkKIAogOzsgUXVhZC13aWR0aCB2ZWN0b3IgbW9kZXMgcGx1cyA2NC1iaXQg ZWxlbWVudHMuCi0oZGVmaW5lX21vZGVfaXRlcmF0b3IgVlFYIFtWMTZRSSBW OEhJIFY4SEYgVjRTSSBWNFNGIFYyREldKQorKGRlZmluZV9tb2RlX2l0ZXJh dG9yIFZRWCBbVjE2UUkgVjhISSBWOEhGIFY4QkYgVjRTSSBWNFNGIFYyREld KQogCiA7OyBRdWFkLXdpZHRoIHZlY3RvciBtb2RlcyB3aXRob3V0IGZsb2F0 aW5nLXBvaW50IGVsZW1lbnRzLgogKGRlZmluZV9tb2RlX2l0ZXJhdG9yIFZR SSBbVjE2UUkgVjhISSBWNFNJXSkKQEAgLTE1Myw3ICsxNTMsNyBAQAogCiA7 OyBWZWN0b3IgbW9kZXMsIGluY2x1ZGluZyA2NC1iaXQgaW50ZWdlciBlbGVt ZW50cy4KIChkZWZpbmVfbW9kZV9pdGVyYXRvciBWRFFYIFtWOFFJIFYxNlFJ IFY0SEkgVjhISSBWMlNJIFY0U0kKLQkJCSAgICBWNEhGIFY4SEYgVjJTRiBW NFNGIERJIFYyREldKQorCQkJICAgIFY0SEYgVjhIRiBWNEJGIFY4QkYgVjJT RiBWNFNGIERJIFYyREldKQogCiA7OyBWZWN0b3IgbW9kZXMgaW5jbHVkaW5n IDY0LWJpdCBpbnRlZ2VyIGVsZW1lbnRzLCBidXQgbm8gZmxvYXRzLgogKGRl ZmluZV9tb2RlX2l0ZXJhdG9yIFZEUUlYIFtWOFFJIFYxNlFJIFY0SEkgVjhI SSBWMlNJIFY0U0kgREkgVjJESV0pCkBAIC01MTgsNiArNTE4LDcgQEAKIChk ZWZpbmVfbW9kZV9hdHRyIFZfZWxlbSBbKFY4UUkgIlFJIikgKFYxNlFJICJR SSIpCiAJCQkgIChWNEhJICJISSIpIChWOEhJICJISSIpCiAJCQkgIChWNEhG ICJIRiIpIChWOEhGICJIRiIpCisJCQkgIChWNEJGICJCRiIpIChWOEJGICJC RiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChWMlNJICJTSSIpIChW NFNJICJTSSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChWMlNGICJT RiIpIChWNFNGICJTRiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChE SSAiREkiKSAgIChWMkRJICJESSIpXSkKQEAgLTUyNiw2ICs1MjcsNyBAQAog KGRlZmluZV9tb2RlX2F0dHIgVl9lbGVtX2wgWyhWOFFJICJxaSIpIChWMTZR SSAicWkiKQogCQkJICAgIChWNEhJICJoaSIpIChWOEhJICJoaSIpCiAJCQkg ICAgKFY0SEYgImhmIikgKFY4SEYgImhmIikKKwkJCSAgICAoVjRCRiAiYmYi KSAoVjhCRiAiYmYiKQogCQkJICAgIChWMlNJICJzaSIpIChWNFNJICJzaSIp CiAJCQkgICAgKFYyU0YgInNmIikgKFY0U0YgInNmIikKIAkJCSAgICAoREkg ImRpIikgICAoVjJESSAiZGkiKV0pCkBAIC01NDMsNiArNTQ1LDcgQEAKIChk ZWZpbmVfbW9kZV9hdHRyIFZfdHdvX2VsZW0gWyhWOFFJICJISSIpICAgKFYx NlFJICJISSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVjRI SSAiU0kiKSAgIChWOEhJICJTSSIpCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAoVjRIRiAiU0YiKSAgIChWOEhGICJTRiIpCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAoVjRCRiAiQkYiKSAgIChWOEJGICJCRiIp CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVjJTSSAiVjJTSSIp IChWNFNJICJWMlNJIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IChWMlNGICJWMlNGIikgKFY0U0YgIlYyU0YiKQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKERJICJWMkRJIikgICAoVjJESSAiVjJESSIpXSkK QEAgLTU2Myw2ICs1NjYsNyBAQAogKGRlZmluZV9tb2RlX2F0dHIgVl90aHJl ZV9lbGVtIFsoVjhRSSAiQkxLIikgKFYxNlFJICJCTEsiKQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAoVjRISSAiQkxLIikgKFY4SEkgIkJM SyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWNEhGICJC TEsiKSAoVjhIRiAiQkxLIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKFY0QkYgIkJMSyIpIChWOEJGICJCTEsiKQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAoVjJTSSAiQkxLIikgKFY0U0kgIkJMSyIp CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWMlNGICJCTEsi KSAoVjRTRiAiQkxLIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKERJICJFSSIpICAgIChWMkRJICJFSSIpXSkKQEAgLTU3MSw2ICs1NzUs NyBAQAogKGRlZmluZV9tb2RlX2F0dHIgVl9mb3VyX2VsZW0gWyhWOFFJICJT SSIpICAgKFYxNlFJICJTSSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKFY0SEkgIlY0SEkiKSAoVjhISSAiVjRISSIpCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKFY0SEYgIlY0SEYiKSAoVjhIRiAiVjRI RiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFY0QkYgIlY0 QkYiKSAoVjhCRiAiVjRCRiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKFYyU0kgIlY0U0kiKSAoVjRTSSAiVjRTSSIpCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKFYyU0YgIlY0U0YiKSAoVjRTRiAiVjRT RiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERJICJPSSIp ICAgICAoVjJESSAiT0kiKV0pCkBAIC01NzksNiArNTg0LDcgQEAKIChkZWZp bmVfbW9kZV9hdHRyIFZfcmVnIFsoVjhRSSAiUCIpIChWMTZRSSAicSIpCiAJ CQkgKFY0SEkgIlAiKSAoVjhISSAgInEiKQogCQkJIChWNEhGICJQIikgKFY4 SEYgICJxIikKKwkJCSAoVjRCRiAiUCIpIChWOEJGICAicSIpCiAJCQkgKFYy U0kgIlAiKSAoVjRTSSAgInEiKQogCQkJIChWMlNGICJQIikgKFY0U0YgICJx IikKIAkJCSAoREkgICAiUCIpIChWMkRJICAicSIpCkBAIC02MDksNyArNjE1 LDggQEAKIChkZWZpbmVfbW9kZV9hdHRyIFZfSEFMRiBbKFYxNlFJICJWOFFJ IikgKFY4SEkgIlY0SEkiKQogCQkJICAoVjhIRiAiVjRIRiIpIChWNFNJICAi VjJTSSIpCiAJCQkgIChWNFNGICJWMlNGIikgKFYyREYgIkRGIikKLQkJCSAg KFYyREkgIkRJIikgKFY0SEYgIkhGIildKQorCQkJICAoVjJESSAiREkiKSAo VjRIRiAiSEYiKQorCQkJICAoVjRCRiAiQkYiKSAoVjhCRiAgIlY0QkYiKV0p CiAKIDs7IFNhbWUsIGJ1dCBsb3dlci1jYXNlLgogKGRlZmluZV9tb2RlX2F0 dHIgVl9oYWxmIFsoVjE2UUkgInY4cWkiKSAoVjhISSAidjRoaSIpCkBAIC02 MjAsNyArNjI3LDcgQEAKIChkZWZpbmVfbW9kZV9hdHRyIFZfRE9VQkxFIFso VjhRSSAiVjE2UUkiKSAoVjRISSAiVjhISSIpCiAJCQkgICAgKFYyU0kgIlY0 U0kiKSAoVjRIRiAiVjhIRiIpCiAJCQkgICAgKFYyU0YgIlY0U0YiKSAoREYg IlYyREYiKQotCQkJICAgIChESSAiVjJESSIpXSkKKwkJCSAgICAoREkgIlYy REkiKSAgIChWNEJGICJWOEJGIildKQogCiA7OyBTYW1lLCBidXQgbG93ZXIt Y2FzZS4KIChkZWZpbmVfbW9kZV9hdHRyIFZfZG91YmxlIFsoVjhRSSAidjE2 cWkiKSAoVjRISSAidjhoaSIpCkBAIC02MzksNiArNjQ2LDcgQEAKIAkJCQkJ KFY0U0kgIlYyU0kiKSAoVjRTRiAiVjJTRiIpCiAJCQkJCShWOFFJICJWOFFJ IikgKFY0SEkgIlY0SEkiKQogCQkJCQkoVjJTSSAiVjJTSSIpIChWMlNGICJW MlNGIikKKwkJCQkJKFY4QkYgIlY0QkYiKSAoVjRCRiAiVjRCRiIpCiAJCQkJ CShWOEhGICJWNEhGIikgKFY0SEYgIlY0SEYiKV0pCiAKIDs7IE1vZGUgb2Yg cmVzdWx0IG9mIGNvbXBhcmlzb24gb3BlcmF0aW9ucyAoYW5kIGJpdC1zZWxl Y3Qgb3BlcmFuZCAxKS4KQEAgLTY0Niw2ICs2NTQsNyBAQAogCQkJCShWNEhJ ICJWNEhJIikgKFY4SEkgICJWOEhJIikKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKFYyU0kgIlYyU0kiKSAoVjRTSSAgIlY0U0kiKQogCQkJ CShWNEhGICJWNEhJIikgKFY4SEYgICJWOEhJIikKKwkJCQkoVjRCRiAiVjRI SSIpIChWOEJGICAiVjhISSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIChWMlNGICJWMlNJIikgKFY0U0YgICJWNFNJIikKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKERJICAgIkRJIikgICAoVjJESSAg IlYyREkiKV0pCiAKQEAgLTY4Nyw2ICs2OTYsNyBAQAogICAgICAgICAgICAg ICAgICAoVjRISSAidTE2IikgKFY4SEkgInUxNiIpCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIChWMlNJICIzMiIpIChWNFNJICIzMiIpCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIChWNEhGICJ1MTYiKSAoVjhIRiAi dTE2IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFY0QkYgInUx NiIpIChWOEJGICJ1MTYiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAoVjJTRiAiMzIiKSAoVjRTRiAiMzIiKV0pCiAKIChkZWZpbmVfbW9kZV9h dHRyIFZfc3pfZWxlbSBbKFY4UUkgIjgiKSAgKFYxNlFJICI4IikKQEAgLTY5 NCw2ICs3MDQsNyBAQAogCQkJICAgICAoVjJTSSAiMzIiKSAoVjRTSSAgIjMy IikKIAkJCSAgICAgKERJICAgIjY0IikgKFYyREkgICI2NCIpCiAJCQkgICAg IChWNEhGICIxNiIpIChWOEhGICIxNiIpCisJCQkgICAgIChWNEJGICIxNiIp IChWOEJGICIxNiIpCiAJCQkgICAgIChWMlNGICIzMiIpIChWNFNGICAiMzIi KV0pCiAKIChkZWZpbmVfbW9kZV9hdHRyIFZfZWxlbV9jaCBbKFY4UUkgImIi KSAgKFYxNlFJICJiIikKQEAgLTc2NCwxMCArNzc1LDEyIEBACiAJCQkgICAg KFYyU0kgInRydWUiKSAoVjRTSSAgImZhbHNlIikKIAkJCSAgICAoVjJTRiAi dHJ1ZSIpIChWNFNGICAiZmFsc2UiKQogCQkJICAgIChESSAgICJ0cnVlIikg KFYyREkgICJmYWxzZSIpCisJCQkgICAgKFY0QkYgInRydWUiKSAoVjhCRiAg ImZhbHNlIikKIAkJCSAgICAoVjRIRiAidHJ1ZSIpIChWOEhGICAiZmFsc2Ui KV0pCiAKIChkZWZpbmVfbW9kZV9hdHRyIFZfbW9kZV9udW5pdHMgWyhWOFFJ ICI4IikgKFYxNlFJICIxNiIpCiAJCQkJIChWNEhGICI0IikgKFY4SEYgIjgi KQorCQkJCSAoVjRCRiAiNCIpIChWOEJGICI4IikKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChWNEhJICI0IikgKFY4SEkgIjgiKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFYyU0kgIjIiKSAoVjRT SSAiNCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVjJT RiAiMiIpIChWNFNGICI0IikKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYXJt L25lb24ubWQgYi9nY2MvY29uZmlnL2FybS9uZW9uLm1kCmluZGV4IDIxNzAx YjM0ZmNkMmM4NmJmZDMxMDkwNGM3Y2VjYTBjZTlmYjA0N2UuLmU3MzI2MDA3 MTllMmMwZGYzNWUxZWMwYTRlZDFjYjIzNWRjMjU3MjYgMTAwNjQ0Ci0tLSBh L2djYy9jb25maWcvYXJtL25lb24ubWQKKysrIGIvZ2NjL2NvbmZpZy9hcm0v bmVvbi5tZApAQCAtMzcwNCw2ICszNzA0LDIyIEBAIGlmIChCWVRFU19CSUdf RU5ESUFOKQogICBbKHNldF9hdHRyICJ0eXBlIiAibmVvbl9mcm9tX2dwX3Ei KV0KICkKIAorKGRlZmluZV9pbnNuICJuZW9uX3ZkdXBfbnY0YmYiCisgIFso c2V0IChtYXRjaF9vcGVyYW5kOlY0QkYgMCAic19yZWdpc3Rlcl9vcGVyYW5k IiAiPXciKQorICAgICAgICAodmVjX2R1cGxpY2F0ZTpWNEJGIChtYXRjaF9v cGVyYW5kOkJGIDEgInNfcmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkpXQorICAi VEFSR0VUX05FT04iCisgICJ2ZHVwLjE2XHQlUDAsICUxIgorICBbKHNldF9h dHRyICJ0eXBlIiAibmVvbl9mcm9tX2dwIildCispCisKKyhkZWZpbmVfaW5z biAibmVvbl92ZHVwX252OGJmIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpW OEJGIDAgInNfcmVnaXN0ZXJfb3BlcmFuZCIgIj13IikKKyAgICAgICAgKHZl Y19kdXBsaWNhdGU6VjhCRiAobWF0Y2hfb3BlcmFuZDpCRiAxICJzX3JlZ2lz dGVyX29wZXJhbmQiICJyIikpKV0KKyAgIlRBUkdFVF9ORU9OIgorICAidmR1 cC4xNlx0JXEwLCAlMSIKKyAgWyhzZXRfYXR0ciAidHlwZSIgIm5lb25fZnJv bV9ncF9xIildCispCisKIChkZWZpbmVfaW5zbiAibmVvbl92ZHVwX248bW9k ZT4iCiAgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlYzMiAwICJzX3JlZ2lzdGVy X29wZXJhbmQiICI9dyx3IikKICAgICAgICAgKHZlY19kdXBsaWNhdGU6VjMy IChtYXRjaF9vcGVyYW5kOjxWX2VsZW0+IDEgInNfcmVnaXN0ZXJfb3BlcmFu ZCIgInIsdCIpKSldCkBAIC0zNzM3LDcgKzM3NTMsNyBAQCBpZiAoQllURVNf QklHX0VORElBTikKIAogKGRlZmluZV9pbnNuICJuZW9uX3ZkdXBfbGFuZTxt b2RlPl9pbnRlcm5hbCIKICAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6VkRRVyAw ICJzX3JlZ2lzdGVyX29wZXJhbmQiICI9dyIpCi0gIAkodmVjX2R1cGxpY2F0 ZTpWRFFXIAorICAJKHZlY19kdXBsaWNhdGU6VkRRVwogICAgICAgICAgICh2 ZWNfc2VsZWN0OjxWX2VsZW0+CiAgICAgICAgICAgICAobWF0Y2hfb3BlcmFu ZDo8Vl9kb3VibGVfdmVjdG9yX21vZGU+IDEgInNfcmVnaXN0ZXJfb3BlcmFu ZCIgInciKQogICAgICAgICAgICAgKHBhcmFsbGVsIFsobWF0Y2hfb3BlcmFu ZDpTSSAyICJpbW1lZGlhdGVfb3BlcmFuZCIgImkiKV0pKSkpXQpAQCAtMzc1 OCwxMiArMzc3NCwxMiBAQCBpZiAoQllURVNfQklHX0VORElBTikKICkKIAog KGRlZmluZV9pbnNuICJuZW9uX3ZkdXBfbGFuZTxtb2RlPl9pbnRlcm5hbCIK LSBbKHNldCAobWF0Y2hfb3BlcmFuZDpWSCAwICJzX3JlZ2lzdGVyX29wZXJh bmQiICI9dyIpCi0gICAodmVjX2R1cGxpY2F0ZTpWSAorIFsoc2V0IChtYXRj aF9vcGVyYW5kOlZIRkJGIDAgInNfcmVnaXN0ZXJfb3BlcmFuZCIgIj13IikK KyAgICh2ZWNfZHVwbGljYXRlOlZIRkJGCiAgICAgKHZlY19zZWxlY3Q6PFZf ZWxlbT4KICAgICAgKG1hdGNoX29wZXJhbmQ6PFZfZG91YmxlX3ZlY3Rvcl9t b2RlPiAxICJzX3JlZ2lzdGVyX29wZXJhbmQiICJ3IikKICAgICAgKHBhcmFs bGVsIFsobWF0Y2hfb3BlcmFuZDpTSSAyICJpbW1lZGlhdGVfb3BlcmFuZCIg ImkiKV0pKSkpXQotICJUQVJHRVRfTkVPTiAmJiBUQVJHRVRfRlAxNiIKKyAi VEFSR0VUX05FT04gJiYgKFRBUkdFVF9GUDE2IHx8IFRBUkdFVF9CRjE2X1NJ TUQpIgogewogICBpZiAoQllURVNfQklHX0VORElBTikKICAgICB7CkBAIC0z Nzk5LDEwICszODE1LDEwIEBAIGlmIChCWVRFU19CSUdfRU5ESUFOKQogfSkK IAogKGRlZmluZV9leHBhbmQgIm5lb25fdmR1cF9sYW5lPG1vZGU+IgotICBb KG1hdGNoX29wZXJhbmQ6VkggMCAic19yZWdpc3Rlcl9vcGVyYW5kIikKKyAg WyhtYXRjaF9vcGVyYW5kOlZIRkJGIDAgInNfcmVnaXN0ZXJfb3BlcmFuZCIp CiAgICAobWF0Y2hfb3BlcmFuZDo8Vl9kb3VibGVfdmVjdG9yX21vZGU+IDEg InNfcmVnaXN0ZXJfb3BlcmFuZCIpCiAgICAobWF0Y2hfb3BlcmFuZDpTSSAy ICJpbW1lZGlhdGVfb3BlcmFuZCIpXQotICAiVEFSR0VUX05FT04gJiYgVEFS R0VUX0ZQMTYiCisgICJUQVJHRVRfTkVPTiAmJiAoVEFSR0VUX0ZQMTYgfHwg VEFSR0VUX0JGMTZfU0lNRCkiCiB7CiAgIGlmIChCWVRFU19CSUdfRU5ESUFO KQogICAgIHsKQEAgLTY1OTksNCArNjYxNSw0IEBAIGlmIChCWVRFU19CSUdf RU5ESUFOKQogICAgICAgfQogICB9CiAgIFsoc2V0X2F0dHIgInR5cGUiICJu ZW9uX2RvdDxxPiIpXQotKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK KykKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0v YmYxNl9kdXAuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vYmYx Nl9kdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi44MmRmZjI1ZmM2ZTI0 NGExZDkzMDM3NWExZTM1MDVlOTE3M2U1M2RjCi0tLSAvZGV2L251bGwKKysr IGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9iZjE2X2R1cC5jCkBA IC0wLDAgKzEsOTQgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7 IGRnLWFkZGl0aW9uYWwtb3B0aW9ucyAiLW1hcmNoPWFybXY4LjItYStiZjE2 K2ZwMTYgLW1mbG9hdC1hYmk9c29mdGZwIiB9ICovCisKKyNpbmNsdWRlICJh cm1fbmVvbi5oIgorCitmbG9hdDMyeDJfdAordGVzdF92YmZkb3RfdmNyZWF0 ZSAoZmxvYXQzMngyX3QgciwgdWludDY0X3QgYSwgdWludDY0X3QgYikKK3sK KyAgYmZsb2F0MTZ4NF90IF9hID0gdmNyZWF0ZV9iZjE2KGEpOworICBiZmxv YXQxNng0X3QgX2IgPSB2Y3JlYXRlX2JmMTYoYik7CisKKyAgcmV0dXJuIHZi ZmRvdF9mMzIgKHIsIF9hLCBfYik7Cit9CisvKiB7IGRnLWZpbmFsIHsgc2Nh bi1hc3NlbWJsZXIge3Zkb3QuYmYxNlx0ZFswLTldKywgZFswLTldKywgZFsw LTldK30gfSB9ICovCisKK2JmbG9hdDE2eDhfdCB0ZXN0X3Zjb21iaW5lX2Jm MTYgKGJmbG9hdDE2eDRfdCBhLCBiZmxvYXQxNng0X3QgYikKK3sKKyAgcmV0 dXJuIHZjb21iaW5lX2JmMTYgKGEsIGIpOworfQorCitiZmxvYXQxNng0X3Qg dGVzdF92Z2V0X2hpZ2hfYmYxNiAoYmZsb2F0MTZ4OF90IGEpCit7CisgIHJl dHVybiB2Z2V0X2hpZ2hfYmYxNiAoYSk7Cit9CisKK2JmbG9hdDE2eDRfdCB0 ZXN0X3ZnZXRfbG93X2JmMTYgKGJmbG9hdDE2eDhfdCBhKQoreworICByZXR1 cm4gdmdldF9sb3dfYmYxNiAoYSk7Cit9CisKK2JmbG9hdDE2X3QgdGVzdF92 Z2V0X2xhbmVfYmYxNiAoYmZsb2F0MTZ4NF90IGEpCit7CisgIHJldHVybiB2 Z2V0X2xhbmVfYmYxNiAoYSwgMSk7Cit9CisKK2JmbG9hdDE2X3QgdGVzdF92 Z2V0cV9sYW5lX2JmMTYgKGJmbG9hdDE2eDhfdCBhKQoreworICByZXR1cm4g dmdldHFfbGFuZV9iZjE2IChhLCA3KTsKK30KKworYmZsb2F0MTZ4NF90IHRl c3RfdnNldF9sYW5lX2JmMTYgKGJmbG9hdDE2X3QgYSwgYmZsb2F0MTZ4NF90 IGIpCit7CisgIHJldHVybiB2c2V0X2xhbmVfYmYxNiAoYSwgYiwgMSk7Cit9 CisKK2JmbG9hdDE2eDhfdCB0ZXN0X3ZzZXRxX2xhbmVfYmYxNiAoYmZsb2F0 MTZfdCBhLCBiZmxvYXQxNng4X3QgYikKK3sKKyAgcmV0dXJuIHZzZXRxX2xh bmVfYmYxNiAoYSwgYiwgNyk7Cit9CisKK2JmbG9hdDE2eDRfdCB2ZHVwX3Rl c3QgKGJmbG9hdDE2X3QgYSkKK3sKKyAgcmV0dXJuIHZkdXBfbl9iZjE2IChh KTsKK30KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlciB7dmR1cFwu MTZcdGRbMC05XSssIHJbMC05XSt9IH0gfSAgKi8KKworYmZsb2F0MTZ4OF90 IHZkdXBxX3Rlc3QgKGJmbG9hdDE2X3QgYSkKK3sKKyAgcmV0dXJuIHZkdXBx X25fYmYxNiAoYSk7Cit9CisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJs ZXIge3ZkdXBcLjE2XHRxWzAtOV0rLCByWzAtOV0rfSB9IH0gICovCisKKwor YmZsb2F0MTZ4NF90IHRlc3RfdmR1cF9sYW5lX2JmMTYgKGJmbG9hdDE2eDRf dCBhKQoreworICByZXR1cm4gdmR1cF9sYW5lX2JmMTYgKGEsIDEpOworfQor LyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHt2ZHVwXC4x Nlx0ZFswLTldKywgZFswLTldK1xbMVxdfSAxIH0gfSAgKi8KKworYmZsb2F0 MTZ4OF90IHRlc3RfdmR1cHFfbGFuZV9iZjE2IChiZmxvYXQxNng0X3QgYSkK K3sKKyAgcmV0dXJuIHZkdXBxX2xhbmVfYmYxNiAoYSwgMSk7Cit9CisvKiB7 IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMge3ZkdXBcLjE2XHRx WzAtOV0rLCBkWzAtOV0rXFsxXF19IDEgfSB9ICAqLworCitiZmxvYXQxNng0 X3QgdGVzdF92ZHVwX2xhbmVxX2JmMTYgKGJmbG9hdDE2eDhfdCBhKQorewor ICByZXR1cm4gdmR1cF9sYW5lcV9iZjE2IChhLCAzKTsKK30KKworYmZsb2F0 MTZ4OF90IHRlc3RfdmR1cHFfbGFuZXFfYmYxNiAoYmZsb2F0MTZ4OF90IGEp Cit7CisgIHJldHVybiB2ZHVwcV9sYW5lcV9iZjE2IChhLCAzKTsKK30KKwor YmZsb2F0MTZfdCB0ZXN0X3ZkdXBoX2xhbmVfYmYxNiAoYmZsb2F0MTZ4NF90 IGEpCit7CisgIHJldHVybiB2ZHVwaF9sYW5lX2JmMTYgKGEsIDEpOworfQor CitiZmxvYXQxNl90IHRlc3RfdmR1cGhfbGFuZXFfYmYxNiAoYmZsb2F0MTZ4 OF90IGEpCit7CisgIHJldHVybiB2ZHVwaF9sYW5lcV9iZjE2IChhLCA3KTsK K30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0v YmYxNl9yZWludGVycHJldC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L2FybS9iZjE2X3JlaW50ZXJwcmV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MC4uZTdkMzBhOTVmYmMzY2VhZjRhOTIwNTdhMTBlNmJlNGEzNGUxOTU3Ywot LS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9h cm0vYmYxNl9yZWludGVycHJldC5jCkBAIC0wLDAgKzEsNDM1IEBACisvKiB7 IGRnLWRvIGFzc2VtYmxlIHsgdGFyZ2V0IHsgYXJtKi0qLSogfSB9IH0gKi8K Ky8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IGFybV92OF8yYV9i ZjE2X25lb25fb2sgfSAqLworLyogeyBkZy1hZGQtb3B0aW9ucyBhcm1fdjhf MmFfYmYxNl9uZW9uIH0gICovCisvKiB7IGRnLWFkZGl0aW9uYWwtb3B0aW9u cyAiLXNhdmUtdGVtcHMgLW1hcmNoPWFybXY4LjItYStmcDE2K2JmMTYgLW1m bG9hdC1hYmk9aGFyZCAtbWZwdT1jcnlwdG8tbmVvbi1mcC1hcm12OCIgfSAq LworCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKworZmxvYXQzMngyX3QKK3Rl c3RfdmJmZG90X2YzMl9zOCAoZmxvYXQzMngyX3QgciwgaW50OHg4X3QgYSwg aW50OHg4X3QgYikKK3sKKyAgYmZsb2F0MTZ4NF90IF9hID0gdnJlaW50ZXJw cmV0X2JmMTZfczgoYSk7CisgIGJmbG9hdDE2eDRfdCBfYiA9IHZyZWludGVy cHJldF9iZjE2X3M4KGIpOworCisgIHJldHVybiB2YmZkb3RfZjMyIChyLCBf YSwgX2IpOworfQorCitmbG9hdDMyeDJfdAordGVzdF92YmZkb3RfZjMyX3Mx NiAoZmxvYXQzMngyX3QgciwgaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKQor eworICBiZmxvYXQxNng0X3QgX2EgPSB2cmVpbnRlcnByZXRfYmYxNl9zMTYo YSk7CisgIGJmbG9hdDE2eDRfdCBfYiA9IHZyZWludGVycHJldF9iZjE2X3Mx NihiKTsKKworICByZXR1cm4gdmJmZG90X2YzMiAociwgX2EsIF9iKTsKK30K KworZmxvYXQzMngyX3QKK3Rlc3RfdmJmZG90X2YzMl9zMzIgKGZsb2F0MzJ4 Ml90IHIsIGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikKK3sKKyAgYmZsb2F0 MTZ4NF90IF9hID0gdnJlaW50ZXJwcmV0X2JmMTZfczMyKGEpOworICBiZmxv YXQxNng0X3QgX2IgPSB2cmVpbnRlcnByZXRfYmYxNl9zMzIoYik7CisKKyAg cmV0dXJuIHZiZmRvdF9mMzIgKHIsIF9hLCBfYik7Cit9CisKK2Zsb2F0MzJ4 Ml90Cit0ZXN0X3ZiZmRvdF9mMzJfczY0IChmbG9hdDMyeDJfdCByLCBpbnQ2 NHgxX3QgYSwgaW50NjR4MV90IGIpCit7CisgIGJmbG9hdDE2eDRfdCBfYSA9 IHZyZWludGVycHJldF9iZjE2X3M2NChhKTsKKyAgYmZsb2F0MTZ4NF90IF9i ID0gdnJlaW50ZXJwcmV0X2JmMTZfczY0KGIpOworCisgIHJldHVybiB2YmZk b3RfZjMyIChyLCBfYSwgX2IpOworfQorCitmbG9hdDMyeDJfdAordGVzdF92 YmZkb3RfZjMyX3U4IChmbG9hdDMyeDJfdCByLCB1aW50OHg4X3QgYSwgdWlu dDh4OF90IGIpCit7CisgIGJmbG9hdDE2eDRfdCBfYSA9IHZyZWludGVycHJl dF9iZjE2X3U4KGEpOworICBiZmxvYXQxNng0X3QgX2IgPSB2cmVpbnRlcnBy ZXRfYmYxNl91OChiKTsKKworICByZXR1cm4gdmJmZG90X2YzMiAociwgX2Es IF9iKTsKK30KKworZmxvYXQzMngyX3QKK3Rlc3RfdmJmZG90X2YzMl91MTYg KGZsb2F0MzJ4Ml90IHIsIHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKQor eworICBiZmxvYXQxNng0X3QgX2EgPSB2cmVpbnRlcnByZXRfYmYxNl91MTYo YSk7CisgIGJmbG9hdDE2eDRfdCBfYiA9IHZyZWludGVycHJldF9iZjE2X3Ux NihiKTsKKworICByZXR1cm4gdmJmZG90X2YzMiAociwgX2EsIF9iKTsKK30K KworZmxvYXQzMngyX3QKK3Rlc3RfdmJmZG90X2YzMl91MzIgKGZsb2F0MzJ4 Ml90IHIsIHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKQoreworICBiZmxv YXQxNng0X3QgX2EgPSB2cmVpbnRlcnByZXRfYmYxNl91MzIoYSk7CisgIGJm bG9hdDE2eDRfdCBfYiA9IHZyZWludGVycHJldF9iZjE2X3UzMihiKTsKKwor ICByZXR1cm4gdmJmZG90X2YzMiAociwgX2EsIF9iKTsKK30KKworZmxvYXQz MngyX3QKK3Rlc3RfdmJmZG90X2YzMl91NjQgKGZsb2F0MzJ4Ml90IHIsIHVp bnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiKQoreworICBiZmxvYXQxNng0X3Qg X2EgPSB2cmVpbnRlcnByZXRfYmYxNl91NjQoYSk7CisgIGJmbG9hdDE2eDRf dCBfYiA9IHZyZWludGVycHJldF9iZjE2X3U2NChiKTsKKworICByZXR1cm4g dmJmZG90X2YzMiAociwgX2EsIF9iKTsKK30KKworZmxvYXQzMngyX3QKK3Rl c3RfdmJmZG90X2YzMl9wOCAoZmxvYXQzMngyX3QgciwgcG9seTh4OF90IGEs IHBvbHk4eDhfdCBiKQoreworICBiZmxvYXQxNng0X3QgX2EgPSB2cmVpbnRl cnByZXRfYmYxNl9wOChhKTsKKyAgYmZsb2F0MTZ4NF90IF9iID0gdnJlaW50 ZXJwcmV0X2JmMTZfcDgoYik7CisKKyAgcmV0dXJuIHZiZmRvdF9mMzIgKHIs IF9hLCBfYik7Cit9CisKK2Zsb2F0MzJ4Ml90Cit0ZXN0X3ZiZmRvdF9mMzJf cDE2IChmbG9hdDMyeDJfdCByLCBwb2x5MTZ4NF90IGEsIHBvbHkxNng0X3Qg YikKK3sKKyAgYmZsb2F0MTZ4NF90IF9hID0gdnJlaW50ZXJwcmV0X2JmMTZf cDE2KGEpOworICBiZmxvYXQxNng0X3QgX2IgPSB2cmVpbnRlcnByZXRfYmYx Nl9wMTYoYik7CisKKyAgcmV0dXJuIHZiZmRvdF9mMzIgKHIsIF9hLCBfYik7 Cit9CisKK2Zsb2F0MzJ4Ml90Cit0ZXN0X3ZiZmRvdF9mMzJfcDY0IChmbG9h dDMyeDJfdCByLCBwb2x5NjR4MV90IGEsIHBvbHk2NHgxX3QgYikKK3sKKyAg YmZsb2F0MTZ4NF90IF9hID0gdnJlaW50ZXJwcmV0X2JmMTZfcDY0KGEpOwor ICBiZmxvYXQxNng0X3QgX2IgPSB2cmVpbnRlcnByZXRfYmYxNl9wNjQoYik7 CisKKyAgcmV0dXJuIHZiZmRvdF9mMzIgKHIsIF9hLCBfYik7Cit9CisKK2Zs b2F0MzJ4Ml90Cit0ZXN0X3ZiZmRvdF9mMzJfZjE2IChmbG9hdDMyeDJfdCBy LCBmbG9hdDE2eDRfdCBhLCBmbG9hdDE2eDRfdCBiKQoreworICBiZmxvYXQx Nng0X3QgX2EgPSB2cmVpbnRlcnByZXRfYmYxNl9mMTYoYSk7CisgIGJmbG9h dDE2eDRfdCBfYiA9IHZyZWludGVycHJldF9iZjE2X2YxNihiKTsKKworICBy ZXR1cm4gdmJmZG90X2YzMiAociwgX2EsIF9iKTsKK30KKworZmxvYXQzMngy X3QKK3Rlc3RfdmJmZG90X2YzMl9mMzIgKGZsb2F0MzJ4Ml90IHIsIGZsb2F0 MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpCit7CisgIGJmbG9hdDE2eDRfdCBf YSA9IHZyZWludGVycHJldF9iZjE2X2YzMihhKTsKKyAgYmZsb2F0MTZ4NF90 IF9iID0gdnJlaW50ZXJwcmV0X2JmMTZfZjMyKGIpOworCisgIHJldHVybiB2 YmZkb3RfZjMyIChyLCBfYSwgX2IpOworfQorCitmbG9hdDMyeDRfdAordGVz dF92YmZkb3RxX2YzMl9zOCAoZmxvYXQzMng0X3QgciwgaW50OHgxNl90IGEs IGludDh4MTZfdCBiKQoreworICBiZmxvYXQxNng4X3QgX2EgPSB2cmVpbnRl cnByZXRxX2JmMTZfczgoYSk7CisgIGJmbG9hdDE2eDhfdCBfYiA9IHZyZWlu dGVycHJldHFfYmYxNl9zOChiKTsKKworICByZXR1cm4gdmJmZG90cV9mMzIg KHIsIF9hLCBfYik7Cit9CisKK2Zsb2F0MzJ4NF90Cit0ZXN0X3ZiZmRvdHFf ZjMyX3MxNiAoZmxvYXQzMng0X3QgciwgaW50MTZ4OF90IGEsIGludDE2eDhf dCBiKQoreworICBiZmxvYXQxNng4X3QgX2EgPSB2cmVpbnRlcnByZXRxX2Jm MTZfczE2KGEpOworICBiZmxvYXQxNng4X3QgX2IgPSB2cmVpbnRlcnByZXRx X2JmMTZfczE2KGIpOworCisgIHJldHVybiB2YmZkb3RxX2YzMiAociwgX2Es IF9iKTsKK30KKworZmxvYXQzMng0X3QKK3Rlc3RfdmJmZG90cV9mMzJfczMy IChmbG9hdDMyeDRfdCByLCBpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpCit7 CisgIGJmbG9hdDE2eDhfdCBfYSA9IHZyZWludGVycHJldHFfYmYxNl9zMzIo YSk7CisgIGJmbG9hdDE2eDhfdCBfYiA9IHZyZWludGVycHJldHFfYmYxNl9z MzIoYik7CisKKyAgcmV0dXJuIHZiZmRvdHFfZjMyIChyLCBfYSwgX2IpOwor fQorCitmbG9hdDMyeDRfdAordGVzdF92YmZkb3RxX2YzMl9zNjQgKGZsb2F0 MzJ4NF90IHIsIGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYikKK3sKKyAgYmZs b2F0MTZ4OF90IF9hID0gdnJlaW50ZXJwcmV0cV9iZjE2X3M2NChhKTsKKyAg YmZsb2F0MTZ4OF90IF9iID0gdnJlaW50ZXJwcmV0cV9iZjE2X3M2NChiKTsK KworICByZXR1cm4gdmJmZG90cV9mMzIgKHIsIF9hLCBfYik7Cit9CisKK2Zs b2F0MzJ4NF90Cit0ZXN0X3ZiZmRvdHFfZjMyX3U4IChmbG9hdDMyeDRfdCBy LCB1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikKK3sKKyAgYmZsb2F0MTZ4 OF90IF9hID0gdnJlaW50ZXJwcmV0cV9iZjE2X3U4KGEpOworICBiZmxvYXQx Nng4X3QgX2IgPSB2cmVpbnRlcnByZXRxX2JmMTZfdTgoYik7CisKKyAgcmV0 dXJuIHZiZmRvdHFfZjMyIChyLCBfYSwgX2IpOworfQorCitmbG9hdDMyeDRf dAordGVzdF92YmZkb3RxX2YzMl91MTYgKGZsb2F0MzJ4NF90IHIsIHVpbnQx Nng4X3QgYSwgdWludDE2eDhfdCBiKQoreworICBiZmxvYXQxNng4X3QgX2Eg PSB2cmVpbnRlcnByZXRxX2JmMTZfdTE2KGEpOworICBiZmxvYXQxNng4X3Qg X2IgPSB2cmVpbnRlcnByZXRxX2JmMTZfdTE2KGIpOworCisgIHJldHVybiB2 YmZkb3RxX2YzMiAociwgX2EsIF9iKTsKK30KKworZmxvYXQzMng0X3QKK3Rl c3RfdmJmZG90cV9mMzJfdTMyIChmbG9hdDMyeDRfdCByLCB1aW50MzJ4NF90 IGEsIHVpbnQzMng0X3QgYikKK3sKKyAgYmZsb2F0MTZ4OF90IF9hID0gdnJl aW50ZXJwcmV0cV9iZjE2X3UzMihhKTsKKyAgYmZsb2F0MTZ4OF90IF9iID0g dnJlaW50ZXJwcmV0cV9iZjE2X3UzMihiKTsKKworICByZXR1cm4gdmJmZG90 cV9mMzIgKHIsIF9hLCBfYik7Cit9CisKK2Zsb2F0MzJ4NF90Cit0ZXN0X3Zi ZmRvdHFfZjMyX3U2NCAoZmxvYXQzMng0X3QgciwgdWludDY0eDJfdCBhLCB1 aW50NjR4Ml90IGIpCit7CisgIGJmbG9hdDE2eDhfdCBfYSA9IHZyZWludGVy cHJldHFfYmYxNl91NjQoYSk7CisgIGJmbG9hdDE2eDhfdCBfYiA9IHZyZWlu dGVycHJldHFfYmYxNl91NjQoYik7CisKKyAgcmV0dXJuIHZiZmRvdHFfZjMy IChyLCBfYSwgX2IpOworfQorCitmbG9hdDMyeDRfdAordGVzdF92YmZkb3Rx X2YzMl9wOCAoZmxvYXQzMng0X3QgciwgcG9seTh4MTZfdCBhLCBwb2x5OHgx Nl90IGIpCit7CisgIGJmbG9hdDE2eDhfdCBfYSA9IHZyZWludGVycHJldHFf YmYxNl9wOChhKTsKKyAgYmZsb2F0MTZ4OF90IF9iID0gdnJlaW50ZXJwcmV0 cV9iZjE2X3A4KGIpOworCisgIHJldHVybiB2YmZkb3RxX2YzMiAociwgX2Es IF9iKTsKK30KKworZmxvYXQzMng0X3QKK3Rlc3RfdmJmZG90cV9mMzJfcDE2 IChmbG9hdDMyeDRfdCByLCBwb2x5MTZ4OF90IGEsIHBvbHkxNng4X3QgYikK K3sKKyAgYmZsb2F0MTZ4OF90IF9hID0gdnJlaW50ZXJwcmV0cV9iZjE2X3Ax NihhKTsKKyAgYmZsb2F0MTZ4OF90IF9iID0gdnJlaW50ZXJwcmV0cV9iZjE2 X3AxNihiKTsKKworICByZXR1cm4gdmJmZG90cV9mMzIgKHIsIF9hLCBfYik7 Cit9CisKK2Zsb2F0MzJ4NF90Cit0ZXN0X3ZiZmRvdHFfZjMyX3A2NCAoZmxv YXQzMng0X3QgciwgcG9seTY0eDJfdCBhLCBwb2x5NjR4Ml90IGIpCit7Cisg IGJmbG9hdDE2eDhfdCBfYSA9IHZyZWludGVycHJldHFfYmYxNl9wNjQoYSk7 CisgIGJmbG9hdDE2eDhfdCBfYiA9IHZyZWludGVycHJldHFfYmYxNl9wNjQo Yik7CisKKyAgcmV0dXJuIHZiZmRvdHFfZjMyIChyLCBfYSwgX2IpOworfQor CitmbG9hdDMyeDRfdAordGVzdF92YmZkb3RxX2YzMl9wMTI4IChmbG9hdDMy eDRfdCByLCBwb2x5MTI4X3QgYSwgcG9seTEyOF90IGIpCit7CisgIGJmbG9h dDE2eDhfdCBfYSA9IHZyZWludGVycHJldHFfYmYxNl9wMTI4KGEpOworICBi ZmxvYXQxNng4X3QgX2IgPSB2cmVpbnRlcnByZXRxX2JmMTZfcDEyOChiKTsK KworICByZXR1cm4gdmJmZG90cV9mMzIgKHIsIF9hLCBfYik7Cit9CisKK2Zs b2F0MzJ4NF90Cit0ZXN0X3ZiZmRvdHFfZjMyX2YxNiAoZmxvYXQzMng0X3Qg ciwgZmxvYXQxNng4X3QgYSwgZmxvYXQxNng4X3QgYikKK3sKKyAgYmZsb2F0 MTZ4OF90IF9hID0gdnJlaW50ZXJwcmV0cV9iZjE2X2YxNihhKTsKKyAgYmZs b2F0MTZ4OF90IF9iID0gdnJlaW50ZXJwcmV0cV9iZjE2X2YxNihiKTsKKwor ICByZXR1cm4gdmJmZG90cV9mMzIgKHIsIF9hLCBfYik7Cit9CisKK2Zsb2F0 MzJ4NF90Cit0ZXN0X3ZiZmRvdHFfZjMyX2YzMiAoZmxvYXQzMng0X3Qgciwg ZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYikKK3sKKyAgYmZsb2F0MTZ4 OF90IF9hID0gdnJlaW50ZXJwcmV0cV9iZjE2X2YzMihhKTsKKyAgYmZsb2F0 MTZ4OF90IF9iID0gdnJlaW50ZXJwcmV0cV9iZjE2X2YzMihiKTsKKworICBy ZXR1cm4gdmJmZG90cV9mMzIgKHIsIF9hLCBfYik7Cit9CisKKy8qIHsgZGct ZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7XHR2ZG90LmJmMTZcdGRb MC05XSssIGRbMC05XSssIGRbMC05XStcbn0gMTMgfSB9ICovCisvKiB7IGRn LWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMge1x0dmRvdC5iZjE2XHRx WzAtOV0rLCBxWzAtOV0rLCBxWzAtOV0rXG59IDE0IH0gfSAqLworCitpbnQ4 eDhfdCB0ZXN0X3ZyZWludGVycHJldF9zOF9iZjE2IChiZmxvYXQxNng0X3Qg YSwgaW50OHg4X3QgYikKK3sKKyAgaW50OHg4X3QgX2EgPSB2cmVpbnRlcnBy ZXRfczhfYmYxNiAoYSk7CisgIHJldHVybiB2YWRkX3M4IChfYSwgYik7Cit9 CisKK2ludDE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF9zMTZfYmYxNiAoYmZs b2F0MTZ4NF90IGEsIGludDE2eDRfdCBiKQoreworICBpbnQxNng0X3QgX2Eg PSB2cmVpbnRlcnByZXRfczE2X2JmMTYgKGEpOworICByZXR1cm4gdmFkZF9z MTYgKF9hLCBiKTsKK30KKworaW50MzJ4Ml90IHRlc3RfdnJlaW50ZXJwcmV0 X3MzMl9iZjE2IChiZmxvYXQxNng0X3QgYSwgaW50MzJ4Ml90IGIpCit7Cisg IGludDMyeDJfdCBfYSA9IHZyZWludGVycHJldF9zMzJfYmYxNiAoYSk7Cisg IHJldHVybiB2YWRkX3MzMiAoX2EsIGIpOworfQorCitpbnQ2NHgxX3QgdGVz dF92cmVpbnRlcnByZXRfczY0X2JmMTYgKGJmbG9hdDE2eDRfdCBhLCBpbnQ2 NHgxX3QgYikKK3sKKyAgaW50NjR4MV90IF9hID0gdnJlaW50ZXJwcmV0X3M2 NF9iZjE2IChhKTsKKyAgcmV0dXJuIHZyc2hsX3M2NCAoX2EsIGIpOworfQor Cit1aW50OHg4X3QgdGVzdF92cmVpbnRlcnByZXRfdThfYmYxNiAoYmZsb2F0 MTZ4NF90IGEsIHVpbnQ4eDhfdCBiKQoreworICB1aW50OHg4X3QgX2EgPSB2 cmVpbnRlcnByZXRfdThfYmYxNiAoYSk7CisgIHJldHVybiB2YWRkX3U4IChf YSwgYik7Cit9CisKK3VpbnQxNng0X3QgdGVzdF92cmVpbnRlcnByZXRfdTE2 X2JmMTYgKGJmbG9hdDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpCit7CisgIHVp bnQxNng0X3QgX2EgPSB2cmVpbnRlcnByZXRfdTE2X2JmMTYgKGEpOworICBy ZXR1cm4gdmFkZF91MTYgKF9hLCBiKTsKK30KKwordWludDMyeDJfdCB0ZXN0 X3ZyZWludGVycHJldF91MzJfYmYxNiAoYmZsb2F0MTZ4NF90IGEsIHVpbnQz MngyX3QgYikKK3sKKyAgdWludDMyeDJfdCBfYSA9IHZyZWludGVycHJldF91 MzJfYmYxNiAoYSk7CisgIHJldHVybiB2YWRkX3UzMiAoX2EsIGIpOworfQor Cit1aW50NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X3U2NF9iZjE2IChiZmxv YXQxNng0X3QgYSwgaW50NjR4MV90IGIpCit7CisgIHVpbnQ2NHgxX3QgX2Eg PSB2cmVpbnRlcnByZXRfdTY0X2JmMTYgKGEpOworICByZXR1cm4gdnJzaGxf dTY0IChfYSwgYik7Cit9CisKK3BvbHk4eDh4Ml90IHRlc3RfdnJlaW50ZXJw cmV0X3A4X2JmMTYgKGJmbG9hdDE2eDRfdCBhLCBwb2x5OHg4X3QgYikKK3sK KyAgcG9seTh4OF90IF9hID0gdnJlaW50ZXJwcmV0X3A4X2JmMTYgKGEpOwor ICByZXR1cm4gdnppcF9wOCAoX2EsIGIpOworfQorCitwb2x5MTZ4NHgyX3Qg dGVzdF92cmVpbnRlcnByZXRfcDE2X2JmMTYgKGJmbG9hdDE2eDRfdCBhLCBw b2x5MTZ4NF90IGIpCit7CisgIHBvbHkxNng0X3QgX2EgPSB2cmVpbnRlcnBy ZXRfcDE2X2JmMTYgKGEpOworICByZXR1cm4gdnppcF9wMTYgKF9hLCBiKTsK K30KKworcG9seTY0eDFfdCB0ZXN0X3ZyZWludGVycHJldF9wNjRfYmYxNiAo YmZsb2F0MTZ4NF90IGEsIHBvbHk2NHgxX3QgYikKK3sKKyAgcG9seTY0eDFf dCBfYSA9IHZyZWludGVycHJldF9wNjRfYmYxNiAoYSk7CisgIHJldHVybiB2 c2xpX25fcDY0IChfYSwgYiwgMyk7Cit9CisKK2Zsb2F0MzJ4Ml90IHRlc3Rf dnJlaW50ZXJwcmV0X2YzMl9iZjE2IChiZmxvYXQxNng0X3QgYSwgZmxvYXQz MngyX3QgYikKK3sKKyAgZmxvYXQzMngyX3QgX2EgPSB2cmVpbnRlcnByZXRf ZjMyX2JmMTYgKGEpOworICByZXR1cm4gdnN1Yl9mMzIgKF9hLCBiKTsKK30K KworaW50OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV9zOF9iZjE2IChiZmxv YXQxNng4X3QgYSwgaW50OHgxNl90IGIpCit7CisgIGludDh4MTZfdCBfYSA9 IHZyZWludGVycHJldHFfczhfYmYxNiAoYSk7CisgIHJldHVybiB2YWRkcV9z OCAoX2EsIGIpOworfQorCitpbnQxNng4X3QgdGVzdF92cmVpbnRlcnByZXRx X3MxNl9iZjE2IChiZmxvYXQxNng4X3QgYSwgaW50MTZ4OF90IGIpCit7Cisg IGludDE2eDhfdCBfYSA9IHZyZWludGVycHJldHFfczE2X2JmMTYgKGEpOwor ICByZXR1cm4gdmFkZHFfczE2IChfYSwgYik7Cit9CisKK2ludDMyeDRfdCB0 ZXN0X3ZyZWludGVycHJldHFfczMyX2JmMTYgKGJmbG9hdDE2eDhfdCBhLCBp bnQzMng0X3QgYikKK3sKKyAgaW50MzJ4NF90IF9hID0gdnJlaW50ZXJwcmV0 cV9zMzJfYmYxNiAoYSk7CisgIHJldHVybiB2YWRkcV9zMzIgKF9hLCBiKTsK K30KKworaW50NjR4Ml90IHRlc3RfdnJlaW50ZXJwcmV0cV9zNjRfYmYxNiAo YmZsb2F0MTZ4OF90IGEsIGludDY0eDJfdCBiKQoreworICBpbnQ2NHgyX3Qg X2EgPSB2cmVpbnRlcnByZXRxX3M2NF9iZjE2IChhKTsKKyAgcmV0dXJuIHZh ZGRxX3M2NCAoX2EsIGIpOworfQorCit1aW50OHgxNl90IHRlc3RfdnJlaW50 ZXJwcmV0cV91OF9iZjE2IChiZmxvYXQxNng4X3QgYSwgdWludDh4MTZfdCBi KQoreworICB1aW50OHgxNl90IF9hID0gdnJlaW50ZXJwcmV0cV91OF9iZjE2 IChhKTsKKyAgcmV0dXJuIHZhZGRxX3U4IChfYSwgYik7Cit9CisKK3VpbnQx Nng4X3QgdGVzdF92cmVpbnRlcnByZXRxX3UxNl9iZjE2IChiZmxvYXQxNng4 X3QgYSwgdWludDE2eDhfdCBiKQoreworICB1aW50MTZ4OF90IF9hID0gdnJl aW50ZXJwcmV0cV91MTZfYmYxNiAoYSk7CisgIHJldHVybiB2YWRkcV91MTYg KF9hLCBiKTsKK30KKwordWludDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFf dTMyX2JmMTYgKGJmbG9hdDE2eDhfdCBhLCB1aW50MzJ4NF90IGIpCit7Cisg IHVpbnQzMng0X3QgX2EgPSB2cmVpbnRlcnByZXRxX3UzMl9iZjE2IChhKTsK KyAgcmV0dXJuIHZhZGRxX3UzMiAoX2EsIGIpOworfQorCit1aW50NjR4Ml90 IHRlc3RfdnJlaW50ZXJwcmV0cV91NjRfYmYxNiAoYmZsb2F0MTZ4OF90IGEs IHVpbnQ2NHgyX3QgYikKK3sKKyAgdWludDY0eDJfdCBfYSA9IHZyZWludGVy cHJldHFfdTY0X2JmMTYgKGEpOworICByZXR1cm4gdmFkZHFfdTY0IChfYSwg Yik7Cit9CisKK3BvbHk4eDE2eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfcDhf YmYxNiAoYmZsb2F0MTZ4OF90IGEsIHBvbHk4eDE2X3QgYikKK3sKKyAgcG9s eTh4MTZfdCBfYSA9IHZyZWludGVycHJldHFfcDhfYmYxNiAoYSk7CisgIHJl dHVybiB2emlwcV9wOCAoX2EsIGIpOworfQorCitwb2x5MTZ4OHgyX3QgdGVz dF92cmVpbnRlcnByZXRxX3AxNl9iZjE2IChiZmxvYXQxNng4X3QgYSwgcG9s eTE2eDhfdCBiKQoreworICBwb2x5MTZ4OF90IF9hID0gdnJlaW50ZXJwcmV0 cV9wMTZfYmYxNiAoYSk7CisgIHJldHVybiB2emlwcV9wMTYgKF9hLCBiKTsK K30KKworcG9seTY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfcDY0X2JmMTYg KGJmbG9hdDE2eDhfdCBhLCBwb2x5NjR4Ml90IGIpCit7CisgIHBvbHk2NHgy X3QgX2EgPSB2cmVpbnRlcnByZXRxX3A2NF9iZjE2IChhKTsKKyAgcmV0dXJu IHZzbGlxX25fcDY0IChfYSwgYiwgMyk7Cit9CisKK3BvbHkxMjhfdCB0ZXN0 X3ZyZWludGVycHJldHFfcDEyOF9iZjE2IChiZmxvYXQxNng4X3QgYSwgcG9s eTE2eDhfdCBiKQoreworICBwb2x5MTI4X3QgX2EgPSB2cmVpbnRlcnByZXRx X3AxMjhfYmYxNiAoYSk7CisgIHJldHVybiBfYTsKK30KKworZmxvYXQzMng0 X3QgdGVzdF92cmVpbnRlcnByZXRxX2YzMl9iZjE2IChiZmxvYXQxNng4X3Qg YSwgZmxvYXQzMng0X3QgYikKK3sKKyAgZmxvYXQzMng0X3QgX2EgPSB2cmVp bnRlcnByZXRxX2YzMl9iZjE2IChhKTsKKyAgcmV0dXJuIHZzdWJxX2YzMiAo X2EsIGIpOworfQorCitmbG9hdDE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF9m MTZfYmYxNiAoYmZsb2F0MTZ4NF90IGEpCit7CisgIHJldHVybiB2cmVpbnRl cnByZXRfZjE2X2JmMTYgKGEpOworfQorCitmbG9hdDE2eDhfdCB0ZXN0X3Zy ZWludGVycHJldHFfZjE2X2JmMTYgKGJmbG9hdDE2eDhfdCBhKQoreworICBy ZXR1cm4gdnJlaW50ZXJwcmV0cV9mMTZfYmYxNiAoYSk7Cit9CisKKy8qIHsg ZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7XHR2YWRkLmk4XHRk WzAtOV0rLCBkWzAtOV0rLCBkWzAtOV0rXG59IDIgfSB9ICovCisvKiB7IGRn LWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMge1x0dmFkZC5pMTZcdGRb MC05XSssIGRbMC05XSssIGRbMC05XStcbn0gMiB9IH0gKi8KKy8qIHsgZGct ZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7XHR2YWRkLmkzMlx0ZFsw LTldKywgZFswLTldKywgZFswLTldK1xufSAyIH0gfSAqLworCisvKiB7IGRn LWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMge1x0dmFkZC5pOFx0cVsw LTldKywgcVswLTldKywgcVswLTldK1xufSAyIH0gfSAqLworLyogeyBkZy1m aW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHtcdHZhZGQuaTE2XHRxWzAt OV0rLCBxWzAtOV0rLCBxWzAtOV0rXG59IDIgfSB9ICovCisvKiB7IGRnLWZp bmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMge1x0dmFkZC5pMzJcdHFbMC05 XSssIHFbMC05XSssIHFbMC05XStcbn0gMiB9IH0gKi8KKy8qIHsgZGctZmlu YWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7XHR2YWRkLmk2NFx0cVswLTld KywgcVswLTldKywgcVswLTldK1xufSAyIH0gfSAqLworCisvKiB7IGRnLWZp bmFsIHsgc2Nhbi1hc3NlbWJsZXIge1x0dnN1Yi5mMzJcdGRbMC05XSssIGRb MC05XSssIGRbMC05XStcbn0gfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nh bi1hc3NlbWJsZXIge1x0dnN1Yi5mMzJcdHFbMC05XSssIHFbMC05XSssIHFb MC05XStcbn0gfSB9ICovCisKKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2Vt YmxlciB7XHR2emlwLjhcdGRbMC05XSssIGRbMC05XStcbn0gfSB9ICovCisv KiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXIge1x0dnppcC4xNlx0ZFsw LTldKywgZFswLTldK1xufSB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2Fu LWFzc2VtYmxlciB7XHR2emlwLjhcdHFbMC05XSssIHFbMC05XStcbn0gfSB9 ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXIge1x0dnppcC4x Nlx0cVswLTldKywgcVswLTldK1xufSB9IH0gKi8KKworLyogeyBkZy1maW5h bCB7IHNjYW4tYXNzZW1ibGVyIHtcdHZyc2hsLnM2NFx0ZFswLTldKywgZFsw LTldKywgZFswLTldK1xufSB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2Fu LWFzc2VtYmxlciB7XHR2cnNobC51NjRcdGRbMC05XSssIGRbMC05XSssIGRb MC05XStcbn0gfSB9ICovCisKKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2Vt YmxlciB7XHR2c2xpLjY0XHRkWzAtOV0rLCBkWzAtOV0rLCAjM1xufSB9IH0g Ki8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlciB7XHR2c2xpLjY0 XHRxWzAtOV0rLCBxWzAtOV0rLCAjM1xufSB9IH0gKi8KCg== --===============4542924355783240075==--