From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E0A88C4320E for ; Tue, 17 Aug 2021 17:50:06 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B5AB461042 for ; Tue, 17 Aug 2021 17:50:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232552AbhHQRui (ORCPT ); Tue, 17 Aug 2021 13:50:38 -0400 Received: from bhuna.collabora.co.uk ([46.235.227.227]:56118 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232256AbhHQRud (ORCPT ); Tue, 17 Aug 2021 13:50:33 -0400 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: nicolas) with ESMTPSA id AFD541F42897 Message-ID: <0fd8f0cfd231be2e11da218b0401e1b0e0a15cca.camel@collabora.com> Subject: Re: [PATCH v3 05/10] media: uapi: Add VP9 stateless decoder controls From: Nicolas Dufresne To: Andrzej Pietrasiewicz , linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-staging@lists.linux.dev Cc: Benjamin Gaignard , Boris Brezillon , Ezequiel Garcia , Fabio Estevam , Greg Kroah-Hartman , Hans Verkuil , Heiko Stuebner , Jernej Skrabec , Mauro Carvalho Chehab , NXP Linux Team , Pengutronix Kernel Team , Philipp Zabel , Sascha Hauer , Shawn Guo , kernel@collabora.com, Ezequiel Garcia , Adrian Ratiu , Daniel Almeida Date: Tue, 17 Aug 2021 13:49:48 -0400 In-Reply-To: <20210805144246.11998-6-andrzej.p@collabora.com> References: <20210805144246.11998-1-andrzej.p@collabora.com> <20210805144246.11998-6-andrzej.p@collabora.com> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.40.3 (3.40.3-1.fc34) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Le jeudi 05 août 2021 à 16:42 +0200, Andrzej Pietrasiewicz a écrit : > Add the VP9 stateless decoder controls plus the documentation that goes > with it. > > Signed-off-by: Boris Brezillon > Co-developed-by: Ezequiel Garcia > Signed-off-by: Ezequiel Garcia > Signed-off-by: Adrian Ratiu > Signed-off-by: Andrzej Pietrasiewicz > Co-developed-by: Daniel Almeida > Signed-off-by: Daniel Almeida > --- > .../userspace-api/media/v4l/biblio.rst | 10 + > .../media/v4l/ext-ctrls-codec-stateless.rst | 545 ++++++++++++++++++ > .../media/v4l/pixfmt-compressed.rst | 15 + > .../media/v4l/vidioc-g-ext-ctrls.rst | 8 + > .../media/v4l/vidioc-queryctrl.rst | 12 + > .../media/videodev2.h.rst.exceptions | 2 + > drivers/media/v4l2-core/v4l2-ctrls-core.c | 174 ++++++ > drivers/media/v4l2-core/v4l2-ctrls-defs.c | 8 + > drivers/media/v4l2-core/v4l2-ioctl.c | 1 + > include/media/v4l2-ctrls.h | 4 + > include/uapi/linux/v4l2-controls.h | 433 ++++++++++++++ > include/uapi/linux/videodev2.h | 6 + > 12 files changed, 1218 insertions(+) > > diff --git a/Documentation/userspace-api/media/v4l/biblio.rst b/Documentation/userspace-api/media/v4l/biblio.rst > index 7b8e6738ff9e..9cd18c153d19 100644 > --- a/Documentation/userspace-api/media/v4l/biblio.rst > +++ b/Documentation/userspace-api/media/v4l/biblio.rst > @@ -417,3 +417,13 @@ VP8 > :title: RFC 6386: "VP8 Data Format and Decoding Guide" > > :author: J. Bankoski et al. > + > +.. _vp9: > + > +VP9 > +=== > + > + > +:title: VP9 Bitstream & Decoding Process Specification > + > +:author: Adrian Grange (Google), Peter de Rivaz (Argon Design), Jonathan Hunt (Argon Design) > diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst > index 72f5e85b4f34..af06d46e5993 100644 > --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst > +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst > @@ -1458,3 +1458,548 @@ FWHT Flags > .. raw:: latex > > \normalsize > + > +.. _v4l2-codec-stateless-vp9: > + > +``V4L2_CID_STATELESS_VP9_COMPRESSED_HDR_PROBS (struct)`` > + Stores VP9 probabilities updates as parsed from the current compressed frame > + header. A value of zero in an array element means no update of the relevant > + probability. Motion vector-related updates contain a new value or zero. All > + other updates contain values translated with inv_map_table[] (see 6.3.5 in > + :ref:`vp9`). As we discuss, widewine and other crypto may encrypt the compressed headers, so passing this information is not always possible from userspace. Newer VP9 decoders (notably newer Rockchip decoder) are being being extended with full HW support for compressed header handling including probability updates. Regardless if we like drm or not, we should at least make sure the spec allow to optimize and skip this control. Documenting this will reassure driver writers that don't need it and will let userspace devs know that they should check the control presence and can then skip the associate entropy decoding if not needed. > + > +.. c:type:: v4l2_ctrl_vp9_compressed_hdr_probs > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{5.8cm}|p{4.8cm}|p{6.6cm}| > + > +.. flat-table:: struct v4l2_ctrl_vp9_compressed_hdr_probs > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 1 2 > + > + * - __u8 > + - ``tx8[2][1]`` > + - TX 8x8 probabilities delta. > + * - __u8 > + - ``tx16[2][2]`` > + - TX 16x16 probabilities delta. > + * - __u8 > + - ``tx32[2][3]`` > + - TX 32x32 probabilities delta. > + * - __u8 > + - ``coef[4][2][2][6][6][3]`` > + - Coefficient probabilities delta. > + * - __u8 > + - ``skip[3]`` > + - Skip probabilities delta. > + * - __u8 > + - ``inter_mode[7][3]`` > + - Inter prediction mode probabilities delta. > + * - __u8 > + - ``interp_filter[4][2]`` > + - Interpolation filter probabilities delta. > + * - __u8 > + - ``is_inter[4]`` > + - Is inter-block probabilities delta. > + * - __u8 > + - ``comp_mode[5]`` > + - Compound prediction mode probabilities delta. > + * - __u8 > + - ``single_ref[5][2]`` > + - Single reference probabilities delta. > + * - __u8 > + - ``comp_ref[5]`` > + - Compound reference probabilities delta. > + * - __u8 > + - ``y_mode[4][9]`` > + - Y prediction mode probabilities delta. > + * - __u8 > + - ``uv_mode[10][9]`` > + - UV prediction mode probabilities delta. > + * - __u8 > + - ``partition[16][3]`` > + - Partition probabilities delta. > + * - __u8 > + - ``mv.joint[3]`` > + - Motion vector joint probabilities delta. > + * - __u8 > + - ``mv.sign[2]`` > + - Motion vector sign probabilities delta. > + * - __u8 > + - ``mv.classes[2][10]`` > + - Motion vector class probabilities delta. > + * - __u8 > + - ``mv.class0_bit[2]`` > + - Motion vector class0 bit probabilities delta. > + * - __u8 > + - ``mv.bits[2][10]`` > + - Motion vector bits probabilities delta. > + * - __u8 > + - ``mv.class0_fr[2][2][3]`` > + - Motion vector class0 fractional bit probabilities delta. > + * - __u8 > + - ``mv.fr[2][3]`` > + - Motion vector fractional bit probabilities delta. > + * - __u8 > + - ``mv.class0_hp[2]`` > + - Motion vector class0 high precision fractional bit probabilities delta. > + * - __u8 > + - ``mv.hp[2]`` > + - Motion vector high precision fractional bit probabilities delta. > + > +``V4L2_CID_STATELESS_VP9_FRAME (struct)`` > + Specifies the frame parameters for the associated VP9 frame decode request. > + This includes the necessary parameters for configuring a stateless hardware > + decoding pipeline for VP9. The bitstream parameters are defined according > + to :ref:`vp9`. > + > +.. c:type:: v4l2_ctrl_vp9_frame > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: struct v4l2_ctrl_vp9_frame > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 1 2 > + > + * - struct :c:type:`v4l2_vp9_loop_filter` > + - ``lf`` > + - Loop filter parameters. See struct :c:type:`v4l2_vp9_loop_filter` for more details. > + * - struct :c:type:`v4l2_vp9_quantization` > + - ``quant`` > + - Quantization parameters. See :c:type:`v4l2_vp9_quantization` for more details. > + * - struct :c:type:`v4l2_vp9_segmentation` > + - ``seg`` > + - Segmentation parameters. See :c:type:`v4l2_vp9_segmentation` for more details. > + * - __u32 > + - ``flags`` > + - Combination of V4L2_VP9_FRAME_FLAG_* flags. See :c:type:`v4l2_vp9_frame_flags`. > + * - __u16 > + - ``compressed_header_size`` > + - Compressed header size in bytes. > + * - __u16 > + - ``uncompressed_header_size`` > + - Uncompressed header size in bytes. > + * - __u16 > + - ``frame_width_minus_1`` > + - Add 1 to get the frame width expressed in pixels. See section 7.2.3 in :ref:`vp9`. > + * - __u16 > + - ``frame_height_minus_1`` > + - Add 1 to get the frame height expressed in pixels. See section 7.2.3 in :ref:`vp9`. > + * - __u16 > + - ``render_width_minus_1`` > + - Add 1 to get the expected render width expressed in pixels. This is > + not used during the decoding process but might be used by HW scalers to > + prepare a frame that's ready for scanout. See section 7.2.4 in :ref:`vp9`. > + * - __u16 > + - render_height_minus_1 > + - Add 1 to get the expected render height expressed in pixels. This is > + not used during the decoding process but might be used by HW scalers to > + prepare a frame that's ready for scanout. See section 7.2.4 in :ref:`vp9`. > + * - __u64 > + - ``last_frame_ts`` > + - "last" reference buffer timestamp. > + The timestamp refers to the ``timestamp`` field in > + struct :c:type:`v4l2_buffer`. Use the :c:func:`v4l2_timeval_to_ns()` > + function to convert the struct :c:type:`timeval` in struct > + :c:type:`v4l2_buffer` to a __u64. > + * - __u64 > + - ``golden_frame_ts`` > + - "golden" reference buffer timestamp. > + The timestamp refers to the ``timestamp`` field in > + struct :c:type:`v4l2_buffer`. Use the :c:func:`v4l2_timeval_to_ns()` > + function to convert the struct :c:type:`timeval` in struct > + :c:type:`v4l2_buffer` to a __u64. > + * - __u64 > + - ``alt_frame_ts`` > + - "alt" reference buffer timestamp. > + The timestamp refers to the ``timestamp`` field in > + struct :c:type:`v4l2_buffer`. Use the :c:func:`v4l2_timeval_to_ns()` > + function to convert the struct :c:type:`timeval` in struct > + :c:type:`v4l2_buffer` to a __u64. > + * - __u8 > + - ``ref_frame_sign_bias`` > + - a bitfield specifying whether the sign bias is set for a given > + reference frame. See :c:type:`v4l2_vp9_ref_frame_sign_bias` for more details. > + * - __u8 > + - ``reset_frame_context`` > + - specifies whether the frame context should be reset to default values. See > + :c:type:`v4l2_vp9_reset_frame_context` for more details. > + * - __u8 > + - ``frame_context_idx`` > + - Frame context that should be used/updated. > + * - __u8 > + - ``profile`` > + - VP9 profile. Can be 0, 1, 2 or 3. > + * - __u8 > + - ``bit_depth`` > + - Component depth in bits. Can be 8, 10 or 12. Note that not all profiles > + support 10 and/or 12 bits depths. > + * - __u8 > + - ``interpolation_filter`` > + - Specifies the filter selection used for performing inter prediction. See > + :c:type:`v4l2_vp9_interpolation_filter` for more details. > + * - __u8 > + - ``tile_cols_log2`` > + - Specifies the base 2 logarithm of the width of each tile (where the > + width is measured in units of 8x8 blocks). Shall be less than or equal > + to 6. > + * - __u8 > + - ``tile_rows_log2`` > + - Specifies the base 2 logarithm of the height of each tile (where the > + height is measured in units of 8x8 blocks). > + * - __u8 > + - ``tx_mode`` > + - Specifies the TX mode. See :c:type:`v4l2_vp9_tx_mode` for more details. > + * - __u8 > + - ``reference_mode`` > + - Specifies the type of inter prediction to be used. See > + :c:type:`v4l2_vp9_reference_mode` for more details. > + * - __u8 > + - ``reserved[6]`` > + - Applications and drivers must set this to zero. > + > +.. c:type:: v4l2_vp9_frame_flags > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: enum v4l2_vp9_frame_flags > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 2 > + > + * - ``V4L2_VP9_FRAME_FLAG_KEY_FRAME`` > + - The frame is a key frame. > + * - ``V4L2_VP9_FRAME_FLAG_SHOW_FRAME`` > + - The frame should be displayed. > + * - ``V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT`` > + - The decoding should be error resilient. > + * - ``V4L2_VP9_FRAME_FLAG_INTRA_ONLY`` > + - The frame does not reference other frames. > + * - ``V4L2_VP9_FRAME_FLAG_ALLOW_HIGH_PREC_MV`` > + - The frame can use high precision motion vectors. > + * - ``V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX`` > + - Frame context should be updated after decoding. > + * - ``V4L2_VP9_FRAME_FLAG_PARALLEL_DEC_MODE`` > + - Parallel decoding is used. > + * - ``V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING`` > + - Vertical subsampling is enabled. > + * - ``V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING`` > + - Horizontal subsampling is enabled. > + * - ``V4L2_VP9_FRAME_FLAG_COLOR_RANGE_FULL_SWING`` > + - The full UV range is used. > + > +.. c:type:: v4l2_vp9_tx_mode > + > +See section '7.3.1 Tx mode semantics' of the VP9 specification for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: enum v4l2_vp9_tx_mode > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 2 > + > + * - ``V4L2_VP9_TX_MODE_ONLY_4X4`` > + - Transform size is 4x4. > + * - ``V4L2_VP9_TX_MODE_ALLOW_8X8`` > + - Transform size can be up to 8x8. > + * - ``V4L2_VP9_TX_MODE_ALLOW_16X16`` > + - Transform size can be up to 16x16. > + * - ``V4L2_VP9_TX_MODE_ALLOW_32X32`` > + - transform size can be up to 32x32. > + * - ``V4L2_VP9_TX_MODE_SELECT`` > + - Bitstream contains the transform size for each block. > + > +.. c:type:: v4l2_vp9_reference_mode > + > +See section '7.3.6 Frame reference mode semantics' of the VP9 specification for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: enum v4l2_vp9_reference_mode > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 2 > + > + * - ``V4L2_VP9_REFERENCE_MODE_SINGLE_REFERENCE`` > + - Indicates that all the inter blocks use only a single reference frame > + to generate motion compensated prediction. > + * - ``V4L2_VP9_REFERENCE_MODE_COMPOUND_REFERENCE`` > + - Requires all the inter blocks to use compound mode. Single reference > + frame prediction is not allowed. > + * - ``V4L2_VP9_REFERENCE_MODE_SELECT`` > + - Allows each individual inter block to select between single and > + compound prediction modes. > + > +.. c:type:: v4l2_vp9_interpolation_filter > + > +See section '7.2.7 Interpolation filter semantics' of the VP9 specification > +for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: enum v4l2_vp9_interpolation_filter > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 2 > + > + * - ``V4L2_VP9_INTERP_FILTER_EIGHTTAP`` > + - Eight tap filter. > + * - ``V4L2_VP9_INTERP_FILTER_EIGHTTAP_SMOOTH`` > + - Eight tap smooth filter. > + * - ``V4L2_VP9_INTERP_FILTER_EIGHTTAP_SHARP`` > + - Eeight tap sharp filter. > + * - ``V4L2_VP9_INTERP_FILTER_BILINEAR`` > + - Bilinear filter. > + * - ``V4L2_VP9_INTERP_FILTER_SWITCHABLE`` > + - Filter selection is signaled at the block level. > + > +.. c:type:: v4l2_vp9_reset_frame_context > + > +See section '7.2 Uncompressed header semantics' of the VP9 specification > +for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: enum v4l2_vp9_reset_frame_context > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 2 > + > + * - ``V4L2_VP9_RESET_FRAME_CTX_NONE`` > + - Do not reset any frame context. > + * - ``V4L2_VP9_RESET_FRAME_CTX_SPEC`` > + - Reset the frame context pointed to by > + :c:type:`v4l2_ctrl_vp9_frame`.frame_context_idx. > + * - ``V4L2_VP9_RESET_FRAME_CTX_ALL`` > + - Reset all frame contexts. > + > +.. c:type:: v4l2_vp9_intra_prediction_mode > + > +See section '7.4.5 Intra frame mode info semantics' for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: enum v4l2_vp9_intra_prediction_mode > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 2 > + > + * - ``V4L2_VP9_INTRA_PRED_MODE_DC_PRED`` > + - DC intra prediction. > + * - ``V4L2_VP9_INTRA_PRED_MODE_V_PRED`` > + - Vertical intra prediction. > + * - ``V4L2_VP9_INTRA_PRED_MODE_H_PRED`` > + - Horizontal intra prediction. > + * - ``V4L2_VP9_INTRA_PRED_MODE_D45_PRED`` > + - D45 intra prediction. > + * - ``V4L2_VP9_INTRA_PRED_MODE_D135_PRED`` > + - D135 intra prediction. > + * - ``V4L2_VP9_INTRA_PRED_MODE_D117_PRED`` > + - D117 intra prediction. > + * - ``V4L2_VP9_INTRA_PRED_MODE_D153_PRED`` > + - D153 intra prediction. > + * - ``V4L2_VP9_INTRA_PRED_MODE_D207_PRED`` > + - D207 intra prediction. > + * - ``V4L2_VP9_INTRA_PRED_MODE_D63_PRED`` > + - D63 intra prediction. > + * - ``V4L2_VP9_INTRA_PRED_MODE_TM_PRED`` > + - True motion intra prediction. > + > +.. c:type:: v4l2_vp9_segmentation > + > +Encodes the quantization parameters. See section '7.2.10 Segmentation > +params syntax' of the VP9 specification for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: struct v4l2_vp9_segmentation > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 1 2 > + > + * - __u8 > + - ``feature_data[8][4]`` > + - Data attached to each feature. Data entry is only valid if the feature > + is enabled. > + * - __u8 > + - ``feature_enabled[8]`` > + - Bitmask defining which features are enabled in each segment. > + * - __u8 > + - ``tree_probs[7]`` > + - Specifies the probability values to be used when decoding a Segment-ID. > + See '5.15. Segmentation map' section of :ref:`vp9` for more details. > + * - __u8 > + - ``pred_probs[3]`` > + - Specifies the probability values to be used when decoding a > + Predicted-Segment-ID. See '6.4.14. Get segment id syntax' > + section of :ref:`vp9` for more details. > + * - __u8 > + - ``flags`` > + - Combination of V4L2_VP9_SEGMENTATION_FLAG_* flags. See > + :c:type:`v4l2_vp9_segmentation_flags`. > + * - __u8 > + - ``reserved[5]`` > + - Applications and drivers must set this to zero. > + > +.. c:type:: v4l2_vp9_segment_feature > + > +Segment feature IDs. See section '7.2.10 Segmentation params syntax' of the > +VP9 specification for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: enum v4l2_vp9_segment_feature > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 2 > + > + * - ``V4L2_VP9_SEG_LVL_ALT_Q`` > + - Quantizer segment feature. > + * - ``V4L2_VP9_SEG_LVL_ALT_L`` > + - Loop filter segment feature. > + * - ``V4L2_VP9_SEG_LVL_REF_FRAME`` > + - Reference frame segment feature. > + * - ``V4L2_VP9_SEG_LVL_SKIP`` > + - Skip segment feature. > + * - ``V4L2_VP9_SEG_LVL_MAX`` > + - Number of segment features. > + > +.. c:type:: v4l2_vp9_segmentation_flags > + > +Those are the flags that may be passed to &v4l2_vp9_segmentation.flags. See > +section '7.2.10 Segmentation params syntax' of the VP9 specification for > +more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: enum v4l2_vp9_segmentation_flags > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 2 > + > + * - ``V4L2_VP9_SEGMENTATION_FLAG_ENABLED`` > + - Indicates that this frame makes use of the segmentation tool. > + * - ``V4L2_VP9_SEGMENTATION_FLAG_UPDATE_MAP`` > + - Indicates that the segmentation map should be updated during the > + decoding of this frame. > + * - ``V4L2_VP9_SEGMENTATION_FLAG_TEMPORAL_UPDATE`` > + - Indicates that the updates to the segmentation map are coded > + relative to the existing segmentation map. > + * - ``V4L2_VP9_SEGMENTATION_FLAG_UPDATE_DATA`` > + - Indicates that new parameters are about to be specified for each > + segment. > + * - ``V4L2_VP9_SEGMENTATION_FLAG_ABS_OR_DELTA_UPDATE`` > + - Indicates that the segmentation parameters represent the actual values > + to be used. > + > +.. c:type:: v4l2_vp9_quantization > + > +Encodes the quantization parameters. See section '7.2.9 Quantization params > +syntax' of the VP9 specification for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: struct v4l2_vp9_quantization > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 1 2 > + > + * - __u8 > + - ``base_q_idx`` > + - Indicates the base frame qindex. > + * - __s8 > + - ``delta_q_y_dc`` > + - Indicates the Y DC quantizer relative to base_q_idx. > + * - __s8 > + - ``delta_q_uv_dc`` > + - Indicates the UV DC quantizer relative to base_q_idx. > + * - __s8 > + - ``delta_q_uv_ac`` > + - Indicates the UV AC quantizer relative to base_q_idx. > + * - __u8 > + - ``reserved[4]`` > + - Applications and drivers must set this to zero. > + > +.. c:type:: v4l2_vp9_loop_filter > + > +This structure contains all loop filter related parameters. See sections > +'7.2.8 Loop filter semantics' of the VP9 specification for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: struct v4l2_vp9_loop_filter > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 1 2 > + > + * - __s8 > + - ``ref_deltas[4]`` > + - Contains the adjustment needed for the filter level based on the chosen > + reference frame. > + * - __s8 > + - ``mode_deltas[2]`` > + - Contains the adjustment needed for the filter level based on the chosen > + mode. > + * - __u8 > + - ``level`` > + - Indicates the loop filter strength. > + * - __u8 > + - ``sharpness`` > + - Indicates the sharpness level. > + * - __u8 > + - ``flags`` > + - Combination of V4L2_VP9_LOOP_FILTER_FLAG_* flags. > + See :c:type:`v4l2_vp9_loop_filter_flags`. > + * - __u8 > + - ``reserved[7]`` > + - Applications and drivers must set this to zero. > + > + > +.. c:type:: v4l2_vp9_loop_filter_flags > + > +Those are the flags that may be passed. See section '7.2.8 Loop filter > +semantics' of the VP9 specification for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: enum v4l2_vp9_loop_filter_flags > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 2 > + > + * - ``V4L2_VP9_LOOP_FILTER_FLAG_DELTA_ENABLED`` > + - When set, the filter level depends on the mode and reference frame used > + to predict a block. > + * - ``V4L2_VP9_LOOP_FILTER_FLAG_DELTA_UPDATE`` > + - When set, the bitstream contains additional syntax elements that > + specify which mode and reference frame deltas are to be updated. > diff --git a/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst b/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst > index 0ede39907ee2..1b20f48a24b9 100644 > --- a/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst > +++ b/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst > @@ -172,6 +172,21 @@ Compressed Formats > - VP9 compressed video frame. The encoder generates one > compressed frame per buffer, and the decoder requires one > compressed frame per buffer. > + * .. _V4L2-PIX-FMT-VP9-FRAME: > + > + - ``V4L2_PIX_FMT_VP9_FRAME`` > + - 'VP9F' > + - VP9 parsed frame, including the frame header, as extracted from the container. > + This format is adapted for stateless video decoders that implement a > + VP9 pipeline with the :ref:`stateless_decoder`. > + Metadata associated with the frame to decode is required to be passed > + through the ``V4L2_CID_STATELESS_VP9_FRAME`` and > + the ``V4L2_CID_STATELESS_VP9_COMPRESSED_HDR_PROBS`` controls. > + See the :ref:`associated Codec Control IDs `. > + Exactly one output and one capture buffer must be provided for use with > + this pixel format. The output buffer must contain the appropriate number > + of macroblocks to decode a full corresponding frame to the matching > + capture buffer. > * .. _V4L2-PIX-FMT-HEVC: > > - ``V4L2_PIX_FMT_HEVC`` > diff --git a/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst b/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst > index 2d6bc8d94380..258895ff0c71 100644 > --- a/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst > +++ b/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst > @@ -233,6 +233,14 @@ still cause this situation. > - ``p_mpeg2_quantisation`` > - A pointer to a struct :c:type:`v4l2_ctrl_mpeg2_quantisation`. Valid if this control is > of type ``V4L2_CTRL_TYPE_MPEG2_QUANTISATION``. > + * - struct :c:type:`v4l2_ctrl_vp9_compressed_hdr_probs` * > + - ``p_vp9_compressed_hdr_probs`` > + - A pointer to a struct :c:type:`v4l2_ctrl_vp9_compressed_hdr_probs`. Valid if this > + control is of type ``V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR_PROBS``. > + * - struct :c:type:`v4l2_ctrl_vp9_frame` * > + - ``p_vp9_frame`` > + - A pointer to a struct :c:type:`v4l2_ctrl_vp9_frame`. Valid if this > + control is of type ``V4L2_CTRL_TYPE_VP9_FRAME``. > * - struct :c:type:`v4l2_ctrl_hdr10_cll_info` * > - ``p_hdr10_cll`` > - A pointer to a struct :c:type:`v4l2_ctrl_hdr10_cll_info`. Valid if this control is > diff --git a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst b/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst > index f9ecf6276129..e0c6a5d9ff6b 100644 > --- a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst > +++ b/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst > @@ -507,6 +507,18 @@ See also the examples in :ref:`control`. > - n/a > - A struct :c:type:`v4l2_ctrl_hevc_decode_params`, containing HEVC > decoding parameters for stateless video decoders. > + * - ``V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR_PROBS`` > + - n/a > + - n/a > + - n/a > + - A struct :c:type:`v4l2_ctrl_vp9_compressed_hdr_probs`, containing VP9 > + probabilities updates for stateless video decoders. > + * - ``V4L2_CTRL_TYPE_VP9_FRAME`` > + - n/a > + - n/a > + - n/a > + - A struct :c:type:`v4l2_ctrl_vp9_frame`, containing VP9 > + frame decode parameters for stateless video decoders. > > .. raw:: latex > > diff --git a/Documentation/userspace-api/media/videodev2.h.rst.exceptions b/Documentation/userspace-api/media/videodev2.h.rst.exceptions > index eb0b1cd37abd..129ef3edfa73 100644 > --- a/Documentation/userspace-api/media/videodev2.h.rst.exceptions > +++ b/Documentation/userspace-api/media/videodev2.h.rst.exceptions > @@ -149,6 +149,8 @@ replace symbol V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS :c:type:`v4l2_ctrl_type` > replace symbol V4L2_CTRL_TYPE_AREA :c:type:`v4l2_ctrl_type` > replace symbol V4L2_CTRL_TYPE_FWHT_PARAMS :c:type:`v4l2_ctrl_type` > replace symbol V4L2_CTRL_TYPE_VP8_FRAME :c:type:`v4l2_ctrl_type` > +replace symbol V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR_PROBS :c:type:`v4l2_ctrl_type` > +replace symbol V4L2_CTRL_TYPE_VP9_FRAME :c:type:`v4l2_ctrl_type` > replace symbol V4L2_CTRL_TYPE_HDR10_CLL_INFO :c:type:`v4l2_ctrl_type` > replace symbol V4L2_CTRL_TYPE_HDR10_MASTERING_DISPLAY :c:type:`v4l2_ctrl_type` > > diff --git a/drivers/media/v4l2-core/v4l2-ctrls-core.c b/drivers/media/v4l2-core/v4l2-ctrls-core.c > index c4b5082849b6..ed9cf298a83a 100644 > --- a/drivers/media/v4l2-core/v4l2-ctrls-core.c > +++ b/drivers/media/v4l2-core/v4l2-ctrls-core.c > @@ -283,6 +283,12 @@ static void std_log(const struct v4l2_ctrl *ctrl) > case V4L2_CTRL_TYPE_MPEG2_PICTURE: > pr_cont("MPEG2_PICTURE"); > break; > + case V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR_PROBS: > + pr_cont("VP9_COMPRESSED_HDR_PROBS"); > + break; > + case V4L2_CTRL_TYPE_VP9_FRAME: > + pr_cont("VP9_FRAME"); > + break; > default: > pr_cont("unknown type %d", ctrl->type); > break; > @@ -317,6 +323,162 @@ static void std_log(const struct v4l2_ctrl *ctrl) > #define zero_reserved(s) \ > memset(&(s).reserved, 0, sizeof((s).reserved)) > > +static int > +validate_vp9_lf_params(struct v4l2_vp9_loop_filter *lf) > +{ > + unsigned int i; > + > + if (lf->flags & ~(V4L2_VP9_LOOP_FILTER_FLAG_DELTA_ENABLED | > + V4L2_VP9_LOOP_FILTER_FLAG_DELTA_UPDATE)) > + return -EINVAL; > + > + /* That all values are in the accepted range. */ > + if (lf->level > GENMASK(5, 0)) > + return -EINVAL; > + > + if (lf->sharpness > GENMASK(2, 0)) > + return -EINVAL; > + > + for (i = 0; i < ARRAY_SIZE(lf->ref_deltas); i++) > + if (lf->ref_deltas[i] < -63 || lf->ref_deltas[i] > 63) > + return -EINVAL; > + > + for (i = 0; i < ARRAY_SIZE(lf->mode_deltas); i++) > + if (lf->mode_deltas[i] < -63 || lf->mode_deltas[i] > 63) > + return -EINVAL; > + > + zero_reserved(*lf); > + return 0; > +} > + > +static int > +validate_vp9_quant_params(struct v4l2_vp9_quantization *quant) > +{ > + if (quant->delta_q_y_dc < -15 || quant->delta_q_y_dc > 15 || > + quant->delta_q_uv_dc < -15 || quant->delta_q_uv_dc > 15 || > + quant->delta_q_uv_ac < -15 || quant->delta_q_uv_ac > 15) > + return -EINVAL; > + > + zero_reserved(*quant); > + return 0; > +} > + > +static int > +validate_vp9_seg_params(struct v4l2_vp9_segmentation *seg) > +{ > + unsigned int i, j; > + > + if (seg->flags & ~(V4L2_VP9_SEGMENTATION_FLAG_ENABLED | > + V4L2_VP9_SEGMENTATION_FLAG_UPDATE_MAP | > + V4L2_VP9_SEGMENTATION_FLAG_TEMPORAL_UPDATE | > + V4L2_VP9_SEGMENTATION_FLAG_UPDATE_DATA | > + V4L2_VP9_SEGMENTATION_FLAG_ABS_OR_DELTA_UPDATE)) > + return -EINVAL; > + > + for (i = 0; i < ARRAY_SIZE(seg->feature_enabled); i++) { > + if (seg->feature_enabled[i] & > + ~V4L2_VP9_SEGMENT_FEATURE_ENABLED_MASK) > + return -EINVAL; > + } > + > + for (i = 0; i < ARRAY_SIZE(seg->feature_data); i++) { > + const int range[] = { 255, 63, 3, 0 }; > + > + for (j = 0; j < ARRAY_SIZE(seg->feature_data[j]); j++) { > + if (seg->feature_data[i][j] < -range[j] || > + seg->feature_data[i][j] > range[j]) > + return -EINVAL; > + } > + } > + > + zero_reserved(*seg); > + return 0; > +} > + > +static int > +validate_vp9_frame(struct v4l2_ctrl_vp9_frame *frame) > +{ > + int ret; > + > + /* Make sure we're not passed invalid flags. */ > + if (frame->flags & ~(V4L2_VP9_FRAME_FLAG_KEY_FRAME | > + V4L2_VP9_FRAME_FLAG_SHOW_FRAME | > + V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT | > + V4L2_VP9_FRAME_FLAG_INTRA_ONLY | > + V4L2_VP9_FRAME_FLAG_ALLOW_HIGH_PREC_MV | > + V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX | > + V4L2_VP9_FRAME_FLAG_PARALLEL_DEC_MODE | > + V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING | > + V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING | > + V4L2_VP9_FRAME_FLAG_COLOR_RANGE_FULL_SWING)) > + return -EINVAL; > + > + if (frame->flags & V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT && > + frame->flags & V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX) > + return -EINVAL; > + > + if (frame->profile > V4L2_VP9_PROFILE_MAX) > + return -EINVAL; > + > + if (frame->reset_frame_context > V4L2_VP9_RESET_FRAME_CTX_ALL) > + return -EINVAL; > + > + if (frame->frame_context_idx >= V4L2_VP9_NUM_FRAME_CTX) > + return -EINVAL; > + > + /* > + * Profiles 0 and 1 only support 8-bit depth, profiles 2 and 3 only 10 > + * and 12 bit depths. > + */ > + if ((frame->profile < 2 && frame->bit_depth != 8) || > + (frame->profile >= 2 && > + (frame->bit_depth != 10 && frame->bit_depth != 12))) > + return -EINVAL; > + > + /* Profile 0 and 2 only accept YUV 4:2:0. */ > + if ((frame->profile == 0 || frame->profile == 2) && > + (!(frame->flags & V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING) || > + !(frame->flags & V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING))) > + return -EINVAL; > + > + /* Profile 1 and 3 only accept YUV 4:2:2, 4:4:0 and 4:4:4. */ > + if ((frame->profile == 1 || frame->profile == 3) && > + ((frame->flags & V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING) && > + (frame->flags & V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING))) > + return -EINVAL; > + > + if (frame->interpolation_filter > V4L2_VP9_INTERP_FILTER_SWITCHABLE) > + return -EINVAL; > + > + /* > + * According to the spec, tile_cols_log2 shall be less than or equal > + * to 6. > + */ > + if (frame->tile_cols_log2 > 6) > + return -EINVAL; > + > + if (frame->tx_mode > V4L2_VP9_TX_MODE_SELECT) > + return -EINVAL; > + > + if (frame->reference_mode > V4L2_VP9_REFERENCE_MODE_SELECT) > + return -EINVAL; > + > + ret = validate_vp9_lf_params(&frame->lf); > + if (ret) > + return ret; > + > + ret = validate_vp9_quant_params(&frame->quant); > + if (ret) > + return ret; > + > + ret = validate_vp9_seg_params(&frame->seg); > + if (ret) > + return ret; > + > + zero_reserved(*frame); > + return 0; > +} > + > /* > * Compound controls validation requires setting unused fields/flags to zero > * in order to properly detect unchanged controls with std_equal's memcmp. > @@ -687,6 +849,12 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx, > > break; > > + case V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR_PROBS: > + break; > + > + case V4L2_CTRL_TYPE_VP9_FRAME: > + return validate_vp9_frame(p); > + > case V4L2_CTRL_TYPE_AREA: > area = p; > if (!area->width || !area->height) > @@ -1249,6 +1417,12 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl, > case V4L2_CTRL_TYPE_HDR10_MASTERING_DISPLAY: > elem_size = sizeof(struct v4l2_ctrl_hdr10_mastering_display); > break; > + case V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR_PROBS: > + elem_size = sizeof(struct v4l2_ctrl_vp9_compressed_hdr_probs); > + break; > + case V4L2_CTRL_TYPE_VP9_FRAME: > + elem_size = sizeof(struct v4l2_ctrl_vp9_frame); > + break; > case V4L2_CTRL_TYPE_AREA: > elem_size = sizeof(struct v4l2_area); > break; > diff --git a/drivers/media/v4l2-core/v4l2-ctrls-defs.c b/drivers/media/v4l2-core/v4l2-ctrls-defs.c > index 421300e13a41..d383c438156f 100644 > --- a/drivers/media/v4l2-core/v4l2-ctrls-defs.c > +++ b/drivers/media/v4l2-core/v4l2-ctrls-defs.c > @@ -1175,6 +1175,8 @@ const char *v4l2_ctrl_get_name(u32 id) > case V4L2_CID_STATELESS_MPEG2_SEQUENCE: return "MPEG-2 Sequence Header"; > case V4L2_CID_STATELESS_MPEG2_PICTURE: return "MPEG-2 Picture Header"; > case V4L2_CID_STATELESS_MPEG2_QUANTISATION: return "MPEG-2 Quantisation Matrices"; > + case V4L2_CID_STATELESS_VP9_COMPRESSED_HDR_PROBS: return "VP9 Probabilities Updates"; > + case V4L2_CID_STATELESS_VP9_FRAME: return "VP9 Frame Decode Parameters"; > > /* Colorimetry controls */ > /* Keep the order of the 'case's the same as in v4l2-controls.h! */ > @@ -1493,6 +1495,12 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type, > case V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS: > *type = V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS; > break; > + case V4L2_CID_STATELESS_VP9_COMPRESSED_HDR_PROBS: > + *type = V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR_PROBS; > + break; > + case V4L2_CID_STATELESS_VP9_FRAME: > + *type = V4L2_CTRL_TYPE_VP9_FRAME; > + break; > case V4L2_CID_UNIT_CELL_SIZE: > *type = V4L2_CTRL_TYPE_AREA; > *flags |= V4L2_CTRL_FLAG_READ_ONLY; > diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c > index ec6fc1ef291e..7a5e8120d733 100644 > --- a/drivers/media/v4l2-core/v4l2-ioctl.c > +++ b/drivers/media/v4l2-core/v4l2-ioctl.c > @@ -1394,6 +1394,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) > case V4L2_PIX_FMT_VP8: descr = "VP8"; break; > case V4L2_PIX_FMT_VP8_FRAME: descr = "VP8 Frame"; break; > case V4L2_PIX_FMT_VP9: descr = "VP9"; break; > + case V4L2_PIX_FMT_VP9_FRAME: descr = "VP9 Frame"; break; > case V4L2_PIX_FMT_HEVC: descr = "HEVC"; break; /* aka H.265 */ > case V4L2_PIX_FMT_HEVC_SLICE: descr = "HEVC Parsed Slice Data"; break; > case V4L2_PIX_FMT_FWHT: descr = "FWHT"; break; /* used in vicodec */ > diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h > index 575b59fbac77..3ea4386ebd91 100644 > --- a/include/media/v4l2-ctrls.h > +++ b/include/media/v4l2-ctrls.h > @@ -50,6 +50,8 @@ struct video_device; > * @p_h264_decode_params: Pointer to a struct v4l2_ctrl_h264_decode_params. > * @p_h264_pred_weights: Pointer to a struct v4l2_ctrl_h264_pred_weights. > * @p_vp8_frame: Pointer to a VP8 frame params structure. > + * @p_vp9_compressed_hdr_probs: Pointer to a VP9 frame compressed header probs structure. > + * @p_vp9_frame: Pointer to a VP9 frame params structure. > * @p_hevc_sps: Pointer to an HEVC sequence parameter set structure. > * @p_hevc_pps: Pointer to an HEVC picture parameter set structure. > * @p_hevc_slice_params: Pointer to an HEVC slice parameters structure. > @@ -80,6 +82,8 @@ union v4l2_ctrl_ptr { > struct v4l2_ctrl_hevc_sps *p_hevc_sps; > struct v4l2_ctrl_hevc_pps *p_hevc_pps; > struct v4l2_ctrl_hevc_slice_params *p_hevc_slice_params; > + struct v4l2_ctrl_vp9_compressed_hdr_probs *p_vp9_compressed_hdr_probs; > + struct v4l2_ctrl_vp9_frame *p_vp9_frame; > struct v4l2_ctrl_hdr10_cll_info *p_hdr10_cll; > struct v4l2_ctrl_hdr10_mastering_display *p_hdr10_mastering; > struct v4l2_area *p_area; > diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h > index 5532b5f68493..8f8c3c1ad885 100644 > --- a/include/uapi/linux/v4l2-controls.h > +++ b/include/uapi/linux/v4l2-controls.h > @@ -2010,6 +2010,439 @@ struct v4l2_ctrl_hdr10_mastering_display { > __u32 min_display_mastering_luminance; > }; > > +/* Stateless VP9 controls */ > + > +/** > + * enum v4l2_vp9_loop_filter_flags - VP9 loop filter flags > + * > + * @V4L2_VP9_LOOP_FILTER_FLAG_DELTA_ENABLED: the filter level depends on > + * the mode and reference frame used to predict a block > + * @V4L2_VP9_LOOP_FILTER_FLAG_DELTA_UPDATE: the bitstream contains additional > + * syntax elements that specify which mode and reference frame deltas are to be updated > + * > + * Those are the flags that may be passed to &v4l2_vp9_loop_filter.flags. See > + * section '7.2.8 Loop filter semantics' of the VP9 specification for more > + * details. > + */ > +enum v4l2_vp9_loop_filter_flags { > + V4L2_VP9_LOOP_FILTER_FLAG_DELTA_ENABLED = 1 << 0, > + V4L2_VP9_LOOP_FILTER_FLAG_DELTA_UPDATE = 1 << 1, > +}; > + > +/** > + * struct v4l2_vp9_loop_filter - VP9 loop filter parameters > + * > + * @ref_deltas: contains the adjustment needed for the filter level based on the chosen > + * reference frame. If this syntax element is not present in the bitstream, users > + * should pass its last value. > + * @mode_deltas: contains the adjustment needed for the filter level based on the chosen mode. > + * If this syntax element is not present in the bitstream, users > + * should pass its last value. > + * @level: indicates the loop filter strength > + * @sharpness: indicates the sharpness level > + * @flags: combination of V4L2_VP9_LOOP_FILTER_FLAG_* flags > + * @reserved: padding field. Should be zeroed by applications. > + * > + * This structure contains all loop filter related parameters. See sections > + * '7.2.8 Loop filter semantics' of the VP9 specification for more details. > + */ > +struct v4l2_vp9_loop_filter { > + __s8 ref_deltas[4]; > + __s8 mode_deltas[2]; > + __u8 level; > + __u8 sharpness; > + __u8 flags; > + __u8 reserved[7]; > +}; > + > +/** > + * struct v4l2_vp9_quantization - VP9 quantization parameters > + * > + * @base_q_idx: indicates the base frame qindex > + * @delta_q_y_dc: indicates the Y DC quantizer relative to base_q_idx > + * @delta_q_uv_dc: indicates the UV DC quantizer relative to base_q_idx > + * @delta_q_uv_ac: indicates the UV AC quantizer relative to base_q_idx > + * @reserved: padding field. Should be zeroed by applications. > + * > + * Encodes the quantization parameters. See section '7.2.9 Quantization params > + * syntax' of the VP9 specification for more details. > + */ > +struct v4l2_vp9_quantization { > + __u8 base_q_idx; > + __s8 delta_q_y_dc; > + __s8 delta_q_uv_dc; > + __s8 delta_q_uv_ac; > + __u8 reserved[4]; > +}; > + > +/** > + * enum v4l2_vp9_segmentation_flags - VP9 segmentation flags > + * > + * @V4L2_VP9_SEGMENTATION_FLAG_ENABLED: indicates that this frame makes use of > + * the segmentation tool > + * @V4L2_VP9_SEGMENTATION_FLAG_UPDATE_MAP: indicates that the segmentation map > + * should be updated during the decoding of this frame > + * @V4L2_VP9_SEGMENTATION_FLAG_TEMPORAL_UPDATE: indicates that the updates to > + * the segmentation map are coded relative to the existing segmentation map > + * @V4L2_VP9_SEGMENTATION_FLAG_UPDATE_DATA: indicates that new parameters are > + * about to be specified for each segment > + * @V4L2_VP9_SEGMENTATION_FLAG_ABS_OR_DELTA_UPDATE: indicates that the > + * segmentation parameters represent the actual values to be used > + * > + * Those are the flags that may be passed to &v4l2_vp9_segmentation.flags. See > + * section '7.2.10 Segmentation params syntax' of the VP9 specification for > + * more details. > + */ > +enum v4l2_vp9_segmentation_flags { > + V4L2_VP9_SEGMENTATION_FLAG_ENABLED = 1 << 0, > + V4L2_VP9_SEGMENTATION_FLAG_UPDATE_MAP = 1 << 1, > + V4L2_VP9_SEGMENTATION_FLAG_TEMPORAL_UPDATE = 1 << 2, > + V4L2_VP9_SEGMENTATION_FLAG_UPDATE_DATA = 1 << 3, > + V4L2_VP9_SEGMENTATION_FLAG_ABS_OR_DELTA_UPDATE = 1 << 4, > +}; > + > +#define V4L2_VP9_SEGMENT_FEATURE_ENABLED(id) (1 << (id)) > +#define V4L2_VP9_SEGMENT_FEATURE_ENABLED_MASK 0xf > + > +/** > + * enum v4l2_vp9_segment_feature - VP9 segment feature IDs > + * > + * @V4L2_VP9_SEG_LVL_ALT_Q: quantizer segment feature > + * @V4L2_VP9_SEG_LVL_ALT_L: loop filter segment feature > + * @V4L2_VP9_SEG_LVL_REF_FRAME reference frame segment feature > + * @V4L2_VP9_SEG_LVL_SKIP: skip segment feature > + * @V4L2_VP9_SEG_LVV_MAX: number of segment features > + * > + * Segment feature IDs. See section '7.2.10 Segmentation params syntax' of the > + * VP9 specification for more details. > + */ > +enum v4l2_vp9_segment_feature { > + V4L2_VP9_SEG_LVL_ALT_Q, > + V4L2_VP9_SEG_LVL_ALT_L, > + V4L2_VP9_SEG_LVL_REF_FRAME, > + V4L2_VP9_SEG_LVL_SKIP, > + V4L2_VP9_SEG_LVL_MAX, > +}; > + > +/** > + * struct v4l2_vp9_segmentation - VP9 segmentation parameters > + * > + * @feature_data: data attached to each feature. Data entry is only valid if the feature is enabled > + * @feature_enabled: bitmask defining which features are enabled in each segment > + * @tree_probs: specifies the probability values to be used when > + * decoding a Segment-ID. See '5.15. Segmentation map' section of the VP9 specification > + * for more details. > + * @pred_probs: specifies the probability values to be used when decoding a > + * Predicted-Segment-ID. See '6.4.14. Get segment id syntax' section of :ref:`vp9` > + * for more details. > + * @flags: combination of V4L2_VP9_SEGMENTATION_FLAG_* flags > + * @reserved: padding field. Should be zeroed by applications. > + * > + * Encodes the quantization parameters. See section '7.2.10 Segmentation params syntax' of > + * the VP9 specification for more details. > + */ > +struct v4l2_vp9_segmentation { > + __s16 feature_data[8][4]; > + __u8 feature_enabled[8]; > + __u8 tree_probs[7]; > + __u8 pred_probs[3]; > + __u8 flags; > + __u8 reserved[5]; > +}; > + > +/** > + * enum v4l2_vp9_intra_prediction_mode - VP9 Intra prediction modes > + * > + * @V4L2_VP9_INTRA_PRED_MODE_DC_PRED: DC intra prediction > + * @V4L2_VP9_INTRA_PRED_MODE_V_PRED: vertical intra prediction > + * @V4L2_VP9_INTRA_PRED_MODE_H_PRED: horizontal intra prediction > + * @V4L2_VP9_INTRA_PRED_MODE_D45_PRED: D45 intra prediction > + * @V4L2_VP9_INTRA_PRED_MODE_D135_PRED: D135 intra prediction > + * @V4L2_VP9_INTRA_PRED_MODE_D117_PRED: D117 intra prediction > + * @V4L2_VP9_INTRA_PRED_MODE_D153_PRED: D153 intra prediction > + * @V4L2_VP9_INTRA_PRED_MODE_D207_PRED: D207 intra prediction > + * @V4L2_VP9_INTRA_PRED_MODE_D63_PRED: D63 intra prediction > + * @V4L2_VP9_INTRA_PRED_MODE_TM_PRED: True Motion intra prediction > + * > + * See section '7.4.5 Intra frame mode info semantics' for more details. > + */ > +enum v4l2_vp9_intra_prediction_mode { > + V4L2_VP9_INTRA_PRED_MODE_DC_PRED, > + V4L2_VP9_INTRA_PRED_MODE_V_PRED, > + V4L2_VP9_INTRA_PRED_MODE_H_PRED, > + V4L2_VP9_INTRA_PRED_MODE_D45_PRED, > + V4L2_VP9_INTRA_PRED_MODE_D135_PRED, > + V4L2_VP9_INTRA_PRED_MODE_D117_PRED, > + V4L2_VP9_INTRA_PRED_MODE_D153_PRED, > + V4L2_VP9_INTRA_PRED_MODE_D207_PRED, > + V4L2_VP9_INTRA_PRED_MODE_D63_PRED, > + V4L2_VP9_INTRA_PRED_MODE_TM_PRED, > +}; > + > +/** > + * enum v4l2_vp9_reset_frame_context - Valid values for > + * &v4l2_ctrl_vp9_frame->reset_frame_context > + * > + * @V4L2_VP9_RESET_FRAME_CTX_NONE: don't reset any frame context > + * @V4L2_VP9_RESET_FRAME_CTX_SPEC: reset the frame context pointed by > + * &v4l2_ctrl_vp9_frame.frame_context_idx > + * @V4L2_VP9_RESET_FRAME_CTX_ALL: reset all frame contexts > + * > + * See section '7.2 Uncompressed header semantics' of the VP9 specification for more details. > + */ > +enum v4l2_vp9_reset_frame_context { > + V4L2_VP9_RESET_FRAME_CTX_NONE, > + V4L2_VP9_RESET_FRAME_CTX_SPEC, > + V4L2_VP9_RESET_FRAME_CTX_ALL, > +}; > + > +/** > + * enum v4l2_vp9_interpolation_filter - VP9 interpolation filter types > + * > + * @V4L2_VP9_INTERP_FILTER_EIGHTTAP: eight tap filter > + * @V4L2_VP9_INTERP_FILTER_EIGHTTAP_SMOOTH: eight tap smooth filter > + * @V4L2_VP9_INTERP_FILTER_EIGHTTAP_SHARP: eight tap sharp filter > + * @V4L2_VP9_INTERP_FILTER_BILINEAR: bilinear filter > + * @V4L2_VP9_INTERP_FILTER_SWITCHABLE: filter selection is signaled at the block level > + * > + * See section '7.2.7 Interpolation filter semantics' of the VP9 specification > + * for more details. > + */ > +enum v4l2_vp9_interpolation_filter { > + V4L2_VP9_INTERP_FILTER_EIGHTTAP, > + V4L2_VP9_INTERP_FILTER_EIGHTTAP_SMOOTH, > + V4L2_VP9_INTERP_FILTER_EIGHTTAP_SHARP, > + V4L2_VP9_INTERP_FILTER_BILINEAR, > + V4L2_VP9_INTERP_FILTER_SWITCHABLE, > +}; > + > +/** > + * enum v4l2_vp9_reference_mode - VP9 reference modes > + * > + * @V4L2_VP9_REFERENCE_MODE_SINGLE_REFERENCE: indicates that all the inter blocks use only a > + * single reference frame to generate motion compensated prediction > + * @V4L2_VP9_REFERENCE_MODE_COMPOUND_REFERENCE: requires all the inter blocks to use compound mode. > + * Single reference frame prediction is not allowed > + * @V4L2_VP9_REFERENCE_MODE_SELECT: allows each individual inter block to select between single > + * and compound prediction modes > + * > + * See section '7.3.6 Frame reference mode semantics' of the VP9 specification > + * for more details. > + */ > +enum v4l2_vp9_reference_mode { > + V4L2_VP9_REFERENCE_MODE_SINGLE_REFERENCE, > + V4L2_VP9_REFERENCE_MODE_COMPOUND_REFERENCE, > + V4L2_VP9_REFERENCE_MODE_SELECT, > +}; > + > +/** > + * enum v4l2_vp9_tx_mode - VP9 TX modes > + * > + * @V4L2_VP9_TX_MODE_ONLY_4X4: transform size is 4x4 > + * @V4L2_VP9_TX_MODE_ALLOW_8X8: transform size can be up to 8x8 > + * @V4L2_VP9_TX_MODE_ALLOW_16X16: transform size can be up to 16x16 > + * @V4L2_VP9_TX_MODE_ALLOW_32X32: transform size can be up to 32x32 > + * @V4L2_VP9_TX_MODE_SELECT: bitstream contains the transform size for each block > + * > + * See section '7.3.1 Tx mode semantics' of the VP9 specification for more details. > + */ > +enum v4l2_vp9_tx_mode { > + V4L2_VP9_TX_MODE_ONLY_4X4, > + V4L2_VP9_TX_MODE_ALLOW_8X8, > + V4L2_VP9_TX_MODE_ALLOW_16X16, > + V4L2_VP9_TX_MODE_ALLOW_32X32, > + V4L2_VP9_TX_MODE_SELECT, > +}; > + > +/** > + * enum v4l2_vp9_frame_flags - VP9 frame flags > + * @V4L2_VP9_FRAME_FLAG_KEY_FRAME: the frame is a key frame > + * @V4L2_VP9_FRAME_FLAG_SHOW_FRAME: the frame should be displayed > + * @V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT: the decoding should be error resilient > + * @V4L2_VP9_FRAME_FLAG_INTRA_ONLY: the frame does not reference other frames > + * @V4L2_VP9_FRAME_FLAG_ALLOW_HIGH_PREC_MV: the frame can use high precision motion vectors > + * @V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX: frame context should be updated after decoding > + * @V4L2_VP9_FRAME_FLAG_PARALLEL_DEC_MODE: parallel decoding is used > + * @V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING: vertical subsampling is enabled > + * @V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING: horizontal subsampling is enabled > + * @V4L2_VP9_FRAME_FLAG_COLOR_RANGE_FULL_SWING: full UV range is used > + * > + * Check the VP9 specification for more details. > + */ > +enum v4l2_vp9_frame_flags { > + V4L2_VP9_FRAME_FLAG_KEY_FRAME = 1 << 0, > + V4L2_VP9_FRAME_FLAG_SHOW_FRAME = 1 << 1, > + V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT = 1 << 2, > + V4L2_VP9_FRAME_FLAG_INTRA_ONLY = 1 << 3, > + V4L2_VP9_FRAME_FLAG_ALLOW_HIGH_PREC_MV = 1 << 4, > + V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX = 1 << 5, > + V4L2_VP9_FRAME_FLAG_PARALLEL_DEC_MODE = 1 << 6, > + V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING = 1 << 7, > + V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING = 1 << 8, > + V4L2_VP9_FRAME_FLAG_COLOR_RANGE_FULL_SWING = 1 << 9, > +}; > + > +/** > + * enum v4l2_vp9_ref_frame_sign_bias - Whether ref_frame_sign_bias is 1 for a given reference frame > + * @V4L2_VP9_SIGN_BIAS_LAST: ref_frame_sign_bias is 1 for the "last" reference frame > + * @V4L2_VP9_SIGN_BIAS_GOLDEN: ref_frame_sign_bias is 1 for the "golden" reference frame > + * @V4L2_VP9_SIGN_BIAS_ALT: ref_frame_sign_bias is 1 for the "alt" reference frame > + */ > + > +enum v4l2_vp9_ref_frame_sign_bias { > + V4L2_VP9_SIGN_BIAS_LAST, > + V4L2_VP9_SIGN_BIAS_GOLDEN, > + V4L2_VP9_SIGN_BIAS_ALT, > +}; > + > +#define V4L2_VP9_PROFILE_MAX 3 > + > +#define V4L2_CID_STATELESS_VP9_FRAME (V4L2_CID_CODEC_STATELESS_BASE + 300) > +/** > + * struct v4l2_ctrl_vp9_frame - VP9 frame decoding control > + * > + * @lf: loop filter parameters. See &v4l2_vp9_loop_filter for more details > + * @quant: quantization parameters. See &v4l2_vp9_quantization for more details > + * @seg: segmentation parameters. See &v4l2_vp9_segmentation for more details > + * @flags: combination of V4L2_VP9_FRAME_FLAG_* flags > + * @compressed_header_size: compressed header size in bytes > + * @uncompressed_header_size: uncompressed header size in bytes > + * @frame_width_minus_1: add 1 to it and you'll get the frame width expressed in pixels > + * @frame_height_minus_1: add 1 to it and you'll get the frame height expressed in pixels > + * @render_width_minus_1: add 1 to it and you'll get the expected render width expressed in > + * pixels. This is not used during the decoding process but might be used by HW scalers > + * to prepare a frame that's ready for scanout > + * @render_height_minus_1: add 1 to it and you'll get the expected render height expressed in > + * pixels. This is not used during the decoding process but might be used by HW scalers > + * to prepare a frame that's ready for scanout > + * @last_frame_ts: "last" reference buffer timestamp. > + * The timestamp refers to the timestamp field in struct v4l2_buffer. > + * Use v4l2_timeval_to_ns() to convert the struct timeval to a __u64. > + * @golden_frame_ts: "golden" reference buffer timestamp. > + * The timestamp refers to the timestamp field in struct v4l2_buffer. > + * Use v4l2_timeval_to_ns() to convert the struct timeval to a __u64. > + * @alt_frame_ts: "alt" reference buffer timestamp. > + * The timestamp refers to the timestamp field in struct v4l2_buffer. > + * Use v4l2_timeval_to_ns() to convert the struct timeval to a __u64. > + * @ref_frame_sign_bias: a bitfield specifying whether the sign bias is set for a given > + * reference frame. See &v4l2_vp9_ref_frame_sign_bias for more details. > + * @reset_frame_context: specifies whether the frame context should be reset to default values. > + * See &v4l2_vp9_reset_frame_context for more details > + * @frame_context_idx: frame context that should be used/updated > + * @profile: VP9 profile. Can be 0, 1, 2 or 3 > + * @bit_depth: bits per components. Can be 8, 10 or 12. Note that not all profiles support > + * 10 and/or 12 bits depths > + * @interpolation_filter: specifies the filter selection used for performing inter prediction. > + * See &v4l2_vp9_interpolation_filter for more details > + * @tile_cols_log2: specifies the base 2 logarithm of the width of each tile (where the width > + * is measured in units of 8x8 blocks). Shall be less than or equal to 6 > + * @tile_rows_log2: specifies the base 2 logarithm of the height of each tile (where the height > + * is measured in units of 8x8 blocks) > + * @tx_mode: specifies the TX mode. See &v4l2_vp9_tx_mode for more details > + * @reference_mode: specifies the type of inter prediction to be used. See > + * &v4l2_vp9_reference_mode for more details > + * @reserved: padding field. Should be zeroed by applications. > + */ > +struct v4l2_ctrl_vp9_frame { > + struct v4l2_vp9_loop_filter lf; > + struct v4l2_vp9_quantization quant; > + struct v4l2_vp9_segmentation seg; > + __u32 flags; > + __u16 compressed_header_size; > + __u16 uncompressed_header_size; > + __u16 frame_width_minus_1; > + __u16 frame_height_minus_1; > + __u16 render_width_minus_1; > + __u16 render_height_minus_1; > + __u64 last_frame_ts; > + __u64 golden_frame_ts; > + __u64 alt_frame_ts; > + __u8 ref_frame_sign_bias; > + __u8 reset_frame_context; > + __u8 frame_context_idx; > + __u8 profile; > + __u8 bit_depth; > + __u8 interpolation_filter; > + __u8 tile_cols_log2; > + __u8 tile_rows_log2; > + __u8 tx_mode; > + __u8 reference_mode; > + __u8 reserved[6]; > +}; > + > +#define V4L2_VP9_NUM_FRAME_CTX 4 > + > +/** > + * struct v4l2_vp9_mv_compressed_hdr_probs - VP9 Motion vector probability updates > + * @joint: motion vector joint probability updates > + * @sign: motion vector sign probability updates > + * @classes: motion vector class probability updates > + * @class0_bit: motion vector class0 bit probability updates > + * @bits: motion vector bits probability updates > + * @class0_fr: motion vector class0 fractional bit probability updates > + * @fr: motion vector fractional bit probability updates > + * @class0_hp: motion vector class0 high precision fractional bit probability updates > + * @hp: motion vector high precision fractional bit probability updates > + * > + * This structure contains new values of motion vector probabilities. > + * A value of zero in an array element means there is no update of the relevant probability. > + * See `struct v4l2_vp9_prob_updates` for details. > + */ > +struct v4l2_vp9_mv_compressed_hdr_probs { > + __u8 joint[3]; > + __u8 sign[2]; > + __u8 classes[2][10]; > + __u8 class0_bit[2]; > + __u8 bits[2][10]; > + __u8 class0_fr[2][2][3]; > + __u8 fr[2][3]; > + __u8 class0_hp[2]; > + __u8 hp[2]; > +}; > + > +#define V4L2_CID_STATELESS_VP9_COMPRESSED_HDR_PROBS (V4L2_CID_CODEC_STATELESS_BASE + 301) > +/** > + * struct v4l2_ctrl_vp9_compressed_hdr_probs - VP9 probability updates control > + * @tx8: TX 8x8 probability updates > + * @tx16: TX 16x16 probability updates > + * @tx32: TX 32x32 probability updates > + * @coef: coefficient probability updates > + * @skip: skip probability updates > + * @inter_mode: inter mode probability updates > + * @interp_filter: interpolation filter probability updates > + * @is_inter: is inter-block probability updates > + * @comp_mode: compound prediction mode probability updates > + * @single_ref: single ref probability updates > + * @comp_ref: compound ref probability updates > + * @y_mode: Y prediction mode probability updates > + * @uv_mode: UV prediction mode probability updates > + * @partition: partition probability updates > + * @mv: motion vector probability updates > + * > + * This structure holds the probabilities update as parsed in the compressed > + * header (Spec 6.3). These values represent the value of probability update after > + * being translated with inv_map_table[] (see 6.3.5). A value of zero in an array element > + * means that there is no update of the relevant probability. > + */ > +struct v4l2_ctrl_vp9_compressed_hdr_probs { > + __u8 tx8[2][1]; > + __u8 tx16[2][2]; > + __u8 tx32[2][3]; > + __u8 coef[4][2][2][6][6][3]; > + __u8 skip[3]; > + __u8 inter_mode[7][3]; > + __u8 interp_filter[4][2]; > + __u8 is_inter[4]; > + __u8 comp_mode[5]; > + __u8 single_ref[5][2]; > + __u8 comp_ref[5]; > + __u8 y_mode[4][9]; > + __u8 uv_mode[10][9]; > + __u8 partition[16][3]; > + > + struct v4l2_vp9_mv_compressed_hdr_probs mv; > +}; > + > /* MPEG-compression definitions kept for backwards compatibility */ > #ifndef __KERNEL__ > #define V4L2_CTRL_CLASS_MPEG V4L2_CTRL_CLASS_CODEC > diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h > index 58392dcd3bf5..4abe4362519e 100644 > --- a/include/uapi/linux/videodev2.h > +++ b/include/uapi/linux/videodev2.h > @@ -703,6 +703,7 @@ struct v4l2_pix_format { > #define V4L2_PIX_FMT_VP8 v4l2_fourcc('V', 'P', '8', '0') /* VP8 */ > #define V4L2_PIX_FMT_VP8_FRAME v4l2_fourcc('V', 'P', '8', 'F') /* VP8 parsed frame */ > #define V4L2_PIX_FMT_VP9 v4l2_fourcc('V', 'P', '9', '0') /* VP9 */ > +#define V4L2_PIX_FMT_VP9_FRAME v4l2_fourcc('V', 'P', '9', 'F') /* VP9 parsed frame */ > #define V4L2_PIX_FMT_HEVC v4l2_fourcc('H', 'E', 'V', 'C') /* HEVC aka H.265 */ > #define V4L2_PIX_FMT_FWHT v4l2_fourcc('F', 'W', 'H', 'T') /* Fast Walsh Hadamard Transform (vicodec) */ > #define V4L2_PIX_FMT_FWHT_STATELESS v4l2_fourcc('S', 'F', 'W', 'H') /* Stateless FWHT (vicodec) */ > @@ -1755,6 +1756,8 @@ struct v4l2_ext_control { > struct v4l2_ctrl_mpeg2_sequence __user *p_mpeg2_sequence; > struct v4l2_ctrl_mpeg2_picture __user *p_mpeg2_picture; > struct v4l2_ctrl_mpeg2_quantisation __user *p_mpeg2_quantisation; > + struct v4l2_ctrl_vp9_compressed_hdr_probs __user *p_vp9_compressed_hdr_probs; > + struct v4l2_ctrl_vp9_frame __user *p_vp9_frame; > void __user *ptr; > }; > } __attribute__ ((packed)); > @@ -1819,6 +1822,9 @@ enum v4l2_ctrl_type { > V4L2_CTRL_TYPE_MPEG2_QUANTISATION = 0x0250, > V4L2_CTRL_TYPE_MPEG2_SEQUENCE = 0x0251, > V4L2_CTRL_TYPE_MPEG2_PICTURE = 0x0252, > + > + V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR_PROBS = 0x0260, > + V4L2_CTRL_TYPE_VP9_FRAME = 0x0261, > }; > > /* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */ From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-14.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BDDCAC4338F for ; Tue, 17 Aug 2021 17:50:26 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 72BBD60FE6 for ; Tue, 17 Aug 2021 17:50:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 72BBD60FE6 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:Cc:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=Z5jFm0n1fFaq1rio7wj8Lw4G0EBBNLQnjAE9MdGeepk=; b=AWY8amL5LAOwu9 L0ECtjQZ9rNaZPk9WBwC+r1L7d3JyWcp9ru3ft5jk0DtxNblSBG8/E/lqSR/ckYTxpiLOgtZfRgk7 RWYsCBlW6TlA78c+nlXybEfTMbS9YLhXcIXMc6N/263Nwe9sX0k0BE+k9SdYk/+uAlyoGteAH6ptZ 6s37q+XGKOJh90CHufAR/x6zt/zbEA92xxvcBnS9mwgbEdvgxdDhM00LjD4PNKqXHgXmey1WEE08K hfDIYkjaTbiCrQOtmbwStE+4M7OldO2ZSFs2/xNdrkdupknS/Ptqq1INwOdKKm2iQTm0njjWw8jQD apQjrrQtaDoYlG+ur7Rg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mG3EC-003Ad5-29; Tue, 17 Aug 2021 17:50:20 +0000 Received: from bhuna.collabora.co.uk ([46.235.227.227]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mG3Du-003AZg-Db; Tue, 17 Aug 2021 17:50:08 +0000 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: nicolas) with ESMTPSA id AFD541F42897 Message-ID: <0fd8f0cfd231be2e11da218b0401e1b0e0a15cca.camel@collabora.com> Subject: Re: [PATCH v3 05/10] media: uapi: Add VP9 stateless decoder controls From: Nicolas Dufresne To: Andrzej Pietrasiewicz , linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-staging@lists.linux.dev Cc: Benjamin Gaignard , Boris Brezillon , Ezequiel Garcia , Fabio Estevam , Greg Kroah-Hartman , Hans Verkuil , Heiko Stuebner , Jernej Skrabec , Mauro Carvalho Chehab , NXP Linux Team , Pengutronix Kernel Team , Philipp Zabel , Sascha Hauer , Shawn Guo , kernel@collabora.com, Ezequiel Garcia , Adrian Ratiu , Daniel Almeida Date: Tue, 17 Aug 2021 13:49:48 -0400 In-Reply-To: <20210805144246.11998-6-andrzej.p@collabora.com> References: <20210805144246.11998-1-andrzej.p@collabora.com> <20210805144246.11998-6-andrzej.p@collabora.com> User-Agent: Evolution 3.40.3 (3.40.3-1.fc34) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210817_105002_905934_9AB0BBAF X-CRM114-Status: GOOD ( 34.49 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org TGUgamV1ZGkgMDUgYW/Du3QgMjAyMSDDoCAxNjo0MiArMDIwMCwgQW5kcnplaiBQaWV0cmFzaWV3 aWN6IGEgw6ljcml0wqA6Cj4gQWRkIHRoZSBWUDkgc3RhdGVsZXNzIGRlY29kZXIgY29udHJvbHMg cGx1cyB0aGUgZG9jdW1lbnRhdGlvbiB0aGF0IGdvZXMKPiB3aXRoIGl0Lgo+IAo+IFNpZ25lZC1v ZmYtYnk6IEJvcmlzIEJyZXppbGxvbiA8Ym9yaXMuYnJlemlsbG9uQGNvbGxhYm9yYS5jb20+Cj4g Q28tZGV2ZWxvcGVkLWJ5OiBFemVxdWllbCBHYXJjaWEgPGV6ZXF1aWVsQGNvbGxhYm9yYS5jb20+ Cj4gU2lnbmVkLW9mZi1ieTogRXplcXVpZWwgR2FyY2lhIDxlemVxdWllbEBjb2xsYWJvcmEuY29t Pgo+IFNpZ25lZC1vZmYtYnk6IEFkcmlhbiBSYXRpdSA8YWRyaWFuLnJhdGl1QGNvbGxhYm9yYS5j b20+Cj4gU2lnbmVkLW9mZi1ieTogQW5kcnplaiBQaWV0cmFzaWV3aWN6IDxhbmRyemVqLnBAY29s bGFib3JhLmNvbT4KPiBDby1kZXZlbG9wZWQtYnk6IERhbmllbCBBbG1laWRhIDxkYW5pZWwuYWxt ZWlkYUBjb2xsYWJvcmEuY29tPgo+IFNpZ25lZC1vZmYtYnk6IERhbmllbCBBbG1laWRhIDxkYW5p ZWwuYWxtZWlkYUBjb2xsYWJvcmEuY29tPgo+IC0tLQo+ICAuLi4vdXNlcnNwYWNlLWFwaS9tZWRp YS92NGwvYmlibGlvLnJzdCAgICAgICAgfCAgMTAgKwo+ICAuLi4vbWVkaWEvdjRsL2V4dC1jdHJs cy1jb2RlYy1zdGF0ZWxlc3MucnN0ICAgfCA1NDUgKysrKysrKysrKysrKysrKysrCj4gIC4uLi9t ZWRpYS92NGwvcGl4Zm10LWNvbXByZXNzZWQucnN0ICAgICAgICAgICB8ICAxNSArCj4gIC4uLi9t ZWRpYS92NGwvdmlkaW9jLWctZXh0LWN0cmxzLnJzdCAgICAgICAgICB8ICAgOCArCj4gIC4uLi9t ZWRpYS92NGwvdmlkaW9jLXF1ZXJ5Y3RybC5yc3QgICAgICAgICAgICB8ICAxMiArCj4gIC4uLi9t ZWRpYS92aWRlb2RldjIuaC5yc3QuZXhjZXB0aW9ucyAgICAgICAgICB8ICAgMiArCj4gIGRyaXZl cnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItY3RybHMtY29yZS5jICAgICB8IDE3NCArKysrKysKPiAg ZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1jdHJscy1kZWZzLmMgICAgIHwgICA4ICsKPiAg ZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1pb2N0bC5jICAgICAgICAgIHwgICAxICsKPiAg aW5jbHVkZS9tZWRpYS92NGwyLWN0cmxzLmggICAgICAgICAgICAgICAgICAgIHwgICA0ICsKPiAg aW5jbHVkZS91YXBpL2xpbnV4L3Y0bDItY29udHJvbHMuaCAgICAgICAgICAgIHwgNDMzICsrKysr KysrKysrKysrCj4gIGluY2x1ZGUvdWFwaS9saW51eC92aWRlb2RldjIuaCAgICAgICAgICAgICAg ICB8ICAgNiArCj4gIDEyIGZpbGVzIGNoYW5nZWQsIDEyMTggaW5zZXJ0aW9ucygrKQo+IAo+IGRp ZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvbWVkaWEvdjRsL2JpYmxpby5y c3QgYi9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvbWVkaWEvdjRsL2JpYmxpby5yc3QKPiBp bmRleCA3YjhlNjczOGZmOWUuLjljZDE4YzE1M2QxOSAxMDA2NDQKPiAtLS0gYS9Eb2N1bWVudGF0 aW9uL3VzZXJzcGFjZS1hcGkvbWVkaWEvdjRsL2JpYmxpby5yc3QKPiArKysgYi9Eb2N1bWVudGF0 aW9uL3VzZXJzcGFjZS1hcGkvbWVkaWEvdjRsL2JpYmxpby5yc3QKPiBAQCAtNDE3LDMgKzQxNywx MyBAQCBWUDgKPiAgOnRpdGxlOiAgICAgUkZDIDYzODY6ICJWUDggRGF0YSBGb3JtYXQgYW5kIERl Y29kaW5nIEd1aWRlIgo+ICAKPiAgOmF1dGhvcjogICAgSi4gQmFua29za2kgZXQgYWwuCj4gKwo+ ICsuLiBfdnA5Ogo+ICsKPiArVlA5Cj4gKz09PQo+ICsKPiArCj4gKzp0aXRsZTogICAgIFZQOSBC aXRzdHJlYW0gJiBEZWNvZGluZyBQcm9jZXNzIFNwZWNpZmljYXRpb24KPiArCj4gKzphdXRob3I6 ICAgIEFkcmlhbiBHcmFuZ2UgKEdvb2dsZSksIFBldGVyIGRlIFJpdmF6IChBcmdvbiBEZXNpZ24p LCBKb25hdGhhbiBIdW50IChBcmdvbiBEZXNpZ24pCj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRp b24vdXNlcnNwYWNlLWFwaS9tZWRpYS92NGwvZXh0LWN0cmxzLWNvZGVjLXN0YXRlbGVzcy5yc3Qg Yi9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvbWVkaWEvdjRsL2V4dC1jdHJscy1jb2RlYy1z dGF0ZWxlc3MucnN0Cj4gaW5kZXggNzJmNWU4NWI0ZjM0Li5hZjA2ZDQ2ZTU5OTMgMTAwNjQ0Cj4g LS0tIGEvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL21lZGlhL3Y0bC9leHQtY3RybHMtY29k ZWMtc3RhdGVsZXNzLnJzdAo+ICsrKyBiL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRp YS92NGwvZXh0LWN0cmxzLWNvZGVjLXN0YXRlbGVzcy5yc3QKPiBAQCAtMTQ1OCwzICsxNDU4LDU0 OCBAQCBGV0hUIEZsYWdzCj4gIC4uIHJhdzo6IGxhdGV4Cj4gIAo+ICAgICAgXG5vcm1hbHNpemUK PiArCj4gKy4uIF92NGwyLWNvZGVjLXN0YXRlbGVzcy12cDk6Cj4gKwo+ICtgYFY0TDJfQ0lEX1NU QVRFTEVTU19WUDlfQ09NUFJFU1NFRF9IRFJfUFJPQlMgKHN0cnVjdClgYAo+ICsgICAgU3RvcmVz IFZQOSBwcm9iYWJpbGl0aWVzIHVwZGF0ZXMgYXMgcGFyc2VkIGZyb20gdGhlIGN1cnJlbnQgY29t cHJlc3NlZCBmcmFtZQo+ICsgICAgaGVhZGVyLiBBIHZhbHVlIG9mIHplcm8gaW4gYW4gYXJyYXkg ZWxlbWVudCBtZWFucyBubyB1cGRhdGUgb2YgdGhlIHJlbGV2YW50Cj4gKyAgICBwcm9iYWJpbGl0 eS4gTW90aW9uIHZlY3Rvci1yZWxhdGVkIHVwZGF0ZXMgY29udGFpbiBhIG5ldyB2YWx1ZSBvciB6 ZXJvLiBBbGwKPiArICAgIG90aGVyIHVwZGF0ZXMgY29udGFpbiB2YWx1ZXMgdHJhbnNsYXRlZCB3 aXRoIGludl9tYXBfdGFibGVbXSAoc2VlIDYuMy41IGluCj4gKyAgICA6cmVmOmB2cDlgKS4KCkFz IHdlIGRpc2N1c3MsIHdpZGV3aW5lIGFuZCBvdGhlciBjcnlwdG8gbWF5IGVuY3J5cHQgdGhlIGNv bXByZXNzZWQgaGVhZGVycywgc28KcGFzc2luZyB0aGlzIGluZm9ybWF0aW9uIGlzIG5vdCBhbHdh eXMgcG9zc2libGUgZnJvbSB1c2Vyc3BhY2UuIE5ld2VyIFZQOQpkZWNvZGVycyAobm90YWJseSBu ZXdlciBSb2NrY2hpcCBkZWNvZGVyKSBhcmUgYmVpbmcgYmVpbmcgZXh0ZW5kZWQgd2l0aCBmdWxs IEhXCnN1cHBvcnQgZm9yIGNvbXByZXNzZWQgaGVhZGVyIGhhbmRsaW5nIGluY2x1ZGluZyBwcm9i YWJpbGl0eSB1cGRhdGVzLiBSZWdhcmRsZXNzCmlmIHdlIGxpa2UgZHJtIG9yIG5vdCwgd2Ugc2hv dWxkIGF0IGxlYXN0IG1ha2Ugc3VyZSB0aGUgc3BlYyBhbGxvdyB0byBvcHRpbWl6ZQphbmQgc2tp cCB0aGlzIGNvbnRyb2wuCgpEb2N1bWVudGluZyB0aGlzIHdpbGwgcmVhc3N1cmUgZHJpdmVyIHdy aXRlcnMgdGhhdCBkb24ndCBuZWVkIGl0IGFuZCB3aWxsIGxldAp1c2Vyc3BhY2UgZGV2cyBrbm93 IHRoYXQgdGhleSBzaG91bGQgY2hlY2sgdGhlIGNvbnRyb2wgcHJlc2VuY2UgYW5kIGNhbiB0aGVu CnNraXAgdGhlIGFzc29jaWF0ZSBlbnRyb3B5IGRlY29kaW5nIGlmIG5vdCBuZWVkZWQuCgo+ICsK PiArLi4gYzp0eXBlOjogdjRsMl9jdHJsX3ZwOV9jb21wcmVzc2VkX2hkcl9wcm9icwo+ICsKPiAr Li4gY3NzY2xhc3M6OiBsb25ndGFibGUKPiArCj4gKy4uIHRhYnVsYXJjb2x1bW5zOjogfHB7NS44 Y219fHB7NC44Y219fHB7Ni42Y219fAo+ICsKPiArLi4gZmxhdC10YWJsZTo6IHN0cnVjdCB2NGwy X2N0cmxfdnA5X2NvbXByZXNzZWRfaGRyX3Byb2JzCj4gKyAgICA6aGVhZGVyLXJvd3M6ICAwCj4g KyAgICA6c3R1Yi1jb2x1bW5zOiAwCj4gKyAgICA6d2lkdGhzOiAgICAgICAxIDEgMgo+ICsKPiAr ICAgICogLSBfX3U4Cj4gKyAgICAgIC0gYGB0eDhbMl1bMV1gYAo+ICsgICAgICAtIFRYIDh4OCBw cm9iYWJpbGl0aWVzIGRlbHRhLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYHR4MTZbMl1b Ml1gYAo+ICsgICAgICAtIFRYIDE2eDE2IHByb2JhYmlsaXRpZXMgZGVsdGEuCj4gKyAgICAqIC0g X191OAo+ICsgICAgICAtIGBgdHgzMlsyXVszXWBgCj4gKyAgICAgIC0gVFggMzJ4MzIgcHJvYmFi aWxpdGllcyBkZWx0YS4KPiArICAgICogLSBfX3U4Cj4gKyAgICAgIC0gYGBjb2VmWzRdWzJdWzJd WzZdWzZdWzNdYGAKPiArICAgICAgLSBDb2VmZmljaWVudCBwcm9iYWJpbGl0aWVzIGRlbHRhLgo+ ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYHNraXBbM11gYAo+ICsgICAgICAtIFNraXAgcHJv YmFiaWxpdGllcyBkZWx0YS4KPiArICAgICogLSBfX3U4Cj4gKyAgICAgIC0gYGBpbnRlcl9tb2Rl WzddWzNdYGAKPiArICAgICAgLSBJbnRlciBwcmVkaWN0aW9uIG1vZGUgcHJvYmFiaWxpdGllcyBk ZWx0YS4KPiArICAgICogLSBfX3U4Cj4gKyAgICAgIC0gYGBpbnRlcnBfZmlsdGVyWzRdWzJdYGAK PiArICAgICAgLSBJbnRlcnBvbGF0aW9uIGZpbHRlciBwcm9iYWJpbGl0aWVzIGRlbHRhLgo+ICsg ICAgKiAtIF9fdTgKPiArICAgICAgLSBgYGlzX2ludGVyWzRdYGAKPiArICAgICAgLSBJcyBpbnRl ci1ibG9jayBwcm9iYWJpbGl0aWVzIGRlbHRhLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBg YGNvbXBfbW9kZVs1XWBgCj4gKyAgICAgIC0gQ29tcG91bmQgcHJlZGljdGlvbiBtb2RlIHByb2Jh YmlsaXRpZXMgZGVsdGEuCj4gKyAgICAqIC0gX191OAo+ICsgICAgICAtIGBgc2luZ2xlX3JlZls1 XVsyXWBgCj4gKyAgICAgIC0gU2luZ2xlIHJlZmVyZW5jZSBwcm9iYWJpbGl0aWVzIGRlbHRhLgo+ ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYGNvbXBfcmVmWzVdYGAKPiArICAgICAgLSBDb21w b3VuZCByZWZlcmVuY2UgcHJvYmFiaWxpdGllcyBkZWx0YS4KPiArICAgICogLSBfX3U4Cj4gKyAg ICAgIC0gYGB5X21vZGVbNF1bOV1gYAo+ICsgICAgICAtIFkgcHJlZGljdGlvbiBtb2RlIHByb2Jh YmlsaXRpZXMgZGVsdGEuCj4gKyAgICAqIC0gX191OAo+ICsgICAgICAtIGBgdXZfbW9kZVsxMF1b OV1gYAo+ICsgICAgICAtIFVWIHByZWRpY3Rpb24gbW9kZSBwcm9iYWJpbGl0aWVzIGRlbHRhLgo+ ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYHBhcnRpdGlvblsxNl1bM11gYAo+ICsgICAgICAt IFBhcnRpdGlvbiBwcm9iYWJpbGl0aWVzIGRlbHRhLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAg LSBgYG12LmpvaW50WzNdYGAKPiArICAgICAgLSBNb3Rpb24gdmVjdG9yIGpvaW50IHByb2JhYmls aXRpZXMgZGVsdGEuCj4gKyAgICAqIC0gX191OAo+ICsgICAgICAtIGBgbXYuc2lnblsyXWBgCj4g KyAgICAgIC0gTW90aW9uIHZlY3RvciBzaWduIHByb2JhYmlsaXRpZXMgZGVsdGEuCj4gKyAgICAq IC0gX191OAo+ICsgICAgICAtIGBgbXYuY2xhc3Nlc1syXVsxMF1gYAo+ICsgICAgICAtIE1vdGlv biB2ZWN0b3IgY2xhc3MgcHJvYmFiaWxpdGllcyBkZWx0YS4KPiArICAgICogLSBfX3U4Cj4gKyAg ICAgIC0gYGBtdi5jbGFzczBfYml0WzJdYGAKPiArICAgICAgLSBNb3Rpb24gdmVjdG9yIGNsYXNz MCBiaXQgcHJvYmFiaWxpdGllcyBkZWx0YS4KPiArICAgICogLSBfX3U4Cj4gKyAgICAgIC0gYGBt di5iaXRzWzJdWzEwXWBgCj4gKyAgICAgIC0gTW90aW9uIHZlY3RvciBiaXRzIHByb2JhYmlsaXRp ZXMgZGVsdGEuCj4gKyAgICAqIC0gX191OAo+ICsgICAgICAtIGBgbXYuY2xhc3MwX2ZyWzJdWzJd WzNdYGAKPiArICAgICAgLSBNb3Rpb24gdmVjdG9yIGNsYXNzMCBmcmFjdGlvbmFsIGJpdCBwcm9i YWJpbGl0aWVzIGRlbHRhLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYG12LmZyWzJdWzNd YGAKPiArICAgICAgLSBNb3Rpb24gdmVjdG9yIGZyYWN0aW9uYWwgYml0IHByb2JhYmlsaXRpZXMg ZGVsdGEuCj4gKyAgICAqIC0gX191OAo+ICsgICAgICAtIGBgbXYuY2xhc3MwX2hwWzJdYGAKPiAr ICAgICAgLSBNb3Rpb24gdmVjdG9yIGNsYXNzMCBoaWdoIHByZWNpc2lvbiBmcmFjdGlvbmFsIGJp dCBwcm9iYWJpbGl0aWVzIGRlbHRhLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYG12Lmhw WzJdYGAKPiArICAgICAgLSBNb3Rpb24gdmVjdG9yIGhpZ2ggcHJlY2lzaW9uIGZyYWN0aW9uYWwg Yml0IHByb2JhYmlsaXRpZXMgZGVsdGEuCj4gKwo+ICtgYFY0TDJfQ0lEX1NUQVRFTEVTU19WUDlf RlJBTUUgKHN0cnVjdClgYAo+ICsgICAgU3BlY2lmaWVzIHRoZSBmcmFtZSBwYXJhbWV0ZXJzIGZv ciB0aGUgYXNzb2NpYXRlZCBWUDkgZnJhbWUgZGVjb2RlIHJlcXVlc3QuCj4gKyAgICBUaGlzIGlu Y2x1ZGVzIHRoZSBuZWNlc3NhcnkgcGFyYW1ldGVycyBmb3IgY29uZmlndXJpbmcgYSBzdGF0ZWxl c3MgaGFyZHdhcmUKPiArICAgIGRlY29kaW5nIHBpcGVsaW5lIGZvciBWUDkuIFRoZSBiaXRzdHJl YW0gcGFyYW1ldGVycyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcKPiArICAgIHRvIDpyZWY6YHZwOWAu Cj4gKwo+ICsuLiBjOnR5cGU6OiB2NGwyX2N0cmxfdnA5X2ZyYW1lCj4gKwo+ICsuLiBjc3NjbGFz czo6IGxvbmd0YWJsZQo+ICsKPiArLi4gdGFidWxhcmNvbHVtbnM6OiB8cHsxLjVjbX18cHs2LjNj bX18cHs5LjRjbX18Cj4gKwo+ICsuLiBmbGF0LXRhYmxlOjogc3RydWN0IHY0bDJfY3RybF92cDlf ZnJhbWUKPiArICAgIDpoZWFkZXItcm93czogIDAKPiArICAgIDpzdHViLWNvbHVtbnM6IDAKPiAr ICAgIDp3aWR0aHM6ICAgICAgIDEgMSAyCj4gKwo+ICsgICAgKiAtIHN0cnVjdCA6Yzp0eXBlOmB2 NGwyX3ZwOV9sb29wX2ZpbHRlcmAKPiArICAgICAgLSBgYGxmYGAKPiArICAgICAgLSBMb29wIGZp bHRlciBwYXJhbWV0ZXJzLiBTZWUgc3RydWN0IDpjOnR5cGU6YHY0bDJfdnA5X2xvb3BfZmlsdGVy YCBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgICAgKiAtIHN0cnVjdCA6Yzp0eXBlOmB2NGwyX3ZwOV9x dWFudGl6YXRpb25gCj4gKyAgICAgIC0gYGBxdWFudGBgCj4gKyAgICAgIC0gUXVhbnRpemF0aW9u IHBhcmFtZXRlcnMuIFNlZSA6Yzp0eXBlOmB2NGwyX3ZwOV9xdWFudGl6YXRpb25gIGZvciBtb3Jl IGRldGFpbHMuCj4gKyAgICAqIC0gc3RydWN0IDpjOnR5cGU6YHY0bDJfdnA5X3NlZ21lbnRhdGlv bmAKPiArICAgICAgLSBgYHNlZ2BgCj4gKyAgICAgIC0gU2VnbWVudGF0aW9uIHBhcmFtZXRlcnMu IFNlZSA6Yzp0eXBlOmB2NGwyX3ZwOV9zZWdtZW50YXRpb25gIGZvciBtb3JlIGRldGFpbHMuCj4g KyAgICAqIC0gX191MzIKPiArICAgICAgLSBgYGZsYWdzYGAKPiArICAgICAgLSBDb21iaW5hdGlv biBvZiBWNEwyX1ZQOV9GUkFNRV9GTEFHXyogZmxhZ3MuIFNlZSA6Yzp0eXBlOmB2NGwyX3ZwOV9m cmFtZV9mbGFnc2AuCj4gKyAgICAqIC0gX191MTYKPiArICAgICAgLSBgYGNvbXByZXNzZWRfaGVh ZGVyX3NpemVgYAo+ICsgICAgICAtIENvbXByZXNzZWQgaGVhZGVyIHNpemUgaW4gYnl0ZXMuCj4g KyAgICAqIC0gX191MTYKPiArICAgICAgLSBgYHVuY29tcHJlc3NlZF9oZWFkZXJfc2l6ZWBgCj4g KyAgICAgIC0gVW5jb21wcmVzc2VkIGhlYWRlciBzaXplIGluIGJ5dGVzLgo+ICsgICAgKiAtIF9f dTE2Cj4gKyAgICAgIC0gYGBmcmFtZV93aWR0aF9taW51c18xYGAKPiArICAgICAgLSBBZGQgMSB0 byBnZXQgdGhlIGZyYW1lIHdpZHRoIGV4cHJlc3NlZCBpbiBwaXhlbHMuIFNlZSBzZWN0aW9uIDcu Mi4zIGluIDpyZWY6YHZwOWAuCj4gKyAgICAqIC0gX191MTYKPiArICAgICAgLSBgYGZyYW1lX2hl aWdodF9taW51c18xYGAKPiArICAgICAgLSBBZGQgMSB0byBnZXQgdGhlIGZyYW1lIGhlaWdodCBl eHByZXNzZWQgaW4gcGl4ZWxzLiBTZWUgc2VjdGlvbiA3LjIuMyBpbiA6cmVmOmB2cDlgLgo+ICsg ICAgKiAtIF9fdTE2Cj4gKyAgICAgIC0gYGByZW5kZXJfd2lkdGhfbWludXNfMWBgCj4gKyAgICAg IC0gQWRkIDEgdG8gZ2V0IHRoZSBleHBlY3RlZCByZW5kZXIgd2lkdGggZXhwcmVzc2VkIGluIHBp eGVscy4gVGhpcyBpcwo+ICsgICAgICAgIG5vdCB1c2VkIGR1cmluZyB0aGUgZGVjb2RpbmcgcHJv Y2VzcyBidXQgbWlnaHQgYmUgdXNlZCBieSBIVyBzY2FsZXJzIHRvCj4gKyAgICAgICAgcHJlcGFy ZSBhIGZyYW1lIHRoYXQncyByZWFkeSBmb3Igc2Nhbm91dC4gU2VlIHNlY3Rpb24gNy4yLjQgaW4g OnJlZjpgdnA5YC4KPiArICAgICogLSBfX3UxNgo+ICsgICAgICAtIHJlbmRlcl9oZWlnaHRfbWlu dXNfMQo+ICsgICAgICAtIEFkZCAxIHRvIGdldCB0aGUgZXhwZWN0ZWQgcmVuZGVyIGhlaWdodCBl eHByZXNzZWQgaW4gcGl4ZWxzLiBUaGlzIGlzCj4gKyAgICAgICAgbm90IHVzZWQgZHVyaW5nIHRo ZSBkZWNvZGluZyBwcm9jZXNzIGJ1dCBtaWdodCBiZSB1c2VkIGJ5IEhXIHNjYWxlcnMgdG8KPiAr ICAgICAgICBwcmVwYXJlIGEgZnJhbWUgdGhhdCdzIHJlYWR5IGZvciBzY2Fub3V0LiBTZWUgc2Vj dGlvbiA3LjIuNCBpbiA6cmVmOmB2cDlgLgo+ICsgICAgKiAtIF9fdTY0Cj4gKyAgICAgIC0gYGBs YXN0X2ZyYW1lX3RzYGAKPiArICAgICAgLSAibGFzdCIgcmVmZXJlbmNlIGJ1ZmZlciB0aW1lc3Rh bXAuCj4gKwlUaGUgdGltZXN0YW1wIHJlZmVycyB0byB0aGUgYGB0aW1lc3RhbXBgYCBmaWVsZCBp bgo+ICsgICAgICAgIHN0cnVjdCA6Yzp0eXBlOmB2NGwyX2J1ZmZlcmAuIFVzZSB0aGUgOmM6ZnVu YzpgdjRsMl90aW1ldmFsX3RvX25zKClgCj4gKyAgICAgICAgZnVuY3Rpb24gdG8gY29udmVydCB0 aGUgc3RydWN0IDpjOnR5cGU6YHRpbWV2YWxgIGluIHN0cnVjdAo+ICsgICAgICAgIDpjOnR5cGU6 YHY0bDJfYnVmZmVyYCB0byBhIF9fdTY0Lgo+ICsgICAgKiAtIF9fdTY0Cj4gKyAgICAgIC0gYGBn b2xkZW5fZnJhbWVfdHNgYAo+ICsgICAgICAtICJnb2xkZW4iIHJlZmVyZW5jZSBidWZmZXIgdGlt ZXN0YW1wLgo+ICsJVGhlIHRpbWVzdGFtcCByZWZlcnMgdG8gdGhlIGBgdGltZXN0YW1wYGAgZmll bGQgaW4KPiArICAgICAgICBzdHJ1Y3QgOmM6dHlwZTpgdjRsMl9idWZmZXJgLiBVc2UgdGhlIDpj OmZ1bmM6YHY0bDJfdGltZXZhbF90b19ucygpYAo+ICsgICAgICAgIGZ1bmN0aW9uIHRvIGNvbnZl cnQgdGhlIHN0cnVjdCA6Yzp0eXBlOmB0aW1ldmFsYCBpbiBzdHJ1Y3QKPiArICAgICAgICA6Yzp0 eXBlOmB2NGwyX2J1ZmZlcmAgdG8gYSBfX3U2NC4KPiArICAgICogLSBfX3U2NAo+ICsgICAgICAt IGBgYWx0X2ZyYW1lX3RzYGAKPiArICAgICAgLSAiYWx0IiByZWZlcmVuY2UgYnVmZmVyIHRpbWVz dGFtcC4KPiArCVRoZSB0aW1lc3RhbXAgcmVmZXJzIHRvIHRoZSBgYHRpbWVzdGFtcGBgIGZpZWxk IGluCj4gKyAgICAgICAgc3RydWN0IDpjOnR5cGU6YHY0bDJfYnVmZmVyYC4gVXNlIHRoZSA6Yzpm dW5jOmB2NGwyX3RpbWV2YWxfdG9fbnMoKWAKPiArICAgICAgICBmdW5jdGlvbiB0byBjb252ZXJ0 IHRoZSBzdHJ1Y3QgOmM6dHlwZTpgdGltZXZhbGAgaW4gc3RydWN0Cj4gKyAgICAgICAgOmM6dHlw ZTpgdjRsMl9idWZmZXJgIHRvIGEgX191NjQuCj4gKyAgICAqIC0gX191OAo+ICsgICAgICAtIGBg cmVmX2ZyYW1lX3NpZ25fYmlhc2BgCj4gKyAgICAgIC0gYSBiaXRmaWVsZCBzcGVjaWZ5aW5nIHdo ZXRoZXIgdGhlIHNpZ24gYmlhcyBpcyBzZXQgZm9yIGEgZ2l2ZW4KPiArICAgICAgICByZWZlcmVu Y2UgZnJhbWUuIFNlZSA6Yzp0eXBlOmB2NGwyX3ZwOV9yZWZfZnJhbWVfc2lnbl9iaWFzYCBmb3Ig bW9yZSBkZXRhaWxzLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYHJlc2V0X2ZyYW1lX2Nv bnRleHRgYAo+ICsgICAgICAtIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBmcmFtZSBjb250ZXh0IHNo b3VsZCBiZSByZXNldCB0byBkZWZhdWx0IHZhbHVlcy4gU2VlCj4gKyAgICAgICAgOmM6dHlwZTpg djRsMl92cDlfcmVzZXRfZnJhbWVfY29udGV4dGAgZm9yIG1vcmUgZGV0YWlscy4KPiArICAgICog LSBfX3U4Cj4gKyAgICAgIC0gYGBmcmFtZV9jb250ZXh0X2lkeGBgCj4gKyAgICAgIC0gRnJhbWUg Y29udGV4dCB0aGF0IHNob3VsZCBiZSB1c2VkL3VwZGF0ZWQuCj4gKyAgICAqIC0gX191OAo+ICsg ICAgICAtIGBgcHJvZmlsZWBgCj4gKyAgICAgIC0gVlA5IHByb2ZpbGUuIENhbiBiZSAwLCAxLCAy IG9yIDMuCj4gKyAgICAqIC0gX191OAo+ICsgICAgICAtIGBgYml0X2RlcHRoYGAKPiArICAgICAg LSBDb21wb25lbnQgZGVwdGggaW4gYml0cy4gQ2FuIGJlIDgsIDEwIG9yIDEyLiBOb3RlIHRoYXQg bm90IGFsbCBwcm9maWxlcwo+ICsgICAgICAgIHN1cHBvcnQgMTAgYW5kL29yIDEyIGJpdHMgZGVw dGhzLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYGludGVycG9sYXRpb25fZmlsdGVyYGAK PiArICAgICAgLSBTcGVjaWZpZXMgdGhlIGZpbHRlciBzZWxlY3Rpb24gdXNlZCBmb3IgcGVyZm9y bWluZyBpbnRlciBwcmVkaWN0aW9uLiBTZWUKPiArICAgICAgICA6Yzp0eXBlOmB2NGwyX3ZwOV9p bnRlcnBvbGF0aW9uX2ZpbHRlcmAgZm9yIG1vcmUgZGV0YWlscy4KPiArICAgICogLSBfX3U4Cj4g KyAgICAgIC0gYGB0aWxlX2NvbHNfbG9nMmBgCj4gKyAgICAgIC0gU3BlY2lmaWVzIHRoZSBiYXNl IDIgbG9nYXJpdGhtIG9mIHRoZSB3aWR0aCBvZiBlYWNoIHRpbGUgKHdoZXJlIHRoZQo+ICsgICAg ICAgIHdpZHRoIGlzIG1lYXN1cmVkIGluIHVuaXRzIG9mIDh4OCBibG9ja3MpLiBTaGFsbCBiZSBs ZXNzIHRoYW4gb3IgZXF1YWwKPiArICAgICAgICB0byA2Lgo+ICsgICAgKiAtIF9fdTgKPiArICAg ICAgLSBgYHRpbGVfcm93c19sb2cyYGAKPiArICAgICAgLSBTcGVjaWZpZXMgdGhlIGJhc2UgMiBs b2dhcml0aG0gb2YgdGhlIGhlaWdodCBvZiBlYWNoIHRpbGUgKHdoZXJlIHRoZQo+ICsgICAgICAg IGhlaWdodCBpcyBtZWFzdXJlZCBpbiB1bml0cyBvZiA4eDggYmxvY2tzKS4KPiArICAgICogLSBf X3U4Cj4gKyAgICAgIC0gYGB0eF9tb2RlYGAKPiArICAgICAgLSBTcGVjaWZpZXMgdGhlIFRYIG1v ZGUuIFNlZSA6Yzp0eXBlOmB2NGwyX3ZwOV90eF9tb2RlYCBmb3IgbW9yZSBkZXRhaWxzLgo+ICsg ICAgKiAtIF9fdTgKPiArICAgICAgLSBgYHJlZmVyZW5jZV9tb2RlYGAKPiArICAgICAgLSBTcGVj aWZpZXMgdGhlIHR5cGUgb2YgaW50ZXIgcHJlZGljdGlvbiB0byBiZSB1c2VkLiBTZWUKPiArICAg ICAgICA6Yzp0eXBlOmB2NGwyX3ZwOV9yZWZlcmVuY2VfbW9kZWAgZm9yIG1vcmUgZGV0YWlscy4K PiArICAgICogLSBfX3U4Cj4gKyAgICAgIC0gYGByZXNlcnZlZFs2XWBgCj4gKyAgICAgIC0gQXBw bGljYXRpb25zIGFuZCBkcml2ZXJzIG11c3Qgc2V0IHRoaXMgdG8gemVyby4KPiArCj4gKy4uIGM6 dHlwZTo6IHY0bDJfdnA5X2ZyYW1lX2ZsYWdzCj4gKwo+ICsuLiBjc3NjbGFzczo6IGxvbmd0YWJs ZQo+ICsKPiArLi4gdGFidWxhcmNvbHVtbnM6OiB8cHsxLjVjbX18cHs2LjNjbX18cHs5LjRjbX18 Cj4gKwo+ICsuLiBmbGF0LXRhYmxlOjogZW51bSB2NGwyX3ZwOV9mcmFtZV9mbGFncwo+ICsgICAg OmhlYWRlci1yb3dzOiAgMAo+ICsgICAgOnN0dWItY29sdW1uczogMAo+ICsgICAgOndpZHRoczog ICAgICAgMSAyCj4gKwo+ICsgICAgKiAtIGBgVjRMMl9WUDlfRlJBTUVfRkxBR19LRVlfRlJBTUVg YAo+ICsgICAgICAtIFRoZSBmcmFtZSBpcyBhIGtleSBmcmFtZS4KPiArICAgICogLSBgYFY0TDJf VlA5X0ZSQU1FX0ZMQUdfU0hPV19GUkFNRWBgCj4gKyAgICAgIC0gVGhlIGZyYW1lIHNob3VsZCBi ZSBkaXNwbGF5ZWQuCj4gKyAgICAqIC0gYGBWNEwyX1ZQOV9GUkFNRV9GTEFHX0VSUk9SX1JFU0lM SUVOVGBgCj4gKyAgICAgIC0gVGhlIGRlY29kaW5nIHNob3VsZCBiZSBlcnJvciByZXNpbGllbnQu Cj4gKyAgICAqIC0gYGBWNEwyX1ZQOV9GUkFNRV9GTEFHX0lOVFJBX09OTFlgYAo+ICsgICAgICAt IFRoZSBmcmFtZSBkb2VzIG5vdCByZWZlcmVuY2Ugb3RoZXIgZnJhbWVzLgo+ICsgICAgKiAtIGBg VjRMMl9WUDlfRlJBTUVfRkxBR19BTExPV19ISUdIX1BSRUNfTVZgYAo+ICsgICAgICAtIFRoZSBm cmFtZSBjYW4gdXNlIGhpZ2ggcHJlY2lzaW9uIG1vdGlvbiB2ZWN0b3JzLgo+ICsgICAgKiAtIGBg VjRMMl9WUDlfRlJBTUVfRkxBR19SRUZSRVNIX0ZSQU1FX0NUWGBgCj4gKyAgICAgIC0gRnJhbWUg Y29udGV4dCBzaG91bGQgYmUgdXBkYXRlZCBhZnRlciBkZWNvZGluZy4KPiArICAgICogLSBgYFY0 TDJfVlA5X0ZSQU1FX0ZMQUdfUEFSQUxMRUxfREVDX01PREVgYAo+ICsgICAgICAtIFBhcmFsbGVs IGRlY29kaW5nIGlzIHVzZWQuCj4gKyAgICAqIC0gYGBWNEwyX1ZQOV9GUkFNRV9GTEFHX1hfU1VC U0FNUExJTkdgYAo+ICsgICAgICAtIFZlcnRpY2FsIHN1YnNhbXBsaW5nIGlzIGVuYWJsZWQuCj4g KyAgICAqIC0gYGBWNEwyX1ZQOV9GUkFNRV9GTEFHX1lfU1VCU0FNUExJTkdgYAo+ICsgICAgICAt IEhvcml6b250YWwgc3Vic2FtcGxpbmcgaXMgZW5hYmxlZC4KPiArICAgICogLSBgYFY0TDJfVlA5 X0ZSQU1FX0ZMQUdfQ09MT1JfUkFOR0VfRlVMTF9TV0lOR2BgCj4gKyAgICAgIC0gVGhlIGZ1bGwg VVYgcmFuZ2UgaXMgdXNlZC4KPiArCj4gKy4uIGM6dHlwZTo6IHY0bDJfdnA5X3R4X21vZGUKPiAr Cj4gK1NlZSBzZWN0aW9uICc3LjMuMSBUeCBtb2RlIHNlbWFudGljcycgb2YgdGhlIFZQOSBzcGVj aWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuCj4gKwo+ICsuLiBjc3NjbGFzczo6IGxvbmd0YWJs ZQo+ICsKPiArLi4gdGFidWxhcmNvbHVtbnM6OiB8cHsxLjVjbX18cHs2LjNjbX18cHs5LjRjbX18 Cj4gKwo+ICsuLiBmbGF0LXRhYmxlOjogZW51bSB2NGwyX3ZwOV90eF9tb2RlCj4gKyAgICA6aGVh ZGVyLXJvd3M6ICAwCj4gKyAgICA6c3R1Yi1jb2x1bW5zOiAwCj4gKyAgICA6d2lkdGhzOiAgICAg ICAxIDIKPiArCj4gKyAgICAqIC0gYGBWNEwyX1ZQOV9UWF9NT0RFX09OTFlfNFg0YGAKPiArICAg ICAgLSBUcmFuc2Zvcm0gc2l6ZSBpcyA0eDQuCj4gKyAgICAqIC0gYGBWNEwyX1ZQOV9UWF9NT0RF X0FMTE9XXzhYOGBgCj4gKyAgICAgIC0gVHJhbnNmb3JtIHNpemUgY2FuIGJlIHVwIHRvIDh4OC4K PiArICAgICogLSBgYFY0TDJfVlA5X1RYX01PREVfQUxMT1dfMTZYMTZgYAo+ICsgICAgICAtIFRy YW5zZm9ybSBzaXplIGNhbiBiZSB1cCB0byAxNngxNi4KPiArICAgICogLSBgYFY0TDJfVlA5X1RY X01PREVfQUxMT1dfMzJYMzJgYAo+ICsgICAgICAtIHRyYW5zZm9ybSBzaXplIGNhbiBiZSB1cCB0 byAzMngzMi4KPiArICAgICogLSBgYFY0TDJfVlA5X1RYX01PREVfU0VMRUNUYGAKPiArICAgICAg LSBCaXRzdHJlYW0gY29udGFpbnMgdGhlIHRyYW5zZm9ybSBzaXplIGZvciBlYWNoIGJsb2NrLgo+ ICsKPiArLi4gYzp0eXBlOjogdjRsMl92cDlfcmVmZXJlbmNlX21vZGUKPiArCj4gK1NlZSBzZWN0 aW9uICc3LjMuNiBGcmFtZSByZWZlcmVuY2UgbW9kZSBzZW1hbnRpY3MnIG9mIHRoZSBWUDkgc3Bl Y2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgo+ICsKPiArLi4gY3NzY2xhc3M6OiBsb25ndGFi bGUKPiArCj4gKy4uIHRhYnVsYXJjb2x1bW5zOjogfHB7MS41Y219fHB7Ni4zY219fHB7OS40Y219 fAo+ICsKPiArLi4gZmxhdC10YWJsZTo6IGVudW0gdjRsMl92cDlfcmVmZXJlbmNlX21vZGUKPiAr ICAgIDpoZWFkZXItcm93czogIDAKPiArICAgIDpzdHViLWNvbHVtbnM6IDAKPiArICAgIDp3aWR0 aHM6ICAgICAgIDEgMgo+ICsKPiArICAgICogLSBgYFY0TDJfVlA5X1JFRkVSRU5DRV9NT0RFX1NJ TkdMRV9SRUZFUkVOQ0VgYAo+ICsgICAgICAtIEluZGljYXRlcyB0aGF0IGFsbCB0aGUgaW50ZXIg YmxvY2tzIHVzZSBvbmx5IGEgc2luZ2xlIHJlZmVyZW5jZSBmcmFtZQo+ICsgICAgICAgIHRvIGdl bmVyYXRlIG1vdGlvbiBjb21wZW5zYXRlZCBwcmVkaWN0aW9uLgo+ICsgICAgKiAtIGBgVjRMMl9W UDlfUkVGRVJFTkNFX01PREVfQ09NUE9VTkRfUkVGRVJFTkNFYGAKPiArICAgICAgLSBSZXF1aXJl cyBhbGwgdGhlIGludGVyIGJsb2NrcyB0byB1c2UgY29tcG91bmQgbW9kZS4gU2luZ2xlIHJlZmVy ZW5jZQo+ICsgICAgICAgIGZyYW1lIHByZWRpY3Rpb24gaXMgbm90IGFsbG93ZWQuCj4gKyAgICAq IC0gYGBWNEwyX1ZQOV9SRUZFUkVOQ0VfTU9ERV9TRUxFQ1RgYAo+ICsgICAgICAtIEFsbG93cyBl YWNoIGluZGl2aWR1YWwgaW50ZXIgYmxvY2sgdG8gc2VsZWN0IGJldHdlZW4gc2luZ2xlIGFuZAo+ ICsgICAgICAgIGNvbXBvdW5kIHByZWRpY3Rpb24gbW9kZXMuCj4gKwo+ICsuLiBjOnR5cGU6OiB2 NGwyX3ZwOV9pbnRlcnBvbGF0aW9uX2ZpbHRlcgo+ICsKPiArU2VlIHNlY3Rpb24gJzcuMi43IElu dGVycG9sYXRpb24gZmlsdGVyIHNlbWFudGljcycgb2YgdGhlIFZQOSBzcGVjaWZpY2F0aW9uCj4g K2ZvciBtb3JlIGRldGFpbHMuCj4gKwo+ICsuLiBjc3NjbGFzczo6IGxvbmd0YWJsZQo+ICsKPiAr Li4gdGFidWxhcmNvbHVtbnM6OiB8cHsxLjVjbX18cHs2LjNjbX18cHs5LjRjbX18Cj4gKwo+ICsu LiBmbGF0LXRhYmxlOjogZW51bSB2NGwyX3ZwOV9pbnRlcnBvbGF0aW9uX2ZpbHRlcgo+ICsgICAg OmhlYWRlci1yb3dzOiAgMAo+ICsgICAgOnN0dWItY29sdW1uczogMAo+ICsgICAgOndpZHRoczog ICAgICAgMSAyCj4gKwo+ICsgICAgKiAtIGBgVjRMMl9WUDlfSU5URVJQX0ZJTFRFUl9FSUdIVFRB UGBgCj4gKyAgICAgIC0gRWlnaHQgdGFwIGZpbHRlci4KPiArICAgICogLSBgYFY0TDJfVlA5X0lO VEVSUF9GSUxURVJfRUlHSFRUQVBfU01PT1RIYGAKPiArICAgICAgLSBFaWdodCB0YXAgc21vb3Ro IGZpbHRlci4KPiArICAgICogLSBgYFY0TDJfVlA5X0lOVEVSUF9GSUxURVJfRUlHSFRUQVBfU0hB UlBgYAo+ICsgICAgICAtIEVlaWdodCB0YXAgc2hhcnAgZmlsdGVyLgo+ICsgICAgKiAtIGBgVjRM Ml9WUDlfSU5URVJQX0ZJTFRFUl9CSUxJTkVBUmBgCj4gKyAgICAgIC0gQmlsaW5lYXIgZmlsdGVy Lgo+ICsgICAgKiAtIGBgVjRMMl9WUDlfSU5URVJQX0ZJTFRFUl9TV0lUQ0hBQkxFYGAKPiArICAg ICAgLSBGaWx0ZXIgc2VsZWN0aW9uIGlzIHNpZ25hbGVkIGF0IHRoZSBibG9jayBsZXZlbC4KPiAr Cj4gKy4uIGM6dHlwZTo6IHY0bDJfdnA5X3Jlc2V0X2ZyYW1lX2NvbnRleHQKPiArCj4gK1NlZSBz ZWN0aW9uICc3LjIgVW5jb21wcmVzc2VkIGhlYWRlciBzZW1hbnRpY3MnIG9mIHRoZSBWUDkgc3Bl Y2lmaWNhdGlvbgo+ICtmb3IgbW9yZSBkZXRhaWxzLgo+ICsKPiArLi4gY3NzY2xhc3M6OiBsb25n dGFibGUKPiArCj4gKy4uIHRhYnVsYXJjb2x1bW5zOjogfHB7MS41Y219fHB7Ni4zY219fHB7OS40 Y219fAo+ICsKPiArLi4gZmxhdC10YWJsZTo6IGVudW0gdjRsMl92cDlfcmVzZXRfZnJhbWVfY29u dGV4dAo+ICsgICAgOmhlYWRlci1yb3dzOiAgMAo+ICsgICAgOnN0dWItY29sdW1uczogMAo+ICsg ICAgOndpZHRoczogICAgICAgMSAyCj4gKwo+ICsgICAgKiAtIGBgVjRMMl9WUDlfUkVTRVRfRlJB TUVfQ1RYX05PTkVgYAo+ICsgICAgICAtIERvIG5vdCByZXNldCBhbnkgZnJhbWUgY29udGV4dC4K PiArICAgICogLSBgYFY0TDJfVlA5X1JFU0VUX0ZSQU1FX0NUWF9TUEVDYGAKPiArICAgICAgLSBS ZXNldCB0aGUgZnJhbWUgY29udGV4dCBwb2ludGVkIHRvIGJ5Cj4gKyAgICAgICAgOmM6dHlwZTpg djRsMl9jdHJsX3ZwOV9mcmFtZWAuZnJhbWVfY29udGV4dF9pZHguCj4gKyAgICAqIC0gYGBWNEwy X1ZQOV9SRVNFVF9GUkFNRV9DVFhfQUxMYGAKPiArICAgICAgLSBSZXNldCBhbGwgZnJhbWUgY29u dGV4dHMuCj4gKwo+ICsuLiBjOnR5cGU6OiB2NGwyX3ZwOV9pbnRyYV9wcmVkaWN0aW9uX21vZGUK PiArCj4gK1NlZSBzZWN0aW9uICc3LjQuNSBJbnRyYSBmcmFtZSBtb2RlIGluZm8gc2VtYW50aWNz JyBmb3IgbW9yZSBkZXRhaWxzLgo+ICsKPiArLi4gY3NzY2xhc3M6OiBsb25ndGFibGUKPiArCj4g Ky4uIHRhYnVsYXJjb2x1bW5zOjogfHB7MS41Y219fHB7Ni4zY219fHB7OS40Y219fAo+ICsKPiAr Li4gZmxhdC10YWJsZTo6IGVudW0gdjRsMl92cDlfaW50cmFfcHJlZGljdGlvbl9tb2RlCj4gKyAg ICA6aGVhZGVyLXJvd3M6ICAwCj4gKyAgICA6c3R1Yi1jb2x1bW5zOiAwCj4gKyAgICA6d2lkdGhz OiAgICAgICAxIDIKPiArCj4gKyAgICAqIC0gYGBWNEwyX1ZQOV9JTlRSQV9QUkVEX01PREVfRENf UFJFRGBgCj4gKyAgICAgIC0gREMgaW50cmEgcHJlZGljdGlvbi4KPiArICAgICogLSBgYFY0TDJf VlA5X0lOVFJBX1BSRURfTU9ERV9WX1BSRURgYAo+ICsgICAgICAtIFZlcnRpY2FsIGludHJhIHBy ZWRpY3Rpb24uCj4gKyAgICAqIC0gYGBWNEwyX1ZQOV9JTlRSQV9QUkVEX01PREVfSF9QUkVEYGAK PiArICAgICAgLSBIb3Jpem9udGFsIGludHJhIHByZWRpY3Rpb24uCj4gKyAgICAqIC0gYGBWNEwy X1ZQOV9JTlRSQV9QUkVEX01PREVfRDQ1X1BSRURgYAo+ICsgICAgICAtIEQ0NSBpbnRyYSBwcmVk aWN0aW9uLgo+ICsgICAgKiAtIGBgVjRMMl9WUDlfSU5UUkFfUFJFRF9NT0RFX0QxMzVfUFJFRGBg Cj4gKyAgICAgIC0gRDEzNSBpbnRyYSBwcmVkaWN0aW9uLgo+ICsgICAgKiAtIGBgVjRMMl9WUDlf SU5UUkFfUFJFRF9NT0RFX0QxMTdfUFJFRGBgCj4gKyAgICAgIC0gRDExNyBpbnRyYSBwcmVkaWN0 aW9uLgo+ICsgICAgKiAtIGBgVjRMMl9WUDlfSU5UUkFfUFJFRF9NT0RFX0QxNTNfUFJFRGBgCj4g KyAgICAgIC0gRDE1MyBpbnRyYSBwcmVkaWN0aW9uLgo+ICsgICAgKiAtIGBgVjRMMl9WUDlfSU5U UkFfUFJFRF9NT0RFX0QyMDdfUFJFRGBgCj4gKyAgICAgIC0gRDIwNyBpbnRyYSBwcmVkaWN0aW9u Lgo+ICsgICAgKiAtIGBgVjRMMl9WUDlfSU5UUkFfUFJFRF9NT0RFX0Q2M19QUkVEYGAKPiArICAg ICAgLSBENjMgaW50cmEgcHJlZGljdGlvbi4KPiArICAgICogLSBgYFY0TDJfVlA5X0lOVFJBX1BS RURfTU9ERV9UTV9QUkVEYGAKPiArICAgICAgLSBUcnVlIG1vdGlvbiBpbnRyYSBwcmVkaWN0aW9u Lgo+ICsKPiArLi4gYzp0eXBlOjogdjRsMl92cDlfc2VnbWVudGF0aW9uCj4gKwo+ICtFbmNvZGVz IHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVycy4gU2VlIHNlY3Rpb24gJzcuMi4xMCBTZWdtZW50 YXRpb24KPiArcGFyYW1zIHN5bnRheCcgb2YgdGhlIFZQOSBzcGVjaWZpY2F0aW9uIGZvciBtb3Jl IGRldGFpbHMuCj4gKwo+ICsuLiBjc3NjbGFzczo6IGxvbmd0YWJsZQo+ICsKPiArLi4gdGFidWxh cmNvbHVtbnM6OiB8cHsxLjVjbX18cHs2LjNjbX18cHs5LjRjbX18Cj4gKwo+ICsuLiBmbGF0LXRh YmxlOjogc3RydWN0IHY0bDJfdnA5X3NlZ21lbnRhdGlvbgo+ICsgICAgOmhlYWRlci1yb3dzOiAg MAo+ICsgICAgOnN0dWItY29sdW1uczogMAo+ICsgICAgOndpZHRoczogICAgICAgMSAxIDIKPiAr Cj4gKyAgICAqIC0gX191OAo+ICsgICAgICAtIGBgZmVhdHVyZV9kYXRhWzhdWzRdYGAKPiArICAg ICAgLSBEYXRhIGF0dGFjaGVkIHRvIGVhY2ggZmVhdHVyZS4gRGF0YSBlbnRyeSBpcyBvbmx5IHZh bGlkIGlmIHRoZSBmZWF0dXJlCj4gKyAgICAgICAgaXMgZW5hYmxlZC4KPiArICAgICogLSBfX3U4 Cj4gKyAgICAgIC0gYGBmZWF0dXJlX2VuYWJsZWRbOF1gYAo+ICsgICAgICAtIEJpdG1hc2sgZGVm aW5pbmcgd2hpY2ggZmVhdHVyZXMgYXJlIGVuYWJsZWQgaW4gZWFjaCBzZWdtZW50Lgo+ICsgICAg KiAtIF9fdTgKPiArICAgICAgLSBgYHRyZWVfcHJvYnNbN11gYAo+ICsgICAgICAtIFNwZWNpZmll cyB0aGUgcHJvYmFiaWxpdHkgdmFsdWVzIHRvIGJlIHVzZWQgd2hlbiBkZWNvZGluZyBhIFNlZ21l bnQtSUQuCj4gKyAgICAgICAgU2VlICc1LjE1LiBTZWdtZW50YXRpb24gbWFwJyBzZWN0aW9uIG9m IDpyZWY6YHZwOWAgZm9yIG1vcmUgZGV0YWlscy4KPiArICAgICogLSBfX3U4Cj4gKyAgICAgIC0g YGBwcmVkX3Byb2JzWzNdYGAKPiArICAgICAgLSBTcGVjaWZpZXMgdGhlIHByb2JhYmlsaXR5IHZh bHVlcyB0byBiZSB1c2VkIHdoZW4gZGVjb2RpbmcgYQo+ICsgICAgICAgIFByZWRpY3RlZC1TZWdt ZW50LUlELiBTZWUgJzYuNC4xNC4gR2V0IHNlZ21lbnQgaWQgc3ludGF4Jwo+ICsgICAgICAgIHNl Y3Rpb24gb2YgOnJlZjpgdnA5YCBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgICAgKiAtIF9fdTgKPiAr ICAgICAgLSBgYGZsYWdzYGAKPiArICAgICAgLSBDb21iaW5hdGlvbiBvZiBWNEwyX1ZQOV9TRUdN RU5UQVRJT05fRkxBR18qIGZsYWdzLiBTZWUKPiArICAgICAgICA6Yzp0eXBlOmB2NGwyX3ZwOV9z ZWdtZW50YXRpb25fZmxhZ3NgLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYHJlc2VydmVk WzVdYGAKPiArICAgICAgLSBBcHBsaWNhdGlvbnMgYW5kIGRyaXZlcnMgbXVzdCBzZXQgdGhpcyB0 byB6ZXJvLgo+ICsKPiArLi4gYzp0eXBlOjogdjRsMl92cDlfc2VnbWVudF9mZWF0dXJlCj4gKwo+ ICtTZWdtZW50IGZlYXR1cmUgSURzLiBTZWUgc2VjdGlvbiAnNy4yLjEwIFNlZ21lbnRhdGlvbiBw YXJhbXMgc3ludGF4JyBvZiB0aGUKPiArVlA5IHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWls cy4KPiArCj4gKy4uIGNzc2NsYXNzOjogbG9uZ3RhYmxlCj4gKwo+ICsuLiB0YWJ1bGFyY29sdW1u czo6IHxwezEuNWNtfXxwezYuM2NtfXxwezkuNGNtfXwKPiArCj4gKy4uIGZsYXQtdGFibGU6OiBl bnVtIHY0bDJfdnA5X3NlZ21lbnRfZmVhdHVyZQo+ICsgICAgOmhlYWRlci1yb3dzOiAgMAo+ICsg ICAgOnN0dWItY29sdW1uczogMAo+ICsgICAgOndpZHRoczogICAgICAgMSAyCj4gKwo+ICsgICAg KiAtIGBgVjRMMl9WUDlfU0VHX0xWTF9BTFRfUWBgCj4gKyAgICAgIC0gUXVhbnRpemVyIHNlZ21l bnQgZmVhdHVyZS4KPiArICAgICogLSBgYFY0TDJfVlA5X1NFR19MVkxfQUxUX0xgYAo+ICsgICAg ICAtIExvb3AgZmlsdGVyIHNlZ21lbnQgZmVhdHVyZS4KPiArICAgICogLSBgYFY0TDJfVlA5X1NF R19MVkxfUkVGX0ZSQU1FYGAKPiArICAgICAgLSBSZWZlcmVuY2UgZnJhbWUgc2VnbWVudCBmZWF0 dXJlLgo+ICsgICAgKiAtIGBgVjRMMl9WUDlfU0VHX0xWTF9TS0lQYGAKPiArICAgICAgLSBTa2lw IHNlZ21lbnQgZmVhdHVyZS4KPiArICAgICogLSBgYFY0TDJfVlA5X1NFR19MVkxfTUFYYGAKPiAr ICAgICAgLSBOdW1iZXIgb2Ygc2VnbWVudCBmZWF0dXJlcy4KPiArCj4gKy4uIGM6dHlwZTo6IHY0 bDJfdnA5X3NlZ21lbnRhdGlvbl9mbGFncwo+ICsKPiArVGhvc2UgYXJlIHRoZSBmbGFncyB0aGF0 IG1heSBiZSBwYXNzZWQgdG8gJnY0bDJfdnA5X3NlZ21lbnRhdGlvbi5mbGFncy4gU2VlCj4gK3Nl Y3Rpb24gJzcuMi4xMCBTZWdtZW50YXRpb24gcGFyYW1zIHN5bnRheCcgb2YgdGhlIFZQOSBzcGVj aWZpY2F0aW9uIGZvcgo+ICttb3JlIGRldGFpbHMuCj4gKwo+ICsuLiBjc3NjbGFzczo6IGxvbmd0 YWJsZQo+ICsKPiArLi4gdGFidWxhcmNvbHVtbnM6OiB8cHsxLjVjbX18cHs2LjNjbX18cHs5LjRj bX18Cj4gKwo+ICsuLiBmbGF0LXRhYmxlOjogZW51bSB2NGwyX3ZwOV9zZWdtZW50YXRpb25fZmxh Z3MKPiArICAgIDpoZWFkZXItcm93czogIDAKPiArICAgIDpzdHViLWNvbHVtbnM6IDAKPiArICAg IDp3aWR0aHM6ICAgICAgIDEgMgo+ICsKPiArICAgICogLSBgYFY0TDJfVlA5X1NFR01FTlRBVElP Tl9GTEFHX0VOQUJMRURgYAo+ICsgICAgICAtIEluZGljYXRlcyB0aGF0IHRoaXMgZnJhbWUgbWFr ZXMgdXNlIG9mIHRoZSBzZWdtZW50YXRpb24gdG9vbC4KPiArICAgICogLSBgYFY0TDJfVlA5X1NF R01FTlRBVElPTl9GTEFHX1VQREFURV9NQVBgYAo+ICsgICAgICAtIEluZGljYXRlcyB0aGF0IHRo ZSBzZWdtZW50YXRpb24gbWFwIHNob3VsZCBiZSB1cGRhdGVkIGR1cmluZyB0aGUKPiArICAgICAg ICBkZWNvZGluZyBvZiB0aGlzIGZyYW1lLgo+ICsgICAgKiAtIGBgVjRMMl9WUDlfU0VHTUVOVEFU SU9OX0ZMQUdfVEVNUE9SQUxfVVBEQVRFYGAKPiArICAgICAgLSBJbmRpY2F0ZXMgdGhhdCB0aGUg dXBkYXRlcyB0byB0aGUgc2VnbWVudGF0aW9uIG1hcCBhcmUgY29kZWQKPiArICAgICAgICByZWxh dGl2ZSB0byB0aGUgZXhpc3Rpbmcgc2VnbWVudGF0aW9uIG1hcC4KPiArICAgICogLSBgYFY0TDJf VlA5X1NFR01FTlRBVElPTl9GTEFHX1VQREFURV9EQVRBYGAKPiArICAgICAgLSBJbmRpY2F0ZXMg dGhhdCBuZXcgcGFyYW1ldGVycyBhcmUgYWJvdXQgdG8gYmUgc3BlY2lmaWVkIGZvciBlYWNoCj4g KyAgICAgICAgc2VnbWVudC4KPiArICAgICogLSBgYFY0TDJfVlA5X1NFR01FTlRBVElPTl9GTEFH X0FCU19PUl9ERUxUQV9VUERBVEVgYAo+ICsgICAgICAtIEluZGljYXRlcyB0aGF0IHRoZSBzZWdt ZW50YXRpb24gcGFyYW1ldGVycyByZXByZXNlbnQgdGhlIGFjdHVhbCB2YWx1ZXMKPiArICAgICAg ICB0byBiZSB1c2VkLgo+ICsKPiArLi4gYzp0eXBlOjogdjRsMl92cDlfcXVhbnRpemF0aW9uCj4g Kwo+ICtFbmNvZGVzIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVycy4gU2VlIHNlY3Rpb24gJzcu Mi45IFF1YW50aXphdGlvbiBwYXJhbXMKPiArc3ludGF4JyBvZiB0aGUgVlA5IHNwZWNpZmljYXRp b24gZm9yIG1vcmUgZGV0YWlscy4KPiArCj4gKy4uIGNzc2NsYXNzOjogbG9uZ3RhYmxlCj4gKwo+ ICsuLiB0YWJ1bGFyY29sdW1uczo6IHxwezEuNWNtfXxwezYuM2NtfXxwezkuNGNtfXwKPiArCj4g Ky4uIGZsYXQtdGFibGU6OiBzdHJ1Y3QgdjRsMl92cDlfcXVhbnRpemF0aW9uCj4gKyAgICA6aGVh ZGVyLXJvd3M6ICAwCj4gKyAgICA6c3R1Yi1jb2x1bW5zOiAwCj4gKyAgICA6d2lkdGhzOiAgICAg ICAxIDEgMgo+ICsKPiArICAgICogLSBfX3U4Cj4gKyAgICAgIC0gYGBiYXNlX3FfaWR4YGAKPiAr ICAgICAgLSBJbmRpY2F0ZXMgdGhlIGJhc2UgZnJhbWUgcWluZGV4Lgo+ICsgICAgKiAtIF9fczgK PiArICAgICAgLSBgYGRlbHRhX3FfeV9kY2BgCj4gKyAgICAgIC0gSW5kaWNhdGVzIHRoZSBZIERD IHF1YW50aXplciByZWxhdGl2ZSB0byBiYXNlX3FfaWR4Lgo+ICsgICAgKiAtIF9fczgKPiArICAg ICAgLSBgYGRlbHRhX3FfdXZfZGNgYAo+ICsgICAgICAtIEluZGljYXRlcyB0aGUgVVYgREMgcXVh bnRpemVyIHJlbGF0aXZlIHRvIGJhc2VfcV9pZHguCj4gKyAgICAqIC0gX19zOAo+ICsgICAgICAt IGBgZGVsdGFfcV91dl9hY2BgCj4gKyAgICAgIC0gSW5kaWNhdGVzIHRoZSBVViBBQyBxdWFudGl6 ZXIgcmVsYXRpdmUgdG8gYmFzZV9xX2lkeC4KPiArICAgICogLSBfX3U4Cj4gKyAgICAgIC0gYGBy ZXNlcnZlZFs0XWBgCj4gKyAgICAgIC0gQXBwbGljYXRpb25zIGFuZCBkcml2ZXJzIG11c3Qgc2V0 IHRoaXMgdG8gemVyby4KPiArCj4gKy4uIGM6dHlwZTo6IHY0bDJfdnA5X2xvb3BfZmlsdGVyCj4g Kwo+ICtUaGlzIHN0cnVjdHVyZSBjb250YWlucyBhbGwgbG9vcCBmaWx0ZXIgcmVsYXRlZCBwYXJh bWV0ZXJzLiBTZWUgc2VjdGlvbnMKPiArJzcuMi44IExvb3AgZmlsdGVyIHNlbWFudGljcycgb2Yg dGhlIFZQOSBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuCj4gKwo+ICsuLiBjc3NjbGFz czo6IGxvbmd0YWJsZQo+ICsKPiArLi4gdGFidWxhcmNvbHVtbnM6OiB8cHsxLjVjbX18cHs2LjNj bX18cHs5LjRjbX18Cj4gKwo+ICsuLiBmbGF0LXRhYmxlOjogc3RydWN0IHY0bDJfdnA5X2xvb3Bf ZmlsdGVyCj4gKyAgICA6aGVhZGVyLXJvd3M6ICAwCj4gKyAgICA6c3R1Yi1jb2x1bW5zOiAwCj4g KyAgICA6d2lkdGhzOiAgICAgICAxIDEgMgo+ICsKPiArICAgICogLSBfX3M4Cj4gKyAgICAgIC0g YGByZWZfZGVsdGFzWzRdYGAKPiArICAgICAgLSBDb250YWlucyB0aGUgYWRqdXN0bWVudCBuZWVk ZWQgZm9yIHRoZSBmaWx0ZXIgbGV2ZWwgYmFzZWQgb24gdGhlIGNob3Nlbgo+ICsgICAgICAgIHJl ZmVyZW5jZSBmcmFtZS4KPiArICAgICogLSBfX3M4Cj4gKyAgICAgIC0gYGBtb2RlX2RlbHRhc1sy XWBgCj4gKyAgICAgIC0gQ29udGFpbnMgdGhlIGFkanVzdG1lbnQgbmVlZGVkIGZvciB0aGUgZmls dGVyIGxldmVsIGJhc2VkIG9uIHRoZSBjaG9zZW4KPiArICAgICAgICBtb2RlLgo+ICsgICAgKiAt IF9fdTgKPiArICAgICAgLSBgYGxldmVsYGAKPiArICAgICAgLSBJbmRpY2F0ZXMgdGhlIGxvb3Ag ZmlsdGVyIHN0cmVuZ3RoLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYHNoYXJwbmVzc2Bg Cj4gKyAgICAgIC0gSW5kaWNhdGVzIHRoZSBzaGFycG5lc3MgbGV2ZWwuCj4gKyAgICAqIC0gX191 OAo+ICsgICAgICAtIGBgZmxhZ3NgYAo+ICsgICAgICAtIENvbWJpbmF0aW9uIG9mIFY0TDJfVlA5 X0xPT1BfRklMVEVSX0ZMQUdfKiBmbGFncy4KPiArICAgICAgICBTZWUgOmM6dHlwZTpgdjRsMl92 cDlfbG9vcF9maWx0ZXJfZmxhZ3NgLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYHJlc2Vy dmVkWzddYGAKPiArICAgICAgLSBBcHBsaWNhdGlvbnMgYW5kIGRyaXZlcnMgbXVzdCBzZXQgdGhp cyB0byB6ZXJvLgo+ICsKPiArCj4gKy4uIGM6dHlwZTo6IHY0bDJfdnA5X2xvb3BfZmlsdGVyX2Zs YWdzCj4gKwo+ICtUaG9zZSBhcmUgdGhlIGZsYWdzIHRoYXQgbWF5IGJlIHBhc3NlZC4gU2VlIHNl Y3Rpb24gJzcuMi44IExvb3AgZmlsdGVyCj4gK3NlbWFudGljcycgb2YgdGhlIFZQOSBzcGVjaWZp Y2F0aW9uIGZvciBtb3JlIGRldGFpbHMuCj4gKwo+ICsuLiBjc3NjbGFzczo6IGxvbmd0YWJsZQo+ ICsKPiArLi4gdGFidWxhcmNvbHVtbnM6OiB8cHsxLjVjbX18cHs2LjNjbX18cHs5LjRjbX18Cj4g Kwo+ICsuLiBmbGF0LXRhYmxlOjogZW51bSB2NGwyX3ZwOV9sb29wX2ZpbHRlcl9mbGFncwo+ICsg ICAgOmhlYWRlci1yb3dzOiAgMAo+ICsgICAgOnN0dWItY29sdW1uczogMAo+ICsgICAgOndpZHRo czogICAgICAgMSAyCj4gKwo+ICsgICAgKiAtIGBgVjRMMl9WUDlfTE9PUF9GSUxURVJfRkxBR19E RUxUQV9FTkFCTEVEYGAKPiArICAgICAgLSBXaGVuIHNldCwgdGhlIGZpbHRlciBsZXZlbCBkZXBl bmRzIG9uIHRoZSBtb2RlIGFuZCByZWZlcmVuY2UgZnJhbWUgdXNlZAo+ICsgICAgICAgIHRvIHBy ZWRpY3QgYSBibG9jay4KPiArICAgICogLSBgYFY0TDJfVlA5X0xPT1BfRklMVEVSX0ZMQUdfREVM VEFfVVBEQVRFYGAKPiArICAgICAgLSBXaGVuIHNldCwgdGhlIGJpdHN0cmVhbSBjb250YWlucyBh ZGRpdGlvbmFsIHN5bnRheCBlbGVtZW50cyB0aGF0Cj4gKyAgICAgICAgc3BlY2lmeSB3aGljaCBt b2RlIGFuZCByZWZlcmVuY2UgZnJhbWUgZGVsdGFzIGFyZSB0byBiZSB1cGRhdGVkLgo+IGRpZmYg LS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvbWVkaWEvdjRsL3BpeGZtdC1jb21w cmVzc2VkLnJzdCBiL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS92NGwvcGl4Zm10 LWNvbXByZXNzZWQucnN0Cj4gaW5kZXggMGVkZTM5OTA3ZWUyLi4xYjIwZjQ4YTI0YjkgMTAwNjQ0 Cj4gLS0tIGEvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL21lZGlhL3Y0bC9waXhmbXQtY29t cHJlc3NlZC5yc3QKPiArKysgYi9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvbWVkaWEvdjRs L3BpeGZtdC1jb21wcmVzc2VkLnJzdAo+IEBAIC0xNzIsNiArMTcyLDIxIEBAIENvbXByZXNzZWQg Rm9ybWF0cwo+ICAgICAgICAtIFZQOSBjb21wcmVzc2VkIHZpZGVvIGZyYW1lLiBUaGUgZW5jb2Rl ciBnZW5lcmF0ZXMgb25lCj4gIAljb21wcmVzc2VkIGZyYW1lIHBlciBidWZmZXIsIGFuZCB0aGUg ZGVjb2RlciByZXF1aXJlcyBvbmUKPiAgCWNvbXByZXNzZWQgZnJhbWUgcGVyIGJ1ZmZlci4KPiAr ICAgICogLi4gX1Y0TDItUElYLUZNVC1WUDktRlJBTUU6Cj4gKwo+ICsgICAgICAtIGBgVjRMMl9Q SVhfRk1UX1ZQOV9GUkFNRWBgCj4gKyAgICAgIC0gJ1ZQOUYnCj4gKyAgICAgIC0gVlA5IHBhcnNl ZCBmcmFtZSwgaW5jbHVkaW5nIHRoZSBmcmFtZSBoZWFkZXIsIGFzIGV4dHJhY3RlZCBmcm9tIHRo ZSBjb250YWluZXIuCj4gKwlUaGlzIGZvcm1hdCBpcyBhZGFwdGVkIGZvciBzdGF0ZWxlc3Mgdmlk ZW8gZGVjb2RlcnMgdGhhdCBpbXBsZW1lbnQgYQo+ICsJVlA5IHBpcGVsaW5lIHdpdGggdGhlIDpy ZWY6YHN0YXRlbGVzc19kZWNvZGVyYC4KPiArCU1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUg ZnJhbWUgdG8gZGVjb2RlIGlzIHJlcXVpcmVkIHRvIGJlIHBhc3NlZAo+ICsJdGhyb3VnaCB0aGUg YGBWNEwyX0NJRF9TVEFURUxFU1NfVlA5X0ZSQU1FYGAgYW5kCj4gKwl0aGUgYGBWNEwyX0NJRF9T VEFURUxFU1NfVlA5X0NPTVBSRVNTRURfSERSX1BST0JTYGAgY29udHJvbHMuCj4gKwlTZWUgdGhl IDpyZWY6YGFzc29jaWF0ZWQgQ29kZWMgQ29udHJvbCBJRHMgPHY0bDItY29kZWMtc3RhdGVsZXNz LXZwOT5gLgo+ICsJRXhhY3RseSBvbmUgb3V0cHV0IGFuZCBvbmUgY2FwdHVyZSBidWZmZXIgbXVz dCBiZSBwcm92aWRlZCBmb3IgdXNlIHdpdGgKPiArCXRoaXMgcGl4ZWwgZm9ybWF0LiBUaGUgb3V0 cHV0IGJ1ZmZlciBtdXN0IGNvbnRhaW4gdGhlIGFwcHJvcHJpYXRlIG51bWJlcgo+ICsJb2YgbWFj cm9ibG9ja3MgdG8gZGVjb2RlIGEgZnVsbCBjb3JyZXNwb25kaW5nIGZyYW1lIHRvIHRoZSBtYXRj aGluZwo+ICsJY2FwdHVyZSBidWZmZXIuCj4gICAgICAqIC4uIF9WNEwyLVBJWC1GTVQtSEVWQzoK PiAgCj4gICAgICAgIC0gYGBWNEwyX1BJWF9GTVRfSEVWQ2BgCj4gZGlmZiAtLWdpdCBhL0RvY3Vt ZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS92NGwvdmlkaW9jLWctZXh0LWN0cmxzLnJzdCBi L0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS92NGwvdmlkaW9jLWctZXh0LWN0cmxz LnJzdAo+IGluZGV4IDJkNmJjOGQ5NDM4MC4uMjU4ODk1ZmYwYzcxIDEwMDY0NAo+IC0tLSBhL0Rv Y3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS92NGwvdmlkaW9jLWctZXh0LWN0cmxzLnJz dAo+ICsrKyBiL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS92NGwvdmlkaW9jLWct ZXh0LWN0cmxzLnJzdAo+IEBAIC0yMzMsNiArMjMzLDE0IEBAIHN0aWxsIGNhdXNlIHRoaXMgc2l0 dWF0aW9uLgo+ICAgICAgICAtIGBgcF9tcGVnMl9xdWFudGlzYXRpb25gYAo+ICAgICAgICAtIEEg cG9pbnRlciB0byBhIHN0cnVjdCA6Yzp0eXBlOmB2NGwyX2N0cmxfbXBlZzJfcXVhbnRpc2F0aW9u YC4gVmFsaWQgaWYgdGhpcyBjb250cm9sIGlzCj4gICAgICAgICAgb2YgdHlwZSBgYFY0TDJfQ1RS TF9UWVBFX01QRUcyX1FVQU5USVNBVElPTmBgLgo+ICsgICAgKiAtIHN0cnVjdCA6Yzp0eXBlOmB2 NGwyX2N0cmxfdnA5X2NvbXByZXNzZWRfaGRyX3Byb2JzYCAqCj4gKyAgICAgIC0gYGBwX3ZwOV9j b21wcmVzc2VkX2hkcl9wcm9ic2BgCj4gKyAgICAgIC0gQSBwb2ludGVyIHRvIGEgc3RydWN0IDpj OnR5cGU6YHY0bDJfY3RybF92cDlfY29tcHJlc3NlZF9oZHJfcHJvYnNgLiBWYWxpZCBpZiB0aGlz Cj4gKyAgICAgICAgY29udHJvbCBpcyBvZiB0eXBlIGBgVjRMMl9DVFJMX1RZUEVfVlA5X0NPTVBS RVNTRURfSERSX1BST0JTYGAuCj4gKyAgICAqIC0gc3RydWN0IDpjOnR5cGU6YHY0bDJfY3RybF92 cDlfZnJhbWVgICoKPiArICAgICAgLSBgYHBfdnA5X2ZyYW1lYGAKPiArICAgICAgLSBBIHBvaW50 ZXIgdG8gYSBzdHJ1Y3QgOmM6dHlwZTpgdjRsMl9jdHJsX3ZwOV9mcmFtZWAuIFZhbGlkIGlmIHRo aXMKPiArICAgICAgICBjb250cm9sIGlzIG9mIHR5cGUgYGBWNEwyX0NUUkxfVFlQRV9WUDlfRlJB TUVgYC4KPiAgICAgICogLSBzdHJ1Y3QgOmM6dHlwZTpgdjRsMl9jdHJsX2hkcjEwX2NsbF9pbmZv YCAqCj4gICAgICAgIC0gYGBwX2hkcjEwX2NsbGBgCj4gICAgICAgIC0gQSBwb2ludGVyIHRvIGEg c3RydWN0IDpjOnR5cGU6YHY0bDJfY3RybF9oZHIxMF9jbGxfaW5mb2AuIFZhbGlkIGlmIHRoaXMg Y29udHJvbCBpcwo+IGRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvbWVk aWEvdjRsL3ZpZGlvYy1xdWVyeWN0cmwucnN0IGIvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBp L21lZGlhL3Y0bC92aWRpb2MtcXVlcnljdHJsLnJzdAo+IGluZGV4IGY5ZWNmNjI3NjEyOS4uZTBj NmE1ZDlmZjZiIDEwMDY0NAo+IC0tLSBhL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRp YS92NGwvdmlkaW9jLXF1ZXJ5Y3RybC5yc3QKPiArKysgYi9Eb2N1bWVudGF0aW9uL3VzZXJzcGFj ZS1hcGkvbWVkaWEvdjRsL3ZpZGlvYy1xdWVyeWN0cmwucnN0Cj4gQEAgLTUwNyw2ICs1MDcsMTgg QEAgU2VlIGFsc28gdGhlIGV4YW1wbGVzIGluIDpyZWY6YGNvbnRyb2xgLgo+ICAgICAgICAtIG4v YQo+ICAgICAgICAtIEEgc3RydWN0IDpjOnR5cGU6YHY0bDJfY3RybF9oZXZjX2RlY29kZV9wYXJh bXNgLCBjb250YWluaW5nIEhFVkMKPiAgCWRlY29kaW5nIHBhcmFtZXRlcnMgZm9yIHN0YXRlbGVz cyB2aWRlbyBkZWNvZGVycy4KPiArICAgICogLSBgYFY0TDJfQ1RSTF9UWVBFX1ZQOV9DT01QUkVT U0VEX0hEUl9QUk9CU2BgCj4gKyAgICAgIC0gbi9hCj4gKyAgICAgIC0gbi9hCj4gKyAgICAgIC0g bi9hCj4gKyAgICAgIC0gQSBzdHJ1Y3QgOmM6dHlwZTpgdjRsMl9jdHJsX3ZwOV9jb21wcmVzc2Vk X2hkcl9wcm9ic2AsIGNvbnRhaW5pbmcgVlA5Cj4gKwlwcm9iYWJpbGl0aWVzIHVwZGF0ZXMgZm9y IHN0YXRlbGVzcyB2aWRlbyBkZWNvZGVycy4KPiArICAgICogLSBgYFY0TDJfQ1RSTF9UWVBFX1ZQ OV9GUkFNRWBgCj4gKyAgICAgIC0gbi9hCj4gKyAgICAgIC0gbi9hCj4gKyAgICAgIC0gbi9hCj4g KyAgICAgIC0gQSBzdHJ1Y3QgOmM6dHlwZTpgdjRsMl9jdHJsX3ZwOV9mcmFtZWAsIGNvbnRhaW5p bmcgVlA5Cj4gKwlmcmFtZSBkZWNvZGUgcGFyYW1ldGVycyBmb3Igc3RhdGVsZXNzIHZpZGVvIGRl Y29kZXJzLgo+ICAKPiAgLi4gcmF3OjogbGF0ZXgKPiAgCj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50 YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS92aWRlb2RldjIuaC5yc3QuZXhjZXB0aW9ucyBiL0Rv Y3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS92aWRlb2RldjIuaC5yc3QuZXhjZXB0aW9u cwo+IGluZGV4IGViMGIxY2QzN2FiZC4uMTI5ZWYzZWRmYTczIDEwMDY0NAo+IC0tLSBhL0RvY3Vt ZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS92aWRlb2RldjIuaC5yc3QuZXhjZXB0aW9ucwo+ ICsrKyBiL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS92aWRlb2RldjIuaC5yc3Qu ZXhjZXB0aW9ucwo+IEBAIC0xNDksNiArMTQ5LDggQEAgcmVwbGFjZSBzeW1ib2wgVjRMMl9DVFJM X1RZUEVfSEVWQ19TTElDRV9QQVJBTVMgOmM6dHlwZTpgdjRsMl9jdHJsX3R5cGVgCj4gIHJlcGxh Y2Ugc3ltYm9sIFY0TDJfQ1RSTF9UWVBFX0FSRUEgOmM6dHlwZTpgdjRsMl9jdHJsX3R5cGVgCj4g IHJlcGxhY2Ugc3ltYm9sIFY0TDJfQ1RSTF9UWVBFX0ZXSFRfUEFSQU1TIDpjOnR5cGU6YHY0bDJf Y3RybF90eXBlYAo+ICByZXBsYWNlIHN5bWJvbCBWNEwyX0NUUkxfVFlQRV9WUDhfRlJBTUUgOmM6 dHlwZTpgdjRsMl9jdHJsX3R5cGVgCj4gK3JlcGxhY2Ugc3ltYm9sIFY0TDJfQ1RSTF9UWVBFX1ZQ OV9DT01QUkVTU0VEX0hEUl9QUk9CUyA6Yzp0eXBlOmB2NGwyX2N0cmxfdHlwZWAKPiArcmVwbGFj ZSBzeW1ib2wgVjRMMl9DVFJMX1RZUEVfVlA5X0ZSQU1FIDpjOnR5cGU6YHY0bDJfY3RybF90eXBl YAo+ICByZXBsYWNlIHN5bWJvbCBWNEwyX0NUUkxfVFlQRV9IRFIxMF9DTExfSU5GTyA6Yzp0eXBl OmB2NGwyX2N0cmxfdHlwZWAKPiAgcmVwbGFjZSBzeW1ib2wgVjRMMl9DVFJMX1RZUEVfSERSMTBf TUFTVEVSSU5HX0RJU1BMQVkgOmM6dHlwZTpgdjRsMl9jdHJsX3R5cGVgCj4gIAo+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWN0cmxzLWNvcmUuYyBiL2RyaXZlcnMv bWVkaWEvdjRsMi1jb3JlL3Y0bDItY3RybHMtY29yZS5jCj4gaW5kZXggYzRiNTA4Mjg0OWI2Li5l ZDljZjI5OGE4M2EgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1j dHJscy1jb3JlLmMKPiArKysgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWN0cmxzLWNv cmUuYwo+IEBAIC0yODMsNiArMjgzLDEyIEBAIHN0YXRpYyB2b2lkIHN0ZF9sb2coY29uc3Qgc3Ry dWN0IHY0bDJfY3RybCAqY3RybCkKPiAgCWNhc2UgVjRMMl9DVFJMX1RZUEVfTVBFRzJfUElDVFVS RToKPiAgCQlwcl9jb250KCJNUEVHMl9QSUNUVVJFIik7Cj4gIAkJYnJlYWs7Cj4gKwljYXNlIFY0 TDJfQ1RSTF9UWVBFX1ZQOV9DT01QUkVTU0VEX0hEUl9QUk9CUzoKPiArCQlwcl9jb250KCJWUDlf Q09NUFJFU1NFRF9IRFJfUFJPQlMiKTsKPiArCQlicmVhazsKPiArCWNhc2UgVjRMMl9DVFJMX1RZ UEVfVlA5X0ZSQU1FOgo+ICsJCXByX2NvbnQoIlZQOV9GUkFNRSIpOwo+ICsJCWJyZWFrOwo+ICAJ ZGVmYXVsdDoKPiAgCQlwcl9jb250KCJ1bmtub3duIHR5cGUgJWQiLCBjdHJsLT50eXBlKTsKPiAg CQlicmVhazsKPiBAQCAtMzE3LDYgKzMyMywxNjIgQEAgc3RhdGljIHZvaWQgc3RkX2xvZyhjb25z dCBzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQo+ICAjZGVmaW5lIHplcm9fcmVzZXJ2ZWQocykgXAo+ ICAJbWVtc2V0KCYocykucmVzZXJ2ZWQsIDAsIHNpemVvZigocykucmVzZXJ2ZWQpKQo+ICAKPiAr c3RhdGljIGludAo+ICt2YWxpZGF0ZV92cDlfbGZfcGFyYW1zKHN0cnVjdCB2NGwyX3ZwOV9sb29w X2ZpbHRlciAqbGYpCj4gK3sKPiArCXVuc2lnbmVkIGludCBpOwo+ICsKPiArCWlmIChsZi0+Zmxh Z3MgJiB+KFY0TDJfVlA5X0xPT1BfRklMVEVSX0ZMQUdfREVMVEFfRU5BQkxFRCB8Cj4gKwkJCSAg VjRMMl9WUDlfTE9PUF9GSUxURVJfRkxBR19ERUxUQV9VUERBVEUpKQo+ICsJCXJldHVybiAtRUlO VkFMOwo+ICsKPiArCS8qIFRoYXQgYWxsIHZhbHVlcyBhcmUgaW4gdGhlIGFjY2VwdGVkIHJhbmdl LiAqLwo+ICsJaWYgKGxmLT5sZXZlbCA+IEdFTk1BU0soNSwgMCkpCj4gKwkJcmV0dXJuIC1FSU5W QUw7Cj4gKwo+ICsJaWYgKGxmLT5zaGFycG5lc3MgPiBHRU5NQVNLKDIsIDApKQo+ICsJCXJldHVy biAtRUlOVkFMOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxmLT5yZWZfZGVs dGFzKTsgaSsrKQo+ICsJCWlmIChsZi0+cmVmX2RlbHRhc1tpXSA8IC02MyB8fCBsZi0+cmVmX2Rl bHRhc1tpXSA+IDYzKQo+ICsJCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwlmb3IgKGkgPSAwOyBp IDwgQVJSQVlfU0laRShsZi0+bW9kZV9kZWx0YXMpOyBpKyspCj4gKwkJaWYgKGxmLT5tb2RlX2Rl bHRhc1tpXSA8IC02MyB8fCBsZi0+bW9kZV9kZWx0YXNbaV0gPiA2MykKPiArCQkJcmV0dXJuIC1F SU5WQUw7Cj4gKwo+ICsJemVyb19yZXNlcnZlZCgqbGYpOwo+ICsJcmV0dXJuIDA7Cj4gK30KPiAr Cj4gK3N0YXRpYyBpbnQKPiArdmFsaWRhdGVfdnA5X3F1YW50X3BhcmFtcyhzdHJ1Y3QgdjRsMl92 cDlfcXVhbnRpemF0aW9uICpxdWFudCkKPiArewo+ICsJaWYgKHF1YW50LT5kZWx0YV9xX3lfZGMg PCAtMTUgfHwgcXVhbnQtPmRlbHRhX3FfeV9kYyA+IDE1IHx8Cj4gKwkgICAgcXVhbnQtPmRlbHRh X3FfdXZfZGMgPCAtMTUgfHwgcXVhbnQtPmRlbHRhX3FfdXZfZGMgPiAxNSB8fAo+ICsJICAgIHF1 YW50LT5kZWx0YV9xX3V2X2FjIDwgLTE1IHx8IHF1YW50LT5kZWx0YV9xX3V2X2FjID4gMTUpCj4g KwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJemVyb19yZXNlcnZlZCgqcXVhbnQpOwo+ICsJcmV0 dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQKPiArdmFsaWRhdGVfdnA5X3NlZ19wYXJhbXMo c3RydWN0IHY0bDJfdnA5X3NlZ21lbnRhdGlvbiAqc2VnKQo+ICt7Cj4gKwl1bnNpZ25lZCBpbnQg aSwgajsKPiArCj4gKwlpZiAoc2VnLT5mbGFncyAmIH4oVjRMMl9WUDlfU0VHTUVOVEFUSU9OX0ZM QUdfRU5BQkxFRCB8Cj4gKwkJCSAgIFY0TDJfVlA5X1NFR01FTlRBVElPTl9GTEFHX1VQREFURV9N QVAgfAo+ICsJCQkgICBWNEwyX1ZQOV9TRUdNRU5UQVRJT05fRkxBR19URU1QT1JBTF9VUERBVEUg fAo+ICsJCQkgICBWNEwyX1ZQOV9TRUdNRU5UQVRJT05fRkxBR19VUERBVEVfREFUQSB8Cj4gKwkJ CSAgIFY0TDJfVlA5X1NFR01FTlRBVElPTl9GTEFHX0FCU19PUl9ERUxUQV9VUERBVEUpKQo+ICsJ CXJldHVybiAtRUlOVkFMOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNlZy0+ ZmVhdHVyZV9lbmFibGVkKTsgaSsrKSB7Cj4gKwkJaWYgKHNlZy0+ZmVhdHVyZV9lbmFibGVkW2ld ICYKPiArCQkgICAgflY0TDJfVlA5X1NFR01FTlRfRkVBVFVSRV9FTkFCTEVEX01BU0spCj4gKwkJ CXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpF KHNlZy0+ZmVhdHVyZV9kYXRhKTsgaSsrKSB7Cj4gKwkJY29uc3QgaW50IHJhbmdlW10gPSB7IDI1 NSwgNjMsIDMsIDAgfTsKPiArCj4gKwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUoc2VnLT5m ZWF0dXJlX2RhdGFbal0pOyBqKyspIHsKPiArCQkJaWYgKHNlZy0+ZmVhdHVyZV9kYXRhW2ldW2pd IDwgLXJhbmdlW2pdIHx8Cj4gKwkJCSAgICBzZWctPmZlYXR1cmVfZGF0YVtpXVtqXSA+IHJhbmdl W2pdKQo+ICsJCQkJcmV0dXJuIC1FSU5WQUw7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXplcm9fcmVz ZXJ2ZWQoKnNlZyk7Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludAo+ICt2YWxp ZGF0ZV92cDlfZnJhbWUoc3RydWN0IHY0bDJfY3RybF92cDlfZnJhbWUgKmZyYW1lKQo+ICt7Cj4g KwlpbnQgcmV0Owo+ICsKPiArCS8qIE1ha2Ugc3VyZSB3ZSdyZSBub3QgcGFzc2VkIGludmFsaWQg ZmxhZ3MuICovCj4gKwlpZiAoZnJhbWUtPmZsYWdzICYgfihWNEwyX1ZQOV9GUkFNRV9GTEFHX0tF WV9GUkFNRSB8Cj4gKwkJICBWNEwyX1ZQOV9GUkFNRV9GTEFHX1NIT1dfRlJBTUUgfAo+ICsJCSAg VjRMMl9WUDlfRlJBTUVfRkxBR19FUlJPUl9SRVNJTElFTlQgfAo+ICsJCSAgVjRMMl9WUDlfRlJB TUVfRkxBR19JTlRSQV9PTkxZIHwKPiArCQkgIFY0TDJfVlA5X0ZSQU1FX0ZMQUdfQUxMT1dfSElH SF9QUkVDX01WIHwKPiArCQkgIFY0TDJfVlA5X0ZSQU1FX0ZMQUdfUkVGUkVTSF9GUkFNRV9DVFgg fAo+ICsJCSAgVjRMMl9WUDlfRlJBTUVfRkxBR19QQVJBTExFTF9ERUNfTU9ERSB8Cj4gKwkJICBW NEwyX1ZQOV9GUkFNRV9GTEFHX1hfU1VCU0FNUExJTkcgfAo+ICsJCSAgVjRMMl9WUDlfRlJBTUVf RkxBR19ZX1NVQlNBTVBMSU5HIHwKPiArCQkgIFY0TDJfVlA5X0ZSQU1FX0ZMQUdfQ09MT1JfUkFO R0VfRlVMTF9TV0lORykpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJaWYgKGZyYW1lLT5m bGFncyAmIFY0TDJfVlA5X0ZSQU1FX0ZMQUdfRVJST1JfUkVTSUxJRU5UICYmCj4gKwkgICAgZnJh bWUtPmZsYWdzICYgVjRMMl9WUDlfRlJBTUVfRkxBR19SRUZSRVNIX0ZSQU1FX0NUWCkKPiArCQly ZXR1cm4gLUVJTlZBTDsKPiArCj4gKwlpZiAoZnJhbWUtPnByb2ZpbGUgPiBWNEwyX1ZQOV9QUk9G SUxFX01BWCkKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwlpZiAoZnJhbWUtPnJlc2V0X2Zy YW1lX2NvbnRleHQgPiBWNEwyX1ZQOV9SRVNFVF9GUkFNRV9DVFhfQUxMKQo+ICsJCXJldHVybiAt RUlOVkFMOwo+ICsKPiArCWlmIChmcmFtZS0+ZnJhbWVfY29udGV4dF9pZHggPj0gVjRMMl9WUDlf TlVNX0ZSQU1FX0NUWCkKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwkvKgo+ICsJICogUHJv ZmlsZXMgMCBhbmQgMSBvbmx5IHN1cHBvcnQgOC1iaXQgZGVwdGgsIHByb2ZpbGVzIDIgYW5kIDMg b25seSAxMAo+ICsJICogYW5kIDEyIGJpdCBkZXB0aHMuCj4gKwkgKi8KPiArCWlmICgoZnJhbWUt PnByb2ZpbGUgPCAyICYmIGZyYW1lLT5iaXRfZGVwdGggIT0gOCkgfHwKPiArCSAgICAoZnJhbWUt PnByb2ZpbGUgPj0gMiAmJgo+ICsJICAgICAoZnJhbWUtPmJpdF9kZXB0aCAhPSAxMCAmJiBmcmFt ZS0+Yml0X2RlcHRoICE9IDEyKSkpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJLyogUHJv ZmlsZSAwIGFuZCAyIG9ubHkgYWNjZXB0IFlVViA0OjI6MC4gKi8KPiArCWlmICgoZnJhbWUtPnBy b2ZpbGUgPT0gMCB8fCBmcmFtZS0+cHJvZmlsZSA9PSAyKSAmJgo+ICsJICAgICghKGZyYW1lLT5m bGFncyAmIFY0TDJfVlA5X0ZSQU1FX0ZMQUdfWF9TVUJTQU1QTElORykgfHwKPiArCSAgICAgIShm cmFtZS0+ZmxhZ3MgJiBWNEwyX1ZQOV9GUkFNRV9GTEFHX1lfU1VCU0FNUExJTkcpKSkKPiArCQly ZXR1cm4gLUVJTlZBTDsKPiArCj4gKwkvKiBQcm9maWxlIDEgYW5kIDMgb25seSBhY2NlcHQgWVVW IDQ6MjoyLCA0OjQ6MCBhbmQgNDo0OjQuICovCj4gKwlpZiAoKGZyYW1lLT5wcm9maWxlID09IDEg fHwgZnJhbWUtPnByb2ZpbGUgPT0gMykgJiYKPiArCSAgICAoKGZyYW1lLT5mbGFncyAmIFY0TDJf VlA5X0ZSQU1FX0ZMQUdfWF9TVUJTQU1QTElORykgJiYKPiArCSAgICAgKGZyYW1lLT5mbGFncyAm IFY0TDJfVlA5X0ZSQU1FX0ZMQUdfWV9TVUJTQU1QTElORykpKQo+ICsJCXJldHVybiAtRUlOVkFM Owo+ICsKPiArCWlmIChmcmFtZS0+aW50ZXJwb2xhdGlvbl9maWx0ZXIgPiBWNEwyX1ZQOV9JTlRF UlBfRklMVEVSX1NXSVRDSEFCTEUpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJLyoKPiAr CSAqIEFjY29yZGluZyB0byB0aGUgc3BlYywgdGlsZV9jb2xzX2xvZzIgc2hhbGwgYmUgbGVzcyB0 aGFuIG9yIGVxdWFsCj4gKwkgKiB0byA2Lgo+ICsJICovCj4gKwlpZiAoZnJhbWUtPnRpbGVfY29s c19sb2cyID4gNikKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwlpZiAoZnJhbWUtPnR4X21v ZGUgPiBWNEwyX1ZQOV9UWF9NT0RFX1NFTEVDVCkKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4g KwlpZiAoZnJhbWUtPnJlZmVyZW5jZV9tb2RlID4gVjRMMl9WUDlfUkVGRVJFTkNFX01PREVfU0VM RUNUKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCXJldCA9IHZhbGlkYXRlX3ZwOV9sZl9w YXJhbXMoJmZyYW1lLT5sZik7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJ cmV0ID0gdmFsaWRhdGVfdnA5X3F1YW50X3BhcmFtcygmZnJhbWUtPnF1YW50KTsKPiArCWlmIChy ZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwlyZXQgPSB2YWxpZGF0ZV92cDlfc2VnX3BhcmFt cygmZnJhbWUtPnNlZyk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJemVy b19yZXNlcnZlZCgqZnJhbWUpOwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gIC8qCj4gICAqIENv bXBvdW5kIGNvbnRyb2xzIHZhbGlkYXRpb24gcmVxdWlyZXMgc2V0dGluZyB1bnVzZWQgZmllbGRz L2ZsYWdzIHRvIHplcm8KPiAgICogaW4gb3JkZXIgdG8gcHJvcGVybHkgZGV0ZWN0IHVuY2hhbmdl ZCBjb250cm9scyB3aXRoIHN0ZF9lcXVhbCdzIG1lbWNtcC4KPiBAQCAtNjg3LDYgKzg0OSwxMiBA QCBzdGF0aWMgaW50IHN0ZF92YWxpZGF0ZV9jb21wb3VuZChjb25zdCBzdHJ1Y3QgdjRsMl9jdHJs ICpjdHJsLCB1MzIgaWR4LAo+ICAKPiAgCQlicmVhazsKPiAgCj4gKwljYXNlIFY0TDJfQ1RSTF9U WVBFX1ZQOV9DT01QUkVTU0VEX0hEUl9QUk9CUzoKPiArCQlicmVhazsKPiArCj4gKwljYXNlIFY0 TDJfQ1RSTF9UWVBFX1ZQOV9GUkFNRToKPiArCQlyZXR1cm4gdmFsaWRhdGVfdnA5X2ZyYW1lKHAp Owo+ICsKPiAgCWNhc2UgVjRMMl9DVFJMX1RZUEVfQVJFQToKPiAgCQlhcmVhID0gcDsKPiAgCQlp ZiAoIWFyZWEtPndpZHRoIHx8ICFhcmVhLT5oZWlnaHQpCj4gQEAgLTEyNDksNiArMTQxNywxMiBA QCBzdGF0aWMgc3RydWN0IHY0bDJfY3RybCAqdjRsMl9jdHJsX25ldyhzdHJ1Y3QgdjRsMl9jdHJs X2hhbmRsZXIgKmhkbCwKPiAgCWNhc2UgVjRMMl9DVFJMX1RZUEVfSERSMTBfTUFTVEVSSU5HX0RJ U1BMQVk6Cj4gIAkJZWxlbV9zaXplID0gc2l6ZW9mKHN0cnVjdCB2NGwyX2N0cmxfaGRyMTBfbWFz dGVyaW5nX2Rpc3BsYXkpOwo+ICAJCWJyZWFrOwo+ICsJY2FzZSBWNEwyX0NUUkxfVFlQRV9WUDlf Q09NUFJFU1NFRF9IRFJfUFJPQlM6Cj4gKwkJZWxlbV9zaXplID0gc2l6ZW9mKHN0cnVjdCB2NGwy X2N0cmxfdnA5X2NvbXByZXNzZWRfaGRyX3Byb2JzKTsKPiArCQlicmVhazsKPiArCWNhc2UgVjRM Ml9DVFJMX1RZUEVfVlA5X0ZSQU1FOgo+ICsJCWVsZW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdjRs Ml9jdHJsX3ZwOV9mcmFtZSk7Cj4gKwkJYnJlYWs7Cj4gIAljYXNlIFY0TDJfQ1RSTF9UWVBFX0FS RUE6Cj4gIAkJZWxlbV9zaXplID0gc2l6ZW9mKHN0cnVjdCB2NGwyX2FyZWEpOwo+ICAJCWJyZWFr Owo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWN0cmxzLWRlZnMu YyBiL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItY3RybHMtZGVmcy5jCj4gaW5kZXggNDIx MzAwZTEzYTQxLi5kMzgzYzQzODE1NmYgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tZWRpYS92NGwy LWNvcmUvdjRsMi1jdHJscy1kZWZzLmMKPiArKysgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92 NGwyLWN0cmxzLWRlZnMuYwo+IEBAIC0xMTc1LDYgKzExNzUsOCBAQCBjb25zdCBjaGFyICp2NGwy X2N0cmxfZ2V0X25hbWUodTMyIGlkKQo+ICAJY2FzZSBWNEwyX0NJRF9TVEFURUxFU1NfTVBFRzJf U0VRVUVOQ0U6CQkJcmV0dXJuICJNUEVHLTIgU2VxdWVuY2UgSGVhZGVyIjsKPiAgCWNhc2UgVjRM Ml9DSURfU1RBVEVMRVNTX01QRUcyX1BJQ1RVUkU6CQkJcmV0dXJuICJNUEVHLTIgUGljdHVyZSBI ZWFkZXIiOwo+ICAJY2FzZSBWNEwyX0NJRF9TVEFURUxFU1NfTVBFRzJfUVVBTlRJU0FUSU9OOgkJ cmV0dXJuICJNUEVHLTIgUXVhbnRpc2F0aW9uIE1hdHJpY2VzIjsKPiArCWNhc2UgVjRMMl9DSURf U1RBVEVMRVNTX1ZQOV9DT01QUkVTU0VEX0hEUl9QUk9CUzoJcmV0dXJuICJWUDkgUHJvYmFiaWxp dGllcyBVcGRhdGVzIjsKPiArCWNhc2UgVjRMMl9DSURfU1RBVEVMRVNTX1ZQOV9GUkFNRToJCQly ZXR1cm4gIlZQOSBGcmFtZSBEZWNvZGUgUGFyYW1ldGVycyI7Cj4gIAo+ICAJLyogQ29sb3JpbWV0 cnkgY29udHJvbHMgKi8KPiAgCS8qIEtlZXAgdGhlIG9yZGVyIG9mIHRoZSAnY2FzZSdzIHRoZSBz YW1lIGFzIGluIHY0bDItY29udHJvbHMuaCEgKi8KPiBAQCAtMTQ5Myw2ICsxNDk1LDEyIEBAIHZv aWQgdjRsMl9jdHJsX2ZpbGwodTMyIGlkLCBjb25zdCBjaGFyICoqbmFtZSwgZW51bSB2NGwyX2N0 cmxfdHlwZSAqdHlwZSwKPiAgCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IRVZDX0RFQ09ERV9Q QVJBTVM6Cj4gIAkJKnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9IRVZDX0RFQ09ERV9QQVJBTVM7Cj4g IAkJYnJlYWs7Cj4gKwljYXNlIFY0TDJfQ0lEX1NUQVRFTEVTU19WUDlfQ09NUFJFU1NFRF9IRFJf UFJPQlM6Cj4gKwkJKnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9WUDlfQ09NUFJFU1NFRF9IRFJfUFJP QlM7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIFY0TDJfQ0lEX1NUQVRFTEVTU19WUDlfRlJBTUU6Cj4g KwkJKnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9WUDlfRlJBTUU7Cj4gKwkJYnJlYWs7Cj4gIAljYXNl IFY0TDJfQ0lEX1VOSVRfQ0VMTF9TSVpFOgo+ICAJCSp0eXBlID0gVjRMMl9DVFJMX1RZUEVfQVJF QTsKPiAgCQkqZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfUkVBRF9PTkxZOwo+IGRpZmYgLS1naXQg YS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWlvY3RsLmMgYi9kcml2ZXJzL21lZGlhL3Y0 bDItY29yZS92NGwyLWlvY3RsLmMKPiBpbmRleCBlYzZmYzFlZjI5MWUuLjdhNWU4MTIwZDczMyAx MDA2NDQKPiAtLS0gYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWlvY3RsLmMKPiArKysg Yi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWlvY3RsLmMKPiBAQCAtMTM5NCw2ICsxMzk0 LDcgQEAgc3RhdGljIHZvaWQgdjRsX2ZpbGxfZm10ZGVzYyhzdHJ1Y3QgdjRsMl9mbXRkZXNjICpm bXQpCj4gIAkJY2FzZSBWNEwyX1BJWF9GTVRfVlA4OgkJZGVzY3IgPSAiVlA4IjsgYnJlYWs7Cj4g IAkJY2FzZSBWNEwyX1BJWF9GTVRfVlA4X0ZSQU1FOiAgICBkZXNjciA9ICJWUDggRnJhbWUiOyBi cmVhazsKPiAgCQljYXNlIFY0TDJfUElYX0ZNVF9WUDk6CQlkZXNjciA9ICJWUDkiOyBicmVhazsK PiArCQljYXNlIFY0TDJfUElYX0ZNVF9WUDlfRlJBTUU6ICAgIGRlc2NyID0gIlZQOSBGcmFtZSI7 IGJyZWFrOwo+ICAJCWNhc2UgVjRMMl9QSVhfRk1UX0hFVkM6CQlkZXNjciA9ICJIRVZDIjsgYnJl YWs7IC8qIGFrYSBILjI2NSAqLwo+ICAJCWNhc2UgVjRMMl9QSVhfRk1UX0hFVkNfU0xJQ0U6CWRl c2NyID0gIkhFVkMgUGFyc2VkIFNsaWNlIERhdGEiOyBicmVhazsKPiAgCQljYXNlIFY0TDJfUElY X0ZNVF9GV0hUOgkJZGVzY3IgPSAiRldIVCI7IGJyZWFrOyAvKiB1c2VkIGluIHZpY29kZWMgKi8K PiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWN0cmxzLmggYi9pbmNsdWRlL21lZGlh L3Y0bDItY3RybHMuaAo+IGluZGV4IDU3NWI1OWZiYWM3Ny4uM2VhNDM4NmViZDkxIDEwMDY0NAo+ IC0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1jdHJscy5oCj4gKysrIGIvaW5jbHVkZS9tZWRpYS92 NGwyLWN0cmxzLmgKPiBAQCAtNTAsNiArNTAsOCBAQCBzdHJ1Y3QgdmlkZW9fZGV2aWNlOwo+ICAg KiBAcF9oMjY0X2RlY29kZV9wYXJhbXM6CVBvaW50ZXIgdG8gYSBzdHJ1Y3QgdjRsMl9jdHJsX2gy NjRfZGVjb2RlX3BhcmFtcy4KPiAgICogQHBfaDI2NF9wcmVkX3dlaWdodHM6CVBvaW50ZXIgdG8g YSBzdHJ1Y3QgdjRsMl9jdHJsX2gyNjRfcHJlZF93ZWlnaHRzLgo+ICAgKiBAcF92cDhfZnJhbWU6 CQlQb2ludGVyIHRvIGEgVlA4IGZyYW1lIHBhcmFtcyBzdHJ1Y3R1cmUuCj4gKyAqIEBwX3ZwOV9j b21wcmVzc2VkX2hkcl9wcm9iczoJUG9pbnRlciB0byBhIFZQOSBmcmFtZSBjb21wcmVzc2VkIGhl YWRlciBwcm9icyBzdHJ1Y3R1cmUuCj4gKyAqIEBwX3ZwOV9mcmFtZToJCVBvaW50ZXIgdG8gYSBW UDkgZnJhbWUgcGFyYW1zIHN0cnVjdHVyZS4KPiAgICogQHBfaGV2Y19zcHM6CQkJUG9pbnRlciB0 byBhbiBIRVZDIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgc3RydWN0dXJlLgo+ICAgKiBAcF9oZXZj X3BwczoJCQlQb2ludGVyIHRvIGFuIEhFVkMgcGljdHVyZSBwYXJhbWV0ZXIgc2V0IHN0cnVjdHVy ZS4KPiAgICogQHBfaGV2Y19zbGljZV9wYXJhbXM6CVBvaW50ZXIgdG8gYW4gSEVWQyBzbGljZSBw YXJhbWV0ZXJzIHN0cnVjdHVyZS4KPiBAQCAtODAsNiArODIsOCBAQCB1bmlvbiB2NGwyX2N0cmxf cHRyIHsKPiAgCXN0cnVjdCB2NGwyX2N0cmxfaGV2Y19zcHMgKnBfaGV2Y19zcHM7Cj4gIAlzdHJ1 Y3QgdjRsMl9jdHJsX2hldmNfcHBzICpwX2hldmNfcHBzOwo+ICAJc3RydWN0IHY0bDJfY3RybF9o ZXZjX3NsaWNlX3BhcmFtcyAqcF9oZXZjX3NsaWNlX3BhcmFtczsKPiArCXN0cnVjdCB2NGwyX2N0 cmxfdnA5X2NvbXByZXNzZWRfaGRyX3Byb2JzICpwX3ZwOV9jb21wcmVzc2VkX2hkcl9wcm9iczsK PiArCXN0cnVjdCB2NGwyX2N0cmxfdnA5X2ZyYW1lICpwX3ZwOV9mcmFtZTsKPiAgCXN0cnVjdCB2 NGwyX2N0cmxfaGRyMTBfY2xsX2luZm8gKnBfaGRyMTBfY2xsOwo+ICAJc3RydWN0IHY0bDJfY3Ry bF9oZHIxMF9tYXN0ZXJpbmdfZGlzcGxheSAqcF9oZHIxMF9tYXN0ZXJpbmc7Cj4gIAlzdHJ1Y3Qg djRsMl9hcmVhICpwX2FyZWE7Cj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC92NGwy LWNvbnRyb2xzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdjRsMi1jb250cm9scy5oCj4gaW5kZXgg NTUzMmI1ZjY4NDkzLi44ZjhjM2MxYWQ4ODUgMTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS91YXBpL2xp bnV4L3Y0bDItY29udHJvbHMuaAo+ICsrKyBiL2luY2x1ZGUvdWFwaS9saW51eC92NGwyLWNvbnRy b2xzLmgKPiBAQCAtMjAxMCw2ICsyMDEwLDQzOSBAQCBzdHJ1Y3QgdjRsMl9jdHJsX2hkcjEwX21h c3RlcmluZ19kaXNwbGF5IHsKPiAgCV9fdTMyIG1pbl9kaXNwbGF5X21hc3RlcmluZ19sdW1pbmFu Y2U7Cj4gIH07Cj4gIAo+ICsvKiBTdGF0ZWxlc3MgVlA5IGNvbnRyb2xzICovCj4gKwo+ICsvKioK PiArICogZW51bSB2NGwyX3ZwOV9sb29wX2ZpbHRlcl9mbGFncyAtIFZQOSBsb29wIGZpbHRlciBm bGFncwo+ICsgKgo+ICsgKiBAVjRMMl9WUDlfTE9PUF9GSUxURVJfRkxBR19ERUxUQV9FTkFCTEVE OiB0aGUgZmlsdGVyIGxldmVsIGRlcGVuZHMgb24KPiArICoJdGhlIG1vZGUgYW5kIHJlZmVyZW5j ZSBmcmFtZSB1c2VkIHRvIHByZWRpY3QgYSBibG9jawo+ICsgKiBAVjRMMl9WUDlfTE9PUF9GSUxU RVJfRkxBR19ERUxUQV9VUERBVEU6IHRoZSBiaXRzdHJlYW0gY29udGFpbnMgYWRkaXRpb25hbAo+ ICsgKglzeW50YXggZWxlbWVudHMgdGhhdCBzcGVjaWZ5IHdoaWNoIG1vZGUgYW5kIHJlZmVyZW5j ZSBmcmFtZSBkZWx0YXMgYXJlIHRvIGJlIHVwZGF0ZWQKPiArICoKPiArICogVGhvc2UgYXJlIHRo ZSBmbGFncyB0aGF0IG1heSBiZSBwYXNzZWQgdG8gJnY0bDJfdnA5X2xvb3BfZmlsdGVyLmZsYWdz LiBTZWUKPiArICogc2VjdGlvbiAnNy4yLjggTG9vcCBmaWx0ZXIgc2VtYW50aWNzJyBvZiB0aGUg VlA5IHNwZWNpZmljYXRpb24gZm9yIG1vcmUKPiArICogZGV0YWlscy4KPiArICovCj4gK2VudW0g djRsMl92cDlfbG9vcF9maWx0ZXJfZmxhZ3Mgewo+ICsJVjRMMl9WUDlfTE9PUF9GSUxURVJfRkxB R19ERUxUQV9FTkFCTEVEID0gMSA8PCAwLAo+ICsJVjRMMl9WUDlfTE9PUF9GSUxURVJfRkxBR19E RUxUQV9VUERBVEUgPSAxIDw8IDEsCj4gK307Cj4gKwo+ICsvKioKPiArICogc3RydWN0IHY0bDJf dnA5X2xvb3BfZmlsdGVyIC0gVlA5IGxvb3AgZmlsdGVyIHBhcmFtZXRlcnMKPiArICoKPiArICog QHJlZl9kZWx0YXM6IGNvbnRhaW5zIHRoZSBhZGp1c3RtZW50IG5lZWRlZCBmb3IgdGhlIGZpbHRl ciBsZXZlbCBiYXNlZCBvbiB0aGUgY2hvc2VuCj4gKyAqCXJlZmVyZW5jZSBmcmFtZS4gSWYgdGhp cyBzeW50YXggZWxlbWVudCBpcyBub3QgcHJlc2VudCBpbiB0aGUgYml0c3RyZWFtLCB1c2Vycwo+ ICsgKglzaG91bGQgcGFzcyBpdHMgbGFzdCB2YWx1ZS4KPiArICogQG1vZGVfZGVsdGFzOiBjb250 YWlucyB0aGUgYWRqdXN0bWVudCBuZWVkZWQgZm9yIHRoZSBmaWx0ZXIgbGV2ZWwgYmFzZWQgb24g dGhlIGNob3NlbiBtb2RlLgo+ICsgKglJZiB0aGlzIHN5bnRheCBlbGVtZW50IGlzIG5vdCBwcmVz ZW50IGluIHRoZSBiaXRzdHJlYW0sIHVzZXJzCj4gKyAqCXNob3VsZCBwYXNzIGl0cyBsYXN0IHZh bHVlLgo+ICsgKiBAbGV2ZWw6IGluZGljYXRlcyB0aGUgbG9vcCBmaWx0ZXIgc3RyZW5ndGgKPiAr ICogQHNoYXJwbmVzczogaW5kaWNhdGVzIHRoZSBzaGFycG5lc3MgbGV2ZWwKPiArICogQGZsYWdz OiBjb21iaW5hdGlvbiBvZiBWNEwyX1ZQOV9MT09QX0ZJTFRFUl9GTEFHXyogZmxhZ3MKPiArICog QHJlc2VydmVkOiBwYWRkaW5nIGZpZWxkLiBTaG91bGQgYmUgemVyb2VkIGJ5IGFwcGxpY2F0aW9u cy4KPiArICoKPiArICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgYWxsIGxvb3AgZmlsdGVyIHJl bGF0ZWQgcGFyYW1ldGVycy4gU2VlIHNlY3Rpb25zCj4gKyAqICc3LjIuOCBMb29wIGZpbHRlciBz ZW1hbnRpY3MnIG9mIHRoZSBWUDkgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgo+ICsg Ki8KPiArc3RydWN0IHY0bDJfdnA5X2xvb3BfZmlsdGVyIHsKPiArCV9fczggcmVmX2RlbHRhc1s0 XTsKPiArCV9fczggbW9kZV9kZWx0YXNbMl07Cj4gKwlfX3U4IGxldmVsOwo+ICsJX191OCBzaGFy cG5lc3M7Cj4gKwlfX3U4IGZsYWdzOwo+ICsJX191OCByZXNlcnZlZFs3XTsKPiArfTsKPiArCj4g Ky8qKgo+ICsgKiBzdHJ1Y3QgdjRsMl92cDlfcXVhbnRpemF0aW9uIC0gVlA5IHF1YW50aXphdGlv biBwYXJhbWV0ZXJzCj4gKyAqCj4gKyAqIEBiYXNlX3FfaWR4OiBpbmRpY2F0ZXMgdGhlIGJhc2Ug ZnJhbWUgcWluZGV4Cj4gKyAqIEBkZWx0YV9xX3lfZGM6IGluZGljYXRlcyB0aGUgWSBEQyBxdWFu dGl6ZXIgcmVsYXRpdmUgdG8gYmFzZV9xX2lkeAo+ICsgKiBAZGVsdGFfcV91dl9kYzogaW5kaWNh dGVzIHRoZSBVViBEQyBxdWFudGl6ZXIgcmVsYXRpdmUgdG8gYmFzZV9xX2lkeAo+ICsgKiBAZGVs dGFfcV91dl9hYzogaW5kaWNhdGVzIHRoZSBVViBBQyBxdWFudGl6ZXIgcmVsYXRpdmUgdG8gYmFz ZV9xX2lkeAo+ICsgKiBAcmVzZXJ2ZWQ6IHBhZGRpbmcgZmllbGQuIFNob3VsZCBiZSB6ZXJvZWQg YnkgYXBwbGljYXRpb25zLgo+ICsgKgo+ICsgKiBFbmNvZGVzIHRoZSBxdWFudGl6YXRpb24gcGFy YW1ldGVycy4gU2VlIHNlY3Rpb24gJzcuMi45IFF1YW50aXphdGlvbiBwYXJhbXMKPiArICogc3lu dGF4JyBvZiB0aGUgVlA5IHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4KPiArICovCj4g K3N0cnVjdCB2NGwyX3ZwOV9xdWFudGl6YXRpb24gewo+ICsJX191OCBiYXNlX3FfaWR4Owo+ICsJ X19zOCBkZWx0YV9xX3lfZGM7Cj4gKwlfX3M4IGRlbHRhX3FfdXZfZGM7Cj4gKwlfX3M4IGRlbHRh X3FfdXZfYWM7Cj4gKwlfX3U4IHJlc2VydmVkWzRdOwo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIGVu dW0gdjRsMl92cDlfc2VnbWVudGF0aW9uX2ZsYWdzIC0gVlA5IHNlZ21lbnRhdGlvbiBmbGFncwo+ ICsgKgo+ICsgKiBAVjRMMl9WUDlfU0VHTUVOVEFUSU9OX0ZMQUdfRU5BQkxFRDogaW5kaWNhdGVz IHRoYXQgdGhpcyBmcmFtZSBtYWtlcyB1c2Ugb2YKPiArICoJdGhlIHNlZ21lbnRhdGlvbiB0b29s Cj4gKyAqIEBWNEwyX1ZQOV9TRUdNRU5UQVRJT05fRkxBR19VUERBVEVfTUFQOiBpbmRpY2F0ZXMg dGhhdCB0aGUgc2VnbWVudGF0aW9uIG1hcAo+ICsgKglzaG91bGQgYmUgdXBkYXRlZCBkdXJpbmcg dGhlIGRlY29kaW5nIG9mIHRoaXMgZnJhbWUKPiArICogQFY0TDJfVlA5X1NFR01FTlRBVElPTl9G TEFHX1RFTVBPUkFMX1VQREFURTogaW5kaWNhdGVzIHRoYXQgdGhlIHVwZGF0ZXMgdG8KPiArICoJ dGhlIHNlZ21lbnRhdGlvbiBtYXAgYXJlIGNvZGVkIHJlbGF0aXZlIHRvIHRoZSBleGlzdGluZyBz ZWdtZW50YXRpb24gbWFwCj4gKyAqIEBWNEwyX1ZQOV9TRUdNRU5UQVRJT05fRkxBR19VUERBVEVf REFUQTogaW5kaWNhdGVzIHRoYXQgbmV3IHBhcmFtZXRlcnMgYXJlCj4gKyAqCWFib3V0IHRvIGJl IHNwZWNpZmllZCBmb3IgZWFjaCBzZWdtZW50Cj4gKyAqIEBWNEwyX1ZQOV9TRUdNRU5UQVRJT05f RkxBR19BQlNfT1JfREVMVEFfVVBEQVRFOiBpbmRpY2F0ZXMgdGhhdCB0aGUKPiArICoJc2VnbWVu dGF0aW9uIHBhcmFtZXRlcnMgcmVwcmVzZW50IHRoZSBhY3R1YWwgdmFsdWVzIHRvIGJlIHVzZWQK PiArICoKPiArICogVGhvc2UgYXJlIHRoZSBmbGFncyB0aGF0IG1heSBiZSBwYXNzZWQgdG8gJnY0 bDJfdnA5X3NlZ21lbnRhdGlvbi5mbGFncy4gU2VlCj4gKyAqIHNlY3Rpb24gJzcuMi4xMCBTZWdt ZW50YXRpb24gcGFyYW1zIHN5bnRheCcgb2YgdGhlIFZQOSBzcGVjaWZpY2F0aW9uIGZvcgo+ICsg KiBtb3JlIGRldGFpbHMuCj4gKyAqLwo+ICtlbnVtIHY0bDJfdnA5X3NlZ21lbnRhdGlvbl9mbGFn cyB7Cj4gKwlWNEwyX1ZQOV9TRUdNRU5UQVRJT05fRkxBR19FTkFCTEVEID0gMSA8PCAwLAo+ICsJ VjRMMl9WUDlfU0VHTUVOVEFUSU9OX0ZMQUdfVVBEQVRFX01BUCA9IDEgPDwgMSwKPiArCVY0TDJf VlA5X1NFR01FTlRBVElPTl9GTEFHX1RFTVBPUkFMX1VQREFURSA9IDEgPDwgMiwKPiArCVY0TDJf VlA5X1NFR01FTlRBVElPTl9GTEFHX1VQREFURV9EQVRBID0gMSA8PCAzLAo+ICsJVjRMMl9WUDlf U0VHTUVOVEFUSU9OX0ZMQUdfQUJTX09SX0RFTFRBX1VQREFURSA9IDEgPDwgNCwKPiArfTsKPiAr Cj4gKyNkZWZpbmUgVjRMMl9WUDlfU0VHTUVOVF9GRUFUVVJFX0VOQUJMRUQoaWQpCSgxIDw8IChp ZCkpCj4gKyNkZWZpbmUgVjRMMl9WUDlfU0VHTUVOVF9GRUFUVVJFX0VOQUJMRURfTUFTSwkweGYK PiArCj4gKy8qKgo+ICsgKiBlbnVtIHY0bDJfdnA5X3NlZ21lbnRfZmVhdHVyZSAtIFZQOSBzZWdt ZW50IGZlYXR1cmUgSURzCj4gKyAqCj4gKyAqIEBWNEwyX1ZQOV9TRUdfTFZMX0FMVF9ROiBxdWFu dGl6ZXIgc2VnbWVudCBmZWF0dXJlCj4gKyAqIEBWNEwyX1ZQOV9TRUdfTFZMX0FMVF9MOiBsb29w IGZpbHRlciBzZWdtZW50IGZlYXR1cmUKPiArICogQFY0TDJfVlA5X1NFR19MVkxfUkVGX0ZSQU1F IHJlZmVyZW5jZSBmcmFtZSBzZWdtZW50IGZlYXR1cmUKPiArICogQFY0TDJfVlA5X1NFR19MVkxf U0tJUDogc2tpcCBzZWdtZW50IGZlYXR1cmUKPiArICogQFY0TDJfVlA5X1NFR19MVlZfTUFYOiBu dW1iZXIgb2Ygc2VnbWVudCBmZWF0dXJlcwo+ICsgKgo+ICsgKiBTZWdtZW50IGZlYXR1cmUgSURz LiBTZWUgc2VjdGlvbiAnNy4yLjEwIFNlZ21lbnRhdGlvbiBwYXJhbXMgc3ludGF4JyBvZiB0aGUK PiArICogVlA5IHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4KPiArICovCj4gK2VudW0g djRsMl92cDlfc2VnbWVudF9mZWF0dXJlIHsKPiArCVY0TDJfVlA5X1NFR19MVkxfQUxUX1EsCj4g KwlWNEwyX1ZQOV9TRUdfTFZMX0FMVF9MLAo+ICsJVjRMMl9WUDlfU0VHX0xWTF9SRUZfRlJBTUUs Cj4gKwlWNEwyX1ZQOV9TRUdfTFZMX1NLSVAsCj4gKwlWNEwyX1ZQOV9TRUdfTFZMX01BWCwKPiAr fTsKPiArCj4gKy8qKgo+ICsgKiBzdHJ1Y3QgdjRsMl92cDlfc2VnbWVudGF0aW9uIC0gVlA5IHNl Z21lbnRhdGlvbiBwYXJhbWV0ZXJzCj4gKyAqCj4gKyAqIEBmZWF0dXJlX2RhdGE6IGRhdGEgYXR0 YWNoZWQgdG8gZWFjaCBmZWF0dXJlLiBEYXRhIGVudHJ5IGlzIG9ubHkgdmFsaWQgaWYgdGhlIGZl YXR1cmUgaXMgZW5hYmxlZAo+ICsgKiBAZmVhdHVyZV9lbmFibGVkOiBiaXRtYXNrIGRlZmluaW5n IHdoaWNoIGZlYXR1cmVzIGFyZSBlbmFibGVkIGluIGVhY2ggc2VnbWVudAo+ICsgKiBAdHJlZV9w cm9iczogc3BlY2lmaWVzIHRoZSBwcm9iYWJpbGl0eSB2YWx1ZXMgdG8gYmUgdXNlZCB3aGVuCj4g KyAqCWRlY29kaW5nIGEgU2VnbWVudC1JRC4gU2VlICc1LjE1LiBTZWdtZW50YXRpb24gbWFwJyBz ZWN0aW9uIG9mIHRoZSBWUDkgc3BlY2lmaWNhdGlvbgo+ICsgKglmb3IgbW9yZSBkZXRhaWxzLgo+ ICsgKiBAcHJlZF9wcm9iczogc3BlY2lmaWVzIHRoZSBwcm9iYWJpbGl0eSB2YWx1ZXMgdG8gYmUg dXNlZCB3aGVuIGRlY29kaW5nIGEKPiArICoJUHJlZGljdGVkLVNlZ21lbnQtSUQuIFNlZSAnNi40 LjE0LiBHZXQgc2VnbWVudCBpZCBzeW50YXgnIHNlY3Rpb24gb2YgOnJlZjpgdnA5YAo+ICsgKglm b3IgbW9yZSBkZXRhaWxzLgo+ICsgKiBAZmxhZ3M6IGNvbWJpbmF0aW9uIG9mIFY0TDJfVlA5X1NF R01FTlRBVElPTl9GTEFHXyogZmxhZ3MKPiArICogQHJlc2VydmVkOiBwYWRkaW5nIGZpZWxkLiBT aG91bGQgYmUgemVyb2VkIGJ5IGFwcGxpY2F0aW9ucy4KPiArICoKPiArICogRW5jb2RlcyB0aGUg cXVhbnRpemF0aW9uIHBhcmFtZXRlcnMuIFNlZSBzZWN0aW9uICc3LjIuMTAgU2VnbWVudGF0aW9u IHBhcmFtcyBzeW50YXgnIG9mCj4gKyAqIHRoZSBWUDkgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBk ZXRhaWxzLgo+ICsgKi8KPiArc3RydWN0IHY0bDJfdnA5X3NlZ21lbnRhdGlvbiB7Cj4gKwlfX3Mx NiBmZWF0dXJlX2RhdGFbOF1bNF07Cj4gKwlfX3U4IGZlYXR1cmVfZW5hYmxlZFs4XTsKPiArCV9f dTggdHJlZV9wcm9ic1s3XTsKPiArCV9fdTggcHJlZF9wcm9ic1szXTsKPiArCV9fdTggZmxhZ3M7 Cj4gKwlfX3U4IHJlc2VydmVkWzVdOwo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIGVudW0gdjRsMl92 cDlfaW50cmFfcHJlZGljdGlvbl9tb2RlIC0gVlA5IEludHJhIHByZWRpY3Rpb24gbW9kZXMKPiAr ICoKPiArICogQFY0TDJfVlA5X0lOVFJBX1BSRURfTU9ERV9EQ19QUkVEOiBEQyBpbnRyYSBwcmVk aWN0aW9uCj4gKyAqIEBWNEwyX1ZQOV9JTlRSQV9QUkVEX01PREVfVl9QUkVEOiB2ZXJ0aWNhbCBp bnRyYSBwcmVkaWN0aW9uCj4gKyAqIEBWNEwyX1ZQOV9JTlRSQV9QUkVEX01PREVfSF9QUkVEOiBo b3Jpem9udGFsIGludHJhIHByZWRpY3Rpb24KPiArICogQFY0TDJfVlA5X0lOVFJBX1BSRURfTU9E RV9ENDVfUFJFRDogRDQ1IGludHJhIHByZWRpY3Rpb24KPiArICogQFY0TDJfVlA5X0lOVFJBX1BS RURfTU9ERV9EMTM1X1BSRUQ6IEQxMzUgaW50cmEgcHJlZGljdGlvbgo+ICsgKiBAVjRMMl9WUDlf SU5UUkFfUFJFRF9NT0RFX0QxMTdfUFJFRDogRDExNyBpbnRyYSBwcmVkaWN0aW9uCj4gKyAqIEBW NEwyX1ZQOV9JTlRSQV9QUkVEX01PREVfRDE1M19QUkVEOiBEMTUzIGludHJhIHByZWRpY3Rpb24K PiArICogQFY0TDJfVlA5X0lOVFJBX1BSRURfTU9ERV9EMjA3X1BSRUQ6IEQyMDcgaW50cmEgcHJl ZGljdGlvbgo+ICsgKiBAVjRMMl9WUDlfSU5UUkFfUFJFRF9NT0RFX0Q2M19QUkVEOiBENjMgaW50 cmEgcHJlZGljdGlvbgo+ICsgKiBAVjRMMl9WUDlfSU5UUkFfUFJFRF9NT0RFX1RNX1BSRUQ6IFRy dWUgTW90aW9uIGludHJhIHByZWRpY3Rpb24KPiArICoKPiArICogU2VlIHNlY3Rpb24gJzcuNC41 IEludHJhIGZyYW1lIG1vZGUgaW5mbyBzZW1hbnRpY3MnIGZvciBtb3JlIGRldGFpbHMuCj4gKyAq Lwo+ICtlbnVtIHY0bDJfdnA5X2ludHJhX3ByZWRpY3Rpb25fbW9kZSB7Cj4gKwlWNEwyX1ZQOV9J TlRSQV9QUkVEX01PREVfRENfUFJFRCwKPiArCVY0TDJfVlA5X0lOVFJBX1BSRURfTU9ERV9WX1BS RUQsCj4gKwlWNEwyX1ZQOV9JTlRSQV9QUkVEX01PREVfSF9QUkVELAo+ICsJVjRMMl9WUDlfSU5U UkFfUFJFRF9NT0RFX0Q0NV9QUkVELAo+ICsJVjRMMl9WUDlfSU5UUkFfUFJFRF9NT0RFX0QxMzVf UFJFRCwKPiArCVY0TDJfVlA5X0lOVFJBX1BSRURfTU9ERV9EMTE3X1BSRUQsCj4gKwlWNEwyX1ZQ OV9JTlRSQV9QUkVEX01PREVfRDE1M19QUkVELAo+ICsJVjRMMl9WUDlfSU5UUkFfUFJFRF9NT0RF X0QyMDdfUFJFRCwKPiArCVY0TDJfVlA5X0lOVFJBX1BSRURfTU9ERV9ENjNfUFJFRCwKPiArCVY0 TDJfVlA5X0lOVFJBX1BSRURfTU9ERV9UTV9QUkVELAo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIGVu dW0gdjRsMl92cDlfcmVzZXRfZnJhbWVfY29udGV4dCAtIFZhbGlkIHZhbHVlcyBmb3IKPiArICoJ CQkmdjRsMl9jdHJsX3ZwOV9mcmFtZS0+cmVzZXRfZnJhbWVfY29udGV4dAo+ICsgKgo+ICsgKiBA VjRMMl9WUDlfUkVTRVRfRlJBTUVfQ1RYX05PTkU6IGRvbid0IHJlc2V0IGFueSBmcmFtZSBjb250 ZXh0Cj4gKyAqIEBWNEwyX1ZQOV9SRVNFVF9GUkFNRV9DVFhfU1BFQzogcmVzZXQgdGhlIGZyYW1l IGNvbnRleHQgcG9pbnRlZCBieQo+ICsgKgkmdjRsMl9jdHJsX3ZwOV9mcmFtZS5mcmFtZV9jb250 ZXh0X2lkeAo+ICsgKiBAVjRMMl9WUDlfUkVTRVRfRlJBTUVfQ1RYX0FMTDogcmVzZXQgYWxsIGZy YW1lIGNvbnRleHRzCj4gKyAqCj4gKyAqIFNlZSBzZWN0aW9uICc3LjIgVW5jb21wcmVzc2VkIGhl YWRlciBzZW1hbnRpY3MnIG9mIHRoZSBWUDkgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxz Lgo+ICsgKi8KPiArZW51bSB2NGwyX3ZwOV9yZXNldF9mcmFtZV9jb250ZXh0IHsKPiArCVY0TDJf VlA5X1JFU0VUX0ZSQU1FX0NUWF9OT05FLAo+ICsJVjRMMl9WUDlfUkVTRVRfRlJBTUVfQ1RYX1NQ RUMsCj4gKwlWNEwyX1ZQOV9SRVNFVF9GUkFNRV9DVFhfQUxMLAo+ICt9Owo+ICsKPiArLyoqCj4g KyAqIGVudW0gdjRsMl92cDlfaW50ZXJwb2xhdGlvbl9maWx0ZXIgLSBWUDkgaW50ZXJwb2xhdGlv biBmaWx0ZXIgdHlwZXMKPiArICoKPiArICogQFY0TDJfVlA5X0lOVEVSUF9GSUxURVJfRUlHSFRU QVA6IGVpZ2h0IHRhcCBmaWx0ZXIKPiArICogQFY0TDJfVlA5X0lOVEVSUF9GSUxURVJfRUlHSFRU QVBfU01PT1RIOiBlaWdodCB0YXAgc21vb3RoIGZpbHRlcgo+ICsgKiBAVjRMMl9WUDlfSU5URVJQ X0ZJTFRFUl9FSUdIVFRBUF9TSEFSUDogZWlnaHQgdGFwIHNoYXJwIGZpbHRlcgo+ICsgKiBAVjRM Ml9WUDlfSU5URVJQX0ZJTFRFUl9CSUxJTkVBUjogYmlsaW5lYXIgZmlsdGVyCj4gKyAqIEBWNEwy X1ZQOV9JTlRFUlBfRklMVEVSX1NXSVRDSEFCTEU6IGZpbHRlciBzZWxlY3Rpb24gaXMgc2lnbmFs ZWQgYXQgdGhlIGJsb2NrIGxldmVsCj4gKyAqCj4gKyAqIFNlZSBzZWN0aW9uICc3LjIuNyBJbnRl cnBvbGF0aW9uIGZpbHRlciBzZW1hbnRpY3MnIG9mIHRoZSBWUDkgc3BlY2lmaWNhdGlvbgo+ICsg KiBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgKi8KPiArZW51bSB2NGwyX3ZwOV9pbnRlcnBvbGF0aW9u X2ZpbHRlciB7Cj4gKwlWNEwyX1ZQOV9JTlRFUlBfRklMVEVSX0VJR0hUVEFQLAo+ICsJVjRMMl9W UDlfSU5URVJQX0ZJTFRFUl9FSUdIVFRBUF9TTU9PVEgsCj4gKwlWNEwyX1ZQOV9JTlRFUlBfRklM VEVSX0VJR0hUVEFQX1NIQVJQLAo+ICsJVjRMMl9WUDlfSU5URVJQX0ZJTFRFUl9CSUxJTkVBUiwK PiArCVY0TDJfVlA5X0lOVEVSUF9GSUxURVJfU1dJVENIQUJMRSwKPiArfTsKPiArCj4gKy8qKgo+ ICsgKiBlbnVtIHY0bDJfdnA5X3JlZmVyZW5jZV9tb2RlIC0gVlA5IHJlZmVyZW5jZSBtb2Rlcwo+ ICsgKgo+ICsgKiBAVjRMMl9WUDlfUkVGRVJFTkNFX01PREVfU0lOR0xFX1JFRkVSRU5DRTogaW5k aWNhdGVzIHRoYXQgYWxsIHRoZSBpbnRlciBibG9ja3MgdXNlIG9ubHkgYQo+ICsgKglzaW5nbGUg cmVmZXJlbmNlIGZyYW1lIHRvIGdlbmVyYXRlIG1vdGlvbiBjb21wZW5zYXRlZCBwcmVkaWN0aW9u Cj4gKyAqIEBWNEwyX1ZQOV9SRUZFUkVOQ0VfTU9ERV9DT01QT1VORF9SRUZFUkVOQ0U6IHJlcXVp cmVzIGFsbCB0aGUgaW50ZXIgYmxvY2tzIHRvIHVzZSBjb21wb3VuZCBtb2RlLgo+ICsgKglTaW5n bGUgcmVmZXJlbmNlIGZyYW1lIHByZWRpY3Rpb24gaXMgbm90IGFsbG93ZWQKPiArICogQFY0TDJf VlA5X1JFRkVSRU5DRV9NT0RFX1NFTEVDVDogYWxsb3dzIGVhY2ggaW5kaXZpZHVhbCBpbnRlciBi bG9jayB0byBzZWxlY3QgYmV0d2VlbiBzaW5nbGUKPiArICoJYW5kIGNvbXBvdW5kIHByZWRpY3Rp b24gbW9kZXMKPiArICoKPiArICogU2VlIHNlY3Rpb24gJzcuMy42IEZyYW1lIHJlZmVyZW5jZSBt b2RlIHNlbWFudGljcycgb2YgdGhlIFZQOSBzcGVjaWZpY2F0aW9uCj4gKyAqIGZvciBtb3JlIGRl dGFpbHMuCj4gKyAqLwo+ICtlbnVtIHY0bDJfdnA5X3JlZmVyZW5jZV9tb2RlIHsKPiArCVY0TDJf VlA5X1JFRkVSRU5DRV9NT0RFX1NJTkdMRV9SRUZFUkVOQ0UsCj4gKwlWNEwyX1ZQOV9SRUZFUkVO Q0VfTU9ERV9DT01QT1VORF9SRUZFUkVOQ0UsCj4gKwlWNEwyX1ZQOV9SRUZFUkVOQ0VfTU9ERV9T RUxFQ1QsCj4gK307Cj4gKwo+ICsvKioKPiArICogZW51bSB2NGwyX3ZwOV90eF9tb2RlIC0gVlA5 IFRYIG1vZGVzCj4gKyAqCj4gKyAqIEBWNEwyX1ZQOV9UWF9NT0RFX09OTFlfNFg0OiB0cmFuc2Zv cm0gc2l6ZSBpcyA0eDQKPiArICogQFY0TDJfVlA5X1RYX01PREVfQUxMT1dfOFg4OiB0cmFuc2Zv cm0gc2l6ZSBjYW4gYmUgdXAgdG8gOHg4Cj4gKyAqIEBWNEwyX1ZQOV9UWF9NT0RFX0FMTE9XXzE2 WDE2OiB0cmFuc2Zvcm0gc2l6ZSBjYW4gYmUgdXAgdG8gMTZ4MTYKPiArICogQFY0TDJfVlA5X1RY X01PREVfQUxMT1dfMzJYMzI6IHRyYW5zZm9ybSBzaXplIGNhbiBiZSB1cCB0byAzMngzMgo+ICsg KiBAVjRMMl9WUDlfVFhfTU9ERV9TRUxFQ1Q6IGJpdHN0cmVhbSBjb250YWlucyB0aGUgdHJhbnNm b3JtIHNpemUgZm9yIGVhY2ggYmxvY2sKPiArICoKPiArICogU2VlIHNlY3Rpb24gJzcuMy4xIFR4 IG1vZGUgc2VtYW50aWNzJyBvZiB0aGUgVlA5IHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWls cy4KPiArICovCj4gK2VudW0gdjRsMl92cDlfdHhfbW9kZSB7Cj4gKwlWNEwyX1ZQOV9UWF9NT0RF X09OTFlfNFg0LAo+ICsJVjRMMl9WUDlfVFhfTU9ERV9BTExPV184WDgsCj4gKwlWNEwyX1ZQOV9U WF9NT0RFX0FMTE9XXzE2WDE2LAo+ICsJVjRMMl9WUDlfVFhfTU9ERV9BTExPV18zMlgzMiwKPiAr CVY0TDJfVlA5X1RYX01PREVfU0VMRUNULAo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIGVudW0gdjRs Ml92cDlfZnJhbWVfZmxhZ3MgLSBWUDkgZnJhbWUgZmxhZ3MKPiArICogQFY0TDJfVlA5X0ZSQU1F X0ZMQUdfS0VZX0ZSQU1FOiB0aGUgZnJhbWUgaXMgYSBrZXkgZnJhbWUKPiArICogQFY0TDJfVlA5 X0ZSQU1FX0ZMQUdfU0hPV19GUkFNRTogdGhlIGZyYW1lIHNob3VsZCBiZSBkaXNwbGF5ZWQKPiAr ICogQFY0TDJfVlA5X0ZSQU1FX0ZMQUdfRVJST1JfUkVTSUxJRU5UOiB0aGUgZGVjb2Rpbmcgc2hv dWxkIGJlIGVycm9yIHJlc2lsaWVudAo+ICsgKiBAVjRMMl9WUDlfRlJBTUVfRkxBR19JTlRSQV9P TkxZOiB0aGUgZnJhbWUgZG9lcyBub3QgcmVmZXJlbmNlIG90aGVyIGZyYW1lcwo+ICsgKiBAVjRM Ml9WUDlfRlJBTUVfRkxBR19BTExPV19ISUdIX1BSRUNfTVY6IHRoZSBmcmFtZSBjYW4gdXNlIGhp Z2ggcHJlY2lzaW9uIG1vdGlvbiB2ZWN0b3JzCj4gKyAqIEBWNEwyX1ZQOV9GUkFNRV9GTEFHX1JF RlJFU0hfRlJBTUVfQ1RYOiBmcmFtZSBjb250ZXh0IHNob3VsZCBiZSB1cGRhdGVkIGFmdGVyIGRl Y29kaW5nCj4gKyAqIEBWNEwyX1ZQOV9GUkFNRV9GTEFHX1BBUkFMTEVMX0RFQ19NT0RFOiBwYXJh bGxlbCBkZWNvZGluZyBpcyB1c2VkCj4gKyAqIEBWNEwyX1ZQOV9GUkFNRV9GTEFHX1hfU1VCU0FN UExJTkc6IHZlcnRpY2FsIHN1YnNhbXBsaW5nIGlzIGVuYWJsZWQKPiArICogQFY0TDJfVlA5X0ZS QU1FX0ZMQUdfWV9TVUJTQU1QTElORzogaG9yaXpvbnRhbCBzdWJzYW1wbGluZyBpcyBlbmFibGVk Cj4gKyAqIEBWNEwyX1ZQOV9GUkFNRV9GTEFHX0NPTE9SX1JBTkdFX0ZVTExfU1dJTkc6IGZ1bGwg VVYgcmFuZ2UgaXMgdXNlZAo+ICsgKgo+ICsgKiBDaGVjayB0aGUgVlA5IHNwZWNpZmljYXRpb24g Zm9yIG1vcmUgZGV0YWlscy4KPiArICovCj4gK2VudW0gdjRsMl92cDlfZnJhbWVfZmxhZ3Mgewo+ ICsJVjRMMl9WUDlfRlJBTUVfRkxBR19LRVlfRlJBTUUgPSAxIDw8IDAsCj4gKwlWNEwyX1ZQOV9G UkFNRV9GTEFHX1NIT1dfRlJBTUUgPSAxIDw8IDEsCj4gKwlWNEwyX1ZQOV9GUkFNRV9GTEFHX0VS Uk9SX1JFU0lMSUVOVCA9IDEgPDwgMiwKPiArCVY0TDJfVlA5X0ZSQU1FX0ZMQUdfSU5UUkFfT05M WSA9IDEgPDwgMywKPiArCVY0TDJfVlA5X0ZSQU1FX0ZMQUdfQUxMT1dfSElHSF9QUkVDX01WID0g MSA8PCA0LAo+ICsJVjRMMl9WUDlfRlJBTUVfRkxBR19SRUZSRVNIX0ZSQU1FX0NUWCA9IDEgPDwg NSwKPiArCVY0TDJfVlA5X0ZSQU1FX0ZMQUdfUEFSQUxMRUxfREVDX01PREUgPSAxIDw8IDYsCj4g KwlWNEwyX1ZQOV9GUkFNRV9GTEFHX1hfU1VCU0FNUExJTkcgPSAxIDw8IDcsCj4gKwlWNEwyX1ZQ OV9GUkFNRV9GTEFHX1lfU1VCU0FNUExJTkcgPSAxIDw8IDgsCj4gKwlWNEwyX1ZQOV9GUkFNRV9G TEFHX0NPTE9SX1JBTkdFX0ZVTExfU1dJTkcgPSAxIDw8IDksCj4gK307Cj4gKwo+ICsvKioKPiAr ICogZW51bSB2NGwyX3ZwOV9yZWZfZnJhbWVfc2lnbl9iaWFzIC0gV2hldGhlciByZWZfZnJhbWVf c2lnbl9iaWFzIGlzIDEgZm9yIGEgZ2l2ZW4gcmVmZXJlbmNlIGZyYW1lCj4gKyAqIEBWNEwyX1ZQ OV9TSUdOX0JJQVNfTEFTVDogcmVmX2ZyYW1lX3NpZ25fYmlhcyBpcyAxIGZvciB0aGUgImxhc3Qi IHJlZmVyZW5jZSBmcmFtZQo+ICsgKiBAVjRMMl9WUDlfU0lHTl9CSUFTX0dPTERFTjogcmVmX2Zy YW1lX3NpZ25fYmlhcyBpcyAxIGZvciB0aGUgImdvbGRlbiIgcmVmZXJlbmNlIGZyYW1lCj4gKyAq IEBWNEwyX1ZQOV9TSUdOX0JJQVNfQUxUOiByZWZfZnJhbWVfc2lnbl9iaWFzIGlzIDEgZm9yIHRo ZSAiYWx0IiByZWZlcmVuY2UgZnJhbWUKPiArICovCj4gKwo+ICtlbnVtIHY0bDJfdnA5X3JlZl9m cmFtZV9zaWduX2JpYXMgewo+ICsJVjRMMl9WUDlfU0lHTl9CSUFTX0xBU1QsCj4gKwlWNEwyX1ZQ OV9TSUdOX0JJQVNfR09MREVOLAo+ICsJVjRMMl9WUDlfU0lHTl9CSUFTX0FMVCwKPiArfTsKPiAr Cj4gKyNkZWZpbmUgVjRMMl9WUDlfUFJPRklMRV9NQVgJCTMKPiArCj4gKyNkZWZpbmUgVjRMMl9D SURfU1RBVEVMRVNTX1ZQOV9GUkFNRQkoVjRMMl9DSURfQ09ERUNfU1RBVEVMRVNTX0JBU0UgKyAz MDApCj4gKy8qKgo+ICsgKiBzdHJ1Y3QgdjRsMl9jdHJsX3ZwOV9mcmFtZSAtIFZQOSBmcmFtZSBk ZWNvZGluZyBjb250cm9sCj4gKyAqCj4gKyAqIEBsZjogbG9vcCBmaWx0ZXIgcGFyYW1ldGVycy4g U2VlICZ2NGwyX3ZwOV9sb29wX2ZpbHRlciBmb3IgbW9yZSBkZXRhaWxzCj4gKyAqIEBxdWFudDog cXVhbnRpemF0aW9uIHBhcmFtZXRlcnMuIFNlZSAmdjRsMl92cDlfcXVhbnRpemF0aW9uIGZvciBt b3JlIGRldGFpbHMKPiArICogQHNlZzogc2VnbWVudGF0aW9uIHBhcmFtZXRlcnMuIFNlZSAmdjRs Ml92cDlfc2VnbWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMKPiArICogQGZsYWdzOiBjb21iaW5h dGlvbiBvZiBWNEwyX1ZQOV9GUkFNRV9GTEFHXyogZmxhZ3MKPiArICogQGNvbXByZXNzZWRfaGVh ZGVyX3NpemU6IGNvbXByZXNzZWQgaGVhZGVyIHNpemUgaW4gYnl0ZXMKPiArICogQHVuY29tcHJl c3NlZF9oZWFkZXJfc2l6ZTogdW5jb21wcmVzc2VkIGhlYWRlciBzaXplIGluIGJ5dGVzCj4gKyAq IEBmcmFtZV93aWR0aF9taW51c18xOiBhZGQgMSB0byBpdCBhbmQgeW91J2xsIGdldCB0aGUgZnJh bWUgd2lkdGggZXhwcmVzc2VkIGluIHBpeGVscwo+ICsgKiBAZnJhbWVfaGVpZ2h0X21pbnVzXzE6 IGFkZCAxIHRvIGl0IGFuZCB5b3UnbGwgZ2V0IHRoZSBmcmFtZSBoZWlnaHQgZXhwcmVzc2VkIGlu IHBpeGVscwo+ICsgKiBAcmVuZGVyX3dpZHRoX21pbnVzXzE6IGFkZCAxIHRvIGl0IGFuZCB5b3Un bGwgZ2V0IHRoZSBleHBlY3RlZCByZW5kZXIgd2lkdGggZXhwcmVzc2VkIGluCj4gKyAqCXBpeGVs cy4gVGhpcyBpcyBub3QgdXNlZCBkdXJpbmcgdGhlIGRlY29kaW5nIHByb2Nlc3MgYnV0IG1pZ2h0 IGJlIHVzZWQgYnkgSFcgc2NhbGVycwo+ICsgKgl0byBwcmVwYXJlIGEgZnJhbWUgdGhhdCdzIHJl YWR5IGZvciBzY2Fub3V0Cj4gKyAqIEByZW5kZXJfaGVpZ2h0X21pbnVzXzE6IGFkZCAxIHRvIGl0 IGFuZCB5b3UnbGwgZ2V0IHRoZSBleHBlY3RlZCByZW5kZXIgaGVpZ2h0IGV4cHJlc3NlZCBpbgo+ ICsgKglwaXhlbHMuIFRoaXMgaXMgbm90IHVzZWQgZHVyaW5nIHRoZSBkZWNvZGluZyBwcm9jZXNz IGJ1dCBtaWdodCBiZSB1c2VkIGJ5IEhXIHNjYWxlcnMKPiArICoJdG8gcHJlcGFyZSBhIGZyYW1l IHRoYXQncyByZWFkeSBmb3Igc2Nhbm91dAo+ICsgKiBAbGFzdF9mcmFtZV90czogImxhc3QiIHJl ZmVyZW5jZSBidWZmZXIgdGltZXN0YW1wLgo+ICsgKiBUaGUgdGltZXN0YW1wIHJlZmVycyB0byB0 aGUgdGltZXN0YW1wIGZpZWxkIGluIHN0cnVjdCB2NGwyX2J1ZmZlci4KPiArICogVXNlIHY0bDJf dGltZXZhbF90b19ucygpIHRvIGNvbnZlcnQgdGhlIHN0cnVjdCB0aW1ldmFsIHRvIGEgX191NjQu Cj4gKyAqIEBnb2xkZW5fZnJhbWVfdHM6ICJnb2xkZW4iIHJlZmVyZW5jZSBidWZmZXIgdGltZXN0 YW1wLgo+ICsgKiBUaGUgdGltZXN0YW1wIHJlZmVycyB0byB0aGUgdGltZXN0YW1wIGZpZWxkIGlu IHN0cnVjdCB2NGwyX2J1ZmZlci4KPiArICogVXNlIHY0bDJfdGltZXZhbF90b19ucygpIHRvIGNv bnZlcnQgdGhlIHN0cnVjdCB0aW1ldmFsIHRvIGEgX191NjQuCj4gKyAqIEBhbHRfZnJhbWVfdHM6 ICJhbHQiIHJlZmVyZW5jZSBidWZmZXIgdGltZXN0YW1wLgo+ICsgKiBUaGUgdGltZXN0YW1wIHJl ZmVycyB0byB0aGUgdGltZXN0YW1wIGZpZWxkIGluIHN0cnVjdCB2NGwyX2J1ZmZlci4KPiArICog VXNlIHY0bDJfdGltZXZhbF90b19ucygpIHRvIGNvbnZlcnQgdGhlIHN0cnVjdCB0aW1ldmFsIHRv IGEgX191NjQuCj4gKyAqIEByZWZfZnJhbWVfc2lnbl9iaWFzOiBhIGJpdGZpZWxkIHNwZWNpZnlp bmcgd2hldGhlciB0aGUgc2lnbiBiaWFzIGlzIHNldCBmb3IgYSBnaXZlbgo+ICsgKglyZWZlcmVu Y2UgZnJhbWUuIFNlZSAmdjRsMl92cDlfcmVmX2ZyYW1lX3NpZ25fYmlhcyBmb3IgbW9yZSBkZXRh aWxzLgo+ICsgKiBAcmVzZXRfZnJhbWVfY29udGV4dDogc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGZy YW1lIGNvbnRleHQgc2hvdWxkIGJlIHJlc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgo+ICsgKglTZWUg JnY0bDJfdnA5X3Jlc2V0X2ZyYW1lX2NvbnRleHQgZm9yIG1vcmUgZGV0YWlscwo+ICsgKiBAZnJh bWVfY29udGV4dF9pZHg6IGZyYW1lIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgdXNlZC91cGRhdGVk Cj4gKyAqIEBwcm9maWxlOiBWUDkgcHJvZmlsZS4gQ2FuIGJlIDAsIDEsIDIgb3IgMwo+ICsgKiBA Yml0X2RlcHRoOiBiaXRzIHBlciBjb21wb25lbnRzLiBDYW4gYmUgOCwgMTAgb3IgMTIuIE5vdGUg dGhhdCBub3QgYWxsIHByb2ZpbGVzIHN1cHBvcnQKPiArICoJMTAgYW5kL29yIDEyIGJpdHMgZGVw dGhzCj4gKyAqIEBpbnRlcnBvbGF0aW9uX2ZpbHRlcjogc3BlY2lmaWVzIHRoZSBmaWx0ZXIgc2Vs ZWN0aW9uIHVzZWQgZm9yIHBlcmZvcm1pbmcgaW50ZXIgcHJlZGljdGlvbi4KPiArICoJU2VlICZ2 NGwyX3ZwOV9pbnRlcnBvbGF0aW9uX2ZpbHRlciBmb3IgbW9yZSBkZXRhaWxzCj4gKyAqIEB0aWxl X2NvbHNfbG9nMjogc3BlY2lmaWVzIHRoZSBiYXNlIDIgbG9nYXJpdGhtIG9mIHRoZSB3aWR0aCBv ZiBlYWNoIHRpbGUgKHdoZXJlIHRoZSB3aWR0aAo+ICsgKglpcyBtZWFzdXJlZCBpbiB1bml0cyBv ZiA4eDggYmxvY2tzKS4gU2hhbGwgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDYKPiArICogQHRp bGVfcm93c19sb2cyOiBzcGVjaWZpZXMgdGhlIGJhc2UgMiBsb2dhcml0aG0gb2YgdGhlIGhlaWdo dCBvZiBlYWNoIHRpbGUgKHdoZXJlIHRoZSBoZWlnaHQKPiArICoJaXMgbWVhc3VyZWQgaW4gdW5p dHMgb2YgOHg4IGJsb2NrcykKPiArICogQHR4X21vZGU6IHNwZWNpZmllcyB0aGUgVFggbW9kZS4g U2VlICZ2NGwyX3ZwOV90eF9tb2RlIGZvciBtb3JlIGRldGFpbHMKPiArICogQHJlZmVyZW5jZV9t b2RlOiBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgaW50ZXIgcHJlZGljdGlvbiB0byBiZSB1c2VkLiBT ZWUKPiArICoJJnY0bDJfdnA5X3JlZmVyZW5jZV9tb2RlIGZvciBtb3JlIGRldGFpbHMKPiArICog QHJlc2VydmVkOiBwYWRkaW5nIGZpZWxkLiBTaG91bGQgYmUgemVyb2VkIGJ5IGFwcGxpY2F0aW9u cy4KPiArICovCj4gK3N0cnVjdCB2NGwyX2N0cmxfdnA5X2ZyYW1lIHsKPiArCXN0cnVjdCB2NGwy X3ZwOV9sb29wX2ZpbHRlciBsZjsKPiArCXN0cnVjdCB2NGwyX3ZwOV9xdWFudGl6YXRpb24gcXVh bnQ7Cj4gKwlzdHJ1Y3QgdjRsMl92cDlfc2VnbWVudGF0aW9uIHNlZzsKPiArCV9fdTMyIGZsYWdz Owo+ICsJX191MTYgY29tcHJlc3NlZF9oZWFkZXJfc2l6ZTsKPiArCV9fdTE2IHVuY29tcHJlc3Nl ZF9oZWFkZXJfc2l6ZTsKPiArCV9fdTE2IGZyYW1lX3dpZHRoX21pbnVzXzE7Cj4gKwlfX3UxNiBm cmFtZV9oZWlnaHRfbWludXNfMTsKPiArCV9fdTE2IHJlbmRlcl93aWR0aF9taW51c18xOwo+ICsJ X191MTYgcmVuZGVyX2hlaWdodF9taW51c18xOwo+ICsJX191NjQgbGFzdF9mcmFtZV90czsKPiAr CV9fdTY0IGdvbGRlbl9mcmFtZV90czsKPiArCV9fdTY0IGFsdF9mcmFtZV90czsKPiArCV9fdTgg cmVmX2ZyYW1lX3NpZ25fYmlhczsKPiArCV9fdTggcmVzZXRfZnJhbWVfY29udGV4dDsKPiArCV9f dTggZnJhbWVfY29udGV4dF9pZHg7Cj4gKwlfX3U4IHByb2ZpbGU7Cj4gKwlfX3U4IGJpdF9kZXB0 aDsKPiArCV9fdTggaW50ZXJwb2xhdGlvbl9maWx0ZXI7Cj4gKwlfX3U4IHRpbGVfY29sc19sb2cy Owo+ICsJX191OCB0aWxlX3Jvd3NfbG9nMjsKPiArCV9fdTggdHhfbW9kZTsKPiArCV9fdTggcmVm ZXJlbmNlX21vZGU7Cj4gKwlfX3U4IHJlc2VydmVkWzZdOwo+ICt9Owo+ICsKPiArI2RlZmluZSBW NEwyX1ZQOV9OVU1fRlJBTUVfQ1RYCTQKPiArCj4gKy8qKgo+ICsgKiBzdHJ1Y3QgdjRsMl92cDlf bXZfY29tcHJlc3NlZF9oZHJfcHJvYnMgLSBWUDkgTW90aW9uIHZlY3RvciBwcm9iYWJpbGl0eSB1 cGRhdGVzCj4gKyAqIEBqb2ludDogbW90aW9uIHZlY3RvciBqb2ludCBwcm9iYWJpbGl0eSB1cGRh dGVzCj4gKyAqIEBzaWduOiBtb3Rpb24gdmVjdG9yIHNpZ24gcHJvYmFiaWxpdHkgdXBkYXRlcwo+ ICsgKiBAY2xhc3NlczogbW90aW9uIHZlY3RvciBjbGFzcyBwcm9iYWJpbGl0eSB1cGRhdGVzCj4g KyAqIEBjbGFzczBfYml0OiBtb3Rpb24gdmVjdG9yIGNsYXNzMCBiaXQgcHJvYmFiaWxpdHkgdXBk YXRlcwo+ICsgKiBAYml0czogbW90aW9uIHZlY3RvciBiaXRzIHByb2JhYmlsaXR5IHVwZGF0ZXMK PiArICogQGNsYXNzMF9mcjogbW90aW9uIHZlY3RvciBjbGFzczAgZnJhY3Rpb25hbCBiaXQgcHJv YmFiaWxpdHkgdXBkYXRlcwo+ICsgKiBAZnI6IG1vdGlvbiB2ZWN0b3IgZnJhY3Rpb25hbCBiaXQg cHJvYmFiaWxpdHkgdXBkYXRlcwo+ICsgKiBAY2xhc3MwX2hwOiBtb3Rpb24gdmVjdG9yIGNsYXNz MCBoaWdoIHByZWNpc2lvbiBmcmFjdGlvbmFsIGJpdCBwcm9iYWJpbGl0eSB1cGRhdGVzCj4gKyAq IEBocDogbW90aW9uIHZlY3RvciBoaWdoIHByZWNpc2lvbiBmcmFjdGlvbmFsIGJpdCBwcm9iYWJp bGl0eSB1cGRhdGVzCj4gKyAqCj4gKyAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIG5ldyB2YWx1 ZXMgb2YgbW90aW9uIHZlY3RvciBwcm9iYWJpbGl0aWVzLgo+ICsgKiBBIHZhbHVlIG9mIHplcm8g aW4gYW4gYXJyYXkgZWxlbWVudCBtZWFucyB0aGVyZSBpcyBubyB1cGRhdGUgb2YgdGhlIHJlbGV2 YW50IHByb2JhYmlsaXR5Lgo+ICsgKiBTZWUgYHN0cnVjdCB2NGwyX3ZwOV9wcm9iX3VwZGF0ZXNg IGZvciBkZXRhaWxzLgo+ICsgKi8KPiArc3RydWN0IHY0bDJfdnA5X212X2NvbXByZXNzZWRfaGRy X3Byb2JzIHsKPiArCV9fdTggam9pbnRbM107Cj4gKwlfX3U4IHNpZ25bMl07Cj4gKwlfX3U4IGNs YXNzZXNbMl1bMTBdOwo+ICsJX191OCBjbGFzczBfYml0WzJdOwo+ICsJX191OCBiaXRzWzJdWzEw XTsKPiArCV9fdTggY2xhc3MwX2ZyWzJdWzJdWzNdOwo+ICsJX191OCBmclsyXVszXTsKPiArCV9f dTggY2xhc3MwX2hwWzJdOwo+ICsJX191OCBocFsyXTsKPiArfTsKPiArCj4gKyNkZWZpbmUgVjRM Ml9DSURfU1RBVEVMRVNTX1ZQOV9DT01QUkVTU0VEX0hEUl9QUk9CUwkoVjRMMl9DSURfQ09ERUNf U1RBVEVMRVNTX0JBU0UgKyAzMDEpCj4gKy8qKgo+ICsgKiBzdHJ1Y3QgdjRsMl9jdHJsX3ZwOV9j b21wcmVzc2VkX2hkcl9wcm9icyAtIFZQOSBwcm9iYWJpbGl0eSB1cGRhdGVzIGNvbnRyb2wKPiAr ICogQHR4ODogVFggOHg4IHByb2JhYmlsaXR5IHVwZGF0ZXMKPiArICogQHR4MTY6IFRYIDE2eDE2 IHByb2JhYmlsaXR5IHVwZGF0ZXMKPiArICogQHR4MzI6IFRYIDMyeDMyIHByb2JhYmlsaXR5IHVw ZGF0ZXMKPiArICogQGNvZWY6IGNvZWZmaWNpZW50IHByb2JhYmlsaXR5IHVwZGF0ZXMKPiArICog QHNraXA6IHNraXAgcHJvYmFiaWxpdHkgdXBkYXRlcwo+ICsgKiBAaW50ZXJfbW9kZTogaW50ZXIg bW9kZSBwcm9iYWJpbGl0eSB1cGRhdGVzCj4gKyAqIEBpbnRlcnBfZmlsdGVyOiBpbnRlcnBvbGF0 aW9uIGZpbHRlciBwcm9iYWJpbGl0eSB1cGRhdGVzCj4gKyAqIEBpc19pbnRlcjogaXMgaW50ZXIt YmxvY2sgcHJvYmFiaWxpdHkgdXBkYXRlcwo+ICsgKiBAY29tcF9tb2RlOiBjb21wb3VuZCBwcmVk aWN0aW9uIG1vZGUgcHJvYmFiaWxpdHkgdXBkYXRlcwo+ICsgKiBAc2luZ2xlX3JlZjogc2luZ2xl IHJlZiBwcm9iYWJpbGl0eSB1cGRhdGVzCj4gKyAqIEBjb21wX3JlZjogY29tcG91bmQgcmVmIHBy b2JhYmlsaXR5IHVwZGF0ZXMKPiArICogQHlfbW9kZTogWSBwcmVkaWN0aW9uIG1vZGUgcHJvYmFi aWxpdHkgdXBkYXRlcwo+ICsgKiBAdXZfbW9kZTogVVYgcHJlZGljdGlvbiBtb2RlIHByb2JhYmls aXR5IHVwZGF0ZXMKPiArICogQHBhcnRpdGlvbjogcGFydGl0aW9uIHByb2JhYmlsaXR5IHVwZGF0 ZXMKPiArICogQG12OiBtb3Rpb24gdmVjdG9yIHByb2JhYmlsaXR5IHVwZGF0ZXMKPiArICoKPiAr ICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgdGhlIHByb2JhYmlsaXRpZXMgdXBkYXRlIGFzIHBhcnNl ZCBpbiB0aGUgY29tcHJlc3NlZAo+ICsgKiBoZWFkZXIgKFNwZWMgNi4zKS4gVGhlc2UgdmFsdWVz IHJlcHJlc2VudCB0aGUgdmFsdWUgb2YgcHJvYmFiaWxpdHkgdXBkYXRlIGFmdGVyCj4gKyAqIGJl aW5nIHRyYW5zbGF0ZWQgd2l0aCBpbnZfbWFwX3RhYmxlW10gKHNlZSA2LjMuNSkuIEEgdmFsdWUg b2YgemVybyBpbiBhbiBhcnJheSBlbGVtZW50Cj4gKyAqIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8g dXBkYXRlIG9mIHRoZSByZWxldmFudCBwcm9iYWJpbGl0eS4KPiArICovCj4gK3N0cnVjdCB2NGwy X2N0cmxfdnA5X2NvbXByZXNzZWRfaGRyX3Byb2JzIHsKPiArCV9fdTggdHg4WzJdWzFdOwo+ICsJ X191OCB0eDE2WzJdWzJdOwo+ICsJX191OCB0eDMyWzJdWzNdOwo+ICsJX191OCBjb2VmWzRdWzJd WzJdWzZdWzZdWzNdOwo+ICsJX191OCBza2lwWzNdOwo+ICsJX191OCBpbnRlcl9tb2RlWzddWzNd Owo+ICsJX191OCBpbnRlcnBfZmlsdGVyWzRdWzJdOwo+ICsJX191OCBpc19pbnRlcls0XTsKPiAr CV9fdTggY29tcF9tb2RlWzVdOwo+ICsJX191OCBzaW5nbGVfcmVmWzVdWzJdOwo+ICsJX191OCBj b21wX3JlZls1XTsKPiArCV9fdTggeV9tb2RlWzRdWzldOwo+ICsJX191OCB1dl9tb2RlWzEwXVs5 XTsKPiArCV9fdTggcGFydGl0aW9uWzE2XVszXTsKPiArCj4gKwlzdHJ1Y3QgdjRsMl92cDlfbXZf Y29tcHJlc3NlZF9oZHJfcHJvYnMgbXY7Cj4gK307Cj4gKwo+ICAvKiBNUEVHLWNvbXByZXNzaW9u IGRlZmluaXRpb25zIGtlcHQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCj4gICNpZm5k ZWYgX19LRVJORUxfXwo+ICAjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19NUEVHICAgICAgICAgICAg VjRMMl9DVFJMX0NMQVNTX0NPREVDCj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC92 aWRlb2RldjIuaCBiL2luY2x1ZGUvdWFwaS9saW51eC92aWRlb2RldjIuaAo+IGluZGV4IDU4Mzky ZGNkM2JmNS4uNGFiZTQzNjI1MTllIDEwMDY0NAo+IC0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC92 aWRlb2RldjIuaAo+ICsrKyBiL2luY2x1ZGUvdWFwaS9saW51eC92aWRlb2RldjIuaAo+IEBAIC03 MDMsNiArNzAzLDcgQEAgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB7Cj4gICNkZWZpbmUgVjRMMl9Q SVhfRk1UX1ZQOCAgICAgIHY0bDJfZm91cmNjKCdWJywgJ1AnLCAnOCcsICcwJykgLyogVlA4ICov Cj4gICNkZWZpbmUgVjRMMl9QSVhfRk1UX1ZQOF9GUkFNRSB2NGwyX2ZvdXJjYygnVicsICdQJywg JzgnLCAnRicpIC8qIFZQOCBwYXJzZWQgZnJhbWUgKi8KPiAgI2RlZmluZSBWNEwyX1BJWF9GTVRf VlA5ICAgICAgdjRsMl9mb3VyY2MoJ1YnLCAnUCcsICc5JywgJzAnKSAvKiBWUDkgKi8KPiArI2Rl ZmluZSBWNEwyX1BJWF9GTVRfVlA5X0ZSQU1FIHY0bDJfZm91cmNjKCdWJywgJ1AnLCAnOScsICdG JykgLyogVlA5IHBhcnNlZCBmcmFtZSAqLwo+ICAjZGVmaW5lIFY0TDJfUElYX0ZNVF9IRVZDICAg ICB2NGwyX2ZvdXJjYygnSCcsICdFJywgJ1YnLCAnQycpIC8qIEhFVkMgYWthIEguMjY1ICovCj4g ICNkZWZpbmUgVjRMMl9QSVhfRk1UX0ZXSFQgICAgIHY0bDJfZm91cmNjKCdGJywgJ1cnLCAnSCcs ICdUJykgLyogRmFzdCBXYWxzaCBIYWRhbWFyZCBUcmFuc2Zvcm0gKHZpY29kZWMpICovCj4gICNk ZWZpbmUgVjRMMl9QSVhfRk1UX0ZXSFRfU1RBVEVMRVNTICAgICB2NGwyX2ZvdXJjYygnUycsICdG JywgJ1cnLCAnSCcpIC8qIFN0YXRlbGVzcyBGV0hUICh2aWNvZGVjKSAqLwo+IEBAIC0xNzU1LDYg KzE3NTYsOCBAQCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCB7Cj4gIAkJc3RydWN0IHY0bDJfY3Ry bF9tcGVnMl9zZXF1ZW5jZSBfX3VzZXIgKnBfbXBlZzJfc2VxdWVuY2U7Cj4gIAkJc3RydWN0IHY0 bDJfY3RybF9tcGVnMl9waWN0dXJlIF9fdXNlciAqcF9tcGVnMl9waWN0dXJlOwo+ICAJCXN0cnVj dCB2NGwyX2N0cmxfbXBlZzJfcXVhbnRpc2F0aW9uIF9fdXNlciAqcF9tcGVnMl9xdWFudGlzYXRp b247Cj4gKwkJc3RydWN0IHY0bDJfY3RybF92cDlfY29tcHJlc3NlZF9oZHJfcHJvYnMgX191c2Vy ICpwX3ZwOV9jb21wcmVzc2VkX2hkcl9wcm9iczsKPiArCQlzdHJ1Y3QgdjRsMl9jdHJsX3ZwOV9m cmFtZSBfX3VzZXIgKnBfdnA5X2ZyYW1lOwo+ICAJCXZvaWQgX191c2VyICpwdHI7Cj4gIAl9Owo+ ICB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKPiBAQCAtMTgxOSw2ICsxODIyLDkgQEAgZW51 bSB2NGwyX2N0cmxfdHlwZSB7Cj4gIAlWNEwyX0NUUkxfVFlQRV9NUEVHMl9RVUFOVElTQVRJT04g ICA9IDB4MDI1MCwKPiAgCVY0TDJfQ1RSTF9UWVBFX01QRUcyX1NFUVVFTkNFICAgICAgID0gMHgw MjUxLAo+ICAJVjRMMl9DVFJMX1RZUEVfTVBFRzJfUElDVFVSRSAgICAgICAgPSAweDAyNTIsCj4g Kwo+ICsJVjRMMl9DVFJMX1RZUEVfVlA5X0NPTVBSRVNTRURfSERSX1BST0JTCT0gMHgwMjYwLAo+ ICsJVjRMMl9DVFJMX1RZUEVfVlA5X0ZSQU1FCQk9IDB4MDI2MSwKPiAgfTsKPiAgCj4gIC8qICBV c2VkIGluIHRoZSBWSURJT0NfUVVFUllDVFJMIGlvY3RsIGZvciBxdWVyeWluZyBjb250cm9scyAq LwoKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51 eC1yb2NrY2hpcCBtYWlsaW5nIGxpc3QKTGludXgtcm9ja2NoaXBAbGlzdHMuaW5mcmFkZWFkLm9y ZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJvY2tj aGlwCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-14.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 96A35C4338F for ; Tue, 17 Aug 2021 17:51:55 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5363B60FE6 for ; Tue, 17 Aug 2021 17:51:55 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 5363B60FE6 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:Cc:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=X1BdIViu51vxuUFD7BnjZPKXFcJexURM/gzrcd8xfWI=; b=UMh/DiUlKdkg21 OxT8UsRsZJ7P1cehTirGv9zoxK/6FENx0xPxUTYl/UlsfBeJWu6Y7c12Rvft3/VloGpACc4tAQyBK 32Mjfq7ermrMdTOuRVwSgMsmSOb7x/ISfdwtaKl4A+be785rB9URR8ZnQuz/3fVS64c52BQKvPzVp 8anVutaGpq4Z35waO/J7fMBUPrCiOJP0KxsdGvLFTWlkgwVEyXrHvgygnkQf5KpzH6efdLaCB2SmI sZy/pLYjSRfp0PL20y9esUr7uVEL05CvVuaXCPpfYDvWLa2YYlmVvTDpNNUcDXf3P5/0Bf6iaxmTe cpy5jtKT6EhfmXB+cIpg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mG3E2-003Abx-QR; Tue, 17 Aug 2021 17:50:10 +0000 Received: from bhuna.collabora.co.uk ([46.235.227.227]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mG3Du-003AZg-Db; Tue, 17 Aug 2021 17:50:08 +0000 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: nicolas) with ESMTPSA id AFD541F42897 Message-ID: <0fd8f0cfd231be2e11da218b0401e1b0e0a15cca.camel@collabora.com> Subject: Re: [PATCH v3 05/10] media: uapi: Add VP9 stateless decoder controls From: Nicolas Dufresne To: Andrzej Pietrasiewicz , linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-staging@lists.linux.dev Cc: Benjamin Gaignard , Boris Brezillon , Ezequiel Garcia , Fabio Estevam , Greg Kroah-Hartman , Hans Verkuil , Heiko Stuebner , Jernej Skrabec , Mauro Carvalho Chehab , NXP Linux Team , Pengutronix Kernel Team , Philipp Zabel , Sascha Hauer , Shawn Guo , kernel@collabora.com, Ezequiel Garcia , Adrian Ratiu , Daniel Almeida Date: Tue, 17 Aug 2021 13:49:48 -0400 In-Reply-To: <20210805144246.11998-6-andrzej.p@collabora.com> References: <20210805144246.11998-1-andrzej.p@collabora.com> <20210805144246.11998-6-andrzej.p@collabora.com> User-Agent: Evolution 3.40.3 (3.40.3-1.fc34) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210817_105002_905934_9AB0BBAF X-CRM114-Status: GOOD ( 34.49 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org TGUgamV1ZGkgMDUgYW/Du3QgMjAyMSDDoCAxNjo0MiArMDIwMCwgQW5kcnplaiBQaWV0cmFzaWV3 aWN6IGEgw6ljcml0wqA6Cj4gQWRkIHRoZSBWUDkgc3RhdGVsZXNzIGRlY29kZXIgY29udHJvbHMg cGx1cyB0aGUgZG9jdW1lbnRhdGlvbiB0aGF0IGdvZXMKPiB3aXRoIGl0Lgo+IAo+IFNpZ25lZC1v ZmYtYnk6IEJvcmlzIEJyZXppbGxvbiA8Ym9yaXMuYnJlemlsbG9uQGNvbGxhYm9yYS5jb20+Cj4g Q28tZGV2ZWxvcGVkLWJ5OiBFemVxdWllbCBHYXJjaWEgPGV6ZXF1aWVsQGNvbGxhYm9yYS5jb20+ Cj4gU2lnbmVkLW9mZi1ieTogRXplcXVpZWwgR2FyY2lhIDxlemVxdWllbEBjb2xsYWJvcmEuY29t Pgo+IFNpZ25lZC1vZmYtYnk6IEFkcmlhbiBSYXRpdSA8YWRyaWFuLnJhdGl1QGNvbGxhYm9yYS5j b20+Cj4gU2lnbmVkLW9mZi1ieTogQW5kcnplaiBQaWV0cmFzaWV3aWN6IDxhbmRyemVqLnBAY29s bGFib3JhLmNvbT4KPiBDby1kZXZlbG9wZWQtYnk6IERhbmllbCBBbG1laWRhIDxkYW5pZWwuYWxt ZWlkYUBjb2xsYWJvcmEuY29tPgo+IFNpZ25lZC1vZmYtYnk6IERhbmllbCBBbG1laWRhIDxkYW5p ZWwuYWxtZWlkYUBjb2xsYWJvcmEuY29tPgo+IC0tLQo+ICAuLi4vdXNlcnNwYWNlLWFwaS9tZWRp YS92NGwvYmlibGlvLnJzdCAgICAgICAgfCAgMTAgKwo+ICAuLi4vbWVkaWEvdjRsL2V4dC1jdHJs cy1jb2RlYy1zdGF0ZWxlc3MucnN0ICAgfCA1NDUgKysrKysrKysrKysrKysrKysrCj4gIC4uLi9t ZWRpYS92NGwvcGl4Zm10LWNvbXByZXNzZWQucnN0ICAgICAgICAgICB8ICAxNSArCj4gIC4uLi9t ZWRpYS92NGwvdmlkaW9jLWctZXh0LWN0cmxzLnJzdCAgICAgICAgICB8ICAgOCArCj4gIC4uLi9t ZWRpYS92NGwvdmlkaW9jLXF1ZXJ5Y3RybC5yc3QgICAgICAgICAgICB8ICAxMiArCj4gIC4uLi9t ZWRpYS92aWRlb2RldjIuaC5yc3QuZXhjZXB0aW9ucyAgICAgICAgICB8ICAgMiArCj4gIGRyaXZl cnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItY3RybHMtY29yZS5jICAgICB8IDE3NCArKysrKysKPiAg ZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1jdHJscy1kZWZzLmMgICAgIHwgICA4ICsKPiAg ZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1pb2N0bC5jICAgICAgICAgIHwgICAxICsKPiAg aW5jbHVkZS9tZWRpYS92NGwyLWN0cmxzLmggICAgICAgICAgICAgICAgICAgIHwgICA0ICsKPiAg aW5jbHVkZS91YXBpL2xpbnV4L3Y0bDItY29udHJvbHMuaCAgICAgICAgICAgIHwgNDMzICsrKysr KysrKysrKysrCj4gIGluY2x1ZGUvdWFwaS9saW51eC92aWRlb2RldjIuaCAgICAgICAgICAgICAg ICB8ICAgNiArCj4gIDEyIGZpbGVzIGNoYW5nZWQsIDEyMTggaW5zZXJ0aW9ucygrKQo+IAo+IGRp ZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvbWVkaWEvdjRsL2JpYmxpby5y c3QgYi9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvbWVkaWEvdjRsL2JpYmxpby5yc3QKPiBp bmRleCA3YjhlNjczOGZmOWUuLjljZDE4YzE1M2QxOSAxMDA2NDQKPiAtLS0gYS9Eb2N1bWVudGF0 aW9uL3VzZXJzcGFjZS1hcGkvbWVkaWEvdjRsL2JpYmxpby5yc3QKPiArKysgYi9Eb2N1bWVudGF0 aW9uL3VzZXJzcGFjZS1hcGkvbWVkaWEvdjRsL2JpYmxpby5yc3QKPiBAQCAtNDE3LDMgKzQxNywx MyBAQCBWUDgKPiAgOnRpdGxlOiAgICAgUkZDIDYzODY6ICJWUDggRGF0YSBGb3JtYXQgYW5kIERl Y29kaW5nIEd1aWRlIgo+ICAKPiAgOmF1dGhvcjogICAgSi4gQmFua29za2kgZXQgYWwuCj4gKwo+ ICsuLiBfdnA5Ogo+ICsKPiArVlA5Cj4gKz09PQo+ICsKPiArCj4gKzp0aXRsZTogICAgIFZQOSBC aXRzdHJlYW0gJiBEZWNvZGluZyBQcm9jZXNzIFNwZWNpZmljYXRpb24KPiArCj4gKzphdXRob3I6 ICAgIEFkcmlhbiBHcmFuZ2UgKEdvb2dsZSksIFBldGVyIGRlIFJpdmF6IChBcmdvbiBEZXNpZ24p LCBKb25hdGhhbiBIdW50IChBcmdvbiBEZXNpZ24pCj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRp b24vdXNlcnNwYWNlLWFwaS9tZWRpYS92NGwvZXh0LWN0cmxzLWNvZGVjLXN0YXRlbGVzcy5yc3Qg Yi9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvbWVkaWEvdjRsL2V4dC1jdHJscy1jb2RlYy1z dGF0ZWxlc3MucnN0Cj4gaW5kZXggNzJmNWU4NWI0ZjM0Li5hZjA2ZDQ2ZTU5OTMgMTAwNjQ0Cj4g LS0tIGEvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL21lZGlhL3Y0bC9leHQtY3RybHMtY29k ZWMtc3RhdGVsZXNzLnJzdAo+ICsrKyBiL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRp YS92NGwvZXh0LWN0cmxzLWNvZGVjLXN0YXRlbGVzcy5yc3QKPiBAQCAtMTQ1OCwzICsxNDU4LDU0 OCBAQCBGV0hUIEZsYWdzCj4gIC4uIHJhdzo6IGxhdGV4Cj4gIAo+ICAgICAgXG5vcm1hbHNpemUK PiArCj4gKy4uIF92NGwyLWNvZGVjLXN0YXRlbGVzcy12cDk6Cj4gKwo+ICtgYFY0TDJfQ0lEX1NU QVRFTEVTU19WUDlfQ09NUFJFU1NFRF9IRFJfUFJPQlMgKHN0cnVjdClgYAo+ICsgICAgU3RvcmVz IFZQOSBwcm9iYWJpbGl0aWVzIHVwZGF0ZXMgYXMgcGFyc2VkIGZyb20gdGhlIGN1cnJlbnQgY29t cHJlc3NlZCBmcmFtZQo+ICsgICAgaGVhZGVyLiBBIHZhbHVlIG9mIHplcm8gaW4gYW4gYXJyYXkg ZWxlbWVudCBtZWFucyBubyB1cGRhdGUgb2YgdGhlIHJlbGV2YW50Cj4gKyAgICBwcm9iYWJpbGl0 eS4gTW90aW9uIHZlY3Rvci1yZWxhdGVkIHVwZGF0ZXMgY29udGFpbiBhIG5ldyB2YWx1ZSBvciB6 ZXJvLiBBbGwKPiArICAgIG90aGVyIHVwZGF0ZXMgY29udGFpbiB2YWx1ZXMgdHJhbnNsYXRlZCB3 aXRoIGludl9tYXBfdGFibGVbXSAoc2VlIDYuMy41IGluCj4gKyAgICA6cmVmOmB2cDlgKS4KCkFz IHdlIGRpc2N1c3MsIHdpZGV3aW5lIGFuZCBvdGhlciBjcnlwdG8gbWF5IGVuY3J5cHQgdGhlIGNv bXByZXNzZWQgaGVhZGVycywgc28KcGFzc2luZyB0aGlzIGluZm9ybWF0aW9uIGlzIG5vdCBhbHdh eXMgcG9zc2libGUgZnJvbSB1c2Vyc3BhY2UuIE5ld2VyIFZQOQpkZWNvZGVycyAobm90YWJseSBu ZXdlciBSb2NrY2hpcCBkZWNvZGVyKSBhcmUgYmVpbmcgYmVpbmcgZXh0ZW5kZWQgd2l0aCBmdWxs IEhXCnN1cHBvcnQgZm9yIGNvbXByZXNzZWQgaGVhZGVyIGhhbmRsaW5nIGluY2x1ZGluZyBwcm9i YWJpbGl0eSB1cGRhdGVzLiBSZWdhcmRsZXNzCmlmIHdlIGxpa2UgZHJtIG9yIG5vdCwgd2Ugc2hv dWxkIGF0IGxlYXN0IG1ha2Ugc3VyZSB0aGUgc3BlYyBhbGxvdyB0byBvcHRpbWl6ZQphbmQgc2tp cCB0aGlzIGNvbnRyb2wuCgpEb2N1bWVudGluZyB0aGlzIHdpbGwgcmVhc3N1cmUgZHJpdmVyIHdy aXRlcnMgdGhhdCBkb24ndCBuZWVkIGl0IGFuZCB3aWxsIGxldAp1c2Vyc3BhY2UgZGV2cyBrbm93 IHRoYXQgdGhleSBzaG91bGQgY2hlY2sgdGhlIGNvbnRyb2wgcHJlc2VuY2UgYW5kIGNhbiB0aGVu CnNraXAgdGhlIGFzc29jaWF0ZSBlbnRyb3B5IGRlY29kaW5nIGlmIG5vdCBuZWVkZWQuCgo+ICsK PiArLi4gYzp0eXBlOjogdjRsMl9jdHJsX3ZwOV9jb21wcmVzc2VkX2hkcl9wcm9icwo+ICsKPiAr Li4gY3NzY2xhc3M6OiBsb25ndGFibGUKPiArCj4gKy4uIHRhYnVsYXJjb2x1bW5zOjogfHB7NS44 Y219fHB7NC44Y219fHB7Ni42Y219fAo+ICsKPiArLi4gZmxhdC10YWJsZTo6IHN0cnVjdCB2NGwy X2N0cmxfdnA5X2NvbXByZXNzZWRfaGRyX3Byb2JzCj4gKyAgICA6aGVhZGVyLXJvd3M6ICAwCj4g KyAgICA6c3R1Yi1jb2x1bW5zOiAwCj4gKyAgICA6d2lkdGhzOiAgICAgICAxIDEgMgo+ICsKPiAr ICAgICogLSBfX3U4Cj4gKyAgICAgIC0gYGB0eDhbMl1bMV1gYAo+ICsgICAgICAtIFRYIDh4OCBw cm9iYWJpbGl0aWVzIGRlbHRhLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYHR4MTZbMl1b Ml1gYAo+ICsgICAgICAtIFRYIDE2eDE2IHByb2JhYmlsaXRpZXMgZGVsdGEuCj4gKyAgICAqIC0g X191OAo+ICsgICAgICAtIGBgdHgzMlsyXVszXWBgCj4gKyAgICAgIC0gVFggMzJ4MzIgcHJvYmFi aWxpdGllcyBkZWx0YS4KPiArICAgICogLSBfX3U4Cj4gKyAgICAgIC0gYGBjb2VmWzRdWzJdWzJd WzZdWzZdWzNdYGAKPiArICAgICAgLSBDb2VmZmljaWVudCBwcm9iYWJpbGl0aWVzIGRlbHRhLgo+ ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYHNraXBbM11gYAo+ICsgICAgICAtIFNraXAgcHJv YmFiaWxpdGllcyBkZWx0YS4KPiArICAgICogLSBfX3U4Cj4gKyAgICAgIC0gYGBpbnRlcl9tb2Rl WzddWzNdYGAKPiArICAgICAgLSBJbnRlciBwcmVkaWN0aW9uIG1vZGUgcHJvYmFiaWxpdGllcyBk ZWx0YS4KPiArICAgICogLSBfX3U4Cj4gKyAgICAgIC0gYGBpbnRlcnBfZmlsdGVyWzRdWzJdYGAK PiArICAgICAgLSBJbnRlcnBvbGF0aW9uIGZpbHRlciBwcm9iYWJpbGl0aWVzIGRlbHRhLgo+ICsg ICAgKiAtIF9fdTgKPiArICAgICAgLSBgYGlzX2ludGVyWzRdYGAKPiArICAgICAgLSBJcyBpbnRl ci1ibG9jayBwcm9iYWJpbGl0aWVzIGRlbHRhLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBg YGNvbXBfbW9kZVs1XWBgCj4gKyAgICAgIC0gQ29tcG91bmQgcHJlZGljdGlvbiBtb2RlIHByb2Jh YmlsaXRpZXMgZGVsdGEuCj4gKyAgICAqIC0gX191OAo+ICsgICAgICAtIGBgc2luZ2xlX3JlZls1 XVsyXWBgCj4gKyAgICAgIC0gU2luZ2xlIHJlZmVyZW5jZSBwcm9iYWJpbGl0aWVzIGRlbHRhLgo+ ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYGNvbXBfcmVmWzVdYGAKPiArICAgICAgLSBDb21w b3VuZCByZWZlcmVuY2UgcHJvYmFiaWxpdGllcyBkZWx0YS4KPiArICAgICogLSBfX3U4Cj4gKyAg ICAgIC0gYGB5X21vZGVbNF1bOV1gYAo+ICsgICAgICAtIFkgcHJlZGljdGlvbiBtb2RlIHByb2Jh YmlsaXRpZXMgZGVsdGEuCj4gKyAgICAqIC0gX191OAo+ICsgICAgICAtIGBgdXZfbW9kZVsxMF1b OV1gYAo+ICsgICAgICAtIFVWIHByZWRpY3Rpb24gbW9kZSBwcm9iYWJpbGl0aWVzIGRlbHRhLgo+ ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYHBhcnRpdGlvblsxNl1bM11gYAo+ICsgICAgICAt IFBhcnRpdGlvbiBwcm9iYWJpbGl0aWVzIGRlbHRhLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAg LSBgYG12LmpvaW50WzNdYGAKPiArICAgICAgLSBNb3Rpb24gdmVjdG9yIGpvaW50IHByb2JhYmls aXRpZXMgZGVsdGEuCj4gKyAgICAqIC0gX191OAo+ICsgICAgICAtIGBgbXYuc2lnblsyXWBgCj4g KyAgICAgIC0gTW90aW9uIHZlY3RvciBzaWduIHByb2JhYmlsaXRpZXMgZGVsdGEuCj4gKyAgICAq IC0gX191OAo+ICsgICAgICAtIGBgbXYuY2xhc3Nlc1syXVsxMF1gYAo+ICsgICAgICAtIE1vdGlv biB2ZWN0b3IgY2xhc3MgcHJvYmFiaWxpdGllcyBkZWx0YS4KPiArICAgICogLSBfX3U4Cj4gKyAg ICAgIC0gYGBtdi5jbGFzczBfYml0WzJdYGAKPiArICAgICAgLSBNb3Rpb24gdmVjdG9yIGNsYXNz MCBiaXQgcHJvYmFiaWxpdGllcyBkZWx0YS4KPiArICAgICogLSBfX3U4Cj4gKyAgICAgIC0gYGBt di5iaXRzWzJdWzEwXWBgCj4gKyAgICAgIC0gTW90aW9uIHZlY3RvciBiaXRzIHByb2JhYmlsaXRp ZXMgZGVsdGEuCj4gKyAgICAqIC0gX191OAo+ICsgICAgICAtIGBgbXYuY2xhc3MwX2ZyWzJdWzJd WzNdYGAKPiArICAgICAgLSBNb3Rpb24gdmVjdG9yIGNsYXNzMCBmcmFjdGlvbmFsIGJpdCBwcm9i YWJpbGl0aWVzIGRlbHRhLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYG12LmZyWzJdWzNd YGAKPiArICAgICAgLSBNb3Rpb24gdmVjdG9yIGZyYWN0aW9uYWwgYml0IHByb2JhYmlsaXRpZXMg ZGVsdGEuCj4gKyAgICAqIC0gX191OAo+ICsgICAgICAtIGBgbXYuY2xhc3MwX2hwWzJdYGAKPiAr ICAgICAgLSBNb3Rpb24gdmVjdG9yIGNsYXNzMCBoaWdoIHByZWNpc2lvbiBmcmFjdGlvbmFsIGJp dCBwcm9iYWJpbGl0aWVzIGRlbHRhLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYG12Lmhw WzJdYGAKPiArICAgICAgLSBNb3Rpb24gdmVjdG9yIGhpZ2ggcHJlY2lzaW9uIGZyYWN0aW9uYWwg Yml0IHByb2JhYmlsaXRpZXMgZGVsdGEuCj4gKwo+ICtgYFY0TDJfQ0lEX1NUQVRFTEVTU19WUDlf RlJBTUUgKHN0cnVjdClgYAo+ICsgICAgU3BlY2lmaWVzIHRoZSBmcmFtZSBwYXJhbWV0ZXJzIGZv ciB0aGUgYXNzb2NpYXRlZCBWUDkgZnJhbWUgZGVjb2RlIHJlcXVlc3QuCj4gKyAgICBUaGlzIGlu Y2x1ZGVzIHRoZSBuZWNlc3NhcnkgcGFyYW1ldGVycyBmb3IgY29uZmlndXJpbmcgYSBzdGF0ZWxl c3MgaGFyZHdhcmUKPiArICAgIGRlY29kaW5nIHBpcGVsaW5lIGZvciBWUDkuIFRoZSBiaXRzdHJl YW0gcGFyYW1ldGVycyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcKPiArICAgIHRvIDpyZWY6YHZwOWAu Cj4gKwo+ICsuLiBjOnR5cGU6OiB2NGwyX2N0cmxfdnA5X2ZyYW1lCj4gKwo+ICsuLiBjc3NjbGFz czo6IGxvbmd0YWJsZQo+ICsKPiArLi4gdGFidWxhcmNvbHVtbnM6OiB8cHsxLjVjbX18cHs2LjNj bX18cHs5LjRjbX18Cj4gKwo+ICsuLiBmbGF0LXRhYmxlOjogc3RydWN0IHY0bDJfY3RybF92cDlf ZnJhbWUKPiArICAgIDpoZWFkZXItcm93czogIDAKPiArICAgIDpzdHViLWNvbHVtbnM6IDAKPiAr ICAgIDp3aWR0aHM6ICAgICAgIDEgMSAyCj4gKwo+ICsgICAgKiAtIHN0cnVjdCA6Yzp0eXBlOmB2 NGwyX3ZwOV9sb29wX2ZpbHRlcmAKPiArICAgICAgLSBgYGxmYGAKPiArICAgICAgLSBMb29wIGZp bHRlciBwYXJhbWV0ZXJzLiBTZWUgc3RydWN0IDpjOnR5cGU6YHY0bDJfdnA5X2xvb3BfZmlsdGVy YCBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgICAgKiAtIHN0cnVjdCA6Yzp0eXBlOmB2NGwyX3ZwOV9x dWFudGl6YXRpb25gCj4gKyAgICAgIC0gYGBxdWFudGBgCj4gKyAgICAgIC0gUXVhbnRpemF0aW9u IHBhcmFtZXRlcnMuIFNlZSA6Yzp0eXBlOmB2NGwyX3ZwOV9xdWFudGl6YXRpb25gIGZvciBtb3Jl IGRldGFpbHMuCj4gKyAgICAqIC0gc3RydWN0IDpjOnR5cGU6YHY0bDJfdnA5X3NlZ21lbnRhdGlv bmAKPiArICAgICAgLSBgYHNlZ2BgCj4gKyAgICAgIC0gU2VnbWVudGF0aW9uIHBhcmFtZXRlcnMu IFNlZSA6Yzp0eXBlOmB2NGwyX3ZwOV9zZWdtZW50YXRpb25gIGZvciBtb3JlIGRldGFpbHMuCj4g KyAgICAqIC0gX191MzIKPiArICAgICAgLSBgYGZsYWdzYGAKPiArICAgICAgLSBDb21iaW5hdGlv biBvZiBWNEwyX1ZQOV9GUkFNRV9GTEFHXyogZmxhZ3MuIFNlZSA6Yzp0eXBlOmB2NGwyX3ZwOV9m cmFtZV9mbGFnc2AuCj4gKyAgICAqIC0gX191MTYKPiArICAgICAgLSBgYGNvbXByZXNzZWRfaGVh ZGVyX3NpemVgYAo+ICsgICAgICAtIENvbXByZXNzZWQgaGVhZGVyIHNpemUgaW4gYnl0ZXMuCj4g KyAgICAqIC0gX191MTYKPiArICAgICAgLSBgYHVuY29tcHJlc3NlZF9oZWFkZXJfc2l6ZWBgCj4g KyAgICAgIC0gVW5jb21wcmVzc2VkIGhlYWRlciBzaXplIGluIGJ5dGVzLgo+ICsgICAgKiAtIF9f dTE2Cj4gKyAgICAgIC0gYGBmcmFtZV93aWR0aF9taW51c18xYGAKPiArICAgICAgLSBBZGQgMSB0 byBnZXQgdGhlIGZyYW1lIHdpZHRoIGV4cHJlc3NlZCBpbiBwaXhlbHMuIFNlZSBzZWN0aW9uIDcu Mi4zIGluIDpyZWY6YHZwOWAuCj4gKyAgICAqIC0gX191MTYKPiArICAgICAgLSBgYGZyYW1lX2hl aWdodF9taW51c18xYGAKPiArICAgICAgLSBBZGQgMSB0byBnZXQgdGhlIGZyYW1lIGhlaWdodCBl eHByZXNzZWQgaW4gcGl4ZWxzLiBTZWUgc2VjdGlvbiA3LjIuMyBpbiA6cmVmOmB2cDlgLgo+ICsg ICAgKiAtIF9fdTE2Cj4gKyAgICAgIC0gYGByZW5kZXJfd2lkdGhfbWludXNfMWBgCj4gKyAgICAg IC0gQWRkIDEgdG8gZ2V0IHRoZSBleHBlY3RlZCByZW5kZXIgd2lkdGggZXhwcmVzc2VkIGluIHBp eGVscy4gVGhpcyBpcwo+ICsgICAgICAgIG5vdCB1c2VkIGR1cmluZyB0aGUgZGVjb2RpbmcgcHJv Y2VzcyBidXQgbWlnaHQgYmUgdXNlZCBieSBIVyBzY2FsZXJzIHRvCj4gKyAgICAgICAgcHJlcGFy ZSBhIGZyYW1lIHRoYXQncyByZWFkeSBmb3Igc2Nhbm91dC4gU2VlIHNlY3Rpb24gNy4yLjQgaW4g OnJlZjpgdnA5YC4KPiArICAgICogLSBfX3UxNgo+ICsgICAgICAtIHJlbmRlcl9oZWlnaHRfbWlu dXNfMQo+ICsgICAgICAtIEFkZCAxIHRvIGdldCB0aGUgZXhwZWN0ZWQgcmVuZGVyIGhlaWdodCBl eHByZXNzZWQgaW4gcGl4ZWxzLiBUaGlzIGlzCj4gKyAgICAgICAgbm90IHVzZWQgZHVyaW5nIHRo ZSBkZWNvZGluZyBwcm9jZXNzIGJ1dCBtaWdodCBiZSB1c2VkIGJ5IEhXIHNjYWxlcnMgdG8KPiAr ICAgICAgICBwcmVwYXJlIGEgZnJhbWUgdGhhdCdzIHJlYWR5IGZvciBzY2Fub3V0LiBTZWUgc2Vj dGlvbiA3LjIuNCBpbiA6cmVmOmB2cDlgLgo+ICsgICAgKiAtIF9fdTY0Cj4gKyAgICAgIC0gYGBs YXN0X2ZyYW1lX3RzYGAKPiArICAgICAgLSAibGFzdCIgcmVmZXJlbmNlIGJ1ZmZlciB0aW1lc3Rh bXAuCj4gKwlUaGUgdGltZXN0YW1wIHJlZmVycyB0byB0aGUgYGB0aW1lc3RhbXBgYCBmaWVsZCBp bgo+ICsgICAgICAgIHN0cnVjdCA6Yzp0eXBlOmB2NGwyX2J1ZmZlcmAuIFVzZSB0aGUgOmM6ZnVu YzpgdjRsMl90aW1ldmFsX3RvX25zKClgCj4gKyAgICAgICAgZnVuY3Rpb24gdG8gY29udmVydCB0 aGUgc3RydWN0IDpjOnR5cGU6YHRpbWV2YWxgIGluIHN0cnVjdAo+ICsgICAgICAgIDpjOnR5cGU6 YHY0bDJfYnVmZmVyYCB0byBhIF9fdTY0Lgo+ICsgICAgKiAtIF9fdTY0Cj4gKyAgICAgIC0gYGBn b2xkZW5fZnJhbWVfdHNgYAo+ICsgICAgICAtICJnb2xkZW4iIHJlZmVyZW5jZSBidWZmZXIgdGlt ZXN0YW1wLgo+ICsJVGhlIHRpbWVzdGFtcCByZWZlcnMgdG8gdGhlIGBgdGltZXN0YW1wYGAgZmll bGQgaW4KPiArICAgICAgICBzdHJ1Y3QgOmM6dHlwZTpgdjRsMl9idWZmZXJgLiBVc2UgdGhlIDpj OmZ1bmM6YHY0bDJfdGltZXZhbF90b19ucygpYAo+ICsgICAgICAgIGZ1bmN0aW9uIHRvIGNvbnZl cnQgdGhlIHN0cnVjdCA6Yzp0eXBlOmB0aW1ldmFsYCBpbiBzdHJ1Y3QKPiArICAgICAgICA6Yzp0 eXBlOmB2NGwyX2J1ZmZlcmAgdG8gYSBfX3U2NC4KPiArICAgICogLSBfX3U2NAo+ICsgICAgICAt IGBgYWx0X2ZyYW1lX3RzYGAKPiArICAgICAgLSAiYWx0IiByZWZlcmVuY2UgYnVmZmVyIHRpbWVz dGFtcC4KPiArCVRoZSB0aW1lc3RhbXAgcmVmZXJzIHRvIHRoZSBgYHRpbWVzdGFtcGBgIGZpZWxk IGluCj4gKyAgICAgICAgc3RydWN0IDpjOnR5cGU6YHY0bDJfYnVmZmVyYC4gVXNlIHRoZSA6Yzpm dW5jOmB2NGwyX3RpbWV2YWxfdG9fbnMoKWAKPiArICAgICAgICBmdW5jdGlvbiB0byBjb252ZXJ0 IHRoZSBzdHJ1Y3QgOmM6dHlwZTpgdGltZXZhbGAgaW4gc3RydWN0Cj4gKyAgICAgICAgOmM6dHlw ZTpgdjRsMl9idWZmZXJgIHRvIGEgX191NjQuCj4gKyAgICAqIC0gX191OAo+ICsgICAgICAtIGBg cmVmX2ZyYW1lX3NpZ25fYmlhc2BgCj4gKyAgICAgIC0gYSBiaXRmaWVsZCBzcGVjaWZ5aW5nIHdo ZXRoZXIgdGhlIHNpZ24gYmlhcyBpcyBzZXQgZm9yIGEgZ2l2ZW4KPiArICAgICAgICByZWZlcmVu Y2UgZnJhbWUuIFNlZSA6Yzp0eXBlOmB2NGwyX3ZwOV9yZWZfZnJhbWVfc2lnbl9iaWFzYCBmb3Ig bW9yZSBkZXRhaWxzLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYHJlc2V0X2ZyYW1lX2Nv bnRleHRgYAo+ICsgICAgICAtIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBmcmFtZSBjb250ZXh0IHNo b3VsZCBiZSByZXNldCB0byBkZWZhdWx0IHZhbHVlcy4gU2VlCj4gKyAgICAgICAgOmM6dHlwZTpg djRsMl92cDlfcmVzZXRfZnJhbWVfY29udGV4dGAgZm9yIG1vcmUgZGV0YWlscy4KPiArICAgICog LSBfX3U4Cj4gKyAgICAgIC0gYGBmcmFtZV9jb250ZXh0X2lkeGBgCj4gKyAgICAgIC0gRnJhbWUg Y29udGV4dCB0aGF0IHNob3VsZCBiZSB1c2VkL3VwZGF0ZWQuCj4gKyAgICAqIC0gX191OAo+ICsg ICAgICAtIGBgcHJvZmlsZWBgCj4gKyAgICAgIC0gVlA5IHByb2ZpbGUuIENhbiBiZSAwLCAxLCAy IG9yIDMuCj4gKyAgICAqIC0gX191OAo+ICsgICAgICAtIGBgYml0X2RlcHRoYGAKPiArICAgICAg LSBDb21wb25lbnQgZGVwdGggaW4gYml0cy4gQ2FuIGJlIDgsIDEwIG9yIDEyLiBOb3RlIHRoYXQg bm90IGFsbCBwcm9maWxlcwo+ICsgICAgICAgIHN1cHBvcnQgMTAgYW5kL29yIDEyIGJpdHMgZGVw dGhzLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYGludGVycG9sYXRpb25fZmlsdGVyYGAK PiArICAgICAgLSBTcGVjaWZpZXMgdGhlIGZpbHRlciBzZWxlY3Rpb24gdXNlZCBmb3IgcGVyZm9y bWluZyBpbnRlciBwcmVkaWN0aW9uLiBTZWUKPiArICAgICAgICA6Yzp0eXBlOmB2NGwyX3ZwOV9p bnRlcnBvbGF0aW9uX2ZpbHRlcmAgZm9yIG1vcmUgZGV0YWlscy4KPiArICAgICogLSBfX3U4Cj4g KyAgICAgIC0gYGB0aWxlX2NvbHNfbG9nMmBgCj4gKyAgICAgIC0gU3BlY2lmaWVzIHRoZSBiYXNl IDIgbG9nYXJpdGhtIG9mIHRoZSB3aWR0aCBvZiBlYWNoIHRpbGUgKHdoZXJlIHRoZQo+ICsgICAg ICAgIHdpZHRoIGlzIG1lYXN1cmVkIGluIHVuaXRzIG9mIDh4OCBibG9ja3MpLiBTaGFsbCBiZSBs ZXNzIHRoYW4gb3IgZXF1YWwKPiArICAgICAgICB0byA2Lgo+ICsgICAgKiAtIF9fdTgKPiArICAg ICAgLSBgYHRpbGVfcm93c19sb2cyYGAKPiArICAgICAgLSBTcGVjaWZpZXMgdGhlIGJhc2UgMiBs b2dhcml0aG0gb2YgdGhlIGhlaWdodCBvZiBlYWNoIHRpbGUgKHdoZXJlIHRoZQo+ICsgICAgICAg IGhlaWdodCBpcyBtZWFzdXJlZCBpbiB1bml0cyBvZiA4eDggYmxvY2tzKS4KPiArICAgICogLSBf X3U4Cj4gKyAgICAgIC0gYGB0eF9tb2RlYGAKPiArICAgICAgLSBTcGVjaWZpZXMgdGhlIFRYIG1v ZGUuIFNlZSA6Yzp0eXBlOmB2NGwyX3ZwOV90eF9tb2RlYCBmb3IgbW9yZSBkZXRhaWxzLgo+ICsg ICAgKiAtIF9fdTgKPiArICAgICAgLSBgYHJlZmVyZW5jZV9tb2RlYGAKPiArICAgICAgLSBTcGVj aWZpZXMgdGhlIHR5cGUgb2YgaW50ZXIgcHJlZGljdGlvbiB0byBiZSB1c2VkLiBTZWUKPiArICAg ICAgICA6Yzp0eXBlOmB2NGwyX3ZwOV9yZWZlcmVuY2VfbW9kZWAgZm9yIG1vcmUgZGV0YWlscy4K PiArICAgICogLSBfX3U4Cj4gKyAgICAgIC0gYGByZXNlcnZlZFs2XWBgCj4gKyAgICAgIC0gQXBw bGljYXRpb25zIGFuZCBkcml2ZXJzIG11c3Qgc2V0IHRoaXMgdG8gemVyby4KPiArCj4gKy4uIGM6 dHlwZTo6IHY0bDJfdnA5X2ZyYW1lX2ZsYWdzCj4gKwo+ICsuLiBjc3NjbGFzczo6IGxvbmd0YWJs ZQo+ICsKPiArLi4gdGFidWxhcmNvbHVtbnM6OiB8cHsxLjVjbX18cHs2LjNjbX18cHs5LjRjbX18 Cj4gKwo+ICsuLiBmbGF0LXRhYmxlOjogZW51bSB2NGwyX3ZwOV9mcmFtZV9mbGFncwo+ICsgICAg OmhlYWRlci1yb3dzOiAgMAo+ICsgICAgOnN0dWItY29sdW1uczogMAo+ICsgICAgOndpZHRoczog ICAgICAgMSAyCj4gKwo+ICsgICAgKiAtIGBgVjRMMl9WUDlfRlJBTUVfRkxBR19LRVlfRlJBTUVg YAo+ICsgICAgICAtIFRoZSBmcmFtZSBpcyBhIGtleSBmcmFtZS4KPiArICAgICogLSBgYFY0TDJf VlA5X0ZSQU1FX0ZMQUdfU0hPV19GUkFNRWBgCj4gKyAgICAgIC0gVGhlIGZyYW1lIHNob3VsZCBi ZSBkaXNwbGF5ZWQuCj4gKyAgICAqIC0gYGBWNEwyX1ZQOV9GUkFNRV9GTEFHX0VSUk9SX1JFU0lM SUVOVGBgCj4gKyAgICAgIC0gVGhlIGRlY29kaW5nIHNob3VsZCBiZSBlcnJvciByZXNpbGllbnQu Cj4gKyAgICAqIC0gYGBWNEwyX1ZQOV9GUkFNRV9GTEFHX0lOVFJBX09OTFlgYAo+ICsgICAgICAt IFRoZSBmcmFtZSBkb2VzIG5vdCByZWZlcmVuY2Ugb3RoZXIgZnJhbWVzLgo+ICsgICAgKiAtIGBg VjRMMl9WUDlfRlJBTUVfRkxBR19BTExPV19ISUdIX1BSRUNfTVZgYAo+ICsgICAgICAtIFRoZSBm cmFtZSBjYW4gdXNlIGhpZ2ggcHJlY2lzaW9uIG1vdGlvbiB2ZWN0b3JzLgo+ICsgICAgKiAtIGBg VjRMMl9WUDlfRlJBTUVfRkxBR19SRUZSRVNIX0ZSQU1FX0NUWGBgCj4gKyAgICAgIC0gRnJhbWUg Y29udGV4dCBzaG91bGQgYmUgdXBkYXRlZCBhZnRlciBkZWNvZGluZy4KPiArICAgICogLSBgYFY0 TDJfVlA5X0ZSQU1FX0ZMQUdfUEFSQUxMRUxfREVDX01PREVgYAo+ICsgICAgICAtIFBhcmFsbGVs IGRlY29kaW5nIGlzIHVzZWQuCj4gKyAgICAqIC0gYGBWNEwyX1ZQOV9GUkFNRV9GTEFHX1hfU1VC U0FNUExJTkdgYAo+ICsgICAgICAtIFZlcnRpY2FsIHN1YnNhbXBsaW5nIGlzIGVuYWJsZWQuCj4g KyAgICAqIC0gYGBWNEwyX1ZQOV9GUkFNRV9GTEFHX1lfU1VCU0FNUExJTkdgYAo+ICsgICAgICAt IEhvcml6b250YWwgc3Vic2FtcGxpbmcgaXMgZW5hYmxlZC4KPiArICAgICogLSBgYFY0TDJfVlA5 X0ZSQU1FX0ZMQUdfQ09MT1JfUkFOR0VfRlVMTF9TV0lOR2BgCj4gKyAgICAgIC0gVGhlIGZ1bGwg VVYgcmFuZ2UgaXMgdXNlZC4KPiArCj4gKy4uIGM6dHlwZTo6IHY0bDJfdnA5X3R4X21vZGUKPiAr Cj4gK1NlZSBzZWN0aW9uICc3LjMuMSBUeCBtb2RlIHNlbWFudGljcycgb2YgdGhlIFZQOSBzcGVj aWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuCj4gKwo+ICsuLiBjc3NjbGFzczo6IGxvbmd0YWJs ZQo+ICsKPiArLi4gdGFidWxhcmNvbHVtbnM6OiB8cHsxLjVjbX18cHs2LjNjbX18cHs5LjRjbX18 Cj4gKwo+ICsuLiBmbGF0LXRhYmxlOjogZW51bSB2NGwyX3ZwOV90eF9tb2RlCj4gKyAgICA6aGVh ZGVyLXJvd3M6ICAwCj4gKyAgICA6c3R1Yi1jb2x1bW5zOiAwCj4gKyAgICA6d2lkdGhzOiAgICAg ICAxIDIKPiArCj4gKyAgICAqIC0gYGBWNEwyX1ZQOV9UWF9NT0RFX09OTFlfNFg0YGAKPiArICAg ICAgLSBUcmFuc2Zvcm0gc2l6ZSBpcyA0eDQuCj4gKyAgICAqIC0gYGBWNEwyX1ZQOV9UWF9NT0RF X0FMTE9XXzhYOGBgCj4gKyAgICAgIC0gVHJhbnNmb3JtIHNpemUgY2FuIGJlIHVwIHRvIDh4OC4K PiArICAgICogLSBgYFY0TDJfVlA5X1RYX01PREVfQUxMT1dfMTZYMTZgYAo+ICsgICAgICAtIFRy YW5zZm9ybSBzaXplIGNhbiBiZSB1cCB0byAxNngxNi4KPiArICAgICogLSBgYFY0TDJfVlA5X1RY X01PREVfQUxMT1dfMzJYMzJgYAo+ICsgICAgICAtIHRyYW5zZm9ybSBzaXplIGNhbiBiZSB1cCB0 byAzMngzMi4KPiArICAgICogLSBgYFY0TDJfVlA5X1RYX01PREVfU0VMRUNUYGAKPiArICAgICAg LSBCaXRzdHJlYW0gY29udGFpbnMgdGhlIHRyYW5zZm9ybSBzaXplIGZvciBlYWNoIGJsb2NrLgo+ ICsKPiArLi4gYzp0eXBlOjogdjRsMl92cDlfcmVmZXJlbmNlX21vZGUKPiArCj4gK1NlZSBzZWN0 aW9uICc3LjMuNiBGcmFtZSByZWZlcmVuY2UgbW9kZSBzZW1hbnRpY3MnIG9mIHRoZSBWUDkgc3Bl Y2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgo+ICsKPiArLi4gY3NzY2xhc3M6OiBsb25ndGFi bGUKPiArCj4gKy4uIHRhYnVsYXJjb2x1bW5zOjogfHB7MS41Y219fHB7Ni4zY219fHB7OS40Y219 fAo+ICsKPiArLi4gZmxhdC10YWJsZTo6IGVudW0gdjRsMl92cDlfcmVmZXJlbmNlX21vZGUKPiAr ICAgIDpoZWFkZXItcm93czogIDAKPiArICAgIDpzdHViLWNvbHVtbnM6IDAKPiArICAgIDp3aWR0 aHM6ICAgICAgIDEgMgo+ICsKPiArICAgICogLSBgYFY0TDJfVlA5X1JFRkVSRU5DRV9NT0RFX1NJ TkdMRV9SRUZFUkVOQ0VgYAo+ICsgICAgICAtIEluZGljYXRlcyB0aGF0IGFsbCB0aGUgaW50ZXIg YmxvY2tzIHVzZSBvbmx5IGEgc2luZ2xlIHJlZmVyZW5jZSBmcmFtZQo+ICsgICAgICAgIHRvIGdl bmVyYXRlIG1vdGlvbiBjb21wZW5zYXRlZCBwcmVkaWN0aW9uLgo+ICsgICAgKiAtIGBgVjRMMl9W UDlfUkVGRVJFTkNFX01PREVfQ09NUE9VTkRfUkVGRVJFTkNFYGAKPiArICAgICAgLSBSZXF1aXJl cyBhbGwgdGhlIGludGVyIGJsb2NrcyB0byB1c2UgY29tcG91bmQgbW9kZS4gU2luZ2xlIHJlZmVy ZW5jZQo+ICsgICAgICAgIGZyYW1lIHByZWRpY3Rpb24gaXMgbm90IGFsbG93ZWQuCj4gKyAgICAq IC0gYGBWNEwyX1ZQOV9SRUZFUkVOQ0VfTU9ERV9TRUxFQ1RgYAo+ICsgICAgICAtIEFsbG93cyBl YWNoIGluZGl2aWR1YWwgaW50ZXIgYmxvY2sgdG8gc2VsZWN0IGJldHdlZW4gc2luZ2xlIGFuZAo+ ICsgICAgICAgIGNvbXBvdW5kIHByZWRpY3Rpb24gbW9kZXMuCj4gKwo+ICsuLiBjOnR5cGU6OiB2 NGwyX3ZwOV9pbnRlcnBvbGF0aW9uX2ZpbHRlcgo+ICsKPiArU2VlIHNlY3Rpb24gJzcuMi43IElu dGVycG9sYXRpb24gZmlsdGVyIHNlbWFudGljcycgb2YgdGhlIFZQOSBzcGVjaWZpY2F0aW9uCj4g K2ZvciBtb3JlIGRldGFpbHMuCj4gKwo+ICsuLiBjc3NjbGFzczo6IGxvbmd0YWJsZQo+ICsKPiAr Li4gdGFidWxhcmNvbHVtbnM6OiB8cHsxLjVjbX18cHs2LjNjbX18cHs5LjRjbX18Cj4gKwo+ICsu LiBmbGF0LXRhYmxlOjogZW51bSB2NGwyX3ZwOV9pbnRlcnBvbGF0aW9uX2ZpbHRlcgo+ICsgICAg OmhlYWRlci1yb3dzOiAgMAo+ICsgICAgOnN0dWItY29sdW1uczogMAo+ICsgICAgOndpZHRoczog ICAgICAgMSAyCj4gKwo+ICsgICAgKiAtIGBgVjRMMl9WUDlfSU5URVJQX0ZJTFRFUl9FSUdIVFRB UGBgCj4gKyAgICAgIC0gRWlnaHQgdGFwIGZpbHRlci4KPiArICAgICogLSBgYFY0TDJfVlA5X0lO VEVSUF9GSUxURVJfRUlHSFRUQVBfU01PT1RIYGAKPiArICAgICAgLSBFaWdodCB0YXAgc21vb3Ro IGZpbHRlci4KPiArICAgICogLSBgYFY0TDJfVlA5X0lOVEVSUF9GSUxURVJfRUlHSFRUQVBfU0hB UlBgYAo+ICsgICAgICAtIEVlaWdodCB0YXAgc2hhcnAgZmlsdGVyLgo+ICsgICAgKiAtIGBgVjRM Ml9WUDlfSU5URVJQX0ZJTFRFUl9CSUxJTkVBUmBgCj4gKyAgICAgIC0gQmlsaW5lYXIgZmlsdGVy Lgo+ICsgICAgKiAtIGBgVjRMMl9WUDlfSU5URVJQX0ZJTFRFUl9TV0lUQ0hBQkxFYGAKPiArICAg ICAgLSBGaWx0ZXIgc2VsZWN0aW9uIGlzIHNpZ25hbGVkIGF0IHRoZSBibG9jayBsZXZlbC4KPiAr Cj4gKy4uIGM6dHlwZTo6IHY0bDJfdnA5X3Jlc2V0X2ZyYW1lX2NvbnRleHQKPiArCj4gK1NlZSBz ZWN0aW9uICc3LjIgVW5jb21wcmVzc2VkIGhlYWRlciBzZW1hbnRpY3MnIG9mIHRoZSBWUDkgc3Bl Y2lmaWNhdGlvbgo+ICtmb3IgbW9yZSBkZXRhaWxzLgo+ICsKPiArLi4gY3NzY2xhc3M6OiBsb25n dGFibGUKPiArCj4gKy4uIHRhYnVsYXJjb2x1bW5zOjogfHB7MS41Y219fHB7Ni4zY219fHB7OS40 Y219fAo+ICsKPiArLi4gZmxhdC10YWJsZTo6IGVudW0gdjRsMl92cDlfcmVzZXRfZnJhbWVfY29u dGV4dAo+ICsgICAgOmhlYWRlci1yb3dzOiAgMAo+ICsgICAgOnN0dWItY29sdW1uczogMAo+ICsg ICAgOndpZHRoczogICAgICAgMSAyCj4gKwo+ICsgICAgKiAtIGBgVjRMMl9WUDlfUkVTRVRfRlJB TUVfQ1RYX05PTkVgYAo+ICsgICAgICAtIERvIG5vdCByZXNldCBhbnkgZnJhbWUgY29udGV4dC4K PiArICAgICogLSBgYFY0TDJfVlA5X1JFU0VUX0ZSQU1FX0NUWF9TUEVDYGAKPiArICAgICAgLSBS ZXNldCB0aGUgZnJhbWUgY29udGV4dCBwb2ludGVkIHRvIGJ5Cj4gKyAgICAgICAgOmM6dHlwZTpg djRsMl9jdHJsX3ZwOV9mcmFtZWAuZnJhbWVfY29udGV4dF9pZHguCj4gKyAgICAqIC0gYGBWNEwy X1ZQOV9SRVNFVF9GUkFNRV9DVFhfQUxMYGAKPiArICAgICAgLSBSZXNldCBhbGwgZnJhbWUgY29u dGV4dHMuCj4gKwo+ICsuLiBjOnR5cGU6OiB2NGwyX3ZwOV9pbnRyYV9wcmVkaWN0aW9uX21vZGUK PiArCj4gK1NlZSBzZWN0aW9uICc3LjQuNSBJbnRyYSBmcmFtZSBtb2RlIGluZm8gc2VtYW50aWNz JyBmb3IgbW9yZSBkZXRhaWxzLgo+ICsKPiArLi4gY3NzY2xhc3M6OiBsb25ndGFibGUKPiArCj4g Ky4uIHRhYnVsYXJjb2x1bW5zOjogfHB7MS41Y219fHB7Ni4zY219fHB7OS40Y219fAo+ICsKPiAr Li4gZmxhdC10YWJsZTo6IGVudW0gdjRsMl92cDlfaW50cmFfcHJlZGljdGlvbl9tb2RlCj4gKyAg ICA6aGVhZGVyLXJvd3M6ICAwCj4gKyAgICA6c3R1Yi1jb2x1bW5zOiAwCj4gKyAgICA6d2lkdGhz OiAgICAgICAxIDIKPiArCj4gKyAgICAqIC0gYGBWNEwyX1ZQOV9JTlRSQV9QUkVEX01PREVfRENf UFJFRGBgCj4gKyAgICAgIC0gREMgaW50cmEgcHJlZGljdGlvbi4KPiArICAgICogLSBgYFY0TDJf VlA5X0lOVFJBX1BSRURfTU9ERV9WX1BSRURgYAo+ICsgICAgICAtIFZlcnRpY2FsIGludHJhIHBy ZWRpY3Rpb24uCj4gKyAgICAqIC0gYGBWNEwyX1ZQOV9JTlRSQV9QUkVEX01PREVfSF9QUkVEYGAK PiArICAgICAgLSBIb3Jpem9udGFsIGludHJhIHByZWRpY3Rpb24uCj4gKyAgICAqIC0gYGBWNEwy X1ZQOV9JTlRSQV9QUkVEX01PREVfRDQ1X1BSRURgYAo+ICsgICAgICAtIEQ0NSBpbnRyYSBwcmVk aWN0aW9uLgo+ICsgICAgKiAtIGBgVjRMMl9WUDlfSU5UUkFfUFJFRF9NT0RFX0QxMzVfUFJFRGBg Cj4gKyAgICAgIC0gRDEzNSBpbnRyYSBwcmVkaWN0aW9uLgo+ICsgICAgKiAtIGBgVjRMMl9WUDlf SU5UUkFfUFJFRF9NT0RFX0QxMTdfUFJFRGBgCj4gKyAgICAgIC0gRDExNyBpbnRyYSBwcmVkaWN0 aW9uLgo+ICsgICAgKiAtIGBgVjRMMl9WUDlfSU5UUkFfUFJFRF9NT0RFX0QxNTNfUFJFRGBgCj4g KyAgICAgIC0gRDE1MyBpbnRyYSBwcmVkaWN0aW9uLgo+ICsgICAgKiAtIGBgVjRMMl9WUDlfSU5U UkFfUFJFRF9NT0RFX0QyMDdfUFJFRGBgCj4gKyAgICAgIC0gRDIwNyBpbnRyYSBwcmVkaWN0aW9u Lgo+ICsgICAgKiAtIGBgVjRMMl9WUDlfSU5UUkFfUFJFRF9NT0RFX0Q2M19QUkVEYGAKPiArICAg ICAgLSBENjMgaW50cmEgcHJlZGljdGlvbi4KPiArICAgICogLSBgYFY0TDJfVlA5X0lOVFJBX1BS RURfTU9ERV9UTV9QUkVEYGAKPiArICAgICAgLSBUcnVlIG1vdGlvbiBpbnRyYSBwcmVkaWN0aW9u Lgo+ICsKPiArLi4gYzp0eXBlOjogdjRsMl92cDlfc2VnbWVudGF0aW9uCj4gKwo+ICtFbmNvZGVz IHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVycy4gU2VlIHNlY3Rpb24gJzcuMi4xMCBTZWdtZW50 YXRpb24KPiArcGFyYW1zIHN5bnRheCcgb2YgdGhlIFZQOSBzcGVjaWZpY2F0aW9uIGZvciBtb3Jl IGRldGFpbHMuCj4gKwo+ICsuLiBjc3NjbGFzczo6IGxvbmd0YWJsZQo+ICsKPiArLi4gdGFidWxh cmNvbHVtbnM6OiB8cHsxLjVjbX18cHs2LjNjbX18cHs5LjRjbX18Cj4gKwo+ICsuLiBmbGF0LXRh YmxlOjogc3RydWN0IHY0bDJfdnA5X3NlZ21lbnRhdGlvbgo+ICsgICAgOmhlYWRlci1yb3dzOiAg MAo+ICsgICAgOnN0dWItY29sdW1uczogMAo+ICsgICAgOndpZHRoczogICAgICAgMSAxIDIKPiAr Cj4gKyAgICAqIC0gX191OAo+ICsgICAgICAtIGBgZmVhdHVyZV9kYXRhWzhdWzRdYGAKPiArICAg ICAgLSBEYXRhIGF0dGFjaGVkIHRvIGVhY2ggZmVhdHVyZS4gRGF0YSBlbnRyeSBpcyBvbmx5IHZh bGlkIGlmIHRoZSBmZWF0dXJlCj4gKyAgICAgICAgaXMgZW5hYmxlZC4KPiArICAgICogLSBfX3U4 Cj4gKyAgICAgIC0gYGBmZWF0dXJlX2VuYWJsZWRbOF1gYAo+ICsgICAgICAtIEJpdG1hc2sgZGVm aW5pbmcgd2hpY2ggZmVhdHVyZXMgYXJlIGVuYWJsZWQgaW4gZWFjaCBzZWdtZW50Lgo+ICsgICAg KiAtIF9fdTgKPiArICAgICAgLSBgYHRyZWVfcHJvYnNbN11gYAo+ICsgICAgICAtIFNwZWNpZmll cyB0aGUgcHJvYmFiaWxpdHkgdmFsdWVzIHRvIGJlIHVzZWQgd2hlbiBkZWNvZGluZyBhIFNlZ21l bnQtSUQuCj4gKyAgICAgICAgU2VlICc1LjE1LiBTZWdtZW50YXRpb24gbWFwJyBzZWN0aW9uIG9m IDpyZWY6YHZwOWAgZm9yIG1vcmUgZGV0YWlscy4KPiArICAgICogLSBfX3U4Cj4gKyAgICAgIC0g YGBwcmVkX3Byb2JzWzNdYGAKPiArICAgICAgLSBTcGVjaWZpZXMgdGhlIHByb2JhYmlsaXR5IHZh bHVlcyB0byBiZSB1c2VkIHdoZW4gZGVjb2RpbmcgYQo+ICsgICAgICAgIFByZWRpY3RlZC1TZWdt ZW50LUlELiBTZWUgJzYuNC4xNC4gR2V0IHNlZ21lbnQgaWQgc3ludGF4Jwo+ICsgICAgICAgIHNl Y3Rpb24gb2YgOnJlZjpgdnA5YCBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgICAgKiAtIF9fdTgKPiAr ICAgICAgLSBgYGZsYWdzYGAKPiArICAgICAgLSBDb21iaW5hdGlvbiBvZiBWNEwyX1ZQOV9TRUdN RU5UQVRJT05fRkxBR18qIGZsYWdzLiBTZWUKPiArICAgICAgICA6Yzp0eXBlOmB2NGwyX3ZwOV9z ZWdtZW50YXRpb25fZmxhZ3NgLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYHJlc2VydmVk WzVdYGAKPiArICAgICAgLSBBcHBsaWNhdGlvbnMgYW5kIGRyaXZlcnMgbXVzdCBzZXQgdGhpcyB0 byB6ZXJvLgo+ICsKPiArLi4gYzp0eXBlOjogdjRsMl92cDlfc2VnbWVudF9mZWF0dXJlCj4gKwo+ ICtTZWdtZW50IGZlYXR1cmUgSURzLiBTZWUgc2VjdGlvbiAnNy4yLjEwIFNlZ21lbnRhdGlvbiBw YXJhbXMgc3ludGF4JyBvZiB0aGUKPiArVlA5IHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWls cy4KPiArCj4gKy4uIGNzc2NsYXNzOjogbG9uZ3RhYmxlCj4gKwo+ICsuLiB0YWJ1bGFyY29sdW1u czo6IHxwezEuNWNtfXxwezYuM2NtfXxwezkuNGNtfXwKPiArCj4gKy4uIGZsYXQtdGFibGU6OiBl bnVtIHY0bDJfdnA5X3NlZ21lbnRfZmVhdHVyZQo+ICsgICAgOmhlYWRlci1yb3dzOiAgMAo+ICsg ICAgOnN0dWItY29sdW1uczogMAo+ICsgICAgOndpZHRoczogICAgICAgMSAyCj4gKwo+ICsgICAg KiAtIGBgVjRMMl9WUDlfU0VHX0xWTF9BTFRfUWBgCj4gKyAgICAgIC0gUXVhbnRpemVyIHNlZ21l bnQgZmVhdHVyZS4KPiArICAgICogLSBgYFY0TDJfVlA5X1NFR19MVkxfQUxUX0xgYAo+ICsgICAg ICAtIExvb3AgZmlsdGVyIHNlZ21lbnQgZmVhdHVyZS4KPiArICAgICogLSBgYFY0TDJfVlA5X1NF R19MVkxfUkVGX0ZSQU1FYGAKPiArICAgICAgLSBSZWZlcmVuY2UgZnJhbWUgc2VnbWVudCBmZWF0 dXJlLgo+ICsgICAgKiAtIGBgVjRMMl9WUDlfU0VHX0xWTF9TS0lQYGAKPiArICAgICAgLSBTa2lw IHNlZ21lbnQgZmVhdHVyZS4KPiArICAgICogLSBgYFY0TDJfVlA5X1NFR19MVkxfTUFYYGAKPiAr ICAgICAgLSBOdW1iZXIgb2Ygc2VnbWVudCBmZWF0dXJlcy4KPiArCj4gKy4uIGM6dHlwZTo6IHY0 bDJfdnA5X3NlZ21lbnRhdGlvbl9mbGFncwo+ICsKPiArVGhvc2UgYXJlIHRoZSBmbGFncyB0aGF0 IG1heSBiZSBwYXNzZWQgdG8gJnY0bDJfdnA5X3NlZ21lbnRhdGlvbi5mbGFncy4gU2VlCj4gK3Nl Y3Rpb24gJzcuMi4xMCBTZWdtZW50YXRpb24gcGFyYW1zIHN5bnRheCcgb2YgdGhlIFZQOSBzcGVj aWZpY2F0aW9uIGZvcgo+ICttb3JlIGRldGFpbHMuCj4gKwo+ICsuLiBjc3NjbGFzczo6IGxvbmd0 YWJsZQo+ICsKPiArLi4gdGFidWxhcmNvbHVtbnM6OiB8cHsxLjVjbX18cHs2LjNjbX18cHs5LjRj bX18Cj4gKwo+ICsuLiBmbGF0LXRhYmxlOjogZW51bSB2NGwyX3ZwOV9zZWdtZW50YXRpb25fZmxh Z3MKPiArICAgIDpoZWFkZXItcm93czogIDAKPiArICAgIDpzdHViLWNvbHVtbnM6IDAKPiArICAg IDp3aWR0aHM6ICAgICAgIDEgMgo+ICsKPiArICAgICogLSBgYFY0TDJfVlA5X1NFR01FTlRBVElP Tl9GTEFHX0VOQUJMRURgYAo+ICsgICAgICAtIEluZGljYXRlcyB0aGF0IHRoaXMgZnJhbWUgbWFr ZXMgdXNlIG9mIHRoZSBzZWdtZW50YXRpb24gdG9vbC4KPiArICAgICogLSBgYFY0TDJfVlA5X1NF R01FTlRBVElPTl9GTEFHX1VQREFURV9NQVBgYAo+ICsgICAgICAtIEluZGljYXRlcyB0aGF0IHRo ZSBzZWdtZW50YXRpb24gbWFwIHNob3VsZCBiZSB1cGRhdGVkIGR1cmluZyB0aGUKPiArICAgICAg ICBkZWNvZGluZyBvZiB0aGlzIGZyYW1lLgo+ICsgICAgKiAtIGBgVjRMMl9WUDlfU0VHTUVOVEFU SU9OX0ZMQUdfVEVNUE9SQUxfVVBEQVRFYGAKPiArICAgICAgLSBJbmRpY2F0ZXMgdGhhdCB0aGUg dXBkYXRlcyB0byB0aGUgc2VnbWVudGF0aW9uIG1hcCBhcmUgY29kZWQKPiArICAgICAgICByZWxh dGl2ZSB0byB0aGUgZXhpc3Rpbmcgc2VnbWVudGF0aW9uIG1hcC4KPiArICAgICogLSBgYFY0TDJf VlA5X1NFR01FTlRBVElPTl9GTEFHX1VQREFURV9EQVRBYGAKPiArICAgICAgLSBJbmRpY2F0ZXMg dGhhdCBuZXcgcGFyYW1ldGVycyBhcmUgYWJvdXQgdG8gYmUgc3BlY2lmaWVkIGZvciBlYWNoCj4g KyAgICAgICAgc2VnbWVudC4KPiArICAgICogLSBgYFY0TDJfVlA5X1NFR01FTlRBVElPTl9GTEFH X0FCU19PUl9ERUxUQV9VUERBVEVgYAo+ICsgICAgICAtIEluZGljYXRlcyB0aGF0IHRoZSBzZWdt ZW50YXRpb24gcGFyYW1ldGVycyByZXByZXNlbnQgdGhlIGFjdHVhbCB2YWx1ZXMKPiArICAgICAg ICB0byBiZSB1c2VkLgo+ICsKPiArLi4gYzp0eXBlOjogdjRsMl92cDlfcXVhbnRpemF0aW9uCj4g Kwo+ICtFbmNvZGVzIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVycy4gU2VlIHNlY3Rpb24gJzcu Mi45IFF1YW50aXphdGlvbiBwYXJhbXMKPiArc3ludGF4JyBvZiB0aGUgVlA5IHNwZWNpZmljYXRp b24gZm9yIG1vcmUgZGV0YWlscy4KPiArCj4gKy4uIGNzc2NsYXNzOjogbG9uZ3RhYmxlCj4gKwo+ ICsuLiB0YWJ1bGFyY29sdW1uczo6IHxwezEuNWNtfXxwezYuM2NtfXxwezkuNGNtfXwKPiArCj4g Ky4uIGZsYXQtdGFibGU6OiBzdHJ1Y3QgdjRsMl92cDlfcXVhbnRpemF0aW9uCj4gKyAgICA6aGVh ZGVyLXJvd3M6ICAwCj4gKyAgICA6c3R1Yi1jb2x1bW5zOiAwCj4gKyAgICA6d2lkdGhzOiAgICAg ICAxIDEgMgo+ICsKPiArICAgICogLSBfX3U4Cj4gKyAgICAgIC0gYGBiYXNlX3FfaWR4YGAKPiAr ICAgICAgLSBJbmRpY2F0ZXMgdGhlIGJhc2UgZnJhbWUgcWluZGV4Lgo+ICsgICAgKiAtIF9fczgK PiArICAgICAgLSBgYGRlbHRhX3FfeV9kY2BgCj4gKyAgICAgIC0gSW5kaWNhdGVzIHRoZSBZIERD IHF1YW50aXplciByZWxhdGl2ZSB0byBiYXNlX3FfaWR4Lgo+ICsgICAgKiAtIF9fczgKPiArICAg ICAgLSBgYGRlbHRhX3FfdXZfZGNgYAo+ICsgICAgICAtIEluZGljYXRlcyB0aGUgVVYgREMgcXVh bnRpemVyIHJlbGF0aXZlIHRvIGJhc2VfcV9pZHguCj4gKyAgICAqIC0gX19zOAo+ICsgICAgICAt IGBgZGVsdGFfcV91dl9hY2BgCj4gKyAgICAgIC0gSW5kaWNhdGVzIHRoZSBVViBBQyBxdWFudGl6 ZXIgcmVsYXRpdmUgdG8gYmFzZV9xX2lkeC4KPiArICAgICogLSBfX3U4Cj4gKyAgICAgIC0gYGBy ZXNlcnZlZFs0XWBgCj4gKyAgICAgIC0gQXBwbGljYXRpb25zIGFuZCBkcml2ZXJzIG11c3Qgc2V0 IHRoaXMgdG8gemVyby4KPiArCj4gKy4uIGM6dHlwZTo6IHY0bDJfdnA5X2xvb3BfZmlsdGVyCj4g Kwo+ICtUaGlzIHN0cnVjdHVyZSBjb250YWlucyBhbGwgbG9vcCBmaWx0ZXIgcmVsYXRlZCBwYXJh bWV0ZXJzLiBTZWUgc2VjdGlvbnMKPiArJzcuMi44IExvb3AgZmlsdGVyIHNlbWFudGljcycgb2Yg dGhlIFZQOSBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuCj4gKwo+ICsuLiBjc3NjbGFz czo6IGxvbmd0YWJsZQo+ICsKPiArLi4gdGFidWxhcmNvbHVtbnM6OiB8cHsxLjVjbX18cHs2LjNj bX18cHs5LjRjbX18Cj4gKwo+ICsuLiBmbGF0LXRhYmxlOjogc3RydWN0IHY0bDJfdnA5X2xvb3Bf ZmlsdGVyCj4gKyAgICA6aGVhZGVyLXJvd3M6ICAwCj4gKyAgICA6c3R1Yi1jb2x1bW5zOiAwCj4g KyAgICA6d2lkdGhzOiAgICAgICAxIDEgMgo+ICsKPiArICAgICogLSBfX3M4Cj4gKyAgICAgIC0g YGByZWZfZGVsdGFzWzRdYGAKPiArICAgICAgLSBDb250YWlucyB0aGUgYWRqdXN0bWVudCBuZWVk ZWQgZm9yIHRoZSBmaWx0ZXIgbGV2ZWwgYmFzZWQgb24gdGhlIGNob3Nlbgo+ICsgICAgICAgIHJl ZmVyZW5jZSBmcmFtZS4KPiArICAgICogLSBfX3M4Cj4gKyAgICAgIC0gYGBtb2RlX2RlbHRhc1sy XWBgCj4gKyAgICAgIC0gQ29udGFpbnMgdGhlIGFkanVzdG1lbnQgbmVlZGVkIGZvciB0aGUgZmls dGVyIGxldmVsIGJhc2VkIG9uIHRoZSBjaG9zZW4KPiArICAgICAgICBtb2RlLgo+ICsgICAgKiAt IF9fdTgKPiArICAgICAgLSBgYGxldmVsYGAKPiArICAgICAgLSBJbmRpY2F0ZXMgdGhlIGxvb3Ag ZmlsdGVyIHN0cmVuZ3RoLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYHNoYXJwbmVzc2Bg Cj4gKyAgICAgIC0gSW5kaWNhdGVzIHRoZSBzaGFycG5lc3MgbGV2ZWwuCj4gKyAgICAqIC0gX191 OAo+ICsgICAgICAtIGBgZmxhZ3NgYAo+ICsgICAgICAtIENvbWJpbmF0aW9uIG9mIFY0TDJfVlA5 X0xPT1BfRklMVEVSX0ZMQUdfKiBmbGFncy4KPiArICAgICAgICBTZWUgOmM6dHlwZTpgdjRsMl92 cDlfbG9vcF9maWx0ZXJfZmxhZ3NgLgo+ICsgICAgKiAtIF9fdTgKPiArICAgICAgLSBgYHJlc2Vy dmVkWzddYGAKPiArICAgICAgLSBBcHBsaWNhdGlvbnMgYW5kIGRyaXZlcnMgbXVzdCBzZXQgdGhp cyB0byB6ZXJvLgo+ICsKPiArCj4gKy4uIGM6dHlwZTo6IHY0bDJfdnA5X2xvb3BfZmlsdGVyX2Zs YWdzCj4gKwo+ICtUaG9zZSBhcmUgdGhlIGZsYWdzIHRoYXQgbWF5IGJlIHBhc3NlZC4gU2VlIHNl Y3Rpb24gJzcuMi44IExvb3AgZmlsdGVyCj4gK3NlbWFudGljcycgb2YgdGhlIFZQOSBzcGVjaWZp Y2F0aW9uIGZvciBtb3JlIGRldGFpbHMuCj4gKwo+ICsuLiBjc3NjbGFzczo6IGxvbmd0YWJsZQo+ ICsKPiArLi4gdGFidWxhcmNvbHVtbnM6OiB8cHsxLjVjbX18cHs2LjNjbX18cHs5LjRjbX18Cj4g Kwo+ICsuLiBmbGF0LXRhYmxlOjogZW51bSB2NGwyX3ZwOV9sb29wX2ZpbHRlcl9mbGFncwo+ICsg ICAgOmhlYWRlci1yb3dzOiAgMAo+ICsgICAgOnN0dWItY29sdW1uczogMAo+ICsgICAgOndpZHRo czogICAgICAgMSAyCj4gKwo+ICsgICAgKiAtIGBgVjRMMl9WUDlfTE9PUF9GSUxURVJfRkxBR19E RUxUQV9FTkFCTEVEYGAKPiArICAgICAgLSBXaGVuIHNldCwgdGhlIGZpbHRlciBsZXZlbCBkZXBl bmRzIG9uIHRoZSBtb2RlIGFuZCByZWZlcmVuY2UgZnJhbWUgdXNlZAo+ICsgICAgICAgIHRvIHBy ZWRpY3QgYSBibG9jay4KPiArICAgICogLSBgYFY0TDJfVlA5X0xPT1BfRklMVEVSX0ZMQUdfREVM VEFfVVBEQVRFYGAKPiArICAgICAgLSBXaGVuIHNldCwgdGhlIGJpdHN0cmVhbSBjb250YWlucyBh ZGRpdGlvbmFsIHN5bnRheCBlbGVtZW50cyB0aGF0Cj4gKyAgICAgICAgc3BlY2lmeSB3aGljaCBt b2RlIGFuZCByZWZlcmVuY2UgZnJhbWUgZGVsdGFzIGFyZSB0byBiZSB1cGRhdGVkLgo+IGRpZmYg LS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvbWVkaWEvdjRsL3BpeGZtdC1jb21w cmVzc2VkLnJzdCBiL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS92NGwvcGl4Zm10 LWNvbXByZXNzZWQucnN0Cj4gaW5kZXggMGVkZTM5OTA3ZWUyLi4xYjIwZjQ4YTI0YjkgMTAwNjQ0 Cj4gLS0tIGEvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL21lZGlhL3Y0bC9waXhmbXQtY29t cHJlc3NlZC5yc3QKPiArKysgYi9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvbWVkaWEvdjRs L3BpeGZtdC1jb21wcmVzc2VkLnJzdAo+IEBAIC0xNzIsNiArMTcyLDIxIEBAIENvbXByZXNzZWQg Rm9ybWF0cwo+ICAgICAgICAtIFZQOSBjb21wcmVzc2VkIHZpZGVvIGZyYW1lLiBUaGUgZW5jb2Rl ciBnZW5lcmF0ZXMgb25lCj4gIAljb21wcmVzc2VkIGZyYW1lIHBlciBidWZmZXIsIGFuZCB0aGUg ZGVjb2RlciByZXF1aXJlcyBvbmUKPiAgCWNvbXByZXNzZWQgZnJhbWUgcGVyIGJ1ZmZlci4KPiAr ICAgICogLi4gX1Y0TDItUElYLUZNVC1WUDktRlJBTUU6Cj4gKwo+ICsgICAgICAtIGBgVjRMMl9Q SVhfRk1UX1ZQOV9GUkFNRWBgCj4gKyAgICAgIC0gJ1ZQOUYnCj4gKyAgICAgIC0gVlA5IHBhcnNl ZCBmcmFtZSwgaW5jbHVkaW5nIHRoZSBmcmFtZSBoZWFkZXIsIGFzIGV4dHJhY3RlZCBmcm9tIHRo ZSBjb250YWluZXIuCj4gKwlUaGlzIGZvcm1hdCBpcyBhZGFwdGVkIGZvciBzdGF0ZWxlc3Mgdmlk ZW8gZGVjb2RlcnMgdGhhdCBpbXBsZW1lbnQgYQo+ICsJVlA5IHBpcGVsaW5lIHdpdGggdGhlIDpy ZWY6YHN0YXRlbGVzc19kZWNvZGVyYC4KPiArCU1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUg ZnJhbWUgdG8gZGVjb2RlIGlzIHJlcXVpcmVkIHRvIGJlIHBhc3NlZAo+ICsJdGhyb3VnaCB0aGUg YGBWNEwyX0NJRF9TVEFURUxFU1NfVlA5X0ZSQU1FYGAgYW5kCj4gKwl0aGUgYGBWNEwyX0NJRF9T VEFURUxFU1NfVlA5X0NPTVBSRVNTRURfSERSX1BST0JTYGAgY29udHJvbHMuCj4gKwlTZWUgdGhl IDpyZWY6YGFzc29jaWF0ZWQgQ29kZWMgQ29udHJvbCBJRHMgPHY0bDItY29kZWMtc3RhdGVsZXNz LXZwOT5gLgo+ICsJRXhhY3RseSBvbmUgb3V0cHV0IGFuZCBvbmUgY2FwdHVyZSBidWZmZXIgbXVz dCBiZSBwcm92aWRlZCBmb3IgdXNlIHdpdGgKPiArCXRoaXMgcGl4ZWwgZm9ybWF0LiBUaGUgb3V0 cHV0IGJ1ZmZlciBtdXN0IGNvbnRhaW4gdGhlIGFwcHJvcHJpYXRlIG51bWJlcgo+ICsJb2YgbWFj cm9ibG9ja3MgdG8gZGVjb2RlIGEgZnVsbCBjb3JyZXNwb25kaW5nIGZyYW1lIHRvIHRoZSBtYXRj aGluZwo+ICsJY2FwdHVyZSBidWZmZXIuCj4gICAgICAqIC4uIF9WNEwyLVBJWC1GTVQtSEVWQzoK PiAgCj4gICAgICAgIC0gYGBWNEwyX1BJWF9GTVRfSEVWQ2BgCj4gZGlmZiAtLWdpdCBhL0RvY3Vt ZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS92NGwvdmlkaW9jLWctZXh0LWN0cmxzLnJzdCBi L0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS92NGwvdmlkaW9jLWctZXh0LWN0cmxz LnJzdAo+IGluZGV4IDJkNmJjOGQ5NDM4MC4uMjU4ODk1ZmYwYzcxIDEwMDY0NAo+IC0tLSBhL0Rv Y3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS92NGwvdmlkaW9jLWctZXh0LWN0cmxzLnJz dAo+ICsrKyBiL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS92NGwvdmlkaW9jLWct ZXh0LWN0cmxzLnJzdAo+IEBAIC0yMzMsNiArMjMzLDE0IEBAIHN0aWxsIGNhdXNlIHRoaXMgc2l0 dWF0aW9uLgo+ICAgICAgICAtIGBgcF9tcGVnMl9xdWFudGlzYXRpb25gYAo+ICAgICAgICAtIEEg cG9pbnRlciB0byBhIHN0cnVjdCA6Yzp0eXBlOmB2NGwyX2N0cmxfbXBlZzJfcXVhbnRpc2F0aW9u YC4gVmFsaWQgaWYgdGhpcyBjb250cm9sIGlzCj4gICAgICAgICAgb2YgdHlwZSBgYFY0TDJfQ1RS TF9UWVBFX01QRUcyX1FVQU5USVNBVElPTmBgLgo+ICsgICAgKiAtIHN0cnVjdCA6Yzp0eXBlOmB2 NGwyX2N0cmxfdnA5X2NvbXByZXNzZWRfaGRyX3Byb2JzYCAqCj4gKyAgICAgIC0gYGBwX3ZwOV9j b21wcmVzc2VkX2hkcl9wcm9ic2BgCj4gKyAgICAgIC0gQSBwb2ludGVyIHRvIGEgc3RydWN0IDpj OnR5cGU6YHY0bDJfY3RybF92cDlfY29tcHJlc3NlZF9oZHJfcHJvYnNgLiBWYWxpZCBpZiB0aGlz Cj4gKyAgICAgICAgY29udHJvbCBpcyBvZiB0eXBlIGBgVjRMMl9DVFJMX1RZUEVfVlA5X0NPTVBS RVNTRURfSERSX1BST0JTYGAuCj4gKyAgICAqIC0gc3RydWN0IDpjOnR5cGU6YHY0bDJfY3RybF92 cDlfZnJhbWVgICoKPiArICAgICAgLSBgYHBfdnA5X2ZyYW1lYGAKPiArICAgICAgLSBBIHBvaW50 ZXIgdG8gYSBzdHJ1Y3QgOmM6dHlwZTpgdjRsMl9jdHJsX3ZwOV9mcmFtZWAuIFZhbGlkIGlmIHRo aXMKPiArICAgICAgICBjb250cm9sIGlzIG9mIHR5cGUgYGBWNEwyX0NUUkxfVFlQRV9WUDlfRlJB TUVgYC4KPiAgICAgICogLSBzdHJ1Y3QgOmM6dHlwZTpgdjRsMl9jdHJsX2hkcjEwX2NsbF9pbmZv YCAqCj4gICAgICAgIC0gYGBwX2hkcjEwX2NsbGBgCj4gICAgICAgIC0gQSBwb2ludGVyIHRvIGEg c3RydWN0IDpjOnR5cGU6YHY0bDJfY3RybF9oZHIxMF9jbGxfaW5mb2AuIFZhbGlkIGlmIHRoaXMg Y29udHJvbCBpcwo+IGRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvbWVk aWEvdjRsL3ZpZGlvYy1xdWVyeWN0cmwucnN0IGIvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBp L21lZGlhL3Y0bC92aWRpb2MtcXVlcnljdHJsLnJzdAo+IGluZGV4IGY5ZWNmNjI3NjEyOS4uZTBj NmE1ZDlmZjZiIDEwMDY0NAo+IC0tLSBhL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRp YS92NGwvdmlkaW9jLXF1ZXJ5Y3RybC5yc3QKPiArKysgYi9Eb2N1bWVudGF0aW9uL3VzZXJzcGFj ZS1hcGkvbWVkaWEvdjRsL3ZpZGlvYy1xdWVyeWN0cmwucnN0Cj4gQEAgLTUwNyw2ICs1MDcsMTgg QEAgU2VlIGFsc28gdGhlIGV4YW1wbGVzIGluIDpyZWY6YGNvbnRyb2xgLgo+ICAgICAgICAtIG4v YQo+ICAgICAgICAtIEEgc3RydWN0IDpjOnR5cGU6YHY0bDJfY3RybF9oZXZjX2RlY29kZV9wYXJh bXNgLCBjb250YWluaW5nIEhFVkMKPiAgCWRlY29kaW5nIHBhcmFtZXRlcnMgZm9yIHN0YXRlbGVz cyB2aWRlbyBkZWNvZGVycy4KPiArICAgICogLSBgYFY0TDJfQ1RSTF9UWVBFX1ZQOV9DT01QUkVT U0VEX0hEUl9QUk9CU2BgCj4gKyAgICAgIC0gbi9hCj4gKyAgICAgIC0gbi9hCj4gKyAgICAgIC0g bi9hCj4gKyAgICAgIC0gQSBzdHJ1Y3QgOmM6dHlwZTpgdjRsMl9jdHJsX3ZwOV9jb21wcmVzc2Vk X2hkcl9wcm9ic2AsIGNvbnRhaW5pbmcgVlA5Cj4gKwlwcm9iYWJpbGl0aWVzIHVwZGF0ZXMgZm9y IHN0YXRlbGVzcyB2aWRlbyBkZWNvZGVycy4KPiArICAgICogLSBgYFY0TDJfQ1RSTF9UWVBFX1ZQ OV9GUkFNRWBgCj4gKyAgICAgIC0gbi9hCj4gKyAgICAgIC0gbi9hCj4gKyAgICAgIC0gbi9hCj4g KyAgICAgIC0gQSBzdHJ1Y3QgOmM6dHlwZTpgdjRsMl9jdHJsX3ZwOV9mcmFtZWAsIGNvbnRhaW5p bmcgVlA5Cj4gKwlmcmFtZSBkZWNvZGUgcGFyYW1ldGVycyBmb3Igc3RhdGVsZXNzIHZpZGVvIGRl Y29kZXJzLgo+ICAKPiAgLi4gcmF3OjogbGF0ZXgKPiAgCj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50 YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS92aWRlb2RldjIuaC5yc3QuZXhjZXB0aW9ucyBiL0Rv Y3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS92aWRlb2RldjIuaC5yc3QuZXhjZXB0aW9u cwo+IGluZGV4IGViMGIxY2QzN2FiZC4uMTI5ZWYzZWRmYTczIDEwMDY0NAo+IC0tLSBhL0RvY3Vt ZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS92aWRlb2RldjIuaC5yc3QuZXhjZXB0aW9ucwo+ ICsrKyBiL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS92aWRlb2RldjIuaC5yc3Qu ZXhjZXB0aW9ucwo+IEBAIC0xNDksNiArMTQ5LDggQEAgcmVwbGFjZSBzeW1ib2wgVjRMMl9DVFJM X1RZUEVfSEVWQ19TTElDRV9QQVJBTVMgOmM6dHlwZTpgdjRsMl9jdHJsX3R5cGVgCj4gIHJlcGxh Y2Ugc3ltYm9sIFY0TDJfQ1RSTF9UWVBFX0FSRUEgOmM6dHlwZTpgdjRsMl9jdHJsX3R5cGVgCj4g IHJlcGxhY2Ugc3ltYm9sIFY0TDJfQ1RSTF9UWVBFX0ZXSFRfUEFSQU1TIDpjOnR5cGU6YHY0bDJf Y3RybF90eXBlYAo+ICByZXBsYWNlIHN5bWJvbCBWNEwyX0NUUkxfVFlQRV9WUDhfRlJBTUUgOmM6 dHlwZTpgdjRsMl9jdHJsX3R5cGVgCj4gK3JlcGxhY2Ugc3ltYm9sIFY0TDJfQ1RSTF9UWVBFX1ZQ OV9DT01QUkVTU0VEX0hEUl9QUk9CUyA6Yzp0eXBlOmB2NGwyX2N0cmxfdHlwZWAKPiArcmVwbGFj ZSBzeW1ib2wgVjRMMl9DVFJMX1RZUEVfVlA5X0ZSQU1FIDpjOnR5cGU6YHY0bDJfY3RybF90eXBl YAo+ICByZXBsYWNlIHN5bWJvbCBWNEwyX0NUUkxfVFlQRV9IRFIxMF9DTExfSU5GTyA6Yzp0eXBl OmB2NGwyX2N0cmxfdHlwZWAKPiAgcmVwbGFjZSBzeW1ib2wgVjRMMl9DVFJMX1RZUEVfSERSMTBf TUFTVEVSSU5HX0RJU1BMQVkgOmM6dHlwZTpgdjRsMl9jdHJsX3R5cGVgCj4gIAo+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWN0cmxzLWNvcmUuYyBiL2RyaXZlcnMv bWVkaWEvdjRsMi1jb3JlL3Y0bDItY3RybHMtY29yZS5jCj4gaW5kZXggYzRiNTA4Mjg0OWI2Li5l ZDljZjI5OGE4M2EgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1j dHJscy1jb3JlLmMKPiArKysgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWN0cmxzLWNv cmUuYwo+IEBAIC0yODMsNiArMjgzLDEyIEBAIHN0YXRpYyB2b2lkIHN0ZF9sb2coY29uc3Qgc3Ry dWN0IHY0bDJfY3RybCAqY3RybCkKPiAgCWNhc2UgVjRMMl9DVFJMX1RZUEVfTVBFRzJfUElDVFVS RToKPiAgCQlwcl9jb250KCJNUEVHMl9QSUNUVVJFIik7Cj4gIAkJYnJlYWs7Cj4gKwljYXNlIFY0 TDJfQ1RSTF9UWVBFX1ZQOV9DT01QUkVTU0VEX0hEUl9QUk9CUzoKPiArCQlwcl9jb250KCJWUDlf Q09NUFJFU1NFRF9IRFJfUFJPQlMiKTsKPiArCQlicmVhazsKPiArCWNhc2UgVjRMMl9DVFJMX1RZ UEVfVlA5X0ZSQU1FOgo+ICsJCXByX2NvbnQoIlZQOV9GUkFNRSIpOwo+ICsJCWJyZWFrOwo+ICAJ ZGVmYXVsdDoKPiAgCQlwcl9jb250KCJ1bmtub3duIHR5cGUgJWQiLCBjdHJsLT50eXBlKTsKPiAg CQlicmVhazsKPiBAQCAtMzE3LDYgKzMyMywxNjIgQEAgc3RhdGljIHZvaWQgc3RkX2xvZyhjb25z dCBzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQo+ICAjZGVmaW5lIHplcm9fcmVzZXJ2ZWQocykgXAo+ ICAJbWVtc2V0KCYocykucmVzZXJ2ZWQsIDAsIHNpemVvZigocykucmVzZXJ2ZWQpKQo+ICAKPiAr c3RhdGljIGludAo+ICt2YWxpZGF0ZV92cDlfbGZfcGFyYW1zKHN0cnVjdCB2NGwyX3ZwOV9sb29w X2ZpbHRlciAqbGYpCj4gK3sKPiArCXVuc2lnbmVkIGludCBpOwo+ICsKPiArCWlmIChsZi0+Zmxh Z3MgJiB+KFY0TDJfVlA5X0xPT1BfRklMVEVSX0ZMQUdfREVMVEFfRU5BQkxFRCB8Cj4gKwkJCSAg VjRMMl9WUDlfTE9PUF9GSUxURVJfRkxBR19ERUxUQV9VUERBVEUpKQo+ICsJCXJldHVybiAtRUlO VkFMOwo+ICsKPiArCS8qIFRoYXQgYWxsIHZhbHVlcyBhcmUgaW4gdGhlIGFjY2VwdGVkIHJhbmdl LiAqLwo+ICsJaWYgKGxmLT5sZXZlbCA+IEdFTk1BU0soNSwgMCkpCj4gKwkJcmV0dXJuIC1FSU5W QUw7Cj4gKwo+ICsJaWYgKGxmLT5zaGFycG5lc3MgPiBHRU5NQVNLKDIsIDApKQo+ICsJCXJldHVy biAtRUlOVkFMOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxmLT5yZWZfZGVs dGFzKTsgaSsrKQo+ICsJCWlmIChsZi0+cmVmX2RlbHRhc1tpXSA8IC02MyB8fCBsZi0+cmVmX2Rl bHRhc1tpXSA+IDYzKQo+ICsJCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwlmb3IgKGkgPSAwOyBp IDwgQVJSQVlfU0laRShsZi0+bW9kZV9kZWx0YXMpOyBpKyspCj4gKwkJaWYgKGxmLT5tb2RlX2Rl bHRhc1tpXSA8IC02MyB8fCBsZi0+bW9kZV9kZWx0YXNbaV0gPiA2MykKPiArCQkJcmV0dXJuIC1F SU5WQUw7Cj4gKwo+ICsJemVyb19yZXNlcnZlZCgqbGYpOwo+ICsJcmV0dXJuIDA7Cj4gK30KPiAr Cj4gK3N0YXRpYyBpbnQKPiArdmFsaWRhdGVfdnA5X3F1YW50X3BhcmFtcyhzdHJ1Y3QgdjRsMl92 cDlfcXVhbnRpemF0aW9uICpxdWFudCkKPiArewo+ICsJaWYgKHF1YW50LT5kZWx0YV9xX3lfZGMg PCAtMTUgfHwgcXVhbnQtPmRlbHRhX3FfeV9kYyA+IDE1IHx8Cj4gKwkgICAgcXVhbnQtPmRlbHRh X3FfdXZfZGMgPCAtMTUgfHwgcXVhbnQtPmRlbHRhX3FfdXZfZGMgPiAxNSB8fAo+ICsJICAgIHF1 YW50LT5kZWx0YV9xX3V2X2FjIDwgLTE1IHx8IHF1YW50LT5kZWx0YV9xX3V2X2FjID4gMTUpCj4g KwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJemVyb19yZXNlcnZlZCgqcXVhbnQpOwo+ICsJcmV0 dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQKPiArdmFsaWRhdGVfdnA5X3NlZ19wYXJhbXMo c3RydWN0IHY0bDJfdnA5X3NlZ21lbnRhdGlvbiAqc2VnKQo+ICt7Cj4gKwl1bnNpZ25lZCBpbnQg aSwgajsKPiArCj4gKwlpZiAoc2VnLT5mbGFncyAmIH4oVjRMMl9WUDlfU0VHTUVOVEFUSU9OX0ZM QUdfRU5BQkxFRCB8Cj4gKwkJCSAgIFY0TDJfVlA5X1NFR01FTlRBVElPTl9GTEFHX1VQREFURV9N QVAgfAo+ICsJCQkgICBWNEwyX1ZQOV9TRUdNRU5UQVRJT05fRkxBR19URU1QT1JBTF9VUERBVEUg fAo+ICsJCQkgICBWNEwyX1ZQOV9TRUdNRU5UQVRJT05fRkxBR19VUERBVEVfREFUQSB8Cj4gKwkJ CSAgIFY0TDJfVlA5X1NFR01FTlRBVElPTl9GTEFHX0FCU19PUl9ERUxUQV9VUERBVEUpKQo+ICsJ CXJldHVybiAtRUlOVkFMOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNlZy0+ ZmVhdHVyZV9lbmFibGVkKTsgaSsrKSB7Cj4gKwkJaWYgKHNlZy0+ZmVhdHVyZV9lbmFibGVkW2ld ICYKPiArCQkgICAgflY0TDJfVlA5X1NFR01FTlRfRkVBVFVSRV9FTkFCTEVEX01BU0spCj4gKwkJ CXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpF KHNlZy0+ZmVhdHVyZV9kYXRhKTsgaSsrKSB7Cj4gKwkJY29uc3QgaW50IHJhbmdlW10gPSB7IDI1 NSwgNjMsIDMsIDAgfTsKPiArCj4gKwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUoc2VnLT5m ZWF0dXJlX2RhdGFbal0pOyBqKyspIHsKPiArCQkJaWYgKHNlZy0+ZmVhdHVyZV9kYXRhW2ldW2pd IDwgLXJhbmdlW2pdIHx8Cj4gKwkJCSAgICBzZWctPmZlYXR1cmVfZGF0YVtpXVtqXSA+IHJhbmdl W2pdKQo+ICsJCQkJcmV0dXJuIC1FSU5WQUw7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXplcm9fcmVz ZXJ2ZWQoKnNlZyk7Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludAo+ICt2YWxp ZGF0ZV92cDlfZnJhbWUoc3RydWN0IHY0bDJfY3RybF92cDlfZnJhbWUgKmZyYW1lKQo+ICt7Cj4g KwlpbnQgcmV0Owo+ICsKPiArCS8qIE1ha2Ugc3VyZSB3ZSdyZSBub3QgcGFzc2VkIGludmFsaWQg ZmxhZ3MuICovCj4gKwlpZiAoZnJhbWUtPmZsYWdzICYgfihWNEwyX1ZQOV9GUkFNRV9GTEFHX0tF WV9GUkFNRSB8Cj4gKwkJICBWNEwyX1ZQOV9GUkFNRV9GTEFHX1NIT1dfRlJBTUUgfAo+ICsJCSAg VjRMMl9WUDlfRlJBTUVfRkxBR19FUlJPUl9SRVNJTElFTlQgfAo+ICsJCSAgVjRMMl9WUDlfRlJB TUVfRkxBR19JTlRSQV9PTkxZIHwKPiArCQkgIFY0TDJfVlA5X0ZSQU1FX0ZMQUdfQUxMT1dfSElH SF9QUkVDX01WIHwKPiArCQkgIFY0TDJfVlA5X0ZSQU1FX0ZMQUdfUkVGUkVTSF9GUkFNRV9DVFgg fAo+ICsJCSAgVjRMMl9WUDlfRlJBTUVfRkxBR19QQVJBTExFTF9ERUNfTU9ERSB8Cj4gKwkJICBW NEwyX1ZQOV9GUkFNRV9GTEFHX1hfU1VCU0FNUExJTkcgfAo+ICsJCSAgVjRMMl9WUDlfRlJBTUVf RkxBR19ZX1NVQlNBTVBMSU5HIHwKPiArCQkgIFY0TDJfVlA5X0ZSQU1FX0ZMQUdfQ09MT1JfUkFO R0VfRlVMTF9TV0lORykpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJaWYgKGZyYW1lLT5m bGFncyAmIFY0TDJfVlA5X0ZSQU1FX0ZMQUdfRVJST1JfUkVTSUxJRU5UICYmCj4gKwkgICAgZnJh bWUtPmZsYWdzICYgVjRMMl9WUDlfRlJBTUVfRkxBR19SRUZSRVNIX0ZSQU1FX0NUWCkKPiArCQly ZXR1cm4gLUVJTlZBTDsKPiArCj4gKwlpZiAoZnJhbWUtPnByb2ZpbGUgPiBWNEwyX1ZQOV9QUk9G SUxFX01BWCkKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwlpZiAoZnJhbWUtPnJlc2V0X2Zy YW1lX2NvbnRleHQgPiBWNEwyX1ZQOV9SRVNFVF9GUkFNRV9DVFhfQUxMKQo+ICsJCXJldHVybiAt RUlOVkFMOwo+ICsKPiArCWlmIChmcmFtZS0+ZnJhbWVfY29udGV4dF9pZHggPj0gVjRMMl9WUDlf TlVNX0ZSQU1FX0NUWCkKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwkvKgo+ICsJICogUHJv ZmlsZXMgMCBhbmQgMSBvbmx5IHN1cHBvcnQgOC1iaXQgZGVwdGgsIHByb2ZpbGVzIDIgYW5kIDMg b25seSAxMAo+ICsJICogYW5kIDEyIGJpdCBkZXB0aHMuCj4gKwkgKi8KPiArCWlmICgoZnJhbWUt PnByb2ZpbGUgPCAyICYmIGZyYW1lLT5iaXRfZGVwdGggIT0gOCkgfHwKPiArCSAgICAoZnJhbWUt PnByb2ZpbGUgPj0gMiAmJgo+ICsJICAgICAoZnJhbWUtPmJpdF9kZXB0aCAhPSAxMCAmJiBmcmFt ZS0+Yml0X2RlcHRoICE9IDEyKSkpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJLyogUHJv ZmlsZSAwIGFuZCAyIG9ubHkgYWNjZXB0IFlVViA0OjI6MC4gKi8KPiArCWlmICgoZnJhbWUtPnBy b2ZpbGUgPT0gMCB8fCBmcmFtZS0+cHJvZmlsZSA9PSAyKSAmJgo+ICsJICAgICghKGZyYW1lLT5m bGFncyAmIFY0TDJfVlA5X0ZSQU1FX0ZMQUdfWF9TVUJTQU1QTElORykgfHwKPiArCSAgICAgIShm cmFtZS0+ZmxhZ3MgJiBWNEwyX1ZQOV9GUkFNRV9GTEFHX1lfU1VCU0FNUExJTkcpKSkKPiArCQly ZXR1cm4gLUVJTlZBTDsKPiArCj4gKwkvKiBQcm9maWxlIDEgYW5kIDMgb25seSBhY2NlcHQgWVVW IDQ6MjoyLCA0OjQ6MCBhbmQgNDo0OjQuICovCj4gKwlpZiAoKGZyYW1lLT5wcm9maWxlID09IDEg fHwgZnJhbWUtPnByb2ZpbGUgPT0gMykgJiYKPiArCSAgICAoKGZyYW1lLT5mbGFncyAmIFY0TDJf VlA5X0ZSQU1FX0ZMQUdfWF9TVUJTQU1QTElORykgJiYKPiArCSAgICAgKGZyYW1lLT5mbGFncyAm IFY0TDJfVlA5X0ZSQU1FX0ZMQUdfWV9TVUJTQU1QTElORykpKQo+ICsJCXJldHVybiAtRUlOVkFM Owo+ICsKPiArCWlmIChmcmFtZS0+aW50ZXJwb2xhdGlvbl9maWx0ZXIgPiBWNEwyX1ZQOV9JTlRF UlBfRklMVEVSX1NXSVRDSEFCTEUpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJLyoKPiAr CSAqIEFjY29yZGluZyB0byB0aGUgc3BlYywgdGlsZV9jb2xzX2xvZzIgc2hhbGwgYmUgbGVzcyB0 aGFuIG9yIGVxdWFsCj4gKwkgKiB0byA2Lgo+ICsJICovCj4gKwlpZiAoZnJhbWUtPnRpbGVfY29s c19sb2cyID4gNikKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwlpZiAoZnJhbWUtPnR4X21v ZGUgPiBWNEwyX1ZQOV9UWF9NT0RFX1NFTEVDVCkKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4g KwlpZiAoZnJhbWUtPnJlZmVyZW5jZV9tb2RlID4gVjRMMl9WUDlfUkVGRVJFTkNFX01PREVfU0VM RUNUKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCXJldCA9IHZhbGlkYXRlX3ZwOV9sZl9w YXJhbXMoJmZyYW1lLT5sZik7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJ cmV0ID0gdmFsaWRhdGVfdnA5X3F1YW50X3BhcmFtcygmZnJhbWUtPnF1YW50KTsKPiArCWlmIChy ZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwlyZXQgPSB2YWxpZGF0ZV92cDlfc2VnX3BhcmFt cygmZnJhbWUtPnNlZyk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJemVy b19yZXNlcnZlZCgqZnJhbWUpOwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gIC8qCj4gICAqIENv bXBvdW5kIGNvbnRyb2xzIHZhbGlkYXRpb24gcmVxdWlyZXMgc2V0dGluZyB1bnVzZWQgZmllbGRz L2ZsYWdzIHRvIHplcm8KPiAgICogaW4gb3JkZXIgdG8gcHJvcGVybHkgZGV0ZWN0IHVuY2hhbmdl ZCBjb250cm9scyB3aXRoIHN0ZF9lcXVhbCdzIG1lbWNtcC4KPiBAQCAtNjg3LDYgKzg0OSwxMiBA QCBzdGF0aWMgaW50IHN0ZF92YWxpZGF0ZV9jb21wb3VuZChjb25zdCBzdHJ1Y3QgdjRsMl9jdHJs ICpjdHJsLCB1MzIgaWR4LAo+ICAKPiAgCQlicmVhazsKPiAgCj4gKwljYXNlIFY0TDJfQ1RSTF9U WVBFX1ZQOV9DT01QUkVTU0VEX0hEUl9QUk9CUzoKPiArCQlicmVhazsKPiArCj4gKwljYXNlIFY0 TDJfQ1RSTF9UWVBFX1ZQOV9GUkFNRToKPiArCQlyZXR1cm4gdmFsaWRhdGVfdnA5X2ZyYW1lKHAp Owo+ICsKPiAgCWNhc2UgVjRMMl9DVFJMX1RZUEVfQVJFQToKPiAgCQlhcmVhID0gcDsKPiAgCQlp ZiAoIWFyZWEtPndpZHRoIHx8ICFhcmVhLT5oZWlnaHQpCj4gQEAgLTEyNDksNiArMTQxNywxMiBA QCBzdGF0aWMgc3RydWN0IHY0bDJfY3RybCAqdjRsMl9jdHJsX25ldyhzdHJ1Y3QgdjRsMl9jdHJs X2hhbmRsZXIgKmhkbCwKPiAgCWNhc2UgVjRMMl9DVFJMX1RZUEVfSERSMTBfTUFTVEVSSU5HX0RJ U1BMQVk6Cj4gIAkJZWxlbV9zaXplID0gc2l6ZW9mKHN0cnVjdCB2NGwyX2N0cmxfaGRyMTBfbWFz dGVyaW5nX2Rpc3BsYXkpOwo+ICAJCWJyZWFrOwo+ICsJY2FzZSBWNEwyX0NUUkxfVFlQRV9WUDlf Q09NUFJFU1NFRF9IRFJfUFJPQlM6Cj4gKwkJZWxlbV9zaXplID0gc2l6ZW9mKHN0cnVjdCB2NGwy X2N0cmxfdnA5X2NvbXByZXNzZWRfaGRyX3Byb2JzKTsKPiArCQlicmVhazsKPiArCWNhc2UgVjRM Ml9DVFJMX1RZUEVfVlA5X0ZSQU1FOgo+ICsJCWVsZW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdjRs Ml9jdHJsX3ZwOV9mcmFtZSk7Cj4gKwkJYnJlYWs7Cj4gIAljYXNlIFY0TDJfQ1RSTF9UWVBFX0FS RUE6Cj4gIAkJZWxlbV9zaXplID0gc2l6ZW9mKHN0cnVjdCB2NGwyX2FyZWEpOwo+ICAJCWJyZWFr Owo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWN0cmxzLWRlZnMu YyBiL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItY3RybHMtZGVmcy5jCj4gaW5kZXggNDIx MzAwZTEzYTQxLi5kMzgzYzQzODE1NmYgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tZWRpYS92NGwy LWNvcmUvdjRsMi1jdHJscy1kZWZzLmMKPiArKysgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92 NGwyLWN0cmxzLWRlZnMuYwo+IEBAIC0xMTc1LDYgKzExNzUsOCBAQCBjb25zdCBjaGFyICp2NGwy X2N0cmxfZ2V0X25hbWUodTMyIGlkKQo+ICAJY2FzZSBWNEwyX0NJRF9TVEFURUxFU1NfTVBFRzJf U0VRVUVOQ0U6CQkJcmV0dXJuICJNUEVHLTIgU2VxdWVuY2UgSGVhZGVyIjsKPiAgCWNhc2UgVjRM Ml9DSURfU1RBVEVMRVNTX01QRUcyX1BJQ1RVUkU6CQkJcmV0dXJuICJNUEVHLTIgUGljdHVyZSBI ZWFkZXIiOwo+ICAJY2FzZSBWNEwyX0NJRF9TVEFURUxFU1NfTVBFRzJfUVVBTlRJU0FUSU9OOgkJ cmV0dXJuICJNUEVHLTIgUXVhbnRpc2F0aW9uIE1hdHJpY2VzIjsKPiArCWNhc2UgVjRMMl9DSURf U1RBVEVMRVNTX1ZQOV9DT01QUkVTU0VEX0hEUl9QUk9CUzoJcmV0dXJuICJWUDkgUHJvYmFiaWxp dGllcyBVcGRhdGVzIjsKPiArCWNhc2UgVjRMMl9DSURfU1RBVEVMRVNTX1ZQOV9GUkFNRToJCQly ZXR1cm4gIlZQOSBGcmFtZSBEZWNvZGUgUGFyYW1ldGVycyI7Cj4gIAo+ICAJLyogQ29sb3JpbWV0 cnkgY29udHJvbHMgKi8KPiAgCS8qIEtlZXAgdGhlIG9yZGVyIG9mIHRoZSAnY2FzZSdzIHRoZSBz YW1lIGFzIGluIHY0bDItY29udHJvbHMuaCEgKi8KPiBAQCAtMTQ5Myw2ICsxNDk1LDEyIEBAIHZv aWQgdjRsMl9jdHJsX2ZpbGwodTMyIGlkLCBjb25zdCBjaGFyICoqbmFtZSwgZW51bSB2NGwyX2N0 cmxfdHlwZSAqdHlwZSwKPiAgCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IRVZDX0RFQ09ERV9Q QVJBTVM6Cj4gIAkJKnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9IRVZDX0RFQ09ERV9QQVJBTVM7Cj4g IAkJYnJlYWs7Cj4gKwljYXNlIFY0TDJfQ0lEX1NUQVRFTEVTU19WUDlfQ09NUFJFU1NFRF9IRFJf UFJPQlM6Cj4gKwkJKnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9WUDlfQ09NUFJFU1NFRF9IRFJfUFJP QlM7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIFY0TDJfQ0lEX1NUQVRFTEVTU19WUDlfRlJBTUU6Cj4g KwkJKnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9WUDlfRlJBTUU7Cj4gKwkJYnJlYWs7Cj4gIAljYXNl IFY0TDJfQ0lEX1VOSVRfQ0VMTF9TSVpFOgo+ICAJCSp0eXBlID0gVjRMMl9DVFJMX1RZUEVfQVJF QTsKPiAgCQkqZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfUkVBRF9PTkxZOwo+IGRpZmYgLS1naXQg YS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWlvY3RsLmMgYi9kcml2ZXJzL21lZGlhL3Y0 bDItY29yZS92NGwyLWlvY3RsLmMKPiBpbmRleCBlYzZmYzFlZjI5MWUuLjdhNWU4MTIwZDczMyAx MDA2NDQKPiAtLS0gYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWlvY3RsLmMKPiArKysg Yi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWlvY3RsLmMKPiBAQCAtMTM5NCw2ICsxMzk0 LDcgQEAgc3RhdGljIHZvaWQgdjRsX2ZpbGxfZm10ZGVzYyhzdHJ1Y3QgdjRsMl9mbXRkZXNjICpm bXQpCj4gIAkJY2FzZSBWNEwyX1BJWF9GTVRfVlA4OgkJZGVzY3IgPSAiVlA4IjsgYnJlYWs7Cj4g IAkJY2FzZSBWNEwyX1BJWF9GTVRfVlA4X0ZSQU1FOiAgICBkZXNjciA9ICJWUDggRnJhbWUiOyBi cmVhazsKPiAgCQljYXNlIFY0TDJfUElYX0ZNVF9WUDk6CQlkZXNjciA9ICJWUDkiOyBicmVhazsK PiArCQljYXNlIFY0TDJfUElYX0ZNVF9WUDlfRlJBTUU6ICAgIGRlc2NyID0gIlZQOSBGcmFtZSI7 IGJyZWFrOwo+ICAJCWNhc2UgVjRMMl9QSVhfRk1UX0hFVkM6CQlkZXNjciA9ICJIRVZDIjsgYnJl YWs7IC8qIGFrYSBILjI2NSAqLwo+ICAJCWNhc2UgVjRMMl9QSVhfRk1UX0hFVkNfU0xJQ0U6CWRl c2NyID0gIkhFVkMgUGFyc2VkIFNsaWNlIERhdGEiOyBicmVhazsKPiAgCQljYXNlIFY0TDJfUElY X0ZNVF9GV0hUOgkJZGVzY3IgPSAiRldIVCI7IGJyZWFrOyAvKiB1c2VkIGluIHZpY29kZWMgKi8K PiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWN0cmxzLmggYi9pbmNsdWRlL21lZGlh L3Y0bDItY3RybHMuaAo+IGluZGV4IDU3NWI1OWZiYWM3Ny4uM2VhNDM4NmViZDkxIDEwMDY0NAo+ IC0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1jdHJscy5oCj4gKysrIGIvaW5jbHVkZS9tZWRpYS92 NGwyLWN0cmxzLmgKPiBAQCAtNTAsNiArNTAsOCBAQCBzdHJ1Y3QgdmlkZW9fZGV2aWNlOwo+ICAg KiBAcF9oMjY0X2RlY29kZV9wYXJhbXM6CVBvaW50ZXIgdG8gYSBzdHJ1Y3QgdjRsMl9jdHJsX2gy NjRfZGVjb2RlX3BhcmFtcy4KPiAgICogQHBfaDI2NF9wcmVkX3dlaWdodHM6CVBvaW50ZXIgdG8g YSBzdHJ1Y3QgdjRsMl9jdHJsX2gyNjRfcHJlZF93ZWlnaHRzLgo+ICAgKiBAcF92cDhfZnJhbWU6 CQlQb2ludGVyIHRvIGEgVlA4IGZyYW1lIHBhcmFtcyBzdHJ1Y3R1cmUuCj4gKyAqIEBwX3ZwOV9j b21wcmVzc2VkX2hkcl9wcm9iczoJUG9pbnRlciB0byBhIFZQOSBmcmFtZSBjb21wcmVzc2VkIGhl YWRlciBwcm9icyBzdHJ1Y3R1cmUuCj4gKyAqIEBwX3ZwOV9mcmFtZToJCVBvaW50ZXIgdG8gYSBW UDkgZnJhbWUgcGFyYW1zIHN0cnVjdHVyZS4KPiAgICogQHBfaGV2Y19zcHM6CQkJUG9pbnRlciB0 byBhbiBIRVZDIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgc3RydWN0dXJlLgo+ICAgKiBAcF9oZXZj X3BwczoJCQlQb2ludGVyIHRvIGFuIEhFVkMgcGljdHVyZSBwYXJhbWV0ZXIgc2V0IHN0cnVjdHVy ZS4KPiAgICogQHBfaGV2Y19zbGljZV9wYXJhbXM6CVBvaW50ZXIgdG8gYW4gSEVWQyBzbGljZSBw YXJhbWV0ZXJzIHN0cnVjdHVyZS4KPiBAQCAtODAsNiArODIsOCBAQCB1bmlvbiB2NGwyX2N0cmxf cHRyIHsKPiAgCXN0cnVjdCB2NGwyX2N0cmxfaGV2Y19zcHMgKnBfaGV2Y19zcHM7Cj4gIAlzdHJ1 Y3QgdjRsMl9jdHJsX2hldmNfcHBzICpwX2hldmNfcHBzOwo+ICAJc3RydWN0IHY0bDJfY3RybF9o ZXZjX3NsaWNlX3BhcmFtcyAqcF9oZXZjX3NsaWNlX3BhcmFtczsKPiArCXN0cnVjdCB2NGwyX2N0 cmxfdnA5X2NvbXByZXNzZWRfaGRyX3Byb2JzICpwX3ZwOV9jb21wcmVzc2VkX2hkcl9wcm9iczsK PiArCXN0cnVjdCB2NGwyX2N0cmxfdnA5X2ZyYW1lICpwX3ZwOV9mcmFtZTsKPiAgCXN0cnVjdCB2 NGwyX2N0cmxfaGRyMTBfY2xsX2luZm8gKnBfaGRyMTBfY2xsOwo+ICAJc3RydWN0IHY0bDJfY3Ry bF9oZHIxMF9tYXN0ZXJpbmdfZGlzcGxheSAqcF9oZHIxMF9tYXN0ZXJpbmc7Cj4gIAlzdHJ1Y3Qg djRsMl9hcmVhICpwX2FyZWE7Cj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC92NGwy LWNvbnRyb2xzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdjRsMi1jb250cm9scy5oCj4gaW5kZXgg NTUzMmI1ZjY4NDkzLi44ZjhjM2MxYWQ4ODUgMTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS91YXBpL2xp bnV4L3Y0bDItY29udHJvbHMuaAo+ICsrKyBiL2luY2x1ZGUvdWFwaS9saW51eC92NGwyLWNvbnRy b2xzLmgKPiBAQCAtMjAxMCw2ICsyMDEwLDQzOSBAQCBzdHJ1Y3QgdjRsMl9jdHJsX2hkcjEwX21h c3RlcmluZ19kaXNwbGF5IHsKPiAgCV9fdTMyIG1pbl9kaXNwbGF5X21hc3RlcmluZ19sdW1pbmFu Y2U7Cj4gIH07Cj4gIAo+ICsvKiBTdGF0ZWxlc3MgVlA5IGNvbnRyb2xzICovCj4gKwo+ICsvKioK PiArICogZW51bSB2NGwyX3ZwOV9sb29wX2ZpbHRlcl9mbGFncyAtIFZQOSBsb29wIGZpbHRlciBm bGFncwo+ICsgKgo+ICsgKiBAVjRMMl9WUDlfTE9PUF9GSUxURVJfRkxBR19ERUxUQV9FTkFCTEVE OiB0aGUgZmlsdGVyIGxldmVsIGRlcGVuZHMgb24KPiArICoJdGhlIG1vZGUgYW5kIHJlZmVyZW5j ZSBmcmFtZSB1c2VkIHRvIHByZWRpY3QgYSBibG9jawo+ICsgKiBAVjRMMl9WUDlfTE9PUF9GSUxU RVJfRkxBR19ERUxUQV9VUERBVEU6IHRoZSBiaXRzdHJlYW0gY29udGFpbnMgYWRkaXRpb25hbAo+ ICsgKglzeW50YXggZWxlbWVudHMgdGhhdCBzcGVjaWZ5IHdoaWNoIG1vZGUgYW5kIHJlZmVyZW5j ZSBmcmFtZSBkZWx0YXMgYXJlIHRvIGJlIHVwZGF0ZWQKPiArICoKPiArICogVGhvc2UgYXJlIHRo ZSBmbGFncyB0aGF0IG1heSBiZSBwYXNzZWQgdG8gJnY0bDJfdnA5X2xvb3BfZmlsdGVyLmZsYWdz LiBTZWUKPiArICogc2VjdGlvbiAnNy4yLjggTG9vcCBmaWx0ZXIgc2VtYW50aWNzJyBvZiB0aGUg VlA5IHNwZWNpZmljYXRpb24gZm9yIG1vcmUKPiArICogZGV0YWlscy4KPiArICovCj4gK2VudW0g djRsMl92cDlfbG9vcF9maWx0ZXJfZmxhZ3Mgewo+ICsJVjRMMl9WUDlfTE9PUF9GSUxURVJfRkxB R19ERUxUQV9FTkFCTEVEID0gMSA8PCAwLAo+ICsJVjRMMl9WUDlfTE9PUF9GSUxURVJfRkxBR19E RUxUQV9VUERBVEUgPSAxIDw8IDEsCj4gK307Cj4gKwo+ICsvKioKPiArICogc3RydWN0IHY0bDJf dnA5X2xvb3BfZmlsdGVyIC0gVlA5IGxvb3AgZmlsdGVyIHBhcmFtZXRlcnMKPiArICoKPiArICog QHJlZl9kZWx0YXM6IGNvbnRhaW5zIHRoZSBhZGp1c3RtZW50IG5lZWRlZCBmb3IgdGhlIGZpbHRl ciBsZXZlbCBiYXNlZCBvbiB0aGUgY2hvc2VuCj4gKyAqCXJlZmVyZW5jZSBmcmFtZS4gSWYgdGhp cyBzeW50YXggZWxlbWVudCBpcyBub3QgcHJlc2VudCBpbiB0aGUgYml0c3RyZWFtLCB1c2Vycwo+ ICsgKglzaG91bGQgcGFzcyBpdHMgbGFzdCB2YWx1ZS4KPiArICogQG1vZGVfZGVsdGFzOiBjb250 YWlucyB0aGUgYWRqdXN0bWVudCBuZWVkZWQgZm9yIHRoZSBmaWx0ZXIgbGV2ZWwgYmFzZWQgb24g dGhlIGNob3NlbiBtb2RlLgo+ICsgKglJZiB0aGlzIHN5bnRheCBlbGVtZW50IGlzIG5vdCBwcmVz ZW50IGluIHRoZSBiaXRzdHJlYW0sIHVzZXJzCj4gKyAqCXNob3VsZCBwYXNzIGl0cyBsYXN0IHZh bHVlLgo+ICsgKiBAbGV2ZWw6IGluZGljYXRlcyB0aGUgbG9vcCBmaWx0ZXIgc3RyZW5ndGgKPiAr ICogQHNoYXJwbmVzczogaW5kaWNhdGVzIHRoZSBzaGFycG5lc3MgbGV2ZWwKPiArICogQGZsYWdz OiBjb21iaW5hdGlvbiBvZiBWNEwyX1ZQOV9MT09QX0ZJTFRFUl9GTEFHXyogZmxhZ3MKPiArICog QHJlc2VydmVkOiBwYWRkaW5nIGZpZWxkLiBTaG91bGQgYmUgemVyb2VkIGJ5IGFwcGxpY2F0aW9u cy4KPiArICoKPiArICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgYWxsIGxvb3AgZmlsdGVyIHJl bGF0ZWQgcGFyYW1ldGVycy4gU2VlIHNlY3Rpb25zCj4gKyAqICc3LjIuOCBMb29wIGZpbHRlciBz ZW1hbnRpY3MnIG9mIHRoZSBWUDkgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgo+ICsg Ki8KPiArc3RydWN0IHY0bDJfdnA5X2xvb3BfZmlsdGVyIHsKPiArCV9fczggcmVmX2RlbHRhc1s0 XTsKPiArCV9fczggbW9kZV9kZWx0YXNbMl07Cj4gKwlfX3U4IGxldmVsOwo+ICsJX191OCBzaGFy cG5lc3M7Cj4gKwlfX3U4IGZsYWdzOwo+ICsJX191OCByZXNlcnZlZFs3XTsKPiArfTsKPiArCj4g Ky8qKgo+ICsgKiBzdHJ1Y3QgdjRsMl92cDlfcXVhbnRpemF0aW9uIC0gVlA5IHF1YW50aXphdGlv biBwYXJhbWV0ZXJzCj4gKyAqCj4gKyAqIEBiYXNlX3FfaWR4OiBpbmRpY2F0ZXMgdGhlIGJhc2Ug ZnJhbWUgcWluZGV4Cj4gKyAqIEBkZWx0YV9xX3lfZGM6IGluZGljYXRlcyB0aGUgWSBEQyBxdWFu dGl6ZXIgcmVsYXRpdmUgdG8gYmFzZV9xX2lkeAo+ICsgKiBAZGVsdGFfcV91dl9kYzogaW5kaWNh dGVzIHRoZSBVViBEQyBxdWFudGl6ZXIgcmVsYXRpdmUgdG8gYmFzZV9xX2lkeAo+ICsgKiBAZGVs dGFfcV91dl9hYzogaW5kaWNhdGVzIHRoZSBVViBBQyBxdWFudGl6ZXIgcmVsYXRpdmUgdG8gYmFz ZV9xX2lkeAo+ICsgKiBAcmVzZXJ2ZWQ6IHBhZGRpbmcgZmllbGQuIFNob3VsZCBiZSB6ZXJvZWQg YnkgYXBwbGljYXRpb25zLgo+ICsgKgo+ICsgKiBFbmNvZGVzIHRoZSBxdWFudGl6YXRpb24gcGFy YW1ldGVycy4gU2VlIHNlY3Rpb24gJzcuMi45IFF1YW50aXphdGlvbiBwYXJhbXMKPiArICogc3lu dGF4JyBvZiB0aGUgVlA5IHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4KPiArICovCj4g K3N0cnVjdCB2NGwyX3ZwOV9xdWFudGl6YXRpb24gewo+ICsJX191OCBiYXNlX3FfaWR4Owo+ICsJ X19zOCBkZWx0YV9xX3lfZGM7Cj4gKwlfX3M4IGRlbHRhX3FfdXZfZGM7Cj4gKwlfX3M4IGRlbHRh X3FfdXZfYWM7Cj4gKwlfX3U4IHJlc2VydmVkWzRdOwo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIGVu dW0gdjRsMl92cDlfc2VnbWVudGF0aW9uX2ZsYWdzIC0gVlA5IHNlZ21lbnRhdGlvbiBmbGFncwo+ ICsgKgo+ICsgKiBAVjRMMl9WUDlfU0VHTUVOVEFUSU9OX0ZMQUdfRU5BQkxFRDogaW5kaWNhdGVz IHRoYXQgdGhpcyBmcmFtZSBtYWtlcyB1c2Ugb2YKPiArICoJdGhlIHNlZ21lbnRhdGlvbiB0b29s Cj4gKyAqIEBWNEwyX1ZQOV9TRUdNRU5UQVRJT05fRkxBR19VUERBVEVfTUFQOiBpbmRpY2F0ZXMg dGhhdCB0aGUgc2VnbWVudGF0aW9uIG1hcAo+ICsgKglzaG91bGQgYmUgdXBkYXRlZCBkdXJpbmcg dGhlIGRlY29kaW5nIG9mIHRoaXMgZnJhbWUKPiArICogQFY0TDJfVlA5X1NFR01FTlRBVElPTl9G TEFHX1RFTVBPUkFMX1VQREFURTogaW5kaWNhdGVzIHRoYXQgdGhlIHVwZGF0ZXMgdG8KPiArICoJ dGhlIHNlZ21lbnRhdGlvbiBtYXAgYXJlIGNvZGVkIHJlbGF0aXZlIHRvIHRoZSBleGlzdGluZyBz ZWdtZW50YXRpb24gbWFwCj4gKyAqIEBWNEwyX1ZQOV9TRUdNRU5UQVRJT05fRkxBR19VUERBVEVf REFUQTogaW5kaWNhdGVzIHRoYXQgbmV3IHBhcmFtZXRlcnMgYXJlCj4gKyAqCWFib3V0IHRvIGJl IHNwZWNpZmllZCBmb3IgZWFjaCBzZWdtZW50Cj4gKyAqIEBWNEwyX1ZQOV9TRUdNRU5UQVRJT05f RkxBR19BQlNfT1JfREVMVEFfVVBEQVRFOiBpbmRpY2F0ZXMgdGhhdCB0aGUKPiArICoJc2VnbWVu dGF0aW9uIHBhcmFtZXRlcnMgcmVwcmVzZW50IHRoZSBhY3R1YWwgdmFsdWVzIHRvIGJlIHVzZWQK PiArICoKPiArICogVGhvc2UgYXJlIHRoZSBmbGFncyB0aGF0IG1heSBiZSBwYXNzZWQgdG8gJnY0 bDJfdnA5X3NlZ21lbnRhdGlvbi5mbGFncy4gU2VlCj4gKyAqIHNlY3Rpb24gJzcuMi4xMCBTZWdt ZW50YXRpb24gcGFyYW1zIHN5bnRheCcgb2YgdGhlIFZQOSBzcGVjaWZpY2F0aW9uIGZvcgo+ICsg KiBtb3JlIGRldGFpbHMuCj4gKyAqLwo+ICtlbnVtIHY0bDJfdnA5X3NlZ21lbnRhdGlvbl9mbGFn cyB7Cj4gKwlWNEwyX1ZQOV9TRUdNRU5UQVRJT05fRkxBR19FTkFCTEVEID0gMSA8PCAwLAo+ICsJ VjRMMl9WUDlfU0VHTUVOVEFUSU9OX0ZMQUdfVVBEQVRFX01BUCA9IDEgPDwgMSwKPiArCVY0TDJf VlA5X1NFR01FTlRBVElPTl9GTEFHX1RFTVBPUkFMX1VQREFURSA9IDEgPDwgMiwKPiArCVY0TDJf VlA5X1NFR01FTlRBVElPTl9GTEFHX1VQREFURV9EQVRBID0gMSA8PCAzLAo+ICsJVjRMMl9WUDlf U0VHTUVOVEFUSU9OX0ZMQUdfQUJTX09SX0RFTFRBX1VQREFURSA9IDEgPDwgNCwKPiArfTsKPiAr Cj4gKyNkZWZpbmUgVjRMMl9WUDlfU0VHTUVOVF9GRUFUVVJFX0VOQUJMRUQoaWQpCSgxIDw8IChp ZCkpCj4gKyNkZWZpbmUgVjRMMl9WUDlfU0VHTUVOVF9GRUFUVVJFX0VOQUJMRURfTUFTSwkweGYK PiArCj4gKy8qKgo+ICsgKiBlbnVtIHY0bDJfdnA5X3NlZ21lbnRfZmVhdHVyZSAtIFZQOSBzZWdt ZW50IGZlYXR1cmUgSURzCj4gKyAqCj4gKyAqIEBWNEwyX1ZQOV9TRUdfTFZMX0FMVF9ROiBxdWFu dGl6ZXIgc2VnbWVudCBmZWF0dXJlCj4gKyAqIEBWNEwyX1ZQOV9TRUdfTFZMX0FMVF9MOiBsb29w IGZpbHRlciBzZWdtZW50IGZlYXR1cmUKPiArICogQFY0TDJfVlA5X1NFR19MVkxfUkVGX0ZSQU1F IHJlZmVyZW5jZSBmcmFtZSBzZWdtZW50IGZlYXR1cmUKPiArICogQFY0TDJfVlA5X1NFR19MVkxf U0tJUDogc2tpcCBzZWdtZW50IGZlYXR1cmUKPiArICogQFY0TDJfVlA5X1NFR19MVlZfTUFYOiBu dW1iZXIgb2Ygc2VnbWVudCBmZWF0dXJlcwo+ICsgKgo+ICsgKiBTZWdtZW50IGZlYXR1cmUgSURz LiBTZWUgc2VjdGlvbiAnNy4yLjEwIFNlZ21lbnRhdGlvbiBwYXJhbXMgc3ludGF4JyBvZiB0aGUK PiArICogVlA5IHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4KPiArICovCj4gK2VudW0g djRsMl92cDlfc2VnbWVudF9mZWF0dXJlIHsKPiArCVY0TDJfVlA5X1NFR19MVkxfQUxUX1EsCj4g KwlWNEwyX1ZQOV9TRUdfTFZMX0FMVF9MLAo+ICsJVjRMMl9WUDlfU0VHX0xWTF9SRUZfRlJBTUUs Cj4gKwlWNEwyX1ZQOV9TRUdfTFZMX1NLSVAsCj4gKwlWNEwyX1ZQOV9TRUdfTFZMX01BWCwKPiAr fTsKPiArCj4gKy8qKgo+ICsgKiBzdHJ1Y3QgdjRsMl92cDlfc2VnbWVudGF0aW9uIC0gVlA5IHNl Z21lbnRhdGlvbiBwYXJhbWV0ZXJzCj4gKyAqCj4gKyAqIEBmZWF0dXJlX2RhdGE6IGRhdGEgYXR0 YWNoZWQgdG8gZWFjaCBmZWF0dXJlLiBEYXRhIGVudHJ5IGlzIG9ubHkgdmFsaWQgaWYgdGhlIGZl YXR1cmUgaXMgZW5hYmxlZAo+ICsgKiBAZmVhdHVyZV9lbmFibGVkOiBiaXRtYXNrIGRlZmluaW5n IHdoaWNoIGZlYXR1cmVzIGFyZSBlbmFibGVkIGluIGVhY2ggc2VnbWVudAo+ICsgKiBAdHJlZV9w cm9iczogc3BlY2lmaWVzIHRoZSBwcm9iYWJpbGl0eSB2YWx1ZXMgdG8gYmUgdXNlZCB3aGVuCj4g KyAqCWRlY29kaW5nIGEgU2VnbWVudC1JRC4gU2VlICc1LjE1LiBTZWdtZW50YXRpb24gbWFwJyBz ZWN0aW9uIG9mIHRoZSBWUDkgc3BlY2lmaWNhdGlvbgo+ICsgKglmb3IgbW9yZSBkZXRhaWxzLgo+ ICsgKiBAcHJlZF9wcm9iczogc3BlY2lmaWVzIHRoZSBwcm9iYWJpbGl0eSB2YWx1ZXMgdG8gYmUg dXNlZCB3aGVuIGRlY29kaW5nIGEKPiArICoJUHJlZGljdGVkLVNlZ21lbnQtSUQuIFNlZSAnNi40 LjE0LiBHZXQgc2VnbWVudCBpZCBzeW50YXgnIHNlY3Rpb24gb2YgOnJlZjpgdnA5YAo+ICsgKglm b3IgbW9yZSBkZXRhaWxzLgo+ICsgKiBAZmxhZ3M6IGNvbWJpbmF0aW9uIG9mIFY0TDJfVlA5X1NF R01FTlRBVElPTl9GTEFHXyogZmxhZ3MKPiArICogQHJlc2VydmVkOiBwYWRkaW5nIGZpZWxkLiBT aG91bGQgYmUgemVyb2VkIGJ5IGFwcGxpY2F0aW9ucy4KPiArICoKPiArICogRW5jb2RlcyB0aGUg cXVhbnRpemF0aW9uIHBhcmFtZXRlcnMuIFNlZSBzZWN0aW9uICc3LjIuMTAgU2VnbWVudGF0aW9u IHBhcmFtcyBzeW50YXgnIG9mCj4gKyAqIHRoZSBWUDkgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBk ZXRhaWxzLgo+ICsgKi8KPiArc3RydWN0IHY0bDJfdnA5X3NlZ21lbnRhdGlvbiB7Cj4gKwlfX3Mx NiBmZWF0dXJlX2RhdGFbOF1bNF07Cj4gKwlfX3U4IGZlYXR1cmVfZW5hYmxlZFs4XTsKPiArCV9f dTggdHJlZV9wcm9ic1s3XTsKPiArCV9fdTggcHJlZF9wcm9ic1szXTsKPiArCV9fdTggZmxhZ3M7 Cj4gKwlfX3U4IHJlc2VydmVkWzVdOwo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIGVudW0gdjRsMl92 cDlfaW50cmFfcHJlZGljdGlvbl9tb2RlIC0gVlA5IEludHJhIHByZWRpY3Rpb24gbW9kZXMKPiAr ICoKPiArICogQFY0TDJfVlA5X0lOVFJBX1BSRURfTU9ERV9EQ19QUkVEOiBEQyBpbnRyYSBwcmVk aWN0aW9uCj4gKyAqIEBWNEwyX1ZQOV9JTlRSQV9QUkVEX01PREVfVl9QUkVEOiB2ZXJ0aWNhbCBp bnRyYSBwcmVkaWN0aW9uCj4gKyAqIEBWNEwyX1ZQOV9JTlRSQV9QUkVEX01PREVfSF9QUkVEOiBo b3Jpem9udGFsIGludHJhIHByZWRpY3Rpb24KPiArICogQFY0TDJfVlA5X0lOVFJBX1BSRURfTU9E RV9ENDVfUFJFRDogRDQ1IGludHJhIHByZWRpY3Rpb24KPiArICogQFY0TDJfVlA5X0lOVFJBX1BS RURfTU9ERV9EMTM1X1BSRUQ6IEQxMzUgaW50cmEgcHJlZGljdGlvbgo+ICsgKiBAVjRMMl9WUDlf SU5UUkFfUFJFRF9NT0RFX0QxMTdfUFJFRDogRDExNyBpbnRyYSBwcmVkaWN0aW9uCj4gKyAqIEBW NEwyX1ZQOV9JTlRSQV9QUkVEX01PREVfRDE1M19QUkVEOiBEMTUzIGludHJhIHByZWRpY3Rpb24K PiArICogQFY0TDJfVlA5X0lOVFJBX1BSRURfTU9ERV9EMjA3X1BSRUQ6IEQyMDcgaW50cmEgcHJl ZGljdGlvbgo+ICsgKiBAVjRMMl9WUDlfSU5UUkFfUFJFRF9NT0RFX0Q2M19QUkVEOiBENjMgaW50 cmEgcHJlZGljdGlvbgo+ICsgKiBAVjRMMl9WUDlfSU5UUkFfUFJFRF9NT0RFX1RNX1BSRUQ6IFRy dWUgTW90aW9uIGludHJhIHByZWRpY3Rpb24KPiArICoKPiArICogU2VlIHNlY3Rpb24gJzcuNC41 IEludHJhIGZyYW1lIG1vZGUgaW5mbyBzZW1hbnRpY3MnIGZvciBtb3JlIGRldGFpbHMuCj4gKyAq Lwo+ICtlbnVtIHY0bDJfdnA5X2ludHJhX3ByZWRpY3Rpb25fbW9kZSB7Cj4gKwlWNEwyX1ZQOV9J TlRSQV9QUkVEX01PREVfRENfUFJFRCwKPiArCVY0TDJfVlA5X0lOVFJBX1BSRURfTU9ERV9WX1BS RUQsCj4gKwlWNEwyX1ZQOV9JTlRSQV9QUkVEX01PREVfSF9QUkVELAo+ICsJVjRMMl9WUDlfSU5U UkFfUFJFRF9NT0RFX0Q0NV9QUkVELAo+ICsJVjRMMl9WUDlfSU5UUkFfUFJFRF9NT0RFX0QxMzVf UFJFRCwKPiArCVY0TDJfVlA5X0lOVFJBX1BSRURfTU9ERV9EMTE3X1BSRUQsCj4gKwlWNEwyX1ZQ OV9JTlRSQV9QUkVEX01PREVfRDE1M19QUkVELAo+ICsJVjRMMl9WUDlfSU5UUkFfUFJFRF9NT0RF X0QyMDdfUFJFRCwKPiArCVY0TDJfVlA5X0lOVFJBX1BSRURfTU9ERV9ENjNfUFJFRCwKPiArCVY0 TDJfVlA5X0lOVFJBX1BSRURfTU9ERV9UTV9QUkVELAo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIGVu dW0gdjRsMl92cDlfcmVzZXRfZnJhbWVfY29udGV4dCAtIFZhbGlkIHZhbHVlcyBmb3IKPiArICoJ CQkmdjRsMl9jdHJsX3ZwOV9mcmFtZS0+cmVzZXRfZnJhbWVfY29udGV4dAo+ICsgKgo+ICsgKiBA VjRMMl9WUDlfUkVTRVRfRlJBTUVfQ1RYX05PTkU6IGRvbid0IHJlc2V0IGFueSBmcmFtZSBjb250 ZXh0Cj4gKyAqIEBWNEwyX1ZQOV9SRVNFVF9GUkFNRV9DVFhfU1BFQzogcmVzZXQgdGhlIGZyYW1l IGNvbnRleHQgcG9pbnRlZCBieQo+ICsgKgkmdjRsMl9jdHJsX3ZwOV9mcmFtZS5mcmFtZV9jb250 ZXh0X2lkeAo+ICsgKiBAVjRMMl9WUDlfUkVTRVRfRlJBTUVfQ1RYX0FMTDogcmVzZXQgYWxsIGZy YW1lIGNvbnRleHRzCj4gKyAqCj4gKyAqIFNlZSBzZWN0aW9uICc3LjIgVW5jb21wcmVzc2VkIGhl YWRlciBzZW1hbnRpY3MnIG9mIHRoZSBWUDkgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxz Lgo+ICsgKi8KPiArZW51bSB2NGwyX3ZwOV9yZXNldF9mcmFtZV9jb250ZXh0IHsKPiArCVY0TDJf VlA5X1JFU0VUX0ZSQU1FX0NUWF9OT05FLAo+ICsJVjRMMl9WUDlfUkVTRVRfRlJBTUVfQ1RYX1NQ RUMsCj4gKwlWNEwyX1ZQOV9SRVNFVF9GUkFNRV9DVFhfQUxMLAo+ICt9Owo+ICsKPiArLyoqCj4g KyAqIGVudW0gdjRsMl92cDlfaW50ZXJwb2xhdGlvbl9maWx0ZXIgLSBWUDkgaW50ZXJwb2xhdGlv biBmaWx0ZXIgdHlwZXMKPiArICoKPiArICogQFY0TDJfVlA5X0lOVEVSUF9GSUxURVJfRUlHSFRU QVA6IGVpZ2h0IHRhcCBmaWx0ZXIKPiArICogQFY0TDJfVlA5X0lOVEVSUF9GSUxURVJfRUlHSFRU QVBfU01PT1RIOiBlaWdodCB0YXAgc21vb3RoIGZpbHRlcgo+ICsgKiBAVjRMMl9WUDlfSU5URVJQ X0ZJTFRFUl9FSUdIVFRBUF9TSEFSUDogZWlnaHQgdGFwIHNoYXJwIGZpbHRlcgo+ICsgKiBAVjRM Ml9WUDlfSU5URVJQX0ZJTFRFUl9CSUxJTkVBUjogYmlsaW5lYXIgZmlsdGVyCj4gKyAqIEBWNEwy X1ZQOV9JTlRFUlBfRklMVEVSX1NXSVRDSEFCTEU6IGZpbHRlciBzZWxlY3Rpb24gaXMgc2lnbmFs ZWQgYXQgdGhlIGJsb2NrIGxldmVsCj4gKyAqCj4gKyAqIFNlZSBzZWN0aW9uICc3LjIuNyBJbnRl cnBvbGF0aW9uIGZpbHRlciBzZW1hbnRpY3MnIG9mIHRoZSBWUDkgc3BlY2lmaWNhdGlvbgo+ICsg KiBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgKi8KPiArZW51bSB2NGwyX3ZwOV9pbnRlcnBvbGF0aW9u X2ZpbHRlciB7Cj4gKwlWNEwyX1ZQOV9JTlRFUlBfRklMVEVSX0VJR0hUVEFQLAo+ICsJVjRMMl9W UDlfSU5URVJQX0ZJTFRFUl9FSUdIVFRBUF9TTU9PVEgsCj4gKwlWNEwyX1ZQOV9JTlRFUlBfRklM VEVSX0VJR0hUVEFQX1NIQVJQLAo+ICsJVjRMMl9WUDlfSU5URVJQX0ZJTFRFUl9CSUxJTkVBUiwK PiArCVY0TDJfVlA5X0lOVEVSUF9GSUxURVJfU1dJVENIQUJMRSwKPiArfTsKPiArCj4gKy8qKgo+ ICsgKiBlbnVtIHY0bDJfdnA5X3JlZmVyZW5jZV9tb2RlIC0gVlA5IHJlZmVyZW5jZSBtb2Rlcwo+ ICsgKgo+ICsgKiBAVjRMMl9WUDlfUkVGRVJFTkNFX01PREVfU0lOR0xFX1JFRkVSRU5DRTogaW5k aWNhdGVzIHRoYXQgYWxsIHRoZSBpbnRlciBibG9ja3MgdXNlIG9ubHkgYQo+ICsgKglzaW5nbGUg cmVmZXJlbmNlIGZyYW1lIHRvIGdlbmVyYXRlIG1vdGlvbiBjb21wZW5zYXRlZCBwcmVkaWN0aW9u Cj4gKyAqIEBWNEwyX1ZQOV9SRUZFUkVOQ0VfTU9ERV9DT01QT1VORF9SRUZFUkVOQ0U6IHJlcXVp cmVzIGFsbCB0aGUgaW50ZXIgYmxvY2tzIHRvIHVzZSBjb21wb3VuZCBtb2RlLgo+ICsgKglTaW5n bGUgcmVmZXJlbmNlIGZyYW1lIHByZWRpY3Rpb24gaXMgbm90IGFsbG93ZWQKPiArICogQFY0TDJf VlA5X1JFRkVSRU5DRV9NT0RFX1NFTEVDVDogYWxsb3dzIGVhY2ggaW5kaXZpZHVhbCBpbnRlciBi bG9jayB0byBzZWxlY3QgYmV0d2VlbiBzaW5nbGUKPiArICoJYW5kIGNvbXBvdW5kIHByZWRpY3Rp b24gbW9kZXMKPiArICoKPiArICogU2VlIHNlY3Rpb24gJzcuMy42IEZyYW1lIHJlZmVyZW5jZSBt b2RlIHNlbWFudGljcycgb2YgdGhlIFZQOSBzcGVjaWZpY2F0aW9uCj4gKyAqIGZvciBtb3JlIGRl dGFpbHMuCj4gKyAqLwo+ICtlbnVtIHY0bDJfdnA5X3JlZmVyZW5jZV9tb2RlIHsKPiArCVY0TDJf VlA5X1JFRkVSRU5DRV9NT0RFX1NJTkdMRV9SRUZFUkVOQ0UsCj4gKwlWNEwyX1ZQOV9SRUZFUkVO Q0VfTU9ERV9DT01QT1VORF9SRUZFUkVOQ0UsCj4gKwlWNEwyX1ZQOV9SRUZFUkVOQ0VfTU9ERV9T RUxFQ1QsCj4gK307Cj4gKwo+ICsvKioKPiArICogZW51bSB2NGwyX3ZwOV90eF9tb2RlIC0gVlA5 IFRYIG1vZGVzCj4gKyAqCj4gKyAqIEBWNEwyX1ZQOV9UWF9NT0RFX09OTFlfNFg0OiB0cmFuc2Zv cm0gc2l6ZSBpcyA0eDQKPiArICogQFY0TDJfVlA5X1RYX01PREVfQUxMT1dfOFg4OiB0cmFuc2Zv cm0gc2l6ZSBjYW4gYmUgdXAgdG8gOHg4Cj4gKyAqIEBWNEwyX1ZQOV9UWF9NT0RFX0FMTE9XXzE2 WDE2OiB0cmFuc2Zvcm0gc2l6ZSBjYW4gYmUgdXAgdG8gMTZ4MTYKPiArICogQFY0TDJfVlA5X1RY X01PREVfQUxMT1dfMzJYMzI6IHRyYW5zZm9ybSBzaXplIGNhbiBiZSB1cCB0byAzMngzMgo+ICsg KiBAVjRMMl9WUDlfVFhfTU9ERV9TRUxFQ1Q6IGJpdHN0cmVhbSBjb250YWlucyB0aGUgdHJhbnNm b3JtIHNpemUgZm9yIGVhY2ggYmxvY2sKPiArICoKPiArICogU2VlIHNlY3Rpb24gJzcuMy4xIFR4 IG1vZGUgc2VtYW50aWNzJyBvZiB0aGUgVlA5IHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWls cy4KPiArICovCj4gK2VudW0gdjRsMl92cDlfdHhfbW9kZSB7Cj4gKwlWNEwyX1ZQOV9UWF9NT0RF X09OTFlfNFg0LAo+ICsJVjRMMl9WUDlfVFhfTU9ERV9BTExPV184WDgsCj4gKwlWNEwyX1ZQOV9U WF9NT0RFX0FMTE9XXzE2WDE2LAo+ICsJVjRMMl9WUDlfVFhfTU9ERV9BTExPV18zMlgzMiwKPiAr CVY0TDJfVlA5X1RYX01PREVfU0VMRUNULAo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIGVudW0gdjRs Ml92cDlfZnJhbWVfZmxhZ3MgLSBWUDkgZnJhbWUgZmxhZ3MKPiArICogQFY0TDJfVlA5X0ZSQU1F X0ZMQUdfS0VZX0ZSQU1FOiB0aGUgZnJhbWUgaXMgYSBrZXkgZnJhbWUKPiArICogQFY0TDJfVlA5 X0ZSQU1FX0ZMQUdfU0hPV19GUkFNRTogdGhlIGZyYW1lIHNob3VsZCBiZSBkaXNwbGF5ZWQKPiAr ICogQFY0TDJfVlA5X0ZSQU1FX0ZMQUdfRVJST1JfUkVTSUxJRU5UOiB0aGUgZGVjb2Rpbmcgc2hv dWxkIGJlIGVycm9yIHJlc2lsaWVudAo+ICsgKiBAVjRMMl9WUDlfRlJBTUVfRkxBR19JTlRSQV9P TkxZOiB0aGUgZnJhbWUgZG9lcyBub3QgcmVmZXJlbmNlIG90aGVyIGZyYW1lcwo+ICsgKiBAVjRM Ml9WUDlfRlJBTUVfRkxBR19BTExPV19ISUdIX1BSRUNfTVY6IHRoZSBmcmFtZSBjYW4gdXNlIGhp Z2ggcHJlY2lzaW9uIG1vdGlvbiB2ZWN0b3JzCj4gKyAqIEBWNEwyX1ZQOV9GUkFNRV9GTEFHX1JF RlJFU0hfRlJBTUVfQ1RYOiBmcmFtZSBjb250ZXh0IHNob3VsZCBiZSB1cGRhdGVkIGFmdGVyIGRl Y29kaW5nCj4gKyAqIEBWNEwyX1ZQOV9GUkFNRV9GTEFHX1BBUkFMTEVMX0RFQ19NT0RFOiBwYXJh bGxlbCBkZWNvZGluZyBpcyB1c2VkCj4gKyAqIEBWNEwyX1ZQOV9GUkFNRV9GTEFHX1hfU1VCU0FN UExJTkc6IHZlcnRpY2FsIHN1YnNhbXBsaW5nIGlzIGVuYWJsZWQKPiArICogQFY0TDJfVlA5X0ZS QU1FX0ZMQUdfWV9TVUJTQU1QTElORzogaG9yaXpvbnRhbCBzdWJzYW1wbGluZyBpcyBlbmFibGVk Cj4gKyAqIEBWNEwyX1ZQOV9GUkFNRV9GTEFHX0NPTE9SX1JBTkdFX0ZVTExfU1dJTkc6IGZ1bGwg VVYgcmFuZ2UgaXMgdXNlZAo+ICsgKgo+ICsgKiBDaGVjayB0aGUgVlA5IHNwZWNpZmljYXRpb24g Zm9yIG1vcmUgZGV0YWlscy4KPiArICovCj4gK2VudW0gdjRsMl92cDlfZnJhbWVfZmxhZ3Mgewo+ ICsJVjRMMl9WUDlfRlJBTUVfRkxBR19LRVlfRlJBTUUgPSAxIDw8IDAsCj4gKwlWNEwyX1ZQOV9G UkFNRV9GTEFHX1NIT1dfRlJBTUUgPSAxIDw8IDEsCj4gKwlWNEwyX1ZQOV9GUkFNRV9GTEFHX0VS Uk9SX1JFU0lMSUVOVCA9IDEgPDwgMiwKPiArCVY0TDJfVlA5X0ZSQU1FX0ZMQUdfSU5UUkFfT05M WSA9IDEgPDwgMywKPiArCVY0TDJfVlA5X0ZSQU1FX0ZMQUdfQUxMT1dfSElHSF9QUkVDX01WID0g MSA8PCA0LAo+ICsJVjRMMl9WUDlfRlJBTUVfRkxBR19SRUZSRVNIX0ZSQU1FX0NUWCA9IDEgPDwg NSwKPiArCVY0TDJfVlA5X0ZSQU1FX0ZMQUdfUEFSQUxMRUxfREVDX01PREUgPSAxIDw8IDYsCj4g KwlWNEwyX1ZQOV9GUkFNRV9GTEFHX1hfU1VCU0FNUExJTkcgPSAxIDw8IDcsCj4gKwlWNEwyX1ZQ OV9GUkFNRV9GTEFHX1lfU1VCU0FNUExJTkcgPSAxIDw8IDgsCj4gKwlWNEwyX1ZQOV9GUkFNRV9G TEFHX0NPTE9SX1JBTkdFX0ZVTExfU1dJTkcgPSAxIDw8IDksCj4gK307Cj4gKwo+ICsvKioKPiAr ICogZW51bSB2NGwyX3ZwOV9yZWZfZnJhbWVfc2lnbl9iaWFzIC0gV2hldGhlciByZWZfZnJhbWVf c2lnbl9iaWFzIGlzIDEgZm9yIGEgZ2l2ZW4gcmVmZXJlbmNlIGZyYW1lCj4gKyAqIEBWNEwyX1ZQ OV9TSUdOX0JJQVNfTEFTVDogcmVmX2ZyYW1lX3NpZ25fYmlhcyBpcyAxIGZvciB0aGUgImxhc3Qi IHJlZmVyZW5jZSBmcmFtZQo+ICsgKiBAVjRMMl9WUDlfU0lHTl9CSUFTX0dPTERFTjogcmVmX2Zy YW1lX3NpZ25fYmlhcyBpcyAxIGZvciB0aGUgImdvbGRlbiIgcmVmZXJlbmNlIGZyYW1lCj4gKyAq IEBWNEwyX1ZQOV9TSUdOX0JJQVNfQUxUOiByZWZfZnJhbWVfc2lnbl9iaWFzIGlzIDEgZm9yIHRo ZSAiYWx0IiByZWZlcmVuY2UgZnJhbWUKPiArICovCj4gKwo+ICtlbnVtIHY0bDJfdnA5X3JlZl9m cmFtZV9zaWduX2JpYXMgewo+ICsJVjRMMl9WUDlfU0lHTl9CSUFTX0xBU1QsCj4gKwlWNEwyX1ZQ OV9TSUdOX0JJQVNfR09MREVOLAo+ICsJVjRMMl9WUDlfU0lHTl9CSUFTX0FMVCwKPiArfTsKPiAr Cj4gKyNkZWZpbmUgVjRMMl9WUDlfUFJPRklMRV9NQVgJCTMKPiArCj4gKyNkZWZpbmUgVjRMMl9D SURfU1RBVEVMRVNTX1ZQOV9GUkFNRQkoVjRMMl9DSURfQ09ERUNfU1RBVEVMRVNTX0JBU0UgKyAz MDApCj4gKy8qKgo+ICsgKiBzdHJ1Y3QgdjRsMl9jdHJsX3ZwOV9mcmFtZSAtIFZQOSBmcmFtZSBk ZWNvZGluZyBjb250cm9sCj4gKyAqCj4gKyAqIEBsZjogbG9vcCBmaWx0ZXIgcGFyYW1ldGVycy4g U2VlICZ2NGwyX3ZwOV9sb29wX2ZpbHRlciBmb3IgbW9yZSBkZXRhaWxzCj4gKyAqIEBxdWFudDog cXVhbnRpemF0aW9uIHBhcmFtZXRlcnMuIFNlZSAmdjRsMl92cDlfcXVhbnRpemF0aW9uIGZvciBt b3JlIGRldGFpbHMKPiArICogQHNlZzogc2VnbWVudGF0aW9uIHBhcmFtZXRlcnMuIFNlZSAmdjRs Ml92cDlfc2VnbWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMKPiArICogQGZsYWdzOiBjb21iaW5h dGlvbiBvZiBWNEwyX1ZQOV9GUkFNRV9GTEFHXyogZmxhZ3MKPiArICogQGNvbXByZXNzZWRfaGVh ZGVyX3NpemU6IGNvbXByZXNzZWQgaGVhZGVyIHNpemUgaW4gYnl0ZXMKPiArICogQHVuY29tcHJl c3NlZF9oZWFkZXJfc2l6ZTogdW5jb21wcmVzc2VkIGhlYWRlciBzaXplIGluIGJ5dGVzCj4gKyAq IEBmcmFtZV93aWR0aF9taW51c18xOiBhZGQgMSB0byBpdCBhbmQgeW91J2xsIGdldCB0aGUgZnJh bWUgd2lkdGggZXhwcmVzc2VkIGluIHBpeGVscwo+ICsgKiBAZnJhbWVfaGVpZ2h0X21pbnVzXzE6 IGFkZCAxIHRvIGl0IGFuZCB5b3UnbGwgZ2V0IHRoZSBmcmFtZSBoZWlnaHQgZXhwcmVzc2VkIGlu IHBpeGVscwo+ICsgKiBAcmVuZGVyX3dpZHRoX21pbnVzXzE6IGFkZCAxIHRvIGl0IGFuZCB5b3Un bGwgZ2V0IHRoZSBleHBlY3RlZCByZW5kZXIgd2lkdGggZXhwcmVzc2VkIGluCj4gKyAqCXBpeGVs cy4gVGhpcyBpcyBub3QgdXNlZCBkdXJpbmcgdGhlIGRlY29kaW5nIHByb2Nlc3MgYnV0IG1pZ2h0 IGJlIHVzZWQgYnkgSFcgc2NhbGVycwo+ICsgKgl0byBwcmVwYXJlIGEgZnJhbWUgdGhhdCdzIHJl YWR5IGZvciBzY2Fub3V0Cj4gKyAqIEByZW5kZXJfaGVpZ2h0X21pbnVzXzE6IGFkZCAxIHRvIGl0 IGFuZCB5b3UnbGwgZ2V0IHRoZSBleHBlY3RlZCByZW5kZXIgaGVpZ2h0IGV4cHJlc3NlZCBpbgo+ ICsgKglwaXhlbHMuIFRoaXMgaXMgbm90IHVzZWQgZHVyaW5nIHRoZSBkZWNvZGluZyBwcm9jZXNz IGJ1dCBtaWdodCBiZSB1c2VkIGJ5IEhXIHNjYWxlcnMKPiArICoJdG8gcHJlcGFyZSBhIGZyYW1l IHRoYXQncyByZWFkeSBmb3Igc2Nhbm91dAo+ICsgKiBAbGFzdF9mcmFtZV90czogImxhc3QiIHJl ZmVyZW5jZSBidWZmZXIgdGltZXN0YW1wLgo+ICsgKiBUaGUgdGltZXN0YW1wIHJlZmVycyB0byB0 aGUgdGltZXN0YW1wIGZpZWxkIGluIHN0cnVjdCB2NGwyX2J1ZmZlci4KPiArICogVXNlIHY0bDJf dGltZXZhbF90b19ucygpIHRvIGNvbnZlcnQgdGhlIHN0cnVjdCB0aW1ldmFsIHRvIGEgX191NjQu Cj4gKyAqIEBnb2xkZW5fZnJhbWVfdHM6ICJnb2xkZW4iIHJlZmVyZW5jZSBidWZmZXIgdGltZXN0 YW1wLgo+ICsgKiBUaGUgdGltZXN0YW1wIHJlZmVycyB0byB0aGUgdGltZXN0YW1wIGZpZWxkIGlu IHN0cnVjdCB2NGwyX2J1ZmZlci4KPiArICogVXNlIHY0bDJfdGltZXZhbF90b19ucygpIHRvIGNv bnZlcnQgdGhlIHN0cnVjdCB0aW1ldmFsIHRvIGEgX191NjQuCj4gKyAqIEBhbHRfZnJhbWVfdHM6 ICJhbHQiIHJlZmVyZW5jZSBidWZmZXIgdGltZXN0YW1wLgo+ICsgKiBUaGUgdGltZXN0YW1wIHJl ZmVycyB0byB0aGUgdGltZXN0YW1wIGZpZWxkIGluIHN0cnVjdCB2NGwyX2J1ZmZlci4KPiArICog VXNlIHY0bDJfdGltZXZhbF90b19ucygpIHRvIGNvbnZlcnQgdGhlIHN0cnVjdCB0aW1ldmFsIHRv IGEgX191NjQuCj4gKyAqIEByZWZfZnJhbWVfc2lnbl9iaWFzOiBhIGJpdGZpZWxkIHNwZWNpZnlp bmcgd2hldGhlciB0aGUgc2lnbiBiaWFzIGlzIHNldCBmb3IgYSBnaXZlbgo+ICsgKglyZWZlcmVu Y2UgZnJhbWUuIFNlZSAmdjRsMl92cDlfcmVmX2ZyYW1lX3NpZ25fYmlhcyBmb3IgbW9yZSBkZXRh aWxzLgo+ICsgKiBAcmVzZXRfZnJhbWVfY29udGV4dDogc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGZy YW1lIGNvbnRleHQgc2hvdWxkIGJlIHJlc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgo+ICsgKglTZWUg JnY0bDJfdnA5X3Jlc2V0X2ZyYW1lX2NvbnRleHQgZm9yIG1vcmUgZGV0YWlscwo+ICsgKiBAZnJh bWVfY29udGV4dF9pZHg6IGZyYW1lIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgdXNlZC91cGRhdGVk Cj4gKyAqIEBwcm9maWxlOiBWUDkgcHJvZmlsZS4gQ2FuIGJlIDAsIDEsIDIgb3IgMwo+ICsgKiBA Yml0X2RlcHRoOiBiaXRzIHBlciBjb21wb25lbnRzLiBDYW4gYmUgOCwgMTAgb3IgMTIuIE5vdGUg dGhhdCBub3QgYWxsIHByb2ZpbGVzIHN1cHBvcnQKPiArICoJMTAgYW5kL29yIDEyIGJpdHMgZGVw dGhzCj4gKyAqIEBpbnRlcnBvbGF0aW9uX2ZpbHRlcjogc3BlY2lmaWVzIHRoZSBmaWx0ZXIgc2Vs ZWN0aW9uIHVzZWQgZm9yIHBlcmZvcm1pbmcgaW50ZXIgcHJlZGljdGlvbi4KPiArICoJU2VlICZ2 NGwyX3ZwOV9pbnRlcnBvbGF0aW9uX2ZpbHRlciBmb3IgbW9yZSBkZXRhaWxzCj4gKyAqIEB0aWxl X2NvbHNfbG9nMjogc3BlY2lmaWVzIHRoZSBiYXNlIDIgbG9nYXJpdGhtIG9mIHRoZSB3aWR0aCBv ZiBlYWNoIHRpbGUgKHdoZXJlIHRoZSB3aWR0aAo+ICsgKglpcyBtZWFzdXJlZCBpbiB1bml0cyBv ZiA4eDggYmxvY2tzKS4gU2hhbGwgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDYKPiArICogQHRp bGVfcm93c19sb2cyOiBzcGVjaWZpZXMgdGhlIGJhc2UgMiBsb2dhcml0aG0gb2YgdGhlIGhlaWdo dCBvZiBlYWNoIHRpbGUgKHdoZXJlIHRoZSBoZWlnaHQKPiArICoJaXMgbWVhc3VyZWQgaW4gdW5p dHMgb2YgOHg4IGJsb2NrcykKPiArICogQHR4X21vZGU6IHNwZWNpZmllcyB0aGUgVFggbW9kZS4g U2VlICZ2NGwyX3ZwOV90eF9tb2RlIGZvciBtb3JlIGRldGFpbHMKPiArICogQHJlZmVyZW5jZV9t b2RlOiBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgaW50ZXIgcHJlZGljdGlvbiB0byBiZSB1c2VkLiBT ZWUKPiArICoJJnY0bDJfdnA5X3JlZmVyZW5jZV9tb2RlIGZvciBtb3JlIGRldGFpbHMKPiArICog QHJlc2VydmVkOiBwYWRkaW5nIGZpZWxkLiBTaG91bGQgYmUgemVyb2VkIGJ5IGFwcGxpY2F0aW9u cy4KPiArICovCj4gK3N0cnVjdCB2NGwyX2N0cmxfdnA5X2ZyYW1lIHsKPiArCXN0cnVjdCB2NGwy X3ZwOV9sb29wX2ZpbHRlciBsZjsKPiArCXN0cnVjdCB2NGwyX3ZwOV9xdWFudGl6YXRpb24gcXVh bnQ7Cj4gKwlzdHJ1Y3QgdjRsMl92cDlfc2VnbWVudGF0aW9uIHNlZzsKPiArCV9fdTMyIGZsYWdz Owo+ICsJX191MTYgY29tcHJlc3NlZF9oZWFkZXJfc2l6ZTsKPiArCV9fdTE2IHVuY29tcHJlc3Nl ZF9oZWFkZXJfc2l6ZTsKPiArCV9fdTE2IGZyYW1lX3dpZHRoX21pbnVzXzE7Cj4gKwlfX3UxNiBm cmFtZV9oZWlnaHRfbWludXNfMTsKPiArCV9fdTE2IHJlbmRlcl93aWR0aF9taW51c18xOwo+ICsJ X191MTYgcmVuZGVyX2hlaWdodF9taW51c18xOwo+ICsJX191NjQgbGFzdF9mcmFtZV90czsKPiAr CV9fdTY0IGdvbGRlbl9mcmFtZV90czsKPiArCV9fdTY0IGFsdF9mcmFtZV90czsKPiArCV9fdTgg cmVmX2ZyYW1lX3NpZ25fYmlhczsKPiArCV9fdTggcmVzZXRfZnJhbWVfY29udGV4dDsKPiArCV9f dTggZnJhbWVfY29udGV4dF9pZHg7Cj4gKwlfX3U4IHByb2ZpbGU7Cj4gKwlfX3U4IGJpdF9kZXB0 aDsKPiArCV9fdTggaW50ZXJwb2xhdGlvbl9maWx0ZXI7Cj4gKwlfX3U4IHRpbGVfY29sc19sb2cy Owo+ICsJX191OCB0aWxlX3Jvd3NfbG9nMjsKPiArCV9fdTggdHhfbW9kZTsKPiArCV9fdTggcmVm ZXJlbmNlX21vZGU7Cj4gKwlfX3U4IHJlc2VydmVkWzZdOwo+ICt9Owo+ICsKPiArI2RlZmluZSBW NEwyX1ZQOV9OVU1fRlJBTUVfQ1RYCTQKPiArCj4gKy8qKgo+ICsgKiBzdHJ1Y3QgdjRsMl92cDlf bXZfY29tcHJlc3NlZF9oZHJfcHJvYnMgLSBWUDkgTW90aW9uIHZlY3RvciBwcm9iYWJpbGl0eSB1 cGRhdGVzCj4gKyAqIEBqb2ludDogbW90aW9uIHZlY3RvciBqb2ludCBwcm9iYWJpbGl0eSB1cGRh dGVzCj4gKyAqIEBzaWduOiBtb3Rpb24gdmVjdG9yIHNpZ24gcHJvYmFiaWxpdHkgdXBkYXRlcwo+ ICsgKiBAY2xhc3NlczogbW90aW9uIHZlY3RvciBjbGFzcyBwcm9iYWJpbGl0eSB1cGRhdGVzCj4g KyAqIEBjbGFzczBfYml0OiBtb3Rpb24gdmVjdG9yIGNsYXNzMCBiaXQgcHJvYmFiaWxpdHkgdXBk YXRlcwo+ICsgKiBAYml0czogbW90aW9uIHZlY3RvciBiaXRzIHByb2JhYmlsaXR5IHVwZGF0ZXMK PiArICogQGNsYXNzMF9mcjogbW90aW9uIHZlY3RvciBjbGFzczAgZnJhY3Rpb25hbCBiaXQgcHJv YmFiaWxpdHkgdXBkYXRlcwo+ICsgKiBAZnI6IG1vdGlvbiB2ZWN0b3IgZnJhY3Rpb25hbCBiaXQg cHJvYmFiaWxpdHkgdXBkYXRlcwo+ICsgKiBAY2xhc3MwX2hwOiBtb3Rpb24gdmVjdG9yIGNsYXNz MCBoaWdoIHByZWNpc2lvbiBmcmFjdGlvbmFsIGJpdCBwcm9iYWJpbGl0eSB1cGRhdGVzCj4gKyAq IEBocDogbW90aW9uIHZlY3RvciBoaWdoIHByZWNpc2lvbiBmcmFjdGlvbmFsIGJpdCBwcm9iYWJp bGl0eSB1cGRhdGVzCj4gKyAqCj4gKyAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIG5ldyB2YWx1 ZXMgb2YgbW90aW9uIHZlY3RvciBwcm9iYWJpbGl0aWVzLgo+ICsgKiBBIHZhbHVlIG9mIHplcm8g aW4gYW4gYXJyYXkgZWxlbWVudCBtZWFucyB0aGVyZSBpcyBubyB1cGRhdGUgb2YgdGhlIHJlbGV2 YW50IHByb2JhYmlsaXR5Lgo+ICsgKiBTZWUgYHN0cnVjdCB2NGwyX3ZwOV9wcm9iX3VwZGF0ZXNg IGZvciBkZXRhaWxzLgo+ICsgKi8KPiArc3RydWN0IHY0bDJfdnA5X212X2NvbXByZXNzZWRfaGRy X3Byb2JzIHsKPiArCV9fdTggam9pbnRbM107Cj4gKwlfX3U4IHNpZ25bMl07Cj4gKwlfX3U4IGNs YXNzZXNbMl1bMTBdOwo+ICsJX191OCBjbGFzczBfYml0WzJdOwo+ICsJX191OCBiaXRzWzJdWzEw XTsKPiArCV9fdTggY2xhc3MwX2ZyWzJdWzJdWzNdOwo+ICsJX191OCBmclsyXVszXTsKPiArCV9f dTggY2xhc3MwX2hwWzJdOwo+ICsJX191OCBocFsyXTsKPiArfTsKPiArCj4gKyNkZWZpbmUgVjRM Ml9DSURfU1RBVEVMRVNTX1ZQOV9DT01QUkVTU0VEX0hEUl9QUk9CUwkoVjRMMl9DSURfQ09ERUNf U1RBVEVMRVNTX0JBU0UgKyAzMDEpCj4gKy8qKgo+ICsgKiBzdHJ1Y3QgdjRsMl9jdHJsX3ZwOV9j b21wcmVzc2VkX2hkcl9wcm9icyAtIFZQOSBwcm9iYWJpbGl0eSB1cGRhdGVzIGNvbnRyb2wKPiAr ICogQHR4ODogVFggOHg4IHByb2JhYmlsaXR5IHVwZGF0ZXMKPiArICogQHR4MTY6IFRYIDE2eDE2 IHByb2JhYmlsaXR5IHVwZGF0ZXMKPiArICogQHR4MzI6IFRYIDMyeDMyIHByb2JhYmlsaXR5IHVw ZGF0ZXMKPiArICogQGNvZWY6IGNvZWZmaWNpZW50IHByb2JhYmlsaXR5IHVwZGF0ZXMKPiArICog QHNraXA6IHNraXAgcHJvYmFiaWxpdHkgdXBkYXRlcwo+ICsgKiBAaW50ZXJfbW9kZTogaW50ZXIg bW9kZSBwcm9iYWJpbGl0eSB1cGRhdGVzCj4gKyAqIEBpbnRlcnBfZmlsdGVyOiBpbnRlcnBvbGF0 aW9uIGZpbHRlciBwcm9iYWJpbGl0eSB1cGRhdGVzCj4gKyAqIEBpc19pbnRlcjogaXMgaW50ZXIt YmxvY2sgcHJvYmFiaWxpdHkgdXBkYXRlcwo+ICsgKiBAY29tcF9tb2RlOiBjb21wb3VuZCBwcmVk aWN0aW9uIG1vZGUgcHJvYmFiaWxpdHkgdXBkYXRlcwo+ICsgKiBAc2luZ2xlX3JlZjogc2luZ2xl IHJlZiBwcm9iYWJpbGl0eSB1cGRhdGVzCj4gKyAqIEBjb21wX3JlZjogY29tcG91bmQgcmVmIHBy b2JhYmlsaXR5IHVwZGF0ZXMKPiArICogQHlfbW9kZTogWSBwcmVkaWN0aW9uIG1vZGUgcHJvYmFi aWxpdHkgdXBkYXRlcwo+ICsgKiBAdXZfbW9kZTogVVYgcHJlZGljdGlvbiBtb2RlIHByb2JhYmls aXR5IHVwZGF0ZXMKPiArICogQHBhcnRpdGlvbjogcGFydGl0aW9uIHByb2JhYmlsaXR5IHVwZGF0 ZXMKPiArICogQG12OiBtb3Rpb24gdmVjdG9yIHByb2JhYmlsaXR5IHVwZGF0ZXMKPiArICoKPiAr ICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgdGhlIHByb2JhYmlsaXRpZXMgdXBkYXRlIGFzIHBhcnNl ZCBpbiB0aGUgY29tcHJlc3NlZAo+ICsgKiBoZWFkZXIgKFNwZWMgNi4zKS4gVGhlc2UgdmFsdWVz IHJlcHJlc2VudCB0aGUgdmFsdWUgb2YgcHJvYmFiaWxpdHkgdXBkYXRlIGFmdGVyCj4gKyAqIGJl aW5nIHRyYW5zbGF0ZWQgd2l0aCBpbnZfbWFwX3RhYmxlW10gKHNlZSA2LjMuNSkuIEEgdmFsdWUg b2YgemVybyBpbiBhbiBhcnJheSBlbGVtZW50Cj4gKyAqIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8g dXBkYXRlIG9mIHRoZSByZWxldmFudCBwcm9iYWJpbGl0eS4KPiArICovCj4gK3N0cnVjdCB2NGwy X2N0cmxfdnA5X2NvbXByZXNzZWRfaGRyX3Byb2JzIHsKPiArCV9fdTggdHg4WzJdWzFdOwo+ICsJ X191OCB0eDE2WzJdWzJdOwo+ICsJX191OCB0eDMyWzJdWzNdOwo+ICsJX191OCBjb2VmWzRdWzJd WzJdWzZdWzZdWzNdOwo+ICsJX191OCBza2lwWzNdOwo+ICsJX191OCBpbnRlcl9tb2RlWzddWzNd Owo+ICsJX191OCBpbnRlcnBfZmlsdGVyWzRdWzJdOwo+ICsJX191OCBpc19pbnRlcls0XTsKPiAr CV9fdTggY29tcF9tb2RlWzVdOwo+ICsJX191OCBzaW5nbGVfcmVmWzVdWzJdOwo+ICsJX191OCBj b21wX3JlZls1XTsKPiArCV9fdTggeV9tb2RlWzRdWzldOwo+ICsJX191OCB1dl9tb2RlWzEwXVs5 XTsKPiArCV9fdTggcGFydGl0aW9uWzE2XVszXTsKPiArCj4gKwlzdHJ1Y3QgdjRsMl92cDlfbXZf Y29tcHJlc3NlZF9oZHJfcHJvYnMgbXY7Cj4gK307Cj4gKwo+ICAvKiBNUEVHLWNvbXByZXNzaW9u IGRlZmluaXRpb25zIGtlcHQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCj4gICNpZm5k ZWYgX19LRVJORUxfXwo+ICAjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19NUEVHICAgICAgICAgICAg VjRMMl9DVFJMX0NMQVNTX0NPREVDCj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC92 aWRlb2RldjIuaCBiL2luY2x1ZGUvdWFwaS9saW51eC92aWRlb2RldjIuaAo+IGluZGV4IDU4Mzky ZGNkM2JmNS4uNGFiZTQzNjI1MTllIDEwMDY0NAo+IC0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC92 aWRlb2RldjIuaAo+ICsrKyBiL2luY2x1ZGUvdWFwaS9saW51eC92aWRlb2RldjIuaAo+IEBAIC03 MDMsNiArNzAzLDcgQEAgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB7Cj4gICNkZWZpbmUgVjRMMl9Q SVhfRk1UX1ZQOCAgICAgIHY0bDJfZm91cmNjKCdWJywgJ1AnLCAnOCcsICcwJykgLyogVlA4ICov Cj4gICNkZWZpbmUgVjRMMl9QSVhfRk1UX1ZQOF9GUkFNRSB2NGwyX2ZvdXJjYygnVicsICdQJywg JzgnLCAnRicpIC8qIFZQOCBwYXJzZWQgZnJhbWUgKi8KPiAgI2RlZmluZSBWNEwyX1BJWF9GTVRf VlA5ICAgICAgdjRsMl9mb3VyY2MoJ1YnLCAnUCcsICc5JywgJzAnKSAvKiBWUDkgKi8KPiArI2Rl ZmluZSBWNEwyX1BJWF9GTVRfVlA5X0ZSQU1FIHY0bDJfZm91cmNjKCdWJywgJ1AnLCAnOScsICdG JykgLyogVlA5IHBhcnNlZCBmcmFtZSAqLwo+ICAjZGVmaW5lIFY0TDJfUElYX0ZNVF9IRVZDICAg ICB2NGwyX2ZvdXJjYygnSCcsICdFJywgJ1YnLCAnQycpIC8qIEhFVkMgYWthIEguMjY1ICovCj4g ICNkZWZpbmUgVjRMMl9QSVhfRk1UX0ZXSFQgICAgIHY0bDJfZm91cmNjKCdGJywgJ1cnLCAnSCcs ICdUJykgLyogRmFzdCBXYWxzaCBIYWRhbWFyZCBUcmFuc2Zvcm0gKHZpY29kZWMpICovCj4gICNk ZWZpbmUgVjRMMl9QSVhfRk1UX0ZXSFRfU1RBVEVMRVNTICAgICB2NGwyX2ZvdXJjYygnUycsICdG JywgJ1cnLCAnSCcpIC8qIFN0YXRlbGVzcyBGV0hUICh2aWNvZGVjKSAqLwo+IEBAIC0xNzU1LDYg KzE3NTYsOCBAQCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCB7Cj4gIAkJc3RydWN0IHY0bDJfY3Ry bF9tcGVnMl9zZXF1ZW5jZSBfX3VzZXIgKnBfbXBlZzJfc2VxdWVuY2U7Cj4gIAkJc3RydWN0IHY0 bDJfY3RybF9tcGVnMl9waWN0dXJlIF9fdXNlciAqcF9tcGVnMl9waWN0dXJlOwo+ICAJCXN0cnVj dCB2NGwyX2N0cmxfbXBlZzJfcXVhbnRpc2F0aW9uIF9fdXNlciAqcF9tcGVnMl9xdWFudGlzYXRp b247Cj4gKwkJc3RydWN0IHY0bDJfY3RybF92cDlfY29tcHJlc3NlZF9oZHJfcHJvYnMgX191c2Vy ICpwX3ZwOV9jb21wcmVzc2VkX2hkcl9wcm9iczsKPiArCQlzdHJ1Y3QgdjRsMl9jdHJsX3ZwOV9m cmFtZSBfX3VzZXIgKnBfdnA5X2ZyYW1lOwo+ICAJCXZvaWQgX191c2VyICpwdHI7Cj4gIAl9Owo+ ICB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKPiBAQCAtMTgxOSw2ICsxODIyLDkgQEAgZW51 bSB2NGwyX2N0cmxfdHlwZSB7Cj4gIAlWNEwyX0NUUkxfVFlQRV9NUEVHMl9RVUFOVElTQVRJT04g ICA9IDB4MDI1MCwKPiAgCVY0TDJfQ1RSTF9UWVBFX01QRUcyX1NFUVVFTkNFICAgICAgID0gMHgw MjUxLAo+ICAJVjRMMl9DVFJMX1RZUEVfTVBFRzJfUElDVFVSRSAgICAgICAgPSAweDAyNTIsCj4g Kwo+ICsJVjRMMl9DVFJMX1RZUEVfVlA5X0NPTVBSRVNTRURfSERSX1BST0JTCT0gMHgwMjYwLAo+ ICsJVjRMMl9DVFJMX1RZUEVfVlA5X0ZSQU1FCQk9IDB4MDI2MSwKPiAgfTsKPiAgCj4gIC8qICBV c2VkIGluIHRoZSBWSURJT0NfUVVFUllDVFJMIGlvY3RsIGZvciBxdWVyeWluZyBjb250cm9scyAq LwoKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51 eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVh ZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1h cm0ta2VybmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [46.235.227.227]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 028822FB0 for ; Tue, 17 Aug 2021 17:57:02 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: nicolas) with ESMTPSA id AFD541F42897 Message-ID: <0fd8f0cfd231be2e11da218b0401e1b0e0a15cca.camel@collabora.com> Subject: Re: [PATCH v3 05/10] media: uapi: Add VP9 stateless decoder controls From: Nicolas Dufresne To: Andrzej Pietrasiewicz , linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-staging@lists.linux.dev Cc: Benjamin Gaignard , Boris Brezillon , Ezequiel Garcia , Fabio Estevam , Greg Kroah-Hartman , Hans Verkuil , Heiko Stuebner , Jernej Skrabec , Mauro Carvalho Chehab , NXP Linux Team , Pengutronix Kernel Team , Philipp Zabel , Sascha Hauer , Shawn Guo , kernel@collabora.com, Ezequiel Garcia , Adrian Ratiu , Daniel Almeida Date: Tue, 17 Aug 2021 13:49:48 -0400 In-Reply-To: <20210805144246.11998-6-andrzej.p@collabora.com> References: <20210805144246.11998-1-andrzej.p@collabora.com> <20210805144246.11998-6-andrzej.p@collabora.com> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.40.3 (3.40.3-1.fc34) Precedence: bulk X-Mailing-List: linux-staging@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Le jeudi 05 août 2021 à 16:42 +0200, Andrzej Pietrasiewicz a écrit : > Add the VP9 stateless decoder controls plus the documentation that goes > with it. > > Signed-off-by: Boris Brezillon > Co-developed-by: Ezequiel Garcia > Signed-off-by: Ezequiel Garcia > Signed-off-by: Adrian Ratiu > Signed-off-by: Andrzej Pietrasiewicz > Co-developed-by: Daniel Almeida > Signed-off-by: Daniel Almeida > --- > .../userspace-api/media/v4l/biblio.rst | 10 + > .../media/v4l/ext-ctrls-codec-stateless.rst | 545 ++++++++++++++++++ > .../media/v4l/pixfmt-compressed.rst | 15 + > .../media/v4l/vidioc-g-ext-ctrls.rst | 8 + > .../media/v4l/vidioc-queryctrl.rst | 12 + > .../media/videodev2.h.rst.exceptions | 2 + > drivers/media/v4l2-core/v4l2-ctrls-core.c | 174 ++++++ > drivers/media/v4l2-core/v4l2-ctrls-defs.c | 8 + > drivers/media/v4l2-core/v4l2-ioctl.c | 1 + > include/media/v4l2-ctrls.h | 4 + > include/uapi/linux/v4l2-controls.h | 433 ++++++++++++++ > include/uapi/linux/videodev2.h | 6 + > 12 files changed, 1218 insertions(+) > > diff --git a/Documentation/userspace-api/media/v4l/biblio.rst b/Documentation/userspace-api/media/v4l/biblio.rst > index 7b8e6738ff9e..9cd18c153d19 100644 > --- a/Documentation/userspace-api/media/v4l/biblio.rst > +++ b/Documentation/userspace-api/media/v4l/biblio.rst > @@ -417,3 +417,13 @@ VP8 > :title: RFC 6386: "VP8 Data Format and Decoding Guide" > > :author: J. Bankoski et al. > + > +.. _vp9: > + > +VP9 > +=== > + > + > +:title: VP9 Bitstream & Decoding Process Specification > + > +:author: Adrian Grange (Google), Peter de Rivaz (Argon Design), Jonathan Hunt (Argon Design) > diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst > index 72f5e85b4f34..af06d46e5993 100644 > --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst > +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst > @@ -1458,3 +1458,548 @@ FWHT Flags > .. raw:: latex > > \normalsize > + > +.. _v4l2-codec-stateless-vp9: > + > +``V4L2_CID_STATELESS_VP9_COMPRESSED_HDR_PROBS (struct)`` > + Stores VP9 probabilities updates as parsed from the current compressed frame > + header. A value of zero in an array element means no update of the relevant > + probability. Motion vector-related updates contain a new value or zero. All > + other updates contain values translated with inv_map_table[] (see 6.3.5 in > + :ref:`vp9`). As we discuss, widewine and other crypto may encrypt the compressed headers, so passing this information is not always possible from userspace. Newer VP9 decoders (notably newer Rockchip decoder) are being being extended with full HW support for compressed header handling including probability updates. Regardless if we like drm or not, we should at least make sure the spec allow to optimize and skip this control. Documenting this will reassure driver writers that don't need it and will let userspace devs know that they should check the control presence and can then skip the associate entropy decoding if not needed. > + > +.. c:type:: v4l2_ctrl_vp9_compressed_hdr_probs > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{5.8cm}|p{4.8cm}|p{6.6cm}| > + > +.. flat-table:: struct v4l2_ctrl_vp9_compressed_hdr_probs > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 1 2 > + > + * - __u8 > + - ``tx8[2][1]`` > + - TX 8x8 probabilities delta. > + * - __u8 > + - ``tx16[2][2]`` > + - TX 16x16 probabilities delta. > + * - __u8 > + - ``tx32[2][3]`` > + - TX 32x32 probabilities delta. > + * - __u8 > + - ``coef[4][2][2][6][6][3]`` > + - Coefficient probabilities delta. > + * - __u8 > + - ``skip[3]`` > + - Skip probabilities delta. > + * - __u8 > + - ``inter_mode[7][3]`` > + - Inter prediction mode probabilities delta. > + * - __u8 > + - ``interp_filter[4][2]`` > + - Interpolation filter probabilities delta. > + * - __u8 > + - ``is_inter[4]`` > + - Is inter-block probabilities delta. > + * - __u8 > + - ``comp_mode[5]`` > + - Compound prediction mode probabilities delta. > + * - __u8 > + - ``single_ref[5][2]`` > + - Single reference probabilities delta. > + * - __u8 > + - ``comp_ref[5]`` > + - Compound reference probabilities delta. > + * - __u8 > + - ``y_mode[4][9]`` > + - Y prediction mode probabilities delta. > + * - __u8 > + - ``uv_mode[10][9]`` > + - UV prediction mode probabilities delta. > + * - __u8 > + - ``partition[16][3]`` > + - Partition probabilities delta. > + * - __u8 > + - ``mv.joint[3]`` > + - Motion vector joint probabilities delta. > + * - __u8 > + - ``mv.sign[2]`` > + - Motion vector sign probabilities delta. > + * - __u8 > + - ``mv.classes[2][10]`` > + - Motion vector class probabilities delta. > + * - __u8 > + - ``mv.class0_bit[2]`` > + - Motion vector class0 bit probabilities delta. > + * - __u8 > + - ``mv.bits[2][10]`` > + - Motion vector bits probabilities delta. > + * - __u8 > + - ``mv.class0_fr[2][2][3]`` > + - Motion vector class0 fractional bit probabilities delta. > + * - __u8 > + - ``mv.fr[2][3]`` > + - Motion vector fractional bit probabilities delta. > + * - __u8 > + - ``mv.class0_hp[2]`` > + - Motion vector class0 high precision fractional bit probabilities delta. > + * - __u8 > + - ``mv.hp[2]`` > + - Motion vector high precision fractional bit probabilities delta. > + > +``V4L2_CID_STATELESS_VP9_FRAME (struct)`` > + Specifies the frame parameters for the associated VP9 frame decode request. > + This includes the necessary parameters for configuring a stateless hardware > + decoding pipeline for VP9. The bitstream parameters are defined according > + to :ref:`vp9`. > + > +.. c:type:: v4l2_ctrl_vp9_frame > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: struct v4l2_ctrl_vp9_frame > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 1 2 > + > + * - struct :c:type:`v4l2_vp9_loop_filter` > + - ``lf`` > + - Loop filter parameters. See struct :c:type:`v4l2_vp9_loop_filter` for more details. > + * - struct :c:type:`v4l2_vp9_quantization` > + - ``quant`` > + - Quantization parameters. See :c:type:`v4l2_vp9_quantization` for more details. > + * - struct :c:type:`v4l2_vp9_segmentation` > + - ``seg`` > + - Segmentation parameters. See :c:type:`v4l2_vp9_segmentation` for more details. > + * - __u32 > + - ``flags`` > + - Combination of V4L2_VP9_FRAME_FLAG_* flags. See :c:type:`v4l2_vp9_frame_flags`. > + * - __u16 > + - ``compressed_header_size`` > + - Compressed header size in bytes. > + * - __u16 > + - ``uncompressed_header_size`` > + - Uncompressed header size in bytes. > + * - __u16 > + - ``frame_width_minus_1`` > + - Add 1 to get the frame width expressed in pixels. See section 7.2.3 in :ref:`vp9`. > + * - __u16 > + - ``frame_height_minus_1`` > + - Add 1 to get the frame height expressed in pixels. See section 7.2.3 in :ref:`vp9`. > + * - __u16 > + - ``render_width_minus_1`` > + - Add 1 to get the expected render width expressed in pixels. This is > + not used during the decoding process but might be used by HW scalers to > + prepare a frame that's ready for scanout. See section 7.2.4 in :ref:`vp9`. > + * - __u16 > + - render_height_minus_1 > + - Add 1 to get the expected render height expressed in pixels. This is > + not used during the decoding process but might be used by HW scalers to > + prepare a frame that's ready for scanout. See section 7.2.4 in :ref:`vp9`. > + * - __u64 > + - ``last_frame_ts`` > + - "last" reference buffer timestamp. > + The timestamp refers to the ``timestamp`` field in > + struct :c:type:`v4l2_buffer`. Use the :c:func:`v4l2_timeval_to_ns()` > + function to convert the struct :c:type:`timeval` in struct > + :c:type:`v4l2_buffer` to a __u64. > + * - __u64 > + - ``golden_frame_ts`` > + - "golden" reference buffer timestamp. > + The timestamp refers to the ``timestamp`` field in > + struct :c:type:`v4l2_buffer`. Use the :c:func:`v4l2_timeval_to_ns()` > + function to convert the struct :c:type:`timeval` in struct > + :c:type:`v4l2_buffer` to a __u64. > + * - __u64 > + - ``alt_frame_ts`` > + - "alt" reference buffer timestamp. > + The timestamp refers to the ``timestamp`` field in > + struct :c:type:`v4l2_buffer`. Use the :c:func:`v4l2_timeval_to_ns()` > + function to convert the struct :c:type:`timeval` in struct > + :c:type:`v4l2_buffer` to a __u64. > + * - __u8 > + - ``ref_frame_sign_bias`` > + - a bitfield specifying whether the sign bias is set for a given > + reference frame. See :c:type:`v4l2_vp9_ref_frame_sign_bias` for more details. > + * - __u8 > + - ``reset_frame_context`` > + - specifies whether the frame context should be reset to default values. See > + :c:type:`v4l2_vp9_reset_frame_context` for more details. > + * - __u8 > + - ``frame_context_idx`` > + - Frame context that should be used/updated. > + * - __u8 > + - ``profile`` > + - VP9 profile. Can be 0, 1, 2 or 3. > + * - __u8 > + - ``bit_depth`` > + - Component depth in bits. Can be 8, 10 or 12. Note that not all profiles > + support 10 and/or 12 bits depths. > + * - __u8 > + - ``interpolation_filter`` > + - Specifies the filter selection used for performing inter prediction. See > + :c:type:`v4l2_vp9_interpolation_filter` for more details. > + * - __u8 > + - ``tile_cols_log2`` > + - Specifies the base 2 logarithm of the width of each tile (where the > + width is measured in units of 8x8 blocks). Shall be less than or equal > + to 6. > + * - __u8 > + - ``tile_rows_log2`` > + - Specifies the base 2 logarithm of the height of each tile (where the > + height is measured in units of 8x8 blocks). > + * - __u8 > + - ``tx_mode`` > + - Specifies the TX mode. See :c:type:`v4l2_vp9_tx_mode` for more details. > + * - __u8 > + - ``reference_mode`` > + - Specifies the type of inter prediction to be used. See > + :c:type:`v4l2_vp9_reference_mode` for more details. > + * - __u8 > + - ``reserved[6]`` > + - Applications and drivers must set this to zero. > + > +.. c:type:: v4l2_vp9_frame_flags > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: enum v4l2_vp9_frame_flags > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 2 > + > + * - ``V4L2_VP9_FRAME_FLAG_KEY_FRAME`` > + - The frame is a key frame. > + * - ``V4L2_VP9_FRAME_FLAG_SHOW_FRAME`` > + - The frame should be displayed. > + * - ``V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT`` > + - The decoding should be error resilient. > + * - ``V4L2_VP9_FRAME_FLAG_INTRA_ONLY`` > + - The frame does not reference other frames. > + * - ``V4L2_VP9_FRAME_FLAG_ALLOW_HIGH_PREC_MV`` > + - The frame can use high precision motion vectors. > + * - ``V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX`` > + - Frame context should be updated after decoding. > + * - ``V4L2_VP9_FRAME_FLAG_PARALLEL_DEC_MODE`` > + - Parallel decoding is used. > + * - ``V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING`` > + - Vertical subsampling is enabled. > + * - ``V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING`` > + - Horizontal subsampling is enabled. > + * - ``V4L2_VP9_FRAME_FLAG_COLOR_RANGE_FULL_SWING`` > + - The full UV range is used. > + > +.. c:type:: v4l2_vp9_tx_mode > + > +See section '7.3.1 Tx mode semantics' of the VP9 specification for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: enum v4l2_vp9_tx_mode > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 2 > + > + * - ``V4L2_VP9_TX_MODE_ONLY_4X4`` > + - Transform size is 4x4. > + * - ``V4L2_VP9_TX_MODE_ALLOW_8X8`` > + - Transform size can be up to 8x8. > + * - ``V4L2_VP9_TX_MODE_ALLOW_16X16`` > + - Transform size can be up to 16x16. > + * - ``V4L2_VP9_TX_MODE_ALLOW_32X32`` > + - transform size can be up to 32x32. > + * - ``V4L2_VP9_TX_MODE_SELECT`` > + - Bitstream contains the transform size for each block. > + > +.. c:type:: v4l2_vp9_reference_mode > + > +See section '7.3.6 Frame reference mode semantics' of the VP9 specification for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: enum v4l2_vp9_reference_mode > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 2 > + > + * - ``V4L2_VP9_REFERENCE_MODE_SINGLE_REFERENCE`` > + - Indicates that all the inter blocks use only a single reference frame > + to generate motion compensated prediction. > + * - ``V4L2_VP9_REFERENCE_MODE_COMPOUND_REFERENCE`` > + - Requires all the inter blocks to use compound mode. Single reference > + frame prediction is not allowed. > + * - ``V4L2_VP9_REFERENCE_MODE_SELECT`` > + - Allows each individual inter block to select between single and > + compound prediction modes. > + > +.. c:type:: v4l2_vp9_interpolation_filter > + > +See section '7.2.7 Interpolation filter semantics' of the VP9 specification > +for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: enum v4l2_vp9_interpolation_filter > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 2 > + > + * - ``V4L2_VP9_INTERP_FILTER_EIGHTTAP`` > + - Eight tap filter. > + * - ``V4L2_VP9_INTERP_FILTER_EIGHTTAP_SMOOTH`` > + - Eight tap smooth filter. > + * - ``V4L2_VP9_INTERP_FILTER_EIGHTTAP_SHARP`` > + - Eeight tap sharp filter. > + * - ``V4L2_VP9_INTERP_FILTER_BILINEAR`` > + - Bilinear filter. > + * - ``V4L2_VP9_INTERP_FILTER_SWITCHABLE`` > + - Filter selection is signaled at the block level. > + > +.. c:type:: v4l2_vp9_reset_frame_context > + > +See section '7.2 Uncompressed header semantics' of the VP9 specification > +for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: enum v4l2_vp9_reset_frame_context > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 2 > + > + * - ``V4L2_VP9_RESET_FRAME_CTX_NONE`` > + - Do not reset any frame context. > + * - ``V4L2_VP9_RESET_FRAME_CTX_SPEC`` > + - Reset the frame context pointed to by > + :c:type:`v4l2_ctrl_vp9_frame`.frame_context_idx. > + * - ``V4L2_VP9_RESET_FRAME_CTX_ALL`` > + - Reset all frame contexts. > + > +.. c:type:: v4l2_vp9_intra_prediction_mode > + > +See section '7.4.5 Intra frame mode info semantics' for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: enum v4l2_vp9_intra_prediction_mode > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 2 > + > + * - ``V4L2_VP9_INTRA_PRED_MODE_DC_PRED`` > + - DC intra prediction. > + * - ``V4L2_VP9_INTRA_PRED_MODE_V_PRED`` > + - Vertical intra prediction. > + * - ``V4L2_VP9_INTRA_PRED_MODE_H_PRED`` > + - Horizontal intra prediction. > + * - ``V4L2_VP9_INTRA_PRED_MODE_D45_PRED`` > + - D45 intra prediction. > + * - ``V4L2_VP9_INTRA_PRED_MODE_D135_PRED`` > + - D135 intra prediction. > + * - ``V4L2_VP9_INTRA_PRED_MODE_D117_PRED`` > + - D117 intra prediction. > + * - ``V4L2_VP9_INTRA_PRED_MODE_D153_PRED`` > + - D153 intra prediction. > + * - ``V4L2_VP9_INTRA_PRED_MODE_D207_PRED`` > + - D207 intra prediction. > + * - ``V4L2_VP9_INTRA_PRED_MODE_D63_PRED`` > + - D63 intra prediction. > + * - ``V4L2_VP9_INTRA_PRED_MODE_TM_PRED`` > + - True motion intra prediction. > + > +.. c:type:: v4l2_vp9_segmentation > + > +Encodes the quantization parameters. See section '7.2.10 Segmentation > +params syntax' of the VP9 specification for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: struct v4l2_vp9_segmentation > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 1 2 > + > + * - __u8 > + - ``feature_data[8][4]`` > + - Data attached to each feature. Data entry is only valid if the feature > + is enabled. > + * - __u8 > + - ``feature_enabled[8]`` > + - Bitmask defining which features are enabled in each segment. > + * - __u8 > + - ``tree_probs[7]`` > + - Specifies the probability values to be used when decoding a Segment-ID. > + See '5.15. Segmentation map' section of :ref:`vp9` for more details. > + * - __u8 > + - ``pred_probs[3]`` > + - Specifies the probability values to be used when decoding a > + Predicted-Segment-ID. See '6.4.14. Get segment id syntax' > + section of :ref:`vp9` for more details. > + * - __u8 > + - ``flags`` > + - Combination of V4L2_VP9_SEGMENTATION_FLAG_* flags. See > + :c:type:`v4l2_vp9_segmentation_flags`. > + * - __u8 > + - ``reserved[5]`` > + - Applications and drivers must set this to zero. > + > +.. c:type:: v4l2_vp9_segment_feature > + > +Segment feature IDs. See section '7.2.10 Segmentation params syntax' of the > +VP9 specification for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: enum v4l2_vp9_segment_feature > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 2 > + > + * - ``V4L2_VP9_SEG_LVL_ALT_Q`` > + - Quantizer segment feature. > + * - ``V4L2_VP9_SEG_LVL_ALT_L`` > + - Loop filter segment feature. > + * - ``V4L2_VP9_SEG_LVL_REF_FRAME`` > + - Reference frame segment feature. > + * - ``V4L2_VP9_SEG_LVL_SKIP`` > + - Skip segment feature. > + * - ``V4L2_VP9_SEG_LVL_MAX`` > + - Number of segment features. > + > +.. c:type:: v4l2_vp9_segmentation_flags > + > +Those are the flags that may be passed to &v4l2_vp9_segmentation.flags. See > +section '7.2.10 Segmentation params syntax' of the VP9 specification for > +more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: enum v4l2_vp9_segmentation_flags > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 2 > + > + * - ``V4L2_VP9_SEGMENTATION_FLAG_ENABLED`` > + - Indicates that this frame makes use of the segmentation tool. > + * - ``V4L2_VP9_SEGMENTATION_FLAG_UPDATE_MAP`` > + - Indicates that the segmentation map should be updated during the > + decoding of this frame. > + * - ``V4L2_VP9_SEGMENTATION_FLAG_TEMPORAL_UPDATE`` > + - Indicates that the updates to the segmentation map are coded > + relative to the existing segmentation map. > + * - ``V4L2_VP9_SEGMENTATION_FLAG_UPDATE_DATA`` > + - Indicates that new parameters are about to be specified for each > + segment. > + * - ``V4L2_VP9_SEGMENTATION_FLAG_ABS_OR_DELTA_UPDATE`` > + - Indicates that the segmentation parameters represent the actual values > + to be used. > + > +.. c:type:: v4l2_vp9_quantization > + > +Encodes the quantization parameters. See section '7.2.9 Quantization params > +syntax' of the VP9 specification for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: struct v4l2_vp9_quantization > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 1 2 > + > + * - __u8 > + - ``base_q_idx`` > + - Indicates the base frame qindex. > + * - __s8 > + - ``delta_q_y_dc`` > + - Indicates the Y DC quantizer relative to base_q_idx. > + * - __s8 > + - ``delta_q_uv_dc`` > + - Indicates the UV DC quantizer relative to base_q_idx. > + * - __s8 > + - ``delta_q_uv_ac`` > + - Indicates the UV AC quantizer relative to base_q_idx. > + * - __u8 > + - ``reserved[4]`` > + - Applications and drivers must set this to zero. > + > +.. c:type:: v4l2_vp9_loop_filter > + > +This structure contains all loop filter related parameters. See sections > +'7.2.8 Loop filter semantics' of the VP9 specification for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: struct v4l2_vp9_loop_filter > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 1 2 > + > + * - __s8 > + - ``ref_deltas[4]`` > + - Contains the adjustment needed for the filter level based on the chosen > + reference frame. > + * - __s8 > + - ``mode_deltas[2]`` > + - Contains the adjustment needed for the filter level based on the chosen > + mode. > + * - __u8 > + - ``level`` > + - Indicates the loop filter strength. > + * - __u8 > + - ``sharpness`` > + - Indicates the sharpness level. > + * - __u8 > + - ``flags`` > + - Combination of V4L2_VP9_LOOP_FILTER_FLAG_* flags. > + See :c:type:`v4l2_vp9_loop_filter_flags`. > + * - __u8 > + - ``reserved[7]`` > + - Applications and drivers must set this to zero. > + > + > +.. c:type:: v4l2_vp9_loop_filter_flags > + > +Those are the flags that may be passed. See section '7.2.8 Loop filter > +semantics' of the VP9 specification for more details. > + > +.. cssclass:: longtable > + > +.. tabularcolumns:: |p{1.5cm}|p{6.3cm}|p{9.4cm}| > + > +.. flat-table:: enum v4l2_vp9_loop_filter_flags > + :header-rows: 0 > + :stub-columns: 0 > + :widths: 1 2 > + > + * - ``V4L2_VP9_LOOP_FILTER_FLAG_DELTA_ENABLED`` > + - When set, the filter level depends on the mode and reference frame used > + to predict a block. > + * - ``V4L2_VP9_LOOP_FILTER_FLAG_DELTA_UPDATE`` > + - When set, the bitstream contains additional syntax elements that > + specify which mode and reference frame deltas are to be updated. > diff --git a/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst b/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst > index 0ede39907ee2..1b20f48a24b9 100644 > --- a/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst > +++ b/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst > @@ -172,6 +172,21 @@ Compressed Formats > - VP9 compressed video frame. The encoder generates one > compressed frame per buffer, and the decoder requires one > compressed frame per buffer. > + * .. _V4L2-PIX-FMT-VP9-FRAME: > + > + - ``V4L2_PIX_FMT_VP9_FRAME`` > + - 'VP9F' > + - VP9 parsed frame, including the frame header, as extracted from the container. > + This format is adapted for stateless video decoders that implement a > + VP9 pipeline with the :ref:`stateless_decoder`. > + Metadata associated with the frame to decode is required to be passed > + through the ``V4L2_CID_STATELESS_VP9_FRAME`` and > + the ``V4L2_CID_STATELESS_VP9_COMPRESSED_HDR_PROBS`` controls. > + See the :ref:`associated Codec Control IDs `. > + Exactly one output and one capture buffer must be provided for use with > + this pixel format. The output buffer must contain the appropriate number > + of macroblocks to decode a full corresponding frame to the matching > + capture buffer. > * .. _V4L2-PIX-FMT-HEVC: > > - ``V4L2_PIX_FMT_HEVC`` > diff --git a/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst b/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst > index 2d6bc8d94380..258895ff0c71 100644 > --- a/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst > +++ b/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst > @@ -233,6 +233,14 @@ still cause this situation. > - ``p_mpeg2_quantisation`` > - A pointer to a struct :c:type:`v4l2_ctrl_mpeg2_quantisation`. Valid if this control is > of type ``V4L2_CTRL_TYPE_MPEG2_QUANTISATION``. > + * - struct :c:type:`v4l2_ctrl_vp9_compressed_hdr_probs` * > + - ``p_vp9_compressed_hdr_probs`` > + - A pointer to a struct :c:type:`v4l2_ctrl_vp9_compressed_hdr_probs`. Valid if this > + control is of type ``V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR_PROBS``. > + * - struct :c:type:`v4l2_ctrl_vp9_frame` * > + - ``p_vp9_frame`` > + - A pointer to a struct :c:type:`v4l2_ctrl_vp9_frame`. Valid if this > + control is of type ``V4L2_CTRL_TYPE_VP9_FRAME``. > * - struct :c:type:`v4l2_ctrl_hdr10_cll_info` * > - ``p_hdr10_cll`` > - A pointer to a struct :c:type:`v4l2_ctrl_hdr10_cll_info`. Valid if this control is > diff --git a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst b/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst > index f9ecf6276129..e0c6a5d9ff6b 100644 > --- a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst > +++ b/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst > @@ -507,6 +507,18 @@ See also the examples in :ref:`control`. > - n/a > - A struct :c:type:`v4l2_ctrl_hevc_decode_params`, containing HEVC > decoding parameters for stateless video decoders. > + * - ``V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR_PROBS`` > + - n/a > + - n/a > + - n/a > + - A struct :c:type:`v4l2_ctrl_vp9_compressed_hdr_probs`, containing VP9 > + probabilities updates for stateless video decoders. > + * - ``V4L2_CTRL_TYPE_VP9_FRAME`` > + - n/a > + - n/a > + - n/a > + - A struct :c:type:`v4l2_ctrl_vp9_frame`, containing VP9 > + frame decode parameters for stateless video decoders. > > .. raw:: latex > > diff --git a/Documentation/userspace-api/media/videodev2.h.rst.exceptions b/Documentation/userspace-api/media/videodev2.h.rst.exceptions > index eb0b1cd37abd..129ef3edfa73 100644 > --- a/Documentation/userspace-api/media/videodev2.h.rst.exceptions > +++ b/Documentation/userspace-api/media/videodev2.h.rst.exceptions > @@ -149,6 +149,8 @@ replace symbol V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS :c:type:`v4l2_ctrl_type` > replace symbol V4L2_CTRL_TYPE_AREA :c:type:`v4l2_ctrl_type` > replace symbol V4L2_CTRL_TYPE_FWHT_PARAMS :c:type:`v4l2_ctrl_type` > replace symbol V4L2_CTRL_TYPE_VP8_FRAME :c:type:`v4l2_ctrl_type` > +replace symbol V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR_PROBS :c:type:`v4l2_ctrl_type` > +replace symbol V4L2_CTRL_TYPE_VP9_FRAME :c:type:`v4l2_ctrl_type` > replace symbol V4L2_CTRL_TYPE_HDR10_CLL_INFO :c:type:`v4l2_ctrl_type` > replace symbol V4L2_CTRL_TYPE_HDR10_MASTERING_DISPLAY :c:type:`v4l2_ctrl_type` > > diff --git a/drivers/media/v4l2-core/v4l2-ctrls-core.c b/drivers/media/v4l2-core/v4l2-ctrls-core.c > index c4b5082849b6..ed9cf298a83a 100644 > --- a/drivers/media/v4l2-core/v4l2-ctrls-core.c > +++ b/drivers/media/v4l2-core/v4l2-ctrls-core.c > @@ -283,6 +283,12 @@ static void std_log(const struct v4l2_ctrl *ctrl) > case V4L2_CTRL_TYPE_MPEG2_PICTURE: > pr_cont("MPEG2_PICTURE"); > break; > + case V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR_PROBS: > + pr_cont("VP9_COMPRESSED_HDR_PROBS"); > + break; > + case V4L2_CTRL_TYPE_VP9_FRAME: > + pr_cont("VP9_FRAME"); > + break; > default: > pr_cont("unknown type %d", ctrl->type); > break; > @@ -317,6 +323,162 @@ static void std_log(const struct v4l2_ctrl *ctrl) > #define zero_reserved(s) \ > memset(&(s).reserved, 0, sizeof((s).reserved)) > > +static int > +validate_vp9_lf_params(struct v4l2_vp9_loop_filter *lf) > +{ > + unsigned int i; > + > + if (lf->flags & ~(V4L2_VP9_LOOP_FILTER_FLAG_DELTA_ENABLED | > + V4L2_VP9_LOOP_FILTER_FLAG_DELTA_UPDATE)) > + return -EINVAL; > + > + /* That all values are in the accepted range. */ > + if (lf->level > GENMASK(5, 0)) > + return -EINVAL; > + > + if (lf->sharpness > GENMASK(2, 0)) > + return -EINVAL; > + > + for (i = 0; i < ARRAY_SIZE(lf->ref_deltas); i++) > + if (lf->ref_deltas[i] < -63 || lf->ref_deltas[i] > 63) > + return -EINVAL; > + > + for (i = 0; i < ARRAY_SIZE(lf->mode_deltas); i++) > + if (lf->mode_deltas[i] < -63 || lf->mode_deltas[i] > 63) > + return -EINVAL; > + > + zero_reserved(*lf); > + return 0; > +} > + > +static int > +validate_vp9_quant_params(struct v4l2_vp9_quantization *quant) > +{ > + if (quant->delta_q_y_dc < -15 || quant->delta_q_y_dc > 15 || > + quant->delta_q_uv_dc < -15 || quant->delta_q_uv_dc > 15 || > + quant->delta_q_uv_ac < -15 || quant->delta_q_uv_ac > 15) > + return -EINVAL; > + > + zero_reserved(*quant); > + return 0; > +} > + > +static int > +validate_vp9_seg_params(struct v4l2_vp9_segmentation *seg) > +{ > + unsigned int i, j; > + > + if (seg->flags & ~(V4L2_VP9_SEGMENTATION_FLAG_ENABLED | > + V4L2_VP9_SEGMENTATION_FLAG_UPDATE_MAP | > + V4L2_VP9_SEGMENTATION_FLAG_TEMPORAL_UPDATE | > + V4L2_VP9_SEGMENTATION_FLAG_UPDATE_DATA | > + V4L2_VP9_SEGMENTATION_FLAG_ABS_OR_DELTA_UPDATE)) > + return -EINVAL; > + > + for (i = 0; i < ARRAY_SIZE(seg->feature_enabled); i++) { > + if (seg->feature_enabled[i] & > + ~V4L2_VP9_SEGMENT_FEATURE_ENABLED_MASK) > + return -EINVAL; > + } > + > + for (i = 0; i < ARRAY_SIZE(seg->feature_data); i++) { > + const int range[] = { 255, 63, 3, 0 }; > + > + for (j = 0; j < ARRAY_SIZE(seg->feature_data[j]); j++) { > + if (seg->feature_data[i][j] < -range[j] || > + seg->feature_data[i][j] > range[j]) > + return -EINVAL; > + } > + } > + > + zero_reserved(*seg); > + return 0; > +} > + > +static int > +validate_vp9_frame(struct v4l2_ctrl_vp9_frame *frame) > +{ > + int ret; > + > + /* Make sure we're not passed invalid flags. */ > + if (frame->flags & ~(V4L2_VP9_FRAME_FLAG_KEY_FRAME | > + V4L2_VP9_FRAME_FLAG_SHOW_FRAME | > + V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT | > + V4L2_VP9_FRAME_FLAG_INTRA_ONLY | > + V4L2_VP9_FRAME_FLAG_ALLOW_HIGH_PREC_MV | > + V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX | > + V4L2_VP9_FRAME_FLAG_PARALLEL_DEC_MODE | > + V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING | > + V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING | > + V4L2_VP9_FRAME_FLAG_COLOR_RANGE_FULL_SWING)) > + return -EINVAL; > + > + if (frame->flags & V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT && > + frame->flags & V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX) > + return -EINVAL; > + > + if (frame->profile > V4L2_VP9_PROFILE_MAX) > + return -EINVAL; > + > + if (frame->reset_frame_context > V4L2_VP9_RESET_FRAME_CTX_ALL) > + return -EINVAL; > + > + if (frame->frame_context_idx >= V4L2_VP9_NUM_FRAME_CTX) > + return -EINVAL; > + > + /* > + * Profiles 0 and 1 only support 8-bit depth, profiles 2 and 3 only 10 > + * and 12 bit depths. > + */ > + if ((frame->profile < 2 && frame->bit_depth != 8) || > + (frame->profile >= 2 && > + (frame->bit_depth != 10 && frame->bit_depth != 12))) > + return -EINVAL; > + > + /* Profile 0 and 2 only accept YUV 4:2:0. */ > + if ((frame->profile == 0 || frame->profile == 2) && > + (!(frame->flags & V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING) || > + !(frame->flags & V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING))) > + return -EINVAL; > + > + /* Profile 1 and 3 only accept YUV 4:2:2, 4:4:0 and 4:4:4. */ > + if ((frame->profile == 1 || frame->profile == 3) && > + ((frame->flags & V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING) && > + (frame->flags & V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING))) > + return -EINVAL; > + > + if (frame->interpolation_filter > V4L2_VP9_INTERP_FILTER_SWITCHABLE) > + return -EINVAL; > + > + /* > + * According to the spec, tile_cols_log2 shall be less than or equal > + * to 6. > + */ > + if (frame->tile_cols_log2 > 6) > + return -EINVAL; > + > + if (frame->tx_mode > V4L2_VP9_TX_MODE_SELECT) > + return -EINVAL; > + > + if (frame->reference_mode > V4L2_VP9_REFERENCE_MODE_SELECT) > + return -EINVAL; > + > + ret = validate_vp9_lf_params(&frame->lf); > + if (ret) > + return ret; > + > + ret = validate_vp9_quant_params(&frame->quant); > + if (ret) > + return ret; > + > + ret = validate_vp9_seg_params(&frame->seg); > + if (ret) > + return ret; > + > + zero_reserved(*frame); > + return 0; > +} > + > /* > * Compound controls validation requires setting unused fields/flags to zero > * in order to properly detect unchanged controls with std_equal's memcmp. > @@ -687,6 +849,12 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx, > > break; > > + case V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR_PROBS: > + break; > + > + case V4L2_CTRL_TYPE_VP9_FRAME: > + return validate_vp9_frame(p); > + > case V4L2_CTRL_TYPE_AREA: > area = p; > if (!area->width || !area->height) > @@ -1249,6 +1417,12 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl, > case V4L2_CTRL_TYPE_HDR10_MASTERING_DISPLAY: > elem_size = sizeof(struct v4l2_ctrl_hdr10_mastering_display); > break; > + case V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR_PROBS: > + elem_size = sizeof(struct v4l2_ctrl_vp9_compressed_hdr_probs); > + break; > + case V4L2_CTRL_TYPE_VP9_FRAME: > + elem_size = sizeof(struct v4l2_ctrl_vp9_frame); > + break; > case V4L2_CTRL_TYPE_AREA: > elem_size = sizeof(struct v4l2_area); > break; > diff --git a/drivers/media/v4l2-core/v4l2-ctrls-defs.c b/drivers/media/v4l2-core/v4l2-ctrls-defs.c > index 421300e13a41..d383c438156f 100644 > --- a/drivers/media/v4l2-core/v4l2-ctrls-defs.c > +++ b/drivers/media/v4l2-core/v4l2-ctrls-defs.c > @@ -1175,6 +1175,8 @@ const char *v4l2_ctrl_get_name(u32 id) > case V4L2_CID_STATELESS_MPEG2_SEQUENCE: return "MPEG-2 Sequence Header"; > case V4L2_CID_STATELESS_MPEG2_PICTURE: return "MPEG-2 Picture Header"; > case V4L2_CID_STATELESS_MPEG2_QUANTISATION: return "MPEG-2 Quantisation Matrices"; > + case V4L2_CID_STATELESS_VP9_COMPRESSED_HDR_PROBS: return "VP9 Probabilities Updates"; > + case V4L2_CID_STATELESS_VP9_FRAME: return "VP9 Frame Decode Parameters"; > > /* Colorimetry controls */ > /* Keep the order of the 'case's the same as in v4l2-controls.h! */ > @@ -1493,6 +1495,12 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type, > case V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS: > *type = V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS; > break; > + case V4L2_CID_STATELESS_VP9_COMPRESSED_HDR_PROBS: > + *type = V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR_PROBS; > + break; > + case V4L2_CID_STATELESS_VP9_FRAME: > + *type = V4L2_CTRL_TYPE_VP9_FRAME; > + break; > case V4L2_CID_UNIT_CELL_SIZE: > *type = V4L2_CTRL_TYPE_AREA; > *flags |= V4L2_CTRL_FLAG_READ_ONLY; > diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c > index ec6fc1ef291e..7a5e8120d733 100644 > --- a/drivers/media/v4l2-core/v4l2-ioctl.c > +++ b/drivers/media/v4l2-core/v4l2-ioctl.c > @@ -1394,6 +1394,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) > case V4L2_PIX_FMT_VP8: descr = "VP8"; break; > case V4L2_PIX_FMT_VP8_FRAME: descr = "VP8 Frame"; break; > case V4L2_PIX_FMT_VP9: descr = "VP9"; break; > + case V4L2_PIX_FMT_VP9_FRAME: descr = "VP9 Frame"; break; > case V4L2_PIX_FMT_HEVC: descr = "HEVC"; break; /* aka H.265 */ > case V4L2_PIX_FMT_HEVC_SLICE: descr = "HEVC Parsed Slice Data"; break; > case V4L2_PIX_FMT_FWHT: descr = "FWHT"; break; /* used in vicodec */ > diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h > index 575b59fbac77..3ea4386ebd91 100644 > --- a/include/media/v4l2-ctrls.h > +++ b/include/media/v4l2-ctrls.h > @@ -50,6 +50,8 @@ struct video_device; > * @p_h264_decode_params: Pointer to a struct v4l2_ctrl_h264_decode_params. > * @p_h264_pred_weights: Pointer to a struct v4l2_ctrl_h264_pred_weights. > * @p_vp8_frame: Pointer to a VP8 frame params structure. > + * @p_vp9_compressed_hdr_probs: Pointer to a VP9 frame compressed header probs structure. > + * @p_vp9_frame: Pointer to a VP9 frame params structure. > * @p_hevc_sps: Pointer to an HEVC sequence parameter set structure. > * @p_hevc_pps: Pointer to an HEVC picture parameter set structure. > * @p_hevc_slice_params: Pointer to an HEVC slice parameters structure. > @@ -80,6 +82,8 @@ union v4l2_ctrl_ptr { > struct v4l2_ctrl_hevc_sps *p_hevc_sps; > struct v4l2_ctrl_hevc_pps *p_hevc_pps; > struct v4l2_ctrl_hevc_slice_params *p_hevc_slice_params; > + struct v4l2_ctrl_vp9_compressed_hdr_probs *p_vp9_compressed_hdr_probs; > + struct v4l2_ctrl_vp9_frame *p_vp9_frame; > struct v4l2_ctrl_hdr10_cll_info *p_hdr10_cll; > struct v4l2_ctrl_hdr10_mastering_display *p_hdr10_mastering; > struct v4l2_area *p_area; > diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h > index 5532b5f68493..8f8c3c1ad885 100644 > --- a/include/uapi/linux/v4l2-controls.h > +++ b/include/uapi/linux/v4l2-controls.h > @@ -2010,6 +2010,439 @@ struct v4l2_ctrl_hdr10_mastering_display { > __u32 min_display_mastering_luminance; > }; > > +/* Stateless VP9 controls */ > + > +/** > + * enum v4l2_vp9_loop_filter_flags - VP9 loop filter flags > + * > + * @V4L2_VP9_LOOP_FILTER_FLAG_DELTA_ENABLED: the filter level depends on > + * the mode and reference frame used to predict a block > + * @V4L2_VP9_LOOP_FILTER_FLAG_DELTA_UPDATE: the bitstream contains additional > + * syntax elements that specify which mode and reference frame deltas are to be updated > + * > + * Those are the flags that may be passed to &v4l2_vp9_loop_filter.flags. See > + * section '7.2.8 Loop filter semantics' of the VP9 specification for more > + * details. > + */ > +enum v4l2_vp9_loop_filter_flags { > + V4L2_VP9_LOOP_FILTER_FLAG_DELTA_ENABLED = 1 << 0, > + V4L2_VP9_LOOP_FILTER_FLAG_DELTA_UPDATE = 1 << 1, > +}; > + > +/** > + * struct v4l2_vp9_loop_filter - VP9 loop filter parameters > + * > + * @ref_deltas: contains the adjustment needed for the filter level based on the chosen > + * reference frame. If this syntax element is not present in the bitstream, users > + * should pass its last value. > + * @mode_deltas: contains the adjustment needed for the filter level based on the chosen mode. > + * If this syntax element is not present in the bitstream, users > + * should pass its last value. > + * @level: indicates the loop filter strength > + * @sharpness: indicates the sharpness level > + * @flags: combination of V4L2_VP9_LOOP_FILTER_FLAG_* flags > + * @reserved: padding field. Should be zeroed by applications. > + * > + * This structure contains all loop filter related parameters. See sections > + * '7.2.8 Loop filter semantics' of the VP9 specification for more details. > + */ > +struct v4l2_vp9_loop_filter { > + __s8 ref_deltas[4]; > + __s8 mode_deltas[2]; > + __u8 level; > + __u8 sharpness; > + __u8 flags; > + __u8 reserved[7]; > +}; > + > +/** > + * struct v4l2_vp9_quantization - VP9 quantization parameters > + * > + * @base_q_idx: indicates the base frame qindex > + * @delta_q_y_dc: indicates the Y DC quantizer relative to base_q_idx > + * @delta_q_uv_dc: indicates the UV DC quantizer relative to base_q_idx > + * @delta_q_uv_ac: indicates the UV AC quantizer relative to base_q_idx > + * @reserved: padding field. Should be zeroed by applications. > + * > + * Encodes the quantization parameters. See section '7.2.9 Quantization params > + * syntax' of the VP9 specification for more details. > + */ > +struct v4l2_vp9_quantization { > + __u8 base_q_idx; > + __s8 delta_q_y_dc; > + __s8 delta_q_uv_dc; > + __s8 delta_q_uv_ac; > + __u8 reserved[4]; > +}; > + > +/** > + * enum v4l2_vp9_segmentation_flags - VP9 segmentation flags > + * > + * @V4L2_VP9_SEGMENTATION_FLAG_ENABLED: indicates that this frame makes use of > + * the segmentation tool > + * @V4L2_VP9_SEGMENTATION_FLAG_UPDATE_MAP: indicates that the segmentation map > + * should be updated during the decoding of this frame > + * @V4L2_VP9_SEGMENTATION_FLAG_TEMPORAL_UPDATE: indicates that the updates to > + * the segmentation map are coded relative to the existing segmentation map > + * @V4L2_VP9_SEGMENTATION_FLAG_UPDATE_DATA: indicates that new parameters are > + * about to be specified for each segment > + * @V4L2_VP9_SEGMENTATION_FLAG_ABS_OR_DELTA_UPDATE: indicates that the > + * segmentation parameters represent the actual values to be used > + * > + * Those are the flags that may be passed to &v4l2_vp9_segmentation.flags. See > + * section '7.2.10 Segmentation params syntax' of the VP9 specification for > + * more details. > + */ > +enum v4l2_vp9_segmentation_flags { > + V4L2_VP9_SEGMENTATION_FLAG_ENABLED = 1 << 0, > + V4L2_VP9_SEGMENTATION_FLAG_UPDATE_MAP = 1 << 1, > + V4L2_VP9_SEGMENTATION_FLAG_TEMPORAL_UPDATE = 1 << 2, > + V4L2_VP9_SEGMENTATION_FLAG_UPDATE_DATA = 1 << 3, > + V4L2_VP9_SEGMENTATION_FLAG_ABS_OR_DELTA_UPDATE = 1 << 4, > +}; > + > +#define V4L2_VP9_SEGMENT_FEATURE_ENABLED(id) (1 << (id)) > +#define V4L2_VP9_SEGMENT_FEATURE_ENABLED_MASK 0xf > + > +/** > + * enum v4l2_vp9_segment_feature - VP9 segment feature IDs > + * > + * @V4L2_VP9_SEG_LVL_ALT_Q: quantizer segment feature > + * @V4L2_VP9_SEG_LVL_ALT_L: loop filter segment feature > + * @V4L2_VP9_SEG_LVL_REF_FRAME reference frame segment feature > + * @V4L2_VP9_SEG_LVL_SKIP: skip segment feature > + * @V4L2_VP9_SEG_LVV_MAX: number of segment features > + * > + * Segment feature IDs. See section '7.2.10 Segmentation params syntax' of the > + * VP9 specification for more details. > + */ > +enum v4l2_vp9_segment_feature { > + V4L2_VP9_SEG_LVL_ALT_Q, > + V4L2_VP9_SEG_LVL_ALT_L, > + V4L2_VP9_SEG_LVL_REF_FRAME, > + V4L2_VP9_SEG_LVL_SKIP, > + V4L2_VP9_SEG_LVL_MAX, > +}; > + > +/** > + * struct v4l2_vp9_segmentation - VP9 segmentation parameters > + * > + * @feature_data: data attached to each feature. Data entry is only valid if the feature is enabled > + * @feature_enabled: bitmask defining which features are enabled in each segment > + * @tree_probs: specifies the probability values to be used when > + * decoding a Segment-ID. See '5.15. Segmentation map' section of the VP9 specification > + * for more details. > + * @pred_probs: specifies the probability values to be used when decoding a > + * Predicted-Segment-ID. See '6.4.14. Get segment id syntax' section of :ref:`vp9` > + * for more details. > + * @flags: combination of V4L2_VP9_SEGMENTATION_FLAG_* flags > + * @reserved: padding field. Should be zeroed by applications. > + * > + * Encodes the quantization parameters. See section '7.2.10 Segmentation params syntax' of > + * the VP9 specification for more details. > + */ > +struct v4l2_vp9_segmentation { > + __s16 feature_data[8][4]; > + __u8 feature_enabled[8]; > + __u8 tree_probs[7]; > + __u8 pred_probs[3]; > + __u8 flags; > + __u8 reserved[5]; > +}; > + > +/** > + * enum v4l2_vp9_intra_prediction_mode - VP9 Intra prediction modes > + * > + * @V4L2_VP9_INTRA_PRED_MODE_DC_PRED: DC intra prediction > + * @V4L2_VP9_INTRA_PRED_MODE_V_PRED: vertical intra prediction > + * @V4L2_VP9_INTRA_PRED_MODE_H_PRED: horizontal intra prediction > + * @V4L2_VP9_INTRA_PRED_MODE_D45_PRED: D45 intra prediction > + * @V4L2_VP9_INTRA_PRED_MODE_D135_PRED: D135 intra prediction > + * @V4L2_VP9_INTRA_PRED_MODE_D117_PRED: D117 intra prediction > + * @V4L2_VP9_INTRA_PRED_MODE_D153_PRED: D153 intra prediction > + * @V4L2_VP9_INTRA_PRED_MODE_D207_PRED: D207 intra prediction > + * @V4L2_VP9_INTRA_PRED_MODE_D63_PRED: D63 intra prediction > + * @V4L2_VP9_INTRA_PRED_MODE_TM_PRED: True Motion intra prediction > + * > + * See section '7.4.5 Intra frame mode info semantics' for more details. > + */ > +enum v4l2_vp9_intra_prediction_mode { > + V4L2_VP9_INTRA_PRED_MODE_DC_PRED, > + V4L2_VP9_INTRA_PRED_MODE_V_PRED, > + V4L2_VP9_INTRA_PRED_MODE_H_PRED, > + V4L2_VP9_INTRA_PRED_MODE_D45_PRED, > + V4L2_VP9_INTRA_PRED_MODE_D135_PRED, > + V4L2_VP9_INTRA_PRED_MODE_D117_PRED, > + V4L2_VP9_INTRA_PRED_MODE_D153_PRED, > + V4L2_VP9_INTRA_PRED_MODE_D207_PRED, > + V4L2_VP9_INTRA_PRED_MODE_D63_PRED, > + V4L2_VP9_INTRA_PRED_MODE_TM_PRED, > +}; > + > +/** > + * enum v4l2_vp9_reset_frame_context - Valid values for > + * &v4l2_ctrl_vp9_frame->reset_frame_context > + * > + * @V4L2_VP9_RESET_FRAME_CTX_NONE: don't reset any frame context > + * @V4L2_VP9_RESET_FRAME_CTX_SPEC: reset the frame context pointed by > + * &v4l2_ctrl_vp9_frame.frame_context_idx > + * @V4L2_VP9_RESET_FRAME_CTX_ALL: reset all frame contexts > + * > + * See section '7.2 Uncompressed header semantics' of the VP9 specification for more details. > + */ > +enum v4l2_vp9_reset_frame_context { > + V4L2_VP9_RESET_FRAME_CTX_NONE, > + V4L2_VP9_RESET_FRAME_CTX_SPEC, > + V4L2_VP9_RESET_FRAME_CTX_ALL, > +}; > + > +/** > + * enum v4l2_vp9_interpolation_filter - VP9 interpolation filter types > + * > + * @V4L2_VP9_INTERP_FILTER_EIGHTTAP: eight tap filter > + * @V4L2_VP9_INTERP_FILTER_EIGHTTAP_SMOOTH: eight tap smooth filter > + * @V4L2_VP9_INTERP_FILTER_EIGHTTAP_SHARP: eight tap sharp filter > + * @V4L2_VP9_INTERP_FILTER_BILINEAR: bilinear filter > + * @V4L2_VP9_INTERP_FILTER_SWITCHABLE: filter selection is signaled at the block level > + * > + * See section '7.2.7 Interpolation filter semantics' of the VP9 specification > + * for more details. > + */ > +enum v4l2_vp9_interpolation_filter { > + V4L2_VP9_INTERP_FILTER_EIGHTTAP, > + V4L2_VP9_INTERP_FILTER_EIGHTTAP_SMOOTH, > + V4L2_VP9_INTERP_FILTER_EIGHTTAP_SHARP, > + V4L2_VP9_INTERP_FILTER_BILINEAR, > + V4L2_VP9_INTERP_FILTER_SWITCHABLE, > +}; > + > +/** > + * enum v4l2_vp9_reference_mode - VP9 reference modes > + * > + * @V4L2_VP9_REFERENCE_MODE_SINGLE_REFERENCE: indicates that all the inter blocks use only a > + * single reference frame to generate motion compensated prediction > + * @V4L2_VP9_REFERENCE_MODE_COMPOUND_REFERENCE: requires all the inter blocks to use compound mode. > + * Single reference frame prediction is not allowed > + * @V4L2_VP9_REFERENCE_MODE_SELECT: allows each individual inter block to select between single > + * and compound prediction modes > + * > + * See section '7.3.6 Frame reference mode semantics' of the VP9 specification > + * for more details. > + */ > +enum v4l2_vp9_reference_mode { > + V4L2_VP9_REFERENCE_MODE_SINGLE_REFERENCE, > + V4L2_VP9_REFERENCE_MODE_COMPOUND_REFERENCE, > + V4L2_VP9_REFERENCE_MODE_SELECT, > +}; > + > +/** > + * enum v4l2_vp9_tx_mode - VP9 TX modes > + * > + * @V4L2_VP9_TX_MODE_ONLY_4X4: transform size is 4x4 > + * @V4L2_VP9_TX_MODE_ALLOW_8X8: transform size can be up to 8x8 > + * @V4L2_VP9_TX_MODE_ALLOW_16X16: transform size can be up to 16x16 > + * @V4L2_VP9_TX_MODE_ALLOW_32X32: transform size can be up to 32x32 > + * @V4L2_VP9_TX_MODE_SELECT: bitstream contains the transform size for each block > + * > + * See section '7.3.1 Tx mode semantics' of the VP9 specification for more details. > + */ > +enum v4l2_vp9_tx_mode { > + V4L2_VP9_TX_MODE_ONLY_4X4, > + V4L2_VP9_TX_MODE_ALLOW_8X8, > + V4L2_VP9_TX_MODE_ALLOW_16X16, > + V4L2_VP9_TX_MODE_ALLOW_32X32, > + V4L2_VP9_TX_MODE_SELECT, > +}; > + > +/** > + * enum v4l2_vp9_frame_flags - VP9 frame flags > + * @V4L2_VP9_FRAME_FLAG_KEY_FRAME: the frame is a key frame > + * @V4L2_VP9_FRAME_FLAG_SHOW_FRAME: the frame should be displayed > + * @V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT: the decoding should be error resilient > + * @V4L2_VP9_FRAME_FLAG_INTRA_ONLY: the frame does not reference other frames > + * @V4L2_VP9_FRAME_FLAG_ALLOW_HIGH_PREC_MV: the frame can use high precision motion vectors > + * @V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX: frame context should be updated after decoding > + * @V4L2_VP9_FRAME_FLAG_PARALLEL_DEC_MODE: parallel decoding is used > + * @V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING: vertical subsampling is enabled > + * @V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING: horizontal subsampling is enabled > + * @V4L2_VP9_FRAME_FLAG_COLOR_RANGE_FULL_SWING: full UV range is used > + * > + * Check the VP9 specification for more details. > + */ > +enum v4l2_vp9_frame_flags { > + V4L2_VP9_FRAME_FLAG_KEY_FRAME = 1 << 0, > + V4L2_VP9_FRAME_FLAG_SHOW_FRAME = 1 << 1, > + V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT = 1 << 2, > + V4L2_VP9_FRAME_FLAG_INTRA_ONLY = 1 << 3, > + V4L2_VP9_FRAME_FLAG_ALLOW_HIGH_PREC_MV = 1 << 4, > + V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX = 1 << 5, > + V4L2_VP9_FRAME_FLAG_PARALLEL_DEC_MODE = 1 << 6, > + V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING = 1 << 7, > + V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING = 1 << 8, > + V4L2_VP9_FRAME_FLAG_COLOR_RANGE_FULL_SWING = 1 << 9, > +}; > + > +/** > + * enum v4l2_vp9_ref_frame_sign_bias - Whether ref_frame_sign_bias is 1 for a given reference frame > + * @V4L2_VP9_SIGN_BIAS_LAST: ref_frame_sign_bias is 1 for the "last" reference frame > + * @V4L2_VP9_SIGN_BIAS_GOLDEN: ref_frame_sign_bias is 1 for the "golden" reference frame > + * @V4L2_VP9_SIGN_BIAS_ALT: ref_frame_sign_bias is 1 for the "alt" reference frame > + */ > + > +enum v4l2_vp9_ref_frame_sign_bias { > + V4L2_VP9_SIGN_BIAS_LAST, > + V4L2_VP9_SIGN_BIAS_GOLDEN, > + V4L2_VP9_SIGN_BIAS_ALT, > +}; > + > +#define V4L2_VP9_PROFILE_MAX 3 > + > +#define V4L2_CID_STATELESS_VP9_FRAME (V4L2_CID_CODEC_STATELESS_BASE + 300) > +/** > + * struct v4l2_ctrl_vp9_frame - VP9 frame decoding control > + * > + * @lf: loop filter parameters. See &v4l2_vp9_loop_filter for more details > + * @quant: quantization parameters. See &v4l2_vp9_quantization for more details > + * @seg: segmentation parameters. See &v4l2_vp9_segmentation for more details > + * @flags: combination of V4L2_VP9_FRAME_FLAG_* flags > + * @compressed_header_size: compressed header size in bytes > + * @uncompressed_header_size: uncompressed header size in bytes > + * @frame_width_minus_1: add 1 to it and you'll get the frame width expressed in pixels > + * @frame_height_minus_1: add 1 to it and you'll get the frame height expressed in pixels > + * @render_width_minus_1: add 1 to it and you'll get the expected render width expressed in > + * pixels. This is not used during the decoding process but might be used by HW scalers > + * to prepare a frame that's ready for scanout > + * @render_height_minus_1: add 1 to it and you'll get the expected render height expressed in > + * pixels. This is not used during the decoding process but might be used by HW scalers > + * to prepare a frame that's ready for scanout > + * @last_frame_ts: "last" reference buffer timestamp. > + * The timestamp refers to the timestamp field in struct v4l2_buffer. > + * Use v4l2_timeval_to_ns() to convert the struct timeval to a __u64. > + * @golden_frame_ts: "golden" reference buffer timestamp. > + * The timestamp refers to the timestamp field in struct v4l2_buffer. > + * Use v4l2_timeval_to_ns() to convert the struct timeval to a __u64. > + * @alt_frame_ts: "alt" reference buffer timestamp. > + * The timestamp refers to the timestamp field in struct v4l2_buffer. > + * Use v4l2_timeval_to_ns() to convert the struct timeval to a __u64. > + * @ref_frame_sign_bias: a bitfield specifying whether the sign bias is set for a given > + * reference frame. See &v4l2_vp9_ref_frame_sign_bias for more details. > + * @reset_frame_context: specifies whether the frame context should be reset to default values. > + * See &v4l2_vp9_reset_frame_context for more details > + * @frame_context_idx: frame context that should be used/updated > + * @profile: VP9 profile. Can be 0, 1, 2 or 3 > + * @bit_depth: bits per components. Can be 8, 10 or 12. Note that not all profiles support > + * 10 and/or 12 bits depths > + * @interpolation_filter: specifies the filter selection used for performing inter prediction. > + * See &v4l2_vp9_interpolation_filter for more details > + * @tile_cols_log2: specifies the base 2 logarithm of the width of each tile (where the width > + * is measured in units of 8x8 blocks). Shall be less than or equal to 6 > + * @tile_rows_log2: specifies the base 2 logarithm of the height of each tile (where the height > + * is measured in units of 8x8 blocks) > + * @tx_mode: specifies the TX mode. See &v4l2_vp9_tx_mode for more details > + * @reference_mode: specifies the type of inter prediction to be used. See > + * &v4l2_vp9_reference_mode for more details > + * @reserved: padding field. Should be zeroed by applications. > + */ > +struct v4l2_ctrl_vp9_frame { > + struct v4l2_vp9_loop_filter lf; > + struct v4l2_vp9_quantization quant; > + struct v4l2_vp9_segmentation seg; > + __u32 flags; > + __u16 compressed_header_size; > + __u16 uncompressed_header_size; > + __u16 frame_width_minus_1; > + __u16 frame_height_minus_1; > + __u16 render_width_minus_1; > + __u16 render_height_minus_1; > + __u64 last_frame_ts; > + __u64 golden_frame_ts; > + __u64 alt_frame_ts; > + __u8 ref_frame_sign_bias; > + __u8 reset_frame_context; > + __u8 frame_context_idx; > + __u8 profile; > + __u8 bit_depth; > + __u8 interpolation_filter; > + __u8 tile_cols_log2; > + __u8 tile_rows_log2; > + __u8 tx_mode; > + __u8 reference_mode; > + __u8 reserved[6]; > +}; > + > +#define V4L2_VP9_NUM_FRAME_CTX 4 > + > +/** > + * struct v4l2_vp9_mv_compressed_hdr_probs - VP9 Motion vector probability updates > + * @joint: motion vector joint probability updates > + * @sign: motion vector sign probability updates > + * @classes: motion vector class probability updates > + * @class0_bit: motion vector class0 bit probability updates > + * @bits: motion vector bits probability updates > + * @class0_fr: motion vector class0 fractional bit probability updates > + * @fr: motion vector fractional bit probability updates > + * @class0_hp: motion vector class0 high precision fractional bit probability updates > + * @hp: motion vector high precision fractional bit probability updates > + * > + * This structure contains new values of motion vector probabilities. > + * A value of zero in an array element means there is no update of the relevant probability. > + * See `struct v4l2_vp9_prob_updates` for details. > + */ > +struct v4l2_vp9_mv_compressed_hdr_probs { > + __u8 joint[3]; > + __u8 sign[2]; > + __u8 classes[2][10]; > + __u8 class0_bit[2]; > + __u8 bits[2][10]; > + __u8 class0_fr[2][2][3]; > + __u8 fr[2][3]; > + __u8 class0_hp[2]; > + __u8 hp[2]; > +}; > + > +#define V4L2_CID_STATELESS_VP9_COMPRESSED_HDR_PROBS (V4L2_CID_CODEC_STATELESS_BASE + 301) > +/** > + * struct v4l2_ctrl_vp9_compressed_hdr_probs - VP9 probability updates control > + * @tx8: TX 8x8 probability updates > + * @tx16: TX 16x16 probability updates > + * @tx32: TX 32x32 probability updates > + * @coef: coefficient probability updates > + * @skip: skip probability updates > + * @inter_mode: inter mode probability updates > + * @interp_filter: interpolation filter probability updates > + * @is_inter: is inter-block probability updates > + * @comp_mode: compound prediction mode probability updates > + * @single_ref: single ref probability updates > + * @comp_ref: compound ref probability updates > + * @y_mode: Y prediction mode probability updates > + * @uv_mode: UV prediction mode probability updates > + * @partition: partition probability updates > + * @mv: motion vector probability updates > + * > + * This structure holds the probabilities update as parsed in the compressed > + * header (Spec 6.3). These values represent the value of probability update after > + * being translated with inv_map_table[] (see 6.3.5). A value of zero in an array element > + * means that there is no update of the relevant probability. > + */ > +struct v4l2_ctrl_vp9_compressed_hdr_probs { > + __u8 tx8[2][1]; > + __u8 tx16[2][2]; > + __u8 tx32[2][3]; > + __u8 coef[4][2][2][6][6][3]; > + __u8 skip[3]; > + __u8 inter_mode[7][3]; > + __u8 interp_filter[4][2]; > + __u8 is_inter[4]; > + __u8 comp_mode[5]; > + __u8 single_ref[5][2]; > + __u8 comp_ref[5]; > + __u8 y_mode[4][9]; > + __u8 uv_mode[10][9]; > + __u8 partition[16][3]; > + > + struct v4l2_vp9_mv_compressed_hdr_probs mv; > +}; > + > /* MPEG-compression definitions kept for backwards compatibility */ > #ifndef __KERNEL__ > #define V4L2_CTRL_CLASS_MPEG V4L2_CTRL_CLASS_CODEC > diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h > index 58392dcd3bf5..4abe4362519e 100644 > --- a/include/uapi/linux/videodev2.h > +++ b/include/uapi/linux/videodev2.h > @@ -703,6 +703,7 @@ struct v4l2_pix_format { > #define V4L2_PIX_FMT_VP8 v4l2_fourcc('V', 'P', '8', '0') /* VP8 */ > #define V4L2_PIX_FMT_VP8_FRAME v4l2_fourcc('V', 'P', '8', 'F') /* VP8 parsed frame */ > #define V4L2_PIX_FMT_VP9 v4l2_fourcc('V', 'P', '9', '0') /* VP9 */ > +#define V4L2_PIX_FMT_VP9_FRAME v4l2_fourcc('V', 'P', '9', 'F') /* VP9 parsed frame */ > #define V4L2_PIX_FMT_HEVC v4l2_fourcc('H', 'E', 'V', 'C') /* HEVC aka H.265 */ > #define V4L2_PIX_FMT_FWHT v4l2_fourcc('F', 'W', 'H', 'T') /* Fast Walsh Hadamard Transform (vicodec) */ > #define V4L2_PIX_FMT_FWHT_STATELESS v4l2_fourcc('S', 'F', 'W', 'H') /* Stateless FWHT (vicodec) */ > @@ -1755,6 +1756,8 @@ struct v4l2_ext_control { > struct v4l2_ctrl_mpeg2_sequence __user *p_mpeg2_sequence; > struct v4l2_ctrl_mpeg2_picture __user *p_mpeg2_picture; > struct v4l2_ctrl_mpeg2_quantisation __user *p_mpeg2_quantisation; > + struct v4l2_ctrl_vp9_compressed_hdr_probs __user *p_vp9_compressed_hdr_probs; > + struct v4l2_ctrl_vp9_frame __user *p_vp9_frame; > void __user *ptr; > }; > } __attribute__ ((packed)); > @@ -1819,6 +1822,9 @@ enum v4l2_ctrl_type { > V4L2_CTRL_TYPE_MPEG2_QUANTISATION = 0x0250, > V4L2_CTRL_TYPE_MPEG2_SEQUENCE = 0x0251, > V4L2_CTRL_TYPE_MPEG2_PICTURE = 0x0252, > + > + V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR_PROBS = 0x0260, > + V4L2_CTRL_TYPE_VP9_FRAME = 0x0261, > }; > > /* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */